[gelöst] Verständigungsfrage Trigger

Begonnen von choetzu, 04 Juni 2018, 19:59:37

Vorheriges Thema - Nächstes Thema

choetzu

hallo,

ich habe folgendes DOIF. Das DOIF sollte bewirken, dass wenn die Aussentemp > 23 oder Bürotemp >26 ist (=Trigger) die Aussenrolladen runtergehen. Vorausgesetzt es ist zwischen 10-20.30 uhr, Sommer-Storen-Dumm ist auf on, und die Bürostore ist nicht schon "closed", sowie cmd ist nicht 1.

Hmm, eigentlich doch einfach. Doch heute habe ich aufgrund eines Gewitters die Storen hochgemacht. Dabei war cmd_nr 1. Also sollten doch die Storen nciht wieder runtergehen, bevor es um Mitternacht auf cmd_2 wechselt. Wieso ging es trotzdem runter?  Ich weiss grad keinen Rat..

([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?Buero_ST_FSB61] ne "closed"
and ([PoolController:Pool_Aussen_Num]  > 23
or [Netatmo_Buero:temperature] > 26)
and [?$SELF:cmd_nr] ne "1")
(set Buero_ST_FSB61 closes)
(set Spiri_St_FSB61 closes)

DOELSEIF
([00:00])
()
Raspi3, EnOcean, Zwave, Homematic

amenomade

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

choetzu

here we go, buah ist der lang.. und soviel chinesisch. ;)

Internals:
   CHANGED   
   DEF        ([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?Buero_ST_FSB61] ne "closed"
and ([PoolController:Pool_Aussen_Num]  > 23
or [Netatmo_Buero:temperature] > 26)
and [?$SELF:cmd_nr] ne "1")
(set Buero_ST_FSB61 closes)
(set Spiri_St_FSB61 closes)

DOELSEIF
([00:00])
()
   MODEL      FHEM
   NAME       TEMP_Storen_Buero_Spiri_Sommer_DOIF
   NR         185
   NTFY_ORDER 50-TEMP_Storen_Buero_Spiri_Sommer_DOIF
   STATE      disabled
   TYPE       DOIF
   READINGS:
     2018-06-04 19:45:39   Device          PoolController
     2018-06-04 18:42:52   cmd             1.2
     2018-06-04 18:42:52   cmd_event       Netatmo_Buero
     2018-06-04 18:42:52   cmd_nr          1
     2018-06-04 18:42:52   cmd_seqnr       2
     2018-06-04 19:44:51   e_Netatmo_Buero_temperature 26.1
     2018-06-04 19:45:39   e_PoolController_Pool_Aussen_Num 19.44
     2018-06-04 19:47:34   last_cmd        disabled
     2018-06-04 19:47:34   mode            disabled
     2018-06-04 19:47:34   state           disabled
     2018-06-03 20:30:00   timer_01_c01    04.06.2018 10:00:00
     2018-06-03 20:30:00   timer_02_c01    04.06.2018 20:30:00
     2018-06-04 00:00:00   timer_03_c02    05.06.2018 00:00:00
     2018-06-04 18:42:52   wait_timer      no timer
   Regex:
   condition:
     0          DOIF_time($hash,0,1,$wday,$hms)  and InternalDoIf($hash,'Sommer_Storenzeit_Dummy','STATE') eq "on" and InternalDoIf($hash,'Buero_ST_FSB61','STATE') ne "closed" and (ReadingValDoIf($hash,'PoolController','Pool_Aussen_Num')  > 23 or ReadingValDoIf($hash,'Netatmo_Buero','temperature') > 26) and ReadingValDoIf($hash,'TEMP_Storen_Buero_Spiri_Sommer_DOIF','cmd_nr') ne "1"
     1          DOIF_time_once($hash,2,$wday)
   days:
   devices:
     0           PoolController Netatmo_Buero
     all         PoolController Netatmo_Buero
   do:
     0:
       0          set Buero_ST_FSB61 closes
       1          set Spiri_St_FSB61 closes
     1:
       0         
     2:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      Fluss_MS: 5.91 cm/s,Aussen: 19.44 °C,pH: 7.30 pH,Fluss: 5.27 m³/h,Druck: 536.96 mBar,Pool_Temp_Num: 26.12,Pool_Aussen_Num: 19.44
     globalinit 1
     last_timer 3
     sleepdevice Netatmo_Buero
     sleepsubtimer -1
     sleeptimer -1
     timerdev   PoolController
     timerevent Fluss_MS: 6.05 cm/s,Aussen: 22.12 °C,pH: 7.30 pH,Fluss: 5.12 m³/h,Druck: 534.54 mBar,Pool_Temp_Num: 26.19,Pool_Aussen_Num: 22.12
     triggerDev PoolController
     timerevents:
       Fluss_MS: 6.05 cm/s
       Aussen: 22.12 °C
       pH: 7.30 pH
       Fluss: 5.12 m³/h
       Druck: 534.54 mBar
       Pool_Temp_Num: 26.19
       Pool_Aussen_Num: 22.12
     timereventsState:
       Fluss_MS: 6.05 cm/s
       Aussen: 22.12 °C
       pH: 7.30 pH
       Fluss: 5.12 m³/h
       Druck: 534.54 mBar
       Pool_Temp_Num: 26.19
       Pool_Aussen_Num: 22.12
     triggerEvents:
       Fluss_MS: 5.91 cm/s
       Aussen: 19.44 °C
       pH: 7.30 pH
       Fluss: 5.27 m³/h
       Druck: 536.96 mBar
       Pool_Temp_Num: 26.12
       Pool_Aussen_Num: 19.44
     triggerEventsState:
       Fluss_MS: 5.91 cm/s
       Aussen: 19.44 °C
       pH: 7.30 pH
       Fluss: 5.27 m³/h
       Druck: 536.96 mBar
       Pool_Temp_Num: 26.12
       Pool_Aussen_Num: 19.44
   internals:
     0           Sommer_Storenzeit_Dummy:STATE Buero_ST_FSB61:STATE
     all         Sommer_Storenzeit_Dummy:STATE Buero_ST_FSB61:STATE
   interval:
     0          -1
     1          0
   intervalfunc:
   intervaltimer:
   itimer:
   localtime:
     0          1528099200
     1          1528137000
     2          1528149600
   perlblock:
   readings:
     0           PoolController:Pool_Aussen_Num Netatmo_Buero:temperature
     all         PoolController:Pool_Aussen_Num Netatmo_Buero:temperature
   realtime:
     0          10:00:00
     1          20:30:00
     2          00:00:00
   time:
     0          10:00:00
     1          20:30:00
     2          00:00:00
   timeCond:
     0          0
     1          0
     2          1
   timer:
     0          0
     1          0
     2          0
   timers:
     1           2
   trigger:
   triggertime:
     1528137000:
       localtime  1528137000
       hash:
     1528149600:
       localtime  1528149600
       hash:
   uiState:
   uiTable:
