FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: WarBird am 12 August 2020, 13:41:09

Titel: Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: WarBird am 12 August 2020, 13:41:09
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
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: Otto123 am 12 August 2020, 13:51:18
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
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: frank am 12 August 2020, 14:11:15
und "$fenster_sz" ist nicht definiert.
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: Beta-User am 12 August 2020, 14:14:46
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)
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: WarBird am 12 August 2020, 14:17:57
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/ (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
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: WarBird am 12 August 2020, 14:21:15
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
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: Otto123 am 12 August 2020, 14:23:21
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
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: Beta-User am 12 August 2020, 14:28:34
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)
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: frank am 12 August 2020, 14:37:42
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.
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: WarBird am 12 August 2020, 14:40:14
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
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: Otto123 am 12 August 2020, 14:42:01
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 ;)
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: Otto123 am 12 August 2020, 14:43:20
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.
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: WarBird am 12 August 2020, 14:45:18
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
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: WarBird am 12 August 2020, 15:22:52
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
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: frank am 12 August 2020, 15:29:41
hier mal ein link für eine profi lösung
https://forum.fhem.de/index.php/topic,29773.msg224962.html#msg224962 (https://forum.fhem.de/index.php/topic,29773.msg224962.html#msg224962)

wie sieht der code jetzt aus zu der meldung?
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: Beta-User am 12 August 2020, 15:37:44
Zitat von: frank am 12 August 2020, 15:29:41
hier mal ein link für eine profi lösung
https://forum.fhem.de/index.php/topic,29773.msg224962.html#msg224962 (https://forum.fhem.de/index.php/topic,29773.msg224962.html#msg224962)

wie sieht der code jetzt aus zu der meldung?
(Zu langsam; den bitte vorher ansehen).

Da schon fertig, zu der "finalen Lösung" noch ein paar Anmerkungen:
- der Zweck des Umkopierens von Readings erschließt sich mir nicht, es wird ja hier so gut wie nicht gerechnet => welchen Mehrwert bietet das?
- das triggert evtl. zu oft (z.B., wenn es Homematic-Fensterkontakte sind und eine VCCU im Einsatz ist) => Event-Monitor beobachten und ggf. einschränken!
- Die FK's könnte man in eine structure packen...
- elsif-Bandwürmer sind zulässig, aber nicht optimal und hier nicht erforderlich.

Kurz: Irgendwelchen Code von irgendwoher kopieren, ist ziemlich oft keine so gute Idee, weil speziell diese Art Blogger nicht optimalen Code im Fokus hat, sondern Werbung für irgendein neues gadget...

Meine Empfehlung: Geh' das nochmal sehr kritisch durch; wenn man das einmal "richtig" durch hat, läuft es beim nächsten Mal viel leichter von der Hand! Sonst wunderst du dich irgendwann über ein lahmes System und "beseitigst" die Symptome nach Microsoft-Art und beschaffst nur deswegen einen potenteren Rechner...
Titel: Antw:Brauche Hilfe bei fehlermeldung im DEF editor
Beitrag von: Otto123 am 12 August 2020, 15:40:14
ich meine auch: Das hier 2OG_SZ_Thermostat_Weather:.*|2OG_SZ_Fenster_[LR]:.* triggert auf zu viel!