Home AssistantНалаштування

Додаємо Gyver Lamp в Home Assistant та Google Home

Вітаю. Сьогоднішній огляд буде, скоріше, про елемент декору, аніж елемент розумного будинку. Хоча, керувати цим девайсом можна і з «хабів» розумного будинку, і навіть за допомогою розумних колонок. Керування з колонок буде трошки обмежене, але про це в тексті нижче. В статті сьогодні розглянемо DIY-проект, що має назву «Лампа Гайвера»,  або «Gyver Lamp». Думаю, робити її огляд тут немає сенсу, багато хто знає, що це за проект, а хто не знає перейдіть за посиланням для перегляду відео.

Gyver Lamp

Існує декілька популярних прошивок мікроконтролера ESP8266 NodeMCU, що є мозком пристрою, але для того, щоб наша лампа мала можливість керування з “Home Assistant”, потрібна підтримка протоколу MQTT. Розглянемо дві прошивки з його підтримкою.

Прошивка від Palpalych (на основі Gunner47)

Посилання на прошивку

Для початку створимо “органи керування” лампою в Home Assistant:

файл configuration.yaml:

input_number: !include includes/input_number.yaml
input_select: !include includes/input_select.yaml
input_boolean: !include includes/input_boolean.yaml
light: !include includes/light.yaml
automation: !include_dir_merge_list automations

файл /config/includes/input_number.yaml:

  brightness:
    name: Brightness
    initial: 10
    min: 1
    max: 255
    step: 1
    icon: mdi:brightness-6
  speed:
    name: Speed
    initial: 30
    min: 0
    max: 255
    step: 1
    icon: mdi:speedometer
  scale:
    name: Scale
    initial: 30
    min: 1
    max: 100
    step: 1
    icon: mdi:ruler

файл /config/includes/input_select.yaml:

  ledlamp_mode:
    name: LedLamp Mode
    options:
      - "0"
      - "1"
      - "2"
      - "3"
      - "4"
      - "5"
      - "6"
      - "7"
      - "8"
      - "9"
      - "10"
      - "11"
      - "12"
      - "13"
      - "14"
      - "15"
      - "16"
      - "17"
      - "18"
      - "19"
      - "20"
      - "21"
      - "22"
      - "23"
      - "24"
      - "25"
    icon: mdi:star-box-multiple-outline

Створимо віртуальний вимикач, при його спрацюванні буде виконуватись певна послідовність команд, що будуть, в тому числі, відправлятися і на лампу (ввімкнеться нічний режим ). Пізніше цей вимикач знадобиться для прокидання в Google assistant

файл /config/includes/input_boolean.yaml:

virt_sleepingmode:
    name: Sleeping Mode
    initial: off
    icon: mdi:sleep

Також створимо mqtt лампу в файлі /config/includes/light.yaml

файл /config/includes/light.yaml:

  - platform: mqtt
    schema: template
    #Слово bulb дасть змогу “Google Home app” розпізнати пристрій як лампу
    name: "Gyver bulb"  
    command_topic: "LedLamp/LedLamp_006B956E/cmnd"
    state_topic: "LedLamp/LedLamp_006B956E/state"
    command_on_template: "P_ON"
    command_off_template: "P_OFF"
    state_template: "{% if value.split(' ')[5] == '0' %}off{% else %}on{% endif %}"  # must return `on` or `off`
    qos: 1
    retain: true
    optimistic: false

Після перезавантаження маємо можливість створити картку:

lovelace card

Код картки lovelace:

type: entities
show_header_toggle: false
entities:
- entity: light.gyver_bulb
- entity: input_number.brightness
- entity: input_number.speed
- entity: input_number.scale
- entity: input_select.ledlamp_mode

Але, покищо органи керування ніяк не діють (окрім вмикання\вимикання), тому створимо окремий файл, що буде містити в собі правила, що стосуються управління лампою

файл /config/automations/gyverlamp.yaml:


