Local thermostat offset

Begonnen von novalis, 04 November 2019, 22:14:36

Vorheriges Thema - Nächstes Thema

novalis

Hello,
what do you say to this change:


--- FHEM/10_MAX.pm.orig 2019-11-04 21:15:26.000000000 +0100
+++ FHEM/10_MAX.pm      2019-11-09 09:45:00.000000000 +0100
@@ -74,7 +74,7 @@
   $hash->{ParseFn}   = "MAX_Parse";
   $hash->{SetFn}     = "MAX_Set";
   $hash->{AttrList}  = "IODev do_not_notify:1,0 ignore:0,1 dummy:0,1 " .
-                       "showtime:1,0 keepAuto:0,1 scanTemp:0,1 ".
+                       "showtime:1,0 keepAuto:0,1 localOffset scanTemp:0,1 ".
                        $readingFnAttributes;
   $hash->{DbLog_splitFn} = "MAX_DbLog_splitFn";
   return undef;
@@ -149,8 +149,10 @@
# Print number in format "0.0", pass "on" and "off" verbatim, convert 30.5 and 4.5 to "on" and "off"
# Used for "desiredTemperature", "ecoTemperature" etc. but not "temperature"
sub
-MAX_SerializeTemperature($)
+MAX_SerializeTemperature
{
+  my $offset = 0;
+  if (2 == scalar(@_)) { $offset=$_[1]; }
   if($_[0] eq  "on" or $_[0] eq "off") {
     return $_[0];
   } elsif($_[0] == 4.5) {
@@ -158,7 +160,7 @@
   } elsif($_[0] == 30.5) {
     return "on";
   } else {
-    return sprintf("%2.1f",$_[0]);
+    return sprintf("%2.1f",$_[0]+$offset);
   }
}

@@ -691,7 +693,9 @@
     #Sometime we get an MAX_Parse MAX,1,ThermostatState,01090d,180000000000, where desiredTemperature is 0 - ignore it
     readingsBulkUpdate($shash, "desiredTemperature", MAX_SerializeTemperature($desiredTemperature)) if($desiredTemperature != 0);
     if($measuredTemperature ne "") {
-      readingsBulkUpdate($shash, "temperature", MAX_SerializeTemperature($measuredTemperature));
+      my $device = $modules{MAX}{defptr}{$addr}{NAME} if(exists($modules{MAX}{defptr}{$addr}));
+      my $localOffset=AttrVal($device,"localOffset",0.0);
+      readingsBulkUpdate($shash, "temperature", MAX_SerializeTemperature($measuredTemperature,$localOffset));
    }
     if($shash->{type} =~ /HeatingThermostatPlus/ and $hash->{TYPE} eq "MAXLAN") {
       readingsBulkUpdate($shash, "valveposition", int($valveposition*MAX_ReadingsVal($shash,"maxValveSetting")/100));
@@ -744,7 +748,9 @@
     if(defined($temperature)) {
       $temperature = ((($desiredTemperatureRaw &0x80)<<1) + $temperature)/10;  # auch Temperaturen über 25.5 °C werden angezeigt !
       Log3 $hash, 5, "desiredTemperature $desiredTemperature, temperature $temperature";
-      readingsBulkUpdate($shash, "temperature", sprintf("%2.1f",$temperature));
+      my $device = $modules{MAX}{defptr}{$addr}{NAME} if(exists($modules{MAX}{defptr}{$addr}));
+      my $localOffset=AttrVal($device,"localOffset",0.0);
+      readingsBulkUpdate($shash, "temperature", sprintf("%2.1f",$temperature+$localOffset));
     } else {
       Log3 $hash, 5, "desiredTemperature $desiredTemperature"
     }



You can only set offsets in 0.5 degree steps in thermostats, but if you know that offset is only showing 0.3C more, you can easily set

attr WallThermostatXXX localOffset -0.3


and then you can see correct temperature in graphs and use it in whole FHEM ... of course that there is still wrong temperature on the thermostat, but if you want to work with temperature in FHEM, I think it is good idea.

Do you think it is worth it adding it to official code?