FHT-Boost die dritte - deluxe Version

Begonnen von broadway, 18 November 2013, 18:13:05

Vorheriges Thema - Nächstes Thema

broadway

Hallo zusammen,

ich poste jetzt mal meine aktuellste Boost Version für FHTs. Diese baut auf diesen Beiträgen auf:
- http://forum.fhem.de/index.php/topic,8624.msg44694.html#msg44694
- http://forum.fhem.de/index.php/topic,9999.msg55785.html#msg55785

Es gibt auch noch was im Wiki, sucht euch das für euch passende raus. Das besondere an dieser Version ist ein zeitlich begrenzter "Comfort-Boost" wie er auf manchen Energiesparreglern zu finden ist.

Diese Version:
- Für jedes FHT wird ein Notify, ein dummy Status und ein dummy Zieltemp benötigt.
- Das notify lauscht auf desired-temp (also Sollwert) und measured-temp (also Istwert).
- Wenn die Differenz (Soll - Ist) > 1,5 °C ist, wird der Boost eingeschaltet. Die vom Nutzer eingestellte Temperatur wird im dummy Zieltemp zwischengespeichert.
- Wenn die Differenz < 1°C ist wird der Boost abgeschaltet. Der Wert aus Zieltemp wird an das FHT gesendet.
- Eine Änderung der Solltemperatur während des aktiven Boosts beendet diesen [(Soll-Ist)<1] oder läuft bis zur neu eingestellten Zieltemperatur.
- NEU: Wird eine Temperatur von 30.0°C eingestellt, wird das Ventil für 10 min voll aufgedreht ("Comfort-Boost"). Danach wird der vorherige Sollwert weiterverwendet.
- Die Schaltdifferenzen und die Dauer des Comfort-Boost sind in den ersten Zeilen leicht anzupassen

# Boostfunktion zum schnellen Aufheizen
# Wenn Sollwert geäandert und Differenz > 1.5 -> Boost an
# Wenn Differenz < 1 -> Boost aus
# Einstellung 30.0°C Ventile voll auf für 10 min.
define Bad_Boost_Notify notify FHT_Bad.* {\
my $boostStart = 1.5;;\
my $boostStop = 1;;\
my $timeComfortBoost = "00:10:00";;\
\
my ($param,$value) = split(": ", "%");;\
my $target=Value("Bad_Boost_Zieltemp");;\
\
if("$param" eq "desired-temp"){\
   if($value lt 30.0){\
       fhem "set Bad_Boost_Zieltemp $value";;\
       if(Value("Bad_Boost_Status") eq "on-for-timer"){\
           fhem "delete Bad.Boost.Comfort;;set Bad_Boost_Status off";;\
           }\
       my $ist=ReadingsVal("FHT_Bad", "measured-temp", 0);;\
       if((($value-$ist) gt $boostStart) && (Value("Bad_Boost_Status") ne "on")){\
           fhem "set FHT_Bad desired-temp on";;\
           fhem "set Bad_Boost_Status on";;\
           }\
       if((($value-$ist) lt $boostStop) && (Value("Bad_Boost_Status") eq "on")){\
           fhem "set Bad_Boost_Status off";;\
           }\
   }\
   else{\
       if((Value("Bad_Boost_Status") ne "on-for-timer") && ($value ne "on")){\
           fhem "set Bad_Boost_Status on-for-timer";;\
           fhem "define Bad.Boost.Comfort at +$timeComfortBoost set FHT_Bad desired-temp $target;;;;set Bad_Boost_Status off;;attr Bad.Boost.Comfort room Bad";;\
           }\
   }\
}\
\
elsif(("$param" eq "measured-temp") && (Value("Bad_Boost_Status") eq "on")){\
   if(($target-$value) lt $boostStop){\
       fhem "set FHT_Bad desired-temp $target";;\
       fhem "set Bad_Boost_Status off";;\
       }\
}\
}

# Status speichert ob Boost an oder aus
define Bad_Boost_Status dummy
attr Bad_Boost_Status loglevel 4

# Zielsollwert merken
define Bad_Boost_Zieltemp dummy
attr Bad_Boost_Zieltemp loglevel 6



