Hauptmenü

DOIF bei Autobeschattung

Begonnen von greenBelt, 16 Oktober 2017, 14:34:55

Vorheriges Thema - Nächstes Thema

greenBelt

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

amenomade

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)

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

greenBelt

#2
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...

greenBelt

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...

greenBelt

es passiert nichts. Der Lichwert ist bei 64 aber das Rollo bleibt unten. Bin am verzweifeln :o

automatisierer

#5
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








automatisierer

Desweiteren macht eine and-Verknüpfung bei Event-Auswertung keinen Sinn, da niemals zwei Events gleichzeitig whar sein können...


automatisierer


(([?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...

greenBelt

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

automatisierer

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...

amenomade

#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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

greenBelt

ja warte, ich bau das grad um...

greenBelt

bekomme grad um die Ohren gehauen
DOIF: expected DOELSEIF or DOELSE:

amenomade

Ja, hatte ich übersehen.

Die 3. heisst DOELSEIF und nicht DOELSE. Nur die letzte heisst DOELSE.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

greenBelt

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)