DIY: Smarte Verdunkelung - MQTT - Teil 4

Nachdem im letzten Teil das Projekt um einen Webserver, über welchen die Einstellung der Uhrzeiten und die grundlegende Steuerung des Rollos vorgenommen werden kann, erweitert wurde, soll in diesem Teil noch eine MQTT Schnittstelle hinzugefügt werden um die Verdunkelung auch in Smart Home Systeme wie Homeassistant einbinden zu können.

MQTT

Für die Verwendung von MQTT wird ein MQTT-Broker benötigt. Diesen können Sie zum Beispiel auf einem Raspberry PI installieren, hier empfiehlt sich der Mosquito Broker, welcher ein OpenSource Projekt ist.
Alle nötigen Informationen zur Installation und Einrichtung finden Sie im GitHub Repository. In einigen Smart-Home Betriebssystemen, wie in Homeassistant, kann dieser direkt installiert werden.

 

In diesem Blogbeitrag wird insbesondere auf das Homeassistant Betriebssystem eingegangen. In bisherigen Artikeln wurde aber auch das Smart Home System OpenHab thematisiert.
Um das Rollo hier hinzuzufügen, können Sie die Anleitung aus der Blogserie Heimautomatisierung mit OpenHab von Jörn Weise verwenden, in welcher die MQTT Grundlagen erklärt werden.

Mikrocontroller

Auf Client Seite benötigen Sie die PubSubClient Bibliothek. Diese können Sie über den folgenden Link von GitHub als .zip heruntergeladen und in der Arduino IDE unter
Sketch > include Library > Add .zip Library …

 

ausgewählt und installiert werden.

 

Alternativ können Sie die PubSubClient Library auch über die integrierte Bibliotheksverwaltung installieren.

 

1 Grundlegende Steuerung über MQTT

Für die Steuerung über MQTT werden die zwei folgenden Methoden benötigt:

void MQTTcallback(char* topic, byte* payload, unsigned int length) {
 
String message;
 
for (unsigned int i = 0; i < length; i++) {
    message += (
char)payload[i];
  }

 
/*Serial.print("Topic empfangen: ");
  Serial.println(topic);
  Serial.print("Payload empfangen: ");
  Serial.println(message);*/
 
 
if (String(topic) == "home/rollo/set") {
   
if (message == "up") {
     
Serial.println("UP");
      abrollen(
0);
    }
   
else if (message == "down") {
     
Serial.println("DOWN");
      abrollen(targetPosition);
    }
   
  }
}

void reconnect() {
 
while (!client.connected()) {
   
Serial.print("Verbinden mit MQTT...");
   
if (client.connect("RolloController", mqtt_user, mqtt_password)) {
     
Serial.println("Verbunden");
      client.subscribe(
"home/rollo/set");
    }
else {
     
Serial.print("Fehler, rc=");
     
Serial.print(client.state());
     
Serial.println(" Neuer Versuch in 5 Sekunden");
     
delay(5000);
    }
  }
}

Erklärung:

Die Callback Methode wird aufgerufen, sobald ein neues MQTT Paket empfangen wurde. In dieser Methode wird zuerst aus der payload Zeichenkette ein String gebildet, um diesen dann später vergleichen zu können. Im Anschluss wird das topic überprüft und je nach Befehl die abrollen() Methode mit dem entsprechenden Positionswert aufgerufen.
Sollte es bei der Kommunikation über MQTT zu Problemen kommen, können Sie über die kommentierten Befehle topic und payload am Seriellen Monitor ausgeben lassen.

 

Die reconnect() Methode verbindet sich im Falle eines Verbindungsabbruchs erneut mit dem MQTT Broker. Der Befehl client.subscribe() legt fest, welche topics vom Client verarbeitet werden sollen und die Bibliothek ruft daraufhin dann die Callback Methode auf.

 

Im setup() und loop() befinden sich nur die Konfigurationsbefehle. Der komplette Code kann hier heruntergeladen werden.

 

Nachdem Sie den Code auf den Mikrocontroller geladen haben, müssen Sie das Gerät im Smart-Home-System konfigurieren, sodass eine Steuerung über MQTT möglich ist.

Fügen Sie folgende Zeilen in die config.yaml Datei ein:
      mqtt:

cover:

    - name: "Rollo"

      command_topic: "home/rollo/set"

      state_topic: "home/rollo/status"

     

      payload_open: "up"

      payload_close: "down"

      payload_stop: "stop"

      state_open: "up"

      state_closed: "down”

      optimistic: false

      retain: true

 

