Brauche Hilfe bei fehlermeldung im DEF editor

Begonnen von WarBird, 12 August 2020, 13:41:09

Vorheriges Thema - Nächstes Thema

WarBird

Huhu,
ich hab angesichts der hitze mal ein wenig gebastelt und eine Fenster Überwachung auf Grund von Außentemperatur raum Temperatur und Lüftungs Empfehlung.... hier und da ein paar code schnipsel angepasst und zusammengefügt...
das ganze sieht so aus....

(2OG_SZ_Thermostat_Weather.*|2OG_SZ_Fenster_(L|R):(open|closed))
{
my $temperature_sz = ReadingsVal("2OG_SZ_Thermostat_Weather", "temperature", "-1");;
my $dewpoint_sz = ReadingsVal("2OG_SZ_Thermostat_Weather", "dewpoint", "-1");;
my $temperature_au = ReadingsVal("0AU_Wetter", "temperature", "-1");;
my $dewpoint_au = ReadingsVal("0AU_Wetter", "dewpoint", "-1");;
my $dewpoint_buffer = $temperature_sz - $dewpoint_sz;;
my $fenster_sz_l = ReadingsVal("2OG_SZ_Fenster_L", "state", "undefined");;
my $fenster_sz_r = ReadingsVal("2OG_SZ_Fenster_R", "state", "undefined");;
if ($fenster_sz_l eq "closed" && $fenster_sz_r eq "closed") { my $fenster_sz = closed } else { my $fenster_sz = open }
{fhem ("
setreading 2OG_SZ_Lueften temperature_sz $temperature_sz,;
setreading 2OG_SZ_Lueften dewpoint_sz $dewpoint_sz,;
setreading 2OG_SZ_Lueften temperature_au $temperature_au,;
setreading 2OG_SZ_Lueften dewpoint_au $dewpoint_au,;
setreading 2OG_SZ_Lueften dewpoint_buffer $dewpoint_buffer,;
setreading 2OG_SZ_Lueften fenster_sz_r $fenster_sz_r,;
setreading 2OG_SZ_Lueften fenster_sz_l $fenster_sz_r,;
setreading 2OG_SZ_Lueften fenster_sz $fenster_sz
")};;

if ($fenster_sz_r eq "closed" && $temperature_sz > 23 && $temperature_au <= $temperature_sz) {
fhem ("set 2OG_SZ_Lueften open_cool")
}
elsif ($fenster_sz_r eq "closed" && $temperature_sz > 23 && $temperature_au > $temperature_sz) {
fhem ("set 2OG_SZ_Lueften closed_cool")
}
elsif ($fenster_sz_r eq "open" && $temperature_sz > 23 && $temperature_au <= $temperature_sz) {
fhem ("set 2OG_SZ_Lueften opend_cool")
}
elsif ($fenster_sz_r eq "open" && $temperature_sz > 23 && $temperature_au > $temperature_sz) {
fhem ("set 2OG_SZ_Lueften close_cool")
}
elsif ($fenster_sz_r eq "closed" && $dewpoint_buffer >= 3) {
fhem ("set 2OG_SZ_Lueften closed")
}
elsif ($fenster_sz_r eq "closed" && $dewpoint_buffer < 3 && $dewpoint_au <= $dewpoint_sz) {
fhem ("set 2OG_SZ_Lueften open_dry")
}
elsif ($fenster_sz_r eq "closed" && $dewpoint_buffer < 3 && $dewpoint_au > $dewpoint_sz) {
fhem ("set 2OG_SZ_Lueften closed_dry")
}
elsif ($fenster_sz_r eq "open" && $dewpoint_buffer >= 3) {
fhem ("set 2OG_SZ_Lueften opened")
}
elsif ($fenster_sz_r eq "open" && $dewpoint_buffer < 3 && $dewpoint_au <= $dewpoint_sz) {
fhem ("set 2OG_SZ_Lueften opened_dry")
}
elsif ($fenster_sz_r eq "open" && $dewpoint_buffer < 3 && $dewpoint_au > $dewpoint_sz) {
fhem ("set 2OG_SZ_Lueften close_dry")
}
else {
fhem ("set 2OG_SZ_Lueften kA")
}
}


das ganze ist aus dem DEF Fenster eines Notify Moduls....
leider beim speichern folgende Fehlermeldung......
Zitat
Not enough arguments for open at (eval 6463) line 9, at EOF
Global symbol "$fenster_sz" requires explicit package name (did you forget to declare "my $fenster_sz"?) at (eval 6463) line 18.
Bareword "closed" not allowed while "strict subs" in use at (eval 6463) line 9.

hat vielleicht jemand ne Idee woran es liegen könnte?

LG Tobias

Otto123

#1
Hallo Tobias,

die Kommas? Wozu ist die Klammer um {fhem("")} - die stört aber eventuell nicht?
Zitat{fhem ("
setreading 2OG_SZ_Lueften temperature_sz $temperature_sz,;
setreading 2OG_SZ_Lueften dewpoint_sz $dewpoint_sz,;
setreading 2OG_SZ_Lueften temperature_au $temperature_au,;
setreading 2OG_SZ_Lueften dewpoint_au $dewpoint_au,;
setreading 2OG_SZ_Lueften dewpoint_buffer $dewpoint_buffer,;
setreading 2OG_SZ_Lueften fenster_sz_r $fenster_sz_r,;
setreading 2OG_SZ_Lueften fenster_sz_l $fenster_sz_r,;
setreading 2OG_SZ_Lueften fenster_sz $fenster_sz
")};;

Der DEF Editor ist die Stelle wo die ; nur einmal notwendig sind und nicht generell verdoppelt werden müssen!

Ob das wirklich so gut ist? (2OG_SZ_Thermostat_Weather.*|2OG_SZ_Fenster_(L|R):(open|closed)) - die Klammer um alles stört mich. Ich würde (Gerät1|Gerät2):Event(1|2) separat klammern.

Gruß Otto
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

frank

FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Beta-User

Hmm, also irgendwie sieht die notify-regex schon komisch aus. Willst du nicht eigentlich sowas haben:
2OG_SZ_Thermostat_Weather:.*|2OG_SZ_Fenster_(L|R):(open|closed)
Dann würde ich das eher so ändern:
defmod n_test_n notify 2OG_SZ_Thermostat_Weather:.*|2OG_SZ_Fenster_[LR]:open|2OG_SZ_Fenster_[LR]:closed \
{\
my $temperature_sz = ReadingsVal("2OG_SZ_Thermostat_Weather", "temperature", "-1");;\
my $dewpoint_sz = ReadingsVal("2OG_SZ_Thermostat_Weather", "dewpoint", "-1");;\
my $temperature_au = ReadingsVal("0AU_Wetter", "temperature", "-1");;\
my $dewpoint_au = ReadingsVal("0AU_Wetter", "dewpoint", "-1");;\
my $dewpoint_buffer = $temperature_sz - $dewpoint_sz;;\
my $fenster_sz_l = ReadingsVal("2OG_SZ_Fenster_L", "state", "undefined");;\
my $fenster_sz_r = ReadingsVal("2OG_SZ_Fenster_R", "state", "undefined");;\
my $fenster_sz = "open";;\
$fenster_sz = "closed" if ($fenster_sz_l eq "closed" && $fenster_sz_r eq "closed");;\
fhem ("\
setreading 2OG_SZ_Lueften temperature_sz $temperature_sz;;\
setreading 2OG_SZ_Lueften dewpoint_sz $dewpoint_sz;;\
setreading 2OG_SZ_Lueften temperature_au $temperature_au;;\
setreading 2OG_SZ_Lueften dewpoint_au $dewpoint_au;;\
setreading 2OG_SZ_Lueften dewpoint_buffer $dewpoint_buffer;;\
setreading 2OG_SZ_Lueften fenster_sz_r $fenster_sz_r;;\
setreading 2OG_SZ_Lueften fenster_sz_l $fenster_sz_r;;\
setreading 2OG_SZ_Lueften fenster_sz $fenster_sz\
");;;;\
\
if ($fenster_sz_r eq "closed" && $temperature_sz > 23 && $temperature_au <= $temperature_sz) {\
fhem ("set 2OG_SZ_Lueften open_cool")\
}\
elsif ($fenster_sz_r eq "closed" && $temperature_sz > 23 && $temperature_au > $temperature_sz) {\
fhem ("set 2OG_SZ_Lueften closed_cool")\
}\
elsif ($fenster_sz_r eq "open" && $temperature_sz > 23 && $temperature_au <= $temperature_sz) {\
fhem ("set 2OG_SZ_Lueften opend_cool")\
}\
elsif ($fenster_sz_r eq "open" && $temperature_sz > 23 && $temperature_au > $temperature_sz) {\
fhem ("set 2OG_SZ_Lueften close_cool")\
}\
elsif ($fenster_sz_r eq "closed" && $dewpoint_buffer >= 3) {\
fhem ("set 2OG_SZ_Lueften closed")\
}\
elsif ($fenster_sz_r eq "closed" && $dewpoint_buffer < 3 && $dewpoint_au <= $dewpoint_sz) {\
fhem ("set 2OG_SZ_Lueften open_dry")\
}\
elsif ($fenster_sz_r eq "closed" && $dewpoint_buffer < 3 && $dewpoint_au > $dewpoint_sz) {\
fhem ("set 2OG_SZ_Lueften closed_dry")\
}\
elsif ($fenster_sz_r eq "open" && $dewpoint_buffer >= 3) {\
fhem ("set 2OG_SZ_Lueften opened")\
}\
elsif ($fenster_sz_r eq "open" && $dewpoint_buffer < 3 && $dewpoint_au <= $dewpoint_sz) {\
fhem ("set 2OG_SZ_Lueften opened_dry")\
}\
elsif ($fenster_sz_r eq "open" && $dewpoint_buffer < 3 && $dewpoint_au > $dewpoint_sz) {\
fhem ("set 2OG_SZ_Lueften close_dry")\
}\
else {\
fhem ("set 2OG_SZ_Lueften kA")\
}\
}


Als Erläuterung ggf. noch:
"Früher" habe ich auch versucht, die Regexe möglichst kompakt zu machen, aber Rudi hat irgendwann dann mal durchblicken lassen, dass das uU. kontraproduktiv ist, weil intern nicht ganz nach puren regex-Methoden verfahren wird, sondern meistens eine "Abkürzung" genommen wird, wenn FHEM die kennt. Dazu gibt es eine Hilfsfunktion, die zeigt, wie notify (und andere) "denkt". Also vergleiche mal den Output von:
{ notifyRegexpCheck('(2OG_SZ_Thermostat_Weather.*|2OG_SZ_Fenster_(L|R):(open|closed)) ')}mit
{ notifyRegexpCheck('2OG_SZ_Thermostat_Weather.*|2OG_SZ_Fenster_(L|R):(open|closed)')}und
{ notifyRegexpCheck('2OG_SZ_Thermostat_Weather:.*|2OG_SZ_Fenster_[LR]:open|2OG_SZ_Fenster_[LR]:closed ')}(Über den Schlüsselbegriff notifyRegexpCheck müßte auch Rudis Beitrag dazu zu finden sein, da steht auch was zu den eckigen Klammern...)
(und zu dem "Bandwurm"-elsif sage ich nur auf Anforderung was)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

WarBird

huhu,
und danke für die schnelle Antwort
der Code im Original ist von... https://www.meintechblog.de/2015/08/raumklima-im-smart-home-mit-fhem-verbessern-taupunktoptimiertes-lueften/
und wohl auch schon was älter, glaube von 2016 :) und glaube auch eigentlich gedacht direkt in die fhem.cfg eingetragen zu werden... aaaaber soll man ja nicht und hab ich leider auch schon Bööööse Erfahrungen mit gemacht  :o deswegen der Umweg über den DEF Editor....
hab ihn halt auf meine Bedürfnisse angepasst... oder es versucht  ;) warum da so viele klammern sind weis ich leider nicht, werde mal versuchen ein paar raus zu schmeißen...
ZitatOb das wirklich so gut ist? (2OG_SZ_Thermostat_Weather.*|2OG_SZ_Fenster_(L|R):(open|closed)) - die Klammer um alles stört mich. Ich würde (Gerät1|Gerät2):Event(1|2) separat klammern.
also wenn ich den Code richtig interpretiert habe von der Original Seite hat da jemand 2 Fenster und will den Status alle geschlossen = close und eins oder beide geöffnet = open weiter geben
meine Fensterkontakte heißen 2OG_SZ_Fenster_L und 2OG_SZ_Fenster_R
hoffe du verstehst was ich meine  :-[ manchmal verstehe ich selber nicht was ich schreibe :o...
LG Tobias

WarBird

huhu  :)
Zitat von: frank am 12 August 2020, 14:11:15
und "$fenster_sz" ist nicht definiert.
doch... also zumindest sollte es das darstellen :)

if ($fenster_sz_l eq "closed" && $fenster_sz_r eq "closed") { my $fenster_sz = closed } else { my $fenster_sz = open }

LG Tobias

Otto123

#6
Dann mach es exakt:
2OG_SZ_Fenster_[LR]:(open|closed) Aber den Einwand / die Anmerkung von Beta-user habe ich jetzt nicht geprüft ;)

Der 2OG_SZ_Thermostat_Weather.* ist ja dann obsolete?

@frank ist schon definiert - man muss nur genau schauen. Ist auch nicht glücklich - mitten im if ;) bzw. nicht richtig siehe Folgebeitrag  :-X
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

Beta-User

Zitat von: WarBird am 12 August 2020, 14:21:15
huhu  :)doch... also zumindest sollte es das darstellen :)

if ($fenster_sz_l eq "closed" && $fenster_sz_r eq "closed") { my $fenster_sz = closed } else { my $fenster_sz = open }

LG Tobias
Jein. Das definiert die Variable nur innerhalb des "lexical scope", also hier konkret innerhalb des einen oder anderen Zweiges des if. Danach ist der scope beendet und die Variable weg. Daher ist die in meinem Code auch nach oben gewandert ;) . (Der ist übrigens im "RAW"-Format)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

frank

Zitat von: Otto123 am 12 August 2020, 14:23:21
@frank ist schon definiert - man muss nur genau schauen. Ist auch nicht glücklich - mitten im if ;)

eigentlich musst du nur genau lesen.  ;)

Global symbol "$fenster_sz" requires explicit package name (did you forget to declare "my $fenster_sz"?) at (eval 6463) line 18.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

WarBird

huhu :)

Zitat von: Otto123 am 12 August 2020, 14:23:21
Der 2OG_SZ_Thermostat_Weather.* ist ja dann obsolete?

was meinst du genau? überflüssig? weil eigentlich nein den das notify soll ja bei Änderung der Fenster kontakte und bei Änderung der wetter Daten, also Temperatur oder Taupunkt reagieren...

lg  Tobias

Otto123

Ja - aber ich dachte das kam eher durch die folgenden ,; Kombinationen. Zumindest ist es sehr häufig so, ein (Semikolon) Fehler in Folge von my variable führt auch genau zu diesem Fehler. Deswegen bin ich genau in diesen Block gerannt ;)
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

Otto123

Zitat von: WarBird am 12 August 2020, 14:40:14
huhu :)

was meinst du genau? überflüssig? weil eigentlich nein den das notify soll ja bei Änderung der Fenster kontakte und bei Änderung der wetter Daten, also Temperatur oder Taupunkt reagieren...

lg  Tobias
Dann habe ich #4 falsch verstanden. Also nimm den Codevorschlag von Beta-User.
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

WarBird

boa komm ja kaum mit dem antworten hinterher..  ;D super danke nochmal ;D

Zitat von: frank am 12 August 2020, 14:37:42
eigentlich musst du nur genau lesen.  ;)

Global symbol "$fenster_sz" requires explicit package name (did you forget to declare "my $fenster_sz"?) at (eval 6463) line 18.
ja doch das hatte ich gelesen... ich war nur davon ausgegangen das ich darüber in der Zeile 9 einen Fehler habe und deswegen die Declaration nicht funktioniert....

ZitatNot enough arguments for open at (eval 6988) line 9, at EOF

Zeile 9

my $fenster_sz_l = ReadingsVal("2OG_SZ_Fenster_L", "state", "undefined");


Zeile 10

if ($fenster_sz_l eq "closed" && $fenster_sz_r eq "closed") { my $fenster_sz = closed } else { my $fenster_sz = open }


LG Tobias

WarBird

huhu
Vielen dank es funktioniert jetzt wie es soll :)


2OG_SZ_Thermostat_Weather:.*|2OG_SZ_Fenster_[LR]:.*
{
my $temperature_sz = ReadingsVal("2OG_SZ_Thermostat_Weather", "temperature", "-1");
my $dewpoint_sz = ReadingsVal("2OG_SZ_Thermostat_Weather", "dewpoint", "-1");
my $temperature_au = ReadingsVal("0AU_Wetter", "temperature", "-1");
my $dewpoint_au = ReadingsVal("0AU_Wetter", "dewpoint", "-1");
my $dewpoint_buffer = $temperature_sz - $dewpoint_sz;
my $fenster_sz_l = ReadingsVal("2OG_SZ_Fenster_L", "state", "undefined");
my $fenster_sz_r = ReadingsVal("2OG_SZ_Fenster_R", "state", "undefined");
my $fenster_sz = "open";
$fenster_sz = "closed" if ($fenster_sz_l eq "closed" && $fenster_sz_r eq "closed");
{fhem ("
setreading 2OG_SZ_Lueften temperature_sz $temperature_sz;
setreading 2OG_SZ_Lueften dewpoint_sz $dewpoint_sz;
setreading 2OG_SZ_Lueften temperature_au $temperature_au;
setreading 2OG_SZ_Lueften dewpoint_au $dewpoint_au;
setreading 2OG_SZ_Lueften dewpoint_buffer $dewpoint_buffer;
setreading 2OG_SZ_Lueften fenster_sz_l $fenster_sz_l;
setreading 2OG_SZ_Lueften fenster_sz_r $fenster_sz_r;
setreading 2OG_SZ_Lueften fenster_sz $fenster_sz
")};
if ($fenster_sz eq "closed" && $temperature_sz > 23 && $temperature_au <= $temperature_sz) {
fhem ("set 2OG_SZ_Lueften open_cool")
}
elsif ($fenster_sz eq "closed" && $temperature_sz > 23 && $temperature_au > $temperature_sz) {
fhem ("set 2OG_SZ_Lueften closed_cool")
}
elsif ($fenster_sz eq "open" && $temperature_sz > 23 && $temperature_au <= $temperature_sz) {
fhem ("set 2OG_SZ_Lueften opend_cool")
}
elsif ($fenster_sz eq "open" && $temperature_sz > 23 && $temperature_au > $temperature_sz) {
fhem ("set 2OG_SZ_Lueften close_cool")
}
elsif ($fenster_sz eq "closed" && $dewpoint_buffer >= 3) {
fhem ("set 2OG_SZ_Lueften closed")
}
elsif ($fenster_sz eq "closed" && $dewpoint_buffer < 3 && $dewpoint_au <= $dewpoint_sz) {
fhem ("set 2OG_SZ_Lueften open_dry")
}
elsif ($fenster_sz eq "closed" && $dewpoint_buffer < 3 && $dewpoint_au > $dewpoint_sz) {
fhem ("set 2OG_SZ_Lueften closed_dry")
}
elsif ($fenster_sz eq "open" && $dewpoint_buffer >= 3) {
fhem ("set 2OG_SZ_Lueften opened")
}
elsif ($fenster_sz eq "open" && $dewpoint_buffer < 3 && $dewpoint_au <= $dewpoint_sz) {
fhem ("set 2OG_SZ_Lueften opened_dry")
}
elsif ($fenster_sz eq "open" && $dewpoint_buffer < 3 && $dewpoint_au > $dewpoint_sz) {
fhem ("set 2OG_SZ_Lueften close_dry")
}
else {
fhem ("set 2OG_SZ_Lueften kA")
}
}

das ist der finale code  ;D

Lg Tobias

frank

FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html