Eine Rule mit Items Abfragen und Astro Steuerung

Allgemeine Fragen zum Thema "Smart Home" und Entscheidungshilfen

Moderator: seppy

Antworten
Benutzeravatar
Detlef
Beiträge: 202
Registriert: 11. Dez 2019 21:50
Answers: 1
Wohnort: Recklinghausen
Kontaktdaten:

Eine Rule mit Items Abfragen und Astro Steuerung

Beitrag von Detlef »

Hallo
ich bin noch recht neu in Openhab 2.5.3.
Also ich wollte eine Schaltung die bei einschalten der Alarmanlage
einige Items Bedingungen auslöst. Das funktioniert sogar.

Frage 1
Ich benötige aber noch die Befehle die bei "Dunkelheit Licht an schalten" . Also die Rule soll das Item "garten Licht,Terrassen Licht und Teddy Bär Licht" bei Aktivierung der Alarmanlage ES einschalten bei Dunkelheit. Also die Items habe ich ja alle auf den System.
Frage 2
Ist es schädlich für Openhab, wenn man einfache Regel schreibt und einstellt.
Ist ein Dateneingang /Änderung von 30 Eingänge in der Log. pro Minute ein Problem für Openhab? Oder für den PI?

Würde mich freuen, wenn man eine Antwort bekommt.


Code: Alles auswählen

rule "Alles Runterfahren  und absichern zum Gassi gehen"
when 
         Item EG_Stairwell_AlarmES  received command ON
 
then
         sendCommand (DB_Boiler_Zirkoleitung, OFF) 
         Thread::sleep(3000)
         sendCommand (EG_LivingDining_Kamera, ON)
         Thread::sleep(3000)
         Doris_Bad_Temperatur_Soll_Setpoint.postUpdate(18.0)
         Thread::sleep(3000)
         EG_Stairwell_Heating.postUpdate(17.0)
                                                        
         if (Astro_Sunrise_SU.state == ON)
                
                 (OU_Terrace_Light_Wand.sendCommand(ON))
                 
 
                                                         // Thread::sleep(3000)
                                                         // OU_Terrace_Light_Wand .sendCommand(ON)
                                                          // Thread::sleep(3000)
                                                          // OU_Terrace_Light_Garden.sendCommand(ON)        
end
Mit freundlichen Grüssen
Detlef
Mit freundlichen Grüße aus Recklinghausen

ibot1989
Beiträge: 99
Registriert: 30. Jul 2016 19:51
Answers: 0
Wohnort: östlich von Hamburg, südlich von Lübeck, nördlich von Geesthacht

Re: Eine Rule mit Items Abfragen und Astro Steuerung

Beitrag von ibot1989 »

Detlef hat geschrieben: 27. Apr 2020 19:46 Hallo
ich bin noch recht neu in Openhab 2.5.3.
Willkommen und viel Spaß.
Also ich wollte eine Schaltung die bei einschalten der Alarmanlage
einige Items Bedingungen auslöst. Das funktioniert sogar.
Klingt nach einer typischen Anwendung, schön daß es grundsätzlich schon funktioniert.
Frage 1
Ich benötige aber noch die Befehle die bei "Dunkelheit Licht an schalten" . Also die Rule soll das Item "garten Licht,Terrassen Licht und Teddy Bär Licht" bei Aktivierung der Alarmanlage ES einschalten bei Dunkelheit. Also die Items habe ich ja alle auf den System.
Mit deiner Rule bist du doch schon auf dem richtigen Wege, wie kann man dir hier noch helfen?
Frage 2
Ist es schädlich für Openhab, wenn man einfache Regel schreibt und einstellt.
Ist ein Dateneingang /Änderung von 30 Eingänge in der Log. pro Minute ein Problem für Openhab? Oder für den PI?
Schädlich nicht, es ist sicherlich eine Frage der Performance, aber wirklich viel Leistung Brauch das nicht. Wenn du ganz viele solcher Rules hast und die alle Minute getriggert werden, solltest du einfach Mal auf die Auslastung deines OpenHAB Servers gucken.

Was du bei einem PI nur berücksichtigen solltest, die Logs werden auf die SD Karte geschrieben, SD Karten sind nicht dafür ausgelegt durchgehend und dauerha beschrieben zu werden. Die wird früher oder später dadurch kaputt gehen. Aber auch dafür gibt es Lösungen, z.B. die Nutzung eines tempfs mit zyklischen Sicherung auf einen USB Stick oder noch besser auf eine drehende Festplatte oder NAS.
Würde mich freuen, wenn man eine Antwort bekommt.
Bitte

Code: Alles auswählen

rule "Alles Runterfahren  und absichern zum Gassi gehen"
when 
         Item EG_Stairwell_AlarmES  received command ON
 
then
         sendCommand (DB_Boiler_Zirkoleitung, OFF) 
         Thread::sleep(3000)
         sendCommand (EG_LivingDining_Kamera, ON)
         Thread::sleep(3000)
         Doris_Bad_Temperatur_Soll_Setpoint.postUpdate(18.0)
         Thread::sleep(3000)
         EG_Stairwell_Heating.postUpdate(17.0)
                                                        
         if (Astro_Sunrise_SU.state == ON)
                
                 (OU_Terrace_Light_Wand.sendCommand(ON))
                 
 
                                                         // Thread::sleep(3000)
                                                         // OU_Terrace_Light_Wand .sendCommand(ON)
                                                          // Thread::sleep(3000)
                                                          // OU_Terrace_Light_Garden.sendCommand(ON)        
end
Mit freundlichen Grüssen
Detlef
Gruß iBot

Benutzeravatar
Detlef
Beiträge: 202
Registriert: 11. Dez 2019 21:50
Answers: 1
Wohnort: Recklinghausen
Kontaktdaten:

Re: Eine Rule mit Items Abfragen und Astro Steuerung

Beitrag von Detlef »

Hallo und Danke.
Dann weitermachen!
Mit freundlichen Grüße aus Recklinghausen

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

Re: Eine Rule mit Items Abfragen und Astro Steuerung

Beitrag von udo1toni »

Ich muss da mal kurz etwas ausbremsen ;)

Du nutzt in Deiner Rule exzessiv Thread::sleep(), das ist aus verschiedenen Gründen keine gute Idee.

Es gibt allerdings auch gar keinen Grund für diese Schaltpausen, es sei denn, Du möchtest sie unbedingt haben.

Also Variante ohne Pause:

Code: Alles auswählen

rule "Alles Runterfahren und absichern zum Gassi gehen"
when 
    Item EG_Stairwell_AlarmES received command ON
then
    DB_Boiler_Zirkoleitung.sendCommand(OFF) 
    EG_LivingDining_Kamera.sendCommand(ON)
    Doris_Bad_Temperatur_Soll_Setpoint.postUpdate(18)
    EG_Stairwell_Heating.postUpdate(17)
    if(Astro_Sunrise_SU.state == ON) {
        OU_Terrace_Light_Wand.sendCommand(ON)
        OU_Terrace_Light_Garden.sendCommand(ON)
    }
end
Und hier eine saubere Variante mit Pause. Die Rule erzeugt einen Timer, welcher fast unmittelbar gestartet wird. Im Timer wird eine Integer Variabe hochgezählt und in Abhängigkeit vom Zählerstand ein Befehl ausgeführt. Anschließend plant sich der Timer erneut in 3 Sekunden Abstand. Dabei wird hier berücksichtigt, ob Astro_Sunrise_SU nun gerade ON oder nicht ON ist. damit würden dann die beiden letzten Befehle nicht mehr ausgeführt, falls die Bedingung nicht erfüllt ist.

Code: Alles auswählen

// globale Variablen zu Beginn der Datei definieren!
var Timer tGassi = null
var int iGassi = 0

rule "Alles Runterfahren und absichern zum Gassi gehen"
when 
    Item EG_Stairwell_AlarmES received command ON
then
    tGassi?.cancel
    iGassi = 0
    tGassi = createTimer(Now.plusMillis(10),[|
		iGassi ++
		select (iGassi) {
			case 1: DB_Boiler_Zirkoleitung.sendCommand(OFF) 
			case 2: EG_LivingDining_Kamera.sendCommand(ON)
			case 3: Doris_Bad_Temperatur_Soll_Setpoint.postUpdate(18)
			case 4: EG_Stairwell_Heating.postUpdate(17)
			case 5: OU_Terrace_Light_Wand.sendCommand(ON)
			case 6: OU_Terrace_Light_Garden.sendCommand(ON)
		}
		if((Astro_Sunrise_SU.state != ON && iGassi < 4) || (Astro_Sunrise_SU.state == ON && iGassi < 6))
			tGassie.reschedule(now.plusSeconds(3))
	])
