Seite 1 von 1

Mehrere Timer für ein Item mit unterschiedlichen Bedingungen

Verfasst: 23. Jun 2020 19:31
von OH-RNHome
Hallo zusammen,

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

Code: Alles auswählen

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

Re: Mehrere Timer für ein Item mit unterschiedlichen Bedingungen

Verfasst: 23. Jun 2020 20:56
von desidia
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

Code: Alles auswählen

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

Re: Mehrere Timer für ein Item mit unterschiedlichen Bedingungen

Verfasst: 24. Jun 2020 00:06
von udo1toni
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.

Re: Mehrere Timer für ein Item mit unterschiedlichen Bedingungen

Verfasst: 24. Jun 2020 18:07
von OH-RNHome
@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...

Code: Alles auswählen

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