Attributes:
   alias      Sommer Store Büro Spiri DOIF
   event-on-change-reading state
   group      06_Temp
   icon       black/svg/thermometer-1
   room       01_Automatisierung
   wait       300
Raspi3, EnOcean, Zwave, Homematic

amenomade

#3
Kann nichts feststellen. Bist Du sicher, dass cmd_nr tatsächlich bei 1 war?

Dein DOIF ist disabled. Hast Du etwas, dass dein DOIF mit "set DOIFname disable" und vielleicht dann "set DOIFname initialize" steuert? Dann wäre cmd_nr nicht 1

Wann hast Du die Storen hochgemacht, und waren die auf "closed"?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

choetzu

Zitat von: amenomade am 04 Juni 2018, 20:44:04
Kann nichts feststellen. Bist Du sicher, dass cmd_nr tatsächlich bei 1 war?

Dein DOIF ist disabled. Hast Du etwas, dass dein DOIF mit "set DOIFname disable" und vielleicht dann "set DOIFname initialize" steuert? Dann wäre cmd_nr nicht 1

Wann hast Du die Storen hochgemacht, und waren die auf "closed"?

danke für deine hilfe

ja ich bin mir ziemlich sicher, dass cmd_nr auf 1 war..100% aber doch nicht.. vielleicht 80%
ich habe es manuell disabled weil ein Hagelgewitter aufkam und ich nicht riskieren wollte, dass sie wieder runtergehen.
ich habe es so um 19.40 Uhr hochgefahren und ja, damals waren Sie auf "closed".
Raspi3, EnOcean, Zwave, Homematic

amenomade

Hmmm. Weitere Tests wären interessant. Wie gesagt, ich kann mir es nur erklären, wenn cmd_nr nicht auf 1 war. Ich habe jetzt es selbst auf einer Testinstallation simuliert... geht einfach wie gewünscht.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

choetzu

auch ich bin ratlos..
darf ich fragen, wie du eine solche Situation simulierst?
Raspi3, EnOcean, Zwave, Homematic

amenomade

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

Per

Zitat von: choetzu am 04 Juni 2018, 21:19:29ich habe es manuell disabled
Nach dem enablen hatte es cmd_1? Nicht vllt. 0? Lässt sich ja schnell nachstellen.

choetzu

#9
hallo zusammen,

ich glaube, ich habe den Fehler gefunden --> Meine Frau!! Also war ich mit meiner Annahme, dass es auf cmd_nr 1 war, doch vermutlich falsch.

und zwar kam das so: Am morgen hat meine Frau die Rolläden manuell (macht man doch nicht mehr ;) per Taster runtergelassen. Somit war es immer noch auf cmd_nr 2 vom Vorabend. Als ich nach hause kam, dachte ich, dass die Rolläden von selber (also cmd_nr 1) runter gegangen sind. Als das Gewitter kam, hat meine Frau die Rolläden hochgemacht per Taster, und somit blieb es immer noch bei cmd_nr 2. Weil die Temperatur noch > 23 war, sind sie dann wieder automatisch runter cmd_nr 1... bäng..

