[Solved] DOIF Zeitberechnung innerhalb Zeitspanne

Begonnen von n4rrOx, 22 August 2018, 16:50:06

Vorheriges Thema - Nächstes Thema

n4rrOx

Hallo,

ich komme einfach nicht auf den Fehler.

Eigentliche Intention war eine Zeitautomatik im Flur anhand der Bewegungsmelder + max. Helligkeit + Auswahl des Zeitraums mittels einer definierten Zeit oder rel. zu Sonnenaufgang / -untergang.
Die vorhergehende Lösung mit Bewegungsmelder + max. Helligkeit + definiertem Zeitraum hat ohne Probleme funktioniert.
Bei der Erweiterung mit der Automatik (und somit einer notwendigen Zeitberechnung für das Zeitintervall) sagt mir FHEM, dass die Timer nicht berechnet werden konnten, da das Format nicht passt?
Zitaterror: unknown expression format

Das ist der DOIF:

Internals:
   DEF        (
(
### Start Astro / Ende Zeit
(
[doif_flur_LichtAnAus:Automatik_Start] eq "Astro" and [doif_flur_LichtAnAus:Automatik_Ende] eq "Zeit" and
[[([dummy_astro:sunset_abs_real]+[doif_flur_LichtAnAus:Automatik_vor_sunset])] - [doif_flur_LichtAnAus:Zeitraum_bis]]
)
or
### Start Zeit / Ende Astro
(
[doif_flur_LichtAnAus:Automatik_Start] eq "Zeit" and [doif_flur_LichtAnAus:Automatik_Ende] eq "Astro" and
[[doif_flur_LichtAnAus:Zeitraum_von] - [([dummy_astro:sunrise_abs_civil]+[doif_flur_LichtAnAus:Automatik_nach_sunrise])]]
)
or
### Start Zeit / Ende Zeit
(
[doif_flur_LichtAnAus:Automatik_Start] eq "Zeit" and [doif_flur_LichtAnAus:Automatik_Ende] eq "Zeit" and
[[doif_flur_LichtAnAus:Zeitraum_von] - [doif_flur_LichtAnAus:Zeitraum_bis]]
)
or
### Start Astro / Ende Astro
(
[doif_flur_LichtAnAus:Automatik_Start] eq "Astro" and [doif_flur_LichtAnAus:Automatik_Ende] eq "Astro" and
[[([dummy_astro:sunset_abs_real]+[doif_flur_LichtAnAus:Automatik_vor_sunset])] - [([dummy_astro:sunrise_abs_civil]+[doif_flur_LichtAnAus:Automatik_nach_sunrise])]]
)
)
and
([flur_MotionSensor_1:Helligkeit] <= [doif_flur_LichtAnAus:unterHelligkeit] or [flur_MotionSensor_2:Helligkeit] <= [doif_flur_LichtAnAus:unterHelligkeit])
and
([flur_MotionSensor_1:reportedState] eq "open" or [flur_MotionSensor_2:reportedState] eq "open")
)
(set flur_Schaltaktor_LED on)
DOELSEIF
([flur_MotionSensor_1:reportedState] eq "closed" and [flur_MotionSensor_2:reportedState] eq "closed") (set flur_Schaltaktor_LED off)

   MODEL      FHEM
   NAME       doif_flur_LichtAnAus
   NR         302
   NTFY_ORDER 50-doif_flur_LichtAnAus
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-08-22 15:58:19   Automatik_Ende  Astro
     2018-08-22 15:58:19   Automatik_Start Astro
     2018-08-22 16:25:19   Automatik_nach_sunrise 3600
     2018-08-22 16:25:19   Automatik_vor_sunset 3600
     2018-08-22 15:58:19   Zeitraum_bis    06:00
     2018-08-22 15:58:19   Zeitraum_von    21:00
     2018-08-22 16:29:44   cmd             0
     2018-08-22 16:29:44   mode            enabled
     2018-08-22 16:29:44   state           initialized
     2018-08-22 16:29:44   timer_01_c01    error: unknown expression format
     2018-08-22 16:29:44   timer_02_c01    23.08.2018 06:00:00
     2018-08-22 16:29:44   timer_03_c01    22.08.2018 21:00:00
     2018-08-22 16:29:44   timer_04_c01    error: unknown expression format
     2018-08-22 16:29:44   timer_05_c01    22.08.2018 21:00:00
     2018-08-22 16:29:44   timer_06_c01    23.08.2018 06:00:00
     2018-08-22 16:29:44   timer_07_c01    error: unknown expression format
     2018-08-22 16:29:44   timer_08_c01    error: unknown expression format
     2018-08-22 15:58:19   unterHelligkeit 250
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0            ( ( ReadingValDoIf($hash,'doif_flur_LichtAnAus','Automatik_Start') eq "Astro" and ReadingValDoIf($hash,'doif_flur_LichtAnAus','Automatik_Ende') eq "Zeit" and DOIF_time($hash,0,1,$wday,$hms) ) or ( ReadingValDoIf($hash,'doif_flur_LichtAnAus','Automatik_Start') eq "Zeit" and ReadingValDoIf($hash,'doif_flur_LichtAnAus','Automatik_Ende') eq "Astro" and DOIF_time($hash,2,3,$wday,$hms) ) or ( ReadingValDoIf($hash,'doif_flur_LichtAnAus','Automatik_Start') eq "Zeit" and ReadingValDoIf($hash,'doif_flur_LichtAnAus','Automatik_Ende') eq "Zeit" and DOIF_time($hash,4,5,$wday,$hms) ) or ( ReadingValDoIf($hash,'doif_flur_LichtAnAus','Automatik_Start') eq "Astro" and ReadingValDoIf($hash,'doif_flur_LichtAnAus','Automatik_Ende') eq "Astro" and DOIF_time($hash,6,7,$wday,$hms) ) ) and  (ReadingValDoIf($hash,'flur_MotionSensor_1','Helligkeit') <= ReadingValDoIf($hash,'doif_flur_LichtAnAus','unterHelligkeit') or ReadingValDoIf($hash,'flur_MotionSensor_2','Helligkeit') <= ReadingValDoIf($hash,'doif_flur_LichtAnAus','unterHelligkeit'))  and  (ReadingValDoIf($hash,'flur_MotionSensor_1','reportedState') eq "open" or ReadingValDoIf($hash,'flur_MotionSensor_2','reportedState') eq "open")
     1          ReadingValDoIf($hash,'flur_MotionSensor_1','reportedState') eq "closed" and ReadingValDoIf($hash,'flur_MotionSensor_2','reportedState') eq "closed"
   days:
   devices:
     0           doif_flur_LichtAnAus flur_MotionSensor_1 flur_MotionSensor_2
     1           flur_MotionSensor_1 flur_MotionSensor_2
     all         doif_flur_LichtAnAus flur_MotionSensor_1 flur_MotionSensor_2
   do:
     0:
       0          set flur_Schaltaktor_LED on
     1:
       0          set flur_Schaltaktor_LED off
     2:
   helper:
     globalinit 1
     last_timer 8
     sleeptimer -1
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
     6          -1
     7          6
   intervalfunc:
   itimer:
     all         doif_flur_LichtAnAus
   localtime:
     1          1534996800
     2          1534964400
     4          1534964400
     5          1534996800
   readings:
     0           doif_flur_LichtAnAus:Automatik_Start doif_flur_LichtAnAus:Automatik_Ende flur_MotionSensor_1:Helligkeit doif_flur_LichtAnAus:unterHelligkeit flur_MotionSensor_2:Helligkeit flur_MotionSensor_1:reportedState flur_MotionSensor_2:reportedState
     1           flur_MotionSensor_1:reportedState flur_MotionSensor_2:reportedState
     all         doif_flur_LichtAnAus:Automatik_Start doif_flur_LichtAnAus:Automatik_Ende flur_MotionSensor_1:Helligkeit doif_flur_LichtAnAus:unterHelligkeit flur_MotionSensor_2:Helligkeit flur_MotionSensor_1:reportedState flur_MotionSensor_2:reportedState
   realtime:
     1          06:00:00
     2          21:00:00
     4          21:00:00
     5          06:00:00
   time:
     0          [([dummy_astro:sunset_abs_real]+[doif_flur_LichtAnAus:Automatik_vor_sunset])]
     1          [doif_flur_LichtAnAus:Zeitraum_bis]
     2          [doif_flur_LichtAnAus:Zeitraum_von]
     3          [([dummy_astro:sunrise_abs_civil]+[doif_flur_LichtAnAus:Automatik_nach_sunrise])]
     4          [doif_flur_LichtAnAus:Zeitraum_von]
     5          [doif_flur_LichtAnAus:Zeitraum_bis]
     6          [([dummy_astro:sunset_abs_real]+[doif_flur_LichtAnAus:Automatik_vor_sunset])]
     7          [([dummy_astro:sunrise_abs_civil]+[doif_flur_LichtAnAus:Automatik_nach_sunrise])]
   timeCond:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
   timers:
     0           0  1  2  3  4  5  6  7
   triggertime:
     1534964400:
       localtime  1534964400
       hash:
     1534996800:
       localtime  1534996800
       hash:
   uiState:
   uiTable:
