Wohnungsautomatisierung, so günstig wie möglich (Echo, ESP8266, MQTT, Harmony)

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

darki86
Beiträge: 6
Registriert: 28. Apr 2018 14:56

Wohnungsautomatisierung, so günstig wie möglich (Echo, ESP8266, MQTT, Harmony)

Beitrag von darki86 »

Zu mir:
Hallo zusammen, ich möchte mich kurz vorstellen. Heiße David 31 Jahre alt, bin seid 13 Jahren Elektriker in der Industrie. Komme aus dem Sauerland und habe in der Firma zu viel zeit zum basteln. Habe in den letzten Wochen angefangen mich mit der Arduino Platform an das Programmieren von Mikrokontrollern zu wagen. Ein Arbeitskollege hat mit dem Arduino rumgespielt, der nächste dann mit den WS2812b Stripes und so ging es dann immer weiter.

Zum Projekt:
Durch die schier unendlichen Möglichkeiten mit den Mikrokontrollern sind mir die schon immer gewünschten Ideen mit Smarthome realisiebar geworden.
Aktuelle Planung sieht wie folgt aus:

- Alle gewünschten Sensoren und Aktoren (Taster, Lampen, Heizungsthermostate), die ich automatisieren möchte, mit einem ESP, oder anderen Kabellosen Systemen ausstatten
- Diese über MQTT in openHAB einbinden
- Echo sowie Harmony werden auch eingebunden[/list]

Da ich null ahnung von Hochsprachen und Microkontrollern hatte, hab ich die ersten Wochen damit verbracht, die Programiersprache zu lernen. Ich hab es bis jetzt hinbekommen, den ESP mit W-Lan und MQTT zu verbinden. Dazu hab ich Triac Modul als Dimmer eingebunden. Wie genug ich das umgesetzt habe, kann ich gern posten. Zeit dafür habe ich genug. Auch die WS8212 LEDs per ESP über MQTT zu steuern klappt einwandfrei.

Was mir fehlt:
Wie man Items in openHAB einbindet und wie man eine einfache Sitemap erstellt, ist mir bereits bekannt. Nur mit den Regeln tuh ich mich aktuell sehr schwer. Insgesammt ist die komplette konfiguration von openHAB sehr verwirrend für mich. Die Syntax scheint nicht so eindeutig zu sein, wie es z.B. bei den Programmen in C ist. Ich bräuchte vielleicht hier und da ein Beispiel, wie es etwas richtig schreibe. Die Grundsätzliche Logik und das Programmieren sollte aktuell nicht das größte Problem darstellen.

Aktuelle Problematik
- MQTT Binding ist installiert und funktioniert, sobald ich in der Sitemap MQTT Items schalte kommt beim MQTT auch was an
- MQTT Action ist auch installiert, konfigurieren muss ich da wohl nichts
- Folgendes soll aktuell passieren:
Ich drücke in der Sitemap einen Switch, dann soll das "ON" beim ESP ankommen, dieser antwortet mit "ON" als rückfrage, ob die Nachricht angekommen ist. Das angekommene "ON" möchte ich in einer Rule auswerten und damit dann in der Sitemap den aktuellen Zustand darstellen.

Dazu hab ich ein ankommendes und ein sendendes Item und eins für den Status in der Sitemap definiert:

Code: Alles auswählen

/*Sitemap Items*/
Switch WZ_Co_De "Deckenlampe über der Couch" <lightbulb>

/*MQTT Items*/
Switch MQTT_WZ_Co_De_Em "Deckenlampe über der Couch im Wohnzimmer" {mqtt=">[mosquitto:openHAB/WZ/Couch/Deckenlampe:command:*:default]"}
String MQTT_WZ_Co_De_Se "Deckenlampe über der Couch im Wohnzimmer" {mqtt="<[mosquitto:openHAB/WZ/Couch/Deckenlampe:command:*:default]"}
Kann mir jemand eine Beispiel Rule schreiben?