Damit das nicht mehr vorkommt, habe ich das DOIF angepasst, bin aber noch nicht sicher, ob es wirklich geht. Tests sind schonmal vielversprechend:

([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [Buero_ST_FSB61:"down"])
()

DOELSEIF
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?Buero_ST_FSB61:position] < 80
and ([PoolController:Pool_Aussen_Num]  > 23
or [Netatmo_Buero:temperature] > 26)
and [?$SELF:cmd_nr] !~ '^(1|2)$')
(set Buero_ST_FSB61 closes)

DOELSEIF
([00:00])
()


Also, sollte meine Frau manuell runterlassen --> cmd 1
Wenn sie wieder hochmacht und wieder runter und wieder hoch und wieder runter --> cmd 1 . Um Mitternacht gehts dann wieder auf cmd 3
Wenn meine Frau nicht runterlässt und die Temperaturschwelle überschritten wird --> cmd 2.
Wenn man dann manuell eingreift, bleibt es bei --> cmd 2

So bin ich safe. oder sehe ich etwas nicht?

Und dann noch eine "letzte" Frage:

Ich möchte dies bei all meinen Rolladen (11 Stück) machen. Aber ich möchte den Code nur einmal nutzen. Wie kann man das nun so gestalten, dass man nicht bei allen 10 Rolläden oben stehende Code reinmachen muss? Sub in MyUtils?
Raspi3, EnOcean, Zwave, Homematic

Per

Zitat von: choetzu am 05 Juni 2018, 21:33:28Ich möchte dies bei all meinen Rolladen (11 Stück) machen. Aber ich möchte den Code nur einmal nutzen. Wie kann man das nun so gestalten, dass man nicht bei allen 10 Rolläden oben stehende Code reinmachen muss? Sub in MyUtils?
Wenn alle auf die gleichen Trigger reagieren sollen, kannst du es in ein DOIF schreiben (evtl. mit FILTER und User-/DOIFReading). Sonst gibt es div. Möglichkeiten, für myUtils sehe ich aber zuwenig Perl.

[?$SELF:cmd_nr] !~ '^(1|2)$'
2 ist überflüssig wg. fehlendem do always
[?$SELF:cmd_nr] <> 1

amenomade

Zitat von: choetzu am 05 Juni 2018, 21:33:28
Und dann noch eine "letzte" Frage:

Ich möchte dies bei all meinen Rolladen (11 Stück) machen. Aber ich möchte den Code nur einmal nutzen. Wie kann man das nun so gestalten, dass man nicht bei allen 10 Rolläden oben stehende Code reinmachen muss? Sub in MyUtils?
Das Problem: dein DOIF reagiert auf cmd_nr. Aber jedes Gerät wäre in der Lage dies zu ändern. => Deine Sequenz Logik musst Du mit user-/DOIFReadings statt $SELF:cmd_nr umbasteln, wie von Per geschrieben.

Zitat von: Per am 05 Juni 2018, 22:58:11
[?$SELF:cmd_nr] <> 1
<> als Vergleichsoperator? In Perl?  :o ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

choetzu

Zitat von: amenomade am 06 Juni 2018, 08:22:27
Das Problem: dein DOIF reagiert auf cmd_nr. Aber jedes Gerät wäre in der Lage dies zu ändern. => Deine Sequenz Logik musst Du mit user-/DOIFReadings statt $SELF:cmd_nr umbasteln, wie von Per geschrieben.

super, danke per und amenomade... Eine Hürde genommen, die nächste steht an.. :)

Ich muss mich da in user/DOIFReadings (gibts DOIFReading überhaupt?) einlesen.. Sehe grad die Lösung nicht, wie man das machen muss...
Raspi3, EnOcean, Zwave, Homematic

amenomade

Damit meinte ich ganz normale Readings, die man mit setreading auf dem DOIF setzt.

Somit muss dein DOIF den Zustand von den jeweiligen  Geräte merken (und testen).
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

choetzu

hmm, ich komm etwas an meine Grenzen.

Zitat von: amenomade am 06 Juni 2018, 08:22:27
Deine Sequenz Logik musst Du mit user-/DOIFReadings statt $SELF:cmd_nr umbasteln, wie von Per geschrieben.

Sequenzlogik? Das klingt gut, aber für mich etwas schwierig nach zuvollziehen. Wenn du mit Sequenz den Befehlsabschnitt (set...) meinst, dann kann ich es irgendwie nachvollziehen.

Ich habs mal versucht, aber noch nicht getestet, da ich unterwegs bin. Könnte das so gehen? Oder völlig auf dem Holzpfad?

([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [.*_ST_.*:"down"]
        and [$device:DOIFReading] ne "1")
(set $device DOIFReading 1)

DOELSEIF
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?.*_ST_.*:position] < 80
and ([PoolController:Pool_Aussen_Num]  > 23
or [Netatmo_Buero:temperature] > 26)
and [?(set $DEVICE:DOIFReading] !~ '^(1|2)$')
(set $device closes)
                       (set $device DOIFReading 2)

DOELSEIF
([00:00])
Raspi3, EnOcean, Zwave, Homematic