Hallo FHEM-Gemeinde,
Ich bin vor ca. zwei Monaten auf den FHEM-Zug aufgesprungen, also noch recht wenig Erfahrung damit. Bisher hab ich "nur" Temperaturen (FTHs und 1-Wire) gemessen. Mein nächster Schritt soll sein, dass sich die Heizkreispumpe abschaltet, wenn kein Heizbedarf besteht. Hab hierzu aus dem Wiki die "Heizungskontrolle Einfach" verwendet (Copy & Paste). Leder kommt folgende Fehlermeldung in die Logfile:
n_heizung return value: Global symbol "%fs20_c2b" requires explicit package name at (eval 35) line 4.
Ich kann mit dieser Meldung nichts anfangen, das Forum und auch die Suchmaschine meines Vertrauens bringt Ergebnisse, die so tief in Perl gehen, dass ich direkt die Weiße Fahne hissen muss. Ich denke, dass ansonsten die Copy&Paste-Aktion erfolgreich gelaufen ist.
"fs20_c2b" hab ich als Dummy definiert,
1. will ich erst mal testen ob alles rund läuft bevor ich im Kalten sitze
und
2. ich noch keinen passenden Schalter habe.
Ich hab statt dem fs20_c2b auch schon andere Bezeichnungen ausprobiert, ohne Erfolg.
FHEM läuft bei mir auf einer FB 7390, installiert mit dem Image von fhem.de, nicht von AVM.
Ich hab vier Räume, die mit jeweils einem FHT80b geregelt sind. Die FHTs sind fehlerfrei in FHEM eingebunden.
Hi,
kann es sein, dass Du irgendwo "%fs20_c2b" anstatt "$fs20_c2b" geschrieben hast?
Gruß,
Thorsten
Hallo,
so sieht mein Code aus - ich habe Heizungskontrolle_Einfach bereits etwas für mich modifiziert:
define n_Wasserpumpe notify n_Wasserpumpe {
my $brauche_hitze=0;
my $brauche_dringend_hitze=0;
my $ventile_im_leerlauf=0;
my $vent_ein=(Value("Heizung_pruef_ein"));
my $vent_aus=(Value("Heizung_pruef_aus"));
my @@fhts=devspec2array("TYPE=FHT");
foreach(@@fhts) {
my $ventil=ReadingsVal($_, "actuator", "101%");
$ventil=(substr($ventil, 0, (length($ventil)-1)));
if ($ventil >= 55) {
$brauche_dringend_hitze=1
}
if (($ventil >= $vent_ein) && ($brauche_dringend_hitze == 0)) {
$brauche_hitze=1
}
if ($ventil < $vent_aus) {
$ventile_im_leerlauf++
}
}
if (($brauche_dringend_hitze != 0) || (($brauche_hitze != 0) && (Value("Freigabe") eq "on"))) {
fhem("set Wasserpumpe on") if (Value("Wasserpumpe") eq "Aus");
fhem("attr Wasserpumpe room 10_Keller,01_Anzeige,00_Bedienung") if(Value("Freigabe") ne "on");
}
else {
if ($ventile_im_leerlauf == @@fhts) {
fhem("set Wasserpumpe off") if (Value("Wasserpumpe") eq "Ein");
fhem("attr Wasserpumpe room 10_Keller") if(Value("Freigabe") ne "on");
}
else {
Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " von " . @@fhts . " Stellantrieben im Leerlauf.");
}
}
}
$vent_ein und $vent_aus nehmen die Werte von 2 Dummys auf mit denen ich die Einschalt- und Ausschaltventilstellungen noch von anderen Parameter abhängig mache.
Die Dummys heissen - wie im Code zu sehen - Heizung_pruef_ein und Heizung_pruef_aus - diese Werten werden über die Aussentemperatursensoren nach oben korrigiert (wenn es wärmer wird) bzw. nach unten wenn es kühler wird draussen.
Das bewegt sich aber inenrhalb von 20% bis 45%.
Weiters habe ich noch einen Dummy "Freigabe" der auch von anderen Faktoren gesetzt oder eben nicht gesetzt wird (momentan noch über die Wettervorhersage).
Sollte es dennoch im Raum abkühlen und ein! Ventil > 55% öffnen schalte ich die Wasserpumpe ein.
Grüße
Danke für die superschnelle Antwort. Ich hab kein $ durch % ersetzt. Als Anhang hab ich mal meine Heizbedarf.cfg angehängt. Die Datei wird mit include eingebunden.
Google liefert das hier:
https://groups.google.com/forum/m/#!msg/fhem-users/kEZdKsUFZ3s/T8a_WWF0q68J (https://groups.google.com/forum/m/#!msg/fhem-users/kEZdKsUFZ3s/T8a_WWF0q68J)
Da steht im Prinzip auch die Lösung dabei.
Gruß,
Thorsten
Tut mir leid, aber entweder sehe ich den Wald vor lauter Bäumen nicht oder ich bin zu ....
Auch aus dem Posting in der Googlegroup werde ich nicht schlau. Warum kommt der Fehler und wie werde ich ihn los?
Hi,
also ich habe auch wenig Ahnung, aber wenn ich mir den Kram hinter dem Link anschaue, dass ist diese Zeile hier das Problem:
my $heizung_status=$fs20_c2b{ReadingsVal("heizung","state","off")};;\
Anscheinend ist $fs20_c2b an dieser Stelle noch nicht definiert (noch nicht einmal deklariert, aber da macht Perl anscheinend nicht so den großen Unterschied). Es wird wohl erst in einem Modul definiert, was später geladen wird. Die Lösung ist wahrscheinlich, die obige Zeile durch das hier zu ersetzen:
my $heizung_status = ReadingsVal("heizung","state","off");;\
...und dann jedes Mal, wenn das hier vorkommt:
$heizung_status == 00
...ersetzen durch:
$heizung_status eq "off"
Entsprechend wird aus $heizung_status == 00
das hier: $heizung_status eq "on"
.
Ich denke, dadurch wird auch der Code etwas lesbarer, aber auch das wurde schon im Thread gesagt, auf den ich verlinkt habe.
Die Definition des fs20_c2b würde ich auch bleiben lassen. Das hat mit dem Problem oder seiner Lösung nichts zu tun.
Gruß,
Thorsten
Hallo nochmal,
Dank der Antwort von Thorsten Pferdekaempfer ist die Fehlermeldung jetzt weg, aber in der Logfile steht zum Beispiel:
2014.02.13 00:53:26 3: Heizbedarf: 3 von 4 Stellantriebe im Leerlauf.
2014.02.13 01:03:26 3: Heizbedarf: 3 von 4 Stellantriebe im Leerlauf.
2014.02.13 01:13:26 3: Heizbedarf: 3 von 4 Stellantriebe im Leerlauf.
2014.02.13 01:23:26 3: Wärme benoetigt. Vorheriger Heizungsstatus: off
2014.02.13 01:33:26 3: Wärme benoetigt. Vorheriger Heizungsstatus: off
2014.02.13 01:43:26 3: Heizbedarf: 3 von 4 Stellantriebe im Leerlauf.
2014.02.13 01:53:26 3: Heizbedarf: 3 von 4 Stellantriebe im Leerlauf.
1. Warum werden manchmal die Stellantriebe aufgeführt und manchmal der Wärmebedarf?
2. die Logfile logisch gelesen müsste doch bedeuten, dass der Heizungsstatus 'on' sein muss, oder? Zuvor wurde ja Wärme benötigt, aber Heizungsstatus 'on' hat noch nie in der Logfile gestanden.
Hier nochmal meinen aktuell zusammenkopierter Code (Dachte, dass ganz, ganz langsam laufen lerne, aber scheinbar hab ich noch Probleme zu krabbeln )
define Heizkreis dummy
define n_Wasserpumpe notify n_Wasserpumpe {\
my $brauche_waerme=0;;\
my $ventile_im_leerlauf=0;;\
my $heizung_status = ReadingsVal("heizung","state","off");;\
my @@fhts=devspec2array("TYPE=FHT");;\
foreach(@@fhts) {\
my $ventil=ReadingsVal($_, "actuator", "101%");;\
$ventil=(substr($ventil, 0, (length($ventil)-1)));;\
if ($ventil > 20) {\
$brauche_waerme=1\
}\
if ($ventil < 5) {\
$ventile_im_leerlauf++\
}\
}\
if ($brauche_waerme != 0) {\
Log(3,"Wärme benoetigt. Vorheriger Heizungsstatus: " . $heizung_status);;\
fhem("set heizung on") if ($heizung_status eq 00)\
} else {\
if ($ventile_im_leerlauf eq @@fhts) {\
Log(3,"Keine Wärme (mehr) benoetigt. Vorheriger Heizungsstatus: " . $heizung_status);;\
fhem("set heater off") if ($heizung_status eq 11)\
} else {\
Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " von " . @@fhts . " Stellantriebe im Leerlauf.")\
}\
}\
}
define a_Wasserpumpe at +*00:10:00 trigger n_Wasserpumpe
attr a_Wasserpumpe room FHT
Hallo,
Tipp 1 - Finger weg von der fhem.cfg ;)
Tipp 2 - änder mal
fhem("set heizung on") if ($heizung_status eq 00)\
in
fhem("set heizung on") if ($heizung_status eq "off")\
Deine Heizung muss auch heizung heissen - ich liebe das wenn versucht wird zu filtern und einfach nur keine bzw. zu wenig Infos kommen.
fhem("set heater off") if ($heizung_status eq 11)
Hier schreibst du heater - was nun? heizung oder heater?
FHEM ist nicht nur case sensitiv sondern weigert sich auch beharrlich Namen zu übersetzen.
"heizung" muss der Name deines Schalters für die Wasserpumpe/Heizung/was auch immer sein - oder heater.
Du musst dich auf eiens festlegen.
Du kannst nicht "heizung" einschalten und heater ausschalten - ja, kannst du schon aber es wird nicht funktionieren.
Also entweder heizung ODER heater - filtere keine Infos.
Die Definition zu deiner Wasserpumpe/Schalter für die Heizung wäre recht hilfreich für die die versuchen zu helfen.
Grüße
Hallo nochmal,
Hab meinen Fehler gefunden, er war vor dem Computer. Das zusammenkopieren war mein Fehler, ich hatte letztendlich verschiedene Befehle und Geräte drin.
Vielen Dank für eure Geduld.