Hauptmenü

[gelöst] Leeres Zeit-Reading

Begonnen von rabehd, 03 August 2017, 13:38:20

Vorheriges Thema - Nächstes Thema

rabehd

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
Auch funktionierende Lösungen kann man hinterfragen.

amenomade

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?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

rabehd

#2
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
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.)
Auch funktionierende Lösungen kann man hinterfragen.

nils_

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.
viele Wege in FHEM es gibt!

rabehd

#4
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".
Auch funktionierende Lösungen kann man hinterfragen.

Per

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"]
?

rabehd

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"
Auch funktionierende Lösungen kann man hinterfragen.

Per

Sollte die "Ersatzzeit" dann nicht auch in eckigen Klammern landen, statt in Anführungszeichen? Ist doch kein String.

Ellert

#8
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.

rabehd

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
Auch funktionierende Lösungen kann man hinterfragen.

Ellert

#10
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.

rabehd

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.
Auch funktionierende Lösungen kann man hinterfragen.

Ellert

attr Ort_Thailand userReadings myMoonRise:MoonRise.* {ReadingsVal($name,"MoonRise","0")}
Die genaue Syntax müsstest Du in der Commandref nachlesen