Multi-Zone Configuration Guide¶
Learn how to configure and manage multi-zone Hitachi heat pump systems with C1 and C2 circuits.
Overview¶
Multi-zone systems allow independent control of different areas or circuits in your home. This guide covers:
- Understanding zones and circuits
- Configuration examples
- Independent vs coordinated control
- Optimization strategies
- Common scenarios
Understanding Zones vs Circuits¶
Circuits (C1, C2)¶
Physical hydraulic circuits from the heat pump:
- C1 (Circuit 1): First heating/cooling circuit
- C2 (Circuit 2): Second heating/cooling circuit (if present)
Each circuit has its own: - Water supply line - Temperature control - Flow regulation
Zones¶
Logical control areas with thermostats:
- Zone 1: Typically C1 Air (first room thermostat)
- Zone 2: Typically C2 Air (second room thermostat)
- Zone 5: Typically C1 Water (floor heating/radiators)
- Zone 6: Typically C2 Water (second water circuit)
- Zone 3: DHW (Domestic Hot Water)
Common Configurations¶
| Configuration | Circuits | Description |
|---|---|---|
| Single Zone | C1 only | One thermostat or water circuit |
| Dual Air Zones | C1 + C2 | Two room thermostats |
| Water + Air | C1 Water + C1 Air | Floor heating + room thermostat |
| Dual Water | C1 + C2 Water | Two floor heating zones |
| Mixed | Various | Combination of air and water zones |
Configuration Examples¶
Example 1: Two-Floor House (Dual Air)¶
Setup: - First floor: Living room, kitchen, bathroom - Second floor: Bedrooms
Configuration: - C1 (Zone 1): First floor thermostat - C2 (Zone 2): Second floor thermostat
Entities Created:
Benefits: - Independent temperature control per floor - Different schedules possible (e.g., bedrooms cooler at night) - Energy savings (heat only occupied floors)
Dashboard Example:
type: vertical-stack
cards:
- type: thermostat
entity: climate.remote_first_floor
name: First Floor
- type: thermostat
entity: climate.remote_second_floor
name: Second Floor
- type: entities
entities:
- entity: sensor.remote_first_floor_current_temperature
name: First Floor Temp
- entity: sensor.remote_second_floor_current_temperature
name: Second Floor Temp
Example 2: Floor Heating + Room (Mixed)¶
Setup: - Ground floor: Underfloor heating (water circuit) - Upper floor: Fan coil or air handler
Configuration: - C1 Water (Zone 5): Floor heating - C2 Air (Zone 2): Upper floor thermostat
Entities Created:
- climate.remote_ground_floor # Water circuit control
- climate.remote_upper_floor # Air circuit control
Characteristics: - Floor heating: Slower response, constant comfort - Air circuit: Faster response, more reactive - Different temperature ranges per circuit type
Example 3: Two Water Zones¶
Setup: - Zone 1: Living areas floor heating - Zone 2: Bedrooms floor heating
Configuration: - C1 Water (Zone 5): Living areas - C2 Water (Zone 6): Bedrooms
Entities Created:
Benefits: - Different temperatures for different areas - Schedule bedrooms cooler when empty - Optimize comfort vs energy per area
Independent vs Coordinated Control¶
Independent Control¶
Each zone operates completely independently:
# Set different temperatures
service: climate.set_temperature
target:
entity_id: climate.remote_first_floor
data:
temperature: 22
service: climate.set_temperature
target:
entity_id: climate.remote_second_floor
data:
temperature: 19
Benefits: - Maximum flexibility - Optimize each zone separately - Different schedules per zone
Considerations: - Heat pump capacity shared between zones - One zone's demand affects the other - May reduce efficiency if settings very different
Coordinated Control¶
Control zones together for consistency:
# Set all zones to same temperature
service: climate.set_temperature
target:
entity_id:
- climate.remote_first_floor
- climate.remote_second_floor
data:
temperature: 21
Benefits: - Consistent whole-house temperature - Simpler management - More predictable behavior
Use Cases: - Vacation mode - Party/guests (heat whole house) - Quick temperature changes
Demand Management¶
Understanding Demand¶
Each zone can "demand" heating or cooling from the heat pump:
Demand Attributes: - c1_demand - Circuit 1 is calling for heat/cool - c2_demand - Circuit 2 is calling for heat/cool
Check Demand Status:
{{ state_attr('climate.remote_first_floor', 'c1_demand') }}
{{ state_attr('climate.remote_second_floor', 'c2_demand') }}
Demand-Based Automations¶
Alert When Both Zones Demanding¶
automation:
- alias: "Alert High Demand"
trigger:
- platform: template
value_template: >
{{ state_attr('climate.remote_first_floor', 'c1_demand') and
state_attr('climate.remote_second_floor', 'c2_demand') }}
for: "00:10:00"
action:
- service: notify.mobile_app
data:
message: "Both zones demanding heat - consider adjusting setpoints"
Priority Zone¶
Give priority to one zone when both demand:
automation:
- alias: "Priority to Living Room"
trigger:
- platform: template
value_template: >
{{ state_attr('climate.remote_living_room', 'c1_demand') and
state_attr('climate.remote_bedroom', 'c2_demand') }}
action:
# Reduce bedroom temperature slightly
- service: climate.set_temperature
target:
entity_id: climate.remote_bedroom
data:
temperature: >
{{ state_attr('climate.remote_bedroom', 'temperature') - 1 }}
Temperature Scheduling¶
Per-Zone Schedules¶
Create different schedules for each zone:
automation:
# First floor schedule
- alias: "First Floor Temperature Schedule"
trigger:
- platform: time
at: "06:00:00"
id: morning
- platform: time
at: "23:00:00"
id: night
action:
- choose:
- conditions:
- condition: trigger
id: morning
sequence:
- service: climate.set_temperature
target:
entity_id: climate.remote_first_floor
data:
temperature: 22
- conditions:
- condition: trigger
id: night
sequence:
- service: climate.set_temperature
target:
entity_id: climate.remote_first_floor
data:
temperature: 19
# Second floor schedule
- alias: "Second Floor Temperature Schedule"
trigger:
- platform: time
at: "21:00:00"
id: bedtime
- platform: time
at: "08:00:00"
id: wake
action:
- choose:
- conditions:
- condition: trigger
id: bedtime
sequence:
- service: climate.set_temperature
target:
entity_id: climate.remote_second_floor
data:
temperature: 18
- conditions:
- condition: trigger
id: wake
sequence:
- service: climate.set_temperature
target:
entity_id: climate.remote_second_floor
data:
temperature: 20
Occupancy-Based Control¶
Adjust zones based on occupancy:
automation:
- alias: "Reduce Unoccupied Zone Temperature"
trigger:
- platform: state
entity_id: binary_sensor.first_floor_occupied
to: "off"
for: "01:00:00"
action:
- service: climate.set_preset_mode
target:
entity_id: climate.remote_first_floor
data:
preset_mode: eco
- alias: "Restore When Occupied"
trigger:
- platform: state
entity_id: binary_sensor.first_floor_occupied
to: "on"
action:
- service: climate.set_preset_mode
target:
entity_id: climate.remote_first_floor
data:
preset_mode: comfort
System Monitoring¶
Multi-Zone Dashboard¶
Comprehensive monitoring dashboard:
type: vertical-stack
cards:
- type: markdown
content: "## Multi-Zone System"
- type: horizontal-stack
cards:
- type: thermostat
entity: climate.remote_first_floor
name: First Floor
- type: thermostat
entity: climate.remote_second_floor
name: Second Floor
- type: entities
title: System Status
entities:
- type: attribute
entity: climate.remote_first_floor
attribute: c1_demand
name: C1 Demand
- type: attribute
entity: climate.remote_second_floor
attribute: c2_demand
name: C2 Demand
- entity: sensor.system_controller_in_water_temperature
name: Water In
- entity: sensor.system_controller_out_water_temperature
name: Water Out
- entity: sensor.system_controller_outdoor_temperature
name: Outdoor
- type: history-graph
title: Temperature History
entities:
- entity: sensor.remote_first_floor_current_temperature
name: First Floor
- entity: sensor.remote_second_floor_current_temperature
name: Second Floor
- entity: sensor.system_controller_outdoor_temperature
name: Outdoor
hours_to_show: 24
Demand Monitoring¶
Track which zones are demanding:
type: entities
title: Zone Demand Status
entities:
- type: custom:template-entity-row
entity: climate.remote_first_floor
name: First Floor
secondary: >
{% if state_attr('climate.remote_first_floor', 'c1_demand') %}
🔥 Demanding
{% else %}
✓ Satisfied
{% endif %}
- type: custom:template-entity-row
entity: climate.remote_second_floor
name: Second Floor
secondary: >
{% if state_attr('climate.remote_second_floor', 'c2_demand') %}
🔥 Demanding
{% else %}
✓ Satisfied
{% endif %}
Optimization Strategies¶
Energy Efficiency¶
Strategy 1: Staggered Heating¶
Avoid both zones demanding simultaneously:
automation:
- alias: "Stagger Zone Heating"
trigger:
- platform: time
at: "06:00:00"
action:
# Heat first floor first
- service: climate.set_temperature
target:
entity_id: climate.remote_first_floor
data:
temperature: 22
# Wait for first floor to reach temperature
- wait_template: >
{{ not state_attr('climate.remote_first_floor', 'c1_demand') }}
timeout: "01:00:00"
# Then heat second floor
- service: climate.set_temperature
target:
entity_id: climate.remote_second_floor
data:
temperature: 21
Strategy 2: Temperature Offsets¶
Keep zones within a few degrees of each other:
automation:
- alias: "Limit Temperature Spread"
trigger:
- platform: state
entity_id:
- climate.remote_first_floor
- climate.remote_second_floor
attribute: temperature
condition:
- condition: template
value_template: >
{% set diff = state_attr('climate.remote_first_floor', 'temperature') -
state_attr('climate.remote_second_floor', 'temperature') %}
{{ diff | abs > 4 }}
action:
- service: notify.mobile_app
data:
message: "Large temperature difference between zones may reduce efficiency"
Comfort Optimization¶
Maintain Minimum Temperature¶
Ensure no zone gets too cold:
automation:
- alias: "Minimum Temperature Guard"
trigger:
- platform: numeric_state
entity_id:
- sensor.remote_first_floor_current_temperature
- sensor.remote_second_floor_current_temperature
below: 16
action:
- service: climate.set_temperature
target:
entity_id: "{{ trigger.entity_id.replace('sensor.', 'climate.').replace('_current_temperature', '') }}"
data:
temperature: 19
- service: climate.turn_on
target:
entity_id: "{{ trigger.entity_id.replace('sensor.', 'climate.').replace('_current_temperature', '') }}"
Pre-heat Before Use¶
Pre-heat zones before occupancy:
automation:
- alias: "Pre-heat Bedroom Before Bedtime"
trigger:
- platform: time
at: "21:00:00"
action:
- service: climate.set_temperature
target:
entity_id: climate.remote_second_floor
data:
temperature: 20
- service: climate.set_preset_mode
target:
entity_id: climate.remote_second_floor
data:
preset_mode: comfort
Troubleshooting Multi-Zone Issues¶
One Zone Not Heating¶
Symptoms: One zone stays cold while other heats
Possible Causes: - Zone turned off - Valve closed or stuck - Thermostat malfunction - Priority given to other zone
Solutions: 1. Check zone is ON in Home Assistant 2. Check c1_demand or c2_demand - is zone calling for heat? 3. Verify thermostat battery/power 4. Check valve operation (may need manual check) 5. Temporarily turn off other zone to test
Zones Fighting Each Other¶
Symptoms: Temperature fluctuates, never settles
Possible Causes: - Setpoints too far apart - Both zones demanding constantly - Poor zone isolation
Solutions: 1. Reduce temperature difference between zones 2. Check for open doors/airflow between zones 3. Use staggered heating strategy 4. Consider adjusting OTC curves
Uneven Heating¶
Symptoms: One zone always warmer/cooler than target
Possible Causes: - Different thermal mass (air vs water) - Poor thermostat placement - Circuit flow imbalance - Insulation differences
Solutions: 1. Adjust target temperatures to compensate 2. Check thermostat location (not in draft, sun, etc.) 3. Balance flow valves (may need professional) 4. Consider zone-specific temperature offsets
Advanced Multi-Zone Automations¶
Smart Load Balancing¶
automation:
- alias: "Smart Load Balance"
trigger:
- platform: time_pattern
minutes: "/15" # Check every 15 minutes
condition:
# Both zones demanding
- condition: template
value_template: >
{{ state_attr('climate.remote_first_floor', 'c1_demand') and
state_attr('climate.remote_second_floor', 'c2_demand') }}
action:
# Determine which zone is further from target
- variables:
zone1_diff: >
{{ state_attr('climate.remote_first_floor', 'temperature') -
state_attr('climate.remote_first_floor', 'current_temperature') }}
zone2_diff: >
{{ state_attr('climate.remote_second_floor', 'temperature') -
state_attr('climate.remote_second_floor', 'current_temperature') }}
# Prioritize zone with larger deficit
- choose:
- conditions:
- condition: template
value_template: "{{ zone1_diff > zone2_diff }}"
sequence:
- service: climate.set_preset_mode
target:
entity_id: climate.remote_second_floor
data:
preset_mode: eco
default:
- service: climate.set_preset_mode
target:
entity_id: climate.remote_first_floor
data:
preset_mode: eco
Coordinated Away Mode¶
automation:
- alias: "Multi-Zone Away Mode"
trigger:
- platform: state
entity_id: input_boolean.away_mode
to: "on"
action:
# Set all zones to eco with reduced temperature
- service: climate.set_preset_mode
target:
entity_id:
- climate.remote_first_floor
- climate.remote_second_floor
data:
preset_mode: eco
- service: climate.set_temperature
target:
entity_id:
- climate.remote_first_floor
- climate.remote_second_floor
data:
temperature: 16
Best Practices¶
✅ DO¶
- Keep zones within 3-4°C of each other for efficiency
- Use staggered heating when possible
- Monitor demand status to understand system behavior
- Create zone-specific schedules based on usage
- Balance comfort vs efficiency per zone
- Regular maintenance of thermostats and valves
- Use preset modes (Eco/Comfort) for easy control
❌ DON'T¶
- Don't set extreme temperature differences (>5°C)
- Don't leave unused zones at high temperatures
- Don't ignore demand conflicts - optimize settings
- Don't forget zones affect each other
- Don't override OTC settings without understanding
- Don't neglect physical valve and thermostat maintenance
Next Steps¶
Explore related documentation: - Climate Control - Detailed climate entity control - Advanced Features - Silent mode, fan control, OTC - Sensors Reference - All available sensors - Water Heater Control - DHW management