FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Alcamar am 17 August 2017, 08:42:30

Titel: Problem mit einem DOIF
Beitrag von: Alcamar am 17 August 2017, 08:42:30
Unter bestimmten Umständen, soll die Beleuchtung im Garten partiell oder komplett gesteuert werden:

Die vier Verzweigungen funktionieren. Das Problem ist, dass cmd1 nach einer kurzen (wenige Minuten)
zufälligen Zeit auf cmd4 springt (alles aus) obwohl sich an den definierten DOIF-Bedingungen nichts geändert hat.
Lediglich der Bewegungssensor scheint zu diesem Zeitpunkt ein Event zu generieren, nämlich durch die zusätzlich noch gemessene Feuchtigkeit, die sich häufig ändert. Aber die sollte sich doch nicht auf DOIF auswirken, oder?

(
[Garten_Bewegungsmelder_1:brightness] < 90 and ## Helligkeit
([EG_FensterTerrasse_1] eq "open" or [EG_FensterTerrasse_2] eq "open") ## Wenn mind. eine der beiden Terassentüren geöffnet wird
)
(set GA_Schalter01 on) ## Randbeleuchtung
DOELSEIF
(
[Garten_Bewegungsmelder_1:brightness] < 90 and ## Helligkeit
[Residents] eq "absent" ## und Anwohner abwesend
)
(set GA_Schalter01 on, set GA_Schalter03 on) ## Zufallsschaltung für Randbeleuchtung. Todo

DOELSEIF
(
[19:35-23:59|57] and ## Zwischen 19:35 und 23:59 und an bestimmten Wochentagen
[EG_FensterTerrasse_2] eq "open" and ## Terrassenfenster 2 ist geöffnet
[Garten_Bewegungsmelder_1:brightness] < 120 and ## Helligkeit
[Garten_Thermometer:temperature] > 20 ## Außentemperatur
)
(set GA_Schalter0.* on)

DOELSE
(
set GA_Schalter0.* off
)


Ich setze Homematic ein.

Kann mir jedem einen Tipp geben?




Titel: Antw:Problem mit einem DOIF
Beitrag von: Per am 17 August 2017, 13:15:01
Zitat von: Alcamar am 17 August 2017, 08:42:30Lediglich der Bewegungssensor scheint zu diesem Zeitpunkt ein Event zu generieren, nämlich durch die zusätzlich noch gemessene Feuchtigkeit, die sich häufig ändert. Aber die sollte sich doch nicht auf DOIF auswirken, oder?
Doch, macht sie. Sie triggert den entsprechenden DO(ELSE)IF-Zweig an, wird dort als false bewertet und geht dann in den DOELSE-Zweig.
Titel: Antw:Problem mit einem DOIF
Beitrag von: Alcamar am 17 August 2017, 13:44:48
obwohl ich den Wert nicht logisch auswerte? Ok, das versuche ich mal nochmal zu durchdringen. :(

Ist die Lösung nun
oder

Bei dem ersten weiß ich gar nicht, ob das wirklich geht. Die Events brauche ich ja anderswo. Apropos, würde derzeit auch eine registrierte Bewegung des Bewegungsmelders zum Ausschalten des Lichts führen? Also analog der Luftfeuchtigkeitsänderung? Müsste ich ausprobieren.

Bei der zweiten Alternative müsste ich eine sinnfreie dummy-logik der Luftfeuchtigkeit einbinden? Garten_Bewegungsmelder_1:humidity > 0
:o

Titel: Antw:Problem mit einem DOIF
Beitrag von: Per am 17 August 2017, 14:38:29
Zitat von: Alcamar am 17 August 2017, 13:44:48Ist die Lösung nun
oder
Weder noch. Du sagst dem DOIF einfach, es solle nur ihn betreffende Events auswerten. In der CommandRef findest du den entsprechenden Befehl.

Nebenbei solltest du dir für dein nächstes Problem mit einem DOIF eine bessere Überschrift ausdenken ;).
Titel: Antw:Problem mit einem DOIF
Beitrag von: Alcamar am 17 August 2017, 14:56:19
wie würdest Du spontan eine treffendere Überschrift nennen?

Ich wollte schon "ungewollte Lichtorgel" benutzen. Dafür sind aber die Abständen zwischen ein und auschalten zu lang.  8)

Ich schaue, ob ich in der CommandRef schlauer werde. Mein bisheriger Blick darin, hat mir nicht auf die Sprünge helfen können. Aber ich schaue nochmal gezielt nach Events in DOIFs, jetzt wo ich weiß, dass die Luftfeuchtigkeitsmessung, die ich in meiner Syntax nicht nutze, das Problem ist. Danke dafür.
Titel: Antw:Problem mit einem DOIF
Beitrag von: Per am 17 August 2017, 15:41:15
Da die DOIF-Ref recht umfangreich ist, schau mal hier (https://fhem.de/commandref_DE.html#DOIF_checkReadingEvent).
Titel: Antw:Problem mit einem DOIF
Beitrag von: Alcamar am 17 August 2017, 21:49:56
CheckReadingEvent = 1
Würde ich der commandref entnehmen, soll es lösen. Leider aber ohne Erfolg.
:-[
Titel: Antw:Problem mit einem DOIF
Beitrag von: CoolTux am 17 August 2017, 22:00:33
Ein list vom DOIF einmal beim korrekten Zustand und dann noch mal vom nicht gewünschten Zustand könnte helfen.
Titel: Antw:Problem mit einem DOIF
Beitrag von: Alcamar am 17 August 2017, 22:18:44
So sollte es sein:

Internals:
   DEF        (
[Garten_Bewegungsmelder_1:brightness] < 90 and ## Helligkeit
([EG_FensterTerrasse_1] eq "open" or [EG_FensterTerrasse_2] eq "open") ## Wenn mind. eine der beiden Terassentüren geöffnet wird
)
(set GA_Schalter01 on) ## Randbeleuchtung
DOELSEIF
(
[Garten_Bewegungsmelder_1:brightness] < 90 and ## Helligkeit
[Residents] eq "absent" ## und Anwohner abwesend
)
(set GA_Schalter01 on, set GA_Schalter03 on) ## Zufallsschaltung für Randbeleuchtung. Todo

DOELSEIF
(
[19:35-23:59|57] and ## Zwischen 19:35 und 23:59 und an bestimmten Wochentagen
[EG_FensterTerrasse_2] eq "open" and ## Terrassenfenster 2 ist geöffnet
[Garten_Bewegungsmelder_1:brightness] < 120 and ## Helligkeit
[Garten_Thermometer:temperature] > 20 ## Außentemperatur
)
(set GA_Schalter0.* on)

DOELSE
(
set GA_Schalter0.* off
)

   NAME       di_Aussenbeleuchtung
   NR         1548
   NTFY_ORDER 50-di_Aussenbeleuchtung
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2017-08-17 22:12:51   Device          EG_FensterTerrasse_2
     2017-08-17 22:12:51   cmd             1
     2017-08-17 22:12:51   cmd_event       EG_FensterTerrasse_2
     2017-08-17 22:12:51   cmd_nr          1
     2017-08-17 22:08:17   e_EG_FensterTerrasse_1_STATE closed
     2017-08-17 22:12:51   e_EG_FensterTerrasse_2_STATE open
     2017-08-17 22:08:47   e_Garten_Bewegungsmelder_1_brightness 83
     2017-08-17 22:04:48   e_Garten_Thermometer_temperature 23.2
     2017-08-17 22:12:51   state           cmd_1
     2017-08-16 23:59:00   timer_01_c03    17.08.2017 19:35:00|57
     2017-08-16 23:59:00   timer_02_c03    17.08.2017 23:59:00|57
   condition:
     0            ReadingValDoIf($hash,'Garten_Bewegungsmelder_1','brightness') < 90 and  (InternalDoIf($hash,'EG_FensterTerrasse_1','STATE') eq "open" or InternalDoIf($hash,'EG_FensterTerrasse_2','STATE') eq "open")
     1            ReadingValDoIf($hash,'Garten_Bewegungsmelder_1','brightness') < 90 and  InternalDoIf($hash,'Residents','STATE') eq "absent"
     2            DOIF_time($hash,0,1,$wday,$hms,"57") and  InternalDoIf($hash,'EG_FensterTerrasse_2','STATE') eq "open" and  ReadingValDoIf($hash,'Garten_Bewegungsmelder_1','brightness') < 120 and  ReadingValDoIf($hash,'Garten_Thermometer','temperature') > 20
   days:
     0          57
     1          57
   devices:
     0           Garten_Bewegungsmelder_1 EG_FensterTerrasse_1 EG_FensterTerrasse_2
     1           Garten_Bewegungsmelder_1 Residents
     2           EG_FensterTerrasse_2 Garten_Bewegungsmelder_1 Garten_Thermometer
     all         Garten_Bewegungsmelder_1 EG_FensterTerrasse_1 EG_FensterTerrasse_2 Residents Garten_Thermometer
   do:
     0:
       0          set GA_Schalter01 on
     1:
       0          set GA_Schalter01 on, set GA_Schalter03 on
     2:
       0          set GA_Schalter0.* on
     3:
       0            set GA_Schalter0.* off
   helper:
     event      contact: open (to myVCCU),open,trigger_cnt: 235
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   EG_FensterTerrasse_2
     timerevent contact: open (to myVCCU),open,trigger_cnt: 235
     triggerDev EG_FensterTerrasse_2
     timerevents:
       contact: open (to myVCCU)
       open
       trigger_cnt: 235
     timereventsState:
       contact: open (to myVCCU)
       state: open
       trigger_cnt: 235
     triggerEvents:
       contact: open (to myVCCU)
       open
       trigger_cnt: 235
     triggerEventsState:
       contact: open (to myVCCU)
       state: open
       trigger_cnt: 235
   internals:
     0           EG_FensterTerrasse_1:STATE EG_FensterTerrasse_2:STATE
     1           Residents:STATE
     2           EG_FensterTerrasse_2:STATE
     all         EG_FensterTerrasse_1:STATE EG_FensterTerrasse_2:STATE Residents:STATE
   interval:
     0          -1
     1          0
   itimer:
   localtime:
     0          1502991300
     1          1503007140
   readings:
     0           Garten_Bewegungsmelder_1:brightness
     1           Garten_Bewegungsmelder_1:brightness
     2           Garten_Bewegungsmelder_1:brightness Garten_Thermometer:temperature
     all         Garten_Bewegungsmelder_1:brightness Garten_Thermometer:temperature
   realtime:
     0          19:35:00
     1          23:59:00
   regexp:
     0:
     1:
     2:
     all:
   state:
     STATE:
   time:
     0          19:35:00
     1          23:59:00
   timeCond:
     0          2
     1          2
   timer:
     0          0
     1          0
   timers:
     2           0  1
   trigger:
   triggertime:
     1503007140:
       localtime  1503007140
       hash:
Attributes:
   checkReadingEvent 1
   group      TriggerTime
   icon       time_automatic
   room       Außenbereich,Steuerung


und das ist der ungewünschte Zustand:

Internals:
   DEF        (
[Garten_Bewegungsmelder_1:brightness] < 90 and ## Helligkeit
([EG_FensterTerrasse_1] eq "open" or [EG_FensterTerrasse_2] eq "open") ## Wenn mind. eine der beiden Terassentüren geöffnet wird
)
(set GA_Schalter01 on) ## Randbeleuchtung
DOELSEIF
(
[Garten_Bewegungsmelder_1:brightness] < 90 and ## Helligkeit
[Residents] eq "absent" ## und Anwohner abwesend
)
(set GA_Schalter01 on, set GA_Schalter03 on) ## Zufallsschaltung für Randbeleuchtung. Todo

DOELSEIF
(
[19:35-23:59|57] and ## Zwischen 19:35 und 23:59 und an bestimmten Wochentagen
[EG_FensterTerrasse_2] eq "open" and ## Terrassenfenster 2 ist geöffnet
[Garten_Bewegungsmelder_1:brightness] < 120 and ## Helligkeit
[Garten_Thermometer:temperature] > 20 ## Außentemperatur
)
(set GA_Schalter0.* on)

DOELSE
(
set GA_Schalter0.* off
)

   NAME       di_Aussenbeleuchtung
   NR         1548
   NTFY_ORDER 50-di_Aussenbeleuchtung
   STATE      cmd_4
   TYPE       DOIF
   READINGS:
     2017-08-17 22:15:09   Device          Garten_Thermometer
     2017-08-17 22:15:09   cmd             4
     2017-08-17 22:15:09   cmd_event       Garten_Thermometer
     2017-08-17 22:15:09   cmd_nr          4
     2017-08-17 22:14:39   e_EG_FensterTerrasse_1_STATE closed
     2017-08-17 22:12:51   e_EG_FensterTerrasse_2_STATE open
     2017-08-17 22:14:47   e_Garten_Bewegungsmelder_1_brightness 83
     2017-08-17 22:15:09   e_Garten_Thermometer_temperature 23.1
     2017-08-17 22:15:09   state           cmd_4
     2017-08-16 23:59:00   timer_01_c03    17.08.2017 19:35:00|57
     2017-08-16 23:59:00   timer_02_c03    17.08.2017 23:59:00|57
   condition:
     0            ReadingValDoIf($hash,'Garten_Bewegungsmelder_1','brightness') < 90 and  (InternalDoIf($hash,'EG_FensterTerrasse_1','STATE') eq "open" or InternalDoIf($hash,'EG_FensterTerrasse_2','STATE') eq "open")
     1            ReadingValDoIf($hash,'Garten_Bewegungsmelder_1','brightness') < 90 and  InternalDoIf($hash,'Residents','STATE') eq "absent"
     2            DOIF_time($hash,0,1,$wday,$hms,"57") and  InternalDoIf($hash,'EG_FensterTerrasse_2','STATE') eq "open" and  ReadingValDoIf($hash,'Garten_Bewegungsmelder_1','brightness') < 120 and  ReadingValDoIf($hash,'Garten_Thermometer','temperature') > 20
   days:
     0          57
     1          57
   devices:
     0           Garten_Bewegungsmelder_1 EG_FensterTerrasse_1 EG_FensterTerrasse_2
     1           Garten_Bewegungsmelder_1 Residents
     2           EG_FensterTerrasse_2 Garten_Bewegungsmelder_1 Garten_Thermometer
     all         Garten_Bewegungsmelder_1 EG_FensterTerrasse_1 EG_FensterTerrasse_2 Residents Garten_Thermometer
   do:
     0:
       0          set GA_Schalter01 on
     1:
       0          set GA_Schalter01 on, set GA_Schalter03 on
     2:
       0          set GA_Schalter0.* on
     3:
       0            set GA_Schalter0.* off
   helper:
     event      T: 23.1 H: 64,temperature: 23.1
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   Garten_Thermometer
     timerevent T: 23.1 H: 64,temperature: 23.1
     triggerDev Garten_Thermometer
     timerevents:
       T: 23.1 H: 64
       temperature: 23.1
     timereventsState:
       state: T: 23.1 H: 64
       temperature: 23.1
     triggerEvents:
       T: 23.1 H: 64
       temperature: 23.1
     triggerEventsState:
       state: T: 23.1 H: 64
       temperature: 23.1
   internals:
     0           EG_FensterTerrasse_1:STATE EG_FensterTerrasse_2:STATE
     1           Residents:STATE
     2           EG_FensterTerrasse_2:STATE
     all         EG_FensterTerrasse_1:STATE EG_FensterTerrasse_2:STATE Residents:STATE
   interval:
     0          -1
     1          0
   itimer:
   localtime:
     0          1502991300
     1          1503007140
   readings:
     0           Garten_Bewegungsmelder_1:brightness
     1           Garten_Bewegungsmelder_1:brightness
     2           Garten_Bewegungsmelder_1:brightness Garten_Thermometer:temperature
     all         Garten_Bewegungsmelder_1:brightness Garten_Thermometer:temperature
   realtime:
     0          19:35:00
     1          23:59:00
   regexp:
     0:
     1:
     2:
     all:
   state:
     STATE:
   time:
     0          19:35:00
     1          23:59:00
   timeCond:
     0          2
     1          2
   timer:
     0          0
     1          0
   timers:
     2           0  1
   trigger:
   triggertime:
     1503007140:
       localtime  1503007140
       hash:
Attributes:
   checkReadingEvent 1
   group      TriggerTime
   icon       time_automatic
   room       Außenbereich,Steuerung
Titel: Antw:Problem mit einem DOIF
Beitrag von: CoolTux am 18 August 2017, 07:49:38
Das hier
event      T: 23.1 H: 64,temperature: 23.1
Scheint der Schaltens gewesen zu sein.
In dem Fall die Temperatur die Du ja auch drin hast.

Überlege am besten welche Voraussetzungen du triggern willst und welche du mir Abfragen willst. Die zum nur Abfragen setzt Du dann ein ? davor
Titel: Antw:Problem mit einem DOIF
Beitrag von: Alcamar am 18 August 2017, 09:23:34
Im Grunde ist das Öffnen einer Tür der Trigger um das Licht einzuschalten. Temperatur und Lichtverhältnisse sind Nebenbedinungen, die ich prüfe, aber nicht originär triggern sollten.
Wenn ich Dich richtig verstanden habe, müsste das dann so laufen:

(
[Garten_Bewegungsmelder_1:?brightness] < 90 and ## Helligkeit
([EG_FensterTerrasse_1] eq "open" or [EG_FensterTerrasse_2] eq "open") ## Wenn mind. eine der beiden Terassentüren geöffnet wird
)
(set GA_Schalter01 on) ## Randbeleuchtung
DOELSEIF
(
[Garten_Bewegungsmelder_1:?brightness] < 90 and ## Helligkeit
[Residents] eq "absent" ## und Anwohner abwesend
)
(set GA_Schalter01 on, set GA_Schalter03 on) ## Zufallsschaltung für Randbeleuchtung. Todo

DOELSEIF
(
[19:35-23:59|57] and ## Zwischen 19:35 und 23:59 und an bestimmten Wochentagen
[EG_FensterTerrasse_2] eq "open" and ## Terrassenfenster 2 ist geöffnet
[Garten_Bewegungsmelder_1:?brightness] < 120 and ## Helligkeit
[Garten_Thermometer:?temperature] > 20 ## Außentemperatur
)
(set GA_Schalter0.* on)

DOELSE
(
set GA_Schalter0.* off
)


Kann ich heute Abend prüfen.  :)
Danke!
Titel: Antw:Problem mit einem DOIF
Beitrag von: CoolTux am 18 August 2017, 10:15:15
Das Fragezeichen kommt ganz vorne hin. Also im Grunde vor dem Device

[?Blabla:blu]
Titel: Antw:Problem mit einem DOIF
Beitrag von: Alcamar am 18 August 2017, 10:25:07
sehr gut, vielen Dank.
Die Syntax war für fhem ok gewesen.  :) Aber jetzt auch, und das Fragezeichen ist nun vorne.
Titel: Antw:Problem mit einem DOIF
Beitrag von: Alcamar am 18 August 2017, 21:49:34
Super! Scheint zu funktionieren. Vielen Dank dafür.

Ich habe etwas dazu gelernt: Ein neuer Event sorgt, wohl dafür, dass der aktuelle cmd nicht gilt und der nächste gültige gesucht wird. In meinen Fall ist es DOELSE. Trotz mehrfaches lesen der DOIF Doku, habe ich das jetzt erst verstanden, was da drin steht.  :)