Seite 1 von 2

Komm nicht weiter

Verfasst: 14. Jun 2021 00:02
von Snatsch
Hallo,
ich stehe gerade völlig auf dem Schlauch :( Ich möchte gern das der zweite Teil meiner Rule erst ausgelöst wird wenn der erste erfolgt ist. Also "if(AussentuerePartyraum_TurFensterstatus.state == CLOSED)" darf erst nach dem Timer erfolgen. Wäre schön wenn mir jemand einen Tip geben könnte.

import java.net.URLEncoder
var Timer AussentuerePartyraumMeldung = null

rule "Außentüre Partyraum offen"
when
Item AussentuerePartyraum_TurFensterstatus changed
then
//cancel timer if running
AussentuerePartyraumMeldung?.cancel
AussentuerePartyraumMeldung = null

if(AussentuerePartyraum_TurFensterstatus.state == OPEN)
AussentuerePartyraumMeldung = createTimer(ZonedDateTime.now.plusMinutes(1), [|
val telegramAction = getActions("telegram","telegram:telegramBot:8750e150c1")

if((Localweatherandforecast_Aussentemperatur.state as Number).floatValue <15){
telegramAction.sendTelegram("Die Außentüre im Partyraum steht schon länger offen und es wird kalt!")

say ("Die Außentüre im Partyraum steht schon länger offen und es wird kalt",null)

val urlmessage = URLEncoder::encode("Die Außentüre im Partyraum steht schon länger offen und es wird kalt", 'UTF-8')
sendHttpGetRequest("https://api.callmebot.com/whatsapp.php? ... 3456&text=" + urlmessage)

}
])

if(AussentuerePartyraum_TurFensterstatus.state == CLOSED){

val telegramAction = getActions("telegram","telegram:telegramBot:8750e150c1")

telegramAction.sendTelegram("OK die Aussentüre im Partyraum wurde geschlossen!")

say ("OK die Aussentüre im Partyraum wurde geschlossen!",null)

val urlmessage = URLEncoder::encode("OK die Aussentüre im Partyraum wurde geschlossen!", 'UTF-8')
sendHttpGetRequest("https://api.callmebot.com/whatsapp.php? ... 3456&text=" + urlmessage)

}


end

Re: Komm nicht weiter

Verfasst: 14. Jun 2021 11:01
von udo1toni
Du darfst in diesem Fall den Timer nicht einfach so zu Beginn der Rule canceln und löschen.
Stattdessen muss die Rule so aussehen:

Schritt 1: Unterscheidung ob OPEN oder CLOSED.

Falls OPEN: Timer anlegen
Falls CLOSED: Prüfen, ob Timer schon abgelaufen, Anschließend Timer Canceln und auf null setzen.

Da es leider keinen direkten Weg gibt, zu prüfen, ob der Timer bereits abgelaufen ist, brauchst Du eine Hilfsvariable vom Typ Boolean, die Du global anlegst. Diese wird beim Canceln des Timers auf false gesetzt. Der Timer setzt die Variable auf true.


Gesendet von iPad mit Tapatalk

Re: Komm nicht weiter

Verfasst: 14. Jun 2021 12:15
von Snatsch
vielen Dank für deine Antwort. Könntest du mir das bitte an einen Beispiel zeigen ? Habe erst vorige Woche angefangen mit VSC zu arbeiten.
MfG Daniel Knoch

Re: Komm nicht weiter

Verfasst: 14. Jun 2021 12:17
von udo1toni
Ja, da muss ich allerdings den Rechner wechseln… das macht am iPad echt keinen Spaß…


Gesendet von iPad mit Tapatalk

Re: Komm nicht weiter

Verfasst: 14. Jun 2021 12:22
von Snatsch
Das glaub ich. Vielen Dank

Re: Komm nicht weiter

Verfasst: 14. Jun 2021 13:52
von udo1toni
So:

Code: Alles auswählen

import java.net.URLEncoder
var Timer   tPartyraum = null
var Boolean bPartyraum = false

rule "Außentüre Partyraum offen"
when
    Item AussentuerePartyraum_TurFensterstatus changed
then
    tPartyraum?.cancel     // cancel timer if running
    tPartyraum = null      // kann auch entfallen, da der Zustand nirgends geprüft wird
    if(AussentuerePartyraum_TurFensterstatus.state == OPEN) // das heißt, vorher war zu
        tPartyraum = createTimer(ZonedDateTime.now.plusMinutes(1), [|
            val String strMessage = "Die Außentüre im Partyraum steht schon länger offen und es wird kalt!"
            val telegramAction = getActions("telegram","telegram:telegramBot:8750e150c1")
            if((Localweatherandforecast_Aussentemperatur.state as Number).floatValue <15){
                bPartyraum = true  // die OK-Meldung kommt nur, wenn vorher die Erinnerung kam
                                   // // alternativ vor die Bedingung einbetten, dann kommt die OK-Meldung, wenn die Tür eine Minute offen stand und geschlossen wird.
                telegramAction.sendTelegram(strMessage)
                say (strMessage,null)
                val urlmessage = URLEncoder::encode(strMessage, 'UTF-8')
                sendHttpGetRequest("https://api.callmebot.com/whatsapp.php? ... 3456&text=" + urlmessage)
            }
        ])
    else { // das Gegenteil von OPEN ist CLOSED
        if(bPartyraum){
            val String strMessage = "OK die Aussentüre im Partyraum wurde geschlossen!"
            val telegramAction = getActions("telegram","telegram:telegramBot:8750e150c1")
            telegramAction.sendTelegram(strMessage)
            say (strMessage,null)
            val urlmessage = URLEncoder::encode(strMessage, 'UTF-8')
            sendHttpGetRequest("https://api.callmebot.com/whatsapp.php? ... 3456&text=" + urlmessage)
            bPartyraum = false
        }
    }
end
Falls Du häufiger Meldungen ausgibst, bietet es sich an, das in eine Rule auszulagern. Dazu definierst Du ein String Item z.B. Meldung und eine Rule, die sich um die Message kümmert:

Code: Alles auswählen

rule "send Message"
when
    Item Meldung received update
then
    if(Meldung.state == NULL || Meldung.state.toString == "") {
        logWarn("message","Item Meldung erhielt Update auf {}, keine Ausgabe möglich!",Meldung.state)
        return;
    }
    val String strMessage = Meldung.state.toString
    val urlmessage = URLEncoder::encode(strMessage, 'UTF-8')
    val telegramAction = getActions("telegram","telegram:telegramBot:8750e150c1")
    telegramAction.sendTelegram(strMessage)
    say(strMessage,null)
    sendHttpGetRequest("https://api.callmebot.com/whatsapp.php? ... 3456&text=" + urlmessage)
end
Nun reicht ein

Code: Alles auswählen

Meldung.postUpdate("Das ist meine Nachricht!")
um die Nachricht einmalig an alle Kanäle zu verteilen. Da das Ganze über Rule und Item funktioniert, kann es systemweit genutzt werden. Du kannst sogar innerhalb der Rule "send Message" Abhängigkeiten vorsehen, z.B. dass zu bestimmten Uhrzeiten keine Ansage erfolgt oder die Benachrichtigung auf WhatsApp nur erfolgt, wenn niemand im Haus ist (vorausgesetzt natürlich, Du hast eine Anwesenheitserkennung), oder, oder, oder.

Re: Komm nicht weiter

Verfasst: 14. Jun 2021 14:12
von Snatsch
vielen, vielen Dank. Das ist ja der absolute Vollservice. Werde mich heute Abend gleich mal drüber machen.

Re: Komm nicht weiter

Verfasst: 14. Jun 2021 15:52
von Snatsch
Möchte deine Hilfe nicht überstrapazieren aber könntest du mir noch Erklären wie ich des String Item mit dem Namen "Meldungen" anlege und das die Rule nur in der Zeit von 6.00 Uhr bis 22.00 Uhr triggern soll. Wäre echt super.

Re: Komm nicht weiter

Verfasst: 14. Jun 2021 16:55
von udo1toni
Ich gehe davon aus, dass Du OH3 verwendest. Du gehst in die Main UI -> Administration->Einstellungen->Items. Dort klickst Du unten rechts auf das weiße + im blauen Kreis und wählst aus der Liste … ähm… … create Item… (nicht from file… hab’s grade nicht präsent, welche Punkte es da genau gibt)
Dann legst Du das Item als String Item an, vergibst den Namen und wenn Du willst auch ein Label, wobei das Item für die UI nicht so interessant ist.

Punkt 2: Es gibt verschiedene Möglichkeiten dafür. Pragmatisch: Du legst ein weiteres Item an (z.B. Nachtruhe), als Switch.
Du definierst zwei Rules, die zur entsprechenden Uhrzeit Trigger (Time cron) und das Item auf ON bzw. OFF setzen (per postUpdate!).
In Deiner Rule schreibst Du vorne eine Abbruchbedingung rein, so wie etwa:

Code: Alles auswählen

if(Nachtruhe.state == ON) return;
Und schon wird die Rule automatisch beendet, falls Nachtruhe auf ON steht.

Alternativ kannst Du innerhalb der Rule auch prüfen, ob aktuelle Stunde/Minute in einem bestimmten Bereich liegen, z.B. mit

Code: Alles auswählen

if(now.getHour<6 || now.getHour > 21) return;
Sobald es um Minuten geht, werden solche Abfragen aber kompliziert, weil zum einen ein Stundenbereich abgefragt werden muss, zum anderen aber im “Randbereich” Gleichheit der Stunde und Minutenbereich abgefragt werden müssen.
Ein Item wie oben beschrieben kannst Du auch problemlos in anderen Rules wiederverwenden, so denn der Zeitraum passt.


Gesendet von iPad mit Tapatalk

Re: Komm nicht weiter

Verfasst: 14. Jun 2021 18:33
von Snatsch
Vielen lieben Dank für deine Bemühungen :)