Hallo,
ich habe mein DOIF für meinen Sonos etwas erweitert. Dadurch sind in dem DOIF nun zwei verschiedene Zeitspannen (Werktags und Wochenende) enthalten. Seit dem funktioniert mein Konstrukt aber leider nicht mehr.
Muss ich eine Reihenfolge der Bedienungen beachten?
Hier mal meine Definition im def bereich des DOIF's:
defmod Bad_Musik DOIF ([05:30-23:59|8] or [10:00-23:59|7] and [Sonos_Schlafzimmer:transportState] eq "PLAYING" and [BZ.Bewegungsmelder_Motion] eq "motion" and [MeinGtag] eq "present") (set Sonos_Schlafzimmer AddMember Sonos_Bad;;set Sonos_Bad Bass 10) DOELSEIF ([05:30-23:59|8] or [10:00-23:59|7] and [BZ.Bewegungsmelder_Motion] eq "motion" and [MeinGtag] eq "present") (set Sonos_Bad PlayURI http://mp3.ffh.de/radioffh/hqlivestream.mp3;;set Sonos_Bad Volume 20;;set Sonos_Bad Bass 0) DOELSEIF ([Sonos_Bad:transportState] eq "PLAYING" and [BZ.Bewegungsmelder_Motion] eq "noMotion") (set Sonos_Schlafzimmer RemoveMember Sonos_Bad;;sleep 4 quiet;;set Sonos_Bad stop)
attr Bad_Musik wait 0:0:120
Was ich mit dem DOIF erreichen will:
Das erste DOIF soll zwei Lautsprecher gruppieren, sobald im Schlafzimmer Musik an ist, mein GTag anwesend ist, eine Bewegung im Badezimmer wahrgenommen wird und wenn die gegebene Zeitspanne zutrifft.
Das zweite DOIF soll im Bad Radio abspielen, wenn mein GTag anwesend ist, eine Bewegung im Badezimmer wahrgenommen wird und wenn die gegebene Zeitspanne zutrifft.
Das dritte und letze DOIF soll sobald 120 sekunden keine Bewegung mehr erkannt wurde den Sonos im Bad wieder Stoppen.
Ich bin mir nicht sicher in wie fern es schlau ist alle diese DOIF's mit ELESEIF hintereinander zu hängen. Ist es schlauer mehrere eigene DOIF's zu bauen? Besonders für den Timer? :o
Wie gesagt funktionierte es Super, bevor ich die Uhrzeit und Meine Anwesenheit mit hinein genommen habe.
Selbst der Timer, der die Musik ausstellen soll springt nicht mehr an, obwohl dort nichts der genannten Änderungen gemacht wurden. :o
Ich wäre dankbar, wenn mal jemand drüber schauen könnte!
Danke und Gruß Fixel
EDIT: Hier noch ein List vom DOIF:
Internals:
CFGFN
DEF ([05:30-23:59|8] or [10:00-23:59|7] and [Sonos_Schlafzimmer:transportState] eq "PLAYING" and [BZ.Bewegungsmelder_Motion] eq "motion" and [MeinGtag] eq "present") (set Sonos_Schlafzimmer AddMember Sonos_Bad;set Sonos_Bad Bass 10) DOELSEIF ([05:30-23:59|8] or [10:00-23:59|7] and [BZ.Bewegungsmelder_Motion] eq "motion" and [MeinGtag] eq "present") (set Sonos_Bad PlayURI http://mp3.ffh.de/radioffh/hqlivestream.mp3;set Sonos_Bad Volume 20;set Sonos_Bad Bass 0) DOELSEIF ([Sonos_Bad:transportState] eq "PLAYING" and [BZ.Bewegungsmelder_Motion] eq "noMotion") (set Sonos_Schlafzimmer RemoveMember Sonos_Bad;sleep 4 quiet;set Sonos_Bad stop)
NAME Bad_Musik
NR 190
NTFY_ORDER 50-Bad_Musik
STATE initialized
TYPE DOIF
Readings:
2017-03-17 23:32:21 Device MeinGtag
2017-03-17 22:36:53 cmd 0
2017-03-17 22:18:42 cmd_event MeinGtag
2017-03-17 22:18:42 cmd_nr 1
2017-03-17 23:11:20 e_BZ.Bewegungsmelder_Motion_STATE noMotion
2017-03-17 23:32:21 e_MeinGtag_STATE present
2017-03-17 23:29:02 e_Sonos_Bad_transportState PLAYING
2017-03-17 22:48:54 e_Sonos_Schlafzimmer_transportState STOPPED
2017-03-17 20:03:42 mode enable
2017-03-17 22:36:53 state initialized
2017-03-17 22:36:53 timer_01_c01 18.03.2017 05:30:00|8
2017-03-17 22:36:53 timer_02_c01 17.03.2017 23:59:00|8
2017-03-17 22:36:53 timer_03_c01 18.03.2017 10:00:00|7
2017-03-17 22:36:53 timer_04_c01 17.03.2017 23:59:00|7
2017-03-17 22:36:53 timer_05_c02 18.03.2017 05:30:00|8
2017-03-17 22:36:53 timer_06_c02 17.03.2017 23:59:00|8
2017-03-17 22:36:53 timer_07_c02 18.03.2017 10:00:00|7
2017-03-17 22:36:53 timer_08_c02 17.03.2017 23:59:00|7
2017-03-17 23:29:21 wait_timer no timer
Condition:
0 DOIF_time($hash,0,1,$wday,$hms,"8") or DOIF_time($hash,2,3,$wday,$hms,"7") and ReadingValDoIf($hash,'Sonos_Schlafzimmer','transportState') eq "PLAYING" and InternalDoIf($hash,'BZ.Bewegungsmelder_Motion','STATE') eq "motion" and InternalDoIf($hash,'MeinGtag','STATE') eq "present"
1 DOIF_time($hash,4,5,$wday,$hms,"8") or DOIF_time($hash,6,7,$wday,$hms,"7") and InternalDoIf($hash,'BZ.Bewegungsmelder_Motion','STATE') eq "motion" and InternalDoIf($hash,'MeinGtag','STATE') eq "present"
2 ReadingValDoIf($hash,'Sonos_Bad','transportState') eq "PLAYING" and InternalDoIf($hash,'BZ.Bewegungsmelder_Motion','STATE') eq "noMotion"
Days:
0 8
1 8
2 7
3 7
4 8
5 8
6 7
7 7
Devices:
0 Sonos_Schlafzimmer BZ.Bewegungsmelder_Motion MeinGtag
1 BZ.Bewegungsmelder_Motion MeinGtag
2 Sonos_Bad BZ.Bewegungsmelder_Motion
all Sonos_Schlafzimmer BZ.Bewegungsmelder_Motion MeinGtag Sonos_Bad
Do:
0:
0 set Sonos_Schlafzimmer AddMember Sonos_Bad;set Sonos_Bad Bass 10
1:
0 set Sonos_Bad PlayURI http://mp3.ffh.de/radioffh/hqlivestream.mp3;set Sonos_Bad Volume 20;set Sonos_Bad Bass 0
2:
0 set Sonos_Schlafzimmer RemoveMember Sonos_Bad;sleep 4 quiet;set Sonos_Bad stop
3:
Helper:
event present,presence: present,device_name: Gigaset G-tag
globalinit 1
last_timer 8
sleepdevice Sonos_Bad
sleepsubtimer 0
sleeptimer -1
timerdev MeinGtag
timerevent present,presence: present,device_name: Gigaset G-tag
triggerDev MeinGtag
timerevents:
present
presence: present
device_name: Gigaset G-tag
timereventsState:
state: present
presence: present
device_name: Gigaset G-tag
triggerEvents:
present
presence: present
device_name: Gigaset G-tag
triggerEventsState:
state: present
presence: present
device_name: Gigaset G-tag
Internals:
0 BZ.Bewegungsmelder_Motion:STATE MeinGtag:STATE
1 BZ.Bewegungsmelder_Motion:STATE MeinGtag:STATE
2 BZ.Bewegungsmelder_Motion:STATE
all BZ.Bewegungsmelder_Motion:STATE MeinGtag:STATE
Interval:
0 -1
1 0
2 -1
3 2
4 -1
5 4
6 -1
7 6
Itimer:
Localtime:
0 1489811400
1 1489791540
2 1489827600
3 1489791540
4 1489811400
5 1489791540
6 1489827600
7 1489791540
Readings:
0 Sonos_Schlafzimmer:transportState
2 Sonos_Bad:transportState
all Sonos_Schlafzimmer:transportState Sonos_Bad:transportState
Realtime:
0 05:30:00
1 23:59:00
2 10:00:00
3 23:59:00
4 05:30:00
5 23:59:00
6 10:00:00
7 23:59:00
Regexp:
0:
1:
2:
All:
State:
Time:
0 05:30:00
1 23:59:00
2 10:00:00
3 23:59:00
4 05:30:00
5 23:59:00
6 10:00:00
7 23:59:00
Timecond:
0 0
1 0
2 0
3 0
4 1
5 1
6 1
7 1
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
Timers:
0 0 1 2 3
1 4 5 6 7
Trigger:
Triggertime:
1489791540:
localtime 1489791540
Hash:
1489811400:
localtime 1489811400
Hash:
1489827600:
localtime 1489827600
Hash:
Attributes:
wait 0:0:120
Hi Fixel,
hilft Dir das als Denkanstoß? ;)
https://wiki.selfhtml.org/wiki/Perl/Operatoren#Operatorenrangfolge
Gruß Otto
Zitat von: Otto123 am 17 März 2017, 23:33:38
Hi Fixel,
hilft Dir das als Denkanstoß? ;)
https://wiki.selfhtml.org/wiki/Perl/Operatoren#Operatorenrangfolge
Gruß Otto
Danke, ich weiß nciht ob es mein Problem lösen wird, aber ich werde es morgen mal versuchen!
Zumindest muss ich laut der Seite meine Oder's hinter die Und's setzen :o ::)
12. Rangstufe: && (logisches UND)
13. Rangstufe: || (logisches ODER)
EDIT: Konnte es doch nicht sein lassen, es noch schnell zu editieren! ;D
Es geht nun! Sehr Interessant, dass eine andere Reihenfolge so viel verändert!
Danke dir Otto!
Hi,
einfach eine Klammer hätte genügt. Ohne Klammer werden erst die ganzen and aufgelöst und zum Schluß or [05:30-23:59|8] gemacht.
[05:30-23:59|8] or [10:00-23:59|7] and [Sonos_Schlafzimmer:transportState] ...
Da 1 or "irgendetwas" immer eins ist, spielen die ganzen "and" überhaupt keine Rolle
Mit Klammer
([05:30-23:59|8] or [10:00-23:59|7]) and [Sonos_Schlafzimmer:transportState] ...
Ist es so wie Du willst also: in der Woche ab 5:30 am Wochenende ab 10:00 und die "and" werden berücksichtigt.
Gruß Otto
Zitat von: Otto123 am 17 März 2017, 23:53:43
Hi,
einfach eine Klammer hätte genügt. Ohne Klammer werden erst die ganzen and aufgelöst und zum Schluß or [05:30-23:59|8] gemacht.
[05:30-23:59|8] or [10:00-23:59|7] and [Sonos_Schlafzimmer:transportState] ...
Da 1 or "irgendetwas" immer eins ist, spielen die ganzen "and" überhaupt keine Rolle
Mit Klammer
([05:30-23:59|8] or [10:00-23:59|7]) and [Sonos_Schlafzimmer:transportState] ...
Ist es so wie Du willst also: in der Woche ab 5:30 am Wochenende ab 10:00 und die "and" werden berücksichtigt.
Gruß Otto
Danke dir!
Muss mich leider nochmal melden, es funktioniert nicht wie gewollt.
Das DOIF sieht nach Ottos Tipp nun so aus:
Zitatdefine Bad_Musik DOIF (([05:30-23:59|8] or [10:00-23:59|7]) and [Sonos_Schlafzimmer:transportState] eq "PLAYING" and [BZ.Bewegungsmelder_Motion] eq "motion" and [MeinGtag] eq "present") (set Sonos_Schlafzimmer AddMember Sonos_Bad;;set Sonos_Bad Bass 10) DOELSEIF (([05:30-23:59|8] or [10:00-23:59|7]) and [BZ.Bewegungsmelder_Motion] eq "motion" and [MeinGtag] eq "present") (set Sonos_Bad PlayURI http://mp3.ffh.de/radioffh/hqlivestream.mp3;;set Sonos_Bad Volume 20;;set Sonos_Bad Bass 0) DOELSEIF ([Sonos_Bad:transportState] eq "PLAYING" and [BZ.Bewegungsmelder_Motion] eq "noMotion") (set Sonos_Schlafzimmer RemoveMember Sonos_Bad;;sleep 4 quiet;;set Sonos_Bad stop)
Die Gesetzen Klammern sind rot markiert.
Mein Problem ist allerdings, dass alles was hinter dem "or" steht nicht berücksichtigt wird, sprich die Musik geht im Moment nur unter der Woche an. Wenn ich das umstelle, geht sie nur am Wochenende an.
Hat jemand eine Ahnung an was das liegen könnte?
Vielen Dank und Gruß Fixel
Hi Fixel,
also ich habe ein ähnliches Konstrukt genauso laufen, um die FB Heizung zu steuern. Das tut es genau wie gewünscht:
defmod di_Hzg DOIF (([05:45-09:00|8] or [07:00-22:00|7] or [16:00-22:00|8]) and [AlleAnwesend] eq "present" and [SensorR2_Weather:temperature] < 24 and [SensorAussen:temperature] < 15) ((set HzgBad,HzgFlur,HzgKu on)) DOELSE ((set HzgBad,HzgFlur,HzgKu off))
Ich befürchte bei Dir ist die ganze Konstruktion mit den DOELSEIF nicht ganz klar. Ich weiß nicht genau wie DOIF das behandelt.
Aber wenn der erste Zweig war ist, also es ist Montag 5:30 dann macht er set Sonos_Schlafzimmer AddMember Sonos_Bad;;set Sonos_Bad Bass 10 und in die anderen Zweige kommt er doch gar nicht? Der erste ist doch war gewesen und fertig. Oder???
Gruß Otto
Zeilenumbrüche und Einrückungen können auch helfen Fehler zu erkennen ;)