DOIF und das Zusammenfügen von Readings in einem Perl-Ausdruck

Begonnen von cwagner, 12 April 2016, 13:56:55

Vorheriges Thema - Nächstes Thema

cwagner

Für die zeitgerechte Aussendung von Wetter-Informationen nutze ich DOIF als "Zeitschaltuhr". Das klappte auch lange sehr klasse, bis ich mir in den Kopf setzte, zur Beurteilung von "Eiskratzgefahr" auch aus dem Statistikmodul die MIN/AVG/MAX-Werte mit einbinden zu wollen. [Einfache Regel: Wenn Taupunkt oberhalb der niedrigsten Nachttemperatur und Temperaturen um den Gefrierpunkt, dann gibt es Tau/Raufreif]

Meine DOIF-Definition ist also:
(([6:50] and [DI_DST:cmd_nr])==2 or ([7:50] and [DI_DST:cmd_nr]==1)) ({DebianMail('XXXX@YYYY.ZZ','Regenmessung','Gestern: '. [CN_Regen:Regen] .' mm. Aussentemperatur: '. [T_Aussen:temperature] .' Grad C '. [T_Aussen:stat_TemperatureDay] .' | Feuchtigkeit: '. [T_Aussen:humidity] .'% | Taupunkt: '. [T_Aussen:Taupunkt] .' Grad C')})

Daraus macht DOIF:
{DebianMail('XXXX@YYYY.ZZ','Regenmessung','Gestern: '. 0.0 .' mm. Aussentemperatur: '. 7.8 .' Grad C '. Min: 7.1 Avg: 8.1 Max: 9.1 .' | Feuchtigkeit: '. 82.99 .'% | Taupunkt: '. 5.1 .' Grad C')}

Problematisch ist offenbar das Einfügen von [T_Aussen:stat_TemperatureDay] = Min: 7.1 Avg: 8.1 Max: 9.1. Denn DOIF verendet in einem Perl-Fehler:

2016.04.12 07:50:00 1: PERL WARNING: Bareword found where operator expected at (eval 63048) line 1, near "7.1 Avg"
2016.04.12 07:50:00 3: eval: {DebianMail('XXXX@YYYY.ZZ','Regenmessung','Gestern: '. 0.0 .' mm. Aussentemperatur: '. 7.8 .' Grad C '. Min: 7.1 Avg: 8.1 Max: 9.1 .' | Feuchtigkeit: '. 82.99 .'% | Taupunkt: '. 5.1 .' Grad C')}
2016.04.12 07:50:00 1: PERL WARNING: (Missing operator before Avg?)
2016.04.12 07:50:00 1: PERL WARNING: Bareword found where operator expected at (eval 63048) line 1, near "8.1 Max"


Was kann ich tun?

Herzliche Grüße

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Per

Die Ausgaben in eckigen Klammern werden schon vom DOIF aufgelöst und direkt übergeben. Du musst sie also zusätzlich in Anführungszeichen setzen.

Ellert

Befehle, die Kommata enthalten, sind zusätzlich in runde Klammern zu setzen, siehe: http://fhem.de/commandref_DE.html#DOIF_Angaben_im_Ausfuehrungsteil
Zitat
(({DebianMail('XXXX@YYYY.ZZ','Regenmessung',...)}))

cwagner

@Per, vielen Dank, die Anführungszeichen waren es, es klappt!

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Per


Damian

Zitat von: Ellert am 12 April 2016, 14:12:07
Befehle, die Kommata enthalten, sind zusätzlich in runde Klammern zu setzen, siehe: http://fhem.de/commandref_DE.html#DOIF_Angaben_im_Ausfuehrungsteil

Nur mal zur Info:

Das gilt nur für FHEM-Befehl in runden Klammern, bei geschweiften Klammern (Perl) braucht man keine zusätzlichen runden Klammern um Kommata zu schützen.

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

Ellert

Zitat von: Damian am 13 April 2016, 07:22:51
Nur mal zur Info:

Das gilt nur für FHEM-Befehl in runden Klammern, bei geschweiften Klammern (Perl) braucht man keine zusätzlichen runden Klammern um Kommata zu schützen.
Ist das neu? Ich meine bei (set a b, {Log 1, "XYZ"}) bekam ich eine Fehlermeldung, daher schreibe ich immer  (set a b, ({Log 1, "XYZ"}))

Per

Da hast du ja auch ein Komma außerhalb der geschweiften Klammer.

Damian

Zitat von: Ellert am 13 April 2016, 09:53:44
Ist das neu? Ich meine bei (set a b, {Log 1, "XYZ"}) bekam ich eine Fehlermeldung, daher schreibe ich immer  (set a b, ({Log 1, "XYZ"}))

Nein, das sollte immer schon funktioniert haben.

Was jetzt neuerdings funktioniert, ist das hier:

(set bla {(... , ...)})

früher musste man

((set bla {(... , ...)}))

angeben.

Jetzt wird ein Komma innerhalb von irgendwelchen Klammern geschützt, da ich jetzt keinen split Befehl verwende, sondern einen eigenen SplitDoIf.

Gruß

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