Einfache Regel mit Dummy Schalter (Abwesenheit Licht Simulation)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Einfache Regel mit Dummy Schalter (Abwesenheit Licht Simulation)

Beitrag von udo1toni »

Genau das ist der Ansatz. Die 14 Tage sind übrigens nicht fix, das ist nur Der Wert, der damals im Beispielcode verwendet wurde. Die Seite im Wiki: https://github.com/openhab/openhab1-add ... -Scheduler
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

calimero
Beiträge: 27
Registriert: 20. Dez 2019 07:17
Answers: 0

Re: Einfache Regel mit Dummy Schalter (Abwesenheit Licht Simulation)

Beitrag von calimero »

Hallo zusammen,

danke für euren Input.
ich hab mir das nun angesehen und finde das für mich nicht passend.

Im Prinzip möchte ich einfach 1 Licht jede Stunde für ca. 5 min Schalten lassen.

Ich werde mir mal eine Rule zusammenstellen und bei fragen an euch wenden :)

mfg
Pascal

calimero
Beiträge: 27
Registriert: 20. Dez 2019 07:17
Answers: 0

Re: Einfache Regel mit Dummy Schalter (Abwesenheit Licht Simulation)

Beitrag von calimero »

Hallo zusammen,

so nun habe ich mir einen Code zusammengestellt der für meine Bedürfnisse ausreicht.

Code: Alles auswählen

var Timer timer = null                                //Zeiger auf den Timer

rule "Anwesenheit Simulation"
when
    item Test_Switch received command                 //Befehl empfangen
then 
    timer?.cancel                                     //lösche Timer, falls einer existiert
    if(receivedCommand == ON)                         //Kommando AN
    timer = createTimer(now.plusMinutes(10), [ |      //Setze Timer auf 10 Minuten
        Licht_EG_Flur.sendCommand(ON)                 //Licht Schaltet sich nach 10 minuten ein
     ])
    else 
    timer?.cancel                                     //lösche Timer, falls einer existiert
    timer = createTimer(now.plusMinutes(5), [ |       //Setze Timer auf 5 Minuten
        Licht_EG_Flur.sendCommand(OFF)                //Licht Schaltet sich nach 5 minuten Aus
     ])   
end
Wie würde ich den Code nun ausbauen müssen damit diese Rule dann jede Stunde abgearbeitet wird?

Danke :)

mfg
Pascal

Benutzeravatar
peter-pan
Beiträge: 2769
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Einfache Regel mit Dummy Schalter (Abwesenheit Licht Simulation)

Beitrag von peter-pan »

Schau mal hier. Da kannst du dir deinen Cron-Trigger selbst zusammenstellen.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

calimero
Beiträge: 27
Registriert: 20. Dez 2019 07:17
Answers: 0

Re: Einfache Regel mit Dummy Schalter (Abwesenheit Licht Simulation)

Beitrag von calimero »

Hallo peter-pan,

danke für deine Antwort.

Das bedeutet ich muss nur im code einen Time Cron einfügen?
Der löst dann immer nach einer Stunde aus?

Code: Alles auswählen

item Test_Switch received command
Time cron "0 0 * ? * * *"
mfg
Pascal

Benutzeravatar
peter-pan
Beiträge: 2769
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Einfache Regel mit Dummy Schalter (Abwesenheit Licht Simulation)

Beitrag von peter-pan »

So sehe ich dass. Das hat es bei mir auch angezeigt. Ein Beispiel von Udo ist ja auch dabei. Deine Trigger sind jetzt Cron und der Test-Schalter. Bitte achte auf die Schreibweise(Gross-/Klein):

Code: Alles auswählen

Item Test_Switch received command or
Time cron "0 0 * ? * * *"
oder besser (falls der Schalter nicht bei ON und OFF schalten soll)

Code: Alles auswählen

Item Test_Switch received command ON or
Time cron "0 0 * ? * * *"
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

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

Re: Einfache Regel mit Dummy Schalter (Abwesenheit Licht Simulation)

Beitrag von udo1toni »

Deine Rule ist Quatsch ;)

Die Rule schaltet abhängig vom gesendeten Kommando entweder nach 10 Minuten das Licht ein oder nach 5 Minuten das Licht aus.
Was Du aber haben willst, ist eine Rule, die das Licht nach einer gewissen Zeit ein- und dann nach einer weiteren Zeitspanne wieder ausschaltet.
das sieht dann so aus:

Code: Alles auswählen

var Timer tLicht = null                               // Zeiger auf den Timer (mit sinnvollem Namen!)

rule "Anwesenheit Simulation"
when
    Item Test_Switch received command                 // Befehl empfangen
then 
    tLicht?.cancel                                    // lösche Timer, falls einer existiert
    tLicht = createTimer(now.plusMinutes(10), [ |     // Setze Timer auf 10 Minuten
        if(Licht_EG_Flur.state != ON) {               // Falls Licht nicht an
            Licht_EG_Flur.sendCommand(ON)             // einschalten
            tLicht.reschedule(now.plusMinutes(5))     // und Timer erneut aufrufen
        } else {                                      // Falls Licht an
            Licht_EG_Flur.sendCommand(OFF)            // ausschalten
        }
    ])
end
Die Rule startet den Timer, der das Licht einschaltet. Wenn der Timer das Licht einschaltet, plant er "sich selbst" erneut ein. Dann wird das Licht wieder ausgeschaltet.
In dieser Form kannst Du nun die Integer Werte 10 bzw. 5 auch mit Zufallswerten füllen, solange diese als Integer Werte zur Verfügung stehen. Mehr noch, Du kannst im "Ausschalt-Zweig" des Timers ebenfalls ein reschedule einbauen, so dass sich der Timer immer wieder neu startet und das Licht jeweils toggelt. Also so:

Code: Alles auswählen

var Timer tLicht = null                                                             // Zeiger auf den Timer (mit sinnvollem Namen!)

rule "Anwesenheit Simulation"
when
    Item Test_Switch received command                                               // Befehl empfangen
then 
    tLicht?.cancel                                                                  // lösche Timer, falls einer existiert
    if(receivedCommand == ON)                                                       // Nur falls Befehl ON war
        tLicht = createTimer(now.plusMinutes(Math::random * 10).intValue,  [ |      // Setze Timer auf 10 Minuten
            if(Licht_EG_Flur.state != ON) {                                         // Falls Licht nicht an
                Licht_EG_Flur.sendCommand(ON)                                       // einschalten
                tLicht.reschedule(now.plusMinutes(2+(Math::random * 5).intValue))   // und Timer erneut aufrufen
            } else {                                                                // Falls Licht an
                Licht_EG_Flur.sendCommand(OFF)                                      // ausschalten
                tLicht.reschedule(now.plusMinutes(55+(Math::random * 10).intValue)) // und Timer erneut aufrufen
            }
        ])
    else
        Licht_EG_Flur.sendCommand(OFF)                                              // ausschalten
end
Nun dient der Schalter als Start und Stop für die Zufallsbeleuchtung. Wird ein Befehl empfangen, wird ein laufender Timer gelöscht. Nur falls der Befehl ON empfangen wurde, wird der Timer angelegt und startet nach einer zufälligen Anzahl Minuten (0 bis 10) den Timer, das das Licht nun einachaltet, falls es aus war aund ausschaltet, falls es an war. Beim Einschalten wird der Timer mit 2 bis 7 Minuten neu geplant, beim Ausschalten wird der Timer mit 55 bis 65 Miunten neu geplant.

Du kannst die Rule auch abwandeln und per Timer steuern, dann allerdings gibt es kein receivedCommand, so dass Du nun zwei Rules brauchst, die eine startet den Timer, die andere löscht ihn nur (nicht vergessen, dass das Licht zu diesem Zeitpunkt eventuell auch an sein könnte, also genau wie in der 2. Rule das Licht mit auschalten...)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

calimero
Beiträge: 27
Registriert: 20. Dez 2019 07:17
Answers: 0

Re: Einfache Regel mit Dummy Schalter (Abwesenheit Licht Simulation)

Beitrag von calimero »

Hallo udo1toni,

wow super danke die Rule sieht Perfekt aus.
Schön langsam verstehe ich den Code.

Nur irgendwo muss sich ein Fehler eingeschlichen haben ich bekomme ein paar Fehler:

item = Item den habe ich schon gefunden.

Code: Alles auswählen

The method or field timer is undefined
Invalid number of arguments. The method createTimer(AbstractInstant, Procedure0) is not applicable for the arguments (Object)
Type mismatch: cannot convert from double to int
The method or field intValue is undefined for the type DateTime
mismatched input ',' expecting 'end'
Danke vorab für eure Unterstützung.

mfg
Pascal

Benutzeravatar
peter-pan
Beiträge: 2769
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Einfache Regel mit Dummy Schalter (Abwesenheit Licht Simulation)

Beitrag von peter-pan »

Ohne es gross geprüft zu haben. Verwende anstelle intValue -> longValue. Kann es sein, dass dein Item "Licht_EG_Flur" ein DateTime-Item ist ?. Ausserdem scheint die Syntax-Notation nicht ganz in Ordnung zu sein. Was mit dem Timer nicht in Ordnung ist, kann dir bestimmt Udo sagen.

Poste am besten nochmal deine Regel, wie sie jetzt aussieht.

Das mit der Gross-Kleinschreibung hast du ja schon gefunden (s.o.).
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: Einfache Regel mit Dummy Schalter (Abwesenheit Licht Simulation)

Beitrag von Darkwin101 »

Der Timer in dem Abschnitt ist falsch

Code: Alles auswählen

var Timer tLicht = null                                                             // Zeiger auf den Timer (mit sinnvollem Namen!)

rule "Anwesenheit Simulation"
when
    item Test_Switch received command                                               // Befehl empfangen
then 
    timer?.cancel 
Mach daraus

Code: Alles auswählen

var Timer tLicht = null                                                             // Zeiger auf den Timer (mit sinnvollem Namen!)

rule "Anwesenheit Simulation"
when
    item Test_Switch received command                                               // Befehl empfangen
then 
    tLicht?.cancel 

Antworten