Rule für Untertischgerät

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
AndRe5575
Beiträge: 73
Registriert: 8. Jun 2020 20:16
Answers: 0

Rule für Untertischgerät

Beitrag von AndRe5575 »

Hallo zusammen,

ich würde gerne mein Untertischgerät automatisch nach einem Aufheizvorgang ausschalten.
Prinzipiell müsste doch dieser Code zumindest das Gerät wieder ausschalten oder?

Code: Alles auswählen

rule "Auto-OFF"
when
    Untertischgeraet_Switch == ON
then
    if(Untertischgeraet_MeterCurrentWatts > 100.0) {

    }
    else {
    Untertischgeraet_Switch.sendCommand(OFF)
    }
end
Klar, nach dem einschalten ist die gemessene Leistung nicht sofort da, also müsste es ja sofort ausgeschaltet werden.
Leider bleibt das Gerät auf ON, egal was die Leistungsmessung anzeigt (0.0 oder 1980.0).

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

Re: Rule für Untertischgerät

Beitrag von udo1toni »

Nein? Wie kommst Du denn zu der Notation?

Die Rule, welche Du suchst, lautet

Code: Alles auswählen

rule "Auto OFF"
when
    Item Untertischgeraet_MeterCurrentWatts changed
then
    if(!(Untertischgeraet_MeterCurrentWatts.state instanceof Number))
        return;

    if((Untertischgeraet_MeterCurrentWatts.state as Number).floatValue < 100)
        Untertischgeraet_Switch.sendCommand(OFF)
end
Wobei die 100 vermutlich eher zu hoch angesetzt sind. Die Schwelle sollte geringfügig über dem Ruhestrom liegen. Wenn also im Ruhezustand 0 angezeigt wird, nimmst Du meinetwegen 1 oder 2 als Wert.

Rules in openHAB werden durch Events ausgelöst. Eine Rule läuft exakt einmal, durch und ist dann beendet, bis sie erneut getriggert wird. Dauer eines Durchlaufs typisch weniger als 10 Millisekunden, bei einer so kleinen Rule eher weniger als 1 Millisekunde.

Der Trigger in diesem Fall muss der Verbrauch sein, denn diesen Wert nutzt Du zur Steuerung.
Alle Trigger für eine Rule stehen nach dem when. Es muss ein Schlüsselwort für die Art des Triggers angegeben werden, in diesem Fall Item, weil es um ein Item geht. Getriggert werden soll, wen sich der Verbrauch ändert, also wird nach changed getriggert.

Als ersten Schritt in solch einer Rule muss geprüft werden, ob der Status (.state) des untersuchten Items einen gültigen Zahlenwert enthält (instanceof Number). Ist das nicht der Fall, muss die Rule abgebrochen werden (Das geschieht mit dem return; dies ist die einzige Anweisung in der Rules DSL, welche ein Semikolon am Schluss braucht.)
Im zweiten Schritt wird der Status als Number gecastet, was gefahrlos möglich ist, wir haben ja sichergestellt, dass .state vom Typ Number ist. Wir wollen diese Number als Float (Fließkommazahl) betrachten, deshalb das .floatValue. Es könnte sein, dass die Rule auch ohne diese Erweiterung funktioniert, sobald das Item aber ein UoM Item ist, geht der Vergleich ohne dieses Anhängsel schief, denn .state ist dann nicht .z.B. 35, sondern 35 W. Das wird auch so im Log angezeigt. 35 W kann aber nicht mit 100 verglichen werden (bzw. der Vergleich ist immer wahr, oder immer falsch, je nach Vergleich).
Wenn der gemessene Wert unterhalb des Grenzwertes liegt, wird der Ausschaltbefehl gesendet.

Man könnte die Rule noch etwas sicherer machen, indem man einen Merker verwendet. Der Merker wird gesetzt, wenn der gemessene Strom eine Grenze überschreitet. Nur wenn der Merker gesetzt und die Grenze gleichzeitig unterschritten wird, wird der Ausschaltbefehl gesendet. Damit ist dann sichergestellt, dass die Heizung einmal eingeschaltet war.

Bleibt noch eine Frage zu klären, nämlich wie oft wird der Messwert aktualisiert. :)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

AndRe5575
Beiträge: 73
Registriert: 8. Jun 2020 20:16
Answers: 0

Re: Rule für Untertischgerät

Beitrag von AndRe5575 »

Wieder einmal vielen Dank Dir. Super erklärt.

Messwert wird von einem Shelly 1PM erfasst, Abtastzeit ist mir aber da eigentlich egal. Ein Aufheizvorgang braucht ja ein paar Minuten und danach wird ja nicht direkt weiter geheizt. Die Schwelle von 100 sollte bei dem Gerät passen, da es nur Ein und Aus kennst liegt der Verbrauch direkt bei 2kW.

Werde ich heute Abend direkt einmal so umsetzen und dann noch um die Funktion erweitern, dass die Beleuchtung einmal kurz blinkt für Ein und zweimal sobald das Wasser aufgeheizt ist :-)

AndRe5575
Beiträge: 73
Registriert: 8. Jun 2020 20:16
Answers: 0

Re: Rule für Untertischgerät

Beitrag von AndRe5575 »

Also die Rule funktioniert einwandfrei, bis auf der Schreibfehler "instandeof", womit ja instanceof gemeint war.
Nun wollte ich das blinken als Status Anzeige dazu bringen. Ich denke mal das dies etwas kompliziert gelöst ist:

Code: Alles auswählen

then 
    switch(receivedEvent) 
    {
        case "3002.0": 
        {
            Untertischgeraet_Switch.sendCommand(OFF)
        }
        case "2002.0": 
        {
            Untertischgeraet_Switch.sendCommand(ON)
            logInfo("Untertischgeraet", "UT wird eingeschaltet")
            if (KuecheArbeitsplatte_On.state == OFF)  {
                KuecheArbeitsplatte_On.sendCommand(ON)
                logInfo("Untertischgeraet", "Licht ist aus und wird eingeschaltet")
                createTimer(now.plusSeconds(1)) [KuecheArbeitsplatte_On.sendCommand(OFF)]
                logInfo("Untertischgeraet", "Licht war aus und wird wieder ausgeschaltet")
                return;
            }

            if (KuecheArbeitsplatte_On.state == ON)   {
                KuecheArbeitsplatte_On.sendCommand(OFF)
                logInfo("Untertischgeraet", "Licht ist an und wird ausgeschaltet")
                createTimer(now.plusSeconds(1)) [KuecheArbeitsplatte_On.sendCommand(ON)]
                logInfo("Untertischgeraet", "Licht war an und wird wieder eingeschaltet")
                return;
            }
        }
    }
Das merkwürdige hier ist, mal klappt es und mal nicht. Der Log Eintrag erfolgt richtig, allerdings scheint das Licht die Kommandos wohl nicht richtig zu bekommen. Habe ich hier einen Fehler drinnen?

Ist das Licht an, wird es richtig ausgeschaltet, allerdings nicht wieder ein. Beim nächsten Versuch klappt es hingegen einwandfrei.
Ist das Licht aus, wird es richtig eingeschaltet, allerdings nicht wieder aus. Beim nächsten Versuch klappt auch dies einwandfrei.

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

Re: Rule für Untertischgerät

Beitrag von udo1toni »

Unter der Voraussetzung, dass Du auf die logInfo() Anweisungen verzichtest, reicht folgender Code:

Code: Alles auswählen

then
    switch(receivedEvent) {
        case "3002.0": {
            Untertischgeraet_Switch.sendCommand(OFF)
        }
        case "2002.0": {
            Untertischgeraet_Switch.sendCommand(ON)
            KuecheArbeitsplatte_On.sendCommand(if(KuecheArbeitsplatte_On.state != ON) ON else OFF)
            createTimer(now.plusSeconds(1), [|
                KuecheArbeitsplatte_On.sendCommand(if(KuecheArbeitsplatte_On.state != ON) ON else OFF)
            ])
        }
    }
