Erweiterung des Overdrive Mode im HCS

Begonnen von mober, 25 Oktober 2016, 14:54:53

Vorheriges Thema - Nächstes Thema

mober

Liebe fhem-Gemeinde, lieber Martin als Entwickler des HCS-Moduls!

Ich möchte mit dem HCS-Modul die Umlaufpumpe eines Heizkreises schalten. Geheizt wird händisch mit Holz, was heißt es steht nicht immer ausreichend Wärme zur Verfügung, sodass ich die Umlaufpumpe nur anschalten möchte, wenn genügend Wärme da ist. Also überwache ich mit einem DS1820 die Vorlauftemperatur des Kreises. Unterschreitet diese Temperatur einen Schwellwert, möchte ich die Umlaufpumpe abschalten, auch wenn die Heizkörper bedarf melden würden.

Um dies zu realisieren habe ich nun das HCS etwas erweitert und das Attribut overdrivemode hinzugefügt. Ist dieses leer oder "overdrive", so funktioniert der overdrive wie bisher. Steht darin aber "suppress", arbeitet der overdrive so, dass wenn am Sensor die ThresholdOff Temperatur unterschritten wird das zu schaltende Device abgeschaltet wird. Ein Überschreiten der ThresholdOn Temperatur würde die Umlaufpumpe anschalten, was mit enstprechend hohem Schwellwert quasi deaktiviert wird.

Mein Patch:

--- /usr/share/fhem/FHEM/59_HCS.pm      2016-10-25 14:44:37.720411490 +0200
+++ /tmp/59_HCS.pm      2016-10-25 14:43:56.480824810 +0200
@@ -85,6 +85,7 @@
     idleperiod
     interval
     mode:thermostat,valve
+    overdrivemode
     sensor
     sensorReading
     sensorThresholdOff
@@ -708,6 +709,7 @@

   # overdrive mode
   my $overdrive    = "no";
+  my $overdrivemode= AttrVal($name,"overdrivemode","overdrive");
   my $sensor       = AttrVal($name,"sensor",undef);
   my $sReading     = AttrVal($name,"sensorReading",undef);
   my $sTresholdOn  = AttrVal($name,"sensorThresholdOn",undef);
@@ -731,8 +733,15 @@
         Log3 $name, 1, "$type $name Device $sensor has no valid value.";
       } else {
         $tValue =~ s/(\s|°|[A-Z]|[a-z])+//g;
-        $heatDemand = 4 if($tValue >= $sTresholdOff);
-        $heatDemand = 5 if($tValue <= $sTresholdOn);
+        if($overdrivemode eq "overdrive") {
+          $heatDemand = 4 if($tValue >= $sTresholdOff);
+          $heatDemand = 5 if($tValue <= $sTresholdOn);
+       } elsif($overdrivemode eq "suppress") {
+          $heatDemand = 4 if($tValue <= $sTresholdOff);
+          $heatDemand = 5 if($tValue >= $sTresholdOn);
+       } else {
+         Log3 $name, 1, "$type $name invalid attribute 'overdrivemode'. Set to 'overdrive' or 'suppress'."
+       }
         $overdrive  = "yes" if($heatDemand == 4 || $heatDemand == 5);
         readingsSingleUpdate($hash,"sensor",$tValue,1);
       }
@@ -917,6 +926,16 @@
         <code>valve</code> controls the heating demand by defined valve position thresholds.<br>
         Default value: <code>thermostat</code>
     </li>
+    <li><code>overdrivemode</code> (optional, defaults to overdrive if empty)<br>
+        defines the operational mode of the overdrive mode:<br>
+        <code>overdrive</code>Activates the defined device if temperature of <code>sensor</code>
+        is below <code>sensorThresholdOn</code>, deactivates the device if the temperature is
+        above <code>sensorThresholdOff</code>.<br>
+        <code>suppress</code>Deactivates the defined device if temperature of <code>sensor</code>
+        is below <code>sensorThresholdOff</code>, activates the device if the temperature is
+        above <code>sensorThresholdOn</code>.<br>
+        Default value: <code>overdrive</code>
+    </li>
     <li><code>sensor</code> (optional)<br>
         device name of the temp-sensor
     </li>


Wie seht ihr das? Sinnvolle Erweiterung? Habe ich irgendwo Fehler drin?

P.S.: Genereller Aufbau
Zwei Heizkreise, jeder schaltet mit HCS seine Umlaufpumpe und ignoriert per exclude die Thermostate des anderen Kreises.
Ein drittes HCS überwacht alle Thermostate und per overdrive die Warmwassertemperatur, um anzuzeigen wann es wieder Zeit ist den Holzofen einzuheizen.

Grüße,
Max