From 9ba33a7e361b4f0b5212b42ccb7e7c2108562254 Mon Sep 17 00:00:00 2001 From: Xavier Berger Date: Sat, 23 Nov 2024 17:44:29 +0100 Subject: [PATCH 1/2] feat: Add energy saved counter calculation base on regulator opening and load power --- esp32-proxy-client.yaml | 8 ++-- esp32-standalone.yaml | 4 +- solar_router/energy_counter_theorical.yaml | 56 ++++++++++++++++++++++ wt32-eth01-standalone_on_off.yaml | 2 +- 4 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 solar_router/energy_counter_theorical.yaml diff --git a/esp32-proxy-client.yaml b/esp32-proxy-client.yaml index b4f798b..a37ec06 100644 --- a/esp32-proxy-client.yaml +++ b/esp32-proxy-client.yaml @@ -48,7 +48,6 @@ web_server: # This part of the script is designed to be use for customisation. It shouldn't be necessary to # edit other part of the script to perform configuration. - substitutions: # Power meter source ----------------------------------------------------------- # Define ip address of Proxy Power Meter @@ -90,6 +89,9 @@ packages: power_meter: <<: !include solar_router/power_meter_proxy_client.yaml regulator: - <<: !include solar_router/regulator_triac.yaml + <<: !include solar_router/regulator_triac.yaml solar_router: - <<: !include solar_router/engine.yaml + <<: !include solar_router/engine.yaml + energy_counter: + <<: !include solar_router/energy_counter_theorical.yaml + diff --git a/esp32-standalone.yaml b/esp32-standalone.yaml index 334ede1..fe5caf4 100644 --- a/esp32-standalone.yaml +++ b/esp32-standalone.yaml @@ -102,4 +102,6 @@ packages: <<: !include solar_router/regulator_triac.yaml solar_router: <<: !include solar_router/engine.yaml - + energy_counter: + <<: !include solar_router/energy_counter_theorical.yaml + diff --git a/solar_router/energy_counter_theorical.yaml b/solar_router/energy_counter_theorical.yaml new file mode 100644 index 0000000..c78909a --- /dev/null +++ b/solar_router/energy_counter_theorical.yaml @@ -0,0 +1,56 @@ +# ---------------------------------------------------------------------------------------------------- +# Calculate daily energy diverted +# ---------------------------------------------------------------------------------------------------- + +# Define the power of load plugged on the solar router +number: + - platform: template + name: "Load power" + id: load_power + min_value: 1 + max_value: 99999 + step: 1 + unit_of_measurement: "W" + optimistic: True + restore_value: true + +# Script updating the power consumed counter +script: + - id: energy_diverted_counter + mode: single + then: + - lambda: |- + id(therorical_energy_diverted).publish_state(id(load_power).state*id(regulator_opening).state / 100); + +# Sensor showing the actual energy diverted consumption +sensor: + - id: energy_diverted + platform: total_daily_energy + name: 'Energy diverted' + power_id: therorical_energy_diverted + unit_of_measurement: 'kWh' + state_class: total_increasing + device_class: energy + accuracy_decimals: 3 + filters: + # Multiplication factor from W to kW is 0.001 + - multiply: 0.001 + + - platform: template + name: Theorical energy diverted + id: therorical_energy_diverted + unit_of_measurement: 'W' + +# Enable time component to +# - Update energy diverted counter +# - Reset energy at midnight +time: + - platform: homeassistant + id: homeassistant_time_for_solar_router + + - platform: sntp + on_time: + # Trigger action every second + - seconds: /1 + then: + - script.execute: energy_diverted_counter \ No newline at end of file diff --git a/wt32-eth01-standalone_on_off.yaml b/wt32-eth01-standalone_on_off.yaml index 2b2c67b..d1b789a 100644 --- a/wt32-eth01-standalone_on_off.yaml +++ b/wt32-eth01-standalone_on_off.yaml @@ -62,7 +62,7 @@ web_server: # substitutions: # # Power meter source ----------------------------------------------------------- # # Define ip address of Power Meter (Fronius Inverter) -# #power_meter_ip_address: "192.168.1.21" +# power_meter_ip_address: "192.168.1.21" # # # LEDs ------------------------------------------------------------------------- # # Green LED is reflecting regulation status From 9ed3dcb871087fb3da7aae4551ac1ba527c7a096 Mon Sep 17 00:00:00 2001 From: Xavier Berger Date: Sat, 23 Nov 2024 17:44:29 +0100 Subject: [PATCH 2/2] doc: Update documentation to explain energy counter --- docs/energy_counter_theorical.md | 25 ++++++++++++++++++ docs/firmware.md | 1 + docs/ha_configuration.md | 21 ++++++++------- ...terEnergyCounterTheoricalConfiguration.png | Bin 0 -> 29199 bytes ...larRouterEnergyCounterTheoricalSensors.png | Bin 0 -> 19443 bytes docs/installation.md | 10 ++++--- mkdocs.yml | 2 ++ 7 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 docs/energy_counter_theorical.md create mode 100644 docs/images/SolarRouterEnergyCounterTheoricalConfiguration.png create mode 100644 docs/images/SolarRouterEnergyCounterTheoricalSensors.png diff --git a/docs/energy_counter_theorical.md b/docs/energy_counter_theorical.md new file mode 100644 index 0000000..b74ffc4 --- /dev/null +++ b/docs/energy_counter_theorical.md @@ -0,0 +1,25 @@ +# Energy Counter Theorical + +**Energy Counter Theorical** is designed to calculate the amount energy diverted to the load. *This is an optional package.* + +The amount of energy diverted is calculated based on the load power (in `W`) and the level of energy diverted every seconds. + +!!! warning "Energy saved reported by this counter is for information only" + Remember that values are calculated and not measured. + The values presented by this sensor are only estimations of energy diverted based on the configuration you made in Home Assistant. + +To use this counter, add the following lines to your configuration file. + +```yaml +packages: + counter: + url: https://github.com/XavierBerger/Solar-Router-for-ESPHome/ + file: solar_router/energy_counter_theorical.yaml +``` +Then you have to define the **load power** in Home Assistant `Control` interface. The power entered has to reflect the power of the element plugged on solar router. + +![alt text](images/SolarRouterEnergyCounterTheoricalConfiguration.png) + +The instantaneous and cumulated energy diverted are available in `sensors` interface: + +![alt text](images/SolarRouterEnergyCounterTheoricalSensors.png) \ No newline at end of file diff --git a/docs/firmware.md b/docs/firmware.md index c9de5fb..f901343 100644 --- a/docs/firmware.md +++ b/docs/firmware.md @@ -7,6 +7,7 @@ Packages are : * **Power meters** : design to measure the energy exchanged with the grid. * **Regulator** : design to channel the surplus of energy to a designated load. * **Engine** : design to determine how much of energy and when surplus of energy should be diverted to the load. +* **Energy counter** : design to report the amount of energy diverted to the load. ## Packages diff --git a/docs/ha_configuration.md b/docs/ha_configuration.md index f2bd0ff..18cc346 100644 --- a/docs/ha_configuration.md +++ b/docs/ha_configuration.md @@ -1,29 +1,32 @@ # Home Assistant configuration -**Power meters** are reading energy exchanged with the grid every secondes. -By default, Home Assistant *recorder* is saving this information in its database. +**Power meters** and **energy sensors** are updated every secondes. +By default, Home Assistant *recorder* is saving these informations in its database. To optimize data storage in Home Assistant, it's essential to configure databases appropriately. -* First **Identify the Target Sensor** - Power meter provides a sensor names `real_power`. - In your Home Assistant it should be prefixed with the name of your device and should then be identified with an id like `sensor.solarrouter_real_power`. - Check you sensor to adapt the configuration. +* First **Identify the Target Sensor to filter out** + Power meter provides a sensor named `real_power`. + Energy counter provides a sensor named `theorical_energy_diverted`. + In your Home Assistant it should be prefixed with the name of your device and should then be identified with an id like `sensor.solarrouter_real_power` or `sensor.solarrouter_theorical_energy_diverted`. + Check your sensors to adapt the configuration. * Then **Create a `recorder` configuration for Home Assistant** - Add the following lines in your `configuration.yaml` to filter out `real_power` data: + Add the following lines in your `configuration.yaml` to filter out `real_power` and `theorical_energy_diverted` data: ```yaml recorder: exclude: entities: - sensor.solarrouter_real_power + - sensor.solarrouter_theorical_energy_diverted ``` !!! note "About recorder" - Home Assistant `recorder` is constantly saves data in database. Refer to [recorder configuration](https://www.home-assistant.io/integrations/recorder/) for details. + Home Assistant `recorder` is constantly saves data in database. Refer to [recorder configuration](https://www.home-assistant.io/integrations/recorder/) for details. + **It is strongly advised to have a look to data produced by your solar router and adapt your configuration according to your needs.** !!! warning "If you are using InfluxDB" If you are using InfluxDB, you should pay the same attention about data recording. - Refer to the [integration documentation](https://www.home-assistant.io/integrations/influxdb/) to exclude `real_power` from your database. + Refer to the [integration documentation](https://www.home-assistant.io/integrations/influxdb/) to exclude `real_power` and `theorical_energy_diverted` from your database. diff --git a/docs/images/SolarRouterEnergyCounterTheoricalConfiguration.png b/docs/images/SolarRouterEnergyCounterTheoricalConfiguration.png new file mode 100644 index 0000000000000000000000000000000000000000..44f5d1290648bbd663acce013fa119d9555a79bc GIT binary patch literal 29199 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 literal 0 HcmV?d00001 diff --git a/docs/images/SolarRouterEnergyCounterTheoricalSensors.png b/docs/images/SolarRouterEnergyCounterTheoricalSensors.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b08e8eeae6630c98c78b5504e429af2296d7e6 GIT binary patch literal 19443 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 literal 0 HcmV?d00001 diff --git a/docs/installation.md b/docs/installation.md index 080a912..435e13e 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -47,7 +47,7 @@ A **proxy** just need 1 **power meter** package You are developer and your regulator is missing from this list, refer to [contributing](contributing.md) section to see how to contribute to this project. -#### Step 2.3: Add a Solar Router Engine +#### Step 2.3: Add an Engine * [Variable Engine](engine.md) Read power exchange with the grid, determine and apply the percentage of regulator opening. @@ -55,15 +55,19 @@ A **proxy** just need 1 **power meter** package * [ON/OFF Engine](engine_on_off.md) Read power exchange with the grid, and start to divert energy if a threshold is reached and stop if another threshold is reached. +#### Step 2.4: Add an Energy Counter (*Optional*) -### Ster 3: Configure your solar router +* [Energy Saved Counter Theorical](energy_saved_counter_theorical.md) + Calculate energy savec base on energy diverted and load power. + +### Step 3: Configure your solar router Each package requires a configuration which is done in `substitution` section. *Refer to documentation of packages selected and add configuration to the end of your yaml file.* You can refer to examples to see how to configure your yaml for a [standalone](standalone_example.md) installation a [proxy based](proxy_example.md) installation. -!!! example "More examples are avialble in [github](https://github.com/XavierBerger/Solar-Router-for-ESPHome)" +!!! example "More examples are available in [github](https://github.com/XavierBerger/Solar-Router-for-ESPHome)" ### Step 4: Upload firmware diff --git a/mkdocs.yml b/mkdocs.yml index d668330..cfd1b74 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -27,6 +27,8 @@ nav: - Engine: - Variable regulation: engine.md - ON/OFF regulation: engine_on_off.md + - Energy Counter: + - Theorical: energy_counter_theorical.md - HA configuration: ha_configuration.md - Contributing: contributing.md - ChangeLog: changelog.md