Zeit aus Item als Variable in Rule

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

Moderatoren: Cyrelian, seppy

Antworten
EMaster
Beiträge: 107
Registriert: 13. Dez 2018 21:02
Answers: 2

Zeit aus Item als Variable in Rule

Beitrag von EMaster »

Hallo,

die Urlaubszeit steht vor der Tür und ich bastle gerade an meine Projekt Balkonbewässerung.
Mit einem festen Wert als Variable in der Rule funktioniert es.
Ich möchte aber die Zeit gerne via openHAB-App von unterwegs nach Bedarf anpassen. Ein entsprechendes Item habe ich schon angelegt und den Wert kann ich damit setzen.
Wie verheirate ich jetzt aber den Wert aus dem Item mit der Variable in der Rule?

Code: Alles auswählen

var timeBalkonBW = 1

rule "Balkombewaesserung"
when
    Time cron "0 22 21 ? * MON,TUE,WED,THU,FRI,SAT,SUN"
then
    if(Swi_Balkon_BW.state == ON)
        { Swi_Balkon.sendCommand(ON) 
            createTimer(now.plusMinutes(timeBalkonBW), [ | Swi_Abwaschen.sendCommand(OFF) ] )
             }    
end
//Wenn Status von Swi_Balkon_BW = ON, dann schalte um 7.05Uhr (Mo-So) Swi_Balkon EIN und nach X Minuten wieder AUS.
//Wenn Status von Swi_Balkon_BW = OFF, dann mache nichts!
von udo1toni » 24. Mai 2023 05:30
Eigentlich ist das keine große Sache:

Code: Alles auswählen

var Integer iBalkonBWTime = 1                                       // Default Wert

rule "Balkon Bewässerung"
when
    Time cron "0 5 7 * * ?"                                         // täglich um 07:05:00 Uhr
then
    if(Swi_Balkon_BW.state != ON)                                   // Falls Status nicht ON
        return;                                                     // brich die Rulole ab

    if(BalkonBW_Time.state instanceof Number)                       // Falls Item eine gültige Zahl liefert
        iBalkonBWTime = (BalkonBW_Time.state as Number).intValue    // übernimm diese in die Variable

    Swi_Balkon.sendCommand(ON)                                      // Schalte Bewässerung ein
    createTimer(now.plusMinutes(iBalkonBWTime), [ |                 // starte Timer mit variabler Zeit
        Swi_Balkon.sendCommand(OFF)                                 // Schalte Bewässerung aus
    ])
end
Wichtig dabei: Gehe niemals davon aus, dass ein Number Item einen gültigen Zahlenwert liefert. Bevor Du also den Wert übernimmst, prüfe immer, ob der Status eine Instanz vom Typ Number ist.
.plusMinutes(long) erwartet eine ganze Zahl als Parameter und wird bei einem Float Wert abbrechen. Insofern ist es wichtig, die Variable am besten als Integer zu definieren.

Wenn man in einer Rule einen "Hauptschalter" einbaut, ist es meist eleganter, die Rule mit return; abzubrechen, weil man so Einrückungen spart (die sind natürlich nicht essentiell, aber man möchte ja ordentlichen Code produzieren...)
Der Time cron Ausdruck ist auch wesentlich kürzer zu haben :)
Gehe zur vollständigen Antwort
openHAB 4.3.4 im Docker@Synology

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

Re: Zeit aus Item als Variable in Rule

Beitrag von udo1toni »

Eigentlich ist das keine große Sache:

Code: Alles auswählen

var Integer iBalkonBWTime = 1                                       // Default Wert

rule "Balkon Bewässerung"
when
    Time cron "0 5 7 * * ?"                                         // täglich um 07:05:00 Uhr
then
    if(Swi_Balkon_BW.state != ON)                                   // Falls Status nicht ON
        return;                                                     // brich die Rulole ab

    if(BalkonBW_Time.state instanceof Number)                       // Falls Item eine gültige Zahl liefert
        iBalkonBWTime = (BalkonBW_Time.state as Number).intValue    // übernimm diese in die Variable

    Swi_Balkon.sendCommand(ON)                                      // Schalte Bewässerung ein
    createTimer(now.plusMinutes(iBalkonBWTime), [ |                 // starte Timer mit variabler Zeit
        Swi_Balkon.sendCommand(OFF)                                 // Schalte Bewässerung aus
    ])
