Ankündigung

Einklappen
Keine Ankündigung bisher.

Openhab Rules PIR Sensor

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Openhab Rules PIR Sensor

    Hallo Zusammen
    Ich bin recht neu in diesem Forum. Ich habe mehrere Themen verfolgt und war recht begeistert.

    Ich habe mich angemeldet um euch um eure Hilfe zu bitten bzw eure Lösungen zu nutzen.

    Ich habe meine Wohnung nach und nach umgebaut. Raspberry als Computer und Openhab als System.
    Ich bin Elektroniker bzw angehender Techniker, deswegen kenne ich mich in der Automatisierung recht gut aus.
    Im Programmieren bin ich noch ein Anfänger, allerdings durch die ganze letzte Zeit und Aufwendung, habe ich mir ein wenig angeeignet.
    Allerdings hapert es bei der Programmiersprache bzw an meinen fehlenden Kenntnissen Regeln bzw Scripte zu erstellen.
    Sitemaps und Items sind kein Problem.

    Ich bin zur Zeit an einer Art Präsenzerkennung dran. Alles nach und Nach. Rom wurde auch nicht an einem Tag erbaut

    Beispiel:
    Ich habe in der Küche einen PIR Sensor, der direkt mit dem Rpi verbunden ist. Das Script dazu gibt alles an Openhab weiter und der Sensor wird erkannt und funktioniert sehr gut. Manuelle Abschaltung im GUI durch schalter möglich. Dann habe eine Regel dazu erstellt. Licht an bei Bewegung. sobald das licht an ist, wird ein Timer gesetzt (300sek), der bei jeder bewegung resettet wird. Wegen testzwecken runtergesetzt.
    Mein Problem ist. Sobald das Licht aus geht wird dies von dem Sensor erkannt und das Licht wieder eingeschaltet.

    Hier sind meine Regeln.
    Ich habe ein Problem bei der Regel: "Licht Küche Automatik aus"
    Wie kann ich denn 2 Aktionen ausführen lassen?
    Ich brauche noch einen sendCommant(Sensor_Flur1_sperre,ON)
    Mehrere Versuche haben nichts ergeben und es ging nicht aus.

    rule "Licht Automatik start Küche"
    when
    System started
    then
    sendCommand(Sensor_Flur1_sperre, OFF)


    rule "Bewegeung in der Küche Automatik an"
    when
    Item Sensor_Flur1 received update ON
    then
    if(FlurBewegung1.state == ON && Licht1_Wohnung_Kueche.state == OFF && Sensor_Flur1_sperre.state == OFF) {
    logInfo("Regel Bewegungungsautomatik Licht", "Licht an")
    sendCommand(Licht1_Wohnung_Kueche, ON)}
    end

    rule "Licht Küche Automatik aus"
    when
    Item Licht1_Wohnung_Kueche received command ON
    then
    if(Licht1_Wohnung_Kueche.state == ON && FlurBewegung1.state == ON) {
    timer = createTimer(now.plusSeconds(15)) [
    sendCommand(Licht1_Wohnung_Kueche, OFF)] }
    end

    rule "Licht Küche Automatik Sperre"
    when
    if(Sensor_Flur1_sperre.state == ON) {

    timer = createTimer(now.plusSeconds(5)) [

    sendCommand(Sensor_Flur1_sperre, OFF)] }
    end

    1. Wie füge ich den sendCommant(Sensor_Flur1_sperre,ON) in der 3ten Regel ein damit es sich nciht neu einschaltet sondern erst bei der nächsten bewegung?
    2. Gibt es vielleicht eine leichtere Methode?
    3. Kann man eine UND-Funktion in die "when" Funktion einbauen?

    Ich habe meine ITEMS Datei mit eingebracht.
    Es geht vorerst nur um die Regel für die Küche/Flur.
    DIe anderen Zimmer kommen dann im Laufe der Tage wenn diese funktioniert.
    Vielen Dank jetzt schon mal.

    Gruß
    Daniel Smith


    Angehängte Dateien

    #2
    Also, um das Ganze von hinten aufzuzäumen,

    zu 3.: Nein, das geht nicht, das liegt an der asynchronen Struktur von openHAB. Der When-Teil einer Rule beinhaltet den/die Trigger, über die die Rule gestartet wird. Hätte man dort eine und-Verknüpfung, müssten zwei Ereignisse exakt gleichzeitig eintreten, um die Rule zu triggern. Macht aber nichts, denn Bedingungen wie bestimmte Zustände lassen sich ja leicht mit einer if-Abfrage einbauen (hast Du ja schon gemacht).

    zu 2.: auszuschließen ist das nicht...

    zu 1.: Deine Rule "Licht Küche Automatik Sperre" ist so nicht lauffähig (kein korrekter Trigger usw.), aber auch unnötig. Ich schlage folgendes vor (ich gehe davon aus, dass die Sperre ausschließlich dazu dient, ein retrigger zu verhindern):

    Code:
    var Timer timer1 = null
    var Timer timer2 = null
    
    rule "Licht Küche Automatik"
    when
        Item Sensor_Flur1 received update ON
    then
        if(FlurBewegung1.state == ON && timer2 == null) {
            if (Licht1_Wohnung_Kueche.state == OFF) {
                logInfo("LichtAutomatik", "Licht an")
                Licht1_Wohnung_Kueche.sendCommand(ON)
            }
            if (timer1 != null) {
                timer1.cancel
               timer1 = null
            }
            timer1 = createTimer(now.plusSeconds(15), [|
                timer2 = createTimer(now.plusMillis(750), [|
                   timer2 = null
                   logInfo("LichtAutomatik", "Totzeit Ende")
                ])
                Licht1_Wohnung_Kueche.sendCommand(OFF)
                logInfo("LichtAutomatik", "Licht aus")
                timer1 = null
            ])
        }
    end
    Im Einzelnen: Wenn Sensor_Flur1 eine Bewegung registriert, wird die Rule gestartet. Ist zu diesem Zeitpunkt FlurBewegung1 != ON oder der timer2 gestartet, wird die Rule sofort beendet.
    Sind die Bedingungen erfüllt, wird überprüft, ob das Licht in der Küche aus ist. Ist dies der Fall, wird das Licht eingeschaltet.
    Anschließend wird überprüft, ob der Ausschalttimer läuft. Ist dies der Fall, wird er gelöscht.
    Anschließend wird der Ausschalttimer erzeugt und gestartet.
    Falls vor Ablauf des Timers eine neue Bewegung registriert wird, wird der Timer also von derselben Rule gelöscht und neu angelegt.
    Falls der Timer jedoch abläuft, ohne dass erneut eine Bewegung registriert wurde, wird ein zweiter Timer gestartet und das Licht ausgeschaltet.
    Da das Licht nur eingeschaltet wird, falls dieser 2. Timer nicht läuft, wird der Fehl-Trigger unterdrückt.

    Die logInfo-Zeilen sind natürlich vor allem für's Testen interessant und können gelöscht werden, wenn alles wie gedacht läuft. Der wichtigste Knackpunkt dürfte die benötigte Totzeit sein, da kommt es sehr auf die verbaute Hardware an, grundsätzlich sollte das Totzeitfenster aber wohl so klein wie möglich sein, deswegen hier mal 0,75 Sekunden, bei Bedarf kann die Totzeit natürlich beliebig verlängert werden.

    Es sei noch erwähnt, dass ich nicht sicher bin, ob die timer explizit deinitialisiert werden müssen, aber da dieser Zustand ja abgefragt wird, ist das die sicherste Methode.

    Kommentar

    Lädt...
    X