Anlage stumi75: Unterschied zwischen den Versionen

Aus Aquarea Club
Zur Navigation springen Zur Suche springen
 
(15 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 117: Zeile 117:
 
Die Heizkurze bestimmt anhand der Aussentemperatur den Vorlauf und somit den Energieeintrag - wenn dieser passend nachgeführt wird, bleibt die Temperatur im Haus konstant.
 
Die Heizkurze bestimmt anhand der Aussentemperatur den Vorlauf und somit den Energieeintrag - wenn dieser passend nachgeführt wird, bleibt die Temperatur im Haus konstant.
  
Die Heishamon Rules  
+
Die Heishamon Rules
* kümmern sich um das Eindrosseln der Jeisha per Flüstermodus und Laufzeitverlängerung per Vorlauftemperaturverschiebung (timer11)
+
* schalten die Warmwasserbereitung um 13 Uhr ein, setzen anhand der Außentemperatur das Warmwasserziel, schalten bei warmen Temperaturen in der Nacht die WP komplett aus und drosseln die Wasserpumpenleistung in der Nacht (timer10)
* schalten nach der Warmwasserbereitung um 13 Uhr direkt wieder auf Heizen um und setzen das Warmwasserziel anhand der Außentemperatur (timer12)
+
* schalten beim Ende der Warmwasserbereitung wieder zurück auf Heizbetrieb ohne den Kompressorlauf zu unterbrechen (on @DHW_Power_Consumption)
* schalten bei warmen Temperaturen die WP in der Nacht komplett aus (timer13)
+
* kümmern sich um das Eindrosseln der Jeisha per Flüstermodus und Laufzeitverlängerung per Vorlauftemperaturverschiebung (on @Main_Outlet_Temp und on @Main_Target_Temp)
  
 
Alles andere macht die Jeisha Steuerung.
 
Alles andere macht die Jeisha Steuerung.
Zeile 129: Zeile 129:
  
 
=== Heishamon Rules ===
 
=== Heishamon Rules ===
 +
 +
===== Mit Kommentaren: =====
 +
 +
Die Kommentare müssen vor dem Hochladen in HeishaMon entfernt werden, z.B. mit https://pypi.org/project/heishamon-rules-minify/
 +
 
<pre>
 
<pre>
 
on System#Boot then
 
on System#Boot then
 +
-- Variables to remember state before DHW production starts(with sane defaults)
 
   #stateBeforeDHW = 1;
 
   #stateBeforeDHW = 1;
 
   #opModeBeforeDHW = 0;
 
   #opModeBeforeDHW = 0;
 
   #targetLowBeforeDHW = 32;
 
   #targetLowBeforeDHW = 32;
 
   #targetHighBeforeDHW = 40;
 
   #targetHighBeforeDHW = 40;
 +
-- Turning the heatpump off at night: 0: funtionality deactivated, 1: active, 2: heatpump should go off
 
   #offAtNight = 1;
 
   #offAtNight = 1;
   setTimer(10, 35);
+
   setTimer(10, 40);
  setTimer(11, 41);
 
  setTimer(12, 42);
 
 
end
 
end
  
 +
-- Time based actions are living here
 
on timer=10 then
 
on timer=10 then
   #targetLowBeforeDHW = @Z1_Heat_Curve_Target_Low_Temp;
+
   setTimer(10, 30);
  #targetHighBeforeDHW = @Z1_Heat_Curve_Target_High_Temp;
+
  $hour = %hour;
 +
  $minute = %minute;
 +
  if $hour == 6 && $minute == 0 then
 +
-- Increase volume flow on cold days to increase COP
 +
      if @Outside_Temp < 12 then
 +
        @SetMaxPumpDuty = 150;
 +
      end
 +
-- Heatpump was off during the night -> turn on again
 +
      if #offAtNight == 2 && @Heatpump_State == 0 then
 +
        #offAtNight = 1;
 +
        @SetHeatpump = 1;
 +
      end
 +
  end
 +
-- Start DHW production with warmest outside temperature (-> better COP) and high probability of PV power
 +
  if %hour == 13 && %minute == 00 && @Operating_Mode_State < 3 then
 +
-- Remember state
 +
      #stateBeforeDHW = @Heatpump_State;
 +
      #opModeBeforeDHW = @Operating_Mode_State;
 +
      #targetLowBeforeDHW = @Z1_Heat_Curve_Target_Low_Temp;
 +
      #targetHighBeforeDHW = @Z1_Heat_Curve_Target_High_Temp;
 +
-- Calculate DHW target temperature from outdoor temperature
 +
      $minDHWTarget = 42;
 +
      $minOutside = 10;
 +
      $maxDHWTarget = 50;
 +
      $maxOutside = 25;
 +
      $newDHWTarget = round($minDHWTarget + ((@Outside_Temp - $minOutside ) * ($maxDHWTarget - $minDHWTarget) / ($maxOutside - $minOutside)));
 +
      if @Outside_Temp <= $minOutside then
 +
        $newDHWTarget = $minDHWTarget;
 +
      end
 +
      if @Outside_Temp >= $maxOutside then
 +
        $newDHWTarget = $maxDHWTarget;
 +
      end
 +
-- Only set new DHW target in case it changed (increase EEPROM life time)
 +
      if @DHW_Target_Temp != $newDHWTarget then
 +
        @SetDHWTemp = $newDHWTarget;
 +
      end
 +
      @SetOperationMode = 4;
 +
      @SetHeatpump = 1;
 +
-- Set curve to be used directly after DHW production ends to keep the compressor running.
 +
      @SetCurves = '{zone1:{heat:{target:{high:60,low:60}}}}';
 +
  end
 +
-- Check if the heatpump can be turned off at night
 +
  if $hour == 18 && $minute == 0 && #offAtNight == 1 && @Heatpump_State == 1 && @Outside_Temp > 7 && @Room_Thermostat_Temp > 22 then
 +
      #offAtNight = 2;
 +
  end
 +
-- Reduce volume flow at night to keep radiators quiet and propably turn off heatpump
 +
  if $hour == 20 && $minute == 0 then
 +
      @SetMaxPumpDuty = 105;
 +
      if #offAtNight == 2 && @Heatpump_State == 1 then 
 +
        @SetHeatpump = 0;
 +
      end
 +
  end
 
end
 
end
  
on timer=11 then
+
on @DHW_Power_Consumption then
  setTimer(11, 30);
+
-- On each change of DHW power change check if the heatpump is finished with DHW production
  $minDHWTarget = 42;
+
   if @Operating_Mode_State >= 3 && @DHW_Temp >= @DHW_Target_Temp && @DHW_Power_Consumption == 0 && @Heatpump_State == 1 then
  $minOutside = 10;
+
-- Turn off DHW to switch the 3-way valve back to room heating to help keep the heat in the tank
  $maxDHWTarget = 50;
 
  $maxOutside = 25;
 
  $newDHWTarget = round($minDHWTarget + ((@Outside_Temp - $minOutside ) * ($maxDHWTarget - $minDHWTarget) / ($maxOutside - $minOutside)));
 
  if @Outside_Temp <= $minOutside then
 
      $newDHWTarget = $minDHWTarget;
 
  end
 
  if @Outside_Temp >= $maxOutside then
 
      $newDHWTarget = $maxDHWTarget;
 
  end
 
   if @Operating_Mode_State >= 3 && @DHW_Temp > @DHW_Target_Temp && @DHW_Power_Consumption == 0 then
 
      $opModeState = @Operating_Mode_State;
 
  $dHWTemp = @DHW_Temp;
 
  $dHWTargetTemp = @DHW_Target_Temp;
 
  $dHWPowerConsumption = @DHW_Power_Consumption;
 
      $SetHeatpump = #stateBeforeDHW;
 
 
       @SetOperationMode = #opModeBeforeDHW;
 
       @SetOperationMode = #opModeBeforeDHW;
 +
-- During summertime the heatpump is off - so probably turn it off again
 +
      @SetHeatpump = #stateBeforeDHW;
 +
-- When heating slowly bring the heat curve back from 60 to what it was before to keep the compressor running
 
       setTimer(20, 210);
 
       setTimer(20, 210);
 
       setTimer(21, 330);
 
       setTimer(21, 330);
 
       setTimer(22, 480);
 
       setTimer(22, 480);
  elseif @Operating_Mode_State < 3 then
 
      $opModeState = @Operating_Mode_State;
 
      #stateBeforeDHW = @Heatpump_State;
 
      #opModeBeforeDHW = @Operating_Mode_State;
 
      if %hour == 13 && %minute == 00 then
 
        if @DHW_Target_Temp != $newDHWTarget then
 
            @SetDHWTemp = $newDHWTarget;
 
        end
 
        #targetLowBeforeDHW = @Z1_Heat_Curve_Target_Low_Temp;
 
        #targetHighBeforeDHW = @Z1_Heat_Curve_Target_High_Temp;
 
        @SetOperationMode = 4;
 
        @SetHeatpump = 1;
 
        @SetCurves = '{zone1:{heat:{target:{high:60,low:60}}}}';
 
      end
 
 
   end
 
   end
 
end
 
end
 
 
on timer=20 then
 
on timer=20 then
 
   @SetCurves = concat('{zone1:{heat:{target:{high:', #targetHighBeforeDHW ,',low:', #targetHighBeforeDHW ,'}}}}');
 
   @SetCurves = concat('{zone1:{heat:{target:{high:', #targetHighBeforeDHW ,',low:', #targetHighBeforeDHW ,'}}}}');
Zeile 197: Zeile 227:
 
end
 
end
  
on timer=12 then
+
-- Throttle the heatpump if required to keep the compressor running
   setTimer(12, 30);
+
-- If the delta between target and actual outlet is bigger than 2 the heatpump turns off
 +
on @Main_Outlet_Temp then
 +
  calcThrottle();
 +
end
 +
on @Main_Target_Temp then
 +
  calcThrottle();
 +
end
 +
on calcThrottle then
 +
-- If calculated while off the heatpump might turn on the next day because #offAtNight can become 2
 +
  if @Heatpump_State == 1 then
 +
      $newQuietMode = 0;
 +
-- @Z1_Heat_Request_Temp modifies @Main_Target_Temp so take it into account
 +
      $outletDelta = @Main_Outlet_Temp - ( @Main_Target_Temp - @Z1_Heat_Request_Temp );
 +
      $newHeatRequest = floor( $outletDelta ) - 1;
 +
-- Set quiet mode based on outdoor temperature
 +
      if @Outside_Temp >= 5 then
 +
        $newQuietMode = 2;
 +
      end
 +
      if @Outside_Temp >= 8 then
 +
        $newQuietMode = 3;
 +
      end
 +
-- When catching up to the target temperature do not activate quiet mode (-> better COP)
 +
      if $outletDelta < 0 then
 +
        $newQuietMode = 0;
 +
      end
 +
-- No negative heat request adjustment
 +
      if $newHeatRequest < 0 then
 +
        $newHeatRequest = 0;
 +
      end
 +
-- If the heat is not taken anymore and the heat request adjustment maximum is reached turn the headpump off at night
 +
      if $newHeatRequest > 5 then
 +
        $newHeatRequest = 5;
 +
        if #offAtNight == 1 then
 +
            #offAtNight = 2;
 +
        end
 +
      end
 +
-- Only set new values in case they changed (increase EEPROM life time)
 +
      if @Quiet_Mode_Level != $newQuietMode then
 +
        @SetQuietMode = $newQuietMode;
 +
      end
 +
      if @Z1_Heat_Request_Temp != $newHeatRequest then
 +
        @SetZ1HeatRequestTemperature = $newHeatRequest;
 +
      end
 +
  end
 +
end
 +
</pre>
 +
 
 +
===== Für HeishaMon zum Hochladen =====
 +
<div class="mw-collapsible mw-collapsed article-table">
 +
<pre>
 +
on System#Boot then
 +
  #stateBeforeDHW = 1;
 +
  #opModeBeforeDHW = 0;
 +
  #targetLowBeforeDHW = 32;
 +
  #targetHighBeforeDHW = 40;
 +
  #offAtNight = 1;
 +
  setTimer(10, 40);
 +
end
 +
 
 +
on timer=10 then
 +
   setTimer(10, 30);
 
   $hour = %hour;
 
   $hour = %hour;
 
   $minute = %minute;
 
   $minute = %minute;
Zeile 209: Zeile 299:
 
         @SetHeatpump = 1;
 
         @SetHeatpump = 1;
 
       end
 
       end
 +
  end
 +
  if %hour == 13 && %minute == 00 && @Operating_Mode_State < 3 then
 +
      #stateBeforeDHW = @Heatpump_State;
 +
      #opModeBeforeDHW = @Operating_Mode_State;
 +
      #targetLowBeforeDHW = @Z1_Heat_Curve_Target_Low_Temp;
 +
      #targetHighBeforeDHW = @Z1_Heat_Curve_Target_High_Temp;
 +
      $minDHWTarget = 42;
 +
      $minOutside = 10;
 +
      $maxDHWTarget = 50;
 +
      $maxOutside = 25;
 +
      $newDHWTarget = round($minDHWTarget + ((@Outside_Temp - $minOutside ) * ($maxDHWTarget - $minDHWTarget) / ($maxOutside - $minOutside)));
 +
      if @Outside_Temp <= $minOutside then
 +
        $newDHWTarget = $minDHWTarget;
 +
      end
 +
      if @Outside_Temp >= $maxOutside then
 +
        $newDHWTarget = $maxDHWTarget;
 +
      end
 +
      if @DHW_Target_Temp != $newDHWTarget then
 +
        @SetDHWTemp = $newDHWTarget;
 +
      end
 +
      @SetOperationMode = 4;
 +
      @SetHeatpump = 1;
 +
      @SetCurves = '{zone1:{heat:{target:{high:60,low:60}}}}';
 
   end
 
   end
 
   if $hour == 18 && $minute == 0 && #offAtNight == 1 && @Heatpump_State == 1 && @Outside_Temp > 7 && @Room_Thermostat_Temp > 22 then
 
   if $hour == 18 && $minute == 0 && #offAtNight == 1 && @Heatpump_State == 1 && @Outside_Temp > 7 && @Room_Thermostat_Temp > 22 then
Zeile 219: Zeile 332:
 
       end
 
       end
 
   end
 
   end
 +
end
 +
 +
on @DHW_Power_Consumption then
 +
  if @Operating_Mode_State >= 3 && @DHW_Temp >= @DHW_Target_Temp && @DHW_Power_Consumption == 0 && @Heatpump_State == 1 then
 +
      @SetOperationMode = #opModeBeforeDHW;
 +
      @SetHeatpump = #stateBeforeDHW;
 +
      setTimer(20, 210);
 +
      setTimer(21, 330);
 +
      setTimer(22, 480);
 +
  end
 +
end
 +
on timer=20 then
 +
  @SetCurves = concat('{zone1:{heat:{target:{high:', #targetHighBeforeDHW ,',low:', #targetHighBeforeDHW ,'}}}}');
 +
end
 +
on timer=21 then
 +
  $targetInBetween = (#targetHighBeforeDHW - #targetLowBeforeDHW) / 2 + #targetLowBeforeDHW;
 +
  @SetCurves = concat('{zone1:{heat:{target:{low:', $targetInBetween ,'}}}}');
 +
end
 +
on timer=22 then
 +
  @SetCurves = concat('{zone1:{heat:{target:{low:', #targetLowBeforeDHW ,'}}}}');
 
end
 
end
  
Zeile 224: Zeile 357:
 
   calcThrottle();
 
   calcThrottle();
 
end
 
end
 
 
on @Main_Target_Temp then
 
on @Main_Target_Temp then
 
   calcThrottle();
 
   calcThrottle();
 
end
 
end
 
 
on calcThrottle then
 
on calcThrottle then
  $newQuietMode = 0;
+
   if @Heatpump_State == 1 then
  $outletDelta = @Main_Outlet_Temp - ( @Main_Target_Temp - @Z1_Heat_Request_Temp );
 
  $newHeatRequest = floor( $outletDelta ) - 1;
 
   if @Outside_Temp >= 5 then
 
    $newQuietMode = 2;
 
  end
 
  if @Outside_Temp >= 8 then
 
      $newQuietMode = 3;
 
  end
 
  if $outletDelta < 0 then
 
 
       $newQuietMode = 0;
 
       $newQuietMode = 0;
  end
+
      $outletDelta = @Main_Outlet_Temp - ( @Main_Target_Temp - @Z1_Heat_Request_Temp );
  if $newHeatRequest < 0 then
+
      $newHeatRequest = floor( $outletDelta ) - 1;
      $newHeatRequest = 0;
+
      if @Outside_Temp >= 5 then
  end
+
        $newQuietMode = 2;
  if $newHeatRequest > 5 then
+
      end
      $newHeatRequest = 5;
+
      if @Outside_Temp >= 8 then
      if #offAtNight == 1 then
+
        $newQuietMode = 3;
        #offAtNight = 2;
+
      end
 +
      if $outletDelta < 0 then
 +
        $newQuietMode = 0;
 +
      end
 +
      if $newHeatRequest < 0 then
 +
        $newHeatRequest = 0;
 +
      end
 +
      if $newHeatRequest > 5 then
 +
        $newHeatRequest = 5;
 +
        if #offAtNight == 1 then
 +
            #offAtNight = 2;
 +
        end
 +
      end
 +
      if @Quiet_Mode_Level != $newQuietMode then
 +
        @SetQuietMode = $newQuietMode;
 +
      end
 +
      if @Z1_Heat_Request_Temp != $newHeatRequest then
 +
        @SetZ1HeatRequestTemperature = $newHeatRequest;
 
       end
 
       end
  end
 
  if @Quiet_Mode_Level != $newQuietMode then
 
      @SetQuietMode = $newQuietMode;
 
  end
 
  if @Z1_Heat_Request_Temp != $newHeatRequest then
 
      @SetZ1HeatRequestTemperature = $newHeatRequest;
 
 
   end
 
   end
 
end
 
end
 
</pre>
 
</pre>
 +
</div>
  
 
=== Homeassistant Konfigurationen ===
 
=== Homeassistant Konfigurationen ===
Zeile 273: Zeile 407:
 
           {% set calc = ( float( states('sensor.panasonic_heat_pump_main_operations_hours'),0) / float( states('sensor.panasonic_heat_pump_main_operations_counter'),1) ) | round(2) %}
 
           {% set calc = ( float( states('sensor.panasonic_heat_pump_main_operations_hours'),0) / float( states('sensor.panasonic_heat_pump_main_operations_counter'),1) ) | round(2) %}
 
           {{ 0 if calc <= 0 else calc }}
 
           {{ 0 if calc <= 0 else calc }}
 
input_number:
 
  custom_z1_heatcurve_target_water_temperature_at_low_outdoor_temperature:
 
    name: Heizkurve Wasser Zieltemperatur bei niedriger AT
 
    unit_of_measurement: °C
 
    min: 15
 
    max: 60
 
    step: 1.0
 
    mode: slider
 
  custom_z1_heatcurve_target_water_temperature_at_high_outdoor_temperature:
 
    name: Heizkurve Wasser Zieltemperatur bei hoher AT
 
    unit_of_measurement: °C
 
    min: 15
 
    max: 60
 
    step: 1.0
 
    mode: slider
 
  
 
recorder:
 
recorder:
 
   purge_keep_days: 400
 
   purge_keep_days: 400
 
   commit_interval: 120
 
   commit_interval: 120
</pre>
 
 
==== Automations ====
 
<pre>
 
alias: When DHW starts change Z1 heating curve to 56
 
description: ""
 
trigger:
 
  - platform: state
 
    entity_id:
 
      - sensor.panasonic_heat_pump_main_threeway_valve_state
 
    from: Room
 
    to: Tank
 
condition: []
 
action:
 
  - service: input_number.set_value
 
    target:
 
      entity_id: >-
 
        input_number.custom_z1_heatcurve_target_water_temperature_at_low_outdoor_temperature
 
    data:
 
      value: >-
 
        {{
 
        states('number.panasonic_heat_pump_main_z1_heat_curve_target_high_temp')
 
        | float }}
 
  - service: input_number.set_value
 
    target:
 
      entity_id: >-
 
        input_number.custom_z1_heatcurve_target_water_temperature_at_high_outdoor_temperature
 
    data:
 
      value: >-
 
        {{
 
        states('number.panasonic_heat_pump_main_z1_heat_curve_target_low_temp')
 
        | float }}
 
  - service: number.set_value
 
    data:
 
      value: 56
 
    target:
 
      entity_id: number.panasonic_heat_pump_main_z1_heat_curve_target_high_temp
 
  - service: number.set_value
 
    data:
 
      value: 56
 
    target:
 
      entity_id: number.panasonic_heat_pump_main_z1_heat_curve_target_low_temp
 
mode: single
 
</pre>
 
 
<pre>
 
alias: After DHW ends wait  and set heating curve to 40
 
description: ""
 
trigger:
 
  - platform: state
 
    entity_id:
 
      - sensor.panasonic_heat_pump_main_threeway_valve_state
 
    from: Tank
 
    to: Room
 
    for:
 
      hours: 0
 
      minutes: 4
 
      seconds: 0
 
condition: []
 
action:
 
  - service: number.set_value
 
    data:
 
      value: 40
 
    target:
 
      entity_id: number.panasonic_heat_pump_main_z1_heat_curve_target_high_temp
 
  - service: number.set_value
 
    data:
 
      value: 40
 
    target:
 
      entity_id: number.panasonic_heat_pump_main_z1_heat_curve_target_low_temp
 
mode: single
 
</pre>
 
 
<pre>
 
alias: After DHW ends wait and set heating curve back
 
description: ""
 
trigger:
 
  - platform: state
 
    entity_id:
 
      - sensor.panasonic_heat_pump_main_threeway_valve_state
 
    from: Tank
 
    to: Room
 
    for:
 
      hours: 0
 
      minutes: 6
 
      seconds: 0
 
condition: []
 
action:
 
  - service: number.set_value
 
    data:
 
      value: >-
 
        {{
 
        states('input_number.custom_z1_heatcurve_target_water_temperature_at_low_outdoor_temperature')
 
        | float }}
 
    target:
 
      entity_id: number.panasonic_heat_pump_main_z1_heat_curve_target_high_temp
 
  - service: number.set_value
 
    data:
 
      value: >-
 
        {{
 
        states('input_number.custom_z1_heatcurve_target_water_temperature_at_high_outdoor_temperature')
 
        | float }}
 
    target:
 
      entity_id: number.panasonic_heat_pump_main_z1_heat_curve_target_low_temp
 
mode: single
 
 
</pre>
 
</pre>
  
Zeile 556: Zeile 569:
 
             hass.states['number.panasonic_heat_pump_main_z1_heat_curve_target_low_temp'].state
 
             hass.states['number.panasonic_heat_pump_main_z1_heat_curve_target_low_temp'].state
 
</pre>
 
</pre>
 
  
 
=== Jeisha Einstellungen ===
 
=== Jeisha Einstellungen ===

Aktuelle Version vom 21. Juni 2024, 09:51 Uhr

Vorwort

Diese Seite beschreibt den Umbau von einer Viessmann Atola 11kW Gasheizung auf eine Panasonic Aquarea Wärmepumpe WH-MDC05J3E5.

Der Bestand

Das Haus

  • Reiheneckhaus in Oberbayern
  • Baujahr 1990
  • 2016 von uns erworben
  • Erdgeschoß, Obergeschoß und Dachgeschoß mit zusammen 131 m² Wohnfläche plus Keller
  • Erdgeschoß Wohnzimmer, Küche, WC
  • Obergeschoß drei Zimmer, Bad
  • Dachgeschoß ein Zimmer, Bad
  • Wände aus 30 cm Hohllochziegel
  • Ursprüngliche Dämmung Dach ca. 4 cm Engelshaar Glaswolle + 2 cm Rigipsplatte
  • Unten Bodenplatte 1 cm Styropor + 7 CM Betonestrich
  • Dach 26° Neigung Süd-Südwest/ Nord-Nordost
  • 9,3 kWp PV Anlage auf dem Süddach

Die Heizung

  • 11kW Viessmann Atola Niedertemperatur Gasbrenner BJ 1990
  • EG: 3 Heizkörper in Reihe (90x55 22, 140x55 22, 60x55 10)
  • OG: 5 Heizkörper in Reihe (70x55 20, 70x55 33, 60x55 22, nachgerüstete FBH (2016), Handtuchheizkörper (2016), 70x55 20)
  • DG: 2 Heizkörper in Reihe (80x55 33, 80x55 33)
  • Keller: 1 Heizkörper nachgerüstet parallel (140x90 22)
  • Rauschfreier Volumenstrom 540 l/h

Die Idee

Heizung

  • Einbau einer 3,5kW LLWP im EG im August 2022 wegen von Russland erzeugter Gaskrise
  • Planungsbeginn Umbau auf Wärmepumpe trotz miserabler Hydraulik im Herbst 2022
  • Beim Gasbrenner die Düse auf 5kW Heizleistung ausgelitert
  • Stromanschluß des Gasbrenners auf Steckdose umgebaut und einen Tasmota WLAN Stecker dazwischen gesteckt um über den Stromverbrauch das Taktverhalten im Homeassistant zu protokollieren.
  • Am 13.12.2022 bei minus 14 Grad war der Brenner immer noch am Takten - somit war klar, das 5kW Heizleistung ausreichen müssten.

Hydraulikschema

Die Einrohrheizung ist halt einfach Mist. Obwohl laut Wikipedia Einrohrheizungen schon seit den 1980ern kaum noch eingebaut wurden, hat der damalige Errichter trotzdem eine beauftragt - der drei Reihenhäuser wurden ja nur vermietet.

Die anderen Häuser der Straße wurden von Eigenheimbewohnern gebaut - da findet sich Fussbodenheizung und Zweirohrkreise bei Heizkörpern. Ein meiner Meinung nach weiterer Grund, warum sich Gesetzgeber ins Baugewerbe einmischen müssen, um Mindeststandards durchzusetzen.

Somit wurde der alte 200l WW-Speicher als Reihen-/Abtaupuffer eingeplant wie hier beschrieben mit Umschaltventil.

Dämmung

  • Beim Umbau vor dem Einzug mussten schon die Fenster im EG getauscht werden - das passierte zum Glück 3-glasig.
  • Sonst war die Dämmung des 1990er Zustands nur das mindeste.

PV

  • 9,3 kWp Anlage kam in 2019 und Dank PV-Forum mal was selbst mit Vorwissen geplant
  • Das Süddach ist komplett voll und die Technik für 2019 top.

Umsetzung

Dach

  • Beim Umbau vor dem Einzug 2016 mit 16cm Mineralwolle gedämmt und wo möglich mit 40cm (Dachspitz und gefangene Räume über den Lauf der Zeit)

Fenster

  • Alle Rolladenkästen aufgemacht, sauber gemacht, Bänder getauscht und mit 40mm Armaflex nachgedämmt

Wärmeverteilung

  • Bei allen Heizkörpern vor dem Winter 2022 die Thermostate mit Blindstopfen ersetzt
  • Den thermischen Abgleich mit den Einrohrhahnblöcken gemacht

Somit konnte der Volumenstrom auf 720 l/h rauschfrei erhöht werden

Installation Wärmepumpe

  • Rückbau der Zirkulation
  • 300l TESY Speicher unter der Küche aufgestellt, das Warmwasser kommt nun ohne Zirkulation in ca. 3 Sekunden in der Küche, in den Badezimmern nach ca. 10 Sekunden
  • Thermosiphons beim WW-Speicher verbaut
  • Drei Wärmemengenzähler: Heizen, WW-Bereitstelung und WW-Verbrauch
  • Alten 200l WW-Speicher als Reihenpuffer verbaut - der Kurzschluß beim Abtauen wird durch ein weiteres, von der Jeisha gesteuertes, Afriso 3-Wege-Ventil geschalten.
  • Gasbrenner entsorgt
WW-Speicher vor Einbau WMZ.jpg
WW-Speicher nach Einbau WMZ.jpg
Heizungspuffer mit Abtau-Ventil.jpg
Jeisha-Platine-Verkabelung-Abtausteuerung.jpg.jpg

Steuerung & Co

Ziele sind:

  • möglichst lange Laufzeiten des Kompressors
  • konstante Innenraumtemperatur bis in den Abend
  • Ausnutzung der PV und höheren Quelltemperaturen durch eine Überhöhung tagsüber und einmalige Warmwasserbereitung um 13 Uhr

Statistiken

Ohne Messwerte und deren Auswertung keine Entscheidungen!

Strom

Heizen

Wasser

PV Anlage

Wärmepumpen-Verbrauchsdatenbank

Steuerung

Die WP Heizungssteuerung läuft mit der Wassertemperatur geführten Heizkurve. Das Steuergerät ist an zentraler, schattiger Stelle im Wohnzimmer montiert und damit wird die Raumtemperatur gemessen.

Die Heizkurze bestimmt anhand der Aussentemperatur den Vorlauf und somit den Energieeintrag - wenn dieser passend nachgeführt wird, bleibt die Temperatur im Haus konstant.

Die Heishamon Rules

  • schalten die Warmwasserbereitung um 13 Uhr ein, setzen anhand der Außentemperatur das Warmwasserziel, schalten bei warmen Temperaturen in der Nacht die WP komplett aus und drosseln die Wasserpumpenleistung in der Nacht (timer10)
  • schalten beim Ende der Warmwasserbereitung wieder zurück auf Heizbetrieb ohne den Kompressorlauf zu unterbrechen (on @DHW_Power_Consumption)
  • kümmern sich um das Eindrosseln der Jeisha per Flüstermodus und Laufzeitverlängerung per Vorlauftemperaturverschiebung (on @Main_Outlet_Temp und on @Main_Target_Temp)

Alles andere macht die Jeisha Steuerung.

Heizkurve

Heizkurve

Heishamon Rules

Mit Kommentaren:

Die Kommentare müssen vor dem Hochladen in HeishaMon entfernt werden, z.B. mit https://pypi.org/project/heishamon-rules-minify/

on System#Boot then
-- Variables to remember state before DHW production starts(with sane defaults)
   #stateBeforeDHW = 1;
   #opModeBeforeDHW = 0;
   #targetLowBeforeDHW = 32;
   #targetHighBeforeDHW = 40;
-- Turning the heatpump off at night: 0: funtionality deactivated, 1: active, 2: heatpump should go off
   #offAtNight = 1;
   setTimer(10, 40);
end

-- Time based actions are living here
on timer=10 then
   setTimer(10, 30);
   $hour = %hour;
   $minute = %minute;
   if $hour == 6 && $minute == 0 then
-- Increase volume flow on cold days to increase COP
      if @Outside_Temp < 12 then
         @SetMaxPumpDuty = 150;
      end
-- Heatpump was off during the night -> turn on again
      if #offAtNight == 2 && @Heatpump_State == 0 then
         #offAtNight = 1;
         @SetHeatpump = 1;
      end
   end
-- Start DHW production with warmest outside temperature (-> better COP) and high probability of PV power
   if %hour == 13 && %minute == 00 && @Operating_Mode_State < 3 then
-- Remember state
      #stateBeforeDHW = @Heatpump_State;
      #opModeBeforeDHW = @Operating_Mode_State;
      #targetLowBeforeDHW = @Z1_Heat_Curve_Target_Low_Temp;
      #targetHighBeforeDHW = @Z1_Heat_Curve_Target_High_Temp;
-- Calculate DHW target temperature from outdoor temperature
      $minDHWTarget = 42;
      $minOutside = 10;
      $maxDHWTarget = 50;
      $maxOutside = 25;
      $newDHWTarget = round($minDHWTarget + ((@Outside_Temp - $minOutside ) * ($maxDHWTarget - $minDHWTarget) / ($maxOutside - $minOutside)));
      if @Outside_Temp <= $minOutside then
         $newDHWTarget = $minDHWTarget;
      end
      if @Outside_Temp >= $maxOutside then
         $newDHWTarget = $maxDHWTarget;
      end
-- Only set new DHW target in case it changed (increase EEPROM life time)
      if @DHW_Target_Temp != $newDHWTarget then
         @SetDHWTemp = $newDHWTarget;
      end
      @SetOperationMode = 4;
      @SetHeatpump = 1;
-- Set curve to be used directly after DHW production ends to keep the compressor running.
      @SetCurves = '{zone1:{heat:{target:{high:60,low:60}}}}';
   end
-- Check if the heatpump can be turned off at night
   if $hour == 18 && $minute == 0 && #offAtNight == 1 && @Heatpump_State == 1 && @Outside_Temp > 7 && @Room_Thermostat_Temp > 22 then
      #offAtNight = 2;
   end
-- Reduce volume flow at night to keep radiators quiet and propably turn off heatpump
   if $hour == 20 && $minute == 0 then
      @SetMaxPumpDuty = 105;
      if #offAtNight == 2 && @Heatpump_State == 1 then   
         @SetHeatpump = 0;
      end
   end
end

on @DHW_Power_Consumption then
-- On each change of DHW power change check if the heatpump is finished with DHW production
   if @Operating_Mode_State >= 3 && @DHW_Temp >= @DHW_Target_Temp && @DHW_Power_Consumption == 0 && @Heatpump_State == 1 then
-- Turn off DHW to switch the 3-way valve back to room heating to help keep the heat in the tank
      @SetOperationMode = #opModeBeforeDHW;
-- During summertime the heatpump is off - so probably turn it off again
      @SetHeatpump = #stateBeforeDHW;
-- When heating slowly bring the heat curve back from 60 to what it was before to keep the compressor running
      setTimer(20, 210);
      setTimer(21, 330);
      setTimer(22, 480);
   end
end
on timer=20 then
   @SetCurves = concat('{zone1:{heat:{target:{high:', #targetHighBeforeDHW ,',low:', #targetHighBeforeDHW ,'}}}}');
end
on timer=21 then
   $targetInBetween = (#targetHighBeforeDHW - #targetLowBeforeDHW) / 2 + #targetLowBeforeDHW;
   @SetCurves = concat('{zone1:{heat:{target:{low:', $targetInBetween ,'}}}}');
end
on timer=22 then
   @SetCurves = concat('{zone1:{heat:{target:{low:', #targetLowBeforeDHW ,'}}}}');
end

-- Throttle the heatpump if required to keep the compressor running
-- If the delta between target and actual outlet is bigger than 2 the heatpump turns off
on @Main_Outlet_Temp then
   calcThrottle();
end
on @Main_Target_Temp then
   calcThrottle();
end
on calcThrottle then
-- If calculated while off the heatpump might turn on the next day because #offAtNight can become 2
   if @Heatpump_State == 1 then
      $newQuietMode = 0;
-- @Z1_Heat_Request_Temp modifies @Main_Target_Temp so take it into account
      $outletDelta = @Main_Outlet_Temp - ( @Main_Target_Temp - @Z1_Heat_Request_Temp );
      $newHeatRequest = floor( $outletDelta ) - 1;
-- Set quiet mode based on outdoor temperature
      if @Outside_Temp >= 5 then
        $newQuietMode = 2;
      end
      if @Outside_Temp >= 8 then
         $newQuietMode = 3;
      end
-- When catching up to the target temperature do not activate quiet mode (-> better COP)
      if $outletDelta < 0 then
         $newQuietMode = 0;
      end
-- No negative heat request adjustment
      if $newHeatRequest < 0 then
         $newHeatRequest = 0;
      end
-- If the heat is not taken anymore and the heat request adjustment maximum is reached turn the headpump off at night
      if $newHeatRequest > 5 then
         $newHeatRequest = 5;
         if #offAtNight == 1 then
            #offAtNight = 2;
         end
      end
-- Only set new values in case they changed (increase EEPROM life time)
      if @Quiet_Mode_Level != $newQuietMode then
         @SetQuietMode = $newQuietMode;
      end
      if @Z1_Heat_Request_Temp != $newHeatRequest then
         @SetZ1HeatRequestTemperature = $newHeatRequest;
      end
   end
end
Für HeishaMon zum Hochladen
on System#Boot then
   #stateBeforeDHW = 1;
   #opModeBeforeDHW = 0;
   #targetLowBeforeDHW = 32;
   #targetHighBeforeDHW = 40;
   #offAtNight = 1;
   setTimer(10, 40);
end

on timer=10 then
   setTimer(10, 30);
   $hour = %hour;
   $minute = %minute;
   if $hour == 6 && $minute == 0 then
      if @Outside_Temp < 12 then
         @SetMaxPumpDuty = 150;
      end
      if #offAtNight == 2 && @Heatpump_State == 0 then
         #offAtNight = 1;
         @SetHeatpump = 1;
      end
   end
   if %hour == 13 && %minute == 00 && @Operating_Mode_State < 3 then
      #stateBeforeDHW = @Heatpump_State;
      #opModeBeforeDHW = @Operating_Mode_State;
      #targetLowBeforeDHW = @Z1_Heat_Curve_Target_Low_Temp;
      #targetHighBeforeDHW = @Z1_Heat_Curve_Target_High_Temp;
      $minDHWTarget = 42;
      $minOutside = 10;
      $maxDHWTarget = 50;
      $maxOutside = 25;
      $newDHWTarget = round($minDHWTarget + ((@Outside_Temp - $minOutside ) * ($maxDHWTarget - $minDHWTarget) / ($maxOutside - $minOutside)));
      if @Outside_Temp <= $minOutside then
         $newDHWTarget = $minDHWTarget;
      end
      if @Outside_Temp >= $maxOutside then
         $newDHWTarget = $maxDHWTarget;
      end
      if @DHW_Target_Temp != $newDHWTarget then
         @SetDHWTemp = $newDHWTarget;
      end
      @SetOperationMode = 4;
      @SetHeatpump = 1;
      @SetCurves = '{zone1:{heat:{target:{high:60,low:60}}}}';
   end
   if $hour == 18 && $minute == 0 && #offAtNight == 1 && @Heatpump_State == 1 && @Outside_Temp > 7 && @Room_Thermostat_Temp > 22 then
      #offAtNight = 2;
   end
   if $hour == 20 && $minute == 0 then
      @SetMaxPumpDuty = 105;
      if #offAtNight == 2 && @Heatpump_State == 1 then   
         @SetHeatpump = 0;
      end
   end
end

on @DHW_Power_Consumption then
   if @Operating_Mode_State >= 3 && @DHW_Temp >= @DHW_Target_Temp && @DHW_Power_Consumption == 0 && @Heatpump_State == 1 then
      @SetOperationMode = #opModeBeforeDHW;
      @SetHeatpump = #stateBeforeDHW;
      setTimer(20, 210);
      setTimer(21, 330);
      setTimer(22, 480);
   end
end
on timer=20 then
   @SetCurves = concat('{zone1:{heat:{target:{high:', #targetHighBeforeDHW ,',low:', #targetHighBeforeDHW ,'}}}}');
end
on timer=21 then
   $targetInBetween = (#targetHighBeforeDHW - #targetLowBeforeDHW) / 2 + #targetLowBeforeDHW;
   @SetCurves = concat('{zone1:{heat:{target:{low:', $targetInBetween ,'}}}}');
end
on timer=22 then
   @SetCurves = concat('{zone1:{heat:{target:{low:', #targetLowBeforeDHW ,'}}}}');
end

on @Main_Outlet_Temp then
   calcThrottle();
end
on @Main_Target_Temp then
   calcThrottle();
end
on calcThrottle then
   if @Heatpump_State == 1 then
      $newQuietMode = 0;
      $outletDelta = @Main_Outlet_Temp - ( @Main_Target_Temp - @Z1_Heat_Request_Temp );
      $newHeatRequest = floor( $outletDelta ) - 1;
      if @Outside_Temp >= 5 then
        $newQuietMode = 2;
      end
      if @Outside_Temp >= 8 then
         $newQuietMode = 3;
      end
      if $outletDelta < 0 then
         $newQuietMode = 0;
      end
      if $newHeatRequest < 0 then
         $newHeatRequest = 0;
      end
      if $newHeatRequest > 5 then
         $newHeatRequest = 5;
         if #offAtNight == 1 then
            #offAtNight = 2;
         end
      end
      if @Quiet_Mode_Level != $newQuietMode then
         @SetQuietMode = $newQuietMode;
      end
      if @Z1_Heat_Request_Temp != $newHeatRequest then
         @SetZ1HeatRequestTemperature = $newHeatRequest;
      end
   end
end

Homeassistant Konfigurationen

configuration.yaml

sensor:
  - platform: template
    sensors:
      custom_panasonic_heat_pump_average_runtime:
        friendly_name: Heatpump average runtime
        unit_of_measurement: h
        value_template: >-
          {% set calc = ( float( states('sensor.panasonic_heat_pump_main_operations_hours'),0) / float( states('sensor.panasonic_heat_pump_main_operations_counter'),1) ) | round(2) %}
          {{ 0 if calc <= 0 else calc }}

recorder:
  purge_keep_days: 400
  commit_interval: 120

Dashboards

Wärmepumpe
type: entities
entities:
  - entity: sensor.panasonic_heat_pump_main_outside_temp
  - entity: sensor.panasonic_heat_pump_main_room_thermostat_temp
  - entity: sensor.panasonic_heat_pump_main_dhw_temp
  - entity: sensor.panasonic_heat_pump_main_threeway_valve_state
  - entity: switch.panasonic_heat_pump_main_defrosting_state
  - entity: sensor.panasonic_heat_pump_main_main_target_temp
  - entity: sensor.panasonic_heat_pump_main_main_outlet_temp
  - entity: sensor.panasonic_heat_pump_main_main_inlet_temp
  - entity: sensor.panasonic_heat_pump_main_compressor_freq
  - entity: sensor.panasonic_heat_pump_main_high_pressure
  - entity: sensor.panasonic_heat_pump_main_fan1_motor_speed
  - entity: sensor.panasonic_heat_pump_main_pump_flow
  - entity: sensor.panasonic_heat_pump_main_pump_speed
  - entity: sensor.panasonic_heat_pump_main_pump_duty
  - entity: sensor.panasonic_heat_pump_s0_watt_1
  - entity: sensor.aquarea_energy_consumption
  - entity: sensor.aquarea_energy_production
  - entity: sensor.aquarea_cop
  - entity: sensor.panasonic_heat_pump_main_operations_counter
  - entity: sensor.panasonic_heat_pump_main_operations_hours
  - entity: sensor.custom_panasonic_heat_pump_average_runtime
title: Aktuelle Werte
state_color: true
type: grid
square: false
columns: 1
cards:
  - type: entities
    entities:
      - entity: water_heater.panasonic_heat_pump_main_dhw_target_temp
      - entity: climate.panasonic_heat_pump_main_z1_temp
      - entity: number.panasonic_heat_pump_main_z1_heat_request_temp
      - entity: number.panasonic_heat_pump_main_max_pump_duty
      - entity: number.panasonic_heat_pump_main_heat_delta
      - entity: number.panasonic_heat_pump_main_dhw_heat_delta
      - entity: number.panasonic_heat_pump_main_heating_off_outdoor_temp
      - entity: number.panasonic_heat_pump_main_z1_heat_curve_target_high_temp
      - entity: number.panasonic_heat_pump_main_z1_heat_curve_target_low_temp
      - entity: number.panasonic_heat_pump_main_z1_heat_curve_outside_low_temp
      - entity: number.panasonic_heat_pump_main_z1_heat_curve_outside_high_temp
      - entity: binary_sensor.panasonic_heat_pump_main_quiet_mode_schedule
      - entity: select.panasonic_heat_pump_main_quiet_mode_level
      - entity: binary_sensor.panasonic_heat_pump_main_dhw_installed
      - entity: binary_sensor.panasonic_heat_pump_main_room_heater_state
      - entity: binary_sensor.panasonic_heat_pump_main_dhw_heater_state
    title: Einstellungen
Wärmepumpe Kurven
type: vertical-stack
cards:
  - type: history-graph
    entities:
      - entity: switch.panasonic_heat_pump_main_heatpump_state
      - entity: select.panasonic_heat_pump_main_operating_mode_state
      - entity: sensor.panasonic_heat_pump_main_threeway_valve_state
      - entity: switch.panasonic_heat_pump_main_defrosting_state
      - entity: binary_sensor.panasonic_heat_pump_main_internal_heater_state
      - entity: select.panasonic_heat_pump_main_quiet_mode_level
      - entity: switch.panasonic_heat_pump_main_holiday_mode_state
    hours_to_show: 8
    title: Status
  - type: history-graph
    entities:
      - entity: sensor.panasonic_heat_pump_main_outside_temp
      - entity: sensor.panasonic_heat_pump_main_room_thermostat_temp
      - entity: number.panasonic_heat_pump_main_z1_heat_request_temp
      - entity: sensor.panasonic_heat_pump_main_dhw_temp
      - entity: sensor.panasonic_heat_pump_main_main_target_temp
      - entity: sensor.panasonic_heat_pump_main_main_outlet_temp
      - entity: sensor.panasonic_heat_pump_main_main_inlet_temp
    title: Temperaturen
    hours_to_show: 8
  - type: history-graph
    entities:
      - sensor.panasonic_heat_pump_main_compressor_freq
    title: Kompressor
    hours_to_show: 8
  - type: history-graph
    entities:
      - sensor.panasonic_heat_pump_main_pump_flow
    title: Volumenstrom
    hours_to_show: 8
  - type: history-graph
    entities:
      - sensor.panasonic_heat_pump_main_pump_speed
      - sensor.panasonic_heat_pump_main_fan1_motor_speed
    title: Drehzahlen
    hours_to_show: 8
  - type: history-graph
    entities:
      - entity: sensor.panasonic_heat_pump_main_pump_duty
      - entity: number.panasonic_heat_pump_main_max_pump_duty
    hours_to_show: 8
  - type: history-graph
    entities:
      - sensor.panasonic_heat_pump_main_dhw_energy_consumption
      - sensor.panasonic_heat_pump_main_dhw_energy_production
      - sensor.panasonic_heat_pump_main_heat_energy_consumption
      - sensor.panasonic_heat_pump_main_heat_energy_production
      - sensor.panasonic_heat_pump_s0_watt_1
      - sensor.panasonic_heat_pump_s0_watt_2
      - sensor.aquarea_energy_consumption
      - sensor.aquarea_energy_production
    title: Energie
    hours_to_show: 8
  - type: history-graph
    entities:
      - entity: sensor.panasonic_heat_pump_main_high_pressure
    hours_to_show: 8
  - type: history-graph
    entities:
      - sensor.aquarea_cop
    hours_to_show: 8
  - type: custom:plotly-graph
    refresh_interval: 10
    title: Heat curve
    defaults:
      entity:
        show_value: true
        line:
          shape: spline
    layout:
      xaxis:
        type: number
        autorange: true
    entities:
      - entity: ''
        name: Zone 1
        x:
          - >-
            $ex
            hass.states['number.panasonic_heat_pump_main_z1_heat_curve_outside_low_temp'].state
          - >-
            $ex
            hass.states['number.panasonic_heat_pump_main_z1_heat_curve_outside_high_temp'].state
        'y':
          - >-
            $ex
            hass.states['number.panasonic_heat_pump_main_z1_heat_curve_target_high_temp'].state
          - >-
            $ex
            hass.states['number.panasonic_heat_pump_main_z1_heat_curve_target_low_temp'].state

Jeisha Einstellungen

Meine Einstellungen

Stumi75-Jeisha-Einstellungen.png

Beispiel Tagesverlauf

Wenn das so aussieht, kann man sich freuen... 5kW-Panasonic-Aquarea-Jeisha.png