След доста мъки най-накрая термопомпата в къщата се управлява почти както искам, остава да вкарам логиката за връзка между очаквана външна температура и изходяща температура на водата от нея.
Първо да спомена каква е тя – 12 киловата трифазна вода-вода на Geotok с управление Dixell ic100cx.
Комуникацията между нея и Home Assistant става през modbus, за целта е необходим XJ485CX – TTL/RS485 serial interface. В България можете да го закупите от Apogee99, обикновено дори го имат налично 🙂
(следващата стъпка е да го елиминирам и него, но комуникацията не е чист сериен интерфейс, има допълнителен сигнал, който се подава от този преходник към диксела. Още не ми е останало време да го дебъгна за съжаление)
От тук нататък е въпрос на лични предпочитания как да изградите комуникацията. При мен отива в Protoss-PE11 модбъс гейт и от там всичко тече по TCP/IP.
Регистрите, които основно ви трябват от modbus:
256 – текуща температура на изхода на термопомпата
258 – текуща температура на входа на термопомпата
260 – текуща температура на входа от сондажа
262 – текуща температура на изхода от сондажната вода
1145 – зададена температура при охлаждане
1148 – зададена температура при отопление
1280 бит 0 – статус на термопомпата, 1 – включена, 0 – stand-by. При писане на 1 в регистъра контролера минава в stand-by
1282 bit 6 – активен режим охлаждане. 1 – включен. Запис в 1282 на 0x4040 в регистъра я включва в режим охлаждане (само, ако преди това е била изключена – 0 в бит 0 на 1280)
1282 bit 7 – активен режим отопление. 1 – включен. Запис в 1282 на 0x8080 в регистъра я включва в режим охлаждане (само, ако преди това е била изключена – 0 в бит 0 на 1280)
Всички температурни стойности са цели числа, като последната цифра се възприема като десетична от самия контролер, примерно 351 означава 35.1 градуса
След като сме въоръжени с горните данни (отне ми доста време да успея да ги събера с reverse engineering, Copeland не ги дават на никого) нататък нещата са лесни.
Примерни конфигурации за HomeAssistant
modbus:
- name: "TP"
type: tcp
host: XXX.XXX.XXX.XXX
port: 502
delay: 10
message_wait_milliseconds: 100
sensors:
- name: tp_status_register_0
data_type: uint16
address: 1280
input_type: holding
slave: 1
climates:
- name: TP Target Temperature
data_type: int16
address: 256
target_temp_register: [256,1145,256,256,1148,256,256]
hvac_mode_register:
address: 1282
values:
state_heat: 33924
state_cool: 17476
state_off: 1028
max_temp: 55
min_temp: 15
precision: 1
scale: 0.1
temp_step: 0.1
slave: 1
switch:
- platform: template
switches:
heatingonoff:
turn_on:
- service: modbus.write_register
data:
address: 1282
slave: 1
hub: TP
value: 0x8080
turn_off:
- service: modbus.write_register
data:
address: 1280
slave: 1
hub: TP
value: 0x1
coolingonoff:
turn_on:
- service: modbus.write_register
data:
address: 1282
slave: 1
hub: TP
value: 0x4040
- service: modbus.write_coil
data:
address: 1449
slave: 1
hub: PLC02
state: false
turn_off:
- service: modbus.write_register
data:
address: 1280
slave: 1
hub: TP
value: 0x1
- service: modbus.write_coil
data:
address: 1449
slave: 1
hub: PLC02
state: true
climate:
- platform: generic_thermostat
name: House Heating
heater: switch.heatingonoff
target_sensor: sensor.average_indoor_temperature
min_temp: 15
max_temp: 25
target_temp: 20.5
- platform: dual_smart_thermostat
name: House HVAC
heater: switch.heatingonoff
cooler: switch.coolingonoff
target_sensor: sensor.average_indoor_temperature
heat_cool_mode: true
min_temp: 15
max_temp: 25
cold_tolerance: 0.2
hot_tolerance: 0.2
target_temp_low: 19
target_temp_high: 24
Също така е добра идея да синхронизираме статуса при старт на Home Assistant. За тази цел създаваме две нови автоматизации:
alias: Sync TP cooling mode
description: ""
trigger:
- platform: homeassistant
event: start
condition:
- condition: numeric_state
entity_id: sensor.tp_status_register
below: 32880
above: 16447
action:
- service: switch.turn_on
metadata: {}
data: {}
target:
entity_id: switch.coolingonoff
mode: single
description: "Sync Heat pump heat state at boot"
mode: single
trigger:
- platform: homeassistant
event: start
condition:
- condition: numeric_state
entity_id: sensor.tp_status_register
above: 32898
action:
- service: switch.turn_on
metadata: {}
data: {}
target:
entity_id: switch.heatingonoff