воскресенье, 21 июня 2020 г.

Автоматизация работы бойлера в Home Assistant

         Представляю свою автоматизацию работы бойлера в системе Home Assistant для сети с двухтарифным счетчиком (день-ночь) на основе модуля Sonoff POW с прошивкой ESPHome. Использован модуль Sonoff POW прошитый по инструкции из этой статьи. Кроме того, можно использовать другие модули или умные розетки с функцией измерения потребляемой мощности и отключения по Wifi. В этом случае необходимо в файлах автоматизации заменить название сенсора потребляемой мощности (sensor.sonoff_pow_power) и выключатель питания (switch.sonoff_pow_relay) заменить на свои.


        Данная автоматизация подходит для бойлеров, которые при подаче питания сразу же начинают нагрев воды. Это практически все бойлеры с механическим управлением, а также бойлеры с электроникой, которые сохраняют свое состояние при включении. И соответственно, автоматизация не будет работать на тех бойлерах, которые после включения в сеть требуют дополнительной настройки кнопками на передней панели (установки температуры и т.д.).
       К сети бойлер подключается через Sonoff POW прошитый альтернативной прошивкой ESPHome:



     Дальше опишу что делает данная автоматизация: 
       На основе показаний сенсора потребляемой мощности (sensor.sonoff_pow_power) рассчитываются значения для 12 сенсоров:
1. Потребление электроэнергии за сутки в kWh (кВт·ч): sensor.energy_total_day_sonoff_pow_001
2. Потребление электроэнергии за сутки по дневному тарифу в kWh (кВт·ч): sensor.sonoff_pow_daily_energy_001_day
3. Потребление электроэнергии за сутки по ночному тарифу в kWh (кВт·ч): sensor.sonoff_pow_daily_energy_001_night
4. Потребление электроэнергии за неделю в kWh (кВт·ч): sensor.energy_total_weekly_sonoff_pow_001
5. Потребление электроэнергии за неделю по дневному тарифу в kWh (кВт·ч): sensor.sonoff_pow_weekly_energy_001_day
6. Потребление электроэнергии за неделю по ночному тарифу в kWh (кВт·ч): sensor.sonoff_pow_weekly_energy_001_night
7. Потребление электроэнергии за месяц в kWh (кВт·ч): sensor.energy_total_month_sonoff_pow_001
8. Потребление электроэнергии за месяц по дневному тарифу в kWh (кВт·ч): sensor.sonoff_pow_monthly_energy_001_day
9. Потребление электроэнергии за месяц по ночному тарифу в kWh (кВт·ч): sensor.sonoff_pow_monthly_energy_001_night
10. Стоимость потребленной энергии за день согласно тарифов двухтарифного счетчика: sensor.energy_payment_day_sonoff_pow_001
11. Стоимость потребленной энергии за неделю согласно тарифов двухтарифного счетчика: sensor.energy_payment_week_sonoff_pow_001
12. Стоимость потребленной энергии за месяц согласно тарифов двухтарифного счетчика: sensor.energy_payment_month_sonoff_pow_001

    Также есть две схемы автоматизации:
1) Режим «Ночной тариф» – если он включен, то происходит автоматическое включение питания бойлера вечером (если перед бойлер был выключен), с наступлением ночного тарифа и его выключение утром (если бойлер на тот момент включен), по его окончанию. 
2) Режим «Автоотключение бойлера» – если он включен, то после окончания нагрева бойлера происходит отключение питания. Повторно его можно включить либо из Home assistant, либо нажав кнопку на Sonoff POW. После нажатия данной кнопки если бойлер не потребляет электроэнергию более 5 мин. (вода горячая, нагрев не требуется) – он снова отключится от сети.

       Автоматизация выполнена в виде Packages. Это дает возможность с легкостью делать другие такие автоматизации в Home Assistant. Например, если хотите добавить такую же автоматизацию для термопота достаточно создать копию файла boiler.yaml с именем thermopot.yaml, заменить название сенсора sensor.sonoff_pow_power на то, показывает значение потребляемой мощности термопотом и все сенсоры вида sensor.***001* на sensor.***002*

Далее непосредственно сама автоматизация:
      В configuration.yaml прописываем расположение файла packages и ввод тарифов за электроэнергию:


homeassistant:
 packages:
    pack_2: !include boiler.yaml