hr3
Beiträge: 210
Registriert: 23. Mai 2017 21:41

Re: Wohnungsautomatisierung, so günstig wie möglich (Echo, ESP8266, MQTT, Harmony)

Beitrag von hr3 »

Ich verstehe noch nicht ganz dein Problem und was du wirklich erreichen möchtest.
Um per MQTT einen Switch zu schalten und den Zustand in der Sitemap darzustellen, brauchst du nur ein Item mit einer In- und einer Outbound-Definition.
Oder möchtest du, die Möglichkeiten von MQTT, Items, Sitemaps und Rules anhand dieses Beispiels ausloten?
Inwieweit funktioniert die Kommunikation mit den ESP?
MQTT-Action brauchst du hierfür erst einmal auch nicht.

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

Re: Wohnungsautomatisierung, so günstig wie möglich (Echo, ESP8266, MQTT, Harmony)

Beitrag von udo1toni »

Der wichtige Trick dabei ist, dass die Rückmeldung auch korrekt abgebildet wird. Dazu in openHAB das Item so anlegen:

Code: Alles auswählen

Switch MQTT_WZ_Co_De "Deckenlampe über der Couch im Wohnzimmer" {mqtt=">[mosquitto:openHAB/WZ/Couch/Deckenlampe:command:*:default],<[mosquitto:openHAB/WZ/Couch/Deckenlampe:state:REGEX((.*))]",autoupdate="false"}
Wobei es sinnvoll wäre, auf mqtt-Seite zwei unterschiedliche Topics zu definieren, also z.B. openHAB/WZ/Couch/Deckenlampe/command und openHAB/WZ/Couch/Deckenlampe/state. Auf dem einen Topic nimmt die Lampe die Befehle entgegen, auf dem anderen Topic meldet sie ihren aktuellen Status.
Im Link-Teil der Itemdefinition ist hinten noch ein autoupdate="false" angehängt. Das führt dazu, dass openHAB den Status des Items nicht mit dem gesendeten Befehl aktualisiert. Damit kannst Du dann in einer Sitemap das Item als Schalter verwenden, und der aktuelle Zustand wird über das selbe Widget abgebildet. Das Icon des Widgets sollte sich also nur ändern, wenn die Lampe auch rückmeldet, dass sie geschaltet wurde.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

darki86
Beiträge: 6
Registriert: 28. Apr 2018 14:56

Re: Wohnungsautomatisierung, so günstig wie möglich (Echo, ESP8266, MQTT, Harmony)

Beitrag von darki86 »

hr3 hat geschrieben: 1. Mai 2018 07:59 Ich verstehe noch nicht ganz dein Problem und was du wirklich erreichen möchtest.
Um per MQTT einen Switch zu schalten und den Zustand in der Sitemap darzustellen, brauchst du nur ein Item mit einer In- und einer Outbound-Definition.
Oder möchtest du, die Möglichkeiten von MQTT, Items, Sitemaps und Rules anhand dieses Beispiels ausloten?
Inwieweit funktioniert die Kommunikation mit den ESP?
MQTT-Action brauchst du hierfür erst einmal auch nicht.
Genau! Ich erwarte nicht, das mir der ganze Code geschrieben wird, brauche nur jemand, der mich in die richtige Richtung schubst. Die Erfahrung beim Arduino/ESP hat mir gezeigt, dass ich viel Zeit sparen kann, wenn man es einfach richtig macht :shock: Wenn man also schonmal den Aufbau und die Syntax verstanden und verinnerlicht hat.
Über die Sitemap das MQTT Item schalten funktionierte schonmal. Aber die Überwachung des State wollte ich mit einer Regel machen. Also das Item sendet den State zurück.
udo1toni hat geschrieben: 1. Mai 2018 11:58 Der wichtige Trick dabei ist, dass die Rückmeldung auch korrekt abgebildet wird. Dazu in openHAB das Item so anlegen:

Code: Alles auswählen

