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/ (https://www.instagram.com/dsdesign2015/) dort einfach das Highlight "HouseOfShit" betrachten :)
dein Klositz meldet doch nur on/off.
wo soll das frei/besetzt her kommen?
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