input_number:
  energy_tariff_day:
    name: Дневной тариф (Т1)
    min: 0.1
    max: 3
    step: 0.01
    mode: box
  energy_tariff_night:
    name: Ночной тариф (Т2)
    min: 0.1
    max: 3
    step: 0.01
    mode: box

    Файл boiler.yaml:


#############################################################################################
#   Входные датчики:   sensor.sonoff_pow_power - Текущая потребляема мощность от SonOff POW
#   Выходные датчики:
#   ** Потребление по дневному, ночному тарифу, общее за месяц в kWh (кВт·ч) **
#      sensor.sonoff_pow_monthly_energy_001_day
#      sensor.sonoff_pow_monthly_energy_001_night
#      sensor.energy_total_month_sonoff_pow_001
#   ** Потребление по дневному, ночному тарифу, общее за неделю в kWh (кВт·ч) **
#      sensor.sonoff_pow_weekly_energy_001_day
#      sensor.sonoff_pow_weekly_energy_001_night
#      sensor.energy_total_weekly_sonoff_pow_001
#   ** Потребление по дневному, ночному тарифу, общее за сутки в kWh (кВт·ч) **
#      sensor.sonoff_pow_daily_energy_001_day
#      sensor.sonoff_pow_daily_energy_001_night
#      sensor.energy_total_day_sonoff_pow_001
#   ** Стоимость потребленной энергии за день, месяц, год согласно тарифов **
#      sensor.energy_payment_day_sonoff_pow_001
#      sensor.energy_payment_week_sonoff_pow_001
#      sensor.energy_payment_month_sonoff_pow_001
##############################################################################################
#                    Блог автора https://mynobook.blogspot.com
##############################################################################################

sensor:
  - platform: integration
    source: sensor.sonoff_pow_power
    name: energy_sonoff_pow_001
    unit_prefix: k
    round: 3
  - platform: template
    sensors:
      energy_total_month_sonoff_pow_001:
        friendly_name: Потребление за месяц
        unit_of_measurement: "kWh"
        icon_template: "mdi:counter"
        value_template: "{{(states('sensor.sonoff_pow_monthly_energy_001_day')|float+states('sensor.sonoff_pow_monthly_energy_001_night')|float)|round(2)}}"

      energy_total_weekly_sonoff_pow_001:
        friendly_name: Потребление за неделю
        unit_of_measurement: "kWh"
        icon_template: "mdi:counter"
        value_template: "{{(states('sensor.sonoff_pow_weekly_energy_001_day')|float+states('sensor.sonoff_pow_weekly_energy_001_night')|float)|round(2)}}"

      energy_total_day_sonoff_pow_001:
        friendly_name: Потребление за день
        unit_of_measurement: "kWh"
        icon_template: "mdi:counter"
        value_template: "{{(states('sensor.sonoff_pow_daily_energy_001_day')|float+states('sensor.sonoff_pow_daily_energy_001_night')|float)|round(2)}}"

      energy_payment_day_sonoff_pow_001:
        friendly_name: Сумма за день
        unit_of_measurement: "₴"
        icon_template: "mdi:cash-100"
        value_template: "{{(states('sensor.sonoff_pow_daily_energy_001_day')|float*states('input_number.energy_tariff_day')|float+states('sensor.sonoff_pow_daily_energy_001_night')|float*states('input_number.energy_tariff_night')|float)|round(2)}}"

      energy_payment_week_sonoff_pow_001:
        friendly_name: Сумма за неделю
        unit_of_measurement: "₴"
        icon_template: "mdi:cash-100"
        value_template: "{{(states('sensor.sonoff_pow_weekly_energy_001_day')|float*states('input_number.energy_tariff_day')|float+states('sensor.sonoff_pow_weekly_energy_001_night')|float*states('input_number.energy_tariff_night')|float)|round(2)}}"

      energy_payment_month_sonoff_pow_001:
        friendly_name: Сумма за месяц
        unit_of_measurement: "₴"
        icon_template: "mdi:cash-100"
        value_template: "{{(states('sensor.sonoff_pow_monthly_energy_001_day')|float*states('input_number.energy_tariff_day')|float+states('sensor.sonoff_pow_monthly_energy_001_night')|float*states('input_number.energy_tariff_night')|float)|round(2)}}"

input_boolean:
    boiler_001_night:
        name: Automation only night tariff
        initial: on
        icon: mdi:calendar-check
    boiler_001_auto_off:
        name: Boiler autopower Off
        # initial: on
        icon: mdi:flash-auto

