DOIF/Bewegungsmelder mit vielen Optionen

Begonnen von LutzG, 25 Oktober 2022, 03:18:17

Vorheriges Thema - Nächstes Thema

LutzG

Hallöchen,

nachdem ich jetzt ziemlich lange rum probiert habe (Syntax/Logik), möchte ich euch gern mein Ergebniss präsentieren. Ich hoffe, es hilft Jemanden. Code ist bestimmt nicht perfekt, aber so funktioniert er jetzt bei mir.

Das Problem:
Mein Arbeitsplatz ist in der Küche. Für unterschiedliche Tätigkeiten wollte ich unterschiedliche Zeiten für den Bewegungsmelder(BM) haben und wenn ich das Licht per Alexa oder manuell einschalte, soll der BM das nicht wieder ausschalten.

Warum ich nicht für alles "Standard" Readings genommen habe:
Sensor & BM: ist ein ESP32 mit OpenMQTTGateway + BH170 Licht Sensor + BM: "AM312 PIR Sensor"
Ein 2. BM ist ein TRADFRI (Ikea) liefert: [motion:nomotion]
Licht: ist eine mit Tasmota geflaschte Gosund sp1
Herd: liefert ein Shelly 3em
PC: Presence, mit Lan-Ping

Automatik ist ein Dummy, den kann ich mit Alexa schalten, wie auch die "Licht"-Steckdose.

Zum testen, das erste Dummy erstellen:
defmod aBewegungsmelder dummy

Raw Modus aufrufen und das alles einfügen:
defmod aBewegungsmelder dummy
attr aBewegungsmelder room Test->aBM
attr aBewegungsmelder setList state:motion,nomotion
attr aBewegungsmelder webCmd motion:nomotion

setstate aBewegungsmelder nomotion
setstate aBewegungsmelder 2022-10-25 02:13:33 state nomotion

defmod aHerd dummy
attr aHerd room Test->aBM
attr aHerd setList on off

setstate aHerd off
setstate aHerd 2022-10-25 02:12:43 state off

defmod aPC dummy
attr aPC room Test->aBM
attr aPC setList on off

setstate aPC off
setstate aPC 2022-10-25 02:12:50 state off

defmod aLicht dummy
attr aLicht room Test->aBM
attr aLicht setList on off

setstate aLicht off
setstate aLicht 2022-10-25 02:13:37 state off


defmod aAutomatik dummy
attr aAutomatik room Test->aBM
attr aAutomatik setList on off

setstate aAutomatik on
setstate aAutomatik 2022-10-25 02:13:03 state on

defmod aSensor dummy
attr aSensor readingList lux
attr aSensor room Test->aBM
attr aSensor setList lux:slider,0,1,100
attr aSensor stateFormat Lux: lux
attr aSensor webCmd lux

setstate aSensor Lux: 25
setstate aSensor 2022-10-24 00:52:28 lux 25

defmod di_BM_A DOIF {\
  if ([aBewegungsmelder:state] ne "nomotion" and [?aSensor:lux] < 50 and [?aAutomatik] eq "on" ) {\
    # Es rennt jemand rum, es ist zu dunkel und ich soll was tun! \
    if ([?aLicht:state] eq "on") {      # Das Licht ist schon an!\
      if (get_Exec("BM_A_off") > 0) {   # Gibt es auch einen Timer?\
        set_Reading("IchWars","on");;    # Dann war ich das!\
      }\
      else { # Timer ist abgelaufen, ich hab das Licht nicht eingeschaltet!\
        set_Reading("IchWars","off");; # Merker zurück setzen.\
      }\
    }\
    else { # Licht ist aus -> einschalten.\
      fhem_set("aLicht on");;\
      Log("3", "Bewegungsmelder hat Licht angeschaltet!");;\
      set_Reading("IchWars","on");; # Merker setzen, das das DOIF geschaltet hat\
    }\
    if (get_Reading("IchWars") eq "on") { # Da ich das war, Ausschalttimer setzen\
      if ([?aPC:state] eq "on") {  # der Rechner läuft, langer Timer\
        set_Exec("BM_A_off",[?$SELF:work],'fhem_set("aLicht off")');;\
        Log("3", "Bewegungsmelder: PC läuft, Licht lange an!");;\
        set_State("Timer:Work");;\
      }\
      elsif ([?aHerd] eq "on") {   # Herd ist an / kochen, normaler Timer\
        set_Exec("BM_A_off",[?$SELF:food],'fhem_set("aLicht off")');;\
        Log("3", "Bewegungsmelder: Es wird gekocht, Licht Kochzeit an!");;\
        set_State("Timer:Food");;\
      }\
      elsif ([?22:00-07:00]) {     # In der Nacht, alle schlafen, kurzer Timer\
        set_Exec("BM_A_off",[?$SELF:night],'fhem_set("aLicht off")');;\
        Log("3", "Bewegungsmelder: Bewohner schlafen, Licht kurz an!");;\
        set_State("Timer:Night");;\
      }\
      else {\
        set_Exec("BM_A_off",[?$SELF:default],'fhem_set("aLicht off")');;\
        Log("3", "Bewegungsmelder: Nichts los, Licht normal an!");;\
        set_State("Timer:Default");;\
      }\
    }\
  }\
}\

attr di_BM_A readingList state work food night default
attr di_BM_A room Test->aBM
attr di_BM_A setList work:slider,0,10,1800 food:slider,0,5,600 night:slider,0,1,60 default:slider,0,10,300
attr di_BM_A webCmd work:food:night:default

setstate di_BM_A Timer:Night
setstate di_BM_A 2022-10-25 02:13:33 Device aBewegungsmelder
setstate di_BM_A 2022-10-25 02:13:32 IchWars on
setstate di_BM_A 2022-10-25 02:13:33 block_01 executed
setstate di_BM_A 2022-10-24 00:53:50 default 10
setstate di_BM_A 2022-10-25 02:13:33 e_aBewegungsmelder_state nomotion
setstate di_BM_A 2022-10-24 00:53:42 food 15
setstate di_BM_A 2022-10-25 02:05:01 mode enabled
setstate di_BM_A 2022-10-24 00:53:32 night 5
setstate di_BM_A 2022-10-25 02:13:32 state Timer:Night
setstate di_BM_A 2022-10-25 02:05:01 timer_01_c01 25.10.2022 22:00:00
setstate di_BM_A 2022-10-25 02:05:01 timer_02_c01 25.10.2022 07:00:00
setstate di_BM_A 2022-10-24 00:53:15 work 20
save


Nach dem speichern, sind alle Dummys+Doif im Raum: "Test->aBM" bereit zum spielen.  8)

Viel Spaß wünscht

Lutz

Edit: Die Trigger raus genommen
DMZ: J5040 mit OpenMediaVault, in Docker: Portainer, Fhem, MariaDB, zigbee2mqtt, esphome, NextCloudPi, Jellyfin, Grocy.
Intranet: J5005 mit OpenMediaVault, in Docker: Portainer, Fhem-minimal, urbackup - läuft nur, wenn Rechner laufen.

Damian

Ich würde den Trigger bei den Timer-Angaben rausnehmen - der ist da wohl nicht beabsichtigt:

also: [?$SELF:work], [?$SELF:food] und [?$SELF:night] oder einfach get_Reading benutzen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

LutzG

Zitat von: Damian am 25 Oktober 2022, 09:23:11
Ich würde den Trigger bei den Timer-Angaben rausnehmen - der ist da wohl nicht beabsichtigt:
Stimmt! Danke, dass du dir das angesehen hast!
DMZ: J5040 mit OpenMediaVault, in Docker: Portainer, Fhem, MariaDB, zigbee2mqtt, esphome, NextCloudPi, Jellyfin, Grocy.
Intranet: J5005 mit OpenMediaVault, in Docker: Portainer, Fhem-minimal, urbackup - läuft nur, wenn Rechner laufen.