Attributes:
   disable    0
   room       02_Flur,21_ZWave
   userReadings Automatik_Start,Automatik_Ende,Zeitraum_von,Zeitraum_bis,unterHelligkeit,Automatik_vor_sunset,Automatik_nach_sunrise


list dummy_astro mit den Sonnenauf- und untergangszeiten:

Internals:
   NAME       dummy_astro
   NR         597
   STATE      <b>Sonnenaufgang:</b><br>
real: 06:32<br>
civil: 05:52<br>
<b>Sonnenuntergang:</b><br>
real: 20:23<br>
civil: 21:02
   TYPE       dummy
   READINGS:
     2018-08-22 00:00:30   sunrise_abs_civil 05:52
     2018-08-22 00:00:30   sunrise_abs_real 06:32
     2018-08-22 00:00:30   sunset_abs_civil 21:02
     2018-08-22 00:00:30   sunset_abs_real 20:23


Interessanterweise funktioniert ähnliche Angabe in einem anderen DOIF ohne Probleme:

([doif_RolloadenSteuerung:Automatik_hoch] eq "Astro" and [doif_RolloadenSteuerung:Wochentage] eq "alle" and [([dummy_astro:sunrise_abs_civil] + [doif_RolloadenSteuerung:Automatik_nach_sunrise])|AT WE]) 
({RolladenSteuern("ku_Rolladenaktor","doif_RolloadenSteuerung","ku_position_oben")}) ##Astro - alle Tage - hoch
DOELSEIF ....