utility_meter:
  sonoff_pow_daily_energy_001:
    source: sensor.energy_sonoff_pow_001
    cycle: daily
    tariffs:
      - day
      - night
      
  sonoff_pow_weekly_energy_001:
    source: sensor.energy_sonoff_pow_001
    cycle: weekly
    tariffs:
      - day
      - night     
      
  sonoff_pow_monthly_energy_001:
    source: sensor.energy_sonoff_pow_001
    cycle: monthly
    tariffs:
      - day
      - night


automation:  
# Переключение тарифов день-ночь
  - id: switch_energy_tariffs_001
    alias: switch energy tariffs_001
    initial_state: true
    trigger:
      - platform: homeassistant
        event: start
      - platform: time
        at: '07:00:00'
      - platform: time
        at: '23:00:00'
    action:
      - service: utility_meter.select_tariff
        data_template:
          entity_id:
            - utility_meter.sonoff_pow_daily_energy_001
            - utility_meter.sonoff_pow_monthly_energy_001
            - utility_meter.sonoff_pow_weekly_energy_001
          tariff: '{%- if 7<= (now().strftime("%-H") | int) < 23 -%}day{%- else -%}night{%- endif -%}'
        
#                            Автоотключение бойлера
# Если потребление бойлера менее 10Вт в течение 1 минуты по дневному тарифу, то отключить бойлер
  - id: auto_boiler_off_001 
    alias: "Boiler Auto Power OFF"
    initial_state: true
    # hide_entity: true
    trigger:
      - platform: numeric_state
        entity_id: sensor.sonoff_pow_power
        below: 10
        for: 
          minutes: 1
    condition:
      - condition: state
        entity_id: input_boolean.boiler_001_auto_off
        state: 'on'
      - condition: state
        entity_id: switch.sonoff_pow_relay
        state: 'on'
      - condition: time
        after: '07:00:00'
        before: '23:00:00'
    action:
      - service: switch.turn_off
        data:
          entity_id: switch.sonoff_pow_relay
          
# Ночной режим - автоматическое включение бойлера в 23:05 (если выключен)
  - id: boiler_on_23_001 
    alias: "Boiler Power ON"
    initial_state: true
    # hide_entity: true
    trigger:
      - platform: time
        at: "23:05:00"
    condition:
      - condition: state
        entity_id: input_boolean.boiler_001_night
        state: 'on'
      - condition: state
        entity_id: switch.sonoff_pow_relay
        state: 'off'
    action:
      - service: switch.turn_on
        data:
          entity_id: switch.sonoff_pow_relay
          
# Ночной режим - автоматическое выключение бойлера в 06:55 (если включен)
  - id: boiler_off_7_001 
    alias: "Boiler Power ON"
    initial_state: true
    # hide_entity: true
    trigger:
      - platform: time
        at: "06:55:00"
    condition:
      - condition: state
        entity_id: input_boolean.boiler_001_night
        state: 'on'
      - condition: state
        entity_id: switch.sonoff_pow_relay
        state: 'on'
    action:
      - service: switch.turn_off
        data:
          entity_id: switch.sonoff_pow_relay

       В файл ui-lovelace.yaml необходимо дописать вкладку "Бойлер". У меня адаптировано для просмотра с телефона:


# Вкладка ****     Бойлер    ****            
  - type: vertical-stack
    title: Бойлер
    icon: 'mdi:water-boiler'
    cards:
          - type: entities
            show_header_toggle: false
            entities:
              - entity: switch.sonoff_pow_relay
                name: Питание бойлера
                secondary_info: last-changed
                icon: 'mdi:power-standby'
              - entity: input_boolean.boiler_001_night
                name: Ночной режим
              - entity: input_boolean.boiler_001_auto_off
                name: Автоотключение бойлера
              - entity: sensor.sonoff_pow_power
                name: Потребление сейчас
                icon: 'mdi:gauge'

          - type: glance
            title: Потребление эл./энергии за день
            columns: 3
            entities:
              - entity: sensor.energy_total_day_sonoff_pow_001
                name: Всего
                icon: 'mdi:counter'            
              - entity: sensor.sonoff_pow_daily_energy_001_day
                name: Тариф "День"
                icon: 'mdi:counter' 
              - entity: sensor.sonoff_pow_daily_energy_001_night
                name: Тариф "Ночь"
                icon: 'mdi:counter' 
                
          - type: glance
            title: Потребление эл./энергии за неделю
            columns: 3
            entities:
              - entity: sensor.energy_total_weekly_sonoff_pow_001
                name: Всего
                icon: 'mdi:counter'            
              - entity: sensor.sonoff_pow_weekly_energy_001_day
                name: Тариф "День"
                icon: 'mdi:counter' 
              - entity: sensor.sonoff_pow_weekly_energy_001_night
                name: Тариф "Ночь"
                icon: 'mdi:counter' 

          - type: glance
            title: Потребление эл./энергии за месяц
            columns: 3
            entities:
              - entity: sensor.energy_total_month_sonoff_pow_001
                name: Всего
                icon: 'mdi:counter'            
              - entity: sensor.sonoff_pow_monthly_energy_001_day
                name: Тариф "День"
                icon: 'mdi:counter' 
              - entity: sensor.sonoff_pow_monthly_energy_001_night
                name: Тариф "Ночь"
                icon: 'mdi:counter' 


#  Начислено
          - type: glance
            title: Начислено за потребление бойлера
            column_width: calc(100% / 3)
            entities:
              - entity: sensor.energy_payment_day_sonoff_pow_001
                name: За день
              - entity: sensor.energy_payment_week_sonoff_pow_001
                name: За неделю

              - entity: sensor.energy_payment_month_sonoff_pow_001
                name: За месяц
                icon: 'mdi:counter'
                
# Ввод тарифов
          - type: glance
            title: Тарифы на электроэнергию (₴ за кВт·ч)
            column_width: calc(100% / 2)
            entities:
              - entity: input_number.energy_tariff_day
                name: Дневной тариф
              - entity: input_number.energy_tariff_night
                name: Ночной тариф

        Как это выглядит на телефоне:


На все адекватные вопросы отвечу в комментариях.

        UPD 14.09.2022:  К сожалению utility_meter.select_tariff теперь недоступен. Вместо нее следует использовать select.select_option. Изменения коснулись не только этой команды, так что позднее придется переделать всю автоматизацию управлением бойлером, чтоб избежать проблем в будущем. В качестве временного решения, чтоб восстановить работоспособность достаточно в файле  boiler.yaml заменить строки:

# Переключение тарифов день-ночь
  - id: switch_energy_tariffs_001
    alias: switch energy tariffs_001
    initial_state: true
    trigger:
      - platform: homeassistant
        event: start
      - platform: time
        at: '07:00:00'
      - platform: time
        at: '23:00:00'
    action:
      - service: select.select_option
        entity_id:
          - utility_meter.sonoff_pow_daily_energy_001
          - utility_meter.sonoff_pow_monthly_energy_001
          - utility_meter.sonoff_pow_weekly_energy_001
        data:
          option: '{%- if 7<= (now().strftime("%-H") | int) < 23 -%}day{%- else -%}night{%- endif -%}'

на

# Переключение тарифов день-ночь
  - id: switch_energy_tariffs_001
    alias: switch energy tariffs_001
    initial_state: true
    trigger:
      - platform: time
        at: "07:00:00"
        variables:
          tariff: "day"
      - platform: time
        at: "23:00:00"
        variables:
          tariff: "night"
    action:
      - service: select.select_option
        target:
          entity_id: select.sonoff_pow_daily_energy_001
        data:
          option: "{{ tariff }}"
      - service: select.select_option
        target:
          entity_id: select.sonoff_pow_monthly_energy_001
        data:
          option: "{{ tariff }}"
      - service: select.select_option
        target:
          entity_id: select.sonoff_pow_weekly_energy_001
        data:
          option: "{{ tariff }}"

  UPD 25.09.2022: Новая актуальная версия статьи "Автоматизация работы бойлера в Home Assistant (новая версия)" в которой учтены все нововведения  интеграции Utility Meter на текущий момент.

19 комментариев:

  1. Спасибо большое за статью.
    Проблема с которой я столкнулся при использовании бойлера + розетка Xiaomi Mi Smart Socket или Broadlink SP3S:
    Если умная розетка выключается вручную через HA то через пару часов после включения добавляет kWh в потребление за день, хотя потребление по сенсору "sensor.sonoff_pow_power" нулевое за весь период отключения.
    К примеру выключил вручную в 19:30 с 6 kWh за день, включаю в 22:30 и сразу мгновенно получаю 7,67 kWh за день.
    Буду благодарен за подсказку.

    ОтветитьУдалить
    Ответы
    1. На сенсоре sensor.energy_sonoff_pow_001 тоже добавляется?

      Удалить
    2. Также для корректного подсчета мощности показания текущей мощности (сенсор sensor.sonoff_pow_power) должен измеряться обязательно в "W"
      Еще можно временно добавить в лавлейс значения датчиков sensor.energy_sonoff_pow_001, sensor.sonoff_pow_daily_energy_001_day, sensor.sonoff_pow_daily_energy_001_night, sensor.energy_sonoff_pow и понаблюдать откуда идет погрешность

      Удалить
    3. на sensor.sonoff_pow_power измерение идет в W, если switch.sonoff_pow_relay не трогать то всё считается корректно, получается что при отключении розетки счетчик energy_total_day_sonoff_pow_001 считает время отключения розетки как потребление хотя по графику там 0.

      Пока временно решил проблему установкой управляемого реле питания бойлера перед розеткой.

      Возможно дело в том как розетка отдает показатели потребления в выключенном состоянии, у меня на broadlink и xiaomi при выключении сенсор не обновляется до момента включения, а у вас на sonoff постоянно обновляет текущее потребление даже в выключенном состоянии.

      Удалить
    4. приветствую, столкнулся с той же проблемой и на моем sonoff pow r2. тут решение https://community.home-assistant.io/t/integration-sensor-wrong-inaccurate/150544/39

      использовать method: left

      - platform: integration
      source: sensor.boiler_power
      name: energy_boiler_power4_001
      unit_prefix: k
      round: 3
      method: left

      Удалить
  2. Хорошая статья.
    А можно добавить температуру,например с датчика DS18B20

    ОтветитьУдалить
    Ответы
    1. Можно подключить DS18B20 к одному из свободных выводов SONOFF POW и добавить его в ESPHome как тут https://esphome.io/components/sensor/dallas.html
      И в автоматизацию добавить действие при достижении температуры (Например включить, если температура воды станет ниже определенного значения).

      Удалить
  3. Здравствуйте подскажите как ра работает режим автовыключение? включил его он выключил бойлер черз 1 мин при нагрузке меньше 10 ват. Потом решил еще раз включить бойлер через несколько минут, и после этого он уже не выключает автовыключение

    ОтветитьУдалить
    Ответы
    1. У меня выключается бойлер через 1 минуту маленького потребления тока столько раз, сколько его включаешь.
      Чтобы триггер сработал должно быть соблюдено три условия: Кнопка автоотключения включена (input_boolean.boiler_001_auto_off = on), время по Home Assistant (sensor.time) должно быть между 7:00 и 23:00. И реле включения бойлера должно быть включено (switch.sonoff_pow_relay = on)
      Проверьте эти условия через "Панель разработчика"

      Удалить
  4. Как очистить все значения? Чтобы считало все заново.

    ОтветитьУдалить
    Ответы
    1. Они сами обнулятся через время

      Удалить
    2. Не я хочу очистить все потому как делал тесты. И хочется чтобы уже считало с нуля.

      Удалить
    3. Все значения хранятся в Вашем Home Assistant. Попробуйте необходимым сущностям задать нулевые значения как описано тут: https://kvvhost.ru/2020/05/03/python-set-state-ha/

      Удалить
  5. Приветствую. После обновления 2022.9.0 получил ошибку, что сервис utility_meter.select_tariff потерялся. До обновления всё работало нормально. switch energy tariffs_001 uses an unknown service
    The automation "switch energy tariffs_001" (automation.switch_energy_tariffs_001) has an action that calls an unknown service: utility_meter.select_tariff.

    This error prevents the automation from running correctly. Maybe this service is no longer available, or perhaps a typo caused it.

    To fix this error, edit the automation and remove the action that calls this service.

    Click on SUBMIT below to confirm you have fixed this automation.

    ОтветитьУдалить
    Ответы
    1. Да, действительно, теперь utility_meter.select_tariff недоступен. Вместо нее следует использовать select.select_option. Будет время - переделаю автоматизацию.

      Удалить
    2. В конце статьи добавил вариант решения данной проблемы

      Удалить
    3. Спасибо, проверю. Самостоятельно решить проблему не вышло.

      Удалить
    4. Новая актуальная версия статьи https://mynobook.blogspot.com/2022/09/boiler2.html в которой учтены все нововведения интеграции Utility Meter на текущий момент.

      Удалить