Умный дом на Home Assistant и 3D печать.
 
Telegram-канал FoxJoy
Почта: dm@foxfoy.ru
Управление Home Assistant через MeshCore

Управление Home Assistant через MeshCore

Если сеть MeshCore в городе развита, то вполне себе неплохой выход из положения, если нет Интернета.
Можно получать различные уведомления (например произошла протечка, или сработал датчик дыма), есть возможность делать опрос различных датчиков (например температура, влажность и т.д.), ну и конечно можно включать и выключать различные приборы, открывать/закрывать ворота и т.д.

Как пример: лето, жарко - едем домой. Делаем опрос температурных датчиков, если температура высокая, включаем кондиционер на нужную температуру. Приезжаем, а температура в помещении уже комфортная.

Тут можно придумать великое множество автоматизаций и различных уведомлений. И да, оно действительно работает.

Что нужно?

Нужна нода типа Heltec Meshtastic LoRa32 V3 или V4 или T114 V2 Meshtastic Tracker NRF52840 и аналогичные, которую нужно подключить к Home Assistant через USB, BLE или TCP. Мне больше понравилось подключение по USB. Ну и вторая, носимая нода, с помощью которой мы и будем управлять HA и получать от него уведомления. 

Устанавливаем дополнение MeshCore for Home Assistant через HACS. Подключаем через мастер настройки свою домашнюю ноду. Ну а далее - есть хорошая инструкция с примерами.

Нужно узнать pubkey_prefix от ноды с которой вы будете отправлять и получать обратно сообщения. Ведь мы же не хотим, чтобы кто угодно смог управлять вашим HA :) В инструментах разработчика нужно подписаться на события meshcore_message - отправить сообщения и там увидим нужный нам pubkey_prefix с которым дальше будем работать. Если кто-то другой отправит сообщение и префикс не совпадёт, то автоматизация просто проигнорирует.
Получим что-то типа этого:

event_type: meshcore_message 

data:
  message: Тест
  sender_name: ИМЯ НОДЫ 
  pubkey_prefix: 2g668a875ssd - ЭТО ДЛЯ ПРИМЕРА НУЖНЫЙ НАМ ПРЕФИКС 
  receiver_name: meshcore
  entity_id: binary_sensor.meshcore_32334_3a4664_messages
  domain: meshcore
  timestamp: "ТУТ ДАТА"
  message_type: direct
origin: LOCAL
time_fired: "дата и время"
context:
  id: ТУТ ID 
  parent_id: null
  user_id: null

Я, конечно, выложу несколько своих рабочих примеров.
Вот пример опроса температурных датчиков:

alias: "MeshCore: Температура" 

description: Отправляет температуру с трёх датчиков по запросу
triggers:
  - event_type: meshcore_message
    trigger: event
conditions:
  - condition: template
    value_template: "{{ trigger.event.data.message_type == 'direct' }}"
  - condition: template
    value_template: "{{ trigger.event.data.pubkey_prefix.startswith('ВАЖНО! ТУТ ПРЕФИКС') }}"
  - condition: template
    value_template: "{{ trigger.event.data.message == 'Температура' }}"
actions:
  - action: text.set_value
    target:
      entity_id: text.meshcore_message
    data:
      value: >-
        Кухня: {% if states('sensor.esp32_2_dht11') not in
        ['unknown','unavailable'] %}{{ states('sensor.esp32_2_dht11') | round(0)
        }}°C{% else %}н/д{% endif %},  Спальня: {% if
        states('sensor.0xa4ckas34_temperature') not in
        ['unknown','unavailable'] %}{{
        states('sensor.sjdkc9389e6fc6f_temperature') | round(0) }}°C{% else
        %}н/д{% endif %}, Мастерская: {% if
        states('sensor.esp32_7_temperatura_masterskoi') not in
        ['unknown','unavailable'] %}{{
        states('sensor.esp32_7_temperatura_masterskoi') | round(0) }}°C{% else
        %}н/д{% endif %}, На улице: {% if
        states('sensor.datchik_t_ulitsa_temperature') not in
        ['unknown','unavailable'] %}{{
        states('sensor.datchik_t_ulitsa_temperature') | round(0) }}°C{% else
        %}н/д{% endif %}
  - action: select.select_option
    target:
      entity_id: select.meshcore_recipient_type
    data:
      option: Contact
  - action: select.select_option
    target:
      entity_id: select.meshcore_contact
    data:
      option: >-
        {{ trigger.event.data.sender_name }} ({{
        trigger.event.data.pubkey_prefix }})
  - action: meshcore.send_ui_message
    data: {}
mode: single

Как работает? С носимой ноды отправляем текстовое сообщение "Температура" на домашнюю ноду. И получаем ответ:
"Кухня: 26°C,  Спальня: 24°C, Мастерская: 22°C, На улице: 27°C"

Вот ещё один пример включения кондиционера. У меня он управляется через инфракрасный порт скриптом. Отправляем на домашнюю ноду сообщение "Кондей кухня вкл" - он включается и обратно получаем сообщение "Кондей на кухне включён - на охлаждение +24":

alias: "MeshCore: Кондей кухня вкл" 

description: Включает кондиционер на кухне на охлаждение 24 градуса
triggers:
  - event_type: meshcore_message
    event_data:
      message_type: direct
    trigger: event
conditions:
  - condition: template
    value_template: "{{ trigger.event.data.pubkey_prefix.startswith('ВАЖНО! ТУТ ПРЕФИКС') }}"
  - condition: template
    value_template: >-
      {{ (trigger.event.data.message | default('')) | trim == 'Кондей кухня вкл'
      }}
actions:
  - action: script.24_3
    data: {}
  - sequence:
      - action: select.select_option
        target:
          entity_id: select.meshcore_recipient_type
        data:
          option: Contact
      - action: select.select_option
        target:
          entity_id: select.meshcore_contact
        data:
          option: >-
            {{ trigger.event.data.sender_name }} ({{
            trigger.event.data.pubkey_prefix }})
      - action: text.set_value
        target:
          entity_id: text.meshcore_message
        data:
          value: Кондей на кухне включён - на охлаждение +24
      - action: meshcore.send_ui_message
        data: {}
mode: single

У вас уже скопилось много разных команд и не всегда их можно запомнить. А вводить их нужно точно. Если хоть один символ не совпадёт - не сработает.
Можно сделать напоминалочку например по команде "Help" - отправляется список доступных команд:

alias: "MeshCore: Справка Help" 

description: Отправляет список команд по команде Help
triggers:
  - event_type: meshcore_message
    trigger: event
conditions:
  - condition: template
    value_template: "{{ trigger.event.data.message_type == 'direct' }}"
  - condition: template
    value_template: "{{ trigger.event.data.pubkey_prefix.startswith('ВАЖНО! ВАШ ПРЕФИКС') }}"
  - condition: template
    value_template: "{{ trigger.event.data.message == 'Help' }}"
actions:
  - action: text.set_value
    target:
      entity_id: text.meshcore_message
    data:
      value: >-
        Доступные команды: Температура, Кондей кухня вкл/выкл, Кондей мастерская
        вкл/выкл, Help
  - action: select.select_option
    target:
      entity_id: select.meshcore_recipient_type
    data:
      option: Contact
  - action: select.select_option
    target:
      entity_id: select.meshcore_contact
    data:
      option: ТУТ НАЗВАНИЕ ВАШЕЙ НОДЫ (ТУТ ПРЕФИКС)
  - action: meshcore.send_ui_message
    data: {}
mode: single

Ну, а далее тут уж кто во что горазд - автоматизаций можно сделать каких угодно. Конечно, сохраняется обычный обмен сообщениями между домашней нодой и носимой. В HA по примерам можно сделать нужные карточки. Например, минимум: форма отправки с выбором кому, и карточка просмотра сообщений. 

Вот примерная карточка для HA отправки с выборос Контакт/Канал:

type: vertical-stack 

cards:
  - type: entities
    title: Отправка сообщений 
    entities:
      - entity: select.meshcore_recipient_type
        name: Send To
    state_color: true
    show_header_toggle: false
  - type: conditional
    conditions:
      - entity: select.meshcore_recipient_type
        state: Channel
    card:
      type: entities
      entities:
        - entity: select.meshcore_channel
          name: Channel
      state_color: true
  - type: conditional
    conditions:
      - entity: select.meshcore_recipient_type
        state: Contact
    card:
      type: entities
      entities:
        - entity: select.meshcore_contact
          name: Contact
      state_color: true
  - type: entities
    entities:
      - entity: text.meshcore_message
        name: Message
    state_color: true
  - show_name: true
    show_icon: true
    type: button
    name: Отправить сообщение
    icon: mdi:send
    tap_action:
      action: call-service
      service: meshcore.send_ui_message
    icon_height: 24px
    show_state: false
    color: orange

В примерах на Гите есть формы отправки команд на ноду, менеджер контактов  и много других. 
Именно с помощью формы менеджера контактов, удобно добавялять/удалять контакты и каналы для домашней ноды подклёчённой к HA.
Ещё существует интеграция для Meshtastic - посмотрите, может вам больше понравится.