Integratie ESP8266 / DSRM logger data met Home-Assistant
Geplaatst opPlatform: MQTT
De eenvoudigste manier om data op een ESP8266 te delen met Home-Assistant (HA) is doormiddel van een MQTT-broker. Een MQTT-broker is een service die standaard op de HassIO installatie van HA draait. MQTT staat voor Message Queuing Telemetry Transport systeem en het bestaat uit clienten die communiceren met een server (de ‘broker’). Een client kan zowel een subscriber (iemand die gegevens opvraagt) alsook een publisher (iemand die gegevens levert) zijn. Informatie is gegroepeerd in ‘topics’ (onderwerpen). Als een publisher nieuwe informatie heeft dan stuurt hij deze naar de broker. De broker zorgt er vervolgens voor dat iedere client die op dit specifieke topic een subscription heeft deze nieuwe informatie ontvangt.De topics zijn hiërarchische georganiseerd wat wil zeggen dat een topic, bijvoorbeeld “ESP8266/Abc/Temperatuur”, bestaat uit “ESP8266, waaronder “Abc” staat waar weer onder “Temperatuur” staat. Binnen de “ESP8266/Abc/” hiërarchie kan bijvoorbeeld ook “Luchtdruk” staan (ESP8266/Abc/Luchtdruk). Heeft een client een subscription op alléén “ESP8266” dan ontvangt hij álle berichten die daarónder vallen óók!
Als zich een nieuwe client aanmeld met interesse in een bepaald topic dan zal deze client direct de laatste informatie over dit topicontvangen. De subscriber hoeft dus niet te wachten tot er een update voor dit topic komt. Hij krijgt altijd, direct, de laatste bekende informatie.
Mocht de MQTT-broker (mosquitto) niet op jouw Raspberry Pi geïnstalleerd zijn dan kun je dat alsnog zo doen:
Om vervolgens de mosquitto server automatisch te starten bij het opstarten van je RPi toets je in:
pi@raspberry:~ $ sudo apt update
pi@raspberry:~ $ sudo apt install -y mosquitto mosquitto-clients
pi@raspberry:~ $ sudo systemctl enable mosquitto.serviceTot zover de theorie.
Integratie
De integratie tussen de ESP8266 en Home-Assistant via MQTT ziet er schematisch zo uit: ESP / MQTT / HA
Om met de ESP8266 een verbinding met een MQTT broker te kunnen maken moet de bibliotheek pubsubclient van Nick O'Leary
in de Arduino IDE worden geïnstalleerd (https://github.com/knolleary/pubsubclient).
Als voorbeeld gebruiken we een project waarbij de ESP8266 een BMP085 (GY-68) sensor uitlees en de gegevens naar de MQTT-broker stuurt.Ik heb de schakeling zoals in onderstaand plaatje op een 1of!-proto bordje (links) gesoldeerd en de Sketch op de 1of!-ESP12 bordje (rechts) geflashed.
in de Arduino IDE worden geïnstalleerd (https://github.com/knolleary/pubsubclient).
Als voorbeeld gebruiken we een project waarbij de ESP8266 een BMP085 (GY-68) sensor uitlees en de gegevens naar de MQTT-broker stuurt.Ik heb de schakeling zoals in onderstaand plaatje op een 1of!-proto bordje (links) gesoldeerd en de Sketch op de 1of!-ESP12 bordje (rechts) geflashed.
1of!-ESP12 Proto GY68
Na installatie van de voornoemde bibliotheek zijn er onder “Bestand->Voorbeelden” / ”File->Examples” een aantal voorbeeldprogramma’s geplaatst bij “PubSubClient”. Voor deze introductie gaan we uit van het programma “mqtt-esp8266” en alle regelnummers verwijzen naar de posities in de originele Sketch!
Achter regel 27 moeten de volgende twee regels worden gezet:
De regels 31, 32 en 33 moeten worden aangepast voor jouw installatie.
Na regel 36 moet de volgende code worden toegevoegd:
Komt er een message binnen op het topic “inTopic”, dan wordt de functie callback() aangeroepen waar, in de voorbeeldprogramma, in de regels 73 t/m 80 afhankelijk van de inhoud van het bericht de BUILTIN_LED wordt aan- of uit- gezet. Deze functionaliteit en deze topics zal ik in deze post verder niet gebruiken.
Omdat we voor deze post vooral gegevens van de ESP8266 naar HA willen sturen maken we een extra functie die er zo uit ziet:
Achter regel 27 moeten de volgende twee regels worden gezet:
#includeUiteraard moet je eerst de bibliotheek “Adafruit_BMP085” downloaden (https://github.com/adafruit/Adafruit-BMP085-Library) en in de Arduino IDE installeren!
#include
De regels 31, 32 en 33 moeten worden aangepast voor jouw installatie.
31 const char* ssid = "........";Bij ssid moet je de naam van je WiFi netwerk invullen en bij password het wachtwoord van je WiFi netwerk. Bij mqtt_server moet je het IP-adres van je HA server invullen (wat bij HA vaak hetzelfde IP-adres als van je HA server is).
32 const char* password = "........";
33 const char* mqtt_server = "broker.mqtt-dashboard.com";
Na regel 36 moet de volgende code worden toegevoegd:
// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)en in setup() moet, na regel 113 dit worden toegevoegd:
// Connect GND to Ground
// Connect SCL to i2c clock - on GPIO05
// Connect SDA to i2c data - on GPIO04
Adafruit_BMP085 bmp;
if (!bmp.begin()) >De Sketch heeft een subscription op het topic “inTopic” en publiceert op het topic “outTopic”.
Komt er een message binnen op het topic “inTopic”, dan wordt de functie callback() aangeroepen waar, in de voorbeeldprogramma, in de regels 73 t/m 80 afhankelijk van de inhoud van het bericht de BUILTIN_LED wordt aan- of uit- gezet. Deze functionaliteit en deze topics zal ik in deze post verder niet gebruiken.
Omdat we voor deze post vooral gegevens van de ESP8266 naar HA willen sturen maken we een extra functie die er zo uit ziet:
Deze functie leest de BMP085 uit en druk de gevonden waarden af op de Serial Monitor én publiceert deze gegevens. Daarbij is het hoofd-topic “ESP8266”. De subtopic “thisDevID” moet in een productie omgeving aangepast worden in “iets” waar deze ‘sensor-module’ uniek door geïdentificeerd kan worden (voor het geval je er meerdere hebt) en daaronder een indicatie die de soort data aangeeft (Temperatuur, Luchtdruk en Hoogte). De daadwerkelijk waarden worden als json-string verstuurd.
Vervolgens veranderen we de loop() functie als volgt:
Vervolgens veranderen we de loop() functie als volgt:
void loop() > // loop()Mocht je voor de MQTT-broker op de HA server een username en password hebben ingesteld, dan moet je deze gegevens gebruiken bij het maken van de verbinding met de broker. Voeg, na regel 33, de volgende twee regels toe:
char* mqttName = "..."; // name for MQTT loginIn regel 92 staat:
char* mqttPasswd = "..."; // .. and his password
92 if (client.connect(clientId.c_str())) {deze moet je dan als volgt aanpassen:
92 if (client.connect(clientId.c_str(), mqttName, mqttPasswd)) {Als je nu het programma naar de ESP8266 upload zie je in de Serial Monitor:
ESP8266 MQTT Output
Log nu in op je HA server en toets in:
Vervolgens zie je de volgende gegevens verschijnen:
mosquitto_sub -hDe MQTT installatie op de Raspberry Pi heet ‘mosquitto’. Met bovenstaand commando starten we een client die verbinding maakt met de MQTT server op het opgegeven IP-adres (dat zal in veel gevallen hetzelfde IP-adres als het IP-adres van de HA server zijn) met de username en het wachtwoord die je voor de MQTT server hebt ingesteld. De “-t” optie geeft aan dat we alleen geïnteresseerd zijn in topics die beginnen met “ESP8266/”.-u -P mqttPasswd> -v -t ESP8266/#
Vervolgens zie je de volgende gegevens verschijnen:
mosquitto_sub
Nu we zeker weten dat de berichten vanaf de ESP8266 bij de MQTT-broker terecht komen kunnen we proberen HA deze waardes uit MQTT te laten halen en op zijn front-end te presenteren.
HA moet weten wie de MQTT-broker is die hij moet benaderen. Daarom nemen we in het configuration.yaml bestand deze gegevens op:
HA moet weten wie de MQTT-broker is die hij moet benaderen. Daarom nemen we in het configuration.yaml bestand deze gegevens op:
mqtt:Ik heb al mijn group-configuraties in de map ./groups staan en al mijn sensor configuratie yaml bestanden in de sub-map ./sensors. Daarvoor heb ik in het configuration.yaml ook deze regels opgenomen:
broker:
port: 1883
client_id: HassIO
keepalive: 60
username:
password:
group: !include_dir_merge_named groups/In de map ~/.homeassistant/sensors/ maken we een nieuw bestand aan met de naam esp8266.yaml die deze inhoud heeft:
sensor: !include_dir_merge_list sensors/
Hierin zeggen we dat we gebruik willen maken van het platform mqtt, dat binnen de configuraties de items “ESP8266_Temperatuur”, “ESP8266_Luchtdruk” en “ESP8266_Hoogte” voorkomen en de gegevens uit de publicatie “ESP8266/thisDevID/xxx” uit de json-string moeten worden gehaald.
Vervolgens voegen we in de map ~/.homeassistant/groups het bestand esp8266.yaml toe met de volgende inhoud:
Vervolgens voegen we in de map ~/.homeassistant/groups het bestand esp8266.yaml toe met de volgende inhoud:
Na het opnieuw opstarten van Home-Assistant kunnen we de gegevens in de Front-end bewonderen.
HA Front end
Platform: restAPI
Home-Assistant kan ook gegevens via een restAPI uit andere systemen (bijvoorbeeld uit de DSMR-logger) halen.In de map ~/.homeassistant/sensors moet je dan bijvoorbeeld de volgende gegevens zetten:
Als de restAPI echter met één request meerdere gegevens terug geeft heeft deze aanpak het nadeel dat als je voor ieder veld de restAPI aanroept er dus héél veel data “over de lijn gaat” en dat het externe systeem ook vrij zwaar belast wordt.Voor het uitlezen van de Slimme Meter uitlezer (DSMR-logger) heb ik voor een andere aanpak gekozen.
Platform: File
Ik heb er voor het uitlezen van de DSMR-logger voor gekozen om Home-Assistant de gegevens uit een bestand te laten halen. Dat bestand staat op dezelfde computer waar ook Home-Assistant op draait waardoor de overhead wordt geminimaliseerd.Het werkt zo:
DSMR - Home Assistant
Cron is de Unix/Linux deamon die, op basis van tijd, jobs start. In ons geval moet hij iedere minuut het python script “DSMR_Actual.py” starten. Met het commando ‘crontab -e’ (als user root!!) kun je de volgende regel in crontab aanbrengen:
# For more information see the manual pages of crontab(5) and cron(8)Het programma DSMR_Actual.py heeft de volgende inhoud:
#
@reboot /home/homeassistant/.homeassistant/scripts/DSMR_Actual.py
#
# m h dom mon dow command
# iedere minuut
* * * * * /home/homeassistant/.homeassistant/scripts/DSMR_Actual.py
#
In regel 5 krijgt ‘url’ de waarde van de restAPI van de DSMR-logger waarmee de actuele gegevens worden opgevraagd. Regel 6 zet dit om in een request aan de DSMR-logger en regel 9 stopt het antwoord van
de DSMR-logger in de variabele ‘r’ die vervolgens in regel 10 gedecodeerd wordt en in de variabele ‘response’ wordt gestopt. Uiteindelijk schrijft json.dump() de inhoud van response naar het bestand ‘/tmp/DSMR-Actual.json’.
De inhoud van het bestand ‘/tmp/DSMR-Actual.json’ ziet er zo uit:
de DSMR-logger in de variabele ‘r’ die vervolgens in regel 10 gedecodeerd wordt en in de variabele ‘response’ wordt gestopt. Uiteindelijk schrijft json.dump() de inhoud van response naar het bestand ‘/tmp/DSMR-Actual.json’.
De inhoud van het bestand ‘/tmp/DSMR-Actual.json’ ziet er zo uit:
Om het geheel een beetje overzichtelijk te houden heb ik alle programma’s en scripts die ik voor Home-Assistant (HA) gebruik in de map ~/.homeassistant/scripts/ gestopt.
Nu moeten we alleen nog aan HA duidelijk maken dat ze de gegevens van de DSMR-logger uit het bestand /tmp/DSMR-Actueel.json moet halen.
Ik heb alle sensors in de map ~/homeassistant/sensors gestopt. In het configuration.yaml bestand heb ik de volgende verwijzing staan:
geparsed en opgenomen.
Eén van de sensor configuratie files is DSMT_Actueel.yaml. Deze heeft de volgende inhoud:
Nu moeten we alleen nog aan HA duidelijk maken dat ze de gegevens van de DSMR-logger uit het bestand /tmp/DSMR-Actueel.json moet halen.
Ik heb alle sensors in de map ~/homeassistant/sensors gestopt. In het configuration.yaml bestand heb ik de volgende verwijzing staan:
group: !include_dir_merge_named groups/Deze regels zorgen ervoor dat alle .yaml files die in de map groups/ of sensors/ staan als configuratie bestand van de HA installatie worden
sensor: !include_dir_merge_list sensors/
geparsed en opgenomen.
Eén van de sensor configuratie files is DSMT_Actueel.yaml. Deze heeft de volgende inhoud:
Om deze gegevens ook daadwerkelijk op de front-end van HA te krijgen moet in de map ~/.homeassistant/groups/ een bestand DSMR-logger.yaml worden aangemaakt met de volgende inhoud:
Met het opnieuw opstarten van Home-Assistant kunnen we de gegevens uit de Slimme Meter uitlezer bewonderen:
Home Assistant EnergieActual
ESP8266 ESP-01S WIFI ModuleDe ESP8266 WiFi module werd bij zijn introductie gepresenteerd als een TTL "Serieel naar internet" module. Handig om Arduino bordjes met het internet te verbinden. Direct leverbaar € 4,55