Liebe FHEM-Gemeinde,
da es mein erster Beitrag in diesem Forum ist, möchte ich zuerst einmal einen herzlichen Dank für die vielen hilfreichen Beiträge an das gesamte Forum zurückgeben!
Mich beschäftigt gerade folgendes Frage, zu der ich trotz langem Suchen aber keine weiteren Informationen finden kann:
In einem Dummy speichere ich die Hagelwarnung aus dem Unwettermodul als Reading ab. Im Unwettermodul finden sich die Hagelwarnungen unter den Readings "Warn_0_Hail", "Warn_1_Hail" oder "Warn_2_Hail". Damit ich die langsam schon recht komplizierte Rolladensteuerung beim nächsten Anschauen auch wieder verstehe, möchte ich die Abfragen ein wenig konzentrieren und bspw. die Hagelwarnungen zu einem Reading zusammenführen. Sobald eine Hagelwarnung besteht und die zugehörige Beginn-Zeit überschritten wird, soll das Reading auf '1' gesetzt werden. Gleichzeit soll ein 'at' erzeugt werden, welches das Reading nach Ablauf der Dauer der Warnung wieder auf '0' setzt.
Im Ausführungsteil steht somit:
(setreading test1 Warn_0_Hail 1 ; define UWZ_Hagelwarnung_Aus at +{(split(' ',FmtDateTime(ReadingsVal("Unwetterzentrale","Warn_0_End",0) - ReadingsVal("Unwetterzentrale","Warn_0_Start",0))))[1]} setreading test1 Warn_0_Hail 0)
Gebe ich probehalber das
define UWZ_Hagelwarnung_Aus at +{(split(' ',FmtDateTime(ReadingsVal("Unwetterzentrale","Warn_0_End",0) - ReadingsVal("Unwetterzentrale","Warn_0_Start",0))))[1]} setreading test1 Warn_0_Hail 0
in FHEM ein, erhalte ich aber die Fehlermeldung
ZitatWrong timespec {(split(': either HH:MM:SS or {perlcode}
Mich Nicht-Informatiker irritiert dies schon etwas, da ich im Gegensatz zum PC doch glaube, dass der Ausdruck für die Zeitangabe im 'at' Perl-Code ist. Auch hat FHEM selbst mit dem {...} Ausdruck allein auch keine Probleme, sondern gibt genau das Format aus, was die Fehlermeldung fordert.
Ich bin gerade überfragt und würde mich über eine Hilfestellung sehr freuen.
Vielen Dank!
Ich würde dasGanze mal auseinandernehmen und in eine sub auslagern. Als Einzeiler ist das ziemlich unübersichtlich und führt dann zu Fehlern. Leider bin ich iMo nur mit dem Tablet unterwegs und müsste mir das nach her zu hause nochmal genauer ansehen.
VG
Frank
versuch doch erstmal deine ganzen zwischenberechnungen zu trennen und guck nach was da dann immer zurückkommt und ob es zu dem erwarteten bzw. benötigten ergebnis passt.
also:
1. ReadingsVal("Unwetterzentrale","Warn_0_End",0) ermitteln
2. ReadingsVal("Unwetterzentrale","Warn_0_Start",0) ermitteln
3. dann (ReadingsVal("Unwetterzentrale","Warn_0_End",0) - ReadingsVal("Unwetterzentrale","Warn_0_Start",0))
4. und dann FmtDateTime(ReadingsVal("Unwetterzentrale","Warn_0_End",0) - ReadingsVal("Unwetterzentrale","Warn_0_Start",0))))[1] (wofür steht die [1] hier??)
also entweder mittels web eingabezeile (evtl. noch ein log oder so davor), oder in ne sub auslagern und ausgaben einbauen.
(mir hat das immer geholfen den fehler zu finden!)
deine fehlermeldung
Wrong timespec {(split(': either HH:MM:SS or {perlcode}
deutet ja schon darauf hin, das irgendwo etwas berechnet wird, was nicht so ist wie es sein sollte ;)
vielleicht kannst du ja auch mal ein list von den devices liefern.
Vielen Dank für eure Antworten.
Ich hatte es auch Stück für Stück zusammengefügt, genauso, wie du, nils_, das nun empfielst. "Glücklicherweise" gibt es gerade eine Unwetterwarnung für diese Gegend, so dass ich dazu gleich die Antworten liefern kann:
1. ReadingsVal("Unwetterzentrale","Warn_0_End",0) ergibt: "1498672800"
2. ReadingsVal("Unwetterzentrale","Warn_0_Start",0) ergibt: "1498622400"
3. (ReadingsVal("Unwetterzentrale","Warn_0_End",0) - ReadingsVal("Unwetterzentrale","Warn_0_Start",0)) ergibt: "50400"
4. FmtDateTime(ReadingsVal("Unwetterzentrale","Warn_0_End",0) - ReadingsVal("Unwetterzentrale","Warn_0_Start",0)) ergibt: "1970-01-01 15:00:00"
5. (split(' ',FmtDateTime(ReadingsVal("Unwetterzentrale","Warn_0_End",0) - ReadingsVal("Unwetterzentrale","Warn_0_Start",0))))[1] ergibt: "15:00:00"
mit dem "[1]" wird der zweite Teil der Zeitangabe ermittelt, mit einer "0" in der Klammer bliebe das Datum über, jedoch hoffe ich, dass keine Unwetterwarnung länger als ein Tag dauert, so dass ich darauf verzichten kann.
Der letzte Befehl liefert eigentlich genau das Format zurück (so nahm ich an), wie es das 'at' verlangen würde, oder?
Ein list des device liefere ich gerne auch:
da hatte ich wohl ziemlich Glück; das Unwetter ging beim Schreiben des Textes gerade zu Ende, so dass im 'list' keine Unwetter mehr enthalten sind. Das 'list' ist also ziemlich übersichtlich.
Internals:
CountryCode DE
DEF DE 31215 3600
INTERVAL 3600
NAME Unwetterzentrale
NR 572
PLZ 31215
STATE Warnungen: 0
TYPE UWZ
URL http://feed.alertspro.meteogroup.com/AlertsPro/AlertsProPollService.php?method=getWarning&language=de&areaID=UWZDE31215
VERSION 1.4.7
Readings:
2017-06-28 20:15:47 WarnCount 0
2017-06-28 20:15:47 WarnUWZLevel 0
2017-06-28 20:15:47 WarnUWZLevel_Color gruen
2017-06-28 20:15:47 durationFetchReadings 0.00
2017-06-28 20:15:47 lastConnection 4 values captured in 0.00 s
2017-06-28 20:15:47 state Warnungen: 0
Fhem:
LOCAL 0
Helper:
Attributes:
group Modul
room Info_Wetter
verbose 0
Gibt es vielleicht weitere Ideen? Ich hatte auch schon überlegt, dies mittels eines 'DOIF' zu bewerkstelligen mit Start- und Endzeit. Vielleicht ist das eine geeignetere Lösung. Probiert habe ich es aber noch nicht.
Vielen Dank!
andere frage:
warum trägst du in deinem 'at' nicht die endezeit ein? momentan rechnest du ja die dauer aus.
mit der timespec hab ich leider auch immer probleme bzw. fehlt mir tieferes verständnis -.-
ich vermute (achtung gefährliches halbwissen) das FmtDateTime nicht das korrekt format zurückliefert.
Nachdem ich nun etwas Zeit gefunden habe, habe ich das mittels DOIF gelöst. Im DOIF kann ich mit den Zeitangaben des Unwettermoduls rechnen. Im 'at' geht das möglicherweise auch, aber ich bekam es nicht hin.
Zum Nachlesen für andere: Das Problem liegt daran, dass im 'at' bei der Zeitangabe keine Leerzeichen verwendet werden dürfen, egal ob Perl oder nicht (erwähnt zum Beispiel hier: https://forum.fhem.de/index.php/topic,14241.msg90037.html#msg90037 (https://forum.fhem.de/index.php/topic,14241.msg90037.html#msg90037)). Aber leider hätte ich nach Trennen dem Leerzeichen trennen müssen, um nur die Stunden zu erhalten.
Möglicherweise wäre eine Lösung auch gewesen, mittels userReadings die Dauer schon im Unwettermodul auszurechnen und nur diese zu nutzen. Aber nun habe ich für mich eben einen anderen Weg gefunden.
Viele Grüße
ok, wenn es jetzt läuft....
aber was ich nicht verstehe:
Zitat von: kilderman am 16 Juli 2017, 12:43:50Aber leider hätte ich nach Trennen dem Leerzeichen trennen müssen, um nur die Stunden zu erhalten.
störende leerzeichen am anfang oder ende hättest du ansonsten mit trim(...) weg bekommen.