(http://i.imgur.com/3OvIjPs.jpg)
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

Puschel74

Hallo,

genial - ab ins Wiki damit  :D

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

OiledAmoeba

Moin,

bei mir schreibt addLog auch die desired-temp. Dann knallts aber mit dem Booster...
Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

OiledAmoeba

Und noch ein Problem: Setze ich den FHT auf on oder off löst das den Comfort Boost aus.

Da der eine FHT Probleme mit den Fenstersensoren hat, lasse ich den über FHEM umschalten. Bei Fenster auf sendet FHEM desired-temp 8.0, aber leider reagiert auch hier der Comfort Boost drauf und schickt nach 10 Minuten die alte Temperatur an den FHT.

Any ideas?

Gesendet von meinem GT-I9100 mit Tapatalk

Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

OiledAmoeba

Um dem Problem mit addLog zu begegnen, schlage ich folgende Codeänderung vor:

@@ -10 +10,7 @@
- my ($param,$value) = split(": ", "%");;\
+ my ($param,$addLogvalue) = split(": ", "%");;\
+ my ($value,$dummy);;\
+ if (index($addLogvalue,"<<"!=-1) {\
+    ($value,$dummy)=split(" <<",$addLogvalue);;\
+ } else {\
+ $value = $addLogvalue;;\
+ }\
Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

OiledAmoeba

Absichtlich nicht "ändern" geklickt, da ich hier was anderes mit eingebaut habe.

Bei mir hat der Comfort-Boost immer ausgelöst, wenn eine Temperaturänderung von mehr als 1,5° erkannt wurde. Leider auch beim Absenken der Temp -> Nach 10 Minuten wurde die neue abgesenkte Temperatur mit der alten Temperatur überschrieben.
Ich wollte es erst lassen, aber das hat mir die Kommunikation zerschossen, als fünf Thermostate gleichzeitig während "window:open" ein "desired-temp: 8.0" geschickt haben.
Das gab ein nettes hin und her zwischen Booster und FHT. FHT hat gesenkt mitgeteilt, nach 10 Minuten hat der Booster wieder die alte Temp geschrieben, FHT hat wieder gemeldet, gesenkt zu haben, usw... Irgendwann ist dann die FHZ ausgestiegen...

Die Ventile haben im Comfort-Boost-Modus nicht komplett geöffnet, sondern nur wie für 30° benötigt.

In meiner jetzigen Überarbeitung (@broadway: Ich hoffe, ich durfte das, hab vergessen dich zu fragen...) werden die Values als Zahlen statt Text behandelt. So kann ich genau das erreichen, was ich erreichen will:
- Comfort-Boost nur dann, wenn desired 30° (zusätzlich "desired-temp: on" an das FHT)
- Boost nur dann, wenn desired 1,5° größer als measured
- keine Boosts, wenn desired gesenkt wird
- ein Sprung von "off" auf eine andere desired-temp löst bei Bedarf den Booster aus
- "desired-temp: on" wird vom Code ignoriert


diff U ./FHT-Boost.pm ./FHT-Boost-new.pm
--- ./FHT-Boost.pm Mon Dec 23 09:32:58 2013
+++ ./FHT-Boost-new.pm Mon Dec 23 11:32:22 2013
@@ -10,2 +10,11 @@
- my ($param,$value) = split(": ", "%");;\
- my $target=Value("Bad_Boost_Zieltemp");;\
+ my ($param,$addLogvalue) = split(": ", "%");;\
+ my ($value,$dummy);;\
+ if (index($addLogvalue,"<<")!=-1) {\
+    ($value,$dummy)=split(" <<",$addLogvalue);;\
+    } else {\
+    $value = $addLogvalue;;\
+    }\
+ $value = 5.5 if ($value eq "off");;\
+ $value = 30.5 if ($value eq "on");;\ 
+ $value *= 1;;\
+ my $target=Value("Bad_Boost_Zieltemp")*1;;\
@@ -14 +23 @@
-   if($value lt 30.0){\
+   if($value < 30.0){\
@@ -20 +29 @@
-       if((($value-$ist) gt $boostStart) && (Value("Bad_Boost_Status") ne "on")){\
+       if((($value-$ist) > $boostStart) && (Value("Bad_Boost_Status") ne "on")){\
@@ -24 +33 @@
-       if((($value-$ist) lt $boostStop) && (Value("Bad_Boost_Status") eq "on")){\
+       if((($value-$ist) < $boostStop) && (Value("Bad_Boost_Status") eq "on")){\
@@ -29 +38 @@
-       if((Value("Bad_Boost_Status") ne "on-for-timer") && ($value ne "on")){\
+       if((Value("Bad_Boost_Status") ne "on-for-timer") && ($value != 30.5)){\
@@ -31 +40,2 @@
-           fhem "define Bad.Boost.Comfort at +$timeComfortBoost set FHT_Bad desired-temp $target;;;;set Bad_Boost_Status off;;attr Bad.Boost.Comfort room Bad";;\
+    fhem "set FHT_Bad desired-temp on";;\
+           fhem "define Bad.Boost.Comfort at +$timeComfortBoost set FHT_Bad desired-temp $target;;set Bad_Boost_Status off;attr Bad.Boost.Comfort room Bad";;\
@@ -37 +47 @@
-   if(($target-$value) lt $boostStop){\
+   if(($target-$value) < $boostStop){\

Änderungen am Code: Die im vorigen Post eingebaute "addLog-Lösung", behandeln von Zahlenwerten als Zahl und Vergleichsoperatoren von Textvergleich auf Zahlenvergleich geändert.
Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

RoqueNublo

Hallo zusammen,

ich poste hier mal die ins Perl portierte Version der ,,FHT-Boost die dritte - deluxe Version"  von Broadway. Anlaß meines Handels war nicht die Veränderung dieser genialen Idee/Routine sondern lediglich der Gedanke, die von Broadway erarbeitete Lösung in eine perl Subroutine zu verpacken um die Redundanz in der fhem.cfg etwas einzudämmen.

Gruß Roque

#########################################################################################
# Boostfunktion zum schnellen Aufheizen (FHT-Boost die dritte - deluxe Version)
# 23 Dezember 2013, 11:57:23; Script-Version von Broadway
# Wenn Sollwert geändert und Differenz > 1.5 -> Boost an
# Wenn Differenz < 1 -> Boost aus
# Einstellung 30.0°C Ventile voll auf für 10 min.
#
# 05 Februar 2014; Perl-Routine für z.B. die 99_myUtils.pm von RoqueNublo
# Aufruf Beispiel:
# define Bad_Boost_Notify notify FHT_Bad {FHT_Boost("%EVENT","Bad","1.5","1","00:10:00")}
# Status speichert ob Boost an oder aus
#
# define Bad_Boost_Status dummy                 # Status speichert ob Boost an oder aus
# attr Bad_Boost_Status room FHT
#
# define Bad_Boost_Zieltemp dummy               # Zielsollwert merken
# attr Bad_Boost_Zieltemp room FHT
#
#########################################################################################
sub FHT_Boost ($$$$$) {
   my ($parameter, $device, $boostStart, $boostStop, $timeComfortBoost) = @_;
   my ($param,$value) = split(": ", "$parameter");                 
   if (($param eq "desired-temp") || ($param eq "measured-temp")){
                       
      my $boostzieltemp=$device."_Boost_Zieltemp";                               
      my $target=Value("$boostzieltemp");                                   
   
      my $booststatus=$device."_Boost_Status";                                   
      my $status=Value($booststatus);                                       
                                                                         
      my $fhttemp="FHT_$device";

      if ($param eq "desired-temp"){                                           # desired-temp - Solltemperatur
         if ($value lt "30.0"){
            fhem ("set $boostzieltemp $value");
            if ($status eq "on-for-timer"){                                    # Bad_Boost_Status
               fhem ("delete $device.Boost.Comfort;;set $booststatus off");
            }
            my $ist=ReadingsVal("FHT_$device", "measured-temp", 0);            # measured-temp - Messtemperatur ermitteln
            if ((($value-$ist) gt $boostStart) && ($status ne "on")){
               fhem ("set FHT_$device desired-temp on");
               fhem ("set $booststatus on");
            }
            if ((($value-$ist) lt $boostStop) && ($status eq "on")){
               fhem ("set $booststatus off");
            }
         }
         else{
             if (($status ne "on-for-timer") && ($value ne "on")){
                fhem ("set $booststatus on-for-timer");
                my $fhttemp="FHT_$device";                                   
                fhem ("define $device.Boost.Comfort at +$timeComfortBoost set $fhttemp desired-temp $target;; set $booststatus off;; attr $device.Boost.Comfort room $device");
             }
         }
      }
      elsif (($param eq "measured-temp") && ($status eq "on")){                 # measured-temp - Messtemperatur
            if (($target-$value) lt $boostStop){
               fhem ("set FHT_$device desired-temp $target");
               fhem ("set $booststatus off");
            }
      }
   }
}

Steeeve

Hi!
Endlich auch mal den Boost aktiviert und angepasst, weil ja nicht jeder FHT_ als Präfix beim Devicenamen hat.
Daher muss bei mir der ganze Devicename übergeben werden:
#########################################################################################
# Boostfunktion zum schnellen Aufheizen (FHT-Boost die dritte - deluxe Version)
# 03. November 2014, 11:57:23; Script-Version von Broadway, angepasst von Steeeve
# Wenn Sollwert geändert und Differenz > 1.5 -> Boost an
# Wenn Differenz < 1 -> Boost aus
# Einstellung 30.0°C Ventile voll auf für 10 min.
#
# 05 Februar 2014; Perl-Routine für z.B. die 99_myUtils.pm von RoqueNublo
# Aufruf Beispiel:
# define Bad_Boost_Notify notify FHT_Bad {FHT_Boost("%EVENT","FHT_Bad","1.5","1","00:10:00")}
# Status speichert ob Boost an oder aus
#
# define FHT_Bad_Boost_Status dummy                 # Status speichert ob Boost an oder aus
# attr FHT_Bad_Boost_Status room FHT
#
# define FHT_Bad_Boost_Zieltemp dummy               # Zielsollwert merken
# attr FHT_Bad_Boost_Zieltemp room FHT
#
#########################################################################################
sub FHT_Boost ($$$$$) {
   my ($parameter, $device, $boostStart, $boostStop, $timeComfortBoost) = @_;
   my ($param,$value) = split(": ", "$parameter");                 
   if (($param eq "desired-temp") || ($param eq "measured-temp")){
                       
      my $boostzieltemp=$device."_Boost_Zieltemp";                               
      my $target=Value("$boostzieltemp");                                   
   
      my $booststatus=$device."_Boost_Status";                                   
      my $status=Value($booststatus);                                       
                                                                         
      my $fhttemp="$device";

      if ($param eq "desired-temp"){                                           # desired-temp - Solltemperatur
         if ($value lt "30.0"){
            fhem ("set $boostzieltemp $value");
            if ($status eq "on-for-timer"){                                    # Bad_Boost_Status
               fhem ("delete $device.Boost.Comfort;;set $booststatus off");
            }
            my $ist=ReadingsVal("$device", "measured-temp", 0);            # measured-temp - Messtemperatur ermitteln
            if ((($value-$ist) gt $boostStart) && ($status ne "on")){
               fhem ("set $device desired-temp on");
               fhem ("set $booststatus on");
            }
            if ((($value-$ist) lt $boostStop) && ($status eq "on")){
               fhem ("set $booststatus off");
            }
         }
         else{
             if (($status ne "on-for-timer") && ($value ne "on")){
                fhem ("set $booststatus on-for-timer");
                my $fhttemp="$device";                                   
                fhem ("define $device.Boost.Comfort at +$timeComfortBoost set $fhttemp desired-temp $target;; set $booststatus off;; attr $device.Boost.Comfort room $device");
             }
         }
      }
      elsif (($param eq "measured-temp") && ($status eq "on")){                 # measured-temp - Messtemperatur
            if (($target-$value) lt $boostStop){
               fhem ("set $device desired-temp $target");
               fhem ("set $booststatus off");
            }
      }
   }
}


Funktioniert, nur schreibts mir das ins log:

2014.11.03 15:12:52 1: PERL WARNING: Argument "on" isn't numeric in sprintf at (eval 169006) line 1, <$tmpl> line 923.
2014.11.03 15:13:52 1: PERL WARNING: Argument "on" isn't numeric in sprintf at (eval 169056) line 1, <$tmpl> line 923.
2014.11.03 15:14:52 1: PERL WARNING: Argument "on" isn't numeric in sprintf at (eval 169110) line 1, <$tmpl> line 923.


Gruß
Steeeve

ErzGabriel

Hi.
Hoffe, hier schaut noch jemand rein.
Der Boost funktioniert bestens. Habe nur noch ne Frage dazu.
Wie kann ich da einen Abschalter einbauen, wenn ich den Boost mal nicht benötige.

broadway

Hallo,
war länger nicht hier. Du kannst doch einfach das Boost-Notify mittels

attr BoostBadezimmer disable 1

deaktivieren!
Grüße.
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

zernima

Hallo,
bei mir funktioniert der Boost irgendwie nicht mehr. Gab es in Fhem Veränderungen die dazu geführt haben könnten?
Es sieht so aus als ob was nicht richtig übergeben wird.

Gruß zerni