end
Der Unterschied zur Variante mit Thread::sleep() besteht vor allem darin, dass Thread::sleep() tatsächlich genau das macht: Es lässt den Thread schlafen. Das tut er also insgesamt 5 mal, also 15 Sekunden. In dieser Zeit steht ein Thread weniger zum Ausführen von Rules zur Verfügung, was auf umfangreicheren Systemen mit mehr als nur ein oder zwei Regeln zu Engpässen führen kann. Der Timer belegt nur zum Zeitpunkt der Ausführung einen Thread, das sind also pro Befehl nur wenige Millisekunden.

Ein weiteres Problem, welches von Anfängern (und auch von alten Hasen) gerne übersehen wird, ist die Möglichkeit, dass eine Rule innerhalb von Sekundenbruchteilen mehrfach getriggert wird. Rules mit langen Laufzeiten können so durchaus mehrfach parallel laufen und sich eventuell sogar selbst in die Quere kommen. Mit einem Timer (so wie im Code gezeigt!) kann das nicht passieren. Der Code läuft exakt einmal (eventuell wird er mehrfach gestartet, aber jeder neue Start entfernt sofort den alten Timer).
openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)

Benutzeravatar
Detlef
Beiträge: 202
Registriert: 11. Dez 2019 21:50
Answers: 1
Wohnort: Recklinghausen
Kontaktdaten:

Re: Eine Rule mit Items Abfragen und Astro Steuerung

Beitrag von Detlef »

Hallo und Danke.
Da werde ich mich mal in den neuen Thema einarbeiten.
Ich habe den Pausen-Befehl bei meiner Rollo-Steuerung natürlich auch übernommen. Das muss ich jetzt ändern.
Die Pausen bei der 433 MHZ geräte sind ja schon nötig. Geschaltet werden Intertechno 433 MHZ Rolladen mit ON und OFF und den "icon Rollershutter mit eine Rules".

Habe mein Rollo-Sonnenschutz-Schaltung zum Glück noch nicht fertig. Bei der Sonnenschutz-Schaltung sind gerate genaue Einheitsintervalle nötig sein damit der Sonnenschutz und teilweises "Rollo runter fahren" funktioniert.
Nur die Schaltung Rollo mit " Astro rauf und runter" die ich hier mal anhänge werde ich abänder.

Also Thread::sleep (5000) nicht benutzen.

rule "Rollo Garagenhof_Küche bis TV Schließen Sonnenuntergang Astro Plus Zeit"
when

Channel"astro:sun:local:set#event"triggered START

then
createTimer(now.plusMinutes(10))
[|
sendCommand (EG_Kitchen_ShutterRe, ON)
Thread::sleep (5000)
sendCommand (EG_LivingDining_ShutterTV, ON)
Thread::sleep (5000)
sendCommand (EG_LivingDining_Shutter_EL, ON)
Thread::sleep(5000)
sendCommand (EG_LivingDining_Shutter_ER, ON)
Thread::sleep(5000)
sendCommand (EG_Kitchen_ShutterLi, ON)
Thread::sleep(5000)
sendCommand (OG1_Bedroom_ShutterMI, ON)
Thread::sleep(5000)
sendCommand (OG1_Bedroom_ShutterBA, ON)
Thread::sleep(5000)
sendCommand (OG1_LaundryRoom_ShutterWL, ON)
Thread::sleep(5000)
sendCommand (OG1_LaundryRoom_ShutterWR, ON)

]

end


rule "Rollo Garagenhof Küche bis TV Sonnenaufgang plus Zeit"

when

Channel "astro:sun:local:rise#event" triggered START

then
createTimer(now.plusMinutes(25))
[|
sendCommand (EG_Kitchen_ShutterRe, OFF)
Thread::sleep (8000)
sendCommand (EG_LivingDining_ShutterTV, OFF)
Thread::sleep (8000)
sendCommand (EG_LivingDining_Shutter_EL, OFF)
Thread::sleep(8000)
sendCommand (EG_LivingDining_Shutter_ER, OFF)
Thread::sleep(5000)
sendCommand (EG_Kitchen_ShutterLi, OFF)
Thread::sleep(5000)
sendCommand (OG1_Bedroom_ShutterMI, OFF)
Thread::sleep(5000)
sendCommand (OG1_Bedroom_ShutterBA, OFF)
Thread::sleep(5000)
sendCommand (OG1_LaundryRoom_ShutterWL, OFF)
Thread::sleep(5000)
sendCommand (OG1_LaundryRoom_ShutterWR, OFF)

]
end


rule "Rollo Sofa Runter "

when
Channel "astro:sun:local:set#event" triggered START

then
createTimer(now.plusMinutes(50))
[|
sendCommand (EG_LivingDining_ShutterSo ,ON)
]
end

rule "Rollo Sofa Auf"

when
Channel "astro:sun:local:set#event" triggered START
then
createTimer(now.plusMinutes(1))
[|
sendCommand (EG_LivingDining_ShutterSo ,OFF)
]
end
Mit freundlichen Grüße aus Recklinghausen

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

Re: Eine Rule mit Items Abfragen und Astro Steuerung

Beitrag von udo1toni »

Detlef hat geschrieben: 30. Apr 2020 13:24 Bei der Sonnenschutz-Schaltung sind gerate genaue Einheitsintervalle nötig damit der Sonnenschutz und teilweises "Rollo runter fahren"
openHAB arbeitet asynchron, da gibt es keine genauen Zeitabläufe :) Allenfalls kannst Du von gleichen Größenordnungen ausgehen.

Ein Item.sendCommand() wird über einen eigenen Thread ausgeführt, es gibt keinerlei Garantie wie lange der Befehl zur Abarbeitung braucht. Das ist auch logisch, denn ein Gutteil der Zeit ist vom dahinter hängenden System abhängig. Du kannst Dich also nicht darauf verlassen, dass diese Befehlsfolge:

Code: Alles auswählen

Item.sendCommand(ON)
Thread::sleep(3000)
Item.sendCommand(OFF)
tatsächlich reproduzierbar zu exakt 3 Sekunden Einschaltzeit führt, allenfalls wird es sich reproduzierbar in der Größenordnung bewegen, also einmal vielleicht 2,95 Sekunden, ein anderes mal 3,07 Sekunden...
Wenn Du das ganze mit einem Timer programmierst, ist es exakt das gleiche Verhalten, der einzige Unterschied besteht darin, dass das System mit Thread::sleep() wesentlich länger ausgelastet ist als mit createTimer()

Im Übrigen finde ich, wäre das einen Issue wert. Es kann doch nicht sein, dass der Anwender sich um das Timing selbst kümmern muss!
Um ehrlich zu sein, gibt es ein ähnliches Problem bei der Anbindung von knx, es hat sich aber herausgestellt, dass es auf die zugrundeliegende Library zurückzuführen ist. Das Problem ist in einer aktuellen Version von Calimero gefixt, und es ist davon auszugehen, dass knx2 früher oder später diesen Fix auch erhält.
Im Gegensatz zu 433 MHz gibt es bei knx aber nur unter bestimmten Konstellationen überhaupt Probleme, das ist also lange Zeit gar nicht aufgefallen, knx kann allgemein ca. 40 Befehle/s verarbeiten (reine Schaltbefehle) und wenn man openHAB auf einer langsamen Plattform betreibt (z.B. Pi2), dann schafft openHAB es nicht, den Bus an seine Grenzen zu bringen.

Die Timer für das Verschieben der Schaltzeitpunkte sind übrigens nicht nötig. Zum einen kannst Du andere Trigger verwenden (bürgerliche Dämmerung z.B.), zum anderen kannst Du auch einen beliebigen Offset an den Trigger binden, also z.B. 13 Minuten vor Sonnenaufgang oder 27 Minuten Nach bürgerlicher Dämmerung, oder, oder...
Außerdem kannst Du noch Ober- und Untergrenzen definieren, also z.B. Läden öffnen 7 Minuten vor Sonnenaufgang, aber frühestens um 5:30 Uhr und spätestens um 8:30 Uhr. das kannst Du direkt im entsprechenden Channel einstellen.
openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)

Benutzeravatar
Detlef
Beiträge: 202
Registriert: 11. Dez 2019 21:50
Answers: 1
Wohnort: Recklinghausen
Kontaktdaten:

Re: Eine Rule mit Items Abfragen und Astro Steuerung

Beitrag von Detlef »

Hallo,

habe die ersten Rules geändert und habe die OpenHab "interne Bremse" "Thread::sleep(3000)" ausgeschlossen.
Ohne die Zeitverzögerung in der Rules lüft OpenHab gefühlt viel besser und es gibt keine Fehlermeldungen. Alle Rollos machen genau das was vorgegeben ist.
Danke .
Mit freundlichen Grüße aus Recklinghausen

Antworten