From 452d59116586a51b4f6e53c779c83148b71e6b90 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Sat, 23 Mar 2024 01:24:37 +0100 Subject: [PATCH] Update ESPHome firmware customization documentation (#428) --- components/pulse_meter.yaml | 21 ++--------- docs/docs/advanced/firmware_customization.mdx | 30 ++++++++++++++- docs/docs/faq/faq_nr2.md | 35 +++++++----------- docs/docs/faq/faq_nr7.md | 14 ++++--- docs/static/img/customization/edit-device.png | Bin 0 -> 12660 bytes 5 files changed, 54 insertions(+), 46 deletions(-) create mode 100644 docs/static/img/customization/edit-device.png diff --git a/components/pulse_meter.yaml b/components/pulse_meter.yaml index 4956cfac..fabc55b0 100644 --- a/components/pulse_meter.yaml +++ b/components/pulse_meter.yaml @@ -36,8 +36,8 @@ number: button: # Reset the total energy entity - platform: template - name: "Reset - Total Energy" id: button_reset_total + name: "Reset - Total Energy" on_press: - pulse_meter.set_total_pulses: id: sensor_energy_pulse_meter @@ -46,15 +46,14 @@ button: sensor: # Pulse meter - platform: pulse_meter - name: '${friendly_name} - Power Consumption' id: sensor_energy_pulse_meter + name: '${friendly_name} - Power Consumption' unit_of_measurement: W state_class: measurement device_class: power icon: mdi:flash-outline accuracy_decimals: 0 pin: ${pulse_pin} - # internal_filter: 100ms on_raw_value: then: - light.turn_on: @@ -67,15 +66,9 @@ sensor: # - multiply: 60 - lambda: return x * ((60.0 / id(select_pulse_rate).state) * 1000.0); - # Update the sensor with an average every 10th second. See - # https://github.com/klaasnicolaas/home-assistant-glow/#reduce-the-amount-of-data-the-sensors-produce - # for more information. - #- throttle_average: 10s - #- filter_out: NaN - total: - name: '${friendly_name} - Total Energy' id: sensor_total_energy + name: '${friendly_name} - Total Energy' unit_of_measurement: kWh icon: mdi:circle-slice-3 state_class: total_increasing @@ -86,16 +79,10 @@ sensor: # - multiply: 0.001 - lambda: return x * (1.0 / id(select_pulse_rate).state); - # Update the sensor once per 0.1 kWh consumed, or every 5th minute, whichever happens sooner. - # See https://github.com/klaasnicolaas/home-assistant-glow/#reduce-the-amount-of-data-the-sensors-produce - # for more information. - #- delta: 0.01 - #- heartbeat: 300s - # Total day usage - platform: total_daily_energy - name: '${friendly_name} - Daily Energy' id: sensor_total_daily_energy + name: '${friendly_name} - Daily Energy' power_id: sensor_energy_pulse_meter unit_of_measurement: kWh icon: mdi:circle-slice-3 diff --git a/docs/docs/advanced/firmware_customization.mdx b/docs/docs/advanced/firmware_customization.mdx index c83bff16..5ec8b4db 100644 --- a/docs/docs/advanced/firmware_customization.mdx +++ b/docs/docs/advanced/firmware_customization.mdx @@ -1,6 +1,6 @@ --- id: firmware_customization -title: Customizing the Firmware +title: Customizing the firmware description: How to adopt and customize the firmware for your own needs. --- @@ -36,4 +36,30 @@ three components, all of which are included in the base config: - `pulse_meter.yaml`: Entities related to the pulse meter - `status_led.yaml`: Entities related to the status LED -You can see the source for all the components [here](https://github.com/klaasnicolaas/home-assistant-glow/tree/main/components). \ No newline at end of file +All of these components can be found on the [GitHub repository](https://github.com/klaasnicolaas/home-assistant-glow/tree/main/components). + +## Make customizations + +After adopting the device, you can make customizations to the firmware by editing the YAML +files. You can do this by clicking the **EDIT** button in the ESPHome dashboard. This will open +the YAML editor, where you can make changes to the configuration. + +

+ +

+ +When you open the YAML editor you will see a minimal configuration of your Home Assistant Glow, +if you want to make adjustments to, e.g., the [pulse_meter] component then the best way +is to use an [!extend]. + +```yaml title="your_glow_config.yaml" +sensor: + - id: !extend sensor_energy_pulse_meter + internal_filter: 100ms +``` + +With the above example you will add an [internal_filter], which can be useful if high power values are measured. + +[internal_filter]: https://esphome.io/components/sensor/pulse_counter.html?highlight=internal_filter +[pulse_meter]: https://esphome.io/components/sensor/pulse_counter.html +[!extend]: https://esphome.io/guides/configuration-types.html#extend \ No newline at end of file diff --git a/docs/docs/faq/faq_nr2.md b/docs/docs/faq/faq_nr2.md index 147e0017..2e2c6e69 100644 --- a/docs/docs/faq/faq_nr2.md +++ b/docs/docs/faq/faq_nr2.md @@ -6,39 +6,30 @@ description: How to reduce the amount of sensor data Depending on the configured **pulse rate**, the type of house/apartment and the heating system in use, the sensors that are exposed to Home Assistant may produce a lot of data. For example, with the default **pulse rate** of `1000`, a power consumption of 3600 W means that the sensors produce 2 HA state changes per second (which means 7200 state changes per hour). -If you don't need that kind of granularity, you can use [ESPHome sensor filters][filters] to reduce the rate of updates written to Home Assistant. With the commented-out filters in the [pulse_meter.yaml][file] enabled, only 396 state changes will be produced per hour. You can read more about making YAML adjustments on the [customizing the Firmware](/docs/advanced/firmware_customization.mdx) page. +If you don't need that kind of granularity, you can use [ESPHome sensor filters][filters] to reduce the rate of updates written to Home Assistant. This can be done by adding the following YAML code at the bottom of your Home Assistant Glow configuration file: -### Pulse meter - power sensor - -```yaml title="components/pulse_meter.yaml" +```yaml title="your_glow_config.yaml" sensor: - - platform: pulse_meter - # ... + - id: !extend sensor_energy_pulse_meter filters: - # multiply value = (60 / imp value) * 1000 - # - multiply: 60 - - lambda: return x * ((60.0 / id(select_pulse_rate).state) * 1000.0); - # Update the sensor with an average every 10th second. See - throttle_average: 10s - filter_out: NaN -``` - -### Pulse meter - total energy sensor - -```yaml title="components/pulse_meter.yaml" -sensor: - - platform: total_daily_energy - # ... + - id: !extend sensor_total_daily_energy filters: - # multiply value = 1 / imp value - # - multiply: 0.001 - - lambda: return x * (1.0 / id(select_pulse_rate).state); - # Update the sensor once per 0.1 kWh consumed, or every 5th minute, whichever happens sooner. - delta: 0.01 - heartbeat: 300s ``` +After applying the filters, only 396 state changes will be produced per hour. You can read more about making YAML adjustments on the [customizing the firmware](/docs/advanced/firmware_customization.mdx) page. + +## Related topics + +- [ESPHome sensor filters][filters] +- [ESPHome pulse meter](https://esphome.io/components/sensor/pulse_meter.html) +- [ESPHome total daily energy sensor](https://esphome.io/components/sensor/total_daily_energy.html) +- [Customizing the firmware](/docs/advanced/firmware_customization.mdx) + [filters]: https://esphome.io/components/sensor/index.html#sensor-filters [file]: https://github.com/klaasnicolaas/home-assistant-glow/blob/main/components/pulse_meter.yaml#L73 \ No newline at end of file diff --git a/docs/docs/faq/faq_nr7.md b/docs/docs/faq/faq_nr7.md index 01357ebe..c3f48872 100644 --- a/docs/docs/faq/faq_nr7.md +++ b/docs/docs/faq/faq_nr7.md @@ -6,18 +6,22 @@ description: Sudden increase in consumption after a period of zero readings Linked issue: [#274][issue_274] -If you have a solar system, and the consumption remains zero for some time and then gets a value from the sensor, you may see an abrupt increase in the total daily energy sensor value that doesn't match the actual consumption. +If you have a solar system, and the consumption remains zero for some time and then gets a value from the sensor, you may see an abrupt increase in the total daily energy sensor value that doesn't match the actual consumption. ## What to do? -In your ESP config file, use the `left` [calculation method][method] instead of the default (`right`): +Try to use the `left` [calculation method][method] instead of the default (`right`). You can do this by editing your ESPHome device and add the following configuration at the bottom of your YAML file: -```yaml title="components/pulse_meter.yaml" +```yaml title="your_glow_config.yaml" sensor: - - platform: total_daily_energy - # ... + - id: !extend sensor_total_daily_energy method: left ``` +## Related topics + +- [ESPHome total daily energy sensor][method] +- [Customizing the firmware](/docs/advanced/firmware_customization.mdx) + [method]: https://esphome.io/components/sensor/total_daily_energy.html [issue_274]: https://github.com/klaasnicolaas/home-assistant-glow/issues/274 diff --git a/docs/static/img/customization/edit-device.png b/docs/static/img/customization/edit-device.png new file mode 100644 index 0000000000000000000000000000000000000000..da78d4248c9f7e3373b362732dd0c862ecf5d405 GIT binary patch literal 12660 zcmb_@Ra9I-wZBgS%@3ndZMU zYt}s6m%HYnyHA}{wQJWtyK2||>gzCNMQIE)5;Oz^1Pqxkz^@1huL1DuDpX|nH(4j` z0{rKd(^u)w2o+GWeRu)UQd~hC0Ra;8?$HN%Z6<^7%>FY+5&m}@vs>$539-2on&cm2&Nq(Z=Slh1an1E|Rc1MR8GBq`IuCTJzGadXQ^^9m9 z8wW>amB>+5jioP<1%8i29|;L*r}Qcqf1W>p7?}?U1oG&liz_r!F>H4Bp_yzMKJnt< z;7nLmy(Yfb^gX7}gWt9IiUF?&Trfl8E=Fb;^NXVBM90KjMD`|uS5*P*y^=RJ&aoXY z+!sayXmpw&aalssRZb%!BH{_Yz}x+@@+Yh(MRQB6RXM%)}6M$sQ$ z?hA1tLtc~eNgx9>fMyug4X^~_nc1YXG?|P zOPyi2gN6g!Ka@+5A@la2cUkY{>d7QvG~bq)YX7OUE0uAJ3Qw}_a19Uv?Zc~)<@$I5 zae7p61r@-RB2CzaUJnQ*6rPx4A`HR4Uf7z)I-96==qQ=b#RQR&YC@SaZ|L|mMMEhE zY~#8cN;y`@Yp`YSYhPmLMcq0Xmo8OfpVs+w^355eGQ8l+a? zg^g8!?#88g-5Jm*Teex8WyY>t%~1t6Q0|9O{dOF6E~0yj+>YU@1dRmvSD{$btLa9s)9_r2s5cFVsTnNljYD2r{v z#1f_dOp3!OLI-;=d;5kIu2qdnYhKkX8Q!U~7kddCr__Ri^vv3jMaC3bJQGRTXW zTDv-f;YPkdeo>Elh!p+BFL6{DD~Kl3v6QaFIb?CnXAv~ zCzAjI^Fnw5zdmCvb_f&JJVlH@g0cjnp@6oKZdC7MQ5KdYJ}Q$lO{0km`dZ38-ra%f zRn*iZy@-OR9nTmK*K&^fF&hK{jl&PQoc*1_Qc8w=g04I{H?cS8tcc&th3HdFZSM}q z>#P>10^;1or&+Obhs5w#I?#+~MDUANCTyX}pEdkTfS1rSA3sV zc}Qp4l7_}b8%v)H?*sW02Mt3ilj%!aj_4I$IX#)k_k5lvazLF4VBzr0(5j}qbhcNAQ2$XGknET=?hn{QVlQOEpF)M+kbs`TG5YX=!PW3r*G+1j2P%T1~Hyix<0lgPLr6%iXN_ z)+;ed4n3SnNluEzFa1P;nRqykT6YZd% zj1KmXtq}5OtQ)GU0qW&uP$Rhpjn(@gi{pZo&`isdta*a9uoX}fuae|Z&>f1&a|@G0 zR=RJWz6t38cI#41@oD(IZ@Kfum7pP$fv9f<)~lvAL)1`Dj}6>cmv^BX1jo^?zVVDl zpovoNlfMwV{izsoce#6+UQkO5{ceb7Gv5R}$!1+y|b zT$n_Q7HxNBPt-RPQnqCI_ble5yPWxRsKp{7Z?~|X$EH3buJ4i%dB4G4L~EeS{a-5- z>X4bDKvSH+HH7d}MoR52;qed(oKV2rtkILMPuZhExc~E>9Z#t6*Bbgj5nr}me^{^2 zU@P;5BCG(@5n$f60iW-w9I{D#m>pQjgr;>A)I*ui&(B)TIhB>{E)Q4x^Tn!#CT(qP z5V7a;7>Gm&W)oB>ePg?C*fhz|$NXrh)IP#?-f0
27#lGUy!UwLPDq;Bi=526nV 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