erledigt, geht nicht in FHEM Modus ---> $today und $hms im Ausführungsteil

Begonnen von Frank_Huber, 28 Dezember 2019, 17:44:12

Vorheriges Thema - Nächstes Thema

Frank_Huber

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!

Gisbert

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​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Frank_Huber

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


Gisbert

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​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Frank_Huber

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


Gisbert

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
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Damian

$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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

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")}

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frank_Huber

#8
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')}

RalfRog

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?
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

Damian

In der DOIF-FHEM-Bedingung und im DOIF-Perl-Block. $today gibt es beim DOIF dagegen nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

RalfRog

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.
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

Damian

$today gibt es an diesen Stellen nicht auch nicht im DOIF, daher musst du es in Perl selbst nachbilden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

RalfRog

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...
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

Damian

Du hast das Beispiel zu notify gepostet. Ansonsten in fhem.pl nach $today suchen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

RalfRog

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
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder