FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Frank_Huber am 28 Dezember 2019, 17:44:12

Titel: erledigt, geht nicht in FHEM Modus ---> $today und $hms im Ausführungsteil
Beitrag von: Frank_Huber am 28 Dezember 2019, 17:44:12
Hallo,

folgender Befehl geht einwandfrei in der FHEM Befehlszeile:
set TelegramBot msg {($today)} - {($hms)} - Klingel am Hoftor)
$today und $hms wird ordentlich als Datum und Uhrzeit ausgegeben.

packe ich es aber in ein DOIF wird der TelegramBot Befehl "ignoriert"
(set TelegramBot msg {($today)} - {($hms)} - Klingel am Hoftor)

Den TeleBot auf Verbose 5 zeigt dass am Telegrambot der Befehl erst gar nicht ankommt.
Bestimmt muss ich doch das $today und $hms noch irgendwie anderst maskieren, aber wie?

Als Error im DOIF bekomme ich:
ZitatGlobal symbol "$today" requires explicit package name (did you forget to declare "my $today"?) at (eval 71585) line 1.

jemand ne Idee?
Danke!
Titel: Antw:$today und $hms im Ausführungsteil
Beitrag von: Gisbert am 28 Dezember 2019, 20:11:48
Hallo Frank,

soweit ich weiß und bei mir auch im Einsatz ist, wird $hms usw. im Bedingungsteil ohne die geschweiften Klammern genutzt. Ich vermute, dass dies auch für den Ausführungsteil gilt - zumindest ist es einen Versuch wert.

Viele​ Grüße​ Gisbert​
Titel: Antw:$today und $hms im Ausführungsteil
Beitrag von: Frank_Huber am 28 Dezember 2019, 21:41:13
Danke Gisbert,
Habe ich getestet, ganz ohne klammern wird es als Text an Telegram ausgegeben, nur mit normaler klammer als Telegram Schaltfläche angezeigt.
Also leider kein Erfolg.

Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:$today und $hms im Ausführungsteil
Beitrag von: Gisbert am 28 Dezember 2019, 23:27:49
Zitat von: Frank_Huber am 28 Dezember 2019, 21:41:13
Danke Gisbert,
Habe ich getestet, ganz ohne klammern wird es als Text an Telegram ausgegeben, nur mit normaler klammer als Telegram Schaltfläche angezeigt.
Also leider kein Erfolg.

Gesendet von meinem Doogee S60 mit Tapatalk

Hallo Frank,

mangels Anwendung kann ich nicht genau nachvollziehen, was du meinst, inbesondere die Schaltfläche.

Ich hab's mal bei mir versucht, und ich bekomme nur die Nachricht $hms als "Wert" in Telegram. Sieht so aus, dass du das commandref bei DOIF durchsehen solltest, werde es morgen auch tun.

Viele​ Grüße​ Gisbert​
Titel: Antw:$today und $hms im Ausführungsteil
Beitrag von: Frank_Huber am 28 Dezember 2019, 23:43:43
Hallo Gisbert,

(set TelegramBot msg ($today) - ($hms) - Klingel am Hoftor)
Liefert in Telegram den Anhang.
Ganz ohne Klammer bekomme ich $hms und $today 1 zu 1 als Text übermittelt.

Grüße
Frank (https://uploads.tapatalk-cdn.com/20191228/d8843a681e8cce3f9bdc6b774a511729.jpg)

Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:$today und $hms im Ausführungsteil
Beitrag von: Gisbert am 29 Dezember 2019, 11:24:34
Hallo Frank,

ich befürchte, dass ich mit meinem Latein am Ende bin; ich glaube, dass hier ein Fachmann ran muss.
Die Zeitangabe könntest du in Perl auch durch{ReadingsTimestamp("$name","sinniges_reading","")} erhalten.
Vielleicht gelingt es damit in DOIF im Perlmodus.

Viele Grüße Gisbert
Titel: Antw:$today und $hms im Ausführungsteil
Beitrag von: Damian am 29 Dezember 2019, 11:36:23
$today ist eine FHEM-Variable, die in Modulen nicht bekannt ist, genauso wie z. B. $hms.

$hms wurde in DOIF nachgebildet, in DOIF gibt allerdings jede Menge weitere Zeitvariablen:

siehe Commandref:
Zitat
<Perl-Zeitvariablen>
Variablen für Zeit- und Datumsangaben, $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst, $week, $hms, $hm, $md, $ymd, $we, $twe

$today entspricht dann im DOIF $ymd
Titel: Antw:$today und $hms im Ausführungsteil
Beitrag von: Damian am 29 Dezember 2019, 11:43:28
Zitat von: Damian am 29 Dezember 2019, 11:36:23
$today ist eine FHEM-Variable, die in Modulen nicht bekannt ist, genauso wie z. B. $hms.

$hms wurde in DOIF nachgebildet, in DOIF gibt allerdings jede Menge weitere Zeitvariablen:

siehe Commandref:
$today entspricht dann im DOIF $ymd

Diese Variablen sind allerdings nur in der Bedingung bekannt, bzw. im DOIF-Perl-Mode nutzbar:

DOIF {[<Trigger>]; fhem_set ("bla $ymd")}

Titel: Antw:$today und $hms im Ausführungsteil
Beitrag von: Frank_Huber am 29 Dezember 2019, 13:44:07
Danke Damian,

das erklärt warum ich kläglich gescheitert bin. :-)

Habe es jetzt über die myUtils gelöst.
sub TelegramTimestamp
{
  my $message = shift;
  my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  $mon=$mon+1;
  $year=$year+1900;
  if ($mon < 10) { $mon = "0$mon"; }
  if ($hour < 10) { $hour = "0$hour"; }
  if ($min < 10) { $min = "0$min"; }
  if ($sec < 10) { $sec = "0$sec"; }
fhem("set TelegramBot msg $mday.$mon.$year $hour:$min:$sec - $message");
}


Der Ausführungsteil im DOIF leutet jetzt (neben anderen Befehlen):
{TelegramTimestamp('Nachrichtentext')}
Titel: Antw:erledigt, geht nicht in FHEM Modus ---> $today und $hms im Ausführungsteil
Beitrag von: RalfRog am 07 April 2021, 19:30:27
Hallo
Wollte mich hier versuchweise noch mal reinhängen.

Habe soweit verstanden, dass für DOIF die Variablen nachgebildet wurden.
Wie ist in der CommandRef der Teil in den Perl-Specials zu verstehen?

Zitat
Um die Verwendung von Datum und Zeitangaben zu vereinfachen, wurden die Variablen $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst und $hms für die Verwendung in PERL-"oneliners" eingeführt (s. unter perldoc -f localtime). Ausnahmen: $month hat einen Wertebereich von 1 bis 12 und $year ist korrigiert von 1900. Weiterhin enthält $hms die Zeit in dem HH:MM:SS Format und $today das aktuellen Datum in YYYY-MM-DD Format.
Die Variabe $we hat den Wert 1 wenn der abgefragte Tag auf ein Wochenende fällt (Z.B. $wday == 0 [Sonntag] oder $wday == 6 [Samstag]), und 0 für die anderen Wochentage. Wenn man das global holiday2we Attribut setzt, dann ist $we ebenfalls 1 bei Urlaubstagen.

    define n2 notify piri:on { if($hour > 18 || $hour < 5) { fhem "set light on" } }
    define roll_en *07:45:00 { fhem "trigger SwitchAllRoll on" if(!$we) }
    define roll_en *08:30:00 { fhem "trigger SwitchAllRoll on" if($we) }

$we wird mit IsWe() gesetzt, diese Funktion nimmt optional die Argumente "today", "yesterday", "tomorrow", MM-DD oder YYYY-MM-DD. Achtung: alles andere wird als "today" interpretiert, ohne eine Fehlermeldung zu generieren
....

Hier ist ja z.B. von $hms und $today die Rede. Wo sind die Variablen denn gültig?
Titel: Antw:erledigt, geht nicht in FHEM Modus ---> $today und $hms im Ausführungsteil
Beitrag von: Damian am 07 April 2021, 19:44:26
In der DOIF-FHEM-Bedingung und im DOIF-Perl-Block. $today gibt es beim DOIF dagegen nicht.
Titel: Antw:erledigt, geht nicht in FHEM Modus ---> $today und $hms im Ausführungsteil
Beitrag von: RalfRog am 08 April 2021, 11:03:20
Konkret geht es bei mir um die Verwendung im Shelly-Modul in einem userReading.
Zitat...Um die Verwendung von Datum und Zeitangaben zu vereinfachen, wurden die Variablen $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst und $hms für die Verwendung in PERL-"oneliners" eingeführt..
Daher habe testweise einem Dummy angelegt und in der Annahme es sei ein "Perl-Oneliner" dort definiert:
attr dummy userReadings enerTest { my $wert = "" ; if (time_str2num(OldReadingsTimestamp("shelly_plug_s_df2674","energyCum",0)) < time_str2num($today)) {$wert = "s_true"} else {$wert = "s_false"} ; $wert}
Das Ergebnis ist wie angeführt:
Error evaluating sol userReading enerTest: Global symbol "$today" requires explicit package name (did you forget to declare "my $today"?) at (eval 133848) line 1

Hintergrund: ich will damit feststellen ob ein Reading (energyCum) von gestern oder heute ist und entsprechend das userReading "enerTest" setzen
Im Webeingabefeld liefert {$today} das heutige Datum und damit liefert {time_str2num($today} den Zeitstempel in sec von Mitternacht.
Titel: Antw:erledigt, geht nicht in FHEM Modus ---> $today und $hms im Ausführungsteil
Beitrag von: Damian am 08 April 2021, 11:11:37
$today gibt es an diesen Stellen nicht auch nicht im DOIF, daher musst du es in Perl selbst nachbilden.
Titel: Antw:erledigt, geht nicht in FHEM Modus ---> $today und $hms im Ausführungsteil
Beitrag von: RalfRog am 08 April 2021, 11:22:23
Ok mal schauen was ich da finde....

Aber wo genau kann man denn die in den Perl-Specials genannten Variablen benutzen?
..Um die Verwendung von Datum und Zeitangaben zu vereinfachen, wurden die Variablen $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst und $hms für die Verwendung in PERL-"oneliners" eingeführt...
Titel: Antw:erledigt, geht nicht in FHEM Modus ---> $today und $hms im Ausführungsteil
Beitrag von: Damian am 08 April 2021, 11:31:45
Du hast das Beispiel zu notify gepostet. Ansonsten in fhem.pl nach $today suchen.
Titel: Antw:erledigt, geht nicht in FHEM Modus ---> $today und $hms im Ausführungsteil
Beitrag von: RalfRog am 08 April 2021, 12:23:45
Hi
Das Beispiel mit dem Notiyfy stammt so aus der CommandRef. Am Ende die Perlspecials.
Ich hatte angenommen, dass die Info daraus zu den Variablen "allgemein" für {Perl-Anweisungen} gelten.

Egal:
viel lesen gestern und heute hat mir als als Erkenntnis gebracht:
ersetze "time_str2num($today)" durch "time_str2num(POSIX::strftime("%Y-%m-%d", localtime()))"

Funktioniert! 

Ergebnis ist der Zeitstempel in sec von Mitternacht :)
--> mithin ist alles was kleiner ist von gestern und alles was größer ist von heute