Vistapool Integration

If anybody is interested, Vistapool Hidrolife is possible to control directly through MODBUS/TCP IP converter ( I use this one ) or it can be any other available, so there is no need of Vistapool cloud anymore :slight_smile:

My working config file is below.

#---------------------------------------------------#
#   HIDROLIFE control via MODBUS (no cloud)         #
#---------------------------------------------------#

input_boolean:
  modbus:
  filtrace_mb_auto:
  cycle1_on:
  cycle2_on:
  cycle3_on:

sensor:

  - platform: modbus
    registers:
    - name: MBF_MEASURE_PH #  pH mb 
      hub: bazen
      slave: 1
      register: 258
      register_type: holding
      data_type: uint
      scale: 0.01
      precision: 1
    - name: MBF_PAR_PH1 #-  horni hranice pH
      hub: bazen
      slave: 1
      register: 1284
      register_type: holding
      data_type: uint
      scale: 0.01
      precision: 1
    - name: MBF_PAR_PH2  #   dolni hranice pH
      hub: bazen
      slave: 1
      register: 1285
      register_type: holding
      data_type: uint
      scale: 0.01
      precision: 1
    - name: MBF_MEASURE_TEMPERATURE # MBF_MEASURE_TEMPERATURE
      hub: bazen
      slave: 1
      register: 262
      register_type: holding
      data_type: uint
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
    - name: MBF_PH_STATUS # MBF_PH_STATUS - AL3, stav pH, peristaltika 
      hub: bazen
      slave: 1
      register: 263
      register_type: holding
      data_type: uint
    - name: MBF_PAR_FILTRATION_STATE # MBF_PAR_FILTRATION_STATE /-READ ONLY / stav filtrace zap/vyp
      hub: bazen
      slave: 1
      register: 1057
      register_type: holding
      data_type: uint
    - name: MBF_PAR_FILT_MANUAL_STATE # MBF_PAR_FILT_MANUAL_STATE-stav filtrace zap/vyp
      hub: bazen
      slave: 1
      register: 1043
      register_type: holding
      data_type: uint
    - name: MBF_PAR_HEATING_TEMP # MBF_PAR_HEATING_TEMP cilova teplota vody pro vyhrivani
      hub: bazen
      slave: 1
      register: 1046
      register_type: holding
      data_type: uint
      unit_of_measurement: °C
    - name: MBF_PAR_FILT_MODE #  režim filtrace
      hub: bazen
      slave: 1
      register: 1041
      register_type: holding
      data_type: uint
    - name: MBF_RELAY_STATE # MBF_RELAY_STATE stav jednotlivych rele
      hub: bazen
      slave: 1
      register: 270
      register_type: holding
      data_type: uint

      
  - platform: template
    sensors:
      rezim_filtrace:
        friendly_name: "Režim filtrace"
        value_template: >-
          {% if is_state('sensor.MBF_PAR_FILT_MODE', '0' ) %}
              Manual
          {% elif is_state('sensor.MBF_PAR_FILT_MODE', '1' ) %}
              Auto
          {% elif is_state('sensor.MBF_PAR_FILT_MODE', '2' ) %}
              Topeni
          {% elif is_state('sensor.MBF_PAR_FILT_MODE', '3' ) %}
              Smart
          {% elif is_state('sensor.MBF_PAR_FILT_MODE', '4' ) %}
              Intelligent
          {% else %}
              ???
          {% endif %}
          
      peristaltika:
        friendly_name: "Peristaltika mb"
        value_template: "{{ states('sensor.MBF_RELAY_STATE')|int // 1 % 2 }}"
      filtrace:
        friendly_name: "Filtrace mb"
        value_template: "{{ states('sensor.MBF_RELAY_STATE')|int // 2 % 2 }}"
      ohrev:
        friendly_name: "Ohrev mb"
        value_template: "{{ states('sensor.MBF_RELAY_STATE')|int // 64 % 2 }}"

      stav_ph_1:
        friendly_name: "stav ph 1"
        value_template: "{{ states('sensor.MBF_PH_STATUS')|int // 1 % 2 * 1 }}"
      stav_ph_2:
        friendly_name: "stav ph 2"
        value_template: "{{ states('sensor.MBF_PH_STATUS')|int // 2 % 2 * 2}}"
      stav_ph_3:
        friendly_name: "stav ph 3"
        value_template: "{{ states('sensor.MBF_PH_STATUS')|int // 4 % 2 * 4}}"
      ph1_ph2:
        value_template: "{{ states('sensor.stav_ph_1')|int + states('sensor.stav_ph_2')|int + states('sensor.stav_ph_3')|int }}"
      stav_ph:
        friendly_name: "Stav ph"
        value_template: >-
          {% if is_state('sensor.ph1_ph2', '0' ) %}
              OK
          {% elif is_state('sensor.ph1_ph2', '1' ) %}
              vysoké
          {% elif is_state('sensor.ph1_ph2', '2' ) %}
              nízké
          {% elif is_state('sensor.ph1_ph2', '3' ) %}
              AL3
          {% elif is_state('sensor.ph1_ph2', '4' ) %}
              vyšší
          {% elif is_state('sensor.ph1_ph2', '5' ) %}
              nižší
           {% else %}
              ???
          {% endif %}

      filtrace_mb_num:
        friendly_name: “Filtrace zap-vyp”
        value_template: >
          {% if is_state('input_boolean.filtrace_mb_auto', 'on') %} 1 {% else %} 0 {% endif %}
          
      tepelne_cerpadlo_mb_num:
        friendly_name: “Tepelne cerpadlo zap-vyp”
        value_template: >
          {% if is_state('input_boolean.filtrace_mb_auto', 'on') %} 3 {% else %} 4 {% endif %}

      timer_1_mb:
        value_template: "{{ states('input_select.cycle1_time') }}"
      timer_2_mb:
        value_template: "{{ states('input_select.cycle2_time') }}"
      timer_3_mb:
        value_template: "{{ states('input_select.cycle3_time') }}"
      delay_1_mb:
        value_template: "{{ states('input_select.cycle1_duration') | int * 60  }}"
      delay_2_mb:
        value_template: "{{ states('input_select.cycle2_duration') | int * 60 }}"
      delay_3_mb:
        value_template: "{{ states('input_select.cycle3_duration') | int * 60 }}"

      mb_teplota_vody:
        value_template: "{{states('sensor.MBF_MEASURE_TEMPERATURE') | round(1)}}"


binary_sensor:
  - platform: template
    sensors:
      peristaltika:
        friendly_name: "Peristaltika mb"
        value_template: "{{ states('sensor.MBF_RELAY_STATE')|int // 1 % 2 == 1}}"
      filtrace:
        friendly_name: "Filtrace mb"
        value_template: "{{ states('sensor.MBF_PAR_FILTRATION_STATE')|int == 1 }}"
      ohrev:
        friendly_name: "Ohrev mb"
        value_template: "{{ states('sensor.MBF_RELAY_STATE')|int // 64 % 2 == 1 }}"
      filtrace_mb_auto:
        value_template: "{{ is_state('input_boolean.filtrace_mb_auto', 'on') }}"
        
input_select:
  cycle1_time:
    name: Cyklus 1 - začátek
    options:
      - '05:00'
      - '06:00'
      - '07:00'
      - '07:30'
      - '08:00'
      - '09:00'
      - '10:00'
  cycle2_time:
    name: Cyklus 2 - začátek
    options:
      - '11:00'
      - '12:00'
      - '13:00'
      - '14:00'
      - '15:00'
  cycle3_time:
    name: Cyklus 3 - začátek
    options:
      - '16:00'
      - '17:00'
      - '18:00'
      - '19:00'
      - '20:00'
  cycle1_duration:
    name: Cyklus 1 - trvání
    options:
      - '1'
      - '2'
      - '3'
      - '4'
      
  cycle2_duration:
    name: Cyklus 2 - trvání
    options:
      - '1'
      - '2'
      - '3'
      - '4'
  cycle3_duration:
    name: Cyklus 3 - tvání
    options:
      - '1'
      - '2'
      - '3'
      - '4'


automation:
- alias: Fitration - run_cycle_1
  initial_state: 'on'
  trigger:
  - platform: template
    value_template: >
      {{ states('sensor.time') == states('sensor.timer_1_mb') }}
  condition:
    condition: and
    conditions:
    - condition: state
      entity_id: input_boolean.bazen
      state: 'on' 
    - condition: state
      entity_id: input_boolean.cycle1_on
      state: 'on'
  action:
    - service: input_boolean.turn_on
      entity_id: input_boolean.filtrace_mb_auto

    - service: script.run_a_cycle_mb
      data_template:
        cycle: '1'

- alias: Fitration - run_cycle_2
  initial_state: 'on'
  trigger:
  - platform: template
    value_template: >
      {{ states('sensor.time') == states('sensor.timer_2_mb') }}
  condition:
    condition: and
    conditions:
    - condition: state
      entity_id: input_boolean.bazen
      state: 'on' 
    - condition: state
      entity_id: input_boolean.cycle2_on
      state: 'on'
  action:
    - service: input_boolean.turn_on
      entity_id: input_boolean.filtrace_mb_auto
    - service: script.run_a_cycle_mb
      data_template:
        cycle: '2'

- alias: Fitration - run_cycle_3
  initial_state: 'on'
  trigger:
  - platform: template
    value_template: >
      {{ states('sensor.time') == states('sensor.timer_3_mb') }}
  condition:
    condition: and
    conditions:
    - condition: state
      entity_id: input_boolean.bazen
      state: 'on' 
    - condition: state
      entity_id: input_boolean.cycle3_on
      state: 'on'
  action:
    - service: input_boolean.turn_on
      entity_id: input_boolean.filtrace_mb_auto
    - service: script.run_a_cycle_mb
      data_template:
        cycle: '3'

#-----------------------------
# Ovladani filtrace pres MODBUS
#-----------------------------

script:
  heating_mb_toggle:
    sequence:
    - service: modbus.write_register
      data:
        hub: bazen
        unit: 1
        address: <s>1152</s>      1252 *      
        value: [16384]
    - service: modbus.write_register
      data:
         hub: bazen
         unit: 1
         address: 1241
      data_template:
        value: ["{{states('sensor.tepelne_cerpadlo_mb_num') | int}}"]
    - service: modbus.write_register
      data:
        hub: bazen
        unit: 1
        address: 752
        value: [1]
    - delay: 00:00:01
    - service: modbus.write_register
      data:
        hub: bazen
        unit: 1
        address: 757
        value: [1]
        
  filtration_mb_toggle:
    sequence:
    - service: modbus.write_register
      data:
        hub: bazen
        unit: 1
        address: 1041
        value: [0]
    - service: modbus.write_register
      data:
        hub: bazen
        unit: 1
        address: 1043
      data_template:
        value: ["{{states('sensor.filtrace_mb_num') | int}}"]
    - service: modbus.write_register
      data:
        hub: bazen
        unit: 1
        address: 752
        value: [1]
    - delay: 00:00:01
    - service: modbus.write_register
      data:
        hub: bazen
        unit: 1
        address: 757
        value: [1]

  run_a_cycle_mb:
    sequence:
      - service: homeassistant.turn_off
        data:
          enity_id: switch.filtration
      - service: script.filtration_mb_toggle
      - service: script.heating_mb_toggle
      - delay: 
           minutes: "{{states('sensor.delay_' + cycle + '_mb')}}"
      - service: input_boolean.turn_off
        data:
          entity_id: input_boolean.filtrace_mb_auto
      - delay: 00:00:01
      - service: script.heating_mb_toggle
      - delay: 00:00:03
      - service: script.filtration_mb_toggle
 
  stop_a_cycle_mb:
    sequence:
      - service: input_boolean.turn_off
        data:
          entity_id: input_boolean.filtrace_mb_auto
      - delay: 00:00:01
      - service: script.heating_mb_toggle
      - delay: 00:00:03
      - service: script.filtration_mb_toggle

WARNING: Testing on your own risk. Improper write (value, register) could cause that Hidrolife may be bricked or would require authorised repair.

*Corrected my typo >> register 1152 should be 1252

4 Likes