Wo liegt mein Denkfehler??
Meiner Meinung bin ich strikt nach dem Fixtime Bsp. aus der commandref gegangen:
https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung

Bitte um Hilfe.
Besten Dank vorab!


Freundliche Grüße
Mathias

Otto123

Hi,

ohne das ich verstanden habe was wirklich passiert :)

Was mir auffällt -> ]+[ versuch das mal so ] + [
Bei Timer 1 4 7 8

Nur eine Idee, weil das jetzt öfters vorkam.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

Um ein Problem beurteilen zu können, müssen hier alle Angaben gepostet werden.

Wenn zwei Werte an der Addition beteiligt sind, dann muss man natürlich beide betrachten und nicht nur einen.

Hier fehlt z. B. der Inhalt von: doif_flur_LichtAnAus:Automatik_vor_sunset

In der DOIF-Syntax sehe ich dazu keine Fehler.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

Zitat von: Damian am 22 August 2018, 17:40:56
Hier fehlt z. B. der Inhalt von: doif_flur_LichtAnAus:Automatik_vor_sunset
Ist das nicht der ? Das list vom  doif_flur_LichtAnAus ist doch komplett, oder verwechsle ich was?
Zitat2018-08-22 16:25:19   Automatik_vor_sunset 3600
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

Zitat von: Otto123 am 22 August 2018, 17:43:50
Ist das nicht der ? Das list vom  doif_flur_LichtAnAus ist doch komplett, oder verwechsle ich was?

OK. Jetzt sehe ich es auch.

Ich habe keine Probleme:

DEF        ([([d_test:start]+[d_test:sekunden])-[d_test:start]])
   MODEL      FHEM
   NAME       di_time
   NR         474
   NTFY_ORDER 50-di_time
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-08-22 18:06:46   cmd             0
     2018-08-22 18:06:46   mode            enabled
     2018-08-22 18:06:46   state           initialized
     2018-08-22 18:06:46   timer_01_c01    23.08.2018 13:00:00
     2018-08-22 18:06:46   timer_02_c01    23.08.2018 12:00:00


Internals:
   NAME       d_test
   NR         291
   STATE      12.00
   TYPE       dummy
   OLDREADINGS:
   READINGS:
     2018-08-22 18:05:10   sekunden        3600
     2018-08-22 18:05:43   start           12:00
   
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

#5
Naja war nur eine Idee  ;)
Ich kann es vor Struktur kaum lesen, ich würde den ganzen überflüssigen Plunder erstmal raus schmeissen.

Sowas hier ### Start Astro / Ende Zeit und die vielen Leerzeilen, Zeilenumbrüche hinter den Klammern  ... keine Ahnung was da geht und was nicht.

Empfehlung: Ich schreibe es erstmal immer in eine Zeile, teste ob es geht und dann mache ich es sehr verhalten "schön". Wenn es dann immer noch geht, ist es gut.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

Zitat von: Otto123 am 22 August 2018, 18:18:10
Naja war nur eine Idee  ;)
Ich kann es vor Struktur kaum lesen, ich würde den ganzen überflüssigen Plunder erstmal raus schmeissen.

Sowas hier ### Start Astro / Ende Zeit und die vielen Leerzeilen, Zeilenumbrüche hinter den Klammern  ... keine Ahnung was da geht und was nicht.

Empfehlung: Ich schreibe es erstmal immer in eine Zeile, teste ob es geht und dann mache ich es sehr verhalten "schön". Wenn es dann immer noch geht, ist es gut.

Gruß Otto

ja, normalerweise kommt eine andere Fehlermeldung, wenn Blödsinn im Timer-Reading drinsteht, wenn ich in meiner Testdefinition d_test:sekunden auf "bla" setze, dann kommt im DOIF:

2018-08-22 18:20:38   timer_01_c01    error: Wrong timespec bla: either HH:MM:SS or {perlcode}

Abspecken ist in solchem Fall eine sinnvolle Vorgehensweise.

DOIF-Definition sichern und einfach probieren:

define doif_flur_LichtAnAus DOIF ([[([dummy_astro:sunset_abs_real]+[doif_flur_LichtAnAus:Automatik_vor_sunset])] - [doif_flur_LichtAnAus:Zeitraum_bis]])

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

n4rrOx

Hallo Otto, hallo Damian,

Danke für eure Bemühungen.
Das mit den Leerzeichen vor/nach dem + oder - habe ich ebenfalls schon (ohne Erfolg) probiert gehabt.
Das ist ebenfalls in der Commandref mal so, mal so aufgeführt.
Habe den Code ein wenig eingerückt, dass man bei der "Klammerschlacht" überhaupt noch einen Durchblick hat. ^^

Zitat von: Damian am 22 August 2018, 18:27:40
[...]
Abspecken ist in solchem Fall eine sinnvolle Vorgehensweise.

DOIF-Definition sichern und einfach probieren:

define doif_flur_LichtAnAus DOIF ([[([dummy_astro:sunset_abs_real]+[doif_flur_LichtAnAus:Automatik_vor_sunset])] - [doif_flur_LichtAnAus:Zeitraum_bis]])

Habe ich probiert, leider mit gleichem Ergebnis:

Internals:
   DEF        ([[([dummy_astro:sunset_abs_real]+[doif_flur_LichtAnAus:Automatik_vor_sunset])] - [doif_flur_LichtAnAus:Zeitraum_bis]])
   MODEL      FHEM
   NAME       doif_flur_LichtAnAus
   NR         302
   NTFY_ORDER 50-doif_flur_LichtAnAus
   STATE      initialized<br />
Automatik Start: Astro<br />
Automatik Ende: Astro<br />
20:30 - 06:00 / <= 220 Lux
   TYPE       DOIF
   READINGS:
     2018-08-22 15:58:19   Automatik_Ende  Astro
     2018-08-22 15:58:19   Automatik_Start Astro
     2018-08-22 16:25:19   Automatik_nach_sunrise 3600
     2018-08-22 16:25:19   Automatik_vor_sunset 3600
     2018-08-22 16:56:09   Zeitraum_bis    06:00
     2018-08-22 16:53:17   Zeitraum_von    20:30
     2018-08-22 20:44:31   cmd             0
     2018-08-22 20:44:31   mode            enabled
     2018-08-22 20:44:31   state           initialized
     2018-08-22 20:44:31   timer_01_c01    error: unknown expression format
     2018-08-22 20:44:31   timer_02_c01    23.08.2018 06:00:00
     2018-08-22 16:53:29   unterHelligkeit 220
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          DOIF_time($hash,0,1,$wday,$hms)
   days:
   devices:
   do:
     0:
       0         
     1:
   helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
   interval:
     0          -1
     1          0
   intervalfunc:
   itimer:
     all         doif_flur_LichtAnAus
   localtime:
     1          1534996800
   realtime:
     1          06:00:00
   time:
     0          [([dummy_astro:sunset_abs_real]+[doif_flur_LichtAnAus:Automatik_vor_sunset])]
     1          [doif_flur_LichtAnAus:Zeitraum_bis]
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   triggertime:
     1534996800:
       localtime  1534996800
       hash:
   uiState:
   uiTable:
Attributes:
[...]


Anschließend habe ich noch weiter abgespeckt und konnte feststellen, dass die prinzipielle Zeitberechnung richtig funktioniert, es allerdings in Kombination mit einem Zeitraum zum besagten Fehler kommt.
Anbei der noch weiter abgespeckte Code ohne Fehlermeldung:

Internals:
   DEF        ([([dummy_astro:sunset_abs_real]+[doif_flur_LichtAnAus:Automatik_vor_sunset])])
   MODEL      FHEM
   NAME       doif_flur_LichtAnAus
   NR         302
   NTFY_ORDER 50-doif_flur_LichtAnAus
   STATE      initialized<br />
Automatik Start: Astro<br />
Automatik Ende: Astro<br />
20:30 - 06:00 / <= 220 Lux
   TYPE       DOIF
   READINGS:
     2018-08-22 15:58:19   Automatik_Ende  Astro
     2018-08-22 15:58:19   Automatik_Start Astro
     2018-08-22 16:25:19   Automatik_nach_sunrise 3600
     2018-08-22 16:25:19   Automatik_vor_sunset 3600
     2018-08-22 16:56:09   Zeitraum_bis    06:00
     2018-08-22 16:53:17   Zeitraum_von    20:30
     2018-08-22 20:40:26   cmd             0
     2018-08-22 20:40:26   mode            enabled
     2018-08-22 20:40:26   state           initialized
     2018-08-22 20:40:26   timer_01_c01    22.08.2018 21:23:00
     2018-08-22 16:53:29   unterHelligkeit 220


Im Umkehrschluss heißt das für mich, dass es am DOIF liegt und ich erstmal nichts an meiner Angabe ändern kann, um es zum Laufen zu bekommen?
Kann dies im Modul angepasst werden oder gibt es einen anderen Weg um an's Ziel zu kommen?`

Besten Dank vorab.

Grüße
Mathias

Damian

#8
Zitat von: n4rrOx am 22 August 2018, 20:52:51

Im Umkehrschluss heißt das für mich, dass es am DOIF liegt und ich erstmal nichts an meiner Angabe ändern kann, um es zum Laufen zu bekommen?
Kann dies im Modul angepasst werden oder gibt es einen anderen Weg um an's Ziel zu kommen?`

Besten Dank vorab.

Grüße
Mathias

Wenn du mir sagst, worin der Fehler begründet ist, wäre es kein Problem. Meine Definition mit ähnlichen Angaben funktioniert ja problemlos. Übrigens, die Fehlermeldung kommt nicht aus DOIF.

Baue meinen Test nach und schaue nach, ob dieser bei dir läuft, dann kannst du nach und nach deine Readings einbauen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

n4rrOx

Hallo Damian,

Kommando zurück!
Hatte wirklich ein [ ] Klammernpaar zu viel.

Übertragen auf dein Beispiel wäre richtig:
DEF        ([([d_test:start]+[d_test:sekunden])-[d_test:start]])

Meine fehlerhafte Angabe war:
DEF        ([[([d_test:start]+[d_test:sekunden])]-[d_test:start]])

Vielen Dank für die Unterstützung!