[gelöst] DOIF: qx Rückgabewert in fhem(setreading ...) verwenden

Begonnen von h002, 31 August 2021, 15:28:43

Vorheriges Thema - Nächstes Thema

TomLee

Ich hab mal wo mitgenommen das man so einen qx-Aufruf bspw.
qx(date -d 'today -1 month' +'%Y_%m')
in der Kommandozeile einfach nur in doppelten Quotes angeben kann und der Aufruf ist nicht blockierend.
Also so:
"date -d 'today' +'%Y_%m'"

Hier sind wir ja aber in Perl, dachte wenn ich den Aufruf in einen Fhem-Befehl stecke klappt das evtl. auch, tuts aber nicht.

Aber wenn ich den Aufruf in `` packe schon.

Frage an die "Experten", ist das dann das gleiche wie aus der Kommandozeile (nicht blockierend) oder nicht ?

{
my $v = (split(/\s/,(ReadingsVal("GPIO3","statGesamtWaermemenge",0))))[5];
my $tpm = `date -d 'today' +'%Y_%m'`;
chomp($tpm);;
$tpm .= "_TEST $v";
fhem("setreading GPIO3 $tpm);
}

Damian

Im DOIF-Perlmodus geht es einfacher (da sind die entsprechenden Variablen schon vorhanden)

DOIF {
[23:59];
my $monthThermicEnergy = (split(/\s/,(ReadingsVal("GPIO3","statGesamtWaermemenge",0))))[5];
fhem("setreading GPIO3 ${year}_${month}_TEST $monthThermicEnergy");
}


Den Vormontag kann man aus $month natürlich entsprechend bestimmen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

Zitat von: Damian am 01 September 2021, 07:49:05
Den Vormontag kann man aus $month natürlich entsprechend bestimmen.
;D wobei wir wieder beim Knackpunkt sind  ;D
@TomLee
qx(date -d 'today -1 month' +'%Y_%m') und `date -d 'today' +'%Y_%m'` (also backticks) sind faktisch das Gleiche siehe https://perldoc.perl.org/perlop#Quote-Like-Operators
Der Aufruf "date -d 'today' +'%Y_%m'" in der FHEM Kommandozeile schreibt die Ausgabe in das LogFile.

Dein letzter Codeblock ist also auch blockierend, was bei date keine Rolle spielen dürfte.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

Den Vormonat kann man ja einfach berechnen:

my $premonth=($month==1 ? 12 : $month-1);

Ich würde mir die ganzen Systemaufrufe sparen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

ZitatIm DOIF-Perlmodus geht es einfacher

Was genau meinst du damit ? Nur die Zeit-Angabe ([23:59];) in Perl oder auch die Zeitvariablen, weil die sind doch nicht DOIF-spezifisch, das sind doch "normale, einfache FHEM-Variablen" ?

Damian

Die Variabeln $month, $year usw. gibt es in Perl nicht. Es handelt sich um lokale Variablen, die entweder in fhem.pl deklariert wurden oder im DOIF oder sonst in irgend einem Modul, wenn sie dort definiert wurde.

Im DOIF z. B. werden sie in der Abarbeitung der Bedingung im FHEM-Modus oder im Perl-Block im Perlmodus deklariert und mit aktuellen Werten belegt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

#21
Dann mal noch ein Vorschlag für den Kompletten String wie im Ausgangspost. Nur mit Verwendung von Variablen :)
Für aktuellen und Vormonat
{strftime('%Y_%m',$sec,$min,$hour,$mday,$month-1,$year-1900)}
{$month==1 ? strftime('%Y_%m',$sec,$min,$hour,$mday,11,$year-1901) : strftime('%Y_%m',$sec,$min,$hour,$mday,$month-2,$year-1900)}


Sollte in FHEM einzeilern gehen ;) nicht in myUtils dort braucht man vorher die korrekte Zuweisung in der Art (nur als Ansatz):
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime()
Siehe auch https://commandref.fhem.de/#perl
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz