Ich habe versucht meine langjährig funktionierende Rolladensteuerung um eine automatische Beschattung zu erweitern.
Leider habe ich jetzt irgendein logisches Problem, wie kann ich das testen wo der Fehler liegt?
([[Rollo_runter]-[Rollo_hoch]]
and [RolloAutomatikDY:state] eq "Ein")
(set EG.Bu.Ra.RolladenLinks down)
DOELSEIF (![[Rollo_runter]-[Rollo_hoch]]
and [?RolloAutomatikDY:state] eq "Ein"
and [?WetterProplanta:fc0_tempMax:d] > [MaxTempRollo]
and [?myTw:azimuth:d] > 60
and [?myTw:azimuth:d] < 180)
(set EG.Bu.Ra.RolladenLinks 40)
DOELSEIF
((![[Rollo_runter]-[Rollo_hoch]]
and [?RolloAutomatikDY:state] eq "Ein")
or ([?RolloAutomatikDY:state] eq "Ein"
and [EG.Bu.Ra.RolladenLinks:state] eq "40"
and ([?myTw:azimuth:d] < 60 or [?myTw:azimuth:d] > 180)))
(set EG.Bu.Ra.RolladenLinks up)
Hier gibt es Hinweise https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche
Zitat von: Ellert am 04 August 2018, 16:38:47
Hier gibt es Hinweise https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche
Das kenne ich
Und angewendet?
Zitat von: Ellert am 04 August 2018, 19:01:38
Und angewendet?
Ja sicher, hat mit aber im konkreten Fall nicht weitergeholfen.
Schon mal deine Klammern in der 3. Bedingung kontrolliert?
Zitat von: amenomade am 05 August 2018, 18:46:39
Schon mal deine Klammern in der 3. Bedingung kontrolliert?
ja, mehrfach
Zitat von: Fredi69 am 05 August 2018, 20:37:56
ja, mehrfach
Etwas stimmt aber nicht:
Bedingung 2
(![[Rollo_runter]-[Rollo_hoch]] and [?RolloAutomatikDY:state] eq "Ein" and ... and .... and ... and
Bedingung 3
(![[Rollo_runter]-[Rollo_hoch]] and [?RolloAutomatikDY:state] eq "Ein")
or ( etwas anderes )
Was passiert genau? Was ist das Problem? Kannst Du ein "list" vom DOIF posten, wenn er sich in einem nicht gewünschtem Zustand befindet?
Hier das List:
Internals:
DEF ([[Rollo_runter]-[Rollo_hoch]]
and [RolloAutomatikDY:state] eq "Ein")
(set EG.Bu.Ra.RolladenLinks down)
DOELSEIF (![[Rollo_runter]-[Rollo_hoch]]
and [?RolloAutomatikDY:state] eq "Ein"
and [?WetterProplanta:fc0_tempMax:d] > [MaxTempRollo]
and [?myTw:azimuth:d] > 60
and [?myTw:azimuth:d] < 180)
(set EG.Bu.Ra.RolladenLinks 40)
DOELSEIF
((![[Rollo_runter]-[Rollo_hoch]]
and [?RolloAutomatikDY:state] eq "Ein")
or ([?RolloAutomatikDY:state] eq "Ein"
and [EG.Bu.Ra.RolladenLinks:state] eq "40"
and ([?myTw:azimuth:d] < 60 or [?myTw:azimuth:d] > 180)))
(set EG.Bu.Ra.RolladenLinks up)
MODEL FHEM
NAME Rollo_Buero_Links_DI
NR 285
NTFY_ORDER 50-Rollo_Buero_Links_DI
STATE cmd_3
TYPE DOIF
READINGS:
2018-08-06 12:41:27 Device EG.Bu.Ra.RolladenLinks
2018-08-06 12:41:07 cmd 3
2018-08-06 12:41:07 cmd_event EG.Bu.Ra.RolladenLinks
2018-08-06 12:41:07 cmd_nr 3
2018-08-06 12:41:27 e_EG.Bu.Ra.RolladenLinks_state on
2018-08-06 12:40:48 mode enabled
2018-08-06 12:41:07 state cmd_3
2018-08-06 12:40:48 timer_01_c01 06.08.2018 21:42:01
2018-08-06 12:40:48 timer_02_c01 07.08.2018 06:39:55
2018-08-06 12:40:48 timer_03_c02 06.08.2018 21:42:01
2018-08-06 12:40:48 timer_04_c02 07.08.2018 06:39:55
2018-08-06 12:40:48 timer_05_c03 06.08.2018 21:42:01
2018-08-06 12:40:48 timer_06_c03 07.08.2018 06:39:55
Regex:
attr:
cmdState:
wait:
waitdel:
condition:
0 DOIF_time($hash,0,1,$wday,$hms) and ReadingValDoIf($hash,'RolloAutomatikDY','state') eq "Ein"
1 !DOIF_time($hash,2,3,$wday,$hms) and ReadingValDoIf($hash,'RolloAutomatikDY','state') eq "Ein" and ReadingValDoIf($hash,'WetterProplanta','fc0_tempMax','','d') > InternalDoIf($hash,'MaxTempRollo','STATE') and ReadingValDoIf($hash,'myTw','azimuth','','d') > 60 and ReadingValDoIf($hash,'myTw','azimuth','','d') < 180
2 (!DOIF_time($hash,4,5,$wday,$hms) and ReadingValDoIf($hash,'RolloAutomatikDY','state') eq "Ein") or (ReadingValDoIf($hash,'RolloAutomatikDY','state') eq "Ein" and ReadingValDoIf($hash,'EG.Bu.Ra.RolladenLinks','state') eq "40" and (ReadingValDoIf($hash,'myTw','azimuth','','d') < 60 or ReadingValDoIf($hash,'myTw','azimuth','','d') > 180))
days:
devices:
0 RolloAutomatikDY
1 MaxTempRollo
2 EG.Bu.Ra.RolladenLinks
all RolloAutomatikDY MaxTempRollo EG.Bu.Ra.RolladenLinks
do:
0:
0 set EG.Bu.Ra.RolladenLinks down
1:
0 set EG.Bu.Ra.RolladenLinks 40
2:
0 set EG.Bu.Ra.RolladenLinks up
3:
helper:
event deviceMsg: up (to VCCU),level: 100,motor: stop:up,pct: 100,up,timedOn: down,RSSI: -57,RAWMSG: E504362,0000,ADBDAD0F,FF,FFC7,C6A4105043622CD9940601C800
globalinit 1
last_timer 6
sleeptimer -1
timerdev EG.Bu.Ra.RolladenLinks
timerevent deviceMsg: up (to VCCU),level: 100,motor: stop:up,pct: 100,up,timedOn: down,RSSI: -57,RAWMSG: E504362,0000,ADBDAD0F,FF,FFC7,C6A4105043622CD9940601C800
triggerDev EG.Bu.Ra.RolladenLinks
DOIF_eventas:
cmd_nr: 3
cmd: 3
cmd_event: EG.Bu.Ra.RolladenLinks
state: cmd_3
timerevents:
deviceMsg: up (to VCCU)
level: 100
motor: stop:up
pct: 100
up
timedOn: down
RSSI: -57
RAWMSG: E504362,0000,ADBDAD0F,FF,FFC7,C6A4105043622CD9940601C800
timereventsState:
deviceMsg: up (to VCCU)
level: 100
motor: stop:up
pct: 100
state: on
timedOn: down
RSSI: -57
RAWMSG: E504362,0000,ADBDAD0F,FF,FFC7,C6A4105043622CD9940601C800
triggerEvents:
deviceMsg: up (to VCCU)
level: 100
motor: stop:up
pct: 100
up
timedOn: down
RSSI: -57
RAWMSG: E504362,0000,ADBDAD0F,FF,FFC7,C6A4105043622CD9940601C800
triggerEventsState:
deviceMsg: up (to VCCU)
level: 100
motor: stop:up
pct: 100
state: on
timedOn: down
RSSI: -57
RAWMSG: E504362,0000,ADBDAD0F,FF,FFC7,C6A4105043622CD9940601C800
internals:
1 MaxTempRollo:STATE
all MaxTempRollo:STATE
interval:
0 -1
1 0
2 -1
3 2
4 -1
5 4
intervalfunc:
itimer:
all Rollo_runter Rollo_hoch
localtime:
0 1533584521
1 1533616795
2 1533584521
3 1533616795
4 1533584521
5 1533616795
readings:
0 RolloAutomatikDY:state
2 EG.Bu.Ra.RolladenLinks:state
all RolloAutomatikDY:state EG.Bu.Ra.RolladenLinks:state
realtime:
0 21:42:01
1 06:39:55
2 21:42:01
3 06:39:55
4 21:42:01
5 06:39:55
time:
0 [Rollo_runter]
1 [Rollo_hoch]
2 [Rollo_runter]
3 [Rollo_hoch]
4 [Rollo_runter]
5 [Rollo_hoch]
timeCond:
0 0
1 0
2 1
3 1
4 2
5 2
timer:
0 0
1 0
2 0
3 0
4 0
5 0
timers:
0 0 1
1 2 3
2 4 5
trigger:
triggertime:
1533584521:
localtime 1533584521
hash:
1533616795:
localtime 1533616795
hash:
uiState:
uiTable:
Attributes:
DbLogExclude .*
room Steuerung
Obwohl die Werte von TempMax und Azimuth passen ist der Rolladen oben.
Und warum wäre das falsch? Bedingung 3 ist wahr. Dann ist cmd_3 keine schlechte Auswahl.
Zitat von: amenomade am 06 August 2018, 22:22:25
Und warum wäre das falsch? Bedingung 3 ist wahr. Dann ist cmd_3 keine schlechte Auswahl.
Ich hätte erwartet , das bei einem Azimuth von beispielhaft 160 Bedingung 2 wahr ist!
Aber EG.Bu.Ra.RolladenLinks:state hat getriggert.
Zitat2018-08-06 12:41:27 e_EG.Bu.Ra.RolladenLinks_state on
Zitat von: CommandRefZu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten.
Um 12:42 hat EG.Bu.Ra.RolladenLinks:state getriggert. Dann wurde die einzige Bedingung bewertet, die EG.Bu.Ra.RolladenLinks:state beinhaltet, sprich die 3. Da die Bedingung 3 (auch) wahr ist, wird cmd_3 durchgeführt.
Zitat von: amenomade am 06 August 2018, 22:33:14
Aber EG.Bu.Ra.RolladenLinks:state hat getriggert.
Sorry, das verstehe ich leider nicht.
Ohne die Azimuth Abfrage läuft alles wie gewünscht, mit der Azimuth Abfrage nicht mehr.
Um 12:41 Uhr ist EG.Bu.Ra.RolladenLinks:state auf "on" gesprungen.
2018-08-06 12:41:27 e_EG.Bu.Ra.RolladenLinks_state on
EDIT: dann weiss man nicht mehr was er früher für einen Wert hatte, aber um 12:41:07 hat sich der Wert auch geändert:
2018-08-06 12:41:07 cmd_event EG.Bu.Ra.RolladenLinks
und dieses Event ist der Trigger des DOIFs gewesen.
Dann wurde das DOIF getriggert, und die Bedingung 3 bewertet. Da Bedingung 3 wahr war, wurde cmd_3 durchgeführt. Was genau verstehst Du nicht?
Herzlichen Dank.
Wenn ich alles richtig verstanden habe muss ich das Ende der Bedingung 3 wie folgt ändern:
...and [?EG.Bu.Ra.RolladenLinks:state] eq "40"
and ([myTw:azimuth:d] < 60 or [myTw:azimuth:d] > 180)
Damit wird nur über den Wert von Azimuth getriggert aber nicht über den Stand des Rollos, der wird nur abgefragt, richtig?
Ja, so wird es anders getriggert. Somit wird es bei jeder Änderung von myTw:azimuth (und nicht mehr von EG.Bu.Ra.RolladenLinks) getriggert.
Aber m.m.N. ist immer noch deine Klammerkombination in Bedingung 3 falsch, so dass in manchen Fälle cmd_3 immer noch durchgeführt wird, egal welchen Wert myTw:azimuth hat.
Zitat von: amenomade am 07 August 2018, 22:49:00
...Aber m.m.N. ist immer noch deine Klammerkombination in Bedingung 3 falsch, so dass in manchen Fälle cmd_3 immer noch durchgeführt wird, egal welchen Wert myTw:azimuth hat.
Dann verrate mir doch bitte einfach welche Klammerkombination deiner Meinung nach falsch ist.
Beispiel: sagen wir mal, dass
- "Rollo_runter" = 22:00
- "Rollo_hoch" = 07:00
- "RolloAutomatikDY" = Ein
- "WetterProplanta:fc0_tempMax" = 30
- "MaxTempRollo" = 25
Um 22:00 triggert die Zeit, Bedingung 1 wird wahr => Rollos runter.
Um 7:00 triggert die Zeit wieder. Abhängig von azimuth
=> wenn an die Uhrzeit azimuth > 60 => Rollos 40 (1)
=> wenn an die Uhrzeit azimuth < 60 => Rollos hoch (2)
Egal ob (1) oder (2) : dann wird azimuth sich ändern. Nur Bedingung 3 wird jedes mal bewertet, und Bedingung 3 wird immer bis 22:00 wahr sein => die Rollos werden sofort hoch gehen, und bis 22:00 hoch bleiben.
Zitatverrate mir doch bitte einfach welche Klammerkombination deiner Meinung nach falsch ist.
1. ((![[Rollo_runter]-[Rollo_hoch]]
2. and [?RolloAutomatikDY:state] eq "Ein")
3. or ([?RolloAutomatikDY:state] eq "Ein"
4. and [?EG.Bu.Ra.RolladenLinks:state] eq "40"
5. and ([myTw:azimuth:d] < 60 or [myTw:azimuth:d] > 180)))
((1 and 2 ) or (3 and 4 and 5)) bleibt wahr solange 1 and 2 wahr sind (den ganzen Tag, wenn Automatik an), EGAL was 3 4 und 5 machen.
Da hast Du absolut recht, ich habe dann aber absolut keine Idee mein Vorhaben umzusetzen mit einem DOIF.
Kannst Du mir evtl. auf die Sprünge helfen?
Dann muss ich aber wissen, was Du genau machen möchtest: am Nacht zu, ist schon klar. Aber dann? Soll azimuth oder Zeit Vorrang haben? Was muss die Bewegung anstossen, was soll nur als Kontrolle dienen, usw.?
Ok, vielen Dank für Deine Hilfe.
- Vorrang hat immer die Zeit Rollo_hoch und Rollo_runter.
- Innerhalb der Rollo_hoch Zeit soll auf Azimuth und Temp_Max geprüft werden, ist der Wert zwischen des Azimuth zwischen a und b und [WetterProplanta:fc0_tempMax:d] > [MaxTempRollo] , dann Rollo auf 40.
- Bei Rollo_runter Zeit -> Rollo runter.