Software voor de ESP8266 die DSMR5 P1 slimme meter data uitleest en verstuurt naar een MQTT broker — met OTA firmware updates via web en Arduino, WiFi- en MQTT-configuratie via WiFiManager, Home Assistant Auto Discovery, automatische versiecheck via GitHub, en een volledige REST API.
- Over dit project
- Functies
- Benodigdheden
- Hardware aansluiting
- Installatie
- Eerste configuratie
- MQTT topics
- REST API
- Home Assistant Auto Discovery
- JSON Telegram endpoint
- OTA updates
- Firmware update via web
- Debug modus
- Instellingen aanpassen
- Gerelateerde projecten
- Release notes
- Credits
De originele firmware had moeite met DSMR5.0 meters die elke seconde een telegram sturen op 115200 baud. SoftwareSerial kon dit niet bijhouden en ontving regelmatig corrupte berichten. Deze versie gebruikt de hardware UART (RX) poort, wat stabiel werkt op hoge baudrates.
Verder uitgebreid met een volledige REST API, Home Assistant Auto Discovery, delta detection voor efficiënte MQTT updates, een configureerbaar update interval dat tot 1 seconde kan, en een web-gebaseerde OTA updater met automatische versiecheck via GitHub.
| Functie | Details |
|---|---|
| DSMR5 uitlezen | Hardware UART, stabiel op 115200 baud |
| MQTT publicatie | 30 topics, elk afzonderlijk |
| Delta detection | Stuurt alleen gewijzigde waarden — maakt 1 sec interval realistisch |
| Configureerbaar interval | 1–3600 seconden, via API instelbaar zonder herstart, opgeslagen in EEPROM |
| HA Auto Discovery | Alle sensors verschijnen automatisch in Home Assistant |
| Per-fase teruglevering | L1, L2, L3 teruglevering als aparte MQTT topics |
| REST API | 12 endpoints voor beheer, monitoring en configuratie |
| JSON telegram endpoint | Laatste telegram beschikbaar als JSON via HTTP |
| Web OTA updater | Firmware updaten via browser — GitHub download of eigen .bin upload |
| Automatische versiecheck | ESP checkt GitHub periodiek op nieuwe versie, publiceert naar MQTT en HA |
| Auto-update | Optioneel automatisch installeren bij nieuwe versie |
| Arduino OTA | Draadloos firmware updaten via Arduino IDE |
| WiFiManager | WiFi + MQTT configuratie via captive portal — geen hercompilatie nodig |
| Stabiele reconnect | WiFi reconnect elke 15 min, MQTT elke 5 sec, HA discovery herverstuurd na reconnect |
| Versienummer | Zichtbaar via Serial, REST API, web updater en Home Assistant device info |
| DEBUG flag | Alle Serial output achter compile-time flag — standaard uit in productie |
Hardware:
- ESP8266 (getest: NodeMCU v1/v3, Wemos D1 Mini)
- 10kΩ weerstand
- RJ11 (4-pins) of RJ12 (6-pins) kabel — RJ12 kan de ESP ook voeden vanuit de meter
Software / libraries (Arduino IDE):
| Library | Installatie |
|---|---|
PubSubClient |
Arduino Library Manager |
WiFiManager |
Arduino Library Manager |
ArduinoJson |
Arduino Library Manager |
ESPAsyncTCP |
Arduino Library Manager |
ESPAsyncWebServer |
Arduino Library Manager |
ESP8266HTTPClient |
Ingebouwd in ESP8266 core |
ESP8266httpUpdate |
Ingebouwd in ESP8266 core |
ArduinoOTA |
Ingebouwd in ESP8266 core |
LittleFS |
Ingebouwd in ESP8266 core |
| P1 poort pin | ESP8266 pin | Omschrijving |
|---|---|---|
| 2 - RTS | 3.3V | Request To Send — hoog houden om data te ontvangen |
| 3 - GND | GND | Ground |
| 5 - RXD | RX (GPIO3) | Data lijn |
Gebruik een 10kΩ pull-up weerstand tussen 3.3V en de DATA (RXD) pin van de P1 poort. Zonder deze weerstand is het signaal geïnverteerd en ontvangt de ESP geen data.
| P1 poort pin | ESP8266 pin | Omschrijving |
|---|---|---|
| 1 - 5V out | 5V / VIN | Voeding vanuit de meter |
| 2 - RTS | 3.3V | Request To Send |
| 3 - GND | GND | Ground |
| 5 - RXD | RX (GPIO3) | Data lijn |
| 6 - GND | GND | Ground |
Werkt op de meeste DSMR5+ meters. Op een Landis+Gyr E360 werkt 3.3V op RTS — 5V voeding is niet noodzakelijk.
- Installeer de ESP8266 board package via Tools → Board → Board Manager — zoek op
esp8266 - Installeer alle benodigde libraries via Tools → Manage Libraries
- Open
esp8266_p1meter_v2_7.ino - Pas
OTA_PASSWORDaan invariables.h— gebruik iets unieks, standaard isadmin - Stel
GITHUB_USERenGITHUB_REPOinvariables.hin op jouw GitHub repo voor de versiecheck - Selecteer het juiste board: Tools → Board → LOLIN(WEMOS) D1 R2 & mini (of NodeMCU 1.0)
- Selecteer de juiste COM poort
- Klik op Upload
- Open het project in PlatformIO
- Pas
OTA_PASSWORDaan invariables.h - Klik op Upload
Na het flashen start de ESP als WiFi Access Point:
- Zoek op je telefoon of laptop naar het netwerk
ESP******en verbind ermee - Er verschijnt automatisch een configuratiepagina — anders navigeer naar
192.168.4.1 - Vul in:
- WiFi SSID + wachtwoord
- MQTT hostname (IP-adres of hostname van je broker, bijv.
192.168.1.10) - MQTT port (standaard
1883) - MQTT gebruikersnaam (leeg laten indien geen authenticatie)
- MQTT wachtwoord (leeg laten indien geen authenticatie)
- MQTT root topic (standaard
homeassistant/sensor/p1meter) - Home Assistant discovery (
trueoffalse)
- Klik op Save — de ESP herstart en verbindt met je netwerk
Het IP-adres is daarna te vinden via je router, de seriële monitor, of het MQTT topic homeassistant/sensor/p1meter/ip_address/state.
Alle waarden worden verstuurd naar hun eigen topic:
{MQTT_ROOT_TOPIC}/{sensor_id}/state
Met de standaard root topic homeassistant/sensor/p1meter:
| Topic | Omschrijving | Eenheid |
|---|---|---|
.../consumption_low_tarif/state |
Verbruik laag tarief | Wh (÷1000 = kWh) |
.../consumption_high_tarif/state |
Verbruik hoog tarief | Wh (÷1000 = kWh) |
.../returndelivery_low_tarif/state |
Teruglevering laag tarief | Wh (÷1000 = kWh) |
.../returndelivery_high_tarif/state |
Teruglevering hoog tarief | Wh (÷1000 = kWh) |
| Topic | Omschrijving | Eenheid |
|---|---|---|
.../actual_consumption/state |
Totaal actueel verbruik | W (÷1000 = kW) |
.../actual_returndelivery/state |
Totale actuele teruglevering | W (÷1000 = kW) |
.../l1_instant_power_usage/state |
L1 actueel verbruik | W (÷1000 = kW) |
.../l2_instant_power_usage/state |
L2 actueel verbruik | W (÷1000 = kW) |
.../l3_instant_power_usage/state |
L3 actueel verbruik | W (÷1000 = kW) |
.../l1_instant_power_return/state |
L1 actuele teruglevering | W (÷1000 = kW) |
.../l2_instant_power_return/state |
L2 actuele teruglevering | W (÷1000 = kW) |
.../l3_instant_power_return/state |
L3 actuele teruglevering | W (÷1000 = kW) |
| Topic | Omschrijving | Eenheid |
|---|---|---|
.../l1_instant_power_current/state |
L1 stroom | mA (÷1000 = A) |
.../l2_instant_power_current/state |
L2 stroom | mA (÷1000 = A) |
.../l3_instant_power_current/state |
L3 stroom | mA (÷1000 = A) |
.../l1_voltage/state |
L1 spanning | mV (÷1000 = V) |
.../l2_voltage/state |
L2 spanning | mV (÷1000 = V) |
.../l3_voltage/state |
L3 spanning | mV (÷1000 = V) |
| Topic | Omschrijving | Eenheid |
|---|---|---|
.../gas_meter_m3/state |
Gasverbruik | dm³ (÷1000 = m³) |
.../gas_meter_type/state |
Type gasmeter | — |
.../gas_equipment_id/state |
Serienummer gasmeter | — |
| Topic | Omschrijving |
|---|---|
.../actual_tarif_group/state |
Huidig tarief (1 = laag, 2 = hoog) |
.../short_power_outages/state |
Aantal korte stroomonderbrekingen |
.../long_power_outages/state |
Aantal lange stroomonderbrekingen |
.../short_power_drops/state |
Aantal korte spanningsdalingen |
.../short_power_peaks/state |
Aantal korte spanningspieken |
.../dsrm_version/state |
DSMR versie van de meter |
.../dsrm_datetime/state |
Datum/tijd van het laatste telegram |
.../dsrm_equipment_id/state |
Serienummer elektriciteitsmeter |
.../ip_address/state |
Huidig IP-adres van de ESP |
.../update_available/state |
true als nieuwe firmware beschikbaar is |
.../latest_version/state |
Laatste versie gevonden op GitHub |
Waarden worden als integers verstuurd. Home Assistant past via de
value_templatede deling toe bij sensors met HA Auto Discovery.
De ESP biedt een HTTP API op poort 80.
Basis-URL: http://{ip-adres}/{endpoint}
| Methode | Endpoint | Omschrijving |
|---|---|---|
GET |
/ |
Status + versienummer |
GET |
/version |
Alleen versienummer |
GET |
/restart |
Herstart de ESP |
GET |
/haon |
HA Auto Discovery inschakelen |
GET |
/haoff |
HA Auto Discovery uitschakelen |
GET |
/interval |
Huidig update interval opvragen |
GET |
/interval/set?seconds={n} |
Update interval instellen |
GET |
/mqtt?server={ip} |
MQTT server bijwerken |
GET |
/telegram |
Laatste telegram als JSON |
GET |
/update |
Web firmware updater pagina |
GET |
/update/check |
Gecachede versiecheck als JSON |
POST |
/update/upload |
Firmware uploaden als .bin bestand |
Response:
Ok - P1Meter v2.7.0
Handig voor scripts of automatische update checks.
Response:
2.7.0
Herstart de ESP na 5 seconden.
Response:
Server is restarting in 5 seconds, restarting can take up to 1 minute...
curl http://192.168.1.x/restartSchakelt Home Assistant Auto Discovery in. Stuurt direct de config-berichten naar MQTT. Opgeslagen in EEPROM.
Response:
Ok - HA Discovery is on
curl http://192.168.1.x/haonSchakelt Home Assistant Auto Discovery uit. Stuurt lege retained berichten zodat HA de sensors verwijdert. Opgeslagen in EEPROM.
Response:
Ok - HA Discovery is off
curl http://192.168.1.x/haoffGeeft het huidige update interval terug.
Response:
Update interval: 5000 ms (5.0 sec)
curl http://192.168.1.x/intervalStelt het update interval in. Werkt direct zonder herstart en wordt opgeslagen in EEPROM.
Parameters:
| Parameter | Verplicht | Waarde |
|---|---|---|
seconds |
Ja | 1 t/m 3600 |
Response (success):
Update interval set to 5 seconds. No restart needed.
Foutmeldingen:
| Input | Response |
|---|---|
?seconds=0 |
Invalid value: minimum is 1 second. The P1 meter sends at most 1 telegram per second. |
?seconds=abc |
Invalid value: 'abc' is not a number. |
?seconds=9999 |
Invalid value: maximum is 3600 seconds (1 hour). |
curl "http://192.168.1.x/interval/set?seconds=5" # 5 seconden
curl "http://192.168.1.x/interval/set?seconds=1" # maximale snelheid
curl "http://192.168.1.x/interval/set?seconds=60" # standaardDe instelling blijft actief na een herstart. Na een verse flash geldt de standaard uit
variables.h(60 seconden).
Werkt het MQTT server-adres bij, slaat het op in EEPROM en herstart de ESP automatisch.
Parameters:
| Parameter | Verplicht | Omschrijving |
|---|---|---|
server |
Ja | IP-adres of hostname van de MQTT broker |
Response (success):
MQTT server updated successfully!
curl "http://192.168.1.x/mqtt?server=192.168.1.20"Geeft het meest recent ontvangen en geverifieerde telegram terug als JSON, opgeslagen in LittleFS. Wordt bijgewerkt bij elke succesvolle CRC-check.
Response (voorbeeld):
{
"device": {
"ip_address": "192.168.1.50",
"dsrm_version": "50",
"dsrm_timestamp": "250101120000W",
"dsrm_equipment_id": "E0000000000000000"
},
"readings": {
"consumption_low_tarif": { "value": 1234.567, "unit": "kWh" },
"consumption_high_tarif": { "value": 2345.678, "unit": "kWh" },
"return_low_tarif": { "value": 100.000, "unit": "kWh" },
"return_high_tarif": { "value": 200.000, "unit": "kWh" }
},
"actuals": {
"actual_consumption": { "value": 1.234, "unit": "kW" },
"actual_return": { "value": 0.000, "unit": "kW" },
"tarif": 2
},
"l1": {
"power": { "value": 0.800, "unit": "kW" },
"power_return": { "value": 0.000, "unit": "kW" },
"current": { "value": 3, "unit": "A" },
"voltage": { "value": 233, "unit": "V" }
},
"l2": { "...": "..." },
"l3": { "...": "..." },
"gas": {
"gas_delivered": { "value": 987.654, "unit": "m3" },
"gas_equipment_id": "G0000000000000000",
"gas_meter_type": "003"
},
"status": {
"short_power_outage": 3,
"long_power_outage": 1,
"short_power_drops": 0,
"short_power_peaks": 0
},
"rawtelegram": [
"/XMX5LGBBLA4415650678",
"...",
"!ABCD"
]
}curl http://192.168.1.x/telegramGebruik in Home Assistant (RESTful sensor):
sensor:
- platform: rest
name: P1 Telegram
resource: http://192.168.1.x/telegram
json_attributes:
- readings
- actuals
- l1
- l2
- l3
- gas
value_template: "{{ value_json.device.dsrm_timestamp }}"Geeft de gecachede versiecheck terug als JSON — zonder live GitHub call.
Response:
{
"success": true,
"current": "2.7.0",
"latest": "2.7.0",
"update_available": false,
"free_heap": 17984
}curl http://192.168.1.x/update/checkWanneer HA Discovery ingeschakeld is, publiceert de ESP automatisch MQTT config-berichten zodat alle sensors direct in Home Assistant verschijnen — zonder handmatige YAML configuratie.
Inschakelen:
- Via de configuratiepagina van WiFiManager bij eerste setup
- Of achteraf via de API:
GET /haon
Uitschakelen:
- Via de API:
GET /haoff— stuurt lege retained berichten zodat HA de sensors verwijdert
De sensors verschijnen in Home Assistant onder het device "P1 Meter". Alle sensors zijn aan hetzelfde device gekoppeld, inclusief de update status sensors.
Automatisch geconfigureerde sensor-types:
| Type | HA device_class | HA state_class | Eenheid |
|---|---|---|---|
| Vermogen | power |
measurement |
kW |
| Stroom | current |
measurement |
A |
| Spanning | voltage |
measurement |
V |
| Energie | energy |
total_increasing |
kWh |
| Gas | gas |
total_increasing |
m³ |
| Tarief, ID's, datum | — | — | — |
| Update beschikbaar | — | — | true / false |
| Laatste versie | — | — | versienummer |
Zie GET /telegram in de REST API sectie hierboven.
- Ga naar Tools → Port
- Onder Network ports verschijnt
p1meter at 192.168.x.x - Selecteer die poort
- Upload zoals normaal — de IDE vraagt om het OTA wachtwoord
Werkt het device niet in de lijst?
- Controleer of je PC op hetzelfde netwerk/VLAN zit als de ESP
- Op Windows kan de firewall mDNS blokkeren — voeg een inbound rule toe voor UDP poort 5353 en 8266
- Als alternatief: gebruik
espota.pyvia de command line
Via command line (espota.py):
python "C:\...\tools\espota.py" -i 192.168.1.x -p 8266 -a admin -f firmware.binespota.py is te vinden in %APPDATA%\Arduino15\packages\esp8266\hardware\esp8266\{versie}\tools\
OTA poort: 8266
Hostname: p1meter (aanpasbaar via HOSTNAME in variables.h)
Wachtwoord: instelbaar via OTA_PASSWORD in variables.h — standaard admin, verander dit
Navigeer naar http://{ip-adres}/update voor de web updater. Deze pagina biedt:
Bij elke aanroep van de pagina wordt de gecachede versiecheck getoond. De ESP checkt periodiek (elke 6 uur standaard) version.json op GitHub en publiceert het resultaat naar MQTT.
- Auto-update — schakel in om automatisch te updaten zodra een nieuwe versie gevonden wordt. De instelling wordt opgeslagen in EEPROM.
Downloadt de laatste release direct van GitHub en flasht automatisch. De ESP herstart na het flashen. De pagina toont een voortgangsbalk en redirectt automatisch terug na 25 seconden.
Upload een lokaal gecompileerd .bin bestand. Exporteer dit vanuit Arduino IDE via Sketch → Export Compiled Binary.
De versiecheck gebruikt
rawcdn.githack.comals HTTP proxy voorraw.githubusercontent.com— dit vermijdt een HTTPS heap probleem op de ESP8266 (BearSSL vereist ~20KB vrij heap voor SSL, de ESP8266 heeft typisch ~17KB beschikbaar). De firmware download zelf gebruikt wél HTTPS voor integriteit.
Zet een version.json bestand in de root van je master branch:
{
"version": "2.7.0",
"url": "https://github.com/{gebruiker}/{repo}/releases/latest/download/firmware.bin",
"changelog": "https://github.com/{gebruiker}/{repo}/blob/master/RELEASE_NOTES.md"
}Update dit bestand bij elke nieuwe release zodat de versiecheck correct werkt.
Standaard is alle Serial output uitgeschakeld in productie. Schakel in via variables.h of bovenaan het .ino bestand:
#define DEBUG 1 // 0 = uit (productie), 1 = aan (ontwikkeling)Met DEBUG 1 verschijnt in de Serial monitor (115200 baud):
- Versiecheck resultaat bij opstarten
- MQTT publish per topic
- Delta detection — hoeveel topics verstuurd per cyclus
- WiFi en MQTT reconnect pogingen
- CRC validatie per telegram
De meeste instellingen staan in variables.h en worden eenmalig bij het flashen ingesteld. Het update interval en auto-update zijn daarna ook via de web updater of API aan te passen.
| Instelling | Standaard | Omschrijving |
|---|---|---|
DEBUG |
0 |
Zet op 1 voor Serial output tijdens ontwikkeling |
UPDATE_INTERVAL |
60000 (60 sec) |
Standaard interval bij eerste flash — daarna via /interval/set |
WIFI_RECONNECT_INTERVAL |
15 minuten | Wachttijd tussen WiFi reconnect-pogingen |
MQTT_RECONNECT_INTERVAL |
5000 (5 sec) |
Wachttijd tussen MQTT reconnect-pogingen |
HOSTNAME |
p1meter |
mDNS hostname en OTA naam |
MQTT_ROOT_TOPIC |
homeassistant/sensor/p1meter |
MQTT root topic |
OTA_PASSWORD |
admin |
Verander dit vóór het flashen |
GITHUB_USER |
wpbezemer |
GitHub gebruikersnaam voor versiecheck |
GITHUB_REPO |
esp8266_p1meter |
GitHub repository naam voor versiecheck |
Instellingen in settings.h (buffergroottes, timeouts, versienummer) hoeven normaal niet aangepast te worden.
| Adres | Grootte | Inhoud |
|---|---|---|
| 0–63 | 64 bytes | MQTT hostname |
| 64–69 | 6 bytes | MQTT poort |
| 70–101 | 32 bytes | MQTT gebruikersnaam |
| 102–133 | 32 bytes | MQTT wachtwoord |
| 134–165 | 32 bytes | MQTT root topic |
| 166 | 1 byte | Instellingen beschikbaar vlag |
| 167 | 1 byte | HA Discovery aan/uit |
| 168–171 | 4 bytes | Update interval (ms) |
| 172 | 1 byte | OTA check interval (uren, 0 = uit) |
| 173 | 1 byte | Auto-update aan/uit |
Zodra de P1 meter data naar Home Assistant stuurt via MQTT, kun je de data direct visualiseren met deze custom Lovelace cards:
| Project | Omschrijving |
|---|---|
| ha-energie-overzicht-card | Totaaloverzicht van gridverbruik, solar productie en teruglevering — met SVG arc gauge, zelfvoorzieningsgraad en bronverdeling |
| ha-energie-card-3fase | Detail per fase voor 3-fase meters — geanimeerde vermogenspijltjes, stroom, spanning en voortgangsbalk per fase (L1/L2/L3), inclusief historiek grafiek |
Beide cards ondersteunen HACS-installatie en werken direct met de MQTT topics die deze firmware publiceert.
Zie RELEASE_NOTES.md voor een volledig overzicht per versie.
Dit project is opgebouwd op het werk van velen. Zonder deze forks en bronnen had dit project niet bestaan:
| Project | Auteur | Bijdrage |
|---|---|---|
| esp8266_p1meter | fliphess | Origineel project — basis P1 uitlezing met SoftwareSerial |
| esp8266_p1meter | daniel-jong | DSMR5.0 ondersteuning, overstap naar hardware UART voor stabiele 115200 baud |
| esp8266_p1meter | wpbezemer | REST API, HA Auto Discovery, WiFiManager, web OTA updater, LittleFS telegram opslag |
| P1-Meter-ESP8266 | jantenhove | Vroege ESP8266 P1 implementatie |
| P1-Meter-ESP8266-MQTT | neographikal | MQTT integratie |
| Slimme meter uitlezen | gejanssen.com | Uitgebreide documentatie over het DSMR P1 protocol |
Licentie: GPL-3.0