diff --git a/README.md b/README.md index 662464441..8faee1372 100644 --- a/README.md +++ b/README.md @@ -6,39 +6,42 @@ [![OSS hosting by cloudsmith](https://img.shields.io/badge/OSS%20hosting%20by-cloudsmith-blue?logo=cloudsmith)](https://cloudsmith.io/~evcc/packages/) [![Latest Version](https://img.shields.io/github/release/evcc-io/evcc.svg)](https://github.com/evcc-io/evcc/releases) -evcc is an extensible EV Charge Controller and home energy management system. Featured in [PV magazine](https://www.pv-magazine.de/2021/01/15/selbst-ist-der-groeoenlandhof-wallbox-ladesteuerung-selbst-gebaut/). +evcc is an extensible EV Charge Controller and home energy management system. -![Screenshot](docs/screenshot.webp) +![Screenshot](assets/github/screenshot.webp) + +Our goal is to provide local energy management, without relying on cloud services. +Featured in [PV Magazine](https://www.pv-magazine.de/2022/01/14/mit-open-source-lademanager-schnittstellen-zu-wallbox-und-photovoltaik-anlage-meistern/) and [c’t Magazin](https://www.youtube.com/watch?v=MoBpEXHMNjI). ## Features - simple and clean user interface -- wide range of supported [chargers](https://docs.evcc.io/docs/devices/chargers): - - ABL eMH1, Alfen (Eve), Bender (CC612/613), cFos (PowerBrain), Daheimladen, Ebee (Wallbox), Ensto (Chago Wallbox), [EVSEWifi/ smartWB](https://www.evse-wifi.de), Garo (GLB, GLB+, LS4), go-eCharger, HardyBarth (eCB1, cPH1, cPH2), Heidelberg (Energy Control), Innogy (eBox), Juice (Charger Me), KEBA/BMW, Mennekes (Amedio, Amtron Premium/Xtra, Amtron ChargeConrol), older NRGkicks (before 2022/2023), NRGKick Gen2,[openWB (includes Pro)](https://openwb.de/), Optec (Mobility One), PC Electric (includes Garo), Siemens, TechniSat (Technivolt), [Tinkerforge Warp Charger](https://www.warp-charger.com), Ubitricity (Heinz), Vestel, Wallbe, Webasto (Live), Mobile Charger Connect and many more - - EEBus support (Elli, PMCC) - - experimental OCPP support - - Build-your-own: Phoenix Contact (includes ESL Walli), [EVSE DIN](http://evracing.cz/simple-evse-wallbox) - - Smart-Home outlets: FritzDECT, Shelly, Tasmota, TP-Link -- wide range of supported [meters](https://docs.evcc.io/docs/devices/meters) for grid, pv, battery and charger: - - ModBus: Eastron SDM, MPM3PM, ORNO WE, SBC ALE3 and many more, see for a complete list - - Integrated systems: SMA Sunny Home Manager and Energy Meter, KOSTAL Smart Energy Meter (KSEM, EMxx) - - Sunspec-compatible inverter or home battery devices: Fronius, SMA, SolarEdge, KOSTAL, STECA, E3DC, ... - - and various others: Discovergy, Tesla PowerWall, LG ESS HOME, OpenEMS (FENECON) -- [vehicle](https://docs.evcc.io/docs/devices/vehicles) integration (state of charge, remote charge, battery and preconditioning status): - - Audi, BMW, Citroën, Dacia, Fiat, Ford, Hyundai, Jaguar, Kia, Landrover, Mercedes-Benz, Mini, Nissan, Opel, Peugeot, Porsche, Renault, Seat, Smart, Skoda, Tesla, Volkswagen, Volvo, ... - - Services: OVMS, Tronity - - Scooters: Niu, ~~Silence~~ -- [plugins](https://docs.evcc.io/docs/reference/plugins) for integrating with any charger/ meter/ vehicle: - - Modbus, HTTP, MQTT, Javascript, WebSockets and shell scripts -- status [notifications](https://docs.evcc.io/docs/reference/configuration/messaging) using [Telegram](https://telegram.org), [PushOver](https://pushover.net) and [many more](https://containrrr.dev/shoutrrr/) +- support for many [EV chargers](https://docs.evcc.io/en/docs/devices/chargers): + - ABB, ABL, Alfen, Alphatec, Amperfied, Ampure, Audi, AUTEL, Autoaid, Bender, BMW, cFos, Charge Amps, Compleo, CUBOS, Cupra, Dadapower, DaheimLaden, Delta, E.ON Drive, E3/DC, Easee, Ebee, echarge, EcoHarmony, Edgetech, Elecq, eledio, Elli, EM2GO, EN+, enercab, Ensto, EntraTek, ESL, eSystems, Etrel, EVBox, Free2Move, Free2move eSolutions, Fronius, Garo, go-e, Hardy Barth, Heidelberg, Hesotec, Homecharge, Huawei, Innogy, INRO, Juice, Kathrein, KEBA, Kontron Solar, Kostal, KSE, LadeFoxx, LRT, Mennekes, NRGkick, OBO Bettermann, OpenEVSE, openWB, Optec, Orbis, PC Electric, Peblar, Phoenix Contact, Plugchoice, Porsche, Pracht, Pulsares, Pulsatrix, Qcells, Schneider, Schrack, SENEC, Siemens, Skoda, SMA, Smartfox, SolarEdge, Solax, Sonnen, Spelsberg, Stark in Strom, Sungrow, TechniSat, Tesla, Tigo, TinkerForge, Ubitricity, V2C Trydan, Vestel, Victron, Viridian EV, Volkswagen, Volt Time, Wallbe, wallbox, Walther Werke, Webasto, Weidmüller, Zaptec, ZJ Beny. [Read more.](https://docs.evcc.io/en/docs/devices/chargers) + - **EEBus** support (Elli, PMCC) + - **OCPP** support + - **build-your-own:** Phoenix Contact (includes ESL Walli), EVSE DIN + - **smart switches:** AVM, Home Assistant, Homematic IP, HomeWizard, myStrom, Shelly, Tasmota, TP-Link. [Read more.](https://docs.evcc.io/en/docs/devices/smartswitches) + - **heat pumps and electric heaters:** alpha innotec, Bosch, Buderus, Bösch, CTA All-In-One, Daikin, Elco, IDM, Junkers, Kermi, Lambda, my-PV, Nibe, Novelan, Roth, Stiebel Eltron, Tecalor, Vaillant, Viessmann, Wolf, Zewotherm. [Read more.](https://docs.evcc.io/en/docs/devices/heating) +- support for many [energy meters](https://docs.evcc.io/en/docs/devices/meters): + - **solar inverters and battery systems:** A-Tronix, Acrel, Ads-tec, Alpha ESS, Ampere, Anker, APsystems, AVM, Axitec, BGEtech, Bosch, Bosswerk, Carlo Gavazzi, Deye, E3/DC, Eastron, Enphase, FENECON, FoxESS, Fronius, Ginlong, go-e, GoodWe, Growatt, Homematic IP, HomeWizard, Hoymiles, Huawei, IAMMETER, IGEN Tech, Kostal, LG, Loxone, M-TEC, Marstek, myStrom, OpenEMS, Powerfox, Qcells, RCT, SAJ, SAX, SENEC, Senergy, Shelly, Siemens, Sigenergy, SMA, Smartfox, SofarSolar, Solaranzeige, SolarEdge, SolarMax, Solarwatt, Solax, Solinteng, Sonnen, St-ems, Steca, Sungrow, Sunsynk, Sunway, Tasmota, Tesla, TP-Link, VARTA, Victron, Wattsonic, Youless, ZCS Azzurro, Zendure. [Read more.](https://docs.evcc.io/en/docs/devices/meters) + - **general energy meters:** A-Tronix, ABB, Acrel, Alpha ESS, Ampere, AVM, Axitec, Bernecker Engineering, BGEtech, Bosch, Carlo Gavazzi, cFos, Deye, DSMR, DZG, E3/DC, Eastron, Enphase, ESPHome, FENECON, FoxESS, Fronius, Ginlong, go-e, GoodWe, Growatt, Homematic IP, HomeWizard, Huawei, IAMMETER, inepro, IOmeter, Janitza, KEBA, Kostal, LG, Loxone, M-TEC, mhendriks, my-PV, myStrom, OpenEMS, ORNO, P1Monitor, Powerfox, Qcells, RCT, Saia-Burgess Controls (SBC), SAJ, SAX, Schneider Electric, SENEC, Shelly, Siemens, Sigenergy, SMA, Smartfox, SofarSolar, Solaranzeige, SolarEdge, SolarMax, Solarwatt, Solax, Solinteng, Sonnen, St-ems, Sungrow, Sunsynk, Sunway, Tasmota, Tesla, Tibber, TQ, VARTA, Victron, Volkszähler, Wago, Wattsonic, Weidmüller, Youless, ZCS Azzurro, Zuidwijk. [Read more.](https://docs.evcc.io/en/docs/devices/meters) + - **integrated systems**: SMA Sunny Home Manager and Energy Meter, KOSTAL Smart Energy Meter (KSEM, EMxx) + - **sunspec**-compatible inverter or home battery devices + - **mbmd**-compatible devices, see [volkszaehler/mbmd](https://github.com/volkszaehler/mbmd#supported-devices) for a complete list +- [vehicle](https://docs.evcc.io/en/docs/devices/vehicles) integrations (state of charge, remote charge, battery and preconditioning status): + - Aiways, Audi, BMW, Citroën, Dacia, DS, Fiat, Ford, Hyundai, Jeep, Kia, Mercedes-Benz, MG, Mini, Nissan, NIU, Opel, Peugeot, Polestar, Renault, Seat, Skoda, Smart, Tesla, Toyota, Volkswagen, Volvo, Zero Motorcycles. [Read more.](https://docs.evcc.io/en/docs/devices/vehicles) + - **services:** OVMS, Tronity, evNotify, ioBroker.bmw, mg2mqtt, mz2mqtt, TeslaLogger, TeslaMate, Tessi, volvo2mqtt +- [plugins](https://docs.evcc.io/en/docs/devices/plugins) for integrating with any charger, smartswitch, heatpump, electric heater, meter, solar- / battery-inverter or vehicle: + - Modbus, HTTP, MQTT, JavaScript, WebSocket, Go and shell scripts +- status [notifications](https://docs.evcc.io/en/docs/reference/configuration/messaging) using [Telegram](https://telegram.org), [PushOver](https://pushover.net) and [many more](https://containrrr.dev/shoutrrr/) - logging using [InfluxDB](https://www.influxdata.com) and [Grafana](https://grafana.com/grafana/) -- granular charge power control down to mA steps with supported chargers (labeled by e.g. smartWB as [OLC](https://board.evse-wifi.de/viewtopic.php?f=16&t=187)) -- REST and MQTT [APIs](https://docs.evcc.io/docs/reference/api) for integration with home automation systems -- Add-ons for [Home Assistant](https://github.com/evcc-io/evcc-hassio-addon) and [OpenHAB](https://www.openhab.org/addons/bindings/evcc) (not maintained by the evcc core team) +- [REST](https://docs.evcc.io/en/docs/integrations/rest-api) and [MQTT](https://docs.evcc.io/en/docs/integrations/mqtt-api) APIs for integration with home automation systems +- Add-ons for [Home Assistant](https://docs.evcc.io/en/docs/integrations/home-assistant) and [OpenHAB](https://www.openhab.org/addons/bindings/evcc) (not maintained by the evcc core team) ## Getting Started -You'll find everything you need in our [documentation](https://docs.evcc.io/). +You'll find everything you need in our [documentation](https://docs.evcc.io/en/). ## Contributing @@ -48,11 +51,11 @@ Technical details on how to contribute, how to add translations and how to build ## Sponsorship - + evcc believes in open source software. We're committed to provide best in class EV charging experience. Maintaining evcc consumes time and effort. With the vast amount of different devices to support, we depend on community and vendor support to keep evcc alive. While evcc is open source, we would also like to encourage vendors to provide open source hardware devices, public documentation and support open source projects like ours that provide additional value to otherwise closed hardware. Where this is not the case, evcc requires "sponsor token" to finance ongoing development and support of evcc. -Learn more about our [sponsorship model](https://docs.evcc.io/docs/sponsorship). +Learn more about our [sponsorship model](https://docs.evcc.io/en/docs/sponsorship). diff --git a/assets/github/evcc-gopher.png b/assets/github/evcc-gopher.png new file mode 100644 index 000000000..55c2918d7 Binary files /dev/null and b/assets/github/evcc-gopher.png differ diff --git a/assets/github/screenshot.webp b/assets/github/screenshot.webp new file mode 100644 index 000000000..79317586e Binary files /dev/null and b/assets/github/screenshot.webp differ diff --git a/templates/definition/charger/eprowallbox.yaml b/templates/definition/charger/eprowallbox.yaml index 35468c0e8..80458ab89 100644 --- a/templates/definition/charger/eprowallbox.yaml +++ b/templates/definition/charger/eprowallbox.yaml @@ -3,6 +3,9 @@ products: - brand: Free2Move description: generic: eProWallbox + - brand: Free2Move + description: + generic: eProWallbox Move capabilities: ["mA"] requirements: evcc: ["sponsorship"] diff --git a/templates/definition/meter/qcells-hybrid-cloud.yaml b/templates/definition/meter/qcells-hybrid-cloud.yaml index 8b1f8bf0f..6042a2c04 100644 --- a/templates/definition/meter/qcells-hybrid-cloud.yaml +++ b/templates/definition/meter/qcells-hybrid-cloud.yaml @@ -1,17 +1,17 @@ template: qcells-hybrid-cloud products: - - brand: QCells + - brand: Qcells description: de: Hybrid-Wechselrichter (Cloud) en: Hybrid-Inverter (Cloud) requirements: description: de: | - Der QCells Hybrid-Wechselrichter muss in der QCellsCloud angemeldet sein. + Der Qcells Hybrid-Wechselrichter muss in der QcellsCloud angemeldet sein. **Achtung**: Die Werte können nur alle 150s abgerufen werden und dann auch 5 Minuten alt sein. Die Laderegelung nach PV kann hiermit nicht optimal gesteuert werden! Nur als Notfalloption nutzen wenn kein lokaler Zugriff möglich ist. en: | - The QCells hybrid inverter has to be registered in the QCellsCloud. + The Qcells hybrid inverter has to be registered in the QcellsCloud. **Attention**: Values can only be fetched every 150s and then also can be 5 minutes old. Charging by PV will not be optimal because of this! Only use as fallback if no local access is available. params: @@ -21,7 +21,7 @@ params: - name: tokenid required: true description: - generic: QCellsCloud TokenID + generic: QcellsCloud TokenID help: de: Von https://qhome-ess-g3.q-cells.eu/#/api/ den Wert von "ObtaintokenID" hier eintragen. en: Go to https://qhome-ess-g3.q-cells.eu/#/api/ and take the value of "ObtaintokenID". diff --git a/util/templates/generate/main.go b/util/templates/generate/main.go index 776b81e73..1f9cb6903 100644 --- a/util/templates/generate/main.go +++ b/util/templates/generate/main.go @@ -111,7 +111,7 @@ func sorted(keys []string) []string { } func generateBrandJSON() error { - var chargers, smartPlugs []string + var chargers, smartswitches, heating []string for _, tmpl := range templates.ByClass(templates.Charger) { for _, product := range tmpl.Products { if product.Brand == "" { @@ -119,7 +119,9 @@ func generateBrandJSON() error { } if tmpl.Group == "switchsockets" { - smartPlugs = append(smartPlugs, product.Brand) + smartswitches = append(smartswitches, product.Brand) + } else if tmpl.Group == "heating" { + heating = append(heating, product.Brand) } else { chargers = append(chargers, product.Brand) } @@ -161,13 +163,14 @@ func generateBrandJSON() error { } brands := struct { - Chargers, SmartPlugs, Meters, PVBattery, Vehicles []string + Chargers, SmartSwitches, Heating, Meters, PVBattery, Vehicles []string }{ - Chargers: sorted(chargers), - SmartPlugs: sorted(smartPlugs), - Meters: sorted(meters), - PVBattery: sorted(pvBattery), - Vehicles: sorted(vehicles), + Chargers: sorted(chargers), + SmartSwitches: sorted(smartswitches), + Heating: sorted(heating), + Meters: sorted(meters), + PVBattery: sorted(pvBattery), + Vehicles: sorted(vehicles), } file, err := json.MarshalIndent(brands, "", " ") @@ -179,20 +182,46 @@ func generateBrandJSON() error { } func generateProductJSON() error { + type Category string + + const ( + charger Category = "charger" + smartswitch Category = "smartswitch" + heating Category = "heating" + meter Category = "meter" + vehicle Category = "vehicle" + ) + type ProductInfo struct { Brand string `json:"brand"` Description string `json:"description"` } products := make(map[string]map[string]ProductInfo) + for _, key := range []Category{charger, smartswitch, heating, meter, vehicle} { + products[string(key)] = make(map[string]ProductInfo) + } - for _, class := range templates.ClassValues() { - classKey := strings.ToLower(class.String()) - products[classKey] = make(map[string]ProductInfo) - + for _, class := range []templates.Class{templates.Charger, templates.Meter, templates.Vehicle} { for _, tmpl := range templates.ByClass(class) { for _, product := range tmpl.Products { - products[classKey][product.Identifier()] = ProductInfo{ + var category Category + switch class { + case templates.Charger: + if tmpl.Group == "switchsockets" { + category = smartswitch + } else if tmpl.Group == "heating" { + category = heating + } else { + category = charger + } + case templates.Meter: + category = meter + case templates.Vehicle: + category = vehicle + } + + products[string(category)][product.Identifier()] = ProductInfo{ Brand: product.Brand, Description: product.Description.String("en"), }