OH3 - ESP32 Rolladensteuerung einbinden

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

DonMarcello
Beiträge: 19
Registriert: 13. Apr 2022 11:15
Answers: 0

OH3 - ESP32 Rolladensteuerung einbinden

Beitrag von DonMarcello »

Hallo zusammen,

ich möchte mit meinem ESP32 meine unidirektionalen Elero Rolläden über OpenHab steuern. Die Schalter des Handsenders gehen direkt auf die GPIOs vom ESP32.

Programmiert ist der ESP32 mit folgendem Code

Code: Alles auswählen

#include <WiFi.h>
#include <Wire.h>
#include <PubSubClient.h>
#include <String.h>

#define LED1 2

const char* ssid = "XXXXXXX";
const char* password = "XXXXXXX";

const char* MQTT_HOST = "XXX.X.X.XXX";
const char* MQTT_USER = "XXXXXXXXX";
const char* MQTT_PWD = "XXXXXXX";
const int MQTT_PORT = 1883;

const char* MQTT_CLIENT_ID = "XXXXXXXX_9132_Rollo";

const char* MQTT_Topic = "/XXXXXXX/Rollo/#";
const char*  MQTT_Topic_Alle = "/XXXXXXX/Rollo/Alle/set";
const char*  MQTT_Topic_Christoph_Tuer = "/XXXXXXXX/Rollo/Christoph_Tuer/set";
const char*  MQTT_Topic_Christoph_Fenster = "/XXXXXXX/Rollo/Christoph_Fenster/set";
const char*  MQTT_Topic_Isabella_Tuer = "/XXXXXXX/Rollo/Isabella_Tuer/set";
const char*  MQTT_Topic_Isabella_Fenster = "/XXXXXX/Rollo/Isabella_Fenster/set";
const char*  MQTT_Topic_Buero_Fenster = "/XXXXXXXX/Rollo/Buero_Fenster/set";

const int upPin =  22;           // D2
const int stopPin =  19;         // D3
const int downPin =  18;         // D4


WiFiClient net;
PubSubClient client(net);

void setup()
{
  Serial.begin(115200);
  WIFI_connect();
  client.setServer(MQTT_HOST, MQTT_PORT);
  client.setCallback(MQTT_callback);

  pinMode(LED1, OUTPUT);
  pinMode(upPin, OUTPUT);
  pinMode(stopPin, OUTPUT);
  pinMode(downPin, OUTPUT);

  digitalWrite(LED1, HIGH);
  digitalWrite(upPin, HIGH);
  digitalWrite(stopPin, HIGH);
  digitalWrite(downPin, HIGH);

}

void loop() {

  if (!client.connected()) {
    MQTT_connect();
  }
  client.loop();

}

void pressUp()
{
  Serial.print("Do Keypress UP...");
  digitalWrite(upPin, HIGH);
  delay(50);   
  digitalWrite(upPin, LOW);
  delay(300);   
  digitalWrite(upPin, HIGH);
  Serial.println("...done!"); 
}

void pressStop()
{
  Serial.print("Do Keypress Stop...");
  digitalWrite(stopPin, HIGH);
  delay(50);   
  digitalWrite(stopPin, LOW);
  delay(300);   
  digitalWrite(stopPin, HIGH);
  Serial.println("...done!"); 
}

void pressDown()
{
  Serial.print("Do Keypress Down...");
  digitalWrite(downPin, HIGH);
  delay(50);   
  digitalWrite(downPin, LOW);
  delay(300);   
  digitalWrite(downPin, HIGH);
  Serial.println("...done!"); 
}

void pressChannel()
{
  Serial.print("Do Keypress Channel...");
  digitalWrite(selPin, HIGH);
  delay(50);     
  digitalWrite(selPin, LOW);
  delay(300);   
  digitalWrite(selPin, HIGH);
  Serial.println("...done!"); 
}

void WIFI_connect(void) {

    delay(10);

    // We start by connecting to a WiFi network

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

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}

void MQTT_connect(void) {
  int retry = 0;
   
  // FIRE UP MQTT
  // Loop until we're reconnected
  while (!client.connected() && (retry < 5)) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PWD)) {
      Serial.println("connected");
      client.subscribe(MQTT_Topic);     
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 60 seconds before retrying
      delay(10000);
    }
    retry=retry+1;
  }
}

void MQTT_Publish(const char* topic, float value)
{
  char payload[8];


  // build up MQTT Connection
  if (!client.connected()) {
    MQTT_connect();
  }
  client.loop();

  if(value != -100)
  {
    dtostrf (value, -6,2, payload); 
    client.publish(topic, payload);
    Serial.print(topic);
    Serial.print("\t\t");
    Serial.println(value); 
  }
  else
  {
    Serial.print(topic);
    Serial.print("\t\t");
    Serial.println("invalid value; stopped publishing"); 
  }
}

void MQTT_callback(char* topic, byte* payload, unsigned int length)
{
  char msg[length];
  String strTopic(topic);

  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.println("] ");

  for (int i = 0; i < length; i++) {
    msg[i] = (char)payload[i];
  }

   
  if(msg[0] == 'U') pressUp(); 
  if(msg[0] == 'S') pressStop(); 
  if(msg[0] == 'D') pressDown();   

}
Meine Frage ist, wie ich die einzelnen Rollos mit den Schaltfunktionen Up, down, Stop als MQTT Befehle nun in OpenHab integriere. Mir ist zum Beispiel noch nicht ganz klar, wie ich die Items/Things so konfiguriere, dass sie die entsprechenden Commands im Model senden.

Ich hoffe ihr könnt mir hier ein wenig auf die Sprünge helfen.

Danke im Voraus!

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: OH3 - ESP32 Rolladensteuerung einbinden

Beitrag von Steinspiel »

Moin,
DonMarcello hat geschrieben: 14. Apr 2022 21:44 Meine Frage ist, wie ich die einzelnen Rollos mit den Schaltfunktionen Up, down, Stop als MQTT Befehle nun in OpenHab integriere.
Du willst Up, down, Stop von OH per MQTT an den ESP32 senden das dieser dann die Rollos steuert?
bis dann, Steinspiel

DonMarcello
Beiträge: 19
Registriert: 13. Apr 2022 11:15
Answers: 0

Re: OH3 - ESP32 Rolladensteuerung einbinden

Beitrag von DonMarcello »

Ja genau

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: OH3 - ESP32 Rolladensteuerung einbinden

Beitrag von Steinspiel »

DonMarcello hat geschrieben: 14. Apr 2022 22:05Ja genau
Moin,

Das können andere sicherlich eleganter, aber was mir so auf die Schnelle einfällt:
Für Up und Down erstellst Du Dir in OH einen Switch "rollo_christoph_fenster". Geht der Schalter auf ON fährt das Rollo hoch, auf OFF wieder runter.

Die Rule fürs hochfahren:

Code: Alles auswählen

rule "MQTT_Rollo_hoch"
when
    Item rollo_christoph_fenster changed to ON
then
    val mqttActions = getActions("mqtt", "mqtt:broker:mosquitto_xxx")
     mqttActions.publishMQTT("Rollo/Christoph_Fenster/set", "up")
end
Die Rule sendet dann an den MQTT Broker "mosquitto_xxx" (Name anpassen!) auf dem Topic "Rollo/Christoph_Fenster/set" den Befehlt "up".
Wenn Du in Deinem ESP32 Sketch den Topic subscribst, empfängt er dieses "up" und Du musst dann "nur" noch "up" an die passenden GPIO`s weiterreichen... Gleiches gilt für down. Und für Stop müsste man dann einen extra Schalter anlegen...
bis dann, Steinspiel

DonMarcello
Beiträge: 19
Registriert: 13. Apr 2022 11:15
Answers: 0

Re: OH3 - ESP32 Rolladensteuerung einbinden

Beitrag von DonMarcello »

Hallo Steinspiel,

erstmal vielen Dank für deine Antwort und für deine Unterstützung!

Ich habe es nun etwas anders und über die GUI gelöst. Als Channeltyp gibt es Rollershutter. Dort kann ich dann über die Advanced Options das MQTT-Topic und die Befehle für Up,Down,Stop hinterlegen. Hat wunderbar funktioniert.

Mit dem passenden Widget konnte ich das ganze dann auch in die Visu einbinden. Klappt hervorragend.

Interessant wäre noch, wie ich in dem Footer von einem Widget nun noch den aktuellen Status bzw. den zuletzt erhaltenen Befehl des Topics angezeigt bekomme. Quasi so:

Bild

Kennst du da vielleicht noch eine gute Möglichkeit?

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: OH3 - ESP32 Rolladensteuerung einbinden

Beitrag von Steinspiel »

Moin,
DonMarcello hat geschrieben: 15. Apr 2022 11:17 Ich habe es nun etwas anders und über die GUI gelöst.
Na, besser geht es wohl nicht! IMO Superlösung...
Das neue openHAB hat schon was! ;)
Kennst du da vielleicht noch eine gute Möglichkeit?
Tut mir leid, fällt mir auch nichts ein.

schönes Osterfest...
bis dann, Steinspiel

Benutzeravatar
udo1toni
Beiträge: 15244
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: OH3 - ESP32 Rolladensteuerung einbinden

Beitrag von udo1toni »

Ein Status kommt eigentlich immer vom Gerät. Du müsstest also Dein Programm auf dem ESP dahingehend ergänzen, dass es mindestens den zuletzt gesendeten Befehl in einen Zahlenwert umsetzt und seinerseits in ein anderes Topic schreibt. Die obere Endlage entspricht dabei dem Wert 0, die untere Endlage entspricht dem Wert 100. Du kannst es auch beliebig komplex gestalten, also z.B. die Zeit von Go bis Stopp messen und daraus schließen, ob der Laden teilweise geöffnet ist (und einen entsprechenden Prozentwert senden, halt von 0 -= offen bis 100 = geschlossen). Wenn man das korrekt umsetzt, wird sogar das Icon vom Rollladen passend angezeigt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

DonMarcello
Beiträge: 19
Registriert: 13. Apr 2022 11:15
Answers: 0

Re: OH3 - ESP32 Rolladensteuerung einbinden

Beitrag von DonMarcello »

Hallo udo1toni,

vielen, Dank. Das ist mir bekannt. Ich versuche meine Frage nochmal genauer zu stellen:

Der Rolladen published seinen Status nun ordnungsgemäß ans OpenHab. Wie kriege ich diesen Wert dann in den Footer geschrieben? :)

Benutzeravatar
udo1toni
Beiträge: 15244
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: OH3 - ESP32 Rolladensteuerung einbinden

Beitrag von udo1toni »

Was ist denn bitte der Footer?
Den Status lässt Du einfach anzeigen, indem Du das Item entsprechend verlinkst.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

DonMarcello
Beiträge: 19
Registriert: 13. Apr 2022 11:15
Answers: 0

Re: OH3 - ESP32 Rolladensteuerung einbinden

Beitrag von DonMarcello »

Der Footer ist die Fußzeile eines Widgets (s. Beitrag #5 von mir)
Dort wo steht "Hier soll der aktuelle Status stehen"

Ich könnte den Status natürlich in ein anderes Widget schreiben, dann wären aber beide Komponenten nicht zusammenhängend was optisch nicht so schön aussieht.

Antworten