Hallo Leute,
ich quäle mich mit meiner Autobeschattung ab und komme irgendwie nicht so richtig weiter. Ich hoffe ein Experte kann sich einmal meinen Zustandsautomaten ansehen und mir einen Tipp geben.
Es soll folgendes gemacht werden:
Zwischen 10:00 und 17:00 UND Lichstsensor > 18000 ODER Aussentemperarur >1°C Fahre das Rollo auf 50%
Hier mein DOIF
(([?10:00 - 17:00]) and ["^Lichtsensor$:^B: >18000 $"] OR [HM_374E0D_Btn1:"^temperature:.>1$"]) (set Rollo 50)
DOELSEIF (["^Lichtsensor$:^B: <=6100 $"]) (set Rollo 70)
DOELSEIF (["^Lichtsensor$:^B: <5100 $"]) (set Rollo up)
Das DOIF bleibt allerdings im initialized stehen. Meine Versuche die OR-Bedingung raus zu nehmen bringen kein Erfolg.
Der folgende Code läßt das Rollo zwar herunter aber selbst wenn der Lichtsensor nur 200 LUX hat, fährt das Rolo nicht wieder hoch.
(["^Lichtsensor$:^B: >20000 $"] && [HM_374E0D_Btn1:"^temperature:.>1$"]) (set Rollo 50) DOELSE (["^Lichtsensor$:^B: <5100 $"]) (set Rollo 100)
Kann mir jemand den entscheidenden hint geben? Irgendwie stehe ich grad auf dem Schlauch. :(
Gruß,
Klaus
1 - And bindet mehr als or. Du hast folgendes geschrieben:
(Uhrzeit and Lichtsensor) or temperature
Die Temperatur steuert unabhängig von den anderen Bedingungen... Das bedeutet: wenn z.B. um 3 Uhr morgens die Temperatur über 1 geht, werden die Rollos gesteuert.
Ist das gewünscht?
2 - Die Zeitangabe steuert nicht (da Du "?" davorne hast). Wenn die anderen Bedingungen um 09:59 schon wahr sind, soll es um 10:00 fahren, oder nicht? Im Moment: nicht.
3 - ein "list Lichtsensor" und ein "list HM_374E0D_Btn1" wären hilfreich. Im Moment, verstehe ich, dass dein Device Lichtsensor ein Reading "B" hat, der den Wert liefert. Ebenso hätte dein Device HM_374E0D_Btn1 ein Reading temperature, mit dem Wert drinn. In dem Fall kannst Du es so schreiben:
([?10:00-17:00] and [Lichtsensor:B] > 18000"] or [HM_374E0D_Btn1:temperature] >1) (set Rollo 50)
DOELSEIF ([Lichtsensor:B] <= 6100) (set Rollo 70)
4 - ein "list" von deinem DOIF wäre auch interessant, um zu sehen, ob Du andere Attribute gesetzt hast. Im Moment bleibt dein Roll bei 50 solange die Temperatur über 1 Grad bleibt. Egal die Zeit, egal das Licht. Vielleicht ist es auch nötig (abhängig von deiner Antwort zu 1 und 2) attr do always zu setzen.
DOELSEIF ([Lichtsensor:B] < 5100) (set Rollo up)
Hi amenomade,
anbei das List des Lichtsensors
Internals:
CUL_1_MSGCNT 49
CUL_1_RAWMSG A0FDC865356CF6900000000C1003E606E::-103.5:CUL_1
CUL_1_RSSI -103.5
CUL_1_TIME 2017-10-16 14:57:09
DEF 56CF69
IODev CUL_1
LASTInputDev CUL_1
MSGCNT 49
NAME Lichtsensor
NOTIFYDEV global
NR 729
NTFY_ORDER 50-Lichtsensor
STATE B: 40879.18
TYPE CUL_HM
lastMsg No:DC - t:53 s:56CF69 d:000000 00C1003E606E
protLastRcv 2017-10-16 14:57:09
rssi_at_CUL_1 avg:-89.31 min:-103.5 max:-83 lst:-103.5 cnt:49
READINGS:
2017-10-16 12:36:01 Activity alive
2017-10-03 15:22:03 CommandAccepted yes
2017-10-03 15:21:14 D-firmware 1.1
2017-10-03 15:21:14 D-serialNr OEQ0229222
2017-10-03 15:22:03 PairedTo 0x983456
2017-10-03 15:19:58 R-cyclicInfoMsgDis 0
2017-10-03 15:22:03 R-pairCentral 0x983456
2017-10-03 15:19:58 R-sign off
2017-10-03 15:22:03 RegL_00. 02:01 0A:12 0B:34 0C:56 11:00 14:06 18:00 00:00
2017-10-03 15:22:03 RegL_01. 02:50 08:00 30:06 7B:08 AC:00 00:00
2017-10-16 14:57:09 battery ok
2017-10-16 14:57:09 brightness 40879.18
2017-10-16 14:57:09 state B: 40879.18
helper:
HM_CMDNR 220
mId 00FD
rxType 12
supp_Pair_Rep 0
expert:
def 1
det 0
raw 1
tpl 0
io:
newChn +56CF69,00,00,00
nextSend 1508158629.30377
prefIO
rxt 2
vccu
p:
56CF69
00
00
00
mRssi:
mNo DC
io:
CUL_1 -101.5
prt:
bErr 0
sProc 0
q:
qReqConf
qReqStat
role:
chn 1
dev 1
rssi:
at_CUL_1:
avg -89.3163265306122
cnt 49
lst -103.5
max -83
min -103.5
tmpl:
Attributes:
IODev CUL_1
actCycle 028:00
actStatus alive
autoReadReg 4_reqStatus
expert 2_raw
firmware 1.1
icon weather_sun
model HM-Sen-LI-O
room CUL_HM,Wohnzimmer
serialNr OEQ0229222
subType senBright
Uhrzeit mit UND Temperatur hatte ich auch schon getestet. Das Fragezeichen vor der Uhrzeit soll bewirken dass er die Zeit in diesem Test lesen soll.
Hier noch der Temperatur-list
Internals:
DEF 374E0D01
NAME HM_374E0D_Btn1
NOTIFYDEV global
NR 683
NTFY_ORDER 50-HM_374E0D_Btn1
STATE T: 25.4
TYPE CUL_HM
chanNo 01
device HM_374E0D
peerList 0x983456,
READINGS:
2017-10-16 12:36:01 peerList 0x983456,
2017-10-16 15:01:27 state T: 25.4
2017-10-16 15:01:27 temperature 25.4
helper:
getCfgListNo
expert:
def 1
det 0
raw 1
tpl 0
role:
chn 1
tmpl:
Attributes:
icon icoTempHausRegEG
model HM-WDS10-TH-O
peerIDs 0x983456,
room Wettervorhersage,Wohnzimmer
subType THSensor
den Code habe ich mir mit dem DOIFtools erzeugen lassen...
Ich habe das DOIF noch einmal angepasst:
(([?10:00 - 17:00]) and ["^Lichtsensor$:^B: gt 18000 $"] && [HM_374E0D_Btn1:"^temperature: >1$"]) (set Rollo 50)
DOELSEIF (["^Lichtsensor$:^B: <=6100 $"]) (set Rollo 70)
DOELSE (["^Lichtsensor$:^B: lt 5100 $"]) (set Rollo 30)
DOELSE (["^Lichtsensor$:^B: lt 4100 $"]) (set Rollo up)
Jetzt ist er wenigsten herunter gefahren. Die Readings sehen so aus:
Device
HM_374E0D_Btn1
2017-10-16 15:05:50
cmd
3.2
2017-10-16 15:13:47
cmd_event
HM_374E0D_Btn1
2017-10-16 15:13:47
cmd_nr
3
2017-10-16 15:13:47
cmd_seqnr
2
2017-10-16 15:13:47
e_HM_374E0D_Btn1_events
T: 25.4,temperature: 25.4
2017-10-16 15:05:50
state
cmd_3
2017-10-16 15:13:47
timer_01_c01
17.10.2017 10:00:00
2017-10-16 14:54:57
timer_02_c01
16.10.2017 17:00:00
Ich decke den sensor einmal ab, dann sollte er ja das Rolo hochfahren...
es passiert nichts. Der Lichwert ist bei 64 aber das Rollo bleibt unten. Bin am verzweifeln :o
Zitat
den Code habe ich mir mit dem DOIFtools erzeugen lassen...
ernsthaft??
Ich denke das hat DOIFtools erzeugt: EDIT:allerdings auch nicht mit dem Vergleich, den hast du da auch selber rein gebastelt...
["^Lichtsensor$:^B: >18000 $"]
und das hier hast du abgeleitet:
[Lichtsensor:B]
bei dem ersten Beispiel wertest du Events aus, bei dem zweiten ein Reading... und das "> 1800" gehört auch nicht mit in die eckigen Klammern...
Dein Lichtsensor hat aber kein "B" Reading...
[Lichtsensor:brightness] > 1800
wäre richtig
Desweiteren macht eine and-Verknüpfung bei Event-Auswertung keinen Sinn, da niemals zwei Events gleichzeitig whar sein können...
(([?10:00 - 17:00]) and ([Lichtsensor:brightness] > 18000 or [HM_374E0D_Btn1:temperature] > 1)) (set Rollo 50)
DOELSEIF ([Lichtsensor:brightness] <=6100) (set Rollo 70)
DOELSE ([Lichtsensor:brightness] < 5100) (set Rollo 30)
DOELSE ([Lichtsensor:brightness] < 4100) (set Rollo up)
try this...
wenn or stärker als and binden soll, musst die or Bedingungen einfach in Klammern packen... ist genau wie bei Punkt vor Strich in Mathe...
Habe die OR-Bedingung geklammert.
So sieht die Bedingung aktuell aus.
(([?10:00 - 17:00]) and (["^Lichtsensor$:^B: gt 18000 $"] && [HM_374E0D_Btn1:"^temperature: >1$"])) (set Rollo 50)
DOELSEIF (["^Lichtsensor$:^B: <=6100 $"]) (set Rollo 70)
DOELSE (["^Lichtsensor$:^B: lt 5100 $"]) (set Rollo 30)
DOELSE (["^Lichtsensor$:^B: lt 4100 $"]) (set Rollo up)
Den Lichtsensor habe ich abgedeckt und eigentlich sollte das Rollo hochfahren. Es stellt sich stur und bleibt unten.
Das Reading sieht so aus:
Device
HM_374E0D_Btn1
2017-10-16 15:34:02
cmd
3.2
2017-10-16 15:41:32
cmd_event
HM_374E0D_Btn1
2017-10-16 15:41:32
cmd_nr
3
2017-10-16 15:41:32
cmd_seqnr
2
2017-10-16 15:41:32
e_HM_374E0D_Btn1_events
T: 25.3,temperature: 25.3
2017-10-16 15:34:02
state
cmd_3
2017-10-16 15:41:32
timer_01_c01
17.10.2017 10:00:00
2017-10-16 14:54:57
timer_02_c01
16.10.2017 17:00:00
Zitat von: automatisierer am 16 Oktober 2017, 15:29:41
(([?10:00 - 17:00]) and ([Lichtsensor:brightness] > 18000 or [HM_374E0D_Btn1:temperature] > 1)) (set Rollo 50)
DOELSEIF ([Lichtsensor:brightness] <=6100) (set Rollo 70)
DOELSE ([Lichtsensor:brightness] < 5100) (set Rollo 30)
DOELSE ([Lichtsensor:brightness] < 4100) (set Rollo up)
try this...
wenn or stärker als and binden soll, musst die or Bedingungen einfach in Klammern packen... ist genau wie bei Punkt vor Strich in Mathe...
Nein. Lies mal, was man dir schreibt. Deine Syntax ist falsch für was du machen möchtests. Du triggerst immer noch auf Events, und nicht nach Bedingungen. Und 2 Events können nicht gleichzeitig "wahr" sein.
Ausserdem sehe ich keine OR Bedingung. && ist gleich AND.
Richtig ist:
(([?10:00 - 17:00]) and ([Lichtsensor:brightness] > 18000 or [HM_374E0D_Btn1:temperature] > 1)) (set Rollo 50)
DOELSEIF ([Lichtsensor:brightness] <=6100) (set Rollo 70)
DOELSE ([Lichtsensor:brightness] < 5100) (set Rollo 30)
DOELSE ([Lichtsensor:brightness] < 4100) (set Rollo up)
Allerdings, wird es auch nicht hochfahren, wenn du den Lichtsensor deckst, da Die Temperatur über 1 Grad bleibt. Dann ist "licht > 1800 or temp > 1" IMMER NOCH WAHR. Der DOIF wird nicht schalten.
EDIT: das Triggern auf Events ist sowieso falsch geschrieben, da der Vergleichswert NICHT zum Trigger gehört! Das würde auch nicht funktionieren. Das wurde dir auch schon gesagt.
ja warte, ich bau das grad um...
bekomme grad um die Ohren gehauen
DOIF: expected DOELSEIF or DOELSE:
Ja, hatte ich übersehen.
Die 3. heisst DOELSEIF und nicht DOELSE. Nur die letzte heisst DOELSE.
mag er auch nicht...
DOIF: expected DOELSEIF or DOELSE:
(([?10:00 - 17:00]) AND ([Lichtsensor:brightness] > 18000 )) (set Rollo 50)
DOELSEIF ([Lichtsensor:brightness] <=6100) (set Rollo 70)
DOELSEIF ([Lichtsensor:brightness] < 5100) (set Rollo 30)
DOELSE ([Lichtsensor:brightness] < 4100) (set Rollo up)
Es sind doch überall Bedingungen definiert. Also benötigt man m.E. überall DOELSEIF.
Dann (Experten mögen mich bitte korrigieren): bei den <-Abfragen sollte mit dem kleinsten Wert begonnen werden, sonst springt das ständig hin und her zwischen den letzten paar Zweigen. Beginnt man mit dem kleinsten Wert, sind die anderen Bedingungen zwar auch wahr, aber alles, was "weiter rechts/unten" steht, wird nicht mehr ausgewertet, sobald eine vorrangige Bedingung wahr ist.
Gruß, Beta-User
Ja stimmt... sowas passiert, wenn man 2 oder 3 Dinge gleichzeitig macht! Ein DOELSE nimmt keine Bedingung. Die letzte ist auch ein DOELSEIF.
ZitatDann (Experten mögen mich bitte korrigieren): bei den <-Abfragen sollte mit dem kleinsten Wert begonnen werden, sonst springt das ständig hin und her zwischen den letzten paar Zweigen. Beginnt man mit dem kleinsten Wert, sind die anderen Bedingungen zwar auch wahr, aber alles, was "weiter rechts/unten" steht, wird nicht mehr ausgewertet, sobald eine vorrangige Bedingung wahr ist.
Das ist abhängig von den anderen Attribute des DOIFs. Aber grundsächlich eher wahr. Er wird aber nicht hin und her springen, sondern auf die erste bleiben, die wahr ist. Auch wenn es immer dunkler wird.
nee, er bleibt dabei
DOIF: expected DOELSEIF or DOELSE:
(([?10:00 - 17:00]) AND ([Lichtsensor:brightness] > 18000 )) (set Rollo 50)
DOELSEIF ([Lichtsensor:brightness] <=6100) (set Rollo 70)
DOELSEIF ([Lichtsensor:brightness] < 5100) (set Rollo 30)
DOELSEIF ([Lichtsensor:brightness] < 4100) (set Rollo up)
Habe das auch schon alles durch. Irgendwie kommen wir hier nicht weiter. Habe jetzt die zwei mittleren DOELSEIF raus
(([?10:00 - 17:00]) AND ([Lichtsensor:brightness] > 18000 )) (set Rollo 50)
DOELSE ([Lichtsensor:brightness] < 4100) (set Rollo up)
Ich warte grad bis der Trigger kommt um das Rollo hochzufahren. Im Reading ist der State noch initialized
also bei mir meckert er nicht...
vieleicht solltest du mal den ganzen Code posten und nicht nur das was hinter DOIF steht
desweiteren kenne ich nur "and" und nicht "AND" hab aber keine Ahnung ob das was ausmacht...
Über den Sinn/Unsinn von Bedingungen und deren Reihenfolge hab ich mich mal noch gar nicht gekümmert... Geht hier auch scheinbar erst mal darum einem DOIF Grundsätze zu erklären...
Ich stimme zu.
Und es wäre so wie so sicherer es so zu schreiben:
([?10:00 - 17:00] and [Lichtsensor:brightness] > 18000 ) (set Rollo 50)
DOELSEIF ([Lichtsensor:brightness] <= 6100 and [Lichtsensor:brightness] >= 5100) (set Rollo 70)
DOELSEIF ([Lichtsensor:brightness] < 5100 and [Lichtsensor:brightness] >= 4100) (set Rollo 30)
DOELSEIF ([Lichtsensor:brightness] < 4100) (set Rollo up)
DOELSE
also das DOIF hat er nun akzeptiert. AND
darf man nicht schreiben. Das Reading schaut so aus:
Device
Lichtsensor
2017-10-16 16:21:06
cmd
0
2017-10-16 16:26:17
e_Lichtsensor_brightness
13.43
2017-10-16 16:21:06
state
initialized
2017-10-16 16:26:17
timer_01_c01
17.10.2017 10:00:00
2017-10-16 16:20:12
timer_02_c01
16.10.2017 17:00:00
2017-10-16 16:20:12
wait_timer
16.10.2017 16:31:06 cmd_2_1 Lichtsensor
2017-10-16 16:21:06
Und siehe da, es funktioniert!
SUPER DANKE !!!
Klasse Forum!!
Abwarten... oder, den Tag nicht vor dem Abend loben...
Ich bin gespannt ob dein DOIF schon genau das macht, was du von ihm erwartest...
Ich gehe davon aus, dass wir uns hier wieder sehen...
Zitat von: automatisierer am 16 Oktober 2017, 16:35:29
Abwarten... oder, den Tag nicht vor dem Abend loben...
Ich bin gespannt ob dein DOIF schon genau das macht, was du von ihm erwartest...
Ich gehe davon aus, dass wir uns hier wieder sehen...
;D
bin auch gespannt. Jedenfalls weiß ich jetzt (in etwa) was ich falsch gemacht habe!
Sollte sich das DOIF nicht wie erwartet das Rollo hochfahren funke ich hier noch einmal durch.
Zitat von: greenBelt am 16 Oktober 2017, 16:39:43
Sollte sich das DOIF nicht wie erwartet das Rollo hochfahren funke ich hier noch einmal durch.
Bitte dann aber gleich mit korrekter Lösung des Problems, sollte auch ohne unsere Hilfe klappen...
Und wenn es dann paßt, bitte den Thread als [gelöst] markieren (Anleitung: siehe Signatur).
also bisher läuft es gut! Das Rollo fährt wie gewünscht Stück für Stück hoch.
anbei noch der komplette Code au s der CFG
define Autobeschattung DOIF ([?10:00 - 17:00] and [Lichtsensor:brightness] > 18000 ) (set Rollo 50)\
DOELSEIF ([Lichtsensor:brightness] <= 6100 and [Lichtsensor:brightness] >= 5100) (set Rollo 70)\
DOELSEIF ([Lichtsensor:brightness] < 5100 and [Lichtsensor:brightness] >= 4100) (set Rollo 30)\
DOELSEIF ([Lichtsensor:brightness] < 4100) (set Rollo up)\
DOELSE\
\
\
attr Autobeschattung do always
attr Autobeschattung icon fts_blade_arc_close_100
attr Autobeschattung room Wohnzimmer
attr Autobeschattung wait 420:600
Perfekt! Es läuft so wie es soll!
Fall gelöst