FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: greenBelt am 16 Oktober 2017, 14:34:55

Titel: DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 14:34:55
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
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: amenomade am 16 Oktober 2017, 14:56:35
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)

Titel: Antw:DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 15:06:12
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...
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 15:15:31
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...
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 15:24:59
es passiert nichts. Der Lichwert ist bei 64 aber das Rollo bleibt unten. Bin am verzweifeln :o
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: automatisierer am 16 Oktober 2017, 15:26:07
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







Titel: Antw:DOIF bei Autobeschattung
Beitrag von: automatisierer am 16 Oktober 2017, 15:27:31
Desweiteren macht eine and-Verknüpfung bei Event-Auswertung keinen Sinn, da niemals zwei Events gleichzeitig whar sein können...

Titel: Antw:DOIF bei Autobeschattung
Beitrag 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...
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 15:43:21
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
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: automatisierer am 16 Oktober 2017, 15:46:09
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...
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: amenomade am 16 Oktober 2017, 15:48:10
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.
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 15:54:03
ja warte, ich bau das grad um...
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 15:57:55
bekomme grad um die Ohren gehauen
DOIF: expected DOELSEIF or DOELSE:
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: amenomade am 16 Oktober 2017, 16:02:42
Ja, hatte ich übersehen.

Die 3. heisst DOELSEIF und nicht DOELSE. Nur die letzte heisst DOELSE.
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 16:07:36
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)

Titel: Antw:DOIF bei Autobeschattung
Beitrag von: Beta-User am 16 Oktober 2017, 16:08:09
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
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: amenomade am 16 Oktober 2017, 16:12:21
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.
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 16:15:49
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
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: automatisierer am 16 Oktober 2017, 16:17:34
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...
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: amenomade am 16 Oktober 2017, 16:21:18
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

Titel: Antw:DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 16:29:38
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!!

Titel: Antw:DOIF bei Autobeschattung
Beitrag 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...
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: Beta-User am 16 Oktober 2017, 16:36:48
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
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 16:39:43
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.

Titel: Antw:DOIF bei Autobeschattung
Beitrag von: Beta-User am 16 Oktober 2017, 16:43:35
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).
Titel: Antw:DOIF bei Autobeschattung
Beitrag von: greenBelt am 16 Oktober 2017, 16:56:52
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