notify durch FHT actuator

2,560 views
Skip to first unread message

VT

unread,
Oct 27, 2011, 9:17:44 AM10/27/11
to FHEM users
Hallo,
ich habe gerade die Idee ein FS20 einzuschalten wenn ein FHT einem
Actuator mehr als z.B. 10% sendet.
Und das ganze umgedreht wenn der Actuator wieder unter z.B. 5% fällt
den FS20 wieder ausschaltet.

Ich dachte ich hänge mich an das Log vom FHT.
Also wörtlich "notify" mich wenn der FHT einen Logeintrag macht, darin
steht "actuator > 10%" dann FS20:on.
Leider hab ich die Syntax überhaupt noch nicht geschnallt.

Ich würde jetzt so anfangen:
define FS20_on notify ???list FHT80b_01 actuator > 10%???
Heizung:FS20:on
define FS20_off notify ???list FHT80b_01 actuator < 5%???
Heizung:FS20:off

Aber das da zwischen den Fragezeichen ist mein Problem.
Wie sieht das wirklich aus?

Gruß
VT

UliM

unread,
Oct 27, 2011, 11:40:21 AM10/27/11
to FHEM users
Hi,
meine Lösung sieht folgendermassen aus:
Der FHT sendet den actuator-Wert alle 2 Minuten. Um die Heizung nicht
alle 2 Minuten ein- und auszuschalten (da der Wärmewert ja ein träges
System ist), habe ich eine Prüfung alle 30 Minuten, die dann den
actuator-Wert prüft und bei actuator <50% die Heizung für eine Stunde
aussschaltet.
Mein FHT heisst ez_FHT
Mein Heizungsschalter heisst hzg_HeizungFreigabeBrenner

Sieht dann so aus:

define hzg_HeizCheck at +*00:30 {
my $fht_Actuator = ReadingsVal("ez_FHT", "actuator", "101%");;
$fht_Actuator = substr($fht_Actuator, 0, length($fht_Actuator)-1);;

if ($fht_Actuator < 50) {
Log 3, ('hzg_HeizCheck Actuator '.$fht_Actuator.' -> Brenner aus');;
fhem('set hzg_HeizungFreigabeBrenner off-for-timer 3840');;
fhem('setstate hzg_HeizungFreigabeBrenner off')
}
else {
Log 3, ('hzg_HeizCheck Actuator '.$fht_Actuator.' -> Brenner an');;
fhem('setstate hzg_HeizungFreigabeBrenner on')
}
}


(der substr schneidet das %-Zeichen der actuator-Meldung ab; setstate
kümmert sich nur um das icon im webfrontend)

Du kannst im o.g. code die zeiten verkürzen. Alternativ kannst Du das
notify direkt an die Meldung des FHT hängen.

Hoffe das hilft.

Gruß, Uli


VT

unread,
Oct 27, 2011, 12:06:45 PM10/27/11
to FHEM users
Hallo Uli,

ja sieht gut aus.
Ist zwar ein Polling, aber auch eine gute Idee, damit vermeidet man
viel zappelei.

Was bedeutet die "101%", wenn Du die Variable fht_Actuator füllst?
Sieht für mich Unkundigen aus, als willst Du nur die 101% Werte
auslesen??

Ich probier es mal aus.
Wieder etwas Perl gelernt. ;o)
Vielen Dank
VT

UliM

unread,
Oct 27, 2011, 12:14:48 PM10/27/11
to FHEM users
Hi,
siehe
http://fhem.de/commandref.html#perl

ReadingsVal(<devicename>,<reading>,<defaultvalue>)
Habe einfach nen defaultvalue genommen, den man auch als solchen
erkennt - auch wenn ich nicht weiss, wann dieser Wert 'zieht'.

Viel Erfolg!
Uli

VT

unread,
Oct 27, 2011, 12:19:19 PM10/27/11
to FHEM users
Cool, wieder gelernt.
In 5min weiß ich ob es geht.
Das Log hat erst mal nicht gemeckert...

Danke

On 27 Okt., 18:14, UliM <uli.ma...@googlemail.com> wrote:
> Hi,
> siehehttp://fhem.de/commandref.html#perl

VT

unread,
Oct 27, 2011, 12:30:11 PM10/27/11
to FHEM users
Tut nicht.... ;o(

define HeizAbsenkung at +*00:01 {
my $FHT_Actuator=ReadingsVal("FHT80b_01","actuator","101%");;
$FHT_Actuator=substr($FHT_Actuator,0,length($FHT_Actuator)-1);;
if ($FHT_Actuator>20){
fhem('set Absenk on')
};;
if ($FHT_Actuator<5)
{
fhem('set Absenk off')
}}

Log sagt:
2011.10.27 18:29:10 3: Unknown command {, try help

Kopfkratz

VT

unread,
Oct 27, 2011, 12:32:01 PM10/27/11
to FHEM users
Leider will es noch nicht, irgendwo fehlt da noch ein Zeichen...aber
wo?

Log sagt: 2011.10.27 18:29:10 3: Unknown command {, try help

Define:
define HeizAbsenkung at +*00:01 {
my $FHT_Actuator=ReadingsVal("FHT80b_01","actuator","101%");;
$FHT_Actuator=substr($FHT_Actuator,0,length($FHT_Actuator)-1);;
if ($FHT_Actuator>20){
fhem('set Absenk on')
};;
if ($FHT_Actuator<5)
{
fhem('set Absenk off')
}}

On 27 Okt., 18:14, UliM <uli.ma...@googlemail.com> wrote:
> Hi,
> siehehttp://fhem.de/commandref.html#perl

VT

unread,
Oct 27, 2011, 3:17:01 PM10/27/11
to FHEM users
Aha OK,
"\" muß man bei Zeilenumbruechen einfuegen...das war das Raetzels
Loesung.

define HeizAbsenkung at +*00:01 {\
my $FHT_Actuator=ReadingsVal("FHT80b_01","actuator","101%");;\
$FHT_Actuator=substr($FHT_Actuator,0,length($FHT_Actuator)-1);;\
if ($FHT_Actuator>20){\
fhem('set Absenk on')\
};;\
if ($FHT_Actuator<5)\
{\
fhem('set Absenk off')\
}}

On 27 Okt., 18:32, VT <thiele.vol...@arcor.de> wrote:
> Leider will es noch nicht, irgendwo fehlt da noch ein Zeichen...aber
> wo?
>
> Log sagt: 2011.10.27 18:29:10 3: Unknown command {, try help
>
> Define:
> c

borsti

unread,
Oct 28, 2011, 12:09:14 AM10/28/11
to fhem-...@googlegroups.com
Hallu Uli,

> alle 2 Minuten ein- und auszuschalten (da der W�rmewert ja ein tr�ges
> System ist), habe ich eine Pr�fung alle 30 Minuten, die dann den
> actuator-Wert pr�ft und bei actuator <50% die Heizung f�r eine Stunde
> aussschaltet.

Auch eine nette Idee. Bringt das so viel?
Meine Idee war, die "low temp"-Warnung zum Einschalten zu nutzen, zum
wieder-ausschalten im Fr�hling habe ich noch keinen richtigen Ansatz.
Nur den Actuator wollte ich nicht pr�fen, ich denke an ein vergessenes
offenes Fenster im Winter... ;)

Wie schaltest Du eigentlich den Brenner? Bei meinem scheint das ohne
Eingriff mit L�tkolben nicht machbar. :(

Gruss
Torsten

VT

unread,
Oct 28, 2011, 3:20:03 AM10/28/11
to FHEM users
Hallo

so sieht jetzt die "laufende" ösung aus:
<code>
#Heizabsenkung schaltet einmal wenn Actor < oder > Grenzwert liegt
#die if state soll verhindern das alle 30min der FS20 nochmal
eingeschalten wird
#er ist aber schon an und wuerde nur das Log fuellen
#Status 11 = "on"; 00 = off; on/off hat fhem nicht verstanden...
define HeizAbsenkung at +*00:30 {\
my $FHT_Actuator=ReadingsVal("FHT80b_01","actuator","101%");;\
my $FS20_State=$fs20_c2b{ReadingsVal("Absenk","state","off")};;\
$FHT_Actuator=substr($FHT_Actuator,0,length($FHT_Actuator)-1);;\
\
if ($FHT_Actuator>15){\
if ($FS20_State==00){\
fhem('set Absenk on')\
}\
};;\
\
if ($FHT_Actuator<6){\
if ($FS20_State==11){\
fhem('set Absenk off')\
}\
};;\
}
</code>

Ein weiterer Vorschlag von Uli war noch über das "notify" zu gehen
(was ja in der ursprünglichen Frage stand)
<code>
##fhem.cfg##
define ez_FHT_notify notify ez_FHT { \
my $FHT = "%";; \
if ($FHT =~ "actuator:") { \
$FHT = (substr($FHT, 9, (length($FHT)-10)));; \
if ($FHT > 50) { \
fhem("set hzg_Brenner on") \
} \
} \
}
</code>

Danke Uli

Bye

VT

unread,
Oct 28, 2011, 3:27:57 AM10/28/11
to FHEM users
@Borsti
Das Problem mit den offenen Fenster sollte mit den FensterTür Sensoren
zu lösen sein.
Wenn es denn eins ist...
Dann wird der Sollwert gesenkt und der Actor folglich auch nicht
aufgefahren...
Aber wenn jemand zu Hause ist der das Fenster öffnet, macht ein
Absenkbetrieb auch keinen Sinn.
Der ist bei mir nur gedacht wenn ich die Woche über nicht mal in die
Nähe des Hauses komme
und somit die Heizung abgesenkt fahren kann weil ja niemand zu hause
ist.

Man könnte aber noch einen Button mit einbeziehen, wie AbsenkAutomatik
on/off.
Der das ganze dann ausschaltet.

On 28 Okt., 06:09, borsti <borst...@googlemail.com> wrote:

UliM

unread,
Oct 28, 2011, 3:34:58 AM10/28/11
to FHEM users


> > alle 2 Minuten ein- und auszuschalten (da der W rmewert ja ein tr ges
> > System ist), habe ich eine Pr fung alle 30 Minuten, die dann den
> > actuator-Wert pr ft und bei actuator <50% die Heizung f r eine Stunde
> > aussschaltet.
>
> Auch eine nette Idee. Bringt das so viel?
Weniger Funkverkehr :-)
Ich nutze den FHT nur, wenn ich auf Dienstreise bin - der bekommt dann
als Solltemperatur zB 17C eingestellt und würgt den regulären
Raumthermostat ab.
Sobald die zB 17C überschritten sind, wird von FHT/fhem freigegeben
und es zieht die Steuerung des Original-Raumthermostats.
Wesentlicher Grund für dieses Konstrukt ist, dass a) der original
Raumthermostat nur eine Wochensteuerung hat, ich aber manchmal länger
als eine Woche weg bin, b) sich die Dauer meiner Dienstereisen häufig
ändert und ich so das 'Wieder-Hochheizen' auch von unterwegs per
iPhone triggern kann.

> Meine Idee war, die "low temp"-Warnung zum Einschalten zu nutzen, zum
> wieder-ausschalten im Fr hling habe ich noch keinen richtigen Ansatz.
> Nur den Actuator wollte ich nicht pr fen, ich denke an ein vergessenes
> offenes Fenster im Winter... ;)
Wenn ein offenes Fenster ein Thema ist, wäre doch gerade der actuator-
Wert gut, natürlich mit kürzeren Schaltzyklen als in meinem Beispiel
oben. Ursprünglich hatte auch ich ein notify auf jegliche FHT-Meldung
(den code kann ich auch posten falls Interesse besteht), so dass der
Heizungs-Schaltzyklus bei 2 statt 30 Minuten lag. Brauche ich bei mir
aber nicht, daher die Änderung auf 30 Minuten.
Lowtemp - hab ich mir im FHT noch gar nicht angeschaut, kann man
sicher nutzen.
Frühling - vielleicht kannst Du nen Feiertag als Auslöser verwenden,
z.B. Ostern?

> Wie schaltest Du eigentlich den Brenner? Bei meinem scheint das ohne
> Eingriff mit L tkolben nicht machbar. :(
Ich hab ne ältere Vaillant Etagenheizung (VCW 240). Diese Geräte haben
zwei Steuerungsmechanismen:
1. 24V analog-Steuerung, daran hängt das Original Raumthermostat
(heisst dort 7-8-9-Schnittstelle, da die entsprechenden Kabel an die
Anschlussklemmen 7,8 und 9 gehängt werden)
2. 230V "binär-Anschluss", mit dem man nicht die Netzspannung der
Therme, sondern wirklich das Auslösen des Brenners beeinflussen kann
(heisst dort 3-4-5-Schnittstelle). Liegt an Kontakt 4 eine Spannung
von 230V, ist der Brenner freigegeben für die Steuerung gemäß
Raumthermostat. Ist Kontakt 4 stromlos, kann der Raumthermostat melden
was er will, der Brenner bleibt aus. In der Standardauslieferung ist
dort einfach eine Kabelbrücke verbaut, die habe ich durch einen FS20-
WS1 ersetzt (WS1 ist bistabil und daher gut auch für wochen-/
monatelange Einschaltzeiten) - Anschluss geht glücklicherweise ohne
Lötkolben über Schraubklemmleiste.

Siehe auch
http://groups.google.com/group/fhem-users/browse_thread/thread/486f2f263e9063b6/900b71890f65a946?lnk=gst&q=vaillant#900b71890f65a946

Gruss, Uli

borsti

unread,
Oct 28, 2011, 2:09:03 PM10/28/11
to fhem-...@googlegroups.com
Hallo Volker,

> Aber wenn jemand zu Hause ist der das Fenster öffnet, macht ein
> Absenkbetrieb auch keinen Sinn.

Das hast Du glaub' ich genau falschrum verstanden. ;)

Es geht mir darum, wenn jemand zu Hause ist und das Fenster VERGISST,
dann sorgt ja die eingestellte "Fenster-offen-Temperatur" dafuer, dass
bei unterschreiten von 12° *trotzdem* das Ventil oeffnet.

Mir is aber soeben aufgefallen, dass ich einen Denkfehler hatte: Ich
ging davon aus, dass bei offenem Fenster und abgeschaltetem Brenner der
Raum total auskuehlen wuerde, dem ist aber ja nicht so, weil unter der
Minimaltemperatur ja der Actuator hochgedreht wird...

Gruss,
Torsten

borsti

unread,
Oct 28, 2011, 3:37:19 PM10/28/11
to fhem-...@googlegroups.com
Hallo Uli,

>>> actuator-Wert pr ft und bei actuator<50% die Heizung f r eine Stunde
>>> aussschaltet.
>> Auch eine nette Idee. Bringt das so viel?
> Weniger Funkverkehr :-)

Da waere ich mir hier bei mir nicht so sicher. ;)
In einigen Raeumen geht das Ventil selten mal ueber 30% auf. Wenn ich da
den Brenner abschaltete und erst wieder jenseits der 50% anmache, hab'
ich in 10 Minuten eine Sauna. =8)

> Ich nutze den FHT nur, wenn ich auf Dienstreise bin - der bekommt dann

ok, ich nutze NUR den, kein Raumthermostat vorhanden. Nur eine
Wolf-Therme im Keller mit dem daemlichen Aussenfuehler...

Mit dem Tag/Nachtprogramm pro Tag bin ich ganz zufrieden; bei laengerer
Abwesenheit wuerde ich mir mal die Sache mit den "Holiday"-Settings
anschauen. Aber so weit bin ich noch lange nicht...

> Wenn ein offenes Fenster ein Thema ist, wäre doch gerade der actuator-
> Wert gut, natürlich mit kürzeren Schaltzyklen als in meinem Beispiel

habe meinen Denkfehler vorhin schon bemerkt, ja. %-)
Der Actuator-Wert ist vor allem sicherer. Letzte Nacht z.B. hat der FHT
mal wieder das Senden eingestellt - von 21 bis ca. 4 Uhr! Der Watchdog
hat zwar mehrfach zugeschlagen, aber es erfolgten trotzdem keine
regelmaessigen Sendungen mit der aktuellen Temperatur, nur
"desired-temp" und "actuator". >:(

> Lowtemp - hab ich mir im FHT noch gar nicht angeschaut, kann man
> sicher nutzen.

Das war halt mein Gedanke, wenn man den Brenner nicht häufig schalten
will. Wenn es allmaehlich kuehl wird, muss man sich ein paar
Tage etwas dicker anziehen, aber irgendwann triggert ein "low temp" bei
einem beliebigen FHT.

> Frühling - vielleicht kannst Du nen Feiertag als Auslöser verwenden,
> z.B. Ostern?

Nee, das wollte ich ja nicht an einem Termin festmachen, sondern daran,
dass keine Waermezufuhr mehr noetig ist. Also lande ich da wohl auch
wieder beim Actuator, denke ich...

>> Wie schaltest Du eigentlich den Brenner? Bei meinem scheint das ohne
>> Eingriff mit L tkolben nicht machbar. :(
> Ich hab ne ältere Vaillant Etagenheizung (VCW 240).

Bei meiner Wolf "GU-1E-18" konnte ich nichts weiter finden - nur dass
die drauf bestehen, nur Original-Zubehoer zuzulassen. :-P Da gibt es
auch Raumthermostaten und so, aber die erfuellen hier nicht ihren Zweck.

> was er will, der Brenner bleibt aus. In der Standardauslieferung ist
> dort einfach eine Kabelbrücke verbaut, die habe ich durch einen FS20-
> WS1 ersetzt (WS1 ist bistabil und daher gut auch für wochen-/

ja, so hatte ich mir das auch vorgestellt. Nur trau' ich mich da so
nicht ran.

Danke,
Torsten

Borsti67

unread,
Oct 30, 2011, 12:51:54 PM10/30/11
to fhem-...@googlegroups.com
Hallo,

inspiriert durch Uli und Volker habe ich mir jetzt mal folgenden Notify zusammengestoppelt:


define n_Winterbetrieb_on notify .*Thermostat:.*actuator.* { \
  my $FHT = "%";; \
  my $FS20_State=$fs20_c2b{ReadingsVal("Winterbetrieb","state","off")};; \
  my $FS20_LastActionTime=time()-time_str2num($defs{Winterbetrieb}{READINGS}{state}{TIME});; \

  $FHT = (substr($FHT, 9, (length($FHT)-10)));; \
  if ($FHT > 50) { \
    if($FS20_LastActionTime < 30*60) {\
      Log(3,"Brennerschaltung max. alle 30 Minuten!") \
    } else { \
      if ($FS20_State == 00) { \
        fhem("set Winterbetrieb on") \
      } else { \
        Log(4,"Brenner ist bereits an!") \
      } \
    } \
  } \
}

Was es tun soll:
  • wenn IRGENDEIN Thermostat zu mehr als 50% offen ist, soll der Brenner eingeschaltet werden
  • um unnützen Funkverkehr zu vermeiden, natürlich nur dann, wenn er nicht sowieso an ist
  • außerdem sollte die Umschaltung nicht öfter als alle 30 min erfolgen (eventuell muss das Intervall sogar noch größer)
Habe ich das so richtig gemacht? Könnte man noch was verbessern/optimieren?

Zudem suche ich noch immer eine Idee, wann ich den Brenner ausmachen kann. Theoretisch müsste man testen, ob ALLE Aktuatoren z.B. unter 20% stehen - oder?
Im Moment hab' ich nur den einen, von daher kann ich da schlecht experimentieren. ;)

Gruss
Torsten

Zrrronggg!

unread,
Oct 30, 2011, 6:39:36 PM10/30/11
to FHEM users
Keine Lösungsbeitrag, nur eine Verständnissfrage:

Warum wollt ihr den Brenner/Therme abschalten, wenn das Ventil mehr
als X offen ist?

Ich kapier das nicht so richig.


Ich hab als Fenster-auf-Temp 8 Grad, da muss man erstmal drunter
kommen. In der Praxis heisst das: Fenster auf - Ventil sowieso zu.
(von "Fenster für TAGE auf und draussen ist es minus 10 Grad" mal
abgesehen)

On 30 Okt., 17:51, Borsti67 <borst...@googlemail.com> wrote:
> Hallo,
>
> inspiriert durch Uli und Volker habe ich mir jetzt mal folgenden Notify
> zusammengestoppelt:
>
> define n_Winterbetrieb_on notify .*Thermostat:.*actuator.* { \
>
>
>
>
>
>
>
>
>
> >   my $FHT = "%";; \
> >   my $FS20_State=$fs20_c2b{ReadingsVal("Winterbetrieb","state","off")};; \
> >   my
> > $FS20_LastActionTime=time()-time_str2num($defs{Winterbetrieb}{READINGS}{sta te}{TIME});;
> > \
> >   $FHT = (substr($FHT, 9, (length($FHT)-10)));; \
> >   if ($FHT > 50) { \
> >     if($FS20_LastActionTime < 30*60) {\
> >       Log(3,"Brennerschaltung max. alle 30 Minuten!") \
> >     } else { \
> >       if ($FS20_State == 00) { \
> >         fhem("set Winterbetrieb on") \
> >       } else { \
> >         Log(4,"Brenner ist bereits an!") \
> >       } \
> >     } \
> >   } \
> > }
>
> Was es tun soll:
>
>    - wenn IRGENDEIN Thermostat zu mehr als 50% offen ist, soll der Brenner
>    eingeschaltet werden
>    - um unnützen Funkverkehr zu vermeiden, natürlich nur dann, wenn er
>    nicht sowieso an ist
>    - außerdem sollte die Umschaltung nicht öfter als alle 30 min erfolgen

borsti

unread,
Oct 31, 2011, 1:24:07 AM10/31/11
to fhem-...@googlegroups.com
Moin,

> Warum wollt ihr den Brenner/Therme abschalten, wenn das Ventil mehr
> als X offen ist?

Andersrum - der Brenner soll AN, wenn ein Ventil mehr als X offen ist
(offensichtlich zu kalt). Und andersrum soll er wieder aus, sobald der
Waermebadarf nicht mehr da ist.

Gruss
Torsten


Zrrronggg!

unread,
Nov 1, 2011, 9:32:35 AM11/1/11
to FHEM users
Okay, nicht richtig gelesen. Sry

borsti

unread,
Nov 1, 2011, 12:50:23 PM11/1/11
to fhem-...@googlegroups.com
> Okay, nicht richtig gelesen. Sry

Macht doch nix.

Aber zwischenzeitlich habe ich mir noch mehr Beispiele aus dem WIKI
angeschaut (waere doch schade, wenn so viele sich Arbeit machen und
keiner liest es, gell?).

Die Actuator-Meldungen als Trigger zu benutzen ist zwar definitiv
zuverlaessiger als auf ein "Low Temp" zu warten, erzeugt aber auch eine
gewisse Last. Immerhin kommen die normalerweise alle 2 Minuten!

Also habe ich mir nun doch einen halbstündigen Trigger-Event mittels AT
gemacht, und dieses notify-Makro dazu:


define n_Brenner notify n_Brenner { \
my $mussheizen=0;; \
my $imleerlauf=0;; \
my
$brennerstatus=$fs20_c2b{ReadingsVal("Winterbetrieb","state","off")};; \
my @@fhts=devspec2array("TYPE=FHT");; \
foreach(@@fhts) { \
my $actuator=ReadingsVal($_, "actuator", "101%");; \
$actuator=(substr($actuator, 0, (length($actuator)-1)));; \
if ($actuator > 50) {\
$mussheizen=1 \
} \
if ($actuator < 20) { \
$imleerlauf++ \
} \
} \
if ($mussheizen != 0) { \
Log(4,"Es muss geheizt werden. Voriger Brennerstatus: " .
$brennerstatus);; \
fhem("set Winterbetrieb on") if ($brennerstatus == 00) \
} else { \
if ($imleerlauf == @@fhts) { \
Log(4,"Kein Wärmebedarf (mehr). Voriger Brennerstatus: " .
$brennerstatus);; \
fhem("set Winterbetrieb off") if ($brennerstatus == 11) \
} else { \
Log(4,"Wärmebedarf: " . $imleerlauf . " von " . @@fhts . " im
Leerlauf.") \
} \
} \
}

Auch hierzu ein paar Anmerkungen:
- wenn irgendein Ventil zu mehr als 50% auf ist, muss der Brenner an. Da
wird nicht diskutiert. ;) Eventuell waere es eleganter, diese Konstante
(die ja momentan sowieso rein experimenteller/theoretischer Natur ist)
per Web setzen zu koennen - wenn ja, wie?
- Ventilstellungen unter 20% sehe ich als "so gut wie aus" an. Auch hier
gilt, das koennte sich als unrealistisch erweisen und waere bestimmt
schicker per Web gesetzt...
- sofern ALLE FHTs unter diesem Schwellwert liegen (und nur dann), kann
der Brenner abgeschaltet werden. Andernfalls wird nichts geaendert.
- die Schaltvorgaenge erfolgen nur wenn erforderlich. ;)

Was haltet ihr davon? Verbesserungs-/Optimierungsvorschlaege?

Gruss
Torsten

Rudolf Koenig

unread,
Nov 1, 2011, 12:59:00 PM11/1/11
to fhem-...@googlegroups.com
> Verbesserungs-/Optimierungsvorschlaege?

Ich wuerde laengere Sachen als Funktion in 99_MyUtils.pm einbauen. Diese kann
man notfalls auch in FHEMWEB unter "Edit Files" bearbeiten, und sie aus einem
notify aufrufen. Vorteil: man muss kein @ % ; und Zeilenende schuetzen.

borsti

unread,
Nov 1, 2011, 1:59:51 PM11/1/11
to fhem-...@googlegroups.com

ok, das habe ich jetzt mal versucht:

99_MyUtils.pm
----------------------
package main;
use strict;
use warnings;
use POSIX;

sub HeizTest($$) {
my($obergrenze, $untergrenze) = @_;
# 1. Param = Schwellwert, ab dem der Brenner IMMER eingeschaltet wird (50)
# 2. Param = Schwellwert, unter dem der Brenner aus könnte (20)


my $mussheizen=0;
my $imleerlauf=0;
my $brennerstatus=$fs20_c2b{ReadingsVal("Winterbetrieb","state","off")};

my @fhts=devspec2array("TYPE=FHT");
foreach(@fhts) {


my $actuator=ReadingsVal($_, "actuator", "101%");
$actuator=(substr($actuator, 0, (length($actuator)-1)));

if ($actuator > $obergrenze) {
$mussheizen=1;
}
if ($actuator < $untergrenze) {


$imleerlauf++;
}
}
if ($mussheizen != 0) {
Log(4,"Es muss geheizt werden. Voriger Brennerstatus: " .
$brennerstatus);
fhem("set Winterbetrieb on") if ($brennerstatus == 00);
} else {

if ($imleerlauf == @fhts) {


Log(4,"Kein Wärmebedarf (mehr). Voriger Brennerstatus: " .
$brennerstatus);
fhem("set Winterbetrieb off") if ($brennerstatus == 11);
} else {

Log(4,"Wärmebedarf: " . $imleerlauf . " von " . @fhts . " im
Leerlauf.");
}
}
}

1;

-----------------

wenn ich aber {Heiztest(50,20)} eingebe, bekomme ich:

Undefined subroutine &main::HeizTest called at (eval 20) line 1.

...im Log nachgeschaut sehe ich dort auch noch einen Fehler:

2011.11.01 18:53:53 1: reload: Error:Modul 99_MyUtils deactivated:
Global symbol "%fs20_c2b" requires explicit package name at
/usr/syno/synoman/webman/3rdparty/fhem/FHEM/99_MyUtils.pm line 18, <$fh>
line 6.

jetzt verstehe ich gar nichts mehr. :(

Uebrigens habe ich bei dieser Gelegenheit noch einen Fehler gesehen, der
ist aber schon laenger da:

Use of uninitialized value in concatenation (.) or string at
/usr/syno/synoman/webman/3rdparty/fhem/fhem.pl line 1426, <$fh> line 6.

was ist das?

Gruss,
Torsten

UliM

unread,
Nov 1, 2011, 2:51:35 PM11/1/11
to FHEM users
Hi Torsten,
wow, schick!

> Undefined subroutine &main::HeizTest called at (eval 20) line 1.
>
> ...im Log nachgeschaut sehe ich dort auch noch einen Fehler:
>
> 2011.11.01 18:53:53 1: reload: Error:Modul 99_MyUtils deactivated:
>   Global symbol "%fs20_c2b" requires explicit package name at
> /usr/syno/synoman/webman/3rdparty/fhem/FHEM/99_MyUtils.pm line 18, <$fh>
> line 6.

Schätze mal, Du musst nun doch wieder die ;; und \ und %% einbauen.
Oder Du nimmst als Startpunkt das, was Dir das modify vorher in die
fhem.cfg geschrieben hatte, dann haste die ;; und \ schon drin.


> Use of uninitialized value in concatenation (.) or string at
> /usr/syno/synoman/webman/3rdparty/fhem/fhem.pl line 1426, <$fh> line 6.

Auch geraten:
Mglw. fehlt in Deinem 99_MyUtils.pm die Routine MyUtils_Initialze($$)
Schau mal hier:
http://groups.google.com/group/fhem-users/browse_thread/thread/7f1740b5e681ca2a/b86a22566b72c957?lnk=gst&q=uninitialized#b86a22566b72c957

Viel Erfolg!
Gruß, Uli

Rudolf Koenig

unread,
Nov 1, 2011, 3:10:55 PM11/1/11
to fhem-...@googlegroups.com
> 2011.11.01 18:53:53 1: reload: Error:Modul 99_MyUtils deactivated:
> Global symbol "%fs20_c2b" requires explicit package name at
> /usr/syno/synoman/webman/3rdparty/fhem/FHEM/99_MyUtils.pm line 18,
> <$fh> line 6.

%fs20_c2b wird leider in 10_FS20.pm definiert, aber die 99'er Module werden
vorher geladen. Man koennte es zum Schluss wiederholt laden mit
define LoadMyUtils notify global:INITIALIZED { require "99_MyUtils.pm" }
ist aber nicht so die feine Art.

Andererseits: Wieso hier %fs20_c2b hier verwendet wird, ist mir ein Raetsel.
Ich finde
$brennerstatus eq "off" bzw. $brennerstatus eq "on"
deutlich verstaendlicher als
$brennerstatus == 00 bzw. $brennerstatus == 11
wobei 00 eigentlich 0 ist.

> Uebrigens habe ich bei dieser Gelegenheit noch einen Fehler gesehen,
> der ist aber schon laenger da:
>
> Use of uninitialized value in concatenation (.) or string at
> /usr/syno/synoman/webman/3rdparty/fhem/fhem.pl line 1426, <$fh> line
> 6.

Wenn das ein aktuelles (CVS) fhem.pl ist, dann wird CommandReload ohne
Parameter aufgerufen. Komisch. Das hatten wir auch schon.

borsti

unread,
Nov 2, 2011, 1:44:43 PM11/2/11
to fhem-...@googlegroups.com
> Andererseits: Wieso hier %fs20_c2b hier verwendet wird, ist mir ein Raetsel.

Das hatte ich so aus einem Muster uebernommen (ich glaube hier aus der
Gruppe), da schrieb der Autor, dass der on/off-Vergleich aus
unerfindlichen Gruenden nicht geklappt habe!?

Habe ich jetzt mal geaendert, gibt zumindest keine Fehlermeldung mehr -
danke!

Ist das gut genug fuer's WIKI? Wenn ja, wem soll ich die endgueltige
Version senden? ;)

>> Uebrigens habe ich bei dieser Gelegenheit noch einen Fehler gesehen,

> Wenn das ein aktuelles (CVS) fhem.pl ist, dann wird CommandReload ohne
> Parameter aufgerufen. Komisch. Das hatten wir auch schon.

Habe gerade die Aenderung oben eingepflegt und fuer den Test die
Loglevel erhoeht. Laut updatefhem bin ich auf dem neusten Stand.

Um 18:30 habe ich den HeizTest manuell ausgefuehrt (geht jetzt!), dann
noch eben FHEM.CFG angepasst und um 18:36 "rereadcfg" durchgefuehrt. Log:

2011.11.02 18:30:38 3: Kein Wärmebedarf (mehr). Voriger Brennerstatus: off


Use of uninitialized value in concatenation (.) or string at
/usr/syno/synoman/webman/3rdparty/fhem/fhem.pl line 1426, <$fh> line 6.

2011.11.02 18:36:14 2: FHEMWEB port 8083 opened
2011.11.02 18:36:14 2: FHEMWEB port 8084 opened
2011.11.02 18:36:14 2: FHEMWEB port 8085 opened
2011.11.02 18:36:14 3: Opening myCUNO device 192.168.1.123:2323
2011.11.02 18:36:14 3: myCUNO device opened


Use of uninitialized value in concatenation (.) or string at
/usr/syno/synoman/webman/3rdparty/fhem/fhem.pl line 1426, <$fh> line 6.

2011.11.02 18:36:18 2: FHEMWEB port 8083 opened
2011.11.02 18:36:18 2: FHEMWEB port 8084 opened
2011.11.02 18:36:18 2: FHEMWEB port 8085 opened
2011.11.02 18:36:18 3: Opening myCUNO device 192.168.1.123:2323
2011.11.02 18:36:18 3: myCUNO device opened

Gruss
Torsten


hgo

unread,
Dec 17, 2011, 1:08:05 PM12/17/11
to FHEM users
> 2011.11.02 18:30:38 3: Kein Wärmebedarf (mehr). Voriger Brennerstatus: off
> Use of uninitialized value in concatenation (.) or string at
> /usr/syno/synoman/webman/3rdparty/fhem/fhem.pl line 1426, <$fh> line 6.


Habe Dein Script in meine fhem.cfg eingepflegt. Und freu, freu, es
klappt alles so wie es soll.
Ein Test mit 6 FHT`s ergab, dass die Laufzeit des Brenners mit dem
Script erheblich von den tatsächlichen Brenner-Laufzeiten abweicht.
Das Problem ist nur, dass die Aufbereitung des Brauchwassers mit
Vorrangschaltung so ausser acht gelassen wird. Denn das Abschalten des
Brenners führt ja dazu, das auch kein Brauchwasser mehr erwärmt wird.
Hat hier jemand einen Vorschlag, besser eine Lösung ?

Im Log erfolgt bei mir ebenfalls der Hinweis:
Use of uninitialized value in concatenation (.) or string at /usr/bin/
fhem.pl line 1433, <$fh> line 3.
Gibt es hier schon eine Lösung ?

Gruss
HG

borsti

unread,
Dec 17, 2011, 2:52:16 PM12/17/11
to fhem-...@googlegroups.com
Hi,

>> 2011.11.02 18:30:38 3: Kein Wärmebedarf (mehr). Voriger Brennerstatus: off

> Das Problem ist nur, dass die Aufbereitung des Brauchwassers mit
> Vorrangschaltung so ausser acht gelassen wird. Denn das Abschalten des
> Brenners führt ja dazu, das auch kein Brauchwasser mehr erwärmt wird.

Dafür war/ist das Script auch nicht wirklich gedacht. ;)
Tatsächlich die Therme / den Brenner zu schalten ist nur sinnvoll, wenn
das Ding wirklich nichts anderes macht, was in den seltensten Fällen
gegeben sein dürfte.
Du solltest nur einen eventuell vorhandenen
Sommer-/Winterbetrieb-Schalter betätigen, der lässt das Brauchwasser
ganz normal an.

Gruss,
Torsten

Joachim

unread,
Feb 13, 2012, 11:25:12 AM2/13/12
to FHEM users
Ich habe bis jetzt nur FHTs, überlege mir aber auch den Brenner oder
die Heizungs Pumpe zu schalten.
Bei Heizungs Pumpe aus wird Brauchwasser noch erwärmt.
Eine andere Idee wäre, den Anwesenheitsstaus zu nehmen, also wenn jmd
da ist, den Brenner nicht abzuschalten.
Man braucht auch kein warmes Brauchwasser wenn niemand da ist.
Das betrifft auch meine el. beheizten Warmwasserleitungen, die
verbrauchen sicher viel.

Am Besten wäre es mit einem Temperatursensor die Speichertemperatur zu
lesen.
Damit hätte man eine bedarfsorientierte Brennersteuerung. Noch
perfekter wäre es die Vorlauftemperatur zu regeln, manche faken ja den
Temperaturfühler.

Gruss
Joachim

puschel74

unread,
Feb 13, 2012, 12:36:23 PM2/13/12
to FHEM users
Hallo zusammen,
ich benötige mal Hilfe.

Ich habe
if ($brauche_hitze != 0) {\
Log(3,"Hitze benoetigt. Wasserpumpe EIN");;\
fhem("set Wasserpumpe on") if ($Wasserpumpe_status eq "off")\

durch
if ($brauche_hitze != 0) {\
if ($Wasserpumpe_status eq "off") fhem("set Wasserpumpe on") \
Log(3,"Hitze benoetigt. Wasserpumpe EIN");;\

ersetzt weil ich dachte das dadurch die ständigen Logeinträge
Hitze benoetigt. Wasserpumpe EIN
aufhören würden.

Leider wird dann dieses notify nichtmehr ausgeführt.

Es wird alle 10 Minuten geprüft ob 1 FHT>50% und dann Wasserpumpe Ein
und wenn alle FHT<20% Wasserpumpe aus.
Das funkioniert auch mit dem ersten Code - nur "müllt" mir dieser das
Logfile alle 10 Minuten mit Hitze benoetigt. Wasserpumpe EIN voll.
Mit dem zweiten Codeschnipsel dachte ich ich kann das verhindern - nur
wird das notify damit nichtmehr ausgeführt.

Vielleicht hat von euch jemand eine Idee wie das notify ausgeführt
werden kann ohne alle 10 Minuten LogFile-Einträge zu produzieren.

Danke und Grüße

P.S.: Die Code-Schnipsel sind nur Auszüge aus dem gesamten Code der
hier und im WIKI steht.

borsti

unread,
Feb 13, 2012, 12:50:03 PM2/13/12
to fhem-...@googlegroups.com
Hi Joachim,

Am 13.02.2012 18:36, schrieb puschel74:

> if ($brauche_hitze != 0) {\
> Log(3,"Hitze benoetigt. Wasserpumpe EIN");;\
> fhem("set Wasserpumpe on") if ($Wasserpumpe_status eq "off")\
>
> durch
> if ($brauche_hitze != 0) {\
> if ($Wasserpumpe_status eq "off") fhem("set Wasserpumpe on") \

hier fehlt zumindest das abschließende ";;".

> Log(3,"Hitze benoetigt. Wasserpumpe EIN");;\
>

...aber ich glaube, Du willst eigentlich was anderes. Du hast nur die
Reihenfolge vertauscht, aber nichts an der Funktion verändert!

> Das funkioniert auch mit dem ersten Code - nur "müllt" mir dieser das
> Logfile alle 10 Minuten mit Hitze benoetigt. Wasserpumpe EIN voll.

Wenn die Meldung korrekt ist und Dich somit nicht interessiert, dann
nimm halt den Log-Eintrag raus. ;)
Oder setze den Level auf 4, dann wird es in der Standardeinstellung
nicht mehr ins globale Log geschrieben...

Vermutlich bekommst Du die Meldung aber IMMER (auch ohne Wärmebedarf).
Daher würde ich mal diese Variante anraten (unter der Voraussetzung,
dass Deine Status-Abfrage so funktioniert, die kommt mir auch suspekt
vor - ich hoffe, die hast Du getestet!):

if ($brauche_hitze != 0) {\
if ($Wasserpumpe_status eq "off") {\
fhem("set Wasserpumpe on");;\

Log(3,"Hitze benoetigt. Wasserpumpe EIN")\
}
}

Gruss
Torsten

puschel74

unread,
Feb 13, 2012, 12:55:09 PM2/13/12
to FHEM users
Danke mal für die Tipps.
Damit funktioniert alles seit 2 Monaten einwandfrei:

define n_Wasserpumpe notify n_Wasserpumpe {\
my $brauche_hitze=0;;\
my $ventile_im_leerlauf=0;;\
my $Wasserpumpe_status=
$fs20_c2b{ReadingsVal("Wasserpumpe","STATE","off")};;\
my @@fhts=devspec2array("TYPE=FHT");;\
foreach(@@fhts) {\
my $ventil=ReadingsVal($_, "actuator", "101%");;\
$ventil=(substr($ventil, 0, (length($ventil)-1)));;\
if ($ventil > 50) {\
$brauche_hitze=1\
}\
if ($ventil < 20) {\
$ventile_im_leerlauf++\
}\
}\
if ($brauche_hitze != 0) {\
Log(3,"Hitze benoetigt. Wasserpumpe EIN");;\
fhem("set Wasserpumpe on") if ($Wasserpumpe_status == 00)\
}\
else {\
if ($ventile_im_leerlauf == @@fhts) {\
Log(3,"Keine Hitze mehr benoetigt. Wasserpumpe AUS");;\
fhem("set Wasserpumpe off")\
}\
else {\
Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " von " . @@fhts . "
Stellantrieben im Leerlauf.")\
}\
}\
}

Auf dieses Notify trigger ich alle 10 Minuten.
Nur schreibt er mir alle 10 Minuten ins Logfile Wasserpumpe Ein /
Wasserpume Aus je nachdem was benötigt wird.
Ich dachte mit dem Umstellen kann ich "erzwingen" das nur noch einmal
der Logfile-Eintrag erfolgt.
Also wenn Hitze benötigt dann nur das erstemal der LogFile eintrag mit
Wasserpumpe ein und wenn keine Hitze mehr benötigt dann nur einmal
beim ersten mal eben der Eintrag mit Wasserpume Aus.
Ich hätte die LogFileEinträge schon gerne, aber nicht mit jedem
Trigger sondern nur wenn wirklich eine Änderung ist.

Peter Maier

unread,
Feb 13, 2012, 2:47:10 PM2/13/12
to FHEM users
Hallo,
wenn wir hier gerade bei FHT Heizungslösungen sind)
Hier mein Beitrag dazu.

Grundsituation hier in Russland:
Man hängt an der Zentralheizung und wird entweder mit zuviel oder
zuwenig Wärmeenergie versorgt.
Bei zuviel Wärme wird vom normalen Benutzter in der Regel das Fenster
geöffnet.
(da i.d.R. weder Regler noch Thermostat vorhanden sind)
Bei zuwenig Wärme wird eine elektrische Zusatzheizung ins Zimmer
gestellt.

Alles in allem nicht sehr komfortabel. ;)

Hier eine elegantere Lösung:
FHT80 und FS20-ST3 mit elektrischer Heizung
Sobald die Ist-Temperatur 0,5°C unter Soll-Temperatur ist und
der Actuator mehr als 90% offen ist, schaltet die Zusatzheizung ein.
Die Zusatzheizung wird nur auf eine festgelegte Zeit eingeschaltet,
falls ein unvorhergesehener Zustand eintritt, sich die Heizung somit
selbst
abschaltet.
Alle 10 min. wird geprüft, und entsprechend ein oder ausgeschaltet.

# Elecrical Heater
define 21_Electrical_heater FS20 1234 90
#attr 21_Electrical_heater alias Elektrische Heizung
#attr 21_Electrical_heater webCmd on:off:on-for-timer 600
attr 21_Electrical_heater comment FS20 ST-3
attr 21_Electrical_heater room 21_Room_I

# Temperature: Thermostat
define b1_Thermostat FHT 3129
attr b1_Thermostat IODev CUNO1
attr b1_Thermostat alias 21_Thermostat
attr b1_Thermostat comment FHT 80b
attr b1_Thermostat retrycount 3
#attr b1_Thermostat lazy
attr b1_Thermostat room 21_Room_I,10_Flat

# additional electrical heater
define eHeater_status dummy
attr eHeater_status room System_temp

define eHeater dummy
attr eHeater eventMap on:on off:off
attr eHeater room System_temp

# Function: additional electrical heater
define eHeater_on notify eHeater.on {\
fhem ("set eHeater_status 1") ;;\
fhem ("attr eHeater room 00_Information,System_temp") ;;\
Log 3, ("eHeater - Activate additional electrical heater ...") ;;
\
}
attr eHeater_on room hidden

define eHeater_off notify eHeater.off {\
fhem ("set eHeater_status 0") ;;\
fhem ("attr eHeater room System_temp") ;;\
Log 3, "eHeater - Stop additional electrical heater
activities ..." ;;\
}
attr eHeater_off room hidden


# Funktion: 22_Room_II additional electric heating system
define 22_eHeater notify 22_eHeater {\
my $dt = $defs{b2_Thermostat}{READINGS}{"desired-temp"}{VAL};;\
my $mt = $defs{b2_Thermostat}{READINGS}{"measured-temp"}{VAL};;\
$mt = (substr($mt, 0, (length($mt)-10)));;\
my $act = $defs{b2_Thermostat}{READINGS}{"actuator"}{VAL};;\
$act = (substr($act, 0, (length($act)-1)));;\
if (($mt < ($dt-0.5)) && ($act > 90) && (Value("eHeater_status") >
0 )) {\
Log 4, ("heaterLOG: 22_Room_II Temperature is LOW | $dt/$mt/
$act ");;\
fhem ("set 22_Electrical_heater on-for-timer 640");;\
fhem ("attr 22_Electrical_heater room 22_Room_II,
00_Information");;\
}\
else {\
Log 4, ("heaterLOG: 22_Room_II Temperature is $dt/$mt/$act ");;
\
fhem ("set 22_Electrical_heater off");;\
fhem ("attr 22_Electrical_heater room 22_Room_II");;\
if (($mt < ($dt-0.5)) && ($act > 60)) {\
fhem ("attr eHeater room System_temp,00_Information");;\
}\
}\
}
attr 22_eHeater room hidden

define 22_Temperature_ckeck at +*00:10:00 trigger 22_eHeater
attr 22_Temperature_ckeck room hidden
Reply all
Reply to author
Forward
0 new messages