Seite 1 von 1

openhab rules zeitverzögerung

Verfasst: 24. Nov 2020 14:26
von steinadler
hi
ich mal wieder
ich versuche in einer regel, wo einzelne case auswahlen laufen, eine case auswahl zeitverzögert zu steuern
-------------------------------------------------------------------------------------------------------------------------------
rule "sonoffRF_kontakt_auswahl"
when
Item RfData changed
then
if (RfData.state == NULL)
{
logInfo("RfBridge.rules", "Item is null, cancelling...")
return;
}
var timer = null
var sonoffRfData = RfData.state.toString
logInfo("rfbridge.rules", "Received IT Codes: " + sonoffRfData)
switch (sonoffRfData) {
case "E1D06E":

// createTimer(now.plusMinutes(1) ) [| sendCommand(meinItem, OFF) timer = null ]

{
publish("broker", "cmnd/meinItem/POWER", "ON")
}
case "E1D067":
{
publish("broker", "cmnd/meinItem/POWER", "OFF")
}
RfData.postUpdate(sonoffRfData)
end
--------------------------------------------------------------------------------------------------------------------
ohne meine "selbsgebastelte" zeitverzögerung geht alles
es soll nur das eine items mit zeitverzögerung laufen
kann ich das so irgendwie integrieren?
oder ist mein gedankengang total falsch?
wie binde ich die hier auskommantierte zeitverzögerung rein ?

danke schonmal im vorraus...

Re: openhab rules zeitverzögerung

Verfasst: 24. Nov 2020 16:37
von udo1toni
Das Problem dürfte die Schreibweise sein. Das fängt allerdings schon mit dem Posting an :) Bitte verdwende für Code immer Code Tags (Vollständiger Editor und dann die Schaltfläche mit dem </>)
Wenn Du die Rule genau anschaust, werden Dir zwei Dinge auffallen: 1. hast Du eine öffnende geschwungene Klammer mehr als schließende der selben Sorte.
2. hast Du die auskommentierte Zeile vor die Klammer gepackt, womit der nachfolgende Block dann innerhalb des switch steht, aber keine zugehörige case-Anweisung hat.
Leider ist Deine Beschreibung auch nicht hilfreich, denn der Code mahct genau, was Du hinschreibst: er funktioniert nicht. Wichtiger wäre, zu wissen, das passieren soll. Wenn Du den entsprechenden Code E1D06E empfängst, welche Aktionen sollen in welcher Reihenfolge mit welchem Abstand ausgeführt werden? Ich kann hier nur mutmaßen...

So sähe eine funktionierende Version mit Timer aus:

Code: Alles auswählen

rule "Sonoff RF Kontakt Auswahl"
when
    Item RfData changed
then
    if(RfData.state == NULL) {
        logInfo("rfbridge", "Item is null, cancelling...")
        return;
    }
    var sonoffRfData = RfData.state.toString
    logInfo("rfbridge.rules", "Received IT Codes: " + sonoffRfData)
    switch(sonoffRfData) {
        case "E1D06E" : {
            publish("broker", "cmnd/meinItem/POWER", "ON")
            createTimer(now.plusMinutes(1), [ |
                meinItem.sendCommand(OFF)
            ]
        }
        case "E1D067": {
            publish("broker", "cmnd/meinItem/POWER", "OFF")
        }
    }
    RfData.postUpdate(sonoffRfData)
end
Allerdings ist der Code auch so mehr als fragwürdig.

Warum schreibst Du am Ende der Rule den Status des Items RfData in den Status von RfData? Was soll das?
Warum verwendest Du überhaupt eine richtig alte mqtt1 Action publish? So macht man das nicht!

Wie sind die Items definiert? Nutzt Du immer noch mqtt1 für den Rest?

Der erste Schritt wäre, das System zu konsolidieren, das heißt, für die Schaltkanäle Switch Items anlegen, die Du dann ganz normal verwenden kannst, statt Umwege über die Action zu gehen.
Das wäre auch eine gute Gelegenheit, gleich auf mqtt2 umzustellen. :) das 2er Binding ist reecht einfach zu konfigurieren, wenn man mal verstanden hat, wie Things funktionieren. Die mqtt1 Action kannst Du dann auf jeden Fall entsorgen. mqtt2 bringt ebenfalls eine Action mit, die aber nicht separat installiert werden muss.
Die Konfigurationsdateien, mqtt betreffend, kommen dann ebenfalls weg, nur der Inhalt der Dateien wird (teilweise) in der Bridge zu mqtt2 weiter verwendet.

Re: openhab rules zeitverzögerung

Verfasst: 25. Nov 2020 17:59
von steinadler

Code: Alles auswählen

rule "sonoffRF_kontakt_auswahl"
when
    Item RfData01 changed
