Hauptmenü

PIR Schlechtwetter Erkennung

Begonnen von Tungsten, 28 August 2020, 11:55:57

Vorheriges Thema - Nächstes Thema

Tungsten

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?



Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tungsten

ja, wenn ich es richtig sehe kommt alle 60sec ein event

Tungsten

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...

Damian

Deine Definition entspricht der aus der Commandref. Ich kann keinen Fehler erkennen. Wird der Block bei motion-Ereignis ausgeführt?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tungsten

#5
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)}

Damian

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);                                                                       
  }
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sany

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!
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Tungsten

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.

Damian

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)');
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sany

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.
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Tungsten

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.

Sany

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!
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Tungsten

super, Danke für den Tipp! Eventmonitor habe ich noch nicht viel genutzt mit Filter auf ein Device.

Tungsten

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);     
  }
}