end
Der wichtigste Unterschied Zu Deiner Rule ist, dass kein Vergleich == durchgeführt wird. Stattdessen prüft die Rule auf !=. Es wird also auf jeden Fall ein Befehl gesendet. Der Befehl entspricht dem, was nicht da ist :) wobei das nicht unbedingt das exakte Gegenteil ist. Es könnte z.B. sein, dass kein gültiger Status ON oder OFF vorliegt (das Item kann auch UNDEV, UNINITIALIZED oder NULL als Status halten). Es wird aber immer ein Befehl gesendet, der nicht dem aktuellen Status entspricht.
Durch den ternären Operator braucht es auch keinen zweiten Timer. Die Lesbarkeit des Codes leidet natürlich etwas, aber man gewöhnt sich dran ;)

Ich schreibe den Timer immer so, dass klar wird, dass das Lambda ein Parameter der Funktion createTimer(<dateTime>,<lambda>) ist.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

AndRe5575
Beiträge: 73
Registriert: 8. Jun 2020 20:16
Answers: 0

Re: Rule für Untertischgerät

Beitrag von AndRe5575 »

Super vielen Dank nochmal. Die Log Einträge wollte ich nur nutzen um ggf. den Fehler zu finden. Allerdings habe ich auch bei der Lösung das Problem, dass es mal funktioniert und mal nicht. Ich vermute mal, das dies ggf. mit der HUE Steuerung zusammenhängt und die Kommandos zu schnell kommen. Da werde ich mir wohl was anderes einfallen lassen müssen. Eine optische Rückmeldung über das Untertischgerät wäre aber schon praktisch.

Ggf. erhöhe ich die Zeit auf 2 Sek., wenn das Licht aus ist und gehe auf 2 Sek Farbwechsel, wenn das Licht bereits an ist.

Sollte man, wenn man das Licht zweimal blinken lassen will eher eine Schleife Programmieren und zweimal nacheinander den Timer?

Programmierst Du beruflich? JAVA oder eher C?

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

Rule für Untertischgerät

Beitrag von udo1toni »

Wie reaktionsfreudig die HUE sind, weiß ich nicht, da ich keine habe :)
Für zweimaliges Blinken wäre ein Zähler mit einem Timer sinnvoll.

Vor dem Start setzt Du den Zähler z.B. auf 3 und reduzierst bei jedem Durchlauf um eins. Bei 0 verlässt Du den Timer.

Beruflich programmiere ich nicht (wobei ich tatsächlich für die Arbeit schon programmiert habe, aber eben nicht „hauptberuflich“)

Ach so… ich nutze das, was zur Verfügung steht. In MS Office (vor allem Formularautomation) natürlich mit VBA, für einen kleinen Kalender VB.Net, im Bereich openHAB am ehesten DSL, ein paar kleine Python Progrämmchen und tatsächlich auch einmal php Script, so wie es halt gerade passt.

Gesendet von iPad mit Tapatalk
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

BOP
Beiträge: 197
Registriert: 23. Sep 2018 19:43
Answers: 1

Re: Rule für Untertischgerät

Beitrag von BOP »

AndRe5575 hat geschrieben: 14. Aug 2021 13:25

Code: Alles auswählen

...
createTimer(now.plusSeconds(1)) [KuecheArbeitsplatte_On.sendCommand(OFF)]
...
Habe ich hier einen Fehler drinnen?
Kann sein, dass ich gerade einen Knick in der Optik habe, aber der Lambda-Ausdruck für den Timer ist doch nicht korrekt!? Da fehlt doch der (nicht vorhandene) Eingabeparameter?

createTimer(now.plusSeconds(1)) [|KuecheArbeitsplatte_On.sendCommand(OFF)]

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

Re: Rule für Untertischgerät

Beitrag von udo1toni »

Nein, die Pipe ist optional. Da das Lambda im Fall des Timers niemals parametriert ist (jedenfalls wäre mir da nichts bekannt) ist die Angabe der Pipe nur “der Vollständigkeit halber”, aber keineswegs notwendig. Es ist halt (wie das Hereinziehen als Parameter der Funktion) guter Stil :)


Gesendet von iPad mit Tapatalk
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

BOP
Beiträge: 197
Registriert: 23. Sep 2018 19:43
Answers: 1

Re: Rule für Untertischgerät

Beitrag von BOP »

Ich hätte jetzt schwören können, dass ich damit schon mal Schwierigkeiten hatte und seitdem dachte, er wäre verpflichtend.
Wieder was dazugelernt.

Antworten