end
Wichtig dabei: Gehe niemals davon aus, dass ein Number Item einen gültigen Zahlenwert liefert. Bevor Du also den Wert übernimmst, prüfe immer, ob der Status eine Instanz vom Typ Number ist.
.plusMinutes(long) erwartet eine ganze Zahl als Parameter und wird bei einem Float Wert abbrechen. Insofern ist es wichtig, die Variable am besten als Integer zu definieren.

Wenn man in einer Rule einen "Hauptschalter" einbaut, ist es meist eleganter, die Rule mit return; abzubrechen, weil man so Einrückungen spart (die sind natürlich nicht essentiell, aber man möchte ja ordentlichen Code produzieren...)
Der Time cron Ausdruck ist auch wesentlich kürzer zu haben :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

EMaster
Beiträge: 107
Registriert: 13. Dez 2018 21:02
Answers: 2

Re: Zeit aus Item als Variable in Rule

Beitrag von EMaster »

Vielen lieben Dank!!! Du bist, wie immer, ein Genie!!!
openHAB 4.3.4 im Docker@Synology

EMaster
Beiträge: 107
Registriert: 13. Dez 2018 21:02
Answers: 2

Re: Zeit aus Item als Variable in Rule

Beitrag von EMaster »

Ich hätte zu meiner Rule mal noch eine ergänzende Frage.
Ich würde gerne den Wert der Variablen in der Sitemap darstellen. WIe genau übergebe ich diesen in ein Item?

Das Item hab ich erstmal klassisch so definiert.

Code: Alles auswählen

Number SetTime_Balkon_BW_State "SetTime_Balkon_BW_State [%s]"
Was muss ich jetzt genau in meine Rule einbauen?

Danke
openHAB 4.3.4 im Docker@Synology

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

Re: Zeit aus Item als Variable in Rule

Beitrag von udo1toni »

Na, Du fügst vor der Zeile mit createTimer noch eine weitere Zeile ein:

Code: Alles auswählen

SetTime_Balkon_BW_State.postUpdate(iBalkonBWTime)
Eventuell möchtest Du stattdessen die Restlaufzeit anzeigen, das ginge mit einer leicht abgewandelten Rule:

Code: Alles auswählen

var Integer iBalkonBWCount = 0                                      // Countdown
var Timer   tBalkonBW      = null                                   // Zeiger auf Timer

rule "Balkon Bewässerung"
when
    Time cron "0 5 7 * * ?"                                         // täglich um 07:05:00 Uhr
then
    if(Swi_Balkon_BW.state != ON)                                   // Falls Status nicht ON
        return;                                                     // brich die Rule ab

    tBalkonBW?.cancel                                               // falls Timer existiert, abbrechen
    iBalkonBWCount = 2                                              // Default eine Minute
    if(BalkonBW_Time.state instanceof Number)                       // Falls Item eine gültige Zahl liefert
        iBalkonBWCount = (BalkonBW_Time.state as Number).intValue   // übernimm diese in die Variable

    Swi_Balkon.sendCommand(ON)                                      // Schalte Bewässerung ein
    tBalkonBW = createTimer(now.plusMinutes(1), [ |                 // starte Timer und führe Code sofort aus
        iBalkonBWCount -= 1                                         // Countdown
        SetTime_Balkon_BW_State.postUpdate(iBalkonBWCount)          // Anzeige updaten
        if(iBalkonBWCount < 1)                                      // Falls 0 erreicht
            Swi_Balkon.sendCommand(OFF)                             // Schalte Bewässerung aus
        else                                                        // ansonsten
            tBalkonBW.reschedule(now.plusMinutes(1))                // führe Code in einer Minute erneut aus
    ])
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

EMaster
Beiträge: 107
Registriert: 13. Dez 2018 21:02
Answers: 2

Re: Zeit aus Item als Variable in Rule

Beitrag von EMaster »

udo1toni hat geschrieben: 16. Mai 2024 21:50 Na, Du fügst vor der Zeile mit createTimer noch eine weitere Zeile ein:

Code: Alles auswählen

SetTime_Balkon_BW_State.postUpdate(iBalkonBWTime)
Irgendwas passt da nicht. :-(
Das Item SetTime_Balkon_BW hat einen Wert von 2 (Minuten) und SetTime_Balkon_BW_State zeigt aber 1 (Minute) an.
Die Änderung wird also nicht geschrieben.

Die Rule schaut aktuell so aus.

Code: Alles auswählen

var Integer iBalkonBWTime = 1                                       // Default Wert

rule "Balkon Bewässerung"
when
    Time cron "0 30 7 * * ?" or                                         // täglich um 07:30:00 Uhr
    Time cron "0 0 20 * * ?"                                            // täglich um 20:00:00 Uhr
then
    if(Swi_Balkon_BW.state != ON)                                   // Falls Status nicht ON
        return;                                                     // brich die Rule ab

    if(SetTime_Balkon_BW.state instanceof Number)                       // Falls Item eine gültige Zahl liefert
        iBalkonBWTime = (SetTime_Balkon_BW.state as Number).intValue    // übernimm diese in die Variable

    Swi_Balkonbewaesserung.sendCommand(ON)                                      // Schalte Bewässerung ein
    SetTime_Balkon_BW_State.postUpdate(iBalkonBWTime)
    createTimer(now.plusMinutes(iBalkonBWTime), [ |                 // starte Timer mit variabler Zeit
        Swi_Balkonbewaesserung.sendCommand(OFF)                                 // Schalte Bewässerung aus
    ])
end
openHAB 4.3.4 im Docker@Synology

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

Re: Zeit aus Item als Variable in Rule

Beitrag von udo1toni »

Und wie sieht es mit der Ausführung der Bewässerung aus? Läuft die dann auch nur eine Minute, oder läuft die tatsächlich zwei Minuten?
Kannst Du einen Auszug Deines event.log posten, so ab 07:29:50 bis 07:30:10 und/oder 19:59:50 bis 20:00:10?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

EMaster
Beiträge: 107
Registriert: 13. Dez 2018 21:02
Answers: 2

Re: Zeit aus Item als Variable in Rule

Beitrag von EMaster »

Sie läuft exakt 2 Minuten, siehe Logs.

Log 20.00Uhr:

Code: Alles auswählen

2024-07-16 20:00:00.110 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Swi_Balkonbewaesserung' received command ON
2024-07-16 20:00:00.111 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Swi_Balkonbewaesserung' predicted to become ON
2024-07-16 20:01:27.586 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'somfytahoma:bridge:6860faab' changed from OFFLINE (COMMUNICATION_ERROR) to ONLINE: Cloud mode
2024-07-16 20:01:27.648 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'somfytahoma:rollershutter_uno:6860faab:764714cd-9c4d-4f22-bd28-8e4163e7230f' changed from OFFLINE (BRIDGE_OFFLINE) to ONLINE
2024-07-16 20:01:27.649 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'somfytahoma:rollershutter:6860faab:764714cd-9c4d-4f22-bd28-8e4163e7230f' changed from OFFLINE (BRIDGE_OFFLINE) to ONLINE
2024-07-16 20:01:27.651 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'somfytahoma:gateway:6860faab:0804-8140-6763' changed from OFFLINE (BRIDGE_OFFLINE) to ONLINE
2024-07-16 20:02:00.109 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Swi_Balkonbewaesserung' received command OFF
2024-07-16 20:02:00.111 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Swi_Balkonbewaesserung' predicted to become OFF
Log 7.30Uhr:

Code: Alles auswählen

2024-07-17 07:30:00.100 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Swi_Balkonbewaesserung' received command ON
2024-07-17 07:30:00.105 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Swi_Balkonbewaesserung' predicted to become ON
2024-07-17 07:30:22.052 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'somfytahoma:bridge:6860faab' changed from OFFLINE (COMMUNICATION_ERROR) to ONLINE: Cloud mode
2024-07-17 07:30:22.083 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'somfytahoma:rollershutter_uno:6860faab:764714cd-9c4d-4f22-bd28-8e4163e7230f' changed from OFFLINE (BRIDGE_OFFLINE) to ONLINE
2024-07-17 07:30:22.084 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'somfytahoma:rollershutter:6860faab:764714cd-9c4d-4f22-bd28-8e4163e7230f' changed from OFFLINE (BRIDGE_OFFLINE) to ONLINE
2024-07-17 07:30:22.113 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'somfytahoma:gateway:6860faab:0804-8140-6763' changed from OFFLINE (BRIDGE_OFFLINE) to ONLINE
2024-07-17 07:32:00.108 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Swi_Balkonbewaesserung' received command OFF
2024-07-17 07:32:00.109 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Swi_Balkonbewaesserung' predicted to become OFF
openHAB 4.3.4 im Docker@Synology

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

Re: Zeit aus Item als Variable in Rule

Beitrag von udo1toni »

Nun wird das reine Update der Items SetTime_Balkon_BW_State nicht im Log auftauchen, wenn das Item schon den Wert hat, auf den es upgedatet werden soll. Du könntest nun das Logging an der Stelle aufdrehen, so dass auch Updates ohne Statusänderung angezeigt werden, oder Du schaust vorher noch mal intensiv, ob sich nicht irgendwo ein Tippfehler eingeschlichen hat...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten