openhab rules zeitverzögerung
-
- Beiträge: 69
- Registriert: 29. Apr 2020 19:15
openhab rules zeitverzögerung
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...
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...
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: openhab rules zeitverzögerung
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:
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.

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

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
-
- Beiträge: 69
- Registriert: 29. Apr 2020 19:15
Re: openhab rules zeitverzögerung
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"]
Danke...
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: openhab rules zeitverzögerung
Easy-peasy 
So muss das aussehen:
Wie oben erwähnt ist das postUpdate zum Schluss der Rule unsinnig.
Bessere Variante:
Einen Channel für das Flurlicht anlegen:
dazu ein Item:
und dann in der Rule das publish("broker", "cmnd/Flur/POWER",) durch ein Flurlicht.sendCommand() ersetzen:

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
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" ]
}
Code: Alles auswählen
Switch Flurlicht "Flurlicht" {channel="mqtt:topic:b8fd5e5c:Sonoff_Flur:ch1"}
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
-
- Beiträge: 69
- Registriert: 29. Apr 2020 19:15
Re: openhab rules zeitverzögerung
danke, geht
muss jetzt ersteinmal alles auseinander nehmen(deinen code), um es richtig zu verstehen
danke...
muss jetzt ersteinmal alles auseinander nehmen(deinen code), um es richtig zu verstehen
danke...
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: openhab rules zeitverzögerung
Immer gerne 

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