openhab rules zeitverzögerung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
steinadler
Beiträge: 69
Registriert: 29. Apr 2020 19:15
Answers: 0

openhab rules zeitverzögerung

Beitrag 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...

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: openhab rules zeitverzögerung

Beitrag 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.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

steinadler
Beiträge: 69
Registriert: 29. Apr 2020 19:15
Answers: 0

Re: openhab rules zeitverzögerung

Beitrag 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...

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: openhab rules zeitverzögerung

Beitrag 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
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

steinadler
Beiträge: 69
Registriert: 29. Apr 2020 19:15
Answers: 0

Re: openhab rules zeitverzögerung

Beitrag von steinadler »

danke, geht
muss jetzt ersteinmal alles auseinander nehmen(deinen code), um es richtig zu verstehen
danke...

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: openhab rules zeitverzögerung

Beitrag von udo1toni »

Immer gerne :)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten