FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: rabehd am 03 August 2017, 13:38:20

Titel: [gelöst] Leeres Zeit-Reading
Beitrag von: rabehd am 03 August 2017, 13:38:20
Ich habe schon einiges probiert, es steht auch in der Commandref, aber es funktioniert nicht. Ich bekomme für den Zweig immer eine Fehlermeldung.

Es gibt verschiedene Readings, welche eine Zeit im Format hh:mm enthält. Ist das Reading gefüllt, dann gibt es kein Problem.
([([Ort_Thailand:MoonRise]+[07:30])]) ({Log 3, "Beginn  Mondaufgang Thailand"})
Nun kann es jedoch sein, dass das Reading leer ist. Nach meinem Verständnis müßte es mit DOELSEIF ([([[Ort_Thailand:MoonSet,"13:29"]]+[07:30])]) ({Log 3, "Beginn  Monduntergang Thailand"}) funktionieren. Tut es aber nicht.

Wo liegt mein Fehler?
Danke
Titel: Antw:Leeres Zeit-Reading
Beitrag von: amenomade am 03 August 2017, 13:50:45
Zitat von: rabehd am 03 August 2017, 13:38:20
Ist das Reading gefüllt, dann gibt es Problem.
([([Ort_Thailand:MoonRise]+[07:30])]) ({Log 3, "Beginn  Mondaufgang Thailand"})
Gibt es wirklich Problem damit? Welches?

Zitat von: rabehd am 03 August 2017, 13:38:20
Nun kann es jedoch sein, dass das Reading leer ist. Nach meinem Verständnis müßte es mit
Code: [Auswählen]

DOELSEIF ([([[Ort_Thailand:MoonSet,"13:29"]]+[07:30])]) ({Log 3, "Beginn  Monduntergang Thailand"})

funktionieren. Tut es aber nicht.
Das kann nicht gehen: was bedeutet [Ort_Thailand:MoonSet,"13:29"]?
- Das ist weder Zeit noch Zeitintervall.
- Was soll diesen Zweig triggern, was das Reading leer ist?
Titel: Antw:Leeres Zeit-Reading
Beitrag von: rabehd am 03 August 2017, 14:02:07
Sorry, das fehlende Wort im ersten Beitrag habe ich ergänzt.
ZitatIst das Reading gefüllt, dann gibt es kein Problem.

Zitatwas bedeutet [Ort_Thailand:MoonSet,"13:29"]?
Ich bin hiernach gegangen https://fhem.de/commandref_DE.html#DOIF_notexist (https://fhem.de/commandref_DE.html#DOIF_notexist)
ZitatEs kommt immer wieder vor, dass in der Definition des DOIF-Moduls angegebene Readings oder Status zur Laufzeit nicht existieren. Der Wert ist dann leer. Bei der Definition von Status oder Readings kann für diesen Fall ein Vorgabewert oder sogar eine Perlberechnung am Ende des Ausdrucks kommagetrennt angegeben werden.

Syntax:

[<device>,<default value>]
oder
[<device>:<reading>,<default value>]

Beispiele:

[lamp,"off"]
[room:temperatur,20]
[brightness,3*[myvalue]+2]
[heating,AttrVal("mydevice","myattr","")]
[[mytime,"10:00"]]

Mein Verständnis: Nimm den Zeitwert aus dem Reading "MoonSet" des Devices "Ort_Thailand", sollte dieser Wert leer sein, dann nimm 13:29. (Zum Schluß addiere noch 07:30 dazu und löse zu diesem Zeitpunkt aus.)
Titel: Antw:Leeres Zeit-Reading
Beitrag von: nils_ am 03 August 2017, 14:28:20
Zitat von: rabehd am 03 August 2017, 13:38:20
Ich bekomme für den Zweig immer eine Fehlermeldung.

und die möchtest du uns nicht verraten??

was funktioniert denn eigentlich? und was nicht??
so ganz wird man aus deiner beschreibung nicht schlau.
Titel: Antw:Leeres Zeit-Reading
Beitrag von: rabehd am 03 August 2017, 14:33:54
Hilft ein List?
Internals:
   DEF        ([([Ort_Thailand:MoonRise]+[07:30])]) ({Log 3, "Beginn  Mondaufgang Thailand"})
DOELSEIF ([([[Ort_Thailand:MoonSet,"13:29"]]+[07:30])]) ({Log 3, "Beginn Monduntergang Thailand"})
   NAME       MondTag
   NR         428
   NTFY_ORDER 50-MondTag
   STATE      chn:40.5  phys:0
   TYPE       DOIF
   READINGS:
     2017-08-03 14:09:57   cmd             0
     2017-08-03 14:09:57   state           initialized
     2017-08-03 14:09:57   timer_01_c01    03.08.2017 17:43:00
     2017-08-03 14:09:57   timer_02_c02    error: Wrong timespec : either HH:MM:SS or {perlcode}
   condition:
     0          DOIF_time_once($hash,0,$wday)
     1          DOIF_time_once($hash,1,$wday)
   days:
   devices:
   do:
     0:
       0          {Log 3, "Beginn  Mondaufgang Thailand"}
     1:
       0          {Log 3, "Beginn Monduntergang Thailand"}
     2:
   helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
   itimer:
     all         Ort_Thailand
   localtime:
     0          1501774980
   realtime:
     0          17:43:00
   regexp:
     all:
   state:
     STATE:
   time:
     0          ([Ort_Thailand:MoonRise]+[07:30])
     1          ([[Ort_Thailand:MoonSet,"13:29"]]+[07:30])
   timeCond:
     0          0
     1          1
   timer:
     0          0
     1          0
   timers:
     0           0
     1           1
   triggertime:
     1501774980:
       localtime  1501774980
       hash:
Attributes:
   room       Aquarium
   stateFormat {Value("LD_blau.Mond")}


IF-Zeile  ist OK, weil das Reading gerade gefüllt ist
DOELSEIF-Zeile bringt die Fehlermeldung "error: Wrong timespec : either HH:MM:SS or {perlcode}", weil Reading heute Leer ist.

Das Ganze ist noch ein Testaufbau. Wenn alle Zweige richtig auslösen, dann steht da nicht mehr "Log" , sondern "set".
Titel: Antw:Leeres Zeit-Reading
Beitrag von: Per am 03 August 2017, 15:14:56
Warum hast du hier einfache
([([Ort_Thailand:MoonRise]+[07:30])]) ({Log 3, "Beginn  Mondaufgang Thailand"})
hier aber doppelte
DOELSEIF ([([[Ort_Thailand:MoonSet,"13:29"]]+[07:30])]) ({Log 3, "Beginn  Monduntergang Thailand"}) funktionieren. Tut es aber nicht.
eckige Klammern
um
[Ort_Thailand:MoonSet,"13:29"]
?
Titel: Antw:Leeres Zeit-Reading
Beitrag von: rabehd am 03 August 2017, 15:37:13
DOELSEIF ([([Ort_Thailand:MoonSet,"13:29"]+[07:30])]) ({Log 3, "Beginn Monduntergang Thailand"})
ändert aktuell nichts an der Meldung (und hatte ich auch schon versucht)

Als Wiederholung: Ich suche eine Lösung für
ZitatNimm den Zeitwert aus dem Reading "MoonSet" des Devices "Ort_Thailand", sollte dieser Wert leer sein, dann nimm 13:29. (Zum Schluß addiere noch 07:30 dazu und löse zu diesem Zeitpunkt aus.)
Zeitwert normal im Format "hh:mm"
Titel: Antw:Leeres Zeit-Reading
Beitrag von: Per am 03 August 2017, 16:54:22
Sollte die "Ersatzzeit" dann nicht auch in eckigen Klammern landen, statt in Anführungszeichen? Ist doch kein String.
Titel: Antw:Leeres Zeit-Reading
Beitrag von: Ellert am 03 August 2017, 18:58:26
Zitat von: rabehd am 03 August 2017, 13:38:20
Ich habe schon einiges probiert, es steht auch in der Commandref, aber es funktioniert nicht. Ich bekomme für den Zweig immer eine Fehlermeldung.

Es gibt verschiedene Readings, welche eine Zeit im Format hh:mm enthält. Ist das Reading gefüllt, dann gibt es kein Problem.
([([Ort_Thailand:MoonRise]+[07:30])]) ({Log 3, "Beginn  Mondaufgang Thailand"})
Nun kann es jedoch sein, dass das Reading leer ist. Nach meinem Verständnis müßte es mit DOELSEIF ([([[Ort_Thailand:MoonSet,"13:29"]]+[07:30])]) ({Log 3, "Beginn  Monduntergang Thailand"}) funktionieren. Tut es aber nicht.

Wo liegt mein Fehler?
Danke

Der Ersatzwert ist für nicht existierende Readings, nicht für Readings, die existieren, auch wenn sie leer sind.

Das kannst Du nachstellen mit (für Raw definition)
defmod du8 dummy
attr du8 room 0_Test
setstate du8 2017-08-03 18:55:03 nichts

defmod falscheZeit DOIF ([[du8:nichts,"07:30"]])
attr falscheZeit room 0_Test



So gibt es eine Fehlermeldung und wenn Du das Reading löschst, wird der Ersatzwert genommen.
Titel: Antw:Leeres Zeit-Reading
Beitrag von: rabehd am 03 August 2017, 20:35:36
Hallo Ellert,

sowas war auch mein Verdacht, nur stand es eben irgends (für mich findbar).

Ich denke, ich werde ein notify machen, welches nach jeder Neuberechnung der Readings einfach prüft, ob es leer ist und dann ein setreading auf den Ersatzwert macht.
Das erscheint mir am Besten.

Danke
Titel: Antw:[gelöst] Leeres Zeit-Reading
Beitrag von: Ellert am 03 August 2017, 23:42:52
Oder Du erstellst ein userReadings auf MoonRise mit Trigger auf MoonRise , dieses Reading erscheint erst, wenn MoonRise ein Event liefert.

Allerdings stellt sich die Frage warum ein Modul leere Readings erzeugen muss, das ist unüblich, da müsste vielleicht der Modulautor nachbessern, s. https://forum.fhem.de/index.php/topic,13092.0.html in der MAINTAINER.txt.
Titel: Antw:[gelöst] Leeres Zeit-Reading
Beitrag von: rabehd am 04 August 2017, 09:03:59
Hallo Ellert,

der Mondaufgang und Monduntergang können durchaus mal leer sein, wenn man nur den aktuellen Tag betrachtet.
Zwar sehe ich für meinen Beispielort auf einer Website Daten, aber der Modulersteller (Astro-Modul) kann sicher erklären das seine Berechnung richtig ist. (siehe die Diskussion zum Modul).
Somit gefällt mir Deine Lösung, aber wie geht das?
Zitatdieses Reading erscheint erst, wenn MoonRise ein Event liefert.
Ein Tip wäre toll, ich werde mich aber auch versuchen einzulesen.
Titel: Antw:[gelöst] Leeres Zeit-Reading
Beitrag von: Ellert am 04 August 2017, 09:55:33
attr Ort_Thailand userReadings myMoonRise:MoonRise.* {ReadingsVal($name,"MoonRise","0")}
Die genaue Syntax müsstest Du in der Commandref nachlesen