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

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

Beitrag von darki86 »

Danke für deinen schnellen vorschlag, kam heute nacht erst dazu, das mal auszuprobieren.

Code: Alles auswählen

myDimmer.sendCommand((myDimmer.state as Number) if (bDimmDir) + 10 else - 10) //Dimmer auf neuen Wert setzen
Diese Zeile scheint irgendwie probleme zu machen.

Hab das so umgebaut:

Code: Alles auswählen

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

// Wohnzimmer_Taster_Tuer: ein TasterItem
// Wohnzimmer_Licht_Couch: ein DimmerItem

rule "relatives dimmen"
when
    Item Wohnzimmer_Taster_Tuer 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
            Wohnzimmer_Licht_Couch.sendCommand(Wohnzimmer_Licht_Couch.state as Number)                                  //Dimmer auf neuen Wert setzen
            if(bDimmDir == true) (Wohnzimmer_Licht_Couch.state as Number) + 10 
            else (Wohnzimmer_Licht_Couch.state as Number) - 10
            if((Wohnzimmer_Licht_Couch.state as Number) == 100) bDimmDir = false                                        //oben angekommen, Richtung nach unten
            if((Wohnzimmer_Licht_Couch.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
            Wohnzimmer_Licht_Couch.sendCommand(if((Wohnzimmer_Licht_Couch.state as Number) == 0) ON else OFF)           //schalte den Dimmer um
        else
            bDimm = false                                                                                               //Variable reinitialisieren
    }
end
Aber irgendwas scheint noch nicht zu funktionieren.


So sah übrigens mein Code auf dem ESP direkt aus. Hat einwandfrei funktioniert. Bei jedem erneutem gedrückt halten hat der auch die Richtung geändert. Hab ich auch lang dran gesessen. Aber im openHAB ist die Sprache echt schwer für mich zu raffen...
Arbeitet openHAB eigentlich jede rule gleichzeitig ab? Oder hintereinander? Kann da auch mit z.B. einer "while" schleife das komplette Programm hängen bleiben?

Code: Alles auswählen

//Taster gedrückt halten
  if (millis()-Taster_Millis >= 500 && Taster_Zustand == 1) {
    Dimmung_Aktiv = 1;
    Umschalten = 1;
    Dim_Richtung = !Dim_Richtung;
    while (Taster_Zustand == 1) {
      if (Taster_Eingabe.update()) {
        if (Taster_Eingabe.fell()) {
          Taster_Zustand = 0;
        }
      }
      if (Dim_Richtung == 1) {
        Dimmstufe = Dimmstufe + 1;
        delay(1);
        if (Dimmstufe >= 870) {
          Dim_Richtung = 0;
        }
      }
      if (Dim_Richtung == 0) {
        Dimmstufe = Dimmstufe - 1;
        delay(1);
        if (Dimmstufe <= 600) {
          Dim_Richtung = 1;
        }
      }
    }

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, ich hab ein + vergessen - es mus so aussehen:

Code: Alles auswählen

myDimmer.sendCommand((myDimmer.state as Number) + if (bDimmDir)   10 else -10)
                     //      da hat's gefehlt --^               ^-- da war's zu viel
ansonsten könnte man es natürlich auch so machen:

Code: Alles auswählen

if(bDimmmDir)
    myDimmer.sendCommand((myDimmer.state as Number) + 10)
else
    myDimmer.sendCommand((myDimmer.state as Number) - 10)
aber man spart ja gerne unnötige Codedoppelungen.

openHAB ist asynchron designed, jede Rule wird grundsätzlich konkurrierend ausgeführt. Default hat openHAB 5 Threads für Rules definiert, es werden also bis zu 5 Rules "gleichzeitig" abgearbeitet. Schleifen (insbesondere solche, die Zeit brauchen) sollte man, wenn möglich, vermeiden.
Falls es wichtig ist, dass eine Rule exklusiv läuft, muss man sich mit einem lock() behelfen.

Die Rules werden in einer DSL geschrieben, welche auf XText und XTend aufsetzt. Vieles ist sehr ähnlich wie in Java gelöst, und es gibt auch einige Libraries, die als Import zur Verfügung stehen. Die DSL ist eher behäbig, was aber im zu erwartenden Umfeld normalerweise keine Einschränkung ist. Weil ich in der Rule einen Fehler hatte, habe ich mal unfreiwillig ausprobiert, was geht, und die betroffene Rule wurde ca. 20 Mal pro Sekunde ausgeführt und geloggt, wobei das Logfile innerhalb eines knappen Tages auf 1GByte anschwoll - unbemerkt, der Rest des Systems lief augenscheinlich normal weiter, höchstens führte sich openHAB ein wenig träge an.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten