Seite 1 von 1
Zeit aus Item als Variable in Rule
Verfasst: 23. Mai 2023 22:04
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!
Re: Zeit aus Item als Variable in Rule
Verfasst: 24. Mai 2023 05:30
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

Re: Zeit aus Item als Variable in Rule
Verfasst: 24. Mai 2023 20:47
von EMaster
Vielen lieben Dank!!! Du bist, wie immer, ein Genie!!!
Re: Zeit aus Item als Variable in Rule
Verfasst: 16. Mai 2024 19:04
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
Re: Zeit aus Item als Variable in Rule
Verfasst: 16. Mai 2024 21:50
von udo1toni
Na, Du fügst vor der Zeile mit createTimer noch eine weitere Zeile ein:
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
Re: Zeit aus Item als Variable in Rule
Verfasst: 14. Jul 2024 14:37
von EMaster
udo1toni hat geschrieben: ↑16. Mai 2024 21:50
Na, Du fügst vor der Zeile mit createTimer noch eine weitere Zeile ein:
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
Re: Zeit aus Item als Variable in Rule
Verfasst: 15. Jul 2024 19:04
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?
Re: Zeit aus Item als Variable in Rule
Verfasst: 17. Jul 2024 17:45
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
Re: Zeit aus Item als Variable in Rule
Verfasst: 17. Jul 2024 21:37
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...