Hallo zusammen,
ich teile Mal hier die Konfig dafür, ich war mich nicht sicher ob es klappt und es hilft vielleicht manchen im Entscheidungsprozess. Und auf Feedback freue ich mich natürlich, ich bin noch nicht so Erfahren.
Das SmartMeterReader Air von BitShake erlaubt SmartMeters, die SML über einer IR Schnittstelle reden auszulesen. Das „Air“ Modell hat alles drin, IR-Lesekopf, ESP32 und WLAN, was für mich beeindruckend ist. WLAN Empfang ist sogar gut fand ich.
Vom Werk aus wird es mit Tasmota vorinstalliert geliefert, was super ist für Leute die kein Home Assistant haben: man bekommt eine nette Benutzeroberfläche, mit stündliche/tägliche/monatliche Charts (muss man aber konfigurieren).
Ich nutze aber ESPhome mit Home Assistant schon, deswegen war ich wenig scharf darauf die Tasmota Integration und Add-On in meinem HA hinzuzufügen. Genau aus den selben Grund habe ich MQTT auch weggelassen, die API reicht mir vollkommen, noch ein Add-On weniger.
SmartMeterReader Air von Bitshake nutz ein esp32-c3-mini-1, was ganz klar mit ESPhome kompatibel ist. Meine einzige Sorge war, ob die SML Library von ESPhome was taugt, aber auch das hat geklappt.
Mein Zähler ist ein DZG WS7412 mit einem Firmware Bug (workaround dazu im yaml code unten), der ab und zu negative Werte zurückgibt.
ESPhome yaml:
# BitShake SmartMeterReader Air – custom board with ESP32-C3-MINI-1
# GPIO5 is connected to IR sensor
# SML ESPhome doc:
# https://github.com/esphome/esphome-docs/blob/current/components/sml.rst
# Not using MQTT, just ESPhome native API
# https://esphome.io/components/api.html#advantages-over-mqtt
esphome:
name: smartmeterreader
friendly_name: SmartMeterReader
esp32:
board: esp32-c3-devkitm-1
framework:
# esp-idf framework recommended for ESP32-C3:
# https://esphome.io/components/esp32.html#esp-idf-framework
type: esp-idf
logger:
api:
encryption:
key: !secret home_assistant_encryption_key
ota:
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "${friendly_name} Hotspot"
password: !secret fallback_ssid_password
captive_portal:
# web GUI for troubleshooting
web_server:
uart:
id: uart_bus
rx_pin: GPIO5
baud_rate: 9600
data_bits: 8
parity: NONE
stop_bits: 1
sml:
id: mysml
uart_id: uart_bus
sensor:
- platform: sml
name: "Total energy"
icon: mdi:meter-electric
sml_id: mysml
# server_id: "0a012345670000abcdef" # optional, since there is a single SML input. Enable DEBUG log to find it.
obis_code: "1-0:1.8.0"
unit_of_measurement: kWh
accuracy_decimals: 4
device_class: energy
state_class: total_increasing
filters:
- multiply: 0.0001 # One unit from DZG WS7412 represents 0.1 W
- platform: sml
name: "Current power"
icon: mdi:lightning-bolt-circle
sml_id: mysml
# server_id: "0a012345670000abcdef" # optional, since there is a single SML input. Enable DEBUG log to find it.
obis_code: "1-0:36.7.0"
unit_of_measurement: W
accuracy_decimals: 0
device_class: power
state_class: measurement
filters:
- multiply: 0.01
# the below line is only required on WS7412 meters returning negative values from time to time.
# https://github.com/volkszaehler/libsml/pull/136
- lambda: |-
return abs(x);
# options to reduce the rate of updates (multiple times per second on a WS7412 e.g.) while retaining some reactivity using 'delta'
# - or:
# - throttle_average: 5s
# - delta: 5%
# another option:
# - or:
# - median:
# window_size: 5
# send_every: 5
# send_first_at: 3
# - delta: 5%
# there are two more OBIS codes, visible when enabling DEBUG logs: 1-0:96.50.1 and 1-0:96.1.0
# both are static, one is the meter ID, the other is probably the model.
# Wi-Fi
# https://github.com/MallocArray/airgradient_esphome/blob/main/packages/sensor_wifi.yaml
- platform: wifi_signal
name: "WiFi Signal"
id: wifi_dbm
update_interval: 60s
- platform: internal_temperature
name: "ESP Temperature"
id: sys_esp_temperature
- platform: uptime
name: "Uptime"
id: device_uptime
# diagnostics
# https://github.com/MallocArray/airgradient_esphome/blob/main/packages/diagnostic.yaml
- platform: template
id: esp_memory_percent
icon: mdi:memory
name: ESP Percentage Free Memory
lambda: return heap_caps_get_free_size(MALLOC_CAP_INTERNAL)*100 / 532480;
unit_of_measurement: "%"
state_class: measurement
entity_category: "diagnostic"
- platform: template
id: esp_memory
icon: mdi:memory
name: ESP Free Memory
lambda: return heap_caps_get_free_size(MALLOC_CAP_INTERNAL) / 1024;
unit_of_measurement: "kB"
state_class: measurement
entity_category: "diagnostic"