- alias: Gyver Brightness
  id: SET_Gyver_Brightness
  trigger:
    platform: state
    entity_id: input_number.brightness
  action:
    - service: mqtt.publish
      data_template:
        topic: LedLamp/LedLamp_006B956E/cmnd
        payload_template: BRI{{trigger.to_state.state | int }} # Задаємо яскравість
- alias: Gyver Speed
  id: SET_Gyver_Speed
  trigger:
    platform: state
    entity_id: input_number.speed
  action:
    - service: mqtt.publish
      data_template:
        topic: LedLamp/LedLamp_006B956E/cmnd
        payload_template: SPD{{trigger.to_state.state | int }} # Задаємо швидкість ефекту
- alias: Gyver Scale
  id: SET_Gyver_Scale
  trigger:
    platform: state
    entity_id: input_number.scale
  action:
    - service: mqtt.publish
      data_template:
        topic: LedLamp/LedLamp_006B956E/cmnd
        payload_template: SCA{{trigger.to_state.state | int }} # Задаємо розмір ефекту
- alias: Set Gyver Mode
  id: Set_Gyver_Mode
  trigger:
    platform: state
    entity_id: input_select.ledlamp_mode
  action:
    - service: mqtt.publish
      data_template:
        retain: true
        topic: LedLamp/LedLamp_006B956E/cmnd
        payload: EFF{{states('input_select.ledlamp_mode') }} # Задаємо ефект

- alias: Gyver_on_at_sleepingmode
  id: Gyver_on_at_sleepingmode
  initial_state: true
  trigger:
    platform: state
    entity_id: input_boolean.virt_sleepingmode
    to: 'on'
  action:
    # нижче послідовність команд, що виконуються після спрацювання віртуального вимикача input_boolean.virt_sleepingmode
    - service: mqtt.publish
      data_template:
      topic: LedLamp/LedLamp_006B956E/cmnd
      payload_template: P_ON # Вмикаємо лампу
    - delay:
      milliseconds: 500
    - service: mqtt.publish
      data_template:
        topic: LedLamp/LedLamp_006B956E/cmnd
        payload_template: EFF21 # Задаємо ефект
    - delay:
        milliseconds: 500
    - service: mqtt.publish
      data_template:
        topic: LedLamp/LedLamp_006B956E/cmnd
        payload_template: BRI4 # Задаємо яскравість
    - delay:
        milliseconds: 500
    - service: mqtt.publish
      data_template:
        topic: LedLamp/LedLamp_006B956E/cmnd
        payload_template: SPD200 # Задаємо швидкість ефекту
    - delay:
        milliseconds: 500
    - service: mqtt.publish
      data_template:
        topic: LedLamp/LedLamp_006B956E/cmnd
        payload_template: SCA10 # Задаємо розмір ефекту
    - delay:
        milliseconds: 1000
    - service: mqtt.publish
      data_template:
        topic: LedLamp/LedLamp_006B956E/cmnd
        payload_template: TMR_SET 1 3 3600 # вмикаємо таймер на вимкнення на 3600 секунд (1 година)

Як видно з mqtt топіків в автоматизації, і це підтверджує документація, в цій прошивці формат повідомлення наступний:

P_ON - включить матрицу
P_OFF - выключить матрицу
EFF0 - сделать активным эффект №0 (нумерация с нуля)
BRI44 - установить яркость 44; диапазон [1..255]
SPD3 - установить скорость 3; диапазон [1..255]
SCA1 - установить масштаб 1; диапазон [1..100]
…...
"TMR 1 3 300"
TMR - идентификатор команды, TMR - таймер
1 - признак "таймер взведен"
3 - опция "выключить лампу через ...", цифра указывает на номер значения в выпадающем списке: 1 - не выключать, 2 - 1 минута... (см. в приложении)
300 - количество секунд, через которое выключится лампа (0 - не выключать)

Такий формат повідомлень дозволяє керувати кожним параметром пристрою окремо, крім того, лампа має власний таймер вимикання, який не залежить від таймерів Home Assistant.


Після перезавантаження автоматизацій ви можете керувати лампою з інтерфейсу Home Assistant. Якщо до вашого Google Home app вже додано інтеграцію Hassio (Home Assistant), після оновлення списку пристроїв у додатку (Hey google, sync my devices) у вас з’явиться два нових девайси – лампа і вимикач.

   

В останньому розділі статті, маєте змогу дізнатися про особливості керування ”Лампою Гайвера” за допомогою Google Home app і смарт-спікерів.

Прошивка від Whilser

Посилання на прошивку

Ця прошивка має інший формат mqtt повідомлень, і саме з цією прошивкою вам не треба “паритись” про їхній формат. Є можливість керувати пристроєм за допомогою веб-інтерфейсу, що дуже зручно, там також є змога вмикати і вимикати підтримку mqtt, та змінювати адресу mqtt брокера. Прошивка має функцію “mqtt discovery”, тобто вже після  підключення, пристрій автоматично з’явиться в системі, в списку девайсів mqtt інтеграції. Але якщо ви хочете керувати лампою Гайвера з графічного інтерфейсу Lovelace, звичайно треба створити органи керування в картці lovelace. Як створити “органи керування лампою” можна почитати на сторінці прошивки на Github, але для себе я додав ще керування яскравістю лампи і input_select для вибору режиму, хоча обидва параметри можна змінювати в спливаючому вікні лампи, але мені зручніше напряму, з lovelace картки. Отже, як і в попередній прошивці додаємо input_number:

Spoiler

  brightness:
    name: brightness
    initial: 30
    min: 0
    max: 255
    step: 1
    icon: mdi:brightness-6

та, в залежності від мови, input_select (нижче англійський варіант)

Spoiler

  ledlamp_mode:
    name: LedLamp Mode
    options:
       - Confetti
       - Fire
       - Rainbow vert
       - Rainbow Horiz
       - Color change
       - 3D Madness
       - 3D clouds
       - 3D lava
       - 3D plasma
       - 3D rainbow
       - 3D peacock
       - 3D zebra
       - 3D forest
       - 3D ocean
       - Color
       - Snowfall
       - Matrix
       - Fireflies
       - Aquarium
       - Starfall
       - Paintball
       - Spiral
       - Warm Light
       - Pendulum
       - Twinkles
       - Police Strobo
       - Incremental Drift Rose
       - Pride
       - Butterflys
       - Demo
    icon: mdi:star-box-multiple-outline

До вже описаних на Github автоматизацій додаємо ще дві:

Spoiler

- alias: Gyver brightness
  trigger:
    platform: state
    entity_id: input_number.brightness
  action:
  - service: mqtt.publish
    data_template:
    topic: homeassistant/light/ESP-6b956e/effect/brightness/set
     payload_template: "{{ trigger.to_state.state | int }}"
  id: SET_Gyver_brightness

- alias: Set Gyver Mode
  trigger:
    platform: state
    entity_id: input_select.ledlamp_mode
  action:
    service: mqtt.publish
    data_template:
      retain: true
    topic: homeassistant/light/ESP-6b956e/effect/set
    payload_template: "{{ states('input_select.ledlamp_mode') }}"
  id: Set_Gyver_Mode

Оскільки прошивка не має вбудованого таймера, додаємо свій, наприклад таймер на 1 годину. Це на той випадок, коли лампу увімкнули за допомогою раніше створеного віртуального вимикача «virt_sleepingmode» (як в першій прошивці), наприклад за допомогою смарт-спікеру.

В configuration.yaml

timer: !include includes/timer.yaml

в /config/includes/timer.yaml

gyverlamp_1h_off:
  duration: '01:00:00'

Також додаємо правило автоматизації, яке буде вимикати лампу після «закінчення» таймера

Spoiler

#   Вимикаємо gyverlamp після спрацювання таймера на годину
- alias: Gyverlamp_off_1h_timer
  initial_state: true
  trigger:
  - platform: event
    event_type: timer.finished
    event_data:
        entity_id: timer.gyverlamp_1h_off
  condition:
    - condition: state
      entity_id: light.gyver_bulb
      state: 'on'
  action:
    - service: light.turn_off
      data:
        entity_id: light.gyver_bulb
    - service: timer.cancel
      entity_id: timer.gyverlamp_1h_off

Створимо правило, яке передасть пристрою певну послідовність команд при увімкненні віртуального вимикача «virt_sleepingmode»

Spoiler

- alias: Gyver_on_at_sleepingmode 
  id: Gyver_on_at_sleepingmode
  initial_state: true
  trigger:
    platform: state
    entity_id: input_boolean.virt_sleepingmode
    to: 'on'
  action:
  # нижче послідовність команд, що виконуються після спрацювання віртуального вимикача input_boolean.virt_sleepingmode
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-6b956e/switch
        payload_template: ON     # Вмикаємо лампу
    - delay:
        milliseconds: 500
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-6b956e/effect/set
        payload_template: ‘Fire’     # Задаємо ефект
    - delay:
        milliseconds: 500
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-6b956e/effect/brightness/set
        payload_template: 4     # Задаємо яскравість
    - delay:
        milliseconds: 500
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-6b956e/effect/speed/set
        payload_template: 200     # Задаємо швидкість ефекту
    - delay:
        milliseconds: 500
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-6b956e/effect/scale/set
        payload_template: 10    # Задаємо розмір ефекту
    - delay:
        milliseconds: 1000
    - service: timer.start
      entity_id: timer.gyverlamp_1h_off     # вмикаємо таймер який вимкне лампу через 1 годину

Звичайно, в цьому правилі ви можете обрати інший ефект, та задати йому відповідні параметри

Керування «Лампою Гайвера» за допомогою Google Home app та розумною колонкою

Позаяк прошивки на основі Gunner47 не мають «mqtt discovery», то ми вимушені створювати лампу вручну, крім того, лампу, що прийде в «Google Home app» з HA, ми можемо лише вмикати та вимикати, є можливість додати керування яскравістю за допомогою шаблонів в HA, але не більше, тобто кольором керувати ми не можемо, причина в форматі повідомлень mqtt. Прошивка від  Whilser автоматично «створює» лампу в системі, і коли вона «прилетить» до Google Home app, ми можемо керувати і яскравістю лампи, і кольором

google home brightness google home color

Створений перед цим віртуальний вимикач дозволить напряму, зі спікера вмикати раніше налаштований ефект, наприклад «палаюче полум’я». Цю можливість можна використати під час, наприклад, вечірнього сну, коли ви кажете смарт-спікеру «hey, google, goodnight!». В такому разі google assistant увімкне (на одну годину) звуки палаючого каміну та «клікне» по virt_sleepingmode, який увімкне «палаюче полум’я» на Лампі Гайвера. Звичайно, до цього вам необхідно вибрати мелодію для сну, і додати необхідний вимикач в «Routines»

google assistant routines google assistant routines google assistant routines

На жаль, перемикання ефектів та зміна їх параметрів в смарт-спікерах не передбачена, в документації до прошивки від Whilser описано про можливість додавання компонента «телевізор» в Apple Home Kit, та керування ефектами за його допомогою, але перевірити як це працює у мене можливості немає. Можливо подібний варіант існує і для «google home», проте інформації я не знайшов.

PS: Хочу зазначити, що, з невідомих мені причин, лампа з прошивкою “Whilser” іноді втрачає зв’язок з mqtt брокером, в такому випадку вона може зависнути на декілька секунд, а іноді й перезавантажується увімкнувшись білим яскравим світлом, така поведінка девайсу заважає спокійному сну. Ця проблема в парі з відсутністю власного таймера на борту схилила мій вибір на користь прошивок на основі Gunner47

2 thoughts on “Додаємо Gyver Lamp в Home Assistant та Google Home

  • Подача материала отличная, спасибо за ваш труд.

    Ниже “После перезагрузки имеем возможность создать карточку” в заголовке спойлера: файл /config/includes/light.yaml (повторно), так и должно быть?

Залишити відповідь