Platform: 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:

pi@raspberry:~ $ sudo apt update
pi@raspberry:~ $ sudo apt install -y mosquitto mosquitto-clients
Om vervolgens de mosquitto server automatisch te starten bij het opstarten van je RPi toets je in:

pi@raspberry:~ $ sudo systemctl enable mosquitto.service
Tot zover de theorie.

Integratie

De integratie tussen de ESP8266 en Home-Assistant via MQTT ziet er schematisch zo uit:
ESP / MQTT / HA 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.
1of!-ESP12 Proto GY68 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:
#include <Wire.h>
#include <Adafruit_BMP085.h>
Uiteraard moet je eerst de bibliotheek “Adafruit_BMP085” downloaden (https://github.com/adafruit/Adafruit-BMP085-Library) en in de Arduino IDE installeren!

De regels 31, 32 en 33 moeten worden aangepast voor jouw installatie.
31 const char* ssid = "........";
32 const char* password = "........";
33 const char* mqtt_server = "broker.mqtt-dashboard.com";
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).

Na regel 36 moet de volgende code worden toegevoegd:
// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
// Connect GND to Ground
// Connect SCL to i2c clock - on GPIO05
// Connect SDA to i2c data  - on GPIO04
Adafruit_BMP085 bmp;
en in setup() moet, na regel 113 dit worden toegevoegd:
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BMP085 sensor, check wiring!");
    while (1) {}
  }
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:
void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();
  if (now - lastMsg > 5000) {
    lastMsg = now;
    collectAndPublishData();
  }
} // 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 login
char* mqttPasswd = "..."; // .. and his password
In regel 92 staat:
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 ESP8266 MQTT Output
Log nu in op je HA server en toets in:
 mosquitto_sub -h <IPadresMQTTServer> -u <mqttName> -P mqttPasswd> -v -t ESP8266/#
De 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/”.

Vervolgens zie je de volgende gegevens verschijnen:
mosquitto_sub 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:
mqtt:
  broker: <IPadresBroker>
  port: 1883
  client_id: HassIO
  keepalive: 60
  username: <mqttName>
  password: <mqttPasswd>
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:
group:  !include_dir_merge_named groups/
sensor: !include_dir_merge_list sensors/
In de map ~/.homeassistant/sensors/ maken we een nieuw bestand aan met de naam esp8266.yaml die deze inhoud heeft:
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:
Na het opnieuw opstarten van Home-Assistant kunnen we de gegevens in de Front-end bewonderen.
HA Front end 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 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)
#
@reboot /home/homeassistant/.homeassistant/scripts/DSMR_Actual.py
#
# m h  dom mon dow   command
# iedere minuut
* * * * *    /home/homeassistant/.homeassistant/scripts/DSMR_Actual.py
#
Het programma DSMR_Actual.py heeft de volgende inhoud:
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:
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:
group:  !include_dir_merge_named groups/
sensor: !include_dir_merge_list sensors/
Deze regels zorgen ervoor dat alle .yaml files die in de map groups/ of sensors/ staan als configuratie bestand van de HA installatie worden
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 Home Assistant EnergieActual
Slimme meter uitlezer V3 - bouwpakket (met ESP-01) Zo langzamerhand zijn alle huizen in Nederland uitgerust met een “Slimme Meter”.  Met dit bouwpakket bouwt u zelf een DSMR-logger V3 (Dutch Smart Meter Requirements), die op basis van de ESP-01 het stroomverbruik van de apparaten in huis logt. € 14,95
ESP8266 ESP-01S WIFI Module De ESP8266 WiFi module werd bij zijn introductie gepresenteerd als een TTL "Serieel naar internet" module. Handig om Arduino bordjes met het internet te verbinden. Al gauw bleek dat deze ESP-01 module en zijn, qua aantal naar buiten gevoerde GPIO pinnen, grotere broertjes (ESP-7, ESP-12, NodeMCU... € 4,95

Comments

Be the first to leave a review .



Upload photos
Add photo

Address