Files
P1/esphome-web-66b44f.yaml
2025-06-28 22:19:38 +02:00

288 lines
7.6 KiB
YAML

substitutions:
device_name: utilities-meter
friendly_name: um
esphome:
name: ${device_name}
project:
name: d1.utilities-meter
version: "1.0.0"
name_add_mac_suffix: true
esp8266:
board: esp01_1m
restore_from_flash: true
# Based on:
# - Slimme Lezer for the Electricity Meter
# - https://github.com/zuidwijk/dsmr/blob/main/slimmelezer.yaml
# - @ 0f34e14 on Oct 10
# - Blog post for the Water Meter
# - https://www.pieterbrinkman.com/2022/02/02/build-a-cheap-water-usage-sensor-using-esphome-home-assistant-and-a-proximity-sensor/
# - Using the same pin for multiple sensor types is no longer supported:
# - https://github.com/esphome/issues/issues/3364#issuecomment-1179691203
# - Connect same input to 2 GPIOs to make them read the same sensor, but keep separate counts internally.
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
manual_ip:
static_ip: 192.168.1.150
gateway: 192.168.1.254
subnet: 255.255.255.0
dns1: 192.168.1.1
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: ${device_name}
password: ${device_name}
captive_portal:
web_server:
port: 80
ota:
- platform: !secret ota_platform
password: !secret ota_password
# Enable logging
#
# Baud-rate is set to zero to disable serial logging so that the UART interface can perform well enough to receive the
# DSMR packages.
# - https://esphome.io/components/sensor/dsmr.html#improving-reader-results
logger:
baud_rate: 0
# Enable Home Assistant API
api:
reboot_timeout: 30min
services:
- service: set_pulse_total
variables:
new_pulse_total: int
then:
- pulse_counter.set_total_pulses:
id: water_sensor_freq
value: !lambda 'return new_pulse_total;'
uart:
id: uart_bus
rx_pin:
number: 3
inverted: true
rx_buffer_size: 1700
baud_rate: 115200
dsmr:
id: dsmr_instance
max_telegram_length: 1700
sensor:
- platform: dsmr
energy_delivered_tariff1:
name: ${friendly_name}"Energy Consumed Tariff 1"
energy_delivered_tariff2:
name: ${friendly_name}"Energy Consumed Tariff 2"
power_delivered:
name: ${friendly_name}"Power Consumed"
accuracy_decimals: 3
electricity_failures:
name: ${friendly_name}"Electricity Failures"
icon: mdi:alert
electricity_long_failures:
name: ${friendly_name}"Long Electricity Failures"
icon: mdi:alert
current_l1:
name: ${friendly_name}"Current Phase 1"
accuracy_decimals: 2
current_l2:
name: ${friendly_name}"Current Phase 2"
accuracy_decimals: 2
current_l3:
name: ${friendly_name}"Current Phase 3"
accuracy_decimals: 2
power_delivered_l1:
name: ${friendly_name}"Power Consumed Phase 1"
accuracy_decimals: 3
power_delivered_l2:
name: ${friendly_name}"Power Consumed Phase 2"
accuracy_decimals: 3
power_delivered_l3:
name: ${friendly_name}"Power Consumed Phase 3"
accuracy_decimals: 3
power_returned:
name: "Power Produced"
unit_of_measurement: "W"
state_class: "measurement"
accuracy_decimals: 0
filters:
- multiply: 1000
energy_returned_tariff1:
name: "Energy Produced Tariff 1"
state_class: total_increasing
energy_returned_tariff2:
name: "Energy Produced Tariff 2"
state_class: total_increasing
power_returned_l1:
name: "Power Produced Phase 1"
unit_of_measurement: "W"
state_class: "measurement"
accuracy_decimals: 0
filters:
- multiply: 1000
power_returned_l2:
name: "Power Produced Phase 2"
unit_of_measurement: "W"
state_class: "measurement"
accuracy_decimals: 0
filters:
- multiply: 1000
power_returned_l3:
name: "Power Produced Phase 3"
unit_of_measurement: "W"
state_class: "measurement"
accuracy_decimals: 0
filters:
- multiply: 1000
gas_delivered:
name: ${friendly_name}"Gas Consumed"
- platform: template
# extra sensor to calculate the missing gas value
name: Gas Consumed Calculated
id: gas_consumed_calculated
device_class: gas
state_class: total_increasing
accuracy_decimals: 3
unit_of_measurement: "m³"
- platform: uptime
name: "Uptime"
update_interval: 60s
- platform: wifi_signal
name: "WiFi Signal Strenght"
id: wifi_signal_db
update_interval: 60s
# Reports the WiFi signal strength in %.
# https://esphome.io/components/sensor/wifi_signal.html
- platform: copy
source_id: wifi_signal_db
name: "WiFi Signal (percent)"
id: wifi_signal_pct
unit_of_measurement: "Signal %"
accuracy_decimals: 0
filters:
- lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
entity_category: "diagnostic"
- platform: pulse_counter
pin: GPIO14
name: "Sensor Average Frequency"
id: water_sensor_freq
accuracy_decimals: 1
update_interval : 15s
total:
name: "Sensor Pulses"
id: water_sensor_pulses
unit_of_measurement: "pulses"
accuracy_decimals: 0
state_class: total_increasing
# Timeout after 1 minute, for a minimum resolution of 1.0 litres per minute.
# Default is 5 minutes, meaning 1 pulse per 5 minutes, which is 0.2 litres per minute.
- platform: pulse_meter
pin: 2
name: ${friendly_name}"Water Instantaneous Consumption"
id: water_inst_cons
unit_of_measurement: "litre/min"
accuracy_decimals: 1
timeout: 1min
icon: "mdi:water-pump"
total:
name: ${friendly_name}"Water Consumed"
id: water_consumed
unit_of_measurement: "litre"
accuracy_decimals: 2
device_class: water
state_class: total_increasing
icon: "mdi:water"
- platform: copy
source_id: water_consumed
name: ${friendly_name}"Water Meter Reading"
id: water_meter_reading
unit_of_measurement: "m³"
accuracy_decimals: 2
device_class: water
state_class: total_increasing
icon: "mdi:water"
filters:
- multiply: 0.001
- platform: copy
source_id: water_consumed
name: ${friendly_name}"Water Meter Total"
id: water_meter_total
unit_of_measurement: "m³"
accuracy_decimals: 3
device_class: water
state_class: total_increasing
icon: "mdi:water"
filters:
- multiply: 0.001
text_sensor:
- platform: dsmr
identification:
name: ${friendly_name}"DSMR Identification"
p1_version:
name: ${friendly_name}"DSMR Version"
gas_delivered_text:
name: ${friendly_name}"Gas Consumed Text"
id: gas_consumed_text
# if the state of "gas_delivered_text" changes a new value for the extra gas sensor is calculated
on_value:
then:
- lambda: |-
std::string str = id(gas_consumed_text).state;
std::vector<std::string> v;
char * token;
char seps[] = "()";
token = strtok (&str[0],seps);
while (token != NULL)
{
v.push_back(token);
token = strtok (NULL, seps);
}
int count = 0;
for ( std::string s : v )
{
if (count == 6) {
id(gas_consumed_calculated).publish_state(parse_number<float>(s.c_str()).value());
}
count++;
}
- platform: wifi_info
ip_address:
name: "IP Address"
ssid:
name: "WiFi SSID"
bssid:
name: "WiFi BSSID"
- platform: version
name: "ESPHome Version"
hide_timestamp: false