2024/12/27

나비엔보일러 / C2C 자동화 백업II

 




나비엔보일러 ON/OFF상태를 토글하는 가상스위치를 st에 만들지 않고 HA에 input_boolean으로 만듬. 그걸 바탕으로 템플릿스위치를 만들고 ST의 가상스위치는 on/off시 같은 동작(가동)을 하게 만듬.
이렇게 하면 보일러 가동/미가동시 toggle스위치 신호를 한번 더 보내면 되니 훨씬 간단해짐.(HA에서 스크립트를 한번 더 실행하는 것과 같은 역할)

** 나비엔 실내제어기는 명령을 받으면 wifi신호 아이콘이 몇번 깜박이고 이후 동작하게 되는데 깜박임후 아무 동작이 없으면 신호는 갔는데 명령이 씹혔다는 걸 알 수 있음. 테스트 해보니 짧은 시간에는 이상없는데 긴 휴지시간후에는 몇번 발생함.

** 구글홈 명령도 마찬가지로 신호는 가는데 명령이 씹히는 경우가 있고 온수명령은 따로 없어 ST에서 명령을 한 번 더 보내는 게 나을 수도 있음. 보통 짧은 텀을 두고 보내는 두번째 명령은 대부분 실행됐음.

** st에서 ha로 나비엔 항목을 가져오면 실내온도설정과 현재온도 확인하는 구성요소만 등록되니 그 외 필요한 항목은 st에서 나비엔 관련기능을 가상스위치로 만들면 등록가능.

** st의 가상스위치는 메뉴/실험실/가상스위치에서 만들 수 있는데 추가할때 '허브에서 등록'항목에 체크하면 클라우드 대신 허브에 만들어져 빠른 응답 가능. (뭐 여전히 나비엔 C2C로 가니 의미가 없을수도 있으나 뭐 한단계 덜 거치는 것이니)



** 나비엔 보일러 상태변경 논리스위치
input_boolean.yaml
heating:
  name: 난방
  icon: mdi:heating-coil
hotwater:
  name: 온수
  icon: mdi:coolant-temperature


** 온돌/외출모드 템플릿스위치와 온수30도/50도 템플릿스위치
** ondolnanbang/oeculmodeu, onsu50do/onsu30do는 st에서 가져온 가상스위치
switch.yaml
- platform: template
  switches:
    heater:
      friendly_name: '난방'
      unique_id: 'ondol'
      value_template: "{{ is_state('input_boolean.heating', 'on') }}"
      turn_on: #온돌난방
        - action: input_boolean.turn_on
          entity_id: input_boolean.heating
        - action: switch.toggle
          entity_id: switch.ondolnanbang
      turn_off: #외출모드
        - action: input_boolean.turn_off
          entity_id: input_boolean.heating
        - action: switch.toggle
          entity_id: switch.oeculmodeu
    heater3:
      friendly_name: '온수'
      unique_id: 'onsu'
      value_template: "{{ is_state('input_boolean.hotwater', 'on') }}"
      turn_on: #온수50도
        - action: input_boolean.turn_on
          entity_id: input_boolean.hotwater
        - action: switch.toggle
          entity_id: switch.onsu50do
      turn_off: #온수30도
        - action: input_boolean.turn_off
          entity_id: input_boolean.hotwater
        - action: switch.toggle
          entity_id: switch.onsu30do


** 야간 보일러 가동 자동화와 10분/15분/20분 타이머후 보일러 가동중지(외출모드) 자동화
automations.yaml
- id: boiler-night
  alias: boiler-night
  mode: single
  triggers:
    - trigger: time_pattern
      minutes: '/5'
  conditions:
    - condition: state
      entity_id: sun.sun
      state: below_horizon
    - condition: state
      entity_id:
        - timer.boiler7
        - timer.boiler10
        - timer.boiler15
        - timer.boiler20
      state: idle
    - condition: numeric_state
      entity_id: sensor.air_monitor_temperature
      below: 23.50
    - condition: numeric_state
      entity_id: sensor.livingroom_pvvx_temperature
      below: 23.50
    - condition: template
      value_template: >
        {% if is_state('input_select.temperature_check', 'lv2') %}
          {{ states('sensor.boiler_1_temperature') | float < 32 }}
        {% elif is_state('input_select.temperature_check', 'lv1') %}
          {{ states('sensor.boiler_1_temperature') | float < 31 }}
        {% else %}
          {{ states('sensor.boiler_1_temperature') | float < 30 }}
        {% endif %}
  actions:
    - choose:
        - conditions:
            - condition: numeric_state
              entity_id: sensor.outdoor_thmeter_temperature
              above: 7.99
          sequence:
            - action: script.boiler_7min_once
        - conditions:
            - condition: numeric_state
              entity_id: sensor.outdoor_thmeter_temperature
              below: 8.00
              above: 1.99
          sequence:
            - action: script.boiler_10min_once
        - conditions:
            - condition: numeric_state
              entity_id: sensor.outdoor_thmeter_temperature
              below: 2.00
              above: -5.00
          sequence:
            - action: script.boiler_15min_once
        - conditions:
            - condition: numeric_state
              entity_id: sensor.outdoor_thmeter_temperature
              below: -4.99
          sequence:
            - action: script.boiler_20min_once
- id: 시간-타이머/Boiler
  alias: 시간-타이머/Boiler
  mode: restart
  triggers:
    - trigger: event
      event_type: timer.finished
      event_data:
        entity_id: timer.boiler10
    - trigger: event
      event_type: timer.finished
      event_data:
        entity_id: timer.boiler15
    - trigger: event
      event_type: timer.finished
      event_data:
        entity_id: timer.boiler20
  actions:
    - action: switch.turn_off
      entity_id: switch.heater
    - delay: '00:00:15'
    - action: switch.toggle
      entity_id: switch.oeculmodeu
    - delay: '00:05:00'
    - condition: template
      value_template: "{{ states('sensor.neo03_watt') | float(0) > 50 }}"
    - action: media_player.volume_mute
      data:
        is_volume_muted: true
        entity_id: media_player.notify
    - delay: '00:00:10'
    - action: google_assistant_sdk.send_text_command
      data:
        command: '나비엔보일러 모드를 외출로 해줘'
        media_player: media_player.notify
    - delay: '00:00:30'
    - action: media_player.volume_mute
      data:
        is_volume_muted: false
        entity_id: media_player.notify


** 보일러 10분 / 20분 가동 스크립트와 가동실패시 백업 스크립트
script.yaml
boiler_backup:
  sequence:
    - action: switch.toggle
      entity_id: switch.ondolnanbang
    - delay: '00:00:15'
    - condition: template
      value_template: "{{ states('sensor.neo03_watt') | float(0) < 10 }}"
    - action: media_player.volume_mute
      data:
        is_volume_muted: true
        entity_id: media_player.notify
    - action: google_assistant_sdk.send_text_command
      data:
        command: '나비엔보일러 모드를 온돌로 해줘'
        media_player: media_player.notify
    - delay: '00:00:30'
    - action: media_player.volume_mute
      data:
        is_volume_muted: false
        entity_id: media_player.notify
boiler_10min_once:
  sequence:
    - service: switch.turn_on
      entity_id: switch.heater
    - service: timer.start
      entity_id: timer.boiler10
    - delay: '00:00:30'
    - condition: template
      value_template: "{{ states('sensor.neo03_watt') | float(0) < 10 }}"
    - service: script.turn_on
      entity_id: script.boiler_backup
boiler_20min_once:
  sequence:
    - service: switch.turn_on
      entity_id: switch.heater
    - service: timer.start
      entity_id: timer.boiler20
    - delay: '00:00:30'
    - condition: template
      value_template: "{{ states('sensor.neo03_watt') | float(0) < 10 }}"
    - service: script.turn_on
      entity_id: script.boiler_backup