Seite 1 von 5

[Gelöst] Rule für Bewegungsmelder Schaltung ?

Verfasst: 5. Jan 2020 21:34
von Steinspiel
Moin,

Ich habe versucht meine erste Regel zu erstellen um meinen Hue Bewegungsmelder eine Tradfri Lampe schalten zu lassen.

Bewegungsmelder und Lampe kann ich in PAPER UI sehen und sie funktionieren einzelnd auch.
Das EXPIRE BINDING welches ich installiert habe ist in "/paperui/index.html#/configuration/bindings" NICHT aufgeführt aber in "/paperui/index.html#/extensions?tab=binding" ist es als "installiert" blau gekennzeichnet. Auch schaltet sich die "Lampe" nach 10s wieder aus. Meine *.ITERMS scheint soweit in Ordnung zu sein.

Code: Alles auswählen

Switch   Lampe          "An"                           { channel="tradfri:0220:gwa0c9a0d9fcef:65538:brightness", expire="10s,command=OFF"}
Switch   Hue_Bew_Mel    "Bewegung"                     { channel="hue:0107:ecb5fa0599f8:2:presence"}
Es liegt wohl an der *.RULES Datei, denn zu dieser werden mit in "VS Code" Fehler angezeigt zu denen ich Hilfe bräuchte, denn damit kann ich noch nicht viel anfangen...
Aufgefallen ist mir das in der Fehlermeldung oben "\etc\openhab2\rules" steht aber der Raspberry ist als Netzwerk-LW "Z:\" eingebunden.
Kann es *daran* liegen das die Rules nicht greifen oder muss ich die noch irgendwie in PAPER UI gesondert einfügen? Bisher habe ich die *.RULES nur in das \rules Verzeichniss gelegt, mehr nicht.

Code: Alles auswählen

rule "Bewegungsmelder"

    when
        Item Hue_Bew_Mel to ON
    then
        if{

            Lampe
            
        }
        end
Wäre schön wenn jemand einen Hinweis oder gar eine Anleitung für mich hätte, ich hoffe an den Screenshots kann man einiges erkennen.
einen schönen Sonntagabend noch...

Bild

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 5. Jan 2020 21:42
von lukh
Probiere mal

Code: Alles auswählen

 rule "Bewegungsmelder"

    when
        Item Hue_Bew_Mel changed
    then
       sendCommand(Lampe, ON)
        end

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 5. Jan 2020 22:06
von Steinspiel
Funktioniert auf Anhieb, Danke!

Das wars, so "einfach" ist das ganze?
Oder "muss" man am Bewegungsmelder noch irgendwas konfigurieren wie "Resetten" o.ä. ?

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 5. Jan 2020 22:15
von lukh
Meine Bewegungsmelder schalten sich nach einer bestimmten Zeit wieder auf OFF.
Ich denke, da musst du nichts resetten.
Schau mal ins event.log dort kannst Du Live verfolgen, was deine Items so machen.

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 6. Jan 2020 00:15
von udo1toni
Also, die Rule schaltet die Lampe natürlich nur ein, nicht aus.
Die Frage wäre also, wie soll die Lampe wieder ausgeschaltet werden. Per Zeit? Per "keine Bewegung erkannt" Befehl? Es kommt darauf an, was der Bewegungsmelder unterstützt, es gibt solche, die ausschließlich ein ON senden, und andere, die auch ein OFF schicken, wenn eine gewisse Zeit keine Bewegung erkannt wurde.
Variante mit beiden Signalen:

Code: Alles auswählen

rule "Bewegungsmelder"
when
    Item Hue_Bew_Mel received command
then
    Lampe.sendCommand(receivedCommand)
end
Im Zweifel muss eventuell der Timeout im Bewegungsmelder eingestellt werden (vermutlich nicht über openHAB, sondern über die hue App)

Ansonsten kann man auf Zeit ausschalten, wahlweise mit dem expire Binding (allerdings leider nur mit einem festen Timeout), oder mit einer anderen Rule:

Code: Alles auswählen

// globale Variablen zu Beginn der *.rules Datei definieren!
var Timer tBewegung = null                            // Timervariable global definieren

rule "Bewegungsmelder mit timeout"
when
    Item Hue_Bew_Mel received command ON              // Bewegung wurde erkannt
then
    tBewegung?.cancel                                 // zunächst eventuell laufende Timer entfernen
    if(Lampe.state != ON) Lampe.sendCommand(ON)       // Licht einschalten, falls noch nicht an.
    tBewegung = createTimer(now.plusSeconds(45), [ |  // Timer anlegen
        if(Lampe.state != OFF) Lampe.sendCommand(OFF) // Licht ausschalten, falls noch nicht aus
        tBewegung = null                              // Timervariable deinitialisieren
    ])
end
Im Unterschied zum expire Binding kann der timeout variabel gestaltet werden, wenn man statt einer konkreten Zahl (im Beispiel 45) eine Variable oder auch den Status eines Number Items verwendet (Man sollte dann natürlich zunächst prüfen, dass der konkrete Wert vom Typ Integer und größer 0 ist...)

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 6. Jan 2020 22:18
von Steinspiel
Moin,

Danke für Deinen weiterführenden Hinweis. Dein erstes "rule Bewegungsmelder" hat bei mir nicht funktioniert. Aber das mit dem timeout gefällt mir viel besser!

Ich musste

Code: Alles auswählen

Item Hue_Bew_Mel received command ON
auf

Code: Alles auswählen

Item Hue_Bew_Mel changed
ändern, dann funktionierte es: der timeout ließ sich verstellen, ich brauche das Expire Binding nicht mehr... Alles Super!

Vielleicht kannst Du mir noch etwas helfen: mein Bewegungsmelder soll letztendlich Mo-Fr

-zwischen 20:00 und 04:00 UHR Lampe_A für 30 sec einschalten,
-zwischen 04:00 und 14:00 UHR inaktiv sein
-zwischen 14:00 und 20:00 UHR Lampe_A und Lampe_B nur einmal einschalten

Ich weiß es ist ne ganze Menge und wenn wir erst einmal eines meiner Probleme lösen reicht mir das auch schon, aber etwas Starthilfe könnte ich gut gebrauchen.

Wie ich gelesen habe kann man "Cron" Verwenden und

Code: Alles auswählen

Time cron 0 0 20 ? * MON-FRI
bedeutet z.B. "um 20:00 UHR, Montag bis Freitag". Diese Zeile würde ich dann in den Rules unter "when" einsetzten, nur wie definiere ich "von 22:00 bis 04:00 UHR" ?

Oder ist der Weg den ich mir ausgedacht habe Quatsch?

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 6. Jan 2020 22:57
von KellerK1nd
Bau dir am besten ein Dummyitem:

Code: Alles auswählen

Number OffsetBewegungsmelder
In einer Regel definierst du die Zustände des Items nach deinen Zeitvorgaben:

Code: Alles auswählen

rule "Offset ab 4 Uhr"
when
        Time cron "0 0 4 ? * MON-FRI"    //Zeitschaltpunkt MO - FRI 4:00 Uhr
then
        OffsetBewegungsmelder.sendCommand(0)
end
Diese Regel dient als simple Zeitschaltuhr, jetzt als Beispiel für 4 Uhr von Mo - Fri, zum Zeitschaltpunkt vergibt die Regel dem Dummyitem einen Wert. Für jeden Zeitschaltpunkt vergibst du dem Item einen neuen Wert. In deiner Bewegungsmelderregel fragst du diesen Wert ab und definierst für den jeweiligen Wert deinen gewünschten Ablauf:

Code: Alles auswählen


// globale Variablen zu Beginn der *.rules Datei definieren!
var Timer tBewegung = null                            // Timervariable global definieren

rule "Bewegungsmelder mit timeout"
when
    Item Hue_Bew_Mel received command ON              // Bewegung wurde erkannt
then
if(Offsetbewegungsmelder.state  == 0){        //Offsetitem wird hier abgefragt, in dem Fall Schaltzustand 0
    tBewegung?.cancel                                 // zunächst eventuell laufende Timer entfernen
    if(Lampe.state != OFF) Lampe.sendCommand(OFF)       // Licht ausschalten, falls vor 4 Uhr noch an war.
}
if(Offsetbewegungsmelder.state  == 1){        //Offsetitem wird hier abgefragt, in dem Fall Schaltzustand 1
    tBewegung?.cancel                                 // zunächst eventuell laufende Timer entfernen
    if(Lampe.state != ON) Lampe.sendCommand(ON)       // Licht einschalten, falls noch nicht an.
    tBewegung = createTimer(now.plusSeconds(45), [ |  // Timer anlegen
        if(Lampe.state != OFF) Lampe.sendCommand(OFF) // Licht ausschalten, falls noch nicht aus
        tBewegung = null                              // Timervariable deinitialisieren
    ])
}

…usw.
end
So würde ich das machen, aber Udo kennt bestimmt noch einfachere Varianten. 😉

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 7. Jan 2020 22:40
von Steinspiel
Moin,

Danke für Deine Hilfe. Leider funktioniert der Code bei mir noch nicht und so ganz verstanden habe ich es auch noch nicht. Aber ich versuche es: ;-)

Zuerst:
- der Bewegungsmelder funktioniert (in PAPER UI zeigt bei Bewegung der entsprechende Schalter an)
- die Lampe funktioniert (kann ich in PAPER UI schalten)
- die Bezeichnung von Bewegungsmelder und Lampe habe ich auf meine tatsächlichen Bezeichnungen geändert:
Hue_Bew_Mel <-> MotionSensorPresence
Lampe <-> Lampe_Power
- diese, wie alle anderen Bezeichnungen im Code habe ich mit der VS Code "DropDown Vorschau" (oder wie heißt das?) eingefügt, so das alle richtig geschrieben sind (auch "OffsetBewegungsmelder" mit großem statt kleinem "B" wie in dem Dummy Items)

Ich habe dann die "dummy_1.items" angelegt,
eine "BM_v3_offset.rules" mit "Offset ab 4 Uhr" Regel
eine BM_v3_zeitschalt.rules mit "// globale Variablen zu Beginn der...* Regel

Alle drei Dateien werden in VS Code *ohne* Fehler angezeigt. Löse ich mit der Hand den Bewegungsmelder aus, zeigt mir das Log folgendes an:

Code: Alles auswählen

2020-01-07 22:16:01.394 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'BM_v3_offset.rules'

2020-01-07 22:16:02.533 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'BM_v3_offset.rules'

2020-01-07 22:16:06.462 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'BM_v3_zeitschalt.rules'

2020-01-07 22:16:07.873 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'BM_v3_zeitschalt.rules'

2020-01-07 22:16:34.305 [vent.ItemStateChangedEvent] - MotionSensorPresence changed from OFF to ON

2020-01-07 22:16:34.322 [vent.ItemStateChangedEvent] - MotionSensorLastUpdate changed from 2020-01-07T22:15:58.000+0100 to 2020-01-07T22:16:34.000+0100

2020-01-07 22:16:34.339 [vent.ItemStateChangedEvent] - Lichtstaerke changed from 29.42388401724648 lx to 4.298332425215651 lx

2020-01-07 22:16:39.483 [vent.ItemStateChangedEvent] - Lichtstaerke changed from 4.298332425215651 lx to 29.42388401724648 lx

2020-01-07 22:16:44.639 [vent.ItemStateChangedEvent] - MotionSensorPresence changed from ON to OFF
Wobei mit "Lichtstaerke" die "Illuminance" im Bewegungsmelder gemeint ist. Nur scheint da gar nichts mit meiner Lampe zu passieren ...
Schalte ich die Lampe von Hand erscheint im Log:

Code: Alles auswählen

2020-01-07 22:30:43.924 [ome.event.ItemCommandEvent] - Item 'Lampe_Power' received command ON

2020-01-07 22:30:43.950 [nt.ItemStatePredictedEvent] - Lampe_Power predicted to become ON

2020-01-07 22:30:43.968 [vent.ItemStateChangedEvent] - Lampe_Power changed from OFF to ON

2020-01-07 22:30:44.014 [vent.ItemStateChangedEvent] - Lampe_Dimmen changed from 0 to 47
Weißt Du wo mein Fehler liegen könnte? Oder werden die Rules nur in eine Datei geschrieben?

schönen Abend noch...

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 8. Jan 2020 20:55
von Steinspiel
Moin,

Ich bin nun alles noch einmal durchgegangen, habe alle ITEMS, RULES usw deaktiviert damit nur Bewegungsmelder + Lampe online sind und auch nichts anderes im Log erscheint.
Vieleicht kann da jemand beim Verstehen helfen ?

Item Datei "BM_dummy.items"

Code: Alles auswählen

Number OffsetBewegungsmelder
erste Rules Datei "BM_offset.rules"

Code: Alles auswählen

rule "Offset ab 4 Uhr"
when
        Time cron "* * 4 ? * MON-FRI"    //Zeitschaltpunkt MO - FRI 4:00 Uhr
then
        OffsetBewegungsmelder.sendCommand(0)
end
zweite Rules Datei "BM_zeitschalt.rules"

Code: Alles auswählen

// globale Variablen zu Beginn der *.rules Datei definieren!
var Timer tBewegung = null                                          // Timervariable global definieren

rule "Bewegungsmelder mit timeout"
when
        Item bw_melder received command ON                              // Bewegung wurde erkannt

then
if(OffsetBewegungsmelder.state  == 0){                              //Offsetitem wird hier abgefragt, in dem Fall Schaltzustand 0
    tBewegung.cancel                                               // zunächst eventuell laufende Timer entfernen
    if(Lampe_Power.state != OFF) Lampe_Power.sendCommand(OFF)       // Licht ausschalten, falls vor 4 Uhr noch an war.
}
if(OffsetBewegungsmelder.state  == 1){                              //Offsetitem wird hier abgefragt, in dem Fall Schaltzustand 1
    tBewegung.cancel                                               // zunächst eventuell laufende Timer entfernen
    if(Lampe_Power.state != ON) Lampe_Power.sendCommand(ON)         // Licht einschalten, falls noch nicht an.
    tBewegung = createTimer(now.plusSeconds(45), [ |                // Timer anlegen
        if(Lampe_Power.state != OFF) Lampe_Power.sendCommand(OFF)   // Licht ausschalten, falls noch nicht aus
        tBewegung = null                                            // Timervariable deinitialisieren
    ])
}


end
In VS Code wird kein Fehler angezeit, Lampe und Bewegungsmelder lassen sich einzeln schalten.

Log Bewegungsmelder:

2020-01-08 18:57:47.488 [vent.ItemStateChangedEvent] - bw_melder changed from OFF to ON
2020-01-08 18:57:57.237 [vent.ItemStateChangedEvent] - bw_melder changed from ON to OFF

Log Lampe:

2020-01-08 18:58:57.030 [ome.event.ItemCommandEvent] - Item 'Lampe_Power' received command ON
2020-01-08 18:58:57.054 [nt.ItemStatePredictedEvent] - Lampe_Power predicted to become ON
2020-01-08 18:58:57.072 [vent.ItemStateChangedEvent] - Lampe_Power changed from OFF to ON
2020-01-08 18:59:01.160 [ome.event.ItemCommandEvent] - Item 'Lampe_Power' received command OFF
2020-01-08 18:59:01.183 [nt.ItemStatePredictedEvent] - Lampe_Power predicted to become OFF
2020-01-08 18:59:01.198 [vent.ItemStateChangedEvent] - Lampe_Power changed from ON to OFF

Ist CRON auf -> Time cron "* * 4 ? * MON-FRI" <- kann ich natürlich im Log nichts sehen weil es nicht 04:00 Uhr ist, setze ich den aber auf aktuell 19:00 -> Time cron "* * 19 ? * MON-FRI" <- erscheint es auch im Log:

2020-01-08 19:06:52.951 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'BM_offset.rules'
2020-01-08 19:06:53.002 [ome.event.ItemCommandEvent] - Item 'OffsetBewegungsmelder' received command 0
2020-01-08 19:06:53.005 [ome.event.ItemCommandEvent] - Item 'OffsetBewegungsmelder' received command 0
usw.

das scheint zu funktionieren.

Wird dann allerdings der Bewegungsmelder aktiviert, ändert sich der OffsetBewegungsmelder NICHT!

2020-01-08 20:45:21.008 [ome.event.ItemCommandEvent] - Item 'OffsetBewegungsmelder' received command 0
2020-01-08 20:45:21.920 [vent.ItemStateChangedEvent] - bw_melder changed from OFF to ON
2020-01-08 20:45:22.008 [ome.event.ItemCommandEvent] - Item 'OffsetBewegungsmelder' received command 0
...
2020-01-08 20:45:32.008 [ome.event.ItemCommandEvent] - Item 'OffsetBewegungsmelder' received command 0
2020-01-08 20:45:32.210 [vent.ItemStateChangedEvent] - bw_melder changed from ON to OFF
2020-01-08 20:45:33.009 [ome.event.ItemCommandEvent] - Item 'OffsetBewegungsmelder' received command 0

Könnte das ein Hinweis sein *warum* die Rules bei mir noch nciht funktionieren?

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 9. Jan 2020 12:08
von KellerK1nd
Der OffsetBewegungsmelder soll sich auch nicht ändern. Der ändert sich nur zu den Zeiten. Stell dir das Item als Programmschalter vor. Die Werte die du dem Item zeitabhängig vergibst sind die Programmmodi, 0 ist Nachtmodus, 1 ist Frühbetrieb, usw. (als Beispiel)

Eine ganz einfache Regel um das zu veranschaulichen.

Code: Alles auswählen

rule „...“
When
        Item Bewegungsmelder changed to ON //Bewegungsmelder schaltet auf ON
then
        if(BewegungsmelderOffset == 0){         //Zustandsabfrage der Offseteinstellung
               loginfo(„Bewegungsmelder“, „Nachtmodus aktiv“)
               }
//Hier steht der Offset auf 0, quasi Nachtmodus, hier soll nix passieren, ergo werden auch keine Items angesteuert, alles was kommt ist ein Logeintrag der sagt, dass der Nachtmodus aktiv ist. 
        else if(BewegungsmelderOffset == 1){
               loginfo(„Bewegungsmelder“, „Frühmodus altiv“)
               lichtdimmer.sendCommand(10)
               }
//Hier ist jetzt der Offset 1, ein Logeintrag wird wieder generiert mit dem Verweis, das jetzt der Frühmodus aktiv ist. Dabei möchte ich, dass das Licht nur gedimmt angesteuert wird, dementsprechend sende ich den Befehl 10 an ein Dimmerlichtitem. 
In dem Beispiel oben werden die Lichter nur eingeschaltet. Ausschalten kannst du sie entweder auch über eine Regel. (Ich hab mir so eine Kaskadensteuerung gebaut, ich schalte das Licht nicht sofort aus, sondern dimme es in Stufen herunter mit jeweiligen Standzeiten.) Oder du kannst die Lampen auch über das Expirebinding wie hier schon erwähnt wurde ausschalten.