MQTT über Homeassistent

Da das Projekt Fallblattanzeige noch ein wenig dauern wird, wollte ich es zwischendurch mit einem LED Matrix Display versuchen. Das Display soll per mqqt mit Informationen versorgt werden.

Im Home Assistant wurde unter Einstellungen => Apps der Mosquitto broker installiert und unter Geräte & Dienste das mqtt. Letzteres wurde nach der Installation des Broker über das Discovery des Home Assistant gefunden.

Auf dem Raspberry Pi wurde als Client um die Verbindung zu testen mqtt installiert.

apt install mosquitto-clients

Nach der Installation auf dem Raspberry Pi kann eine Verbindung zum Broker aufgebaut werden

mosquitto_sub -h IP_DES_BROKERS -u MQTT_BENUTZER -P MQTT_PASSWORT -t buero/text

Im Home Assistant kann unter Entwicklerwerkzeuge => Aktionen => Veröffentlichen eine Testnachricht gesendet werden, diese sollte dann in der Kommandozeile des Raspberry Pis ausgegeben werden.

Da die spätere Ansteuerung des Matrix Display über python erfolgen soll, wurde
python3-paho-mqtt installiert.

Das Python script für die einfache Ausgabe auf der Kommandozeile

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, reason_code, properties):
print(„Verbunden mit MQTT“)
client.subscribe(„buero/text“)

def on_message(client, userdata, msg):
text = msg.payload.decode()
print(„Empfangen:“, text)

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
client.username_pw_set(„MQTT_BENUTZER“, „MQTT_PASSWORT“)

client.on_connect = on_connect
client.on_message = on_message

client.connect(„192.168.178.15“, 1883)
client.loop_forever()

Zu einem späteren Zeitpunkt werden im Home Assistant Kanäle wie Kalender und Todo erstellt.

Smashing absturz

Schon vor längerer bin ich vom dashing.io auf smashing.io umgestiegen. Der Umstieg gestaltete sich recht einfach, da an den Scripten unter Jobs keinerlei Anpassungen durchgeführt werden mussten.

Mittlerweile werden verschiedene Informationen aus diversen Quellen abgerufen unter anderem Ticketsysteme via Api oder DB Abfrage, Todo Liste, Informationen einer Telefonanlage, Microsoft Service Status, Automatisierungssysteme und Icinga.

Leider ist das smashing teilweise öfters am Tag abgestürzt und musste neu gestartet werden. In dem thin.log kam die Meldung smashing-1.3.6/lib/dashing/app.rb:86:in `block (2 levels) in <top (required)>‘: can’t add a new key into hash during iteration (RuntimeError)

Die Abstürze konnten massiv verringert werden, in dem bei dem Aufruf send_event nicht das Array übergeben wurde sondern eine Kopie des Array mit zum Bespiel values.dup statt values.

Aktueller Stromverbrauch im Grafana

Wer seinen Strom von der EWE bezieht und einen digitalen Stromzähler hat, kann sich einen ELMO bestellen. Eine kleine Dose mit WLAN Antenne die auf den Stromzähler gesteckt wird. Zu bestellen ist das Gerät unter https://www.ewe.de/elmo-bestellung. Die Einrichtung erfolgt mit der dazugehörigen APP. Damit der ELMO alle Daten auslesen kann muss im Zähler der Punkt Info auf on und der Pin auf off gestellt. Bei einigen Zählern gibt es eine Taste für die Konfiguration oder ein kleines Feld auf dem mit einer Taschenlampe geleuchtet werden muss.

Damit Werte in einer Influxdb zwischengespeichert werden können, muss die Datebank zunächst erstellt werden.

create database elmobb with duration 30d

create user elmo with password ‚<password>‘

grant all on „elmodb“ to „elmo“

Die Informationen werden über die http://<ip Adresse>/data ausgelesen und mit Hilfe eines Ruby Scriptes in eine Influxdb geschrieben. Das Script wird per Cronjob alle 10 Minuten ausgeführt.

require 'json'


urlServer =`curl http://<ip>/data`

daten = JSON.parse(urlServer)

sendeurl = "-i -X POST 'http://localhost:8086/api/v2/write?bucket=elmodb' --header 'Authorization: Token <dbuser>:<kennwort>' --data-binary 'daten,strom=zaehler zaehlerstand=#{daten['measurements'][0]['values']['1-0:1.8.0*255'].to_s.split(".")[0]}'"
sendeurlserver =`curl #{sendeurl}`

sendeurl = "-i -X POST 'http://localhost:8086/api/v2/write?bucket=elmodb' --header 'Authorization: Token <dbuser>:<kennwort>' --data-binary 'daten,strom=aktuell verbrauch=#{daten['measurements'][0]['values']['1-0:16.7.0*255']} '"
sendeurlserver =`curl #{sendeurl}`


Im Grafana sieht es wie folgt aus

Es gibt noch weitere Daten die aus dem ELMO herangezogen werden können, gegebenenfalls folgt noch ein weiterer Artikel.

Google Kalender Termine in Grafana

In einer smashing.io Kachel werden bereits Termine aus dem Google Kalender ausgegeben und nun sollten die Termine auch in einer Grafana Kachel angezeigt werden.

Der Zugriff auf den Kalender über die API wurde bereits im Artikel https://www.itbasic.de/api-zugriff-auf-den-google-kalender/ beschrieben. Das Script wurde angepasst und per Cronjob ausgeführt. Die Werte „Wer;Titel;von;bis“ werden in einer CSV Datei lokal abgelegt.

Damit das Grafana eine CSV als Datenquelle verwenden kann, wurde das Plugin https://grafana.com/grafana/plugins/marcusolsson-csv-datasource/?src=grafana_add_ds&tab=installation installiert. Nach erfolgreicher Installation wurde die CSV Datei als Datenquelle eingerichtet.

Da sich die Datei lokal auf dem Grafana Server befindet, müssen folgende Zeilen in der /etc/grafana/grafana.ini hinterlegt werden. Ohne die Zeilen erhält man die folgende Fehlermeldung im Query: local mode has been disabled by your administrator error

[plugin.marcusolsson-csv-datasource]
allow_local_mode = true

Nach Neustart des Grafana Servers können die Termine aus der Datei ausgegeben werden.

Wemos Daten in Grafana

Die Daten des Wemos sollen in Intervallen in einer influxdb gespeichert werden. Später erfolgt die Visualisierung im Grafana.

Zunächst die Datenbank anlegen

create database wemosdb with duration 30d

create user wemos with password ‚<password>‘

grant all on „wemosdb“ to „wemos“

Der Code für den Wemos sieht wie folgt aus:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

#include "DHT.h"

#define DHTTYPE DHT22   

// Zugangsdaten zum WLAN:
const char* ssid = "<name des WLAN>";
const char* password = "<Kennwort des WLAN>";




WiFiClient wclient;
uint8_t DHTPin = 4; 
               
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);                

float Temperature;
float Humidity;
 
void setup() {
  Serial.begin(115200);
  delay(100);
  
  pinMode(DHTPin, INPUT);

  dht.begin();              

  Serial.println("Connecting to ");
  Serial.println(ssid);

  //mit dem WLAN verbinden
  WiFi.begin(ssid, password);

  //ist die WLAN Verbindung vorhanden
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());



}
void loop() {
  Serial.print("Temperature: ");
  Serial.println(Temperature);
  Serial.print("Humidity: ");
  Serial.println(Humidity);

  HTTPClient http;
  Temperature = dht.readTemperature(); // Temperatur auslesen 
  Humidity = dht.readHumidity(); // Feuchtigkeit auslesen
  String influxData = "werte,zimmer=<Name des Zimmers> temperatur=" + String(Temperature) + ",feuchtigkeit=" + String(Humidity) + "";
  String  url = "http://<IP Adresse der Influxdb>:8086/api/v2/write?bucket=wemosdb";
  http.begin(wclient, url);
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  http.setAuthorization("wemos", "<Kennwort des WEMOS Benutzers>");
  int httpCode = http.POST(influxData);
  http.writeToStream(&Serial);

  http.end();
  
  ESP.deepSleep(600000000);
  
}

Im grafana muss die InfluxDB zunächst als Quelle hinzugefügt werden, im Anschluss ist es möglich die Daten auszugeben.