Hallo zusammen.
Habe mir eine Steuerung über DOIF zusammen gestellt.
Hatte bis jetzt auch funktioniert. Dort war nur die Überprüfung auf die Wochentage eingebaut bzw. abgefragt.
Habe dieses DOIF nun um einen "Automatikschalter" erweitert sowie eine Abfrage von einem Lichtsensor eingebaut.
Jedoch scheinen die neuen Abfragen nicht zu greifen, genau so wenig, wie das WAIT Attribut.
Jemand eine Idee, was da falsch läuft.
Hier mal die Listing der Definitionen.
DOIF
Internals:
DEF ([Automatik:state] eq "an" and [lichtsens:Indikator:d] > 40 and [09:45|7] or [07:30-09:00|8]) (set group=Jallo {(60+int(rand(40)))}) (set jallo3.stand [Jallo3:state])
NAME Jallo_up
NR 402
NTFY_ORDER 50-Jallo_up
STATE cmd_1
TYPE DOIF
Readings:
2016-10-17 08:49:56 Device lichtsens
2016-10-17 08:48:33 cmd 1.2
2016-10-17 08:48:33 cmd_event lichtsens
2016-10-17 08:48:33 cmd_nr 1
2016-10-17 08:48:33 cmd_seqnr 2
2016-10-17 08:49:56 e_lichtsens_Indikator 83
2016-10-17 08:48:33 state cmd_1
2016-10-17 08:42:14 timer_1_c1 17.10.2016 09:45:00|7
2016-10-17 08:42:14 timer_2_c1 18.10.2016 07:30:00|8
2016-10-17 08:42:14 timer_3_c1 17.10.2016 09:00:00|8
2016-10-17 08:48:33 wait_timer no timer
Condition:
0 ReadingValDoIf($hash,'Automatik','state','','',AttrVal($hash->{NAME},'notexist',undef)) eq "an" and ReadingValDoIf($hash,'lichtsens','Indikator','(-?\d+(\.\d+)?)','',AttrVal($hash->{NAME},'notexist',undef)) > 40 and DOIF_time_once($hash,$hash->{timer}{0},$wday,"7") or DOIF_time($hash,$hash->{realtime}{1},$hash->{realtime}{2},$wday,$hms,"8")
Days:
0 7
1 8
2 8
Devices:
0 Automatik lichtsens
all Automatik lichtsens
Do:
0:
0 set group=Jallo {(60+int(rand(40)))}
1 set jallo3.stand [Jallo3:state]
Helper:
event Indikator: 83
globalinit 1
last_timer 3
sleepdevice lichtsens
sleepsubtimer -1
sleeptimer -1
timerdev lichtsens
timerevent Indikator: 83
triggerDev lichtsens
timerevents:
Indikator: 83
timereventsState:
Indikator: 83
triggerEvents:
Indikator: 83
triggerEventsState:
Indikator: 83
Internals:
Interval:
1 -1
2 1
Itimer:
Localtime:
0 1476690300
1 1476768600
2 1476687600
Readings:
0 Automatik:state lichtsens:Indikator
all Automatik:state lichtsens:Indikator
Realtime:
0 09:45:00
1 07:30:00
2 09:00:00
Regexp:
0:
All:
State:
Time:
0 09:45:00
1 07:30:00
2 09:00:00
Timecond:
0 0
1 0
2 0
Timer:
0 0
1 0
2 0
Timers:
0 0 1 2
Trigger:
Triggertime:
1476687600:
localtime 1476687600
Hash:
1476690300:
localtime 1476690300
Hash:
1476768600:
localtime 1476768600
Hash:
Attributes:
alias Jallos Morgens auf
devStateIcon cmd_1:rc_1:disable cmd_2:rc_2:disable initialize:general_an@lime:disable disabled:general_aus@red:initialize initialized:general_an@orange:initialize
group Ja_St
icon fts_shutter_up@cyan
room 10_WoZi
wait 120,10
Dummy Automatik
Internals:
NAME Automatik
NR 407
STATE aus
TYPE dummy
Readings:
2016-10-17 07:37:27 state aus
Attributes:
alias Automatik für Jallo
devStateIcon an:general_an@lime:aus aus:general_aus@red:an
group Ja_St
icon time_automatic@lime
room 10_WoZi
Lichtsesnor
CHANGED
DEF 3A 39.4
IODev JL
JL_MSGCNT 16996
JL_RAWMSG OK 9 58 1 5 85 106
JL_TIME 2016-10-17 08:56:46
LASTInputDev JL
LaCrosse_lastRcv 2016-10-17 08:56:46
MSGCNT 16637
NAME lichtsens
NR 365
STATE T: 76
TYPE LaCrosse
addr 3A
battery_new 0
bufferedH
bufferedT
corr1 39.4
corr2 0
previousH 106
previousT 75.9
sensorType 0=T(H)
Readings:
2016-10-17 08:56:46 Indikator 80
2016-10-17 08:56:46 battery ok
2016-07-14 13:09:08 d 0
2016-09-30 19:17:42 indikator 0
2016-10-17 08:56:46 state T: 76
2016-10-17 08:56:46 temperature 76
Attributes:
IODev JL
doAverage 1
event-min-interval Indikator:1200
event-on-change-reading Indikator:4
group Licht
room 10_WoZi,80_Diagramme
userReadings Indikator { sprintf("%.0f",ReadingsVal("lichtsens","temperature",0)*1.05);;;;}
Die "Automatik" stand auch auf "aus", also hätten die Jallos gar nicht fahreen dürfen.l
Sind aber um punkt 7:30 Uhr hochgefahren, obwohl der Schwellwert für das Licht unter dem Wert von 40 lag.
Erwartet wird, dass wenn der Lichtwert über 40 ist und Automatik an ist, die Abfrage auf Wochentag oder Wochenende erfolgt, dann die Jallos auf einen Zufallswert zwischen 60% und 100% gefahren werden !
Gruß und Danke
Sascha
Hallo Sascha,
also ich mag falsch liegen, aber:
Dein ganzen "and" werden zusammengefasst die ergeben so wie Du sagst 0. Dann wird oder 7:30 gemacht, das ist um 7:30 = 1
0 oder 1 = 1
Alles richtig ;)
Du musst die Zeiten klammern, dann wird die Klammer oder verknüpft und dann erst mit dem Rest mit und.
Gruß Otto
Hallo Otto.
Du meinst um alle "or" Verknüpfungen eine Klammer, damit diese als erstes abgearbeite bzw zusammen gefasst wird ?
Hab gedacht, dass die Klammer nur sein muss, wenn die ODER vor einem UND steht.
Es gabe da mal einen Spruch: ODER vor UND wird es ohne Klammern ungesund ! ;)
Trifft doch hier nicht zu, oder ?
Du meinst dann also so ?
([Automatik:state] eq "an" and [lichtsens:Indikator:d] > 40 and ([09:45|7] or [07:30-09:00|8])) (set group=Jallo {(60+int(rand(40)))}) (set jallo3.stand [Jallo3:state])
Gruß und Danke
Sascha
Hallo Sascha,
naja, ich denke es ist egal ob es davor oder danach steht. In Perl hat UND die höhe Priorität, das ist wie PUNKT vor STRICH Rechnung.
Also erst wird geUNDet und dann geORt.
Ja, genau wie es jetzt ist sollte das gehen. Ich bin nach wie vor dafür: lieber eine Klammer mehr als eine zu wenig. ;)
Ich habe auch ein paar solche Konstrukte die laufen genau so. Ich schreibe allerdings immer die Zeiten vorne hin - da stimmt dann Dein Spruch wieder ;D
Und Du meinst das wait ging nicht? Da sehe ich aber nicht wieso.
Gruß Otto
Ich warte mal Morgen ab, wann die Jallos rauf fahren. Habe mir noch ein LOG für das DOIF angelegt um zu schauen, was wann passiert.
Werden dann nochmal was schreiben.
Danke für deine Hilfe
Gruß
Sascha
edit:
Habe das noch gefunden
https://forum.fhem.de/index.php/topic,58237.0.html (https://forum.fhem.de/index.php/topic,58237.0.html)
So, da bin ich wieder. Zum Glück habe ich Urlaub. 8)
Habe das DOIF ja gestern abgeändert.
([Automatik:state] eq "an" and [lichtsens:Indikator:d] > 40 and ([09:45|7] or [07:30-09:00|8])) (set group=Jallo {(60+int(rand(40)))}) (set jallo3.stand [Jallo3:state])
Da wir heute im Münsterland recht bescheidenes Wetter haben, ist es erst später hell geworden.
Ich habe eigentlich gedacht, dass das DOIF spätestens in der Woche dann die Rollos um 9:00 Uhr hoch fährt. Aber das der Wert des Lichtsensors, auf Grund des Wetters, nicht den Wert von 40 überschritten hat, sind die Rollos natürlich unten geblieben.
Die Frage ist, wie ich das DOIF abändern muss, damit die Rollos in der Woche spätestens um 9:00 Uhr hoch fahren, egal wie es draussen aussieht?
Gruß und Danke
Sascha
Hallo Sascha,
aus dem Bauch würde ich sagen einfach noch ein or [9:00|8] dazu? Allerdings macht er es auch wenn die Dinger schon oben sind.
Dann wäre besser ein DOELSEIF ([9:00|8]) () aber da muss Deine ganze Logik nochmal rein.
Du könntest auch den Lichtsensor odern
statt [lichtsens:Indikator:d] > 40
([lichtsens:Indikator:d] > 40 or [9:00|8])
Gruß Otto
Dankeschön für die Antwort.
Habe die Zeit von 9:00 Uhr auf 10:00 erhöht.
Mal schauen. Tage jetzt gerade das RBsmart Modul, ist gerade im Test. Ist für die Rollo Steuerung mit diversen Vorgaben!
Gruß Sascha