Switch MQTT_WZ_Co_De "Deckenlampe über der Couch im Wohnzimmer" {mqtt=">[mosquitto:openHAB/WZ/Couch/Deckenlampe:command:*:default],<[mosquitto:openHAB/WZ/Couch/Deckenlampe:state:REGEX((.*))]",autoupdate="false"}
Wobei es sinnvoll wäre, auf mqtt-Seite zwei unterschiedliche Topics zu definieren, also z.B. openHAB/WZ/Couch/Deckenlampe/command und openHAB/WZ/Couch/Deckenlampe/state. Auf dem einen Topic nimmt die Lampe die Befehle entgegen, auf dem anderen Topic meldet sie ihren aktuellen Status.
Im Link-Teil der Itemdefinition ist hinten noch ein autoupdate="false" angehängt. Das führt dazu, dass openHAB den Status des Items nicht mit dem gesendeten Befehl aktualisiert. Damit kannst Du dann in einer Sitemap das Item als Schalter verwenden, und der aktuelle Zustand wird über das selbe Widget abgebildet. Das Icon des Widgets sollte sich also nur ändern, wenn die Lampe auch rückmeldet, dass sie geschaltet wurde.
Ok, mit 2 verschiedenen Topics ist kein Problem. In dem ESP Code kann ich ja alles nach belieben verschicken.

Dann das Item für die Lampe also so:

Code: Alles auswählen

Switch MQTT_WZ_Co_De "Deckenlampe über der Couch im Wohnzimmer" {mqtt=">[mosquitto:openHAB/WZ/Couch/Deckenlampe7command:command:*:default],<[mosquitto:openHAB/WZ/Couch/Deckenlampe/state:state:REGEX((.*))]",autoupdate="false"}
Was erwartet openHAB nun als antwort? Auch einfach "ON" und "OFF"?

Jetzt möchte ich diese Lampe über einen zweiten ESP, der an einem Taster hängt, ein und aus schalten.

Code: Alles auswählen

Switch MQTT_WZ_Tu_Ta "Taster bei der Tür im Wohnzimmer" {mqtt="<[mosquitto:openHAB/WZ/Tuer/Taster/state:REGEX((.*))
Das REGEX((.*)) habe ich jetzt von deinem Beispiel übernommen, muss ich das noch anpassen? Kannst du kurz in einem Satz erklären was es genau macht? Was REGEX macht, hab ich glaube ich halbwegs verstanden. Was genau macht es in diesem Beispiel?

Wie würde jetzt die Regel aussehen, um die Lampe zu schalten?

Code: Alles auswählen

rule "Deckenlampe Wohnzimmer schalten"
when 
	Item MQTT_WZ_Tu_Ta recieved update ON
then
	MQTT_WZ_Co_De.sendCommand(ON)
end
Hatte schon sorge, dass mir keiner Antwortet, da es einem oft vorkommt, als müsste man ein Informatik Studium hinter sich haben, um überhaupt mit sowas anfangen zu dürfen. Ich hoffe ihr gebt mich nicht auf ;)

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

Re: Wohnungsautomatisierung, so günstig wie möglich (Echo, ESP8266, MQTT, Harmony)

Beitrag von udo1toni »

Was erwartet openHAB nun als antwort? Auch einfach "ON" und "OFF"?
Das hängt mit
Das REGEX((.*)) habe ich jetzt von deinem Beispiel übernommen, muss ich das noch anpassen? Kannst du kurz in einem Satz erklären was es genau macht? Was REGEX macht, hab ich glaube ich halbwegs verstanden. Was genau macht es in diesem Beispiel?
zusammen.
Auf der Empfangsseite muss eine Transformation angegeben werden.

REGEX ist so eine Transformation, als Regel wird eine REGular EXpression verwendet. In openHAB ist eine relativ simple RegEx-Auswertung enthalten, die aber trotzdem mächtig sein kann. Dein ESP könnte zum Beispiel auch "Mein Status ist ON bis sich das ändert!" zurückliefern. Switch Items können aber nur ON oder OFF sein. Dann wäre die passende Expression: REGEX(.*ist (.*) bis.*) Die Expression matcht auf einen beliebigen String, in dem die Zeichenfolge "ist " und danach die Zeichenfolge " bis" vorkommen. Der Witz ist aber, dass als Ergebnis ausschließlich der Teil zurückgeliefert wird, der in der ersten Gruppe steht (eine Gruppe wird mit Klammern gekennzeichnet). Das heißt, es wird alles bis einschließlich "ist " und alles nach einschließlich " bis" verworfen und nur die dazwischen liegende Zeichenfolge (also ON oder OFF) zurückgeliefert.

Code: Alles auswählen

REGEX((.*))
bedeutet: Nimm einfach die komplette Antwort genau so, wie sie kommt. Der ESP sollte also ON und OFF als Status schicken.

Wenn das Item so definiert ist, brauchst Du überhaupt keine Rule, um das Licht zu schalten, Du schaltest direkt das Item und der Aktor folgt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

darki86
Beiträge: 6
Registriert: 28. Apr 2018 14:56

Re: Wohnungsautomatisierung, so günstig wie möglich (Echo, ESP8266, MQTT, Harmony)

Beitrag von darki86 »

Super erklärt!

Ich hatte schon verstanden, dass das Item auf eine Antwort wartet, bevor der Status auch in der Sitemap sich ändert.
Ich war schon einen Schritt weiter. Wollte die Lampe nun extern über einen Taster, der ein MQTT Befehl sendet, ein und aus schalten.

Bei dem Taster brauche ich die Transformation also auch, ja? Da der ja nur Senden wird. Dort werde ich auch ON und OFF als Befehle senden.

Würde meine Rule so funktionieren?

Ich kann es erst am Freitag wieder testen, bin aber schon mächtig gespannt. Ich werde die Sachen wohl nach Hause nehmen und dann dort per VPN arbeiten, so etwas kann ich dann direkt testen.
Danke schonmal !!

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

Re: Wohnungsautomatisierung, so günstig wie möglich (Echo, ESP8266, MQTT, Harmony)

Beitrag von udo1toni »

Ah, das erklärt es.

Grundsätzlich sollte die Rule so funktionieren. Falls der Taster auch zum Ausschalten verwendet werden soll, kannst Du die Rule etwas allgemeiner fassen:

Code: Alles auswählen

rule "Deckenlampe Wohnzimmer schalten"
when 
    Item MQTT_WZ_Tu_Ta received update
then
    if (MQTT_WZ_Tu_Ta.state == ON)
        MQTT_WZ_Co_De.sendCommand(ON)
    else if (MQTT_WZ_Tu_Ta.state == OFF)
        MQTT_WZ_Co_De.sendCommand(OFF)
end
Oder Du verzichtest gänzlich auf eine Überprüfung des Status:

Code: Alles auswählen

rule "Deckenlampe Wohnzimmer schalten"
when 
    Item MQTT_WZ_Tu_Ta received update
then
    MQTT_WZ_Co_De.sendCommand(MQTT_WZ_Tu_Ta.state)
end
Achtung! Du hast in Deiner Rule als Trigger recieved statt received geschrieben...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

darki86
Beiträge: 6
Registriert: 28. Apr 2018 14:56

Re: Wohnungsautomatisierung, so günstig wie möglich (Echo, ESP8266, MQTT, Harmony)

Beitrag von darki86 »

@udo1toni

Bester Mann.
Hab das jetzt durch getestet.
Kann jetzt per Alexa schalten, state kommt zurück, sitemap wird dann aktualisiert.
Einfach nur gut!

Heute Nacht schick ich Mal die Umsetzung. Auch den Arduino/Esp code, falls jemand das gebrauchen kann.

Dimmen und schalten für nicht einmal 10€.
Als nächstes probier ich das ganze am WS2812 Stripe aus. Mal sehen wie ich am effektivsten Programme für den Stripe per Alexa schalten kann.
Wahrscheinlich nur indem ich für jedes Programm ein MQTT Item anlege und diese dann auch "on" und "Off" schalte.

