Hauptmenü

[DOIF] Stressfreier Klogang

Begonnen von Dersch, 13 Dezember 2018, 17:34:06

Vorheriges Thema - Nächstes Thema

Dersch

Hi,

ich habe mir eine Gästetoilette gebaut welche komplett schalterfrei auf den Gast (vorallem mich) reagiert. Es soll einen möglichst stressfreien Klogang ermöglichen der auch gerne mal 30 Minuten dauern darf.

Nun habe ich aber ein Problem mit 2 DOIF's und hoffe auf Hilfe.

Das Erste geht um das Licht:

Internals:
   DEF        ([TeHelligkeit:luminosity] < 400 and [GwBewegung:state] eq "on") (set GwLEDLicht on)
DOELSEIF
([GwKloSitz] eq "frei" and [GwBewegung:state] eq "off") (set GwLEDLicht off)
   MODEL      FHEM
   NAME       GwLicht
   NR         288
   NTFY_ORDER 50-GwLicht
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-12-13 17:02:03   Device          TeHelligkeit
     2018-12-13 16:59:30   cmd             2
     2018-12-13 16:59:30   cmd_event       GwBewegung
     2018-12-13 16:59:30   cmd_nr          2
     2018-12-13 16:58:45   e_GwBewegung_state off
     2018-12-13 16:49:14   e_GwKloSitz_STATE frei
     2018-12-13 17:02:03   e_TeHelligkeit_luminosity 0.1
     2018-10-23 22:45:42   mode            enabled
     2018-12-13 16:59:30   state           cmd_2
     2018-12-13 16:59:30   wait_timer      no timer
   Regex:
   attr:
     cmdState:
     wait:
       0:
         0
       1:
         45
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'TeHelligkeit','luminosity') < 400 and ::ReadingValDoIf($hash,'GwBewegung','state') eq "on"
     1          ::InternalDoIf($hash,'GwKloSitz','STATE') eq "frei" and ::ReadingValDoIf($hash,'GwBewegung','state') eq "off"
   devices:
     0           TeHelligkeit GwBewegung
     1           GwKloSitz GwBewegung
     all         TeHelligkeit GwBewegung GwKloSitz
   do:
     0:
       0          set GwLEDLicht on
     1:
       0          set GwLEDLicht off
     2:
   helper:
     event      luminosity: 0.1
     globalinit 1
     last_timer 0
     sleepdevice GwBewegung
     sleepsubtimer -1
     sleeptimer -1
     timerdev   GwBewegung
     timerevent off
     triggerDev TeHelligkeit
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: GwBewegung
       state: cmd_2
     timerevents:
       off
     timereventsState:
       state: off
     triggerEvents:
       luminosity: 0.1
     triggerEventsState:
       luminosity: 0.1
   internals:
     1           GwKloSitz:STATE
     all         GwKloSitz:STATE
   itimer:
   perlblock:
   readings:
     0           TeHelligkeit:luminosity GwBewegung:state
     1           GwBewegung:state
     all         TeHelligkeit:luminosity GwBewegung:state
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   room       GästeWC
   timerWithWait 1
   wait       0:45


Das Zweite geht um die Musik:

Internals:
   DEF        ([GwKloSitz] eq "besetzt" and [GwBewegung] eq "on" and [GwTuer] eq "closed") (set GwSqueeze play)