then
if (RfData01.state == NULL)
    {
    logInfo("RfBridge.rules", "Item is null, cancelling...")
    return;
    } 
    var sonoffRfData = RfData01.state.toString
    //var Timer zeit = null
    logInfo("rfbridge.rules", "Received IT Codes: " + sonoffRfData)
        switch (sonoffRfData) {         
         
            case "07206E":   //flurlicht
               {
                publish("broker", "cmnd/Flur/POWER", "ON")
                }
            case "072067":   //flurlicht
                {
                Thread::sleep(15000)
               
                publish("broker", "cmnd/Flur/POWER", "OFF")            
    }
    
 RfData01.postUpdate(sonoffRfData)
end

Code: Alles auswählen

items
String  RfData01  "Daten [%s ]"                         { channel="mqtt:topic:b8fd5e5c:Sonoff_bridge:RfData" }

Code: Alles auswählen

Thing topic Sonoff_bridge_oben  "SonoffRF01" @ "Sonoff_Bridge" {  
    Channels:
    Type string : RfData      [stateTopic="tele/Sonoff_bridge/RESULT", transformationPattern="JSONPATH:$.RfReceived.Data"]
Thread::sleep(15000) sollte durch einen timer ersetz werden, da ich gelesen habe, das Thread::sleep nicht über 500 gehen sollte
Danke...

Re: openhab rules zeitverzögerung

Verfasst: 25. Nov 2020 19:25
von udo1toni
Easy-peasy :)
So muss das aussehen:

Code: Alles auswählen

var Timer tZeit = null                                              // Objekt für Timer anlegen

rule "sonoffRF Kontakt Auswahl"                                     // Ruletitel dürfen Leerzeichen und Sonderzeichen enthalten
when
    Item RfData01 received update                                   // falls 2 mal der gleiche Befehl kommt
then
    if (RfData01.state == NULL) {
        logInfo("RfBridge.rules", "Item is null, cancelling...")
        return;
    }
    val sonoffRfData = RfData01.state.toString
    logInfo("rfbridge.rules", "Received IT Codes: {}", sonoffRfData)
    switch(sonoffRfData) {
        case "07206E" : {                                           // flurlicht an
            publish("broker", "cmnd/Flur/POWER", "ON")
        }
        case "072067" : {                                           // flurlicht verzögert aus
            tZeit?.cancel                                           // falls ein Timer läuft, abbrechen
            tZeit = createTimer(now.plusSeconds(15), [ |            // Timer anlegen
                publish("broker", "cmnd/Flur/POWER", "OFF")
            ])
        }
    }
end
Wie oben erwähnt ist das postUpdate zum Schluss der Rule unsinnig.

Bessere Variante:
Einen Channel für das Flurlicht anlegen:

Code: Alles auswählen

Thing topic Sonoff_Flur "Flur" {
    Type switch : ch1 "Flur" [ stateTopic="stat/Flur/POWER", commandTopic="cmnd/Flur/POWER" ]
}
dazu ein Item:

Code: Alles auswählen

Switch Flurlicht "Flurlicht" {channel="mqtt:topic:b8fd5e5c:Sonoff_Flur:ch1"}
und dann in der Rule das publish("broker", "cmnd/Flur/POWER",) durch ein Flurlicht.sendCommand() ersetzen:

Code: Alles auswählen

var Timer tZeit = null                                              // Objekt für Timer anlegen

rule "sonoffRF Kontakt Auswahl"                                     // Ruletitel dürfen Leerzeichen und Sonderzeichen enthalten
when
    Item RfData01 received update                                   // falls 2 mal der gleiche Befehl kommt
then
    if (RfData01.state == NULL) {
        logInfo("RfBridge.rules", "Item is null, cancelling...")
        return;
    }
    val sonoffRfData = RfData01.state.toString
    logInfo("rfbridge.rules", "Received IT Codes: {}", sonoffRfData)
    switch(sonoffRfData) {
        case "07206E" : {                                           // flurlicht an
            Flurlicht.sendCommand(ON)
        }
        case "072067" : {                                           // flurlicht verzögert aus
            tZeit?.cancel                                           // falls ein Timer läuft, abbrechen
            tZeit = createTimer(now.plusSeconds(15), [ |            // Timer anlegen
                Flurlicht.sendCommand(OFF)
            ])
        }
    }
end

Re: openhab rules zeitverzögerung

Verfasst: 25. Nov 2020 20:08
von steinadler
danke, geht
muss jetzt ersteinmal alles auseinander nehmen(deinen code), um es richtig zu verstehen
danke...

Re: openhab rules zeitverzögerung

Verfasst: 25. Nov 2020 21:28
von udo1toni
Immer gerne :)