darki86
Beiträge: 6
Registriert: 28. Apr 2018 14:56

Re: Wohnungsautomatisierung, so günstig wie möglich (Echo, ESP8266, MQTT, Harmony)

Beitrag von darki86 »

Hi, ich hab das ein neues Problem. Folgendes möchte ich nun machen:

Am ESP hängt ein Taster. Wird der Taster betätigt sendet der ESP state "ON". Wird er losgelassen dann state "OFF".
Drückt man den Taster kürzer als 500ms, ist also der State "ON" des Tasters kürzer als 500ms, dann soll "ON" zu einer Command geschickt werden.

Wird der jedoch länger als 500ms gedrückt, also praktisch gehalten, so sollen folgende Commands im 100ms takt gesendet werden:
0, 10, 20, usw bis 100 dann wieder runter 90, 80, 70 und bei 0 wieder hoch.

Das wird irgendwie mittels Cron gemacht. Warum kann ich openHAB nicht einfach in "C" programmieren :?

Vielen dank für eure Hilfe!

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

Re: Wohnungsautomatisierung, so günstig wie möglich (Echo, ESP8266, MQTT, Harmony)

Beitrag von udo1toni »

Nein, cron ist dafür nicht gut geeignet. Stattdessen verwendest Du in der Rule einen Timer.

Die folgende Rule ist reine Theorie :)

Code: Alles auswählen

var Timer tDimm = null                                                                    //der Timer
var Boolean bDimmDir = true                                                               //Dimmrichtung
var Boolean bDimm = false                                                                 //Dimmen aktiv

// espDimmTaster: ein TasterItem
// myDimmer: ein DimmerItem

rule "relatives dimmen"
when
    Item espDimmTaster received command                                                   //Taster wurde gedrückt oder losgelassen
then
    if (receivedCommand==ON) {                                                            //Taster gedrückt
        if(tDimm !== null) tDimm.cancel                                                   //irgendwas ist schief gegangen, deshalb aktiven Timer canceln
        tDimm = createTimer(now.plusMillis(500), [ |                                      //Timer mit 500mSec starten
            bDimm = true                                                                  //Verzögerung abgelaufen, ab jetzt wird gedimmt
            myDimmer.sendCommand((myDimmer.state as Number) if (bDimmDir) + 10 else - 10) //Dimmer auf neuen Wert setzen
            if((myDimmer.state as Number) == 100) bDimmDir = false                        //oben angekommen, Richtung nach unten
            if((myDimmer.state as Number) == 0) bDimmDir = true                           //unten angekommen, Richtung nach oben
            tDimm.reschedule(now.plusMillis(100))                                         //Timer mit 100mSec neu starten
        ]
        )
    } else {                                                                              //Taster wurde losgelassen
        tDimm.cancel                                                                      //Dimming stoppen
        tDimm = null                                                                      //und gleich Variable reinitialisieren

        // Drei Möglichkeiten, eine davon aktivieren (die dritte wäre dann default, falls nichts ausgewählt wurde):
        // bDimmDir = true                                                                //Dimmen startet immer in Richtung heller
        // bDimmDir = !bDimmDir                                                           //Dimmen kehrt Richtung um
        // bDimmDir = bDimmDir                                                            // bDimmDir nicht ändern -> Dimmrichtung bleibt erhalten

        if(!bDimm)                                                                        //falls Dimmen nicht aktiv war
            myDimmer.sendCommand(if((myDimmer.state as Number) == 0) ON else OFF)         //schalte den Dimmer um
        else
            bDimm = false                                                                 //Variable reinitialisieren
    }
end
Ternäre Operatoren sind in C bekannt, wenn ich mich richtig erinnere (ist eine Weile her, dass ich mich damit beschäftigt habe, ich bin Autodidakt...), die funktionieren jedenfalls in der DSL auch.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten