Hauptmenü

Problem mit einem DOIF

Begonnen von Alcamar, 17 August 2017, 08:42:30

Vorheriges Thema - Nächstes Thema

Alcamar

Unter bestimmten Umständen, soll die Beleuchtung im Garten partiell oder komplett gesteuert werden:

  • [1] wenn ein Bewegungsmelder eine bestimmte Helligkeitsschwelle meldet und zugleich mindestens eine Terrassentür geöffnet ist
  • [2] wenn eine bestimmte Helligkeitsschwelle unterschritten ist und gleichzeitig die Anwohner abwesend sind und
  • [3] wenn am Freitag, Samstag und Sonntag zwischen 19:35 und 23:59 Uhr, Helligkeit und Temperatur ein bestimmtes Niveau haben und zusätzlich eine Terrassentür offen ist.
  • [4] Sonst ist das Licht komplett aus

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?





Per

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.

Alcamar

obwohl ich den Wert nicht logisch auswerte? Ok, das versuche ich mal nochmal zu durchdringen. :(

Ist die Lösung nun

  • die Deaktivierung der Luftfeuchtigkeitsmeldung vom Bewegungsmelder
oder

  • die Aufnahme der Luftfeuchtigkeit in eine DOIF-Verzweigung?

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


Per

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

Alcamar

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.

Per

Da die DOIF-Ref recht umfangreich ist, schau mal hier.

Alcamar

CheckReadingEvent = 1
Würde ich der commandref entnehmen, soll es lösen. Leider aber ohne Erfolg.
:-[

CoolTux

Ein list vom DOIF einmal beim korrekten Zustand und dann noch mal vom nicht gewünschten Zustand könnte helfen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Alcamar

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

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Alcamar

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!

CoolTux

Das Fragezeichen kommt ganz vorne hin. Also im Grunde vor dem Device

[?Blabla:blu]
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Alcamar

sehr gut, vielen Dank.
Die Syntax war für fhem ok gewesen.  :) Aber jetzt auch, und das Fragezeichen ist nun vorne.

Alcamar

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