Seite 1 von 2

Schalter als Trigger für ein Skript

Verfasst: 21. Mär 2023 18:59
von voda
Hallo zusammen,

seit einiger Zeit beschäftige ich mich intensiv mit openHab3. Ist etwas gewöhnungsbedürftig aber naja...

Ich habe als Modell meine Wohnung etwa wie folgt angelegt:

Wohnung >> Obergeschoss >> Badezimmer oben >> Switch Badezimmerregelung. Der Name lautet Regelung_active
Wohnung >> Obergeschoss >> Badezimmer oben >> Regelungsstatus Badezimmer als Point (String). Der Name lautet Regelungsstatus_Badezimmer

Zu meinem Problem:

Gerne möchte ich meine Heizung wie folgt regeln:

Wenn ich den Schalter auf ON schalte, soll eine Regelung aktiv werden, welche ich als JavaScript hinterlege. Wenn der Schalter OFF ist, soll die Heizung aus sein.

Ich bin wie folgt vorgegangen:

RULES >> TRIGGER: Wenn

Code: Alles auswählen

Regelung_active
auf State ON, dann rufe das Script auf.

Als Skript:

Code: Alles auswählen

let ButtonStatus = itemRegisty.getItem("Regelung_active").getState;
events.postUpdate("Regelungsstatus_Badezimmer", "");

if ((itemRegisty.getItem("Regelung_active").getState) == "ON"){
  events.postUpdate("Regelungsstatus_Badezimmer", "Schalter an");
}else{
  event.postUpdate("Regelungsstatus_Badezimmer", "Schalter aus");
}
Es scheint als gibt der Schalter gar kein Befehl aus. Wie kann ich es konfigurieren das der Schalter, wenn ich ihn aktivere ein "ON" ausgibt? Wie kann ich dieses Vorgehen implementieren=

Vielen Dank und Gruß

Re: Schalter als Trigger für ein Skript

Verfasst: 21. Mär 2023 21:54
von int5749
Hmm, warum ein Skript, wenn es eine einfache DSL Rule tut?

Und in Unkenntnis Deiner Items (meine Schneekugel ist verliehen) könnte dies in etwa so aussehen

Code: Alles auswählen

rule "Heizungsregelung"
when
   Item Regelung_active changed
then
	if (Regelung_active.state == ON) {
      postUpdate(Regelungsstatus_Badezimmer,"Schalter an")
   } else {
      postUpdate(Regelungsstatus_Badezimmer,"Schalter aus")
   }
end
Das schaltet keine Heizung, sollte Dir aber den Wert bei "Regelungsstatus_Badezimmer" setzen.

Re: Schalter als Trigger für ein Skript

Verfasst: 21. Mär 2023 22:03
von udo1toni
Ich verstehe nicht so ganz, was Du erreichen willst. Den Zustand des Schalters "Schalter an" "Schalter aus" hast Du ja schon und kannst ihn direkt anzeigen (mit jedem Text, den Du Dir wünschst, ganz ohne Rule und erst recht ohne weiteres Item).

Re: Schalter als Trigger für ein Skript

Verfasst: 22. Mär 2023 06:21
von voda
Hmm, warum ein Skript, wenn es eine einfache DSL Rule tut?

Und in Unkenntnis Deiner Items (meine Schneekugel ist verliehen) könnte dies in etwa so aussehen
Ich hatte mein Beispiel einfach gehalten, am Ende des Tages möchte ich eine Heizung damit steuern.

Mein Gedanke war in etwa so:

Schalter an -> Javascript welche die Heizung steuert
Schalter aus -> Regelung aus

im Prinzip als Pseudocode so:

Code: Alles auswählen

let currentDate = new Date().toLocaleSting;

/*Weitere Variablen und Konstanten*/    

function checkPeriod(currentDate) {
       /*Prüfe hier den Datumsbereich mit currentDate.getDay, month usw...*/
       /* Ausgabe vllt Zustände im welchen Bereich ich mich befinde */
       
 }

if ((Schalter == AN) &&(currentDate()== true))
{
       /*HEIZUNG AN*/
} else {
    
    /*HEIZUNG AUS*/
}

/*Oder Zustandsautomat...*/

Ich möchte das gerne mit JavaScript machen, da der Stil C ähnelt. Ich verstehe aber nicht, wie ich den Trigger konfigurieren soll. Ich hatte mir gedacht:

Triggere auf eine Zustandsänderung, definiere die Zustandsänderung mit AUS, AN und im Code frage ich die beiden Zustände ab. Funktioniert aber nicht.

Ach ja: Ich benutze openHab3 auf eine Debianmaschine (Debian 11) virtualisiert mit Proxmox. Es sind Fritz-Aktoren.

Dankeschön!

Re: Schalter als Trigger für ein Skript

Verfasst: 22. Mär 2023 09:31
von voda
Okay, jetzt funktioniert es. Ich habe den Schalter falsch getriggert.

Re: Schalter als Trigger für ein Skript

Verfasst: 22. Mär 2023 19:56
von udo1toni
voda hat geschrieben: 22. Mär 2023 06:21 Mein Gedanke war in etwa so:

Schalter an -> Javascript welche die Heizung steuert
Schalter aus -> Regelung aus
Nein, so funktioniert das NICHT.

openHAB ist ein eventbasiertes System. Rules - egal, ob nun in JavaScript, DSL, Blockly (ebenfalls JavaScript...) - werden bei einem Event ausgeführt, erledigen ihren Job und sind beendet. Dir schwebt ein Script vor, welches dauerhaft läuft, solange der Schalter auf ON steht, das widerspricht der Arbeitsweise von openHAB.

Ich gehe mal davon aus, dass Du grundsätzlich vier Items hast:
1. HeizungFreigabe (also der Schalter, der die Regelung aktiviert)
2. Solltemperatur
3. Isttemperatur
4. Heizung ON/OFF (die eigentliche Heizung... Solange ON, wird es wärmer, solange OFF wird es nicht wärmer)

Nun reicht eine einfache Rule für die Regelung:

Code: Alles auswählen

rule "Heizung"
when
    Item Isttemperatur   changed or                             // Temperatur geändert
    Item Solltemperatur  changed or                             // Solltemperatur geändert
    Item HeizungFreigabe changed                                // Heizung aktiviert/deaktiviert
then
    var switchSoll = OFF                                        // Sollzustand heizen (Vorgabe OFF
    if(HeizungFreigabe.state == ON) {                           // Falls Heizung aktiviert
        var soll = 20                                           // Vorgabe Solltemperatur
        var ist  = 22                                           // Vorgabe  Isttemperatur
        if(Solltemperatur.state instanceof Number)              // falls gültiger Wert im Item Solltemperatur
            soll = (Solltemperatur.state as Number).floatValue  // setze Solltemperatur auf diesen Wert
        if(Isttemperatur.state  instanceof Number)              // falls gültiger Wert im Item Isttemperatur
            ist  =  (Isttemperatur.state as Number).floatValue  // setze Isttemperatur auf diesen Wert
        if(ist < soll)                                          // falls ist kleiner soll
            switchSoll = ON                                     // ändere  Sollzustand heizen
    }
    if(Heizung.state != switchSoll)                             // Falls Sollzustand heizen von Istzustand abweicht
        Heizung.sendCommand(switchSoll.toString)                // Schaltbefehl senden
end
Wenn Du Dich (sehr gut) in Regelungstechnik auskennst, kannst Du natürlich auch den Pi-Regler nehmen, der über den Marketplace zur Verfügung steht. Allerdings frisst der wohl nicht eben wenig Rechenkapazität, im Gegensatz zu obiger Rule, welche pro Durchlauf vermutlich < 10 ms benötigt. zu 99% wird die Rule durch die Änderung der Raumtemperatur getriggert, da kommt es also nur auf den Fühler an, bzw. wie dieser an openHAB angebunden ist, wie oft die Rule ausgeführt wird.

Re: Schalter als Trigger für ein Skript

Verfasst: 23. Mär 2023 06:36
von voda
Nein, so funktioniert das NICHT.
Okay, verstanden. Man merkt das ich überwiegend MCUs programmiere. Hier ist doch ein Umdenken erforderlich.
Ich gehe mal davon aus, dass Du grundsätzlich vier Items hast:
1. HeizungFreigabe (also der Schalter, der die Regelung aktiviert)
2. Solltemperatur
3. Isttemperatur
4. Heizung ON/OFF (die eigentliche Heizung... Solange ON, wird es wärmer, solange OFF wird es nicht wärmer)
Korrekt. Über Blocky und cron-Trigger läuft auch alles stabil.
Wenn Du Dich (sehr gut) in Regelungstechnik auskennst, kannst Du natürlich auch den Pi-Regler nehmen, der über den Marketplace zur Verfügung steht. Allerdings frisst der wohl nicht eben wenig Rechenkapazität, im Gegensatz zu obiger Rule, welche pro Durchlauf vermutlich < 10 ms benötigt. zu 99% wird die Rule durch die Änderung der Raumtemperatur getriggert, da kommt es also nur auf den Fühler an, bzw. wie dieser an openHAB angebunden ist, wie oft die Rule ausgeführt wird.
Einen PI-Regler ist glaub ich etwas übertrieben. Wie du schon erkannt hast, ist gerade die (numerische) Integration des I-Terms sehr rechenintensiv zumal noch eine Laplacetransformation (glaube ich zumindest) durchgeführt werden muss. (macht zwar das Binding aber rechenintensiv). Dafür ist das System jedoch sehr träge. Ich benutze Fritz!DECT302. Diese aktualisieren sich max. 5 Minuten. Das nutzt ein PI-Regler wenn das Ergebnis ehh alle 5 Minuten übertragen werden.

Den Schalter habe ich jetzt auf ein Event getriggert. Ich bekomme es so hin, das der Schalter wenn er betätigt wird, das Skript ausführt. Leider bin ich aber etwas auf Kriegsfuß mit der internen Skriptfunktion. Einen Thread habe ich hier eröffnet: viewtopic.php?t=8032. Mit Blocky funktioniert alles reibungslos, aber macht man ein eigenes Skript, funktioniert gar nichts.

Re: Schalter als Trigger für ein Skript

Verfasst: 23. Mär 2023 16:23
von udo1toni
Ähm... Es ist erst mal egal, welche Scriptsprache Du nutzt. Die Rule oben kannst Du genauso auch über die UI erstellen, als DSL, als JavaScript, als Blockly, vollkommen egal.
Ich schreibe seit openHAB 1.0 Rules (2012) und finde, dass die DSL sehr gut lesbar ist. Und die Rule oben enthält sogar die komplette Dokumentation, so dass man sogar noch mal eine Hilfestellung hat, wenn man die Rule nicht über die DSL erstellen will.

Typische Fehler beim Erstellen von scriptbasierten Rules über die UI: Falsche Scriptsprache gewählt, Falsche Schreibweise (z.B. kein Semikolon am Ende des Befehls in JavaScript oder auch die Verwendung von Befehlen, die so nur in einer der anderen Sprachen verwendet werden kann,
Im Fall von DSL Rules: Textform komplett übernommen, statt nur den Codeblock zu verwenden.

Re: Schalter als Trigger für ein Skript

Verfasst: 23. Mär 2023 17:53
von voda
Aber das vestehe ich ja nicht. die obige Funktion läuft unter VSC einwandfrei. Ich habe mir extra eine kleine for-Schleife gebaut um alle Daten und Zeiten durchzulaufen. Das läuft super. Der jeweilige Status wird so wie es soll ausgegeben. In openHab kopiert, nichts funktioniert. Ich möchte das gerne verstehen warum es nicht funktioniert

Re: Schalter als Trigger für ein Skript

Verfasst: 23. Mär 2023 18:29
von udo1toni
Also, wenn Du mit VSC VisualStudio Code meinst, das ist ja erst mal ein Editor, da läuft gar kein Code.
Und wenn Du JavaScript nimmst: JavaScript hat ja auch verschiedene Versionen.
Ich bin nicht sonderlich firm, was JavaScript betrifft, openHAB setzt aber (ohne weiteres Zutun) abhängig von der konkreten openHAB Version eine ganz bestimmte Version ein. Blockly wirft am Ende des Tages auch nur JavaScript raus, nur ist das halt garantiert passend zur Version :)