Ich bekomme von einem Gerät einen Zeitstempel als Integerzahl (Stichwort: Unix-Epoche) angeliefert, mit dem ich ein DOIF als Zeit anfüttere. Das beschwert sich zu Recht, wenn der Zeitpunkt in der Vergangenheit liegt. Also würde ich die aktuelle Systemzeit gern als Integerzahl abfragen zum Vergleich. Auf der Linux-Kommandozeile liefert "date +%s" das gewünschte Ergebnis. Wie kriege ich das nach FHEM oder was wäre eine Alternative?
Was bisher geschah:
Ich habe jetzt eine Weile gesucht, völlig erfolglos. Auf der Kommandozeile lese ich mehr "Bareword <xyz> not allowed while "strict subs" in use at (eval 1065908) line 1" als irgendein sinnvolles Ergebnis.
Auch mit Umrechnungen tue ich mich schwer. Meine Funktion in myUtils, mit der ich diese Timestamps in den in FHEM-typischen Zeitstempel umformatiere, liefert mit dem Aufruf {time_num2strVA(localtime*86400)} genau das richtige Ergebnis, führt aber im Notify bei der Zeile ""my $timenow = localtime()*86400" zu einem Fehler ("PERL WARNING: Argument "*main::86400" isn't numeric in localtime at (eval 1065708) line 1.") und ohne die Klammern hinter localtime wird $timenow zu "Thu Jan 1 01:00:00 1970", was sich nicht mit dem Integerwert vergleichen lassen will.
Es ist vermutlich lausig einfach, aber ich weiß einmal mehr, warum ich Linux und Perl nicht produktiv nutze.
So, hat jemand eine Lösungsidee? Danke.
Meinst du sowas wie localtime()
@CoolTux: Ja im Prinzip, aber lies mal meine Versuche damit im ersten Post und sage mir was ich falsch mache um das umzusetzen ...
ZitatDu musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Nicht mal das habe ich gefunden, oder ich habe einfach noch nicht die richtigen Stichworte für Google gefunden.
äh...
{time()}
vielleicht?
Das würde passen.
Wie ich schon sagte, es wird ganz einfach sein... Ich hatte diverse Sachen ausprobiert, auch localtime, aber eben nicht time.
if ($newrec > time()) {fhem("set ...
Und funktioniert. Mann!!! Danke!!!
Dem Perl-Anfänger erschließt sich nicht logisch, warum time() eine nackte Zahl liefert (bezogen auf die Weltzeit) und localtime() eine Umrechnungsfunktion ist, die eine zugelieferte Unix-Zeit in einen lokal basierten Zeitstring umrechnet und offenbar time() als default input verwendet.
Aber das ist eine andere Geschichte und soll ein anderes Mal verflucht werden. ::)
Hallo, ich möchte auch eine Unixzeit in eine "normalte" Uhrzeit umwandeln, bekomme es aber in Verbindung mit der Unwetterzentrale und Pushover nicht hin.
ZitatUnwetterzentrale:.* {
my $warnendtime = (ReadingsVal('Unwetterzentrale','Warn_0_End',""));;
my $warnlevelcolor = (ReadingsVal('Unwetterzentrale','WarnUWZLevel_Color',""));;
my $warncounter = (ReadingsVal('Unwetterzentrale','WarnCount',""));;
my $warntextshort = (ReadingsVal('Unwetterzentrale','Warn_0_ShortText',""));;
if($warncounter > 0) {fhem ("set Pushover msg title='Unwetterwarnung' message='Warnstufe [($warnendtime > time())] $warnlevelcolor \nWetterwarnung für Paderborn: $warntextshort'")};;}
was hab ich falsch gemacht?
Wäre dankbar für etwas Hilfe :)
Zitat von: Michi1978 am 12 Januar 2019, 09:14:08
Hallo, ich möchte auch eine Unixzeit in eine "normalte" Uhrzeit umwandeln, bekomme es aber in Verbindung mit der Unwetterzentrale und Pushover nicht hin.
was hab ich falsch gemacht?
Wäre dankbar für etwas Hilfe :)
Bitte Codetags verwenden. So kann man das schlecht lesen.
Du vermischst Fhem Befehle und Perl Code.
Das hier ist Unsinn
fhem ("set Pushover msg title='Unwetterwarnung' message='Warnstufe [($warnendtime > time())] $warnlevelcolor \nWetterwarnung für Paderborn: $warntextshort'")
Was genau willst Du da erreichen? Was soll da stehen.
if($warncounter > 0) {fhem ("set Pushover msg title='Unwetterwarnung' message='Warnstufe [($warnendtime > time())] $warnlevelcolor \nWetterwarnung für Paderborn: $warntextshort'")};;}
Tittle= Unwetterwarnung
"$warnlevel $warnlevelcolor" Warnstufe Orange 3
"$warnendtime" Ende der Unwetterwarnung dd.mm.yyy hh
"$warntextshort" Text der Wetterwarnung
Das Datum und die Urzeit von UWZ kommt im diesem Format 1547424000.
Die absätze sollen auch mit rein, das klappt auch nicht wirklich mit z.B. \n
Zitat von: Michi1978 am 12 Januar 2019, 09:56:29
if($warncounter > 0) {fhem ("set Pushover msg title='Unwetterwarnung' message='Warnstufe [($warnendtime > time())] $warnlevelcolor \nWetterwarnung für Paderborn: $warntextshort'")};;}
Tittle= Unwetterwarnung
"$warnlevel $warnlevelcolor" Warnstufe Orange 3
"$warnendtime" Ende der Unwetterwarnung dd.mm.yyy hh
"$warntextshort" Text der Wetterwarnung
Das Datum und die Urzeit von UWZ kommt im diesem Format 1547424000.
Die absätze sollen auch mit rein, das klappt auch nicht wirklich mit z.B. \n
Ich verstehe nicht das das hier soll
message='Warnstufe [($warnendtime > time())] $warnlevelcolor \n
Und bitte verwende Codetags bei Codeschnippsel.
$warnendtime > time() und dann ???
Erstmal muss ich wissen was Du erreichen willst.
Eine einfache Message wäre
fhem ("set Pushover msg title='Unwetterwarnung' message=Warnstufe $warnlevelcolor Wetterwarnung für Paderborn: $warntextshort")
Probiere bitte erstmal das. Ob es so geht.
folgendes geht
fhem ('set Pushover msg title=\'Unwetterwarnung\' message=\'Warnstufe\nWetterwarnung für Paderborn\');
Probiere erstmal nur das bitte. Genau so.
Zitat von: CoolTux am 12 Januar 2019, 10:01:53
Ich verstehe nicht das das hier soll
message='Warnstufe [($warnendtime > time())] $warnlevelcolor \n
Und bitte verwende Codetags bei Codeschnippsel.
$warnendtime > time() und dann ???
Erstmal muss ich wissen was Du erreichen willst.
Eine einfache Message wäre
fhem ("set Pushover msg title='Unwetterwarnung' message=Warnstufe $warnlevelcolor Wetterwarnung für Paderborn: $warntextshort")
Probiere bitte erstmal das. Ob es so geht.
Unwetterzentrale:.* {
my $warnendtime = (ReadingsVal('Unwetterzentrale','Warn_0_End',""));;
my $warnlevel = (ReadingsVal('Unwetterzentrale','WarnUWZLevel',""));;
my $warnlevelcolor = (ReadingsVal('Unwetterzentrale','WarnUWZLevel_Color',""));;
my $warncounter = (ReadingsVal('Unwetterzentrale','WarnCount',""));;
my $warntextshort = (ReadingsVal('Unwetterzentrale','Warn_0_ShortText',""));;
if( $warnlevel > 0 ) {fhem ("set Pushover msg title='Unwetterwarnung' message=Warnstufe $warnlevelcolor Wetterwarnung für Paderborn: $warntextshort")};;}
Ausgabe in Pushover:
Unwetterwarnung
Warnstufe
Wir machen es mal anders. Zum probieren
Oben in der FHEM Kommandozeile gibst Du ein
{ fhem ('set Pushover msg title=\'Unwetterwarnung\' message=\'Warnstufe\nWetterwarnung für Paderborn\') }
Dann bekommst erstmal Text.
Zitat von: CoolTux am 12 Januar 2019, 10:44:08
Wir machen es mal anders. Zum probieren
Oben in der FHEM Kommandozeile gibst Du ein
{ fhem ('set Pushover msg title=\'Unwetterwarnung\' message=\'Warnstufe\nWetterwarnung für Paderborn\') }
Dann bekommst erstmal Text.
Can't find string terminator "'" anywhere before EOF at (eval 1350) line 1.
Habe selber noch einmal nen bischen rumprobiert. Folgender Code funktioniert so wie gewünscht jedoch muss jetzt "nur" noch die Unix zeit umgewandelt werden.
Unwetterzentrale:.* {
my $warnendtime = (ReadingsVal('Unwetterzentrale','Warn_0_End',""));;
my $warnlevel = (ReadingsVal('Unwetterzentrale','WarnUWZLevel',""));;
my $warnlevelcolor = (ReadingsVal('Unwetterzentrale','WarnUWZLevel_Color',""));;
my $warncounter = (ReadingsVal('Unwetterzentrale','WarnCount',""));;
my $warntextshort = (ReadingsVal('Unwetterzentrale','Warn_0_ShortText',""));;
if($warncounter > 0) {fhem ("set Pushover msg title='Unwetterwarnung' message='Warnstufe $warnlevel $warnlevelcolor. \nWetterwarnung für Paderborn: $warntextshort \nWetterwarnung ende: $warnendtime'")};;}
::EDIT::
Ok funktioniert doch nicht alles. Die Absätze werden auch nicht ausgeführt :(
Du bist zu ungeduldig. Mache es bitte wie ich es Dir sage und wir kommen zu Deinem gewünschten Endergebnis. Aber das wichtigste wird sein das Du verstehen wirst was Du gemacht hast und wie es funktioniert.
Also nochmal. Mach bitte
Zitat von: CoolTux am 12 Januar 2019, 10:44:08
Wir machen es mal anders. Zum probieren
Oben in der FHEM Kommandozeile gibst Du ein
{ fhem ('set Pushover msg title=\'Unwetterwarnung\' message=\'Warnstufe\nWetterwarnung für Paderborn\') }
Dann bekommst erstmal Text.
Könnte sein das ich ungeduldig bin ;D
Hab weiter oben schon geschrieben was die Ausgabe ist wenn ich den Befehl eingebe.
Can't find string terminator "'" anywhere before EOF at (eval 1350) line 1.
Seltsam. Wenn ich das bei mir in die Kommandozeile in FHEMWEB eingebe dann bekomme ich eine Nachricht
{ fhem ('set Pushover msg title=\'Unwetterwarnung\' message=\'Warnstufe\nWetterwarnung für Paderborn\') }
Bitte noch einmal
Zitat von: CoolTux am 12 Januar 2019, 12:06:36
Seltsam. Wenn ich das bei mir in die Kommandozeile in FHEMWEB eingebe dann bekomme ich eine Nachricht
{ fhem ('set Pushover msg title=\'Unwetterwarnung\' message=\'Warnstufe\nWetterwarnung für Paderborn\') }
Bitte noch einmal
Wenn ich das ohne die gesxchwiften Klammern eingebe klappt es.
Zitatset Pushover msg title=\'Unwetterwarnung\' message=\'Warnstufe\nWetterwarnung für Paderborn\
Ausgabe in Phshover:
Zitat\'Unwetterzentrale\'
\'Warnstufe
Wetterwarnung
Keine Ahnung was Du da machst, aber passt schon.
Kurze Erklärung.
Wenn Du in der Kommandozeile oben etwas rein schreibst dann sind das FHEM Befehle. set ist so einer.
Wenn Du Perlfunktionen in der Kommandozeile ausführen willst musst du diese in { } setzen fhem() ist eine Perlfunktion.
Wenn Du die Perlfunktion verwendest
fhem('set pushmsg msg ...');
so ist das was Du in ' ' setzt ein Übergabeparameter an die Funktion. Natürlich muss es laut der Funktion genau das sein was Du auch in der FHEM Kommandozeile eingibst.
ABER. Dadurch das Du ' ' verwendet hast werden innerhalb dieser ' ' keine weiteren ' mehr beachtet und variablen $warnlevel nicht aufgelöst (heist der Wert der Variable wird nicht gesetzt) sondern nur $warnlevel als String geschieben.
Ansonsten musst Du aber komplett Perl verwenden.
Nun zu Deinem Code.
Regel Nummer ein wenn Du mit mir arbeitest. Es wird nie und niemals in der fhem.cfg direkt editiert.
Alles wird in FHEMWEB gemacht.
Also gehst Du auf Edit Files und dort auf Deine 99_myUtils oder in Dein Notify was Du hast. Je nachdem wo der Text steht. Und dann brauchst auch keine doppelten Semikolons.
Unwetterzentrale:.* {
my $warnendtime = ReadingsVal('Unwetterzentrale','Warn_0_End',"");
my $warnlevel = ReadingsVal('Unwetterzentrale','WarnUWZLevel',"");
my $warnlevelcolor = ReadingsVal('Unwetterzentrale','WarnUWZLevel_Color',"");
my $warncounter = ReadingsVal('Unwetterzentrale','WarnCount',"");
my $warntextshort = ReadingsVal('Unwetterzentrale','Warn_0_ShortText',"");
if ( $warncounter > 0 ) {
fhem ('set Pushover msg title=\'Unwetterwarnung\' message=\'Warnstufe ' . $warnlevel . ' ' . $warnlevelcolor . '\n.Wetterwarnung für Paderborn: ' . $warntextshort . '\nWetterwarnung ende: ' . $warnendtime');
}
So also.
('set Pushover msg title
Das erste ' sagt also der Funktion fhem() hier ist ein String als Parameter. die anderen ' ohne das \ davor beenden den String und somit kann eine Varibale mit Inhalt eingesetzt werden. Der Punkt dazwischen . verbindet jeweils immer den String mit den Wert der Variable in der Ausgabe. Daher immer ein Punkt nach und vor einem '. der . ' ' . bedeitet ich verbinde die Avriable vor dem . mit einem Lehrzeichen als String ' '.
Nun zu den \'
Das sind Optionen des set Befehles und somit zugehörig zum set Befhel. Sie müssen aber escapt werden damit nicht die Funktion fhem() denkt die ' gehören zu ihrer Anweisung.
Du willst mir echt etwas erklären, das finde ich super! Aber es wird hart für dich werden ;)
Vielleicht stimmt etwas mit meinem FHEM nicht wenn das mit den {} in der Kommandozeile nicht klappt?
Habe es mit copy & paste eingefügt und erhalte trotzdem die fehlermeldung. Ohne die {} klappt es wie gesagt, kann es sein das ich ein Problem habe über die Kommandozeile Percode auszuführen?
Das was du da zusammengebaut hast sieht ganz gut aus. Anhand deiner erklärung sind es jetzt nicht nur hieroglyphen für mich. Jedoch erhalte ich hier ebenfalls eine fehlermeldung. Habe den Code über das Notify im FhemWEB editiert. Folgende ausgabe erhalte ich:
Can't find string terminator "'" anywhere before EOF at (eval 12146) line 9.
Copy aus mein Notify DEF
Unwetterzentrale:.* {
my $warnendtime = ReadingsVal('Unwetterzentrale','Warn_0_End',"");
my $warnlevel = ReadingsVal('Unwetterzentrale','WarnUWZLevel',"");
my $warnlevelcolor = ReadingsVal('Unwetterzentrale','WarnUWZLevel_Color',"");
my $warncounter = ReadingsVal('Unwetterzentrale','WarnCount',"");
my $warntextshort = ReadingsVal('Unwetterzentrale','Warn_0_ShortText',"");
if ( $warncounter > 0 ) {
fhem ('set Pushover msg title=\'Unwetterwarnung\' message=\'Warnstufe ' . $warnlevel . ' ' . $warnlevelcolor . '\n.Wetterwarnung für Paderborn: ' . $warntextshort . '\nWetterwarnung ende: ' . $warnendtime');
}
Hab anhand deiner erklärung auch selbst mal versucht nen Fehler in dem Code zu finden aber hab nix gefunden.
Du musst Deine Notify etwas formatieren oder Du zählst Deine Klammern.
Fehlt noch mal ganz unten eine }
Und dann noch
$warnendtime')
ändern in
$warnendtime)
also bei mir geht's testweise wunderbar ... bis auf die komische Zahl am Ende... :)
localtime() macht es auch nicht besser ...
Aber setz doch mal in der Unwetterzentrale das attribut humanreadable 1 und nutze statt "Warn_0_End" dann "Warn_0_End_Time" als Reading ...
OT:
Zitat von: CoolTux am 12 Januar 2019, 12:42:36
Regel Nummer ein wenn Du mit mir arbeitest. Es wird nie und niemals in der fhem.cfg direkt editiert.
Alles wird in FHEMWEB gemacht.
;D ;D ;D
Zitat von: Pfriemler am 12 Januar 2019, 14:42:16
Aber setz doch mal in der Unwetterzentrale das attribut humanreadable 1 und nutze statt "Warn_0_End" dann "Warn_0_End_Time" als Reading ...
OT: ;D ;D ;D
Perfect genau was ich gesucht habe ;D Danke!
Ich hab noch ein"'" vor "Warnstufe" ('Warnstufe) im Pushover was ich nicht weg bekomme. Jemand ne Tip?
Unwetterzentrale:.* {
my $warncounter = (ReadingsVal('Unwetterzentrale','WarnCount',""));;
my $warnlevel = (ReadingsVal('Unwetterzentrale','WarnUWZLevel',""));;
my $warnlevelstr = (ReadingsVal('Unwetterzentrale','Warn_1_uwzLevel_Str',""));;
my $warnlevelcolor = (ReadingsVal('Unwetterzentrale','WarnUWZLevel_Color',""));;
my $warn0typestr = (ReadingsVal('Unwetterzentrale','Warn_0_Type_Str',""));;
my $warn0level = ReadingsVal('Unwetterzentrale','Warn_0_uwzLevel',"");
my $warn0textshort = (ReadingsVal('Unwetterzentrale','Warn_0_ShortText',""));;
my $warn0startdate = (ReadingsVal('Unwetterzentrale','Warn_0_Start_Date',""));;
my $warn0starttime = (ReadingsVal('Unwetterzentrale','Warn_0_Start_Time',""));;
my $warn0enddate = (ReadingsVal('Unwetterzentrale','Warn_0_End_Date',""));;
my $warn0endtime = (ReadingsVal('Unwetterzentrale','Warn_0_End_Time',""));;
my $warn1typestr = (ReadingsVal('Unwetterzentrale','Warn_1_Type_Str',""));;
my $warn1level = ReadingsVal('Unwetterzentrale','Warn_1_uwzLevel',"");
my $warn1textshort = ReadingsVal('Unwetterzentrale','Warn_1_ShortText',"");
my $warn1startdate = (ReadingsVal('Unwetterzentrale','Warn_1_Start_Date',""));;
my $warn1starttime = (ReadingsVal('Unwetterzentrale','Warn_1_Start_Time',""));;
my $warn1enddate = (ReadingsVal('Unwetterzentrale','Warn_1_End_Date',""));;
my $warn1endtime = (ReadingsVal('Unwetterzentrale','Warn_1_End_Time',""));;
if( $warncounter == 1 || $warncounter == 2 || $warncounter == 3 || $warnlevel == 3 || $warnlevel == 4 || $warnlevel == 5 || $warnlevel == 6 || $warnlevel == 7) {
fhem ('set Pushover msg sound=siren title='. $warncounter . '-' . 'Unwetterwarnung/en message=\'Warnstufe ' . $warnlevel . ' ' . $warnlevelcolor . '\n ' . '\nWetterwarnung für Paderborn: ' . '\n \n ' . $warn0typestr . '\n ' . $warn0startdate . ' ' . $warn0starttime . ' ' . $warn0textshort . ' ' . $warn0enddate . '\n \n' . $warn1typestr . '\n ' . $warn1startdate . ' ' . $warn1textshort . ' ' . $warn1enddate);
}}
Zitat von: CoolTux am 12 Januar 2019, 13:58:47
Du musst Deine Notify etwas formatieren oder Du zählst Deine Klammern.
Fehlt noch mal ganz unten eine }
Und dann noch
$warnendtime')
ändern in
$warnendtime)
Dir auch erstmal nen fettes Danke für deine Geduld mit mir ;)