Die Datei können Sie entweder über eine SSH Verbindung und dem Commandline-Datei Editor bearbeiten oder über ein Plugin wie das Studio Code Server Plugin.

 

Erklärung:

Mit den Attributen command_topic und state_topic werden die MQTT topics definiert, über welche die Verdunkelung gesteuert, beziehungsweise der Status an Homassistant zurückgegeben wird.
Die payload Parameter definieren, was für eine payload beim drücken der jeweiligen Tasten gesendet wird, und die state Parameter ordnen der Status-payload den Zustand des Rollos,  und somit die Anzeige der Steuerung, zu.

 

Abbildung 1: Steuerung über Pfeiltasten in Homeassistant

Bisher ist es nur möglich, die Verdunkelung zu öffnen beziehungsweise zu schließen. Durch folgende Anpassungen kann die Position des Rollos genau über einen Schieberegler eingestellt werden.

 

Im Mikrocontroller Programm sind hierfür einige Anpassungen notwendig.

In der Callback Methode wurde noch eine überprüfung des Positions-topic eingefügt:

else if (String(topic) == "home/rollo/set_position") {
   
   
int targetPercent = message.toInt();
    targetPercent =
constrain(targetPercent, 0, 100);
   
long targetSteps = map(targetPercent, 100, 0, 0, targetPosition);

   
Serial.println(targetPercent);

   
char buf[8];
    sprintf(buf,
"%d", targetPercent);
    client.publish(
"home/rollo/position", buf, true);
   
Serial.println("Callback;Published:");
   
Serial.println(buf);

   
if(targetPercent == 0) {
      client.publish(
"home/rollo/status", "down");
    }
   
else {
      client.publish(
"home/rollo/status", "up");
    }


    abrollen(targetSteps);
  }

Erklärung:

Zu Beginn des Codes wird die Position in ein Integer umgewandelt, um dieses daraufhin in die Anzahl an Motorumdrehungen umzuwandeln. Die Zielposition wird daraufhin an Homeassistant weitergeschickt, damit die Position des Schiebereglers mit der aktuellen Position der Verdunkelung übereinstimmt.
Zum Schluss wird die abrollen() Methode aufgerufen.

 

In der reconnect() Methode wurde nur die subscription für das home/rollo/set_position topic hinzugefügt.

 

In der abrollen Methode, welche bei jeder Ansteuerung aufgerufen wird, wurde außerdem noch das Senden der Positions- und Status-Daten hinzugefügt, um bei der Steuerung über den Taster oder bei Zeitsteuerung den Zustand trotzdem im Smart-Home zu aktualisieren.

Den kompletten Code können Sie hier herunterladen.

 

Die Konfiguration in Homeassistant muss jetzt natürlich auch noch geändert werden.

Fügen Sie folgende Zeilen anstatt der ursprünglichen Konfiguration in die configuration.yaml Datei ein:

cover:

    - name: "Rollo"

      command_topic: "home/rollo/set"

      state_topic: "home/rollo/status"

      position_topic: "home/rollo/position"

      set_position_topic: "home/rollo/set_position"

 

      payload_open: "up"

      payload_close: "down"

      payload_stop: "stop"

      state_open: "up"

      state_closed: "down"

      position_open: 100

      position_closed: 0

      optimistic: false

      retain: true

 

Erklärung:

Hier wurden die topics für die Ziel- und Ist-Position hinzugefügt. Des Weiteren sind äquivalent zur Tastensteuerung die Parameter position_open und postion_close hinzugefügt worden.

 

Abbildung 2: Schieberegler für die Positionssteuerung in Homeassistant

Fazit

In der gesamten Blogreihe wurde ein handelsübliches Verdunkelungsrollo in eine smarte Verdunkelung umgebaut. Diese öffnet und schließt nicht nur zu den eingestellten Uhrzeiten, sondern lässt sich auch über die MQTT Schnittstelle in die meisten Smarthome Systeme, wie zum Beispiel OpenHAB oder Homeassistant integrieren.
Natürlich können Sie das Projekt mit Ihren Ideen erweitern und zum Beispiel weitere Sensoren hinzufügen, um das Schließen der Verdunkelung helligkeitsabhängig zu automatisieren.

 

Viel Spaß beim Nachbauen :)

Esp32Esp8266Projekte für anfängerSmart home

Kommentar hinterlassen

Alle Kommentare werden von einem Moderator vor der Veröffentlichung überprüft

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery