Hallo Zusammen,
meine Nachbarn beschweren sich dass bei windigem Wetter meinen Beleuchtung immer angeht....
Ich habe einen Osram Zigbee PIR Motion Sensor außen angebracht. Bei Bewegungserkennung schalte ich einen Sonoff zigbee switch.
Hat jemand einen Idee wie ich bei motion Erkennung durch den PIR anfangen kann einen Counter hoch zu zählen und wenn dieser einen Wert erreicht hat den Schlechtwetter dummy setzen und nach x Minuten den dummy und counter wieder zurück setzen.
Habe es hiermit versucht:
{
if ((["PIR.Bewegungsmelder1: motion"] ) and !get_Exec("counter")) { # wenn Ereignis eintritt und kein Timer läuft
$_count=1; # setze count-Variable auf 1
set_Exec("counter",120,'fhem("setreading Schlechtwetter state on") if ($_count > 3)'); # wenn es in 120 Sekunden mehr als drei Auslösungen gibt aktiviert sich der Schlechtwetter dummy.
} else {
$_count++; # wenn Timer bereits läuft zähle Ereignis
}
}
{ if ([ESPEasy_ESP_Easy1_Dummies:state] eq 'Day: 1') {$_count=0;del_Exec("counter");fhem("setreading Schlechtwetter state off")}} #Wenn Tag, wird der counter gelöscht und der Schlechtwetter dummy wieder ausgeschaltet
Aber der PIR bleibt bei Erkennung auf motion und somit wird der counter nicht hochgezählt.
Hat jemand einen gute Idee für mich?
Zitat von: Tungsten am 28 August 2020, 11:55:57
Hallo Zusammen,
meine Nachbarn beschweren sich dass bei windigem Wetter meinen Beleuchtung immer angeht....
Ich habe einen Osram Zigbee PIR Motion Sensor außen angebracht. Bei Bewegungserkennung schalte ich einen Sonoff zigbee switch.
Hat jemand einen Idee wie ich bei motion Erkennung durch den PIR anfangen kann einen Counter hoch zu zählen und wenn dieser einen Wert erreicht hat den Schlechtwetter dummy setzen und nach x Minuten den dummy und counter wieder zurück setzen.
Habe es hiermit versucht:
{
if ((["PIR.Bewegungsmelder1: motion"] ) and !get_Exec("counter")) { # wenn Ereignis eintritt und kein Timer läuft
$_count=1; # setze count-Variable auf 1
set_Exec("counter",120,'fhem("setreading Schlechtwetter state on") if ($_count > 3)'); # wenn es in 120 Sekunden mehr als drei Auslösungen gibt aktiviert sich der Schlechtwetter dummy.
} else {
$_count++; # wenn Timer bereits läuft zähle Ereignis
}
}
{ if ([ESPEasy_ESP_Easy1_Dummies:state] eq 'Day: 1') {$_count=0;del_Exec("counter");fhem("setreading Schlechtwetter state off")}} #Wenn Tag, wird der counter gelöscht und der Schlechtwetter dummy wieder ausgeschaltet
Aber der PIR bleibt bei Erkennung auf motion und somit wird der counter nicht hochgezählt.
Hat jemand einen gute Idee für mich?
Es ist unerheblich, ob der PIR auf motion bleibt oder nicht, da du nur das Ereignis abfragst und nicht den Zustand (Status). Wichtig ist nur, dass bei jeder Bewegung ein motion-Event geliefert wird.
ja, wenn ich es richtig sehe kommt alle 60sec ein event
wie müsste ich ein doif bauen, mit dem ich prüfe ob innerhalb eines Zeitraums mehrer motion events hintereinander kommen? Dann würde ich den Schlechtwetter dummy setzen.
Nach einer Zeit x sollte dies wieder zurück gesetzt werden. Stehe da gerade auf dem Schlauch...
Deine Definition entspricht der aus der Commandref. Ich kann keinen Fehler erkennen. Wird der Block bei motion-Ereignis ausgeführt?
ich würde sagen ja.
Internals:
CFGFN
DEF {
if ((["PIR.Bewegungsmelder2: motion"] )and !get_Exec("counter")) { # wenn Ereignis eintritt und kein Timer läuft
$_count=1; # setze count-Variable auf 1
set_Exec("counter",120,'fhem("setreading Schlechtwetter state on") if ($_count > 3)'); # wenn es in 120 Sekunden mehr als drei Auslösungen gibt aktiviert sich der Schlechtwetter dummy.
} else {
$_count++; # wenn Timer bereits läuft zähle Ereignis
}
}
#{ if ([ESPEasy_ESP_Easy1_Dummies:state] eq 'Day: 1') {$_count=0;del_Exec("counter");fhem("setreading Schlechtwetter state off")}} #Wenn Tag, wird der counter gelöscht und der Schlechtwetter dummy wieder ausgeschaltet
DOIFDEV ^global$|PIR.Bewegungsmelder2
FUUID 5f48c169-f33f-48e2-2826-2f654e74c72faabb
MODEL Perl
NAME di.motion_count
NR 394899
NTFY_ORDER 50-di.motion_count
STATE initialized
TYPE DOIF
VERSION 22588 2020-08-12 19:25:15
READINGS:
2020-08-28 14:58:09 Device PIR.Bewegungsmelder2
2020-08-28 14:58:09 block_01 executed
2020-08-28 10:50:37 mode enabled
2020-08-28 10:33:45 state initialized
Regex:
accu:
cond:
:
0:
"PIR.Bewegungsmelder2: motion" PIR.Bewegungsmelder2: motion
condition:
0
if ((::EventDoIf('PIR.Bewegungsmelder2',$hash,' motion',0) )and !get_Exec("counter")) { # wenn Ereignis eintritt und kein Timer läuft
$hash->{var}{count}=1; # setze count-Variable auf 1
set_Exec("counter",120,'fhem("setreading Schlechtwetter state on") if ($hash->{var}{count} > 3)'); # wenn es in 120 Sekunden mehr als drei Auslösungen gibt aktiviert sich der Schlechtwetter dummy.
} else {
$hash->{var}{count}++; # wenn Timer bereits läuft zähle Ereignis
}
helper:
DEVFILTER ^global$|PIR.Bewegungsmelder2
NOTIFYDEV global|.*PIR.Bewegungsmelder2.*
event state_motion_count: motion
globalinit 1
last_timer 0
sleeptimer -1
triggerDev PIR.Bewegungsmelder2
triggerEvents:
motion
state_motion_count: motion
triggerEventsState:
state: motion
state_motion_count: motion
internals:
perlblock:
0 block_01
ptimer:
counter:
name counter
subname fhem("setreading Schlechtwetter state on") if ($hash->{var}{count} > 3)
time 1598619496.9375
hash:
readings:
trigger:
uiTable:
var:
count 2
Attributes:
DbLogExclude .*
room 6_DOIF
hier noch ein list vom PIR:
Internals:
DEF sensor 8 IODev=ConBeeStick
FUUID 5e7ba0fa-f33f-48e2-092d-42e0e598aace5be7
FVERSION 31_HUEDevice.pm:0.218370/2020-05-02
ID S8
INTERVAL
IODev ConBeeStick
NAME PIR.Bewegungsmelder2
NR 298
STATE motion
TYPE HUEDevice
lastupdated 2020-08-28 13:30:29
lastupdated_local 2020-08-28 15:30:29
manufacturername CentraLite
modelid Motion Sensor-A
name Bewegungsmelder 2
on 1
reachable 1
swversion ����������������
type ZHAPresence
uniqueid 00:0d:6f:00:0f:7f:c0:d3-01-0500
OLDREADINGS:
READINGS:
2020-08-28 14:53:55 battery 70
2020-08-28 14:53:55 batteryPercent 70
2020-06-10 16:47:40 batteryState ok
2020-08-28 14:53:55 reachable 1
2020-08-28 15:30:29 state motion
2020-08-28 15:30:29 state_motion_count 8
2020-06-10 16:47:40 tampered 1
helper:
devtype S
reachable 0
update_timeout 1
configList:
json:
e changed
id 8
r sensors
t event
uniqueid 00:0d:6f:00:0f:7f:c0:d3-01-0500
state:
lastupdated 2020-08-28T13:30:29.436
setList:
Attributes:
DbLogExclude .*
IODev ConBeeStick
event-aggregator state_motion_count::none:count:240
model Motion Sensor-A
room HUEDevice,MQTT
userReadings state_motion_count {ReadingsVal("PIR.Bewegungsmelder2","state",0)}
OK.
Du kannst den Counterinhalt in ein Reading schreiben, dann weißt du wie weit er gezählt hat.
Zitatif ((["PIR.Bewegungsmelder1: motion"] ) and !get_Exec("counter")) { # wenn Ereignis eintritt und kein Timer läuft
$_count=1; # setze count-Variable auf 1
set_Reading("counter",$_count);
set_Exec("counter",120,'fhem("setreading Schlechtwetter state on") if ($_count > 3)'); # wenn es in 120 Sekunden mehr als drei Auslösungen gibt aktiviert sich der Schlechtwetter dummy.
} else {
$_count++; # wenn Timer bereits läuft zähle Ereignis
set_Reading("counter",$_count);
}
und vielleicht einfach die Timerzeit deutlich erhöhen (zum Testen)? Wenn der Sensor so alle 60sec motion meldet dann bekommst Du in 120 sec maximal 3 events. Reicht nicht, um die Bedingung > 3 erfüllen zu können (dafür brauchts 4 events oder 180sec). Aberauch nur, wenn der Sensor genau alle 60sec motion meldet (und das macht er vermutlich nicht).
Viel Erfolg!
ok, es klappt soweit. Er zählt komischerweise aber immer bis 5 und fängt dann wieder bei 1 an. Das verstehe ich gerade nicht.
Zitat von: Tungsten am 28 August 2020, 17:22:41
ok, es klappt soweit. Er zählt komischerweise aber immer bis 5 und fängt dann wieder bei 1 an. Das verstehe ich gerade nicht.
Dann ist alles ok, nachdem dein gesetzter Timer abgelaufen ist fängt er ja mit 1 an.
Zur Bestätigung, wenn der Timer abläuft, kannst du dir noch ein Reading mit den gezählten Counts setzen:
Zitatset_Exec("counter",120,'set_Reading("counttimer",$_count);fhem("setreading Schlechtwetter state on") if ($_count > 3)');
ZitatEr zählt komischerweise aber immer bis 5 und fängt dann wieder bei 1 an. Das verstehe ich gerade nicht.
Das liegt nur an der Kombination TimerZeit und wie oft sendet der Sensor innerhalb dieser Zeit. Erst NACH Ablauf der Zeit wird auf größer 3 geprüft, egal wieviele Event kamen.
kann es sein dass
if ((["PIR.Bewegungsmelder2:motion"] )and !get_Exec("counter"))
auch ausgeführt wird und gezählt wird wenn der state von PIR.Bewegungsmelder2 nomotion ist?
Sieht für mich so aus.
kleiner Auszug aus der commandref:
Zitat["FS:temp"] triggert auf alle Devices, die "FS" im Namen und "temp" im Event beinhalten
([":^temp"]) triggert auf beliebige Devices, die im Event mit "temp" beginnen
(["^FS$:^temp$"] triggert auf Devices, die genau "FS" heißen und im Event genau "temp" vorkommt
So wie die Def im Moment ist, triggert er auf alles, was motion enthält, also auch auf nomotion. Du musst das entsprechend begrenzen, hier also ^motion$.
Am Besten öffnest Du den Eventmonitor und trägst dein Device ein, dann läßt Du ein paar events auslösen und schaust dir an, wie die Zeilen genau aussehen. Sollte also z.B. hinter dem motion noch etwas kommen dann darfst Du nur am Anfang das ^ setzten. Sonst wird gar nicht mehr getriggert.
Im Eventmonitor hast Du oben die Schalfläche Create/Modify Device. Du musst eine Zeile von links bis rechts markieren und dann auf diese Schaltfläche klicken, dann bekommst Du Vorschläge für notify, DOIF, FileLog etc. Ist ganz hilfreich, um die richtige Syntax herauszufinden. Aber Du musst die events genau analysieren, damit genug, aber nicht zuviel eingeschränkt wird.
Viel Erfolg!
super, Danke für den Tipp! Eventmonitor habe ich noch nicht viel genutzt mit Filter auf ein Device.
Danke für die Hilfe, scheint jetzt wie gewünscht zu funktionieren. ;-)
{
if ((["PIR.Bewegungsmelder1:^motion$"] )and !get_Exec("counter")) # wenn Ereignis eintritt und kein Timer läuft
{ $_count=1; # setze count-Variable auf 1
set_Reading("counter",$_count);
set_Exec("counter",240,
'set_Reading("CounterLastTimer",$_count);
fhem("setreading Schlechtwetter state on") if ($_count > 3);
fhem("setreading Schlechtwetter state off") if ($_count < 3)'); # wenn es in 240 Sekunden mehr als drei Auslösungen gibt aktiviert sich der Schlechtwetter dummy.
}
else
{
$_count++; # wenn Timer bereits läuft zähle Ereignis
set_Reading("counter",$_count);
}
}