irgendwie habe ich einen Denkfehler bei dem Ihr mir vielleicht helfen könnt.
Jetziges Szenario: ein Bettlicht wird zur Schlafenszeit eingeschaltet aufgrund dessen wird die Deckenlampe ausgeschaltet und ein GH Mini mit der Geschichte zum heutigen Tag gestartet aber nur einmal pro Abend. Soweit so gut jetzt würde ich gerne eine Regel erstellen die wenn die Geschichte endet einen Timer startet der das Bettlicht nach 15 Minuten ausschaltet (das funktioniert auch) aber wenn das Bettlicht später nochmals angeschaltet wird ein 2.ter Timer der das Licht nach 10 Minuten ausschaltet.
Ich hoffe ich hab mich einigermaßen verständlich ausgedrückt.
Danke schon mal für Eure Hilfe.
Gruß Olaf
var Timer tBedlight = null
rule "Linus Bettlicht Timer nach der Geschichte"
when
Item Google_Home_Linus_Player changed from PLAY to PAUSE
then
if (( Bedlight_Socket.state == ON ) && ( Linus_Door_Trigger.state == ON )) {
if ( tBedlight !== null ) {
logInfo("Bedlight", "Geschichte beendet, 15 Min. Timer wird gestartet!")
tBedlight = createTimer(now.plusMinutes(15), [|
logInfo("Bedlight", "Timer abgelaufen, Bettlicht wird ausgeschaltet!")
Bedlight_Socket.sendCommand(OFF)
tBedlight.cancel()
tBedlight = null
])
}
}
end
"Nichts ist unmöglich ... außer meine Frau will es nicht"
Hardware: Rasp4 mit OH2.5M4, Raspi-Modul, Sonoff-RFBridge, Sonoff, Shelly, Tradfri, CometDECT, Fritz!Box
Projekte: Heizungssteuerung, Licht, Saugroboter, Haustürüberwachung, Ab-Anwesenheit, Google Home Einbindung...
das geht erstmal nicht in diese Rule mit rein, da der Trigger ja ein ganz anderer ist.
Somit eine zweite Rule mit dem Inhalt: Wenn Licht angeschaltet wurde prüfen ob Geschichte ungleich ( != ) PAUSE ist (heißt die Geschichte spielt noch somit wird das Licht nicht beim spielen abgeschaltet, sondern nur wenn die Geschichte Pause hat) wenn das wahr ist ->Timer starten das nach 10 Minuten das Licht ausgeht
rule "Linus Bettlicht Timer nach 10 Minuten"
when
Item Bedlight_Socket changed to ON
then
{
if ( Google_Home_Linus_Player.state != PAUSE)
{
createTimer(now.plusMinutes(10)) [Bedlight_Socket.sendCommand(OFF)]
}
}
end
Ich denke, es wäre sinnvoller, ein Item (oder eine globale Variable) je nach Fortschritt der Steuerung auf einen bestimmten Wert zu setzen, das kannst Du dann abfragen. z.B. wenn das Deckenlicht eingeschaltet ist und das Bettlicht eingeschaltet wird, wird die Variable von null auf eins umgeschaltet (zusätzlich zum Licht und der Geschichte). Wenn die Geschichte endet, wird die Variable von eins auf zwei geändert. Morgens (oder vor dem Schlafengehen) setzt eine Rule die Variable wieder auf null. Nun kannst Du in jeder Rule, bei der das nötig ist, den Stand der Variablen prüfen und weißt, ob die Geschichte schon gespielt wurde.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
@Desidia
Danke für die schnelle Antwort das war aber nicht ganz das was ich wollte. Trotzdem Danke!
@Udo
Danke für den Hinweis habe es jetzt mit String Items über 2 Rules zum laufen bekommen. Geht wahrscheinlich auch eleganter...
ITEMS:
String Bedtime_Status "Status Bedtime Linus [MAP(Bedtime.map):%s]" (gStatus)
String Storie_Status "Status Storie Linus [MAP(Storie.map):%s]" (gStatus)
RULES:
rule "Bettlicht Status definieren"
when
Item Bedlight_Socket received update
then
Thread::sleep(3000)
//logInfo("Bedlight_Status", "Warte 10 Sekunden!")
if (( Bedlight_Socket.state == ON ) && ( Bedtime_Story.state == ON ) && ( Google_Home_Linus_Player.state != "PLAY" )) {
Bedtime_Status.postUpdate("BEDLIGHTWOS")
logInfo("Bedlight_Status", "Bettlicht wurde ohne Geschichte eingeschaltet!")
}
else if (( Bedlight_Socket.state == ON ) && ( Bedtime_Story.state == ON ) && ( Google_Home_Linus_Player.state != "PAUSE" )) {
Bedtime_Status.postUpdate("BEDLIGHTWS")
logInfo("Bedlight_Status", "Bettlicht wurde mit Geschichte eingeschaltet!")
}
else if ( Bedlight_Socket.state != ON ) {
Bedtime_Status.postUpdate("BEDLIGHTOFF")
logInfo("Bedlight_Status", "Bettlicht ausgeschaltet!")
}
end
rule "Bettzeit Geschichten Status"
when
Item Bedtime_Status changed to "BEDLIGHTWS"
then
if ( Bedtime_Status.state == "BEDLIGHTWS" ) {
Storie_Status.postUpdate("STORIEON")
Thread::sleep(3000)
while( Google_Home_Linus_Stop.state != ON ) {
logInfo("Storie_Status", "Warte auf Ende der Geschichte")
Thread::sleep(60000)
}
logInfo("Storie_Status", "Geschichte beendet")
Storie_Status.postUpdate("STORIEOFF")
Bedtime_Status.postUpdate("BEDLIGHTWOS")
}
end
var Timer tBedlight1 = null
var Timer tBedlight2 = null
rule "Linus Bettlicht Timer nach der Geschichte"
when
Item Bedtime_Status received update
then
switch Bedtime_Status.state {
case "BEDLIGHTWS" : {
if (( Bedlight_Socket.state == ON ) && ( Storie_Status.state == "STORIEOFF" )) {
if ( tBedlight1 === null ) {
logInfo("Bedlight", "Geschichte beendet, 15 Min. Timer wird gestartet!")
tBedlight1 = createTimer(now.plusMinutes(15), [|
logInfo("Bedlight", "Timer abgelaufen, Bettlicht wird ausgeschaltet!")
Bedlight_Socket.sendCommand(OFF)
tBedlight1.cancel()
tBedlight1 = null
])
}
}
}
case "BEDLIGHTWOS" : {
if ( Bedlight_Socket.state == ON ) {
if ( tBedlight2 === null ) {
logInfo("Bedlight", "10 Min. Bettlicht Timer wird gestartet!")
tBedlight2 = createTimer(now.plusMinutes(10), [|
logInfo("Bedlight", "Timer abgelaufen, Bettlicht wird ausgeschaltet!")
Bedlight_Socket.sendCommand(OFF)
tBedlight2.cancel()
tBedlight2 = null
])
}
}
}
}
end
"Nichts ist unmöglich ... außer meine Frau will es nicht"
Hardware: Rasp4 mit OH2.5M4, Raspi-Modul, Sonoff-RFBridge, Sonoff, Shelly, Tradfri, CometDECT, Fritz!Box
Projekte: Heizungssteuerung, Licht, Saugroboter, Haustürüberwachung, Ab-Anwesenheit, Google Home Einbindung...