DOELSEIF
([GwKloSitz] eq "frei") (set GwSqueeze off)
   MODEL      FHEM
   NAME       GwMusik
   NR         294
   NTFY_ORDER 50-GwMusik
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-12-13 17:02:42   Device          GwKloSitz
     2018-12-13 16:50:17   cmd             2
     2018-12-13 16:50:17   cmd_event       GwKloSitz
     2018-12-13 16:50:17   cmd_nr          2
     2018-12-13 16:58:45   e_GwBewegung_STATE off
     2018-12-13 17:02:42   e_GwKloSitz_STATE frei
     2018-12-13 17:02:42   e_GwTuer_STATE  closed
     2018-10-23 16:16:09   mode            enabled
     2018-12-13 16:50:17   state           cmd_2
     2018-12-13 17:02:42   wait_timer      13.12.2018 17:03:42 cmd_2 GwKloSitz
   Regex:
   attr:
     cmdState:
     wait:
       0:
         0
       1:
         60
     waitdel:
     waitsame:
       60
       0
   condition:
     0          ::InternalDoIf($hash,'GwKloSitz','STATE') eq "besetzt" and ::InternalDoIf($hash,'GwBewegung','STATE') eq "on" and ::InternalDoIf($hash,'GwTuer','STATE') eq "closed"
     1          ::InternalDoIf($hash,'GwKloSitz','STATE') eq "frei"
   devices:
     0           GwKloSitz GwBewegung GwTuer
     1           GwKloSitz
     all         GwKloSitz GwBewegung GwTuer
   do:
     0:
       0          set GwSqueeze play
     1:
       0          set GwSqueeze off
     2:
   helper:
     event      Longpress: frei
     globalinit 1
     last_timer 0
     sleepdevice GwKloSitz
     sleepsubtimer 0
     sleeptimer 1
     timerdev   GwKloSitz
     timerevent Longpress: frei
     triggerDev GwKloSitz
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: GwKloSitz
       state: cmd_2
     timerevents:
       Longpress: frei
     timereventsState:
       Longpress: frei
     triggerEvents:
       Longpress: frei
     triggerEventsState:
       Longpress: frei
   internals:
     0           GwKloSitz:STATE GwBewegung:STATE GwTuer:STATE
     1           GwKloSitz:STATE
     all         GwKloSitz:STATE GwBewegung:STATE GwTuer:STATE
   itimer:
   perlblock:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   room       GästeWC
   timerWithWait 1
   wait       0:60
   waitsame   60:0


List GwKloSitz:
Internals:
   DEF        5
   EXCEPT_FD  12
   GPIO_Basedir /sys/class/gpio
   GPIO_Nr    5
   NAME       GwKloSitz
   NR         23
   STATE      off
   TYPE       RPI_GPIO
   WiringPi_gpio /usr/local/bin/gpio
   lasttrg    1544714295.52374
   READINGS:
     2018-12-13 17:16:34   Dblclick        off
     2018-12-13 17:16:34   Longpress       off
     2018-12-13 17:23:49   Pinlevel        low
     2018-12-13 17:16:34   state           off
   fhem:
     interfaces switch
Attributes:
   active_low yes
   direction  input
   interrupt  both
   room       GPIO-Devices


Erklärung:
[GwKloSitz] ist hier ein kleiner Kontakt den ich in den Klodeckel eingebaut habe. Wenn der Klositz geöffnet ist steht er auf dem State "besetzt", ist er geschlossen steht er auf dem State "frei". Der Bewegungsmelder im Klo wird bei einer längeren Klositzung mit Kopf auf das Smartphone gerichtet ja keine Bewegung mehr registrieren ;) Daher soll mir dieser das Licht als auch die Musik anlassen bis die Klositzung beendet ist, also Klositz geschlossen und dann läuft ein kleiner Timer für das Händewaschen und Toilette verlassen.

Leider funktioniert das nicht zuverlässig. Ich muss dennoch regelmäßig eine Bewegung ausführen damit das Licht und die Musik an bleiben bzw. wieder angehen. Und das nervt ich finde aber meinen Fehler nicht.

Meine Logik darf doch beide Funktionen erst ausschalten wenn der Klositz seinen State ändert... Also warum werden beide DOIF's getriggert wenn NUR die Bewegung auf off schaltet?

Grüße
Dirk

P.S: Für Neugierige gibt es einen kleinen Einblick in das Klo hier: https://www.instagram.com/dsdesign2015/ dort einfach das Highlight "HouseOfShit" betrachten :)

Frank_Huber

dein Klositz meldet doch nur on/off.
wo soll das frei/besetzt her kommen?

Dersch

Oh ja, das passiert woanders. Die DOIF's sind auf meinem Hauptfhem. Das List vom KloSitz ist vom Fhem Pi im Klo und wird über Fhem2Fhem ausgelesen. Dort ist dann das Event Map:



Internals:
   NAME       GwKloSitz
   NR         291
   STATE      besetzt
   TYPE       dummy
   READINGS:
     2018-12-13 19:08:56   Dblclick        on
     2018-12-13 19:08:57   Longpress       on
     2018-12-13 19:08:56   Pinlevel        high
     2018-12-13 19:08:56   state           on
Attributes:
   devStateIcon besetzt:hue_room_toilet@red frei:hue_room_toilet@green
   eventMap   off:frei on:besetzt
   group      Schalter
   icon       hue_room_toilet
   room       GPIO-Devices,GästeWC