Mahlzeit,
langsam drehe ich mit meinem Vorhaben durch. Das Heltec-Board ist da, der Schlüssel für den Zähler auch. Nur will nichts so funktionieren wie es soll.
Mein Board ist die V3 und nutzt den Funkchip SX1262, daher kann ich das IoTLabs-Repository nicht nutzen (die Unterstützen noch nicht den SX1262), sondern nutze das von SzczepanLeon. Ich kann auch alles kompilieren und einspielen, nachdem ich festgestellt habe, dass seine wmbus_meter zwingend die Zeilen “time: - platform: homeassistant” benötigen.
Hier hört es dann aber auch schon (beinahe") auf. Validieren, kompilieren und flashen über esphome funktionieren. ABER:
Das Display gibt nichts aus
Der ESP scheint keine Daten vom Funkchip zu bekommen oder das Modul empfängt nichts.
Ein testweise eingefügter Sensor für den Wlan-Empfang funktioniert. Auf der Konsole im ESPhome bekomme ich auch sinnvolle Ausgaben. Grundlegend scheint das Board also zu funktionieren. Hat einer von euch vielleicht die Muße über meine yaml zu schauen?
external_components:
- source: github://SzczepanLeon/esphome-components@main
components: [ wmbus_common, wmbus_radio, wmbus_meter ]
esphome:
name: heltec
friendly_name: Heltec
esp32:
board: heltec_wifi_lora_32_V3
flash_size: 8MB
cpu_frequency: 240MHZ
framework:
type: esp-idf
# Enable logging
logger:
id: component_logger
level: DEBUG
baud_rate: 115200
# Enable Home Assistant API
api:
encryption:
key: "***"
ota:
- platform: esphome
password: "***"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# sonst Kompilierungsfehler im wmbus_meter
time:
- platform: homeassistant
web_server:
version: 3
# SPI bus for LoRa radio
spi:
clk_pin: GPIO9
mosi_pin: GPIO10
miso_pin: GPIO11
# I2C for OLED display
i2c:
sda: GPIO17
scl: GPIO18
frequency: 400kHz
wmbus_meter:
- id: wasserzaehler_kg
meter_id: ***
type: multical21
key: ***
mode:
- T1
- C1
# uart Driver
wmbus_common:
drivers: all
# LoRa Radio Configuration SX1262
wmbus_radio:
radio_type: SX1262
cs_pin: GPIO08
reset_pin: GPIO12
irq_pin: GPIO14
busy_pin: GPIO13 # Optional but recommended for proper timing
rx_gain: BOOSTED # BOOSTED (default) or POWER_SAVING
rf_switch: false # Set to true if DIO2 controls RF switch
has_tcxo: true # By default, DIO3 controls an external TCXO
on_frame:
- then:
- logger.log:
format: "RSSI: %ddBm T: %s (%d)"
args: [ frame->rssi(), frame->as_hex().c_str(), frame->data().size() ]
# OLED Display
display:
- platform: ssd1306_i2c
model: "SSD1306 128x64"
reset_pin: GPIO21
address: 0x3C
lambda: |-
it.printf(0, 0, id(font1), "Heltec V3");
it.printf(0, 16, id(font1), "WiFi LoRa 32");
it.printf(0, 32, id(font1), "%.1f dBm", id(wifi_signal_db).state);
font:
- file: "gfonts://Roboto"
id: font1
size: 14
sensor:
- platform: wifi_signal
id: wifi_signal_db
name: "WiFi Signal"
update_interval: 60s
- platform: wmbus_meter
parent_id: wasserzaehler_kg
field: total_m3
id: wasser_total_m3
name: "Wasserzaehler Gesamtverbrauch"
unit_of_measurement: "m³"
accuracy_decimals: 2
device_class: water
state_class: total_increasing
icon: mdi:water
Das Log im ESPhome sieht aus wie folgt:
INFO ESPHome 2026.4.5
INFO Reading configuration /config/esphome/heltec.yaml...
WARNING register_action('wmbus_meter.send_telegram_with_mqtt', ...) is missing the synchronous= parameter. Defaulting to synchronous=False (safe but prevents StringRef optimization). Check the C++ class: use synchronous=False if play_next_() is deferred to a callback, timer, or loop(); use synchronous=True if play_next_() always runs before the initial play/play_complex call returns
INFO Detected timezone 'Europe/Berlin'
INFO Starting log output from 10.69.217.88 using esphome API
INFO Successfully resolved heltec @ 10.69.217.88 in 0.000s
INFO Successfully connected to heltec @ 10.69.217.88 in 0.081s
INFO Successful handshake with heltec @ 10.69.217.88 in 0.045s
[15:09:23.955][I][app:154]: ESPHome version 2026.4.3 compiled on 2026-05-11 12:09:05 +0200
[15:09:23.955][I][app:161]: ESP32 Chip: ESP32-S3 rev0.2, 2 core(s)
[15:09:23.956][C][logger:219]: Logger:
[15:09:23.956][C][logger:219]: Max Level: DEBUG
[15:09:23.956][C][logger:219]: Initial Level: DEBUG
[15:09:23.956][C][logger:226]: Log Baud Rate: 115200
[15:09:23.956][C][logger:226]: Hardware UART: UART0
[15:09:23.957][C][logger:235]: Task Log Buffer Size: 768 bytes
[15:09:23.963][C][spi:066]: SPI bus:
[15:09:23.967][C][spi:152]: CLK Pin: GPIO9
[15:09:23.967][C][spi:152]: SDI Pin: GPIO11
[15:09:23.967][C][spi:152]: SDO Pin: GPIO10
[15:09:23.971][C][spi:074]: Using HW SPI: SPI2_HOST
[15:09:23.987][C][i2c.idf:092]: I2C Bus:
[15:09:23.987][C][i2c.idf:093]: SDA Pin: GPIO17
[15:09:23.987][C][i2c.idf:093]: SCL Pin: GPIO18
[15:09:23.987][C][i2c.idf:093]: Frequency: 400000 Hz
[15:09:23.987][C][i2c.idf:103]: Recovery: bus successfully recovered
[15:09:23.991][C][i2c.idf:113]: Results from bus scan:
[15:09:23.994][C][i2c.idf:119]: Found device at address 0x3C
[15:09:24.001][C][ssd1306_i2c:022]: I2C SSD1306
[15:09:24.001][C][ssd1306_i2c:022]: Rotations: 0 °
[15:09:24.001][C][ssd1306_i2c:022]: Dimensions: 128px x 64px
[15:09:24.017][C][ssd1306_i2c:023]: Model: SSD1306 128x64
[15:09:24.017][C][ssd1306_i2c:023]: External VCC: NO
[15:09:24.017][C][ssd1306_i2c:023]: Flip X: YES
[15:09:24.017][C][ssd1306_i2c:023]: Flip Y: YES
[15:09:24.017][C][ssd1306_i2c:023]: Offset X: 0
[15:09:24.017][C][ssd1306_i2c:023]: Offset Y: 0
[15:09:24.017][C][ssd1306_i2c:023]: Inverted Color: NO
[15:09:24.017][C][ssd1306_i2c:033]: Address: 0x3C
[15:09:24.017][C][ssd1306_i2c:152]: Reset Pin: GPIO21
[15:09:24.026][C][ssd1306_i2c:451]: Update Interval: 1.0s
[15:09:24.047][C][captive_portal:134]: Captive Portal:
[15:09:24.048][C][wifi:1505]: WiFi:
[15:09:24.048][C][wifi:1505]: Local MAC: 3C:0F:02:EC:55:F0
[15:09:24.048][C][wifi:1505]: Connected: YES
[15:09:24.048][C][wifi:1216]: IP Address: 10.69.217.88
[15:09:24.051][C][wifi:1227]: SSID: [redacted]
[15:09:24.051][C][wifi:1227]: BSSID: [redacted]
[15:09:24.051][C][wifi:1227]: Hostname: 'heltec'
[15:09:24.051][C][wifi:1227]: Signal strength: -80 dB ▂▄▆█
[15:09:24.051][C][wifi:1227]: Channel: 1
[15:09:24.051][C][wifi:1227]: Subnet: 255.255.255.0
[15:09:24.051][C][wifi:1227]: Gateway: 10.69.217.1
[15:09:24.051][C][wifi:1227]: DNS1: 10.69.217.1
[15:09:24.051][C][wifi:1227]: DNS2: 0.0.0.0
[15:09:24.075][C][esphome.ota:071]: Over-The-Air updates:
[15:09:24.075][C][esphome.ota:071]: Address: heltec.local:3232
[15:09:24.075][C][esphome.ota:071]: Version: 2
[15:09:24.076][C][esphome.ota:078]: Password configured
[15:09:24.076][C][safe_mode:026]: Safe Mode:
[15:09:24.076][C][safe_mode:026]: Successful after: 60s
[15:09:24.076][C][safe_mode:026]: Invoke after: 10 attempts
[15:09:24.076][C][safe_mode:026]: Duration: 300s
[15:09:24.089][C][safe_mode:043]: Bootloader rollback: support unknown
[15:09:24.272][W][safe_mode:058]: OTA rollback detected! Rolled back from partition 'app0'
[15:09:24.275][W][safe_mode:059]: The device reset before the boot was marked successful
[15:09:24.275][C][web_server.ota:256]: Web Server OTA
[15:09:24.294][C][api:235]: Server:
[15:09:24.294][C][api:235]: Address: heltec.local:6053
[15:09:24.294][C][api:235]: Listen backlog: 4
[15:09:24.294][C][api:235]: Max connections: 8
[15:09:24.297][C][api:242]: Noise encryption: YES
[15:09:24.297][C][wifi_signal.sensor:017]: WiFi Signal 'WiFi Signal'
[15:09:24.297][C][wifi_signal.sensor:017]: State Class: 'measurement'
[15:09:24.297][C][wifi_signal.sensor:017]: Unit of Measurement: 'dBm'
[15:09:24.297][C][wifi_signal.sensor:017]: Accuracy Decimals: 0
[15:09:24.297][C][wifi_signal.sensor:232]: Device Class: 'signal_strength'
[15:09:24.312][C][mdns:194]: mDNS:
[15:09:24.312][C][mdns:194]: Hostname: heltec
[15:09:34.945][S][sensor]: 'WiFi Signal' >> -80 dBm