Hallo zusammen,
ich habe folgende Anforderung, die ich gerne in eine Regel übertragen möchte. Ich habe leider überhaupt keine Idee, wie das abgebildet werden kann.
Ich habe 2 Bewegungsmelder. Wenn der erste Bewegungsmelder aktiviert ist erfolgt noch keine Aktivität, erst wenn der zweite Bewegungsmelder aktiviert wird, soll eine Aktivität starten. Das zeitliche Intervall zwischen beiden Bewegungsmeldern liegt bei 30 Sekunden.
Wenn 30 Sekunden nach der Aktivierung des ersten Bewegungsmelders der zweite Bewegungsmelder nicht aktiviert wird, dann wird keine Aktion ausgeführt.
Hat jemand von euch eine Idee?
Bewegungsmelder in Reihe
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Bewegungsmelder in Reihe
Geht es um eine explizite Reihenfolge, also Presence_1 triggert, dann innerhalb 30 Sekunden Presence_2 -> Aktion wird ausgeführt. Aber Presence_2 triggert, innerhalb 30 Sekunden Presence_1 führt zu keiner Aktion?
Oder soll es unterschiedliche Aktionen je nach Reihenfolge geben?
Eine mögliche Rule mit Richtungsunterscheidung sähe so aus:
Die zwei Timer machen also nichts, außer sich selbst nach Ablauf wieder zu entfernen. Man könnte das gleiche auch mit dem expire Binding erreichen, dann ist die Rule noch einfacher. Als Items kannst Du einfach die Items der Präsenzmelder nutzen und zusätzlich zum Melder das expire Binding verknüpfen. So:
Dann reicht dieser Rule:
Oder soll es unterschiedliche Aktionen je nach Reihenfolge geben?
Eine mögliche Rule mit Richtungsunterscheidung sähe so aus:
Code: Alles auswählen
// Globale Variablen zu Beginn der Datei definieren.
var Timer tPD1 = null // Timer für Presence_1
var Timer tPD2 = null // Timer für Presence_2
rule "detect presence"
when
Item Presence_1 received command ON or // Bewegung 1 erkannt oder
Item Presence_2 received command ON // Bewegung 2 erkannt
then
if(triggeringItem.name.contains("1")) { // Bewegung 1 erkannt
tPD1?.cancel // falls der 1. Timer läuft, canceln
tPD1 = createTimer(now.plusSeconds(30), [| // 1. Timer starten
tPD1 = null // Wenn Timer abläuft, Variable löschen
])
if(tPD2 !== null) { // falls der 2. Timer noch läuft
// Bewegungsreihenfolge 2 > 1 erkannt
}
} else { // Bewegung 2 erkannt
tPD2?.cancel
tPD2 = createTimer(now.plusSeconds(30), [| // 2. Timer starten
tPD2 = null // Wenn Timer abläuft, Variable löschen
])
if(tPD1 !== null) { // falls der 1. Timer noch läuft
// Bewegungsreihenfolge 1 > 2 erkannt
}
}
end
Code: Alles auswählen
Switch Presence_1 "Bewegung 1 [%s]" {channel="...",expire="30s,state=OFF"}
Switch Presence_2 "Bewegung 2 [%s]" {channel="...",expire="30s,state=OFF"}
Code: Alles auswählen
rule "detect presence"
when
Item Presence_1 received command ON or // Bewegung 1 erkannt oder
Item Presence_2 received command ON // Bewegung 2 erkannt
then
if(triggeringItem.name.contains("1")) { // Bewegung 1 erkannt
if(Presence_2.state == ON) { // falls der 2. Timer noch läuft
// Bewegungsreihenfolge 2 > 1 erkannt
}
} else { // Bewegung 2 erkannt
if(Presence_1.state == ON) { // falls der 1. Timer noch läuft
// Bewegungsreihenfolge 1 > 2 erkannt
}
}
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 34
- Registriert: 20. Jun 2019 23:38
Re: Bewegungsmelder in Reihe
Prima,
ich benötige nur eine Richtung...
Wenn Bewegungsmelder 1 aktiv geschaltet hat und der Bewegungsmelder 2 dann ebenfalls innerhalb von 30 Sekunden nach Bewegungsmelder 1 geschaltet hat, dann erfolgt eine Aktion (Licht an).
Ich werde morgen Abend einmal Deinen Vorschlag 1 austesten und melde dann das Ergebnis.
ich benötige nur eine Richtung...
Wenn Bewegungsmelder 1 aktiv geschaltet hat und der Bewegungsmelder 2 dann ebenfalls innerhalb von 30 Sekunden nach Bewegungsmelder 1 geschaltet hat, dann erfolgt eine Aktion (Licht an).
Ich werde morgen Abend einmal Deinen Vorschlag 1 austesten und melde dann das Ergebnis.
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Bewegungsmelder in Reihe
Wenn die 2. Richtung nichts bewirken soll, kannst Du natürlich im else-Teil den Teil für das Schalten weg lassen (also diesen Code-Teil):
Code: Alles auswählen
if(tPD1 !== null) { // falls der 1. Timer noch läuft
// Bewegungsreihenfolge 1 > 2 erkannt
}
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet