Підключення модуля ESP8266 з прошивкою NodeMCU / Lua до сервера Home Assistant по HTTP — частина 2.

Підключення модуля ESP8266 з прошивкою NodeMCU / Lua до сервера Home Assistant по HTTP — частина 2.

У частині 1 статті ми описали необхідні попередні кроки для підключення модуля ESP8266 / ESP32 а також пристроїв на базі цих модулів:

  • Мова програмування
  • Прошивка NodeMCU з мовою Lua
  • Сервер Home Assistant
  • Локальна мережа
  • Протокол передачі даних
  • Серверний інтерфейс інтеграції Home Assistant
  • Надсилання та отримання даних
  • Токен довготривалого доступу
  • Запити контролера до сервера з рівня Lua (NodeMCU)

Тепер напишемо повний Луа код для обміну даними.

Робочий код надсилання та отримання даних на Lua

Робочий Lua-код завдяки функції post() і таймеру, може надсилати дані на сервер щохвилини, а також за запитом користувача, може отримувати дані з сервера засобами функції get().

Функції lua-модуля виконують запити до сервера по HTTP. Отримуючи їх, сервер виконує автентифікацію токена, і відповідно до власних правил API, створює тимчасові структури і сутності. Адміністратор сервера, може створити віджети дашборда, які будуть показувати стан чи значення сенсорів. 

Примітка. Якщо у вас декілька сенсорів на одному контролері, потрібно виконати декілька запитів HTTP POST, щоб розмістити їх дані на сервері.

Примітка. Якщо у вас декілька різних типів сутностей на контролері, приміром, не лише сенсор, а і дискретний перемикач (switch) то потрібно змінити шлях запиту до API на відповідний. В цій статті ми не розглядаємо сутності відмінні від сенсора. Можливо, ми присвятимо switch, cover та іншим, окрему статтю.

На рисунках далі за текстом, наведено результати роботи програми, а також як ці результати виглядають на боці сервера Home Assistant.

Для початку ми написали зовсім простий скрипт, який щоразу надсилав HTTP POST запит на сервер:

Перший запит HTTP POST з контролера до сервера
Рис. Наш перший запит HTTP POST з контролера до сервера

Як можна бачити, перший запит завершився з кодом 201 – сервер повертає такий код для випадку, коли нову сутність на сервері було створено (її не існувало). У випадку, якщо сутність існувала і її значення було оновлено – код завершення операції буде 200.

Після нашого першого запиту, який ми виконали з контролера, у внутрішніх структурах сутностей сервера з’явилася sensor.ggreg20_v1_chipid:

На сервері з’явилася сутність нашого контролера з сенсором GGreg20_V1
Рис. На сервері з’явилася сутність нашого контролера з сенсором GGreg20_V1

Це означає, що ми тепер маємо доступ до цієї сутності з усіх наявних у сервері Home Assistant інструментів та плагінів. 

Наприклад, ми тепер можемо створити віджет дашборду, щоб відображати значення у фронтенд. 

Або ж, ми можемо утворити сценарій автоматизації.

Наприклад, якщо значення потужності випромінювання вище 0.3 – включити сирену. І це далеко не всі можливості, які ми тепер можемо реалізувати щодо отриманого з контролера у сервер значення з сенсора. 

Втім, спробуємо створити простий віджет для дашборду користувача: 

Створимо віджет на дашборді для відображення значень сенсора GGreg20_V1
Рис. Створимо віджет на дашборді для відображення значень сенсора GGreg20_V1

Результат – віджет на дашборді, що відображає поточне значення потужності іонізуючого випромінювання:

Віджет для GGreg20_V1, який ми створили на дашборді HA
Рис. Віджет для GGreg20_V1, який ми створили на дашборді HA

Але для того, що покращити користувацький досвід та полегшити сприйняття інформації користувачами, створимо ще кілька веджетів, які крім поточного значення з сенсора, показують ще й важливі характеристики зміни значення у часі: 

Додаємо ще кілька віджетів, щоб отримати якісну візуалізацію даних з сенсора
Рис. Додаємо ще кілька віджетів, щоб отримати якісну візуалізацію даних з сенсора

Один з віджетів – показує кольором перетин порогів. Інший віджет показує зміну значень з плином часу у форматі графіка.

Обидва віджети налаштовано на наступні діапазони: 0 – 0.3 мкЗв/год норма (зелений); 0.3 – 0.6 підвищений (помаранчевий), 0.6 – і вище – небезпека (червоний).

Для того, щоб перевірити, як працюють нові віджети, надішлемо з контролера кілька порцій тестових значень:

Публікуємо декілька порцій даних з контролера на сервер
Рис. Публікуємо декілька порцій даних з контролера на сервер

Як можемо бачити, все працює так, як і було задумано:

Перевіряємо, як наші дані оновлюються на створених нами віджетах
Рис. Перевіряємо, як наші дані оновлюються на створених нами віджетах

Під час зміни значень – віджети реагують відповідною візуалізацією:

Зміна рівня правильно відображається на налаштованих нами віджетах
Рис. Зміна рівня правильно відображається на налаштованих нами віджетах

Також нам варто звіритися з тим, які сирі дані отримує сервер від контролера:

Переглядаємо сирі дані сенсора GGreg20_V1, що надходять з контролера
Рис. Переглядаємо сирі дані сенсора GGreg20_V1, що надходять з контролера

Ну і наостанок, перевіряємо, що ми у разі необхідності, зможемо отримати від сервера останнє йому відоме значення сенсора. Для цього застосовуємо метод HTTP GET:

Перевіряємо, чи можемо отримати (HTTP GET) дані з сервера на контролер
Рис. Перевіряємо, чи можемо отримати (HTTP GET) дані з сервера на контролер

Все працює.

У випадку, якщо контролер з якихось причин має взнати попереднє значення чи стан своїх сенсорів або виконавчих механізмів з сервера – ми це можемо забезпечити шляхом запиту HTTP GET.

Висновки

Ми з вами спробували і успішно виконали інтеграцію довільного пристрою з WIFi до екосистеми Home Assistant. – Пристрою, що працює під керуванням прошивки NodeMCU з мовою програмування Lua.

Ба більше! Ми у декілька кліків вивели на дашборд потрібні нам дані з сенсора радіації GGreg20_V1, підключеного до модуля ESP12.OLED.

Lua-код, що ми приводимо як приклад, є простим і теж був написаний за кілька хвилин. Готовий до використання модуль radCounter, звісно, дуже спростив нам цю задачу, адже розрахунок показників сенсора відбувається всередині radcounter.lua, який ми викликаємо через require().

У такий же спосіб є можливим інтегрувати до сервера Home Assistant будь-який сенсор чи пристрій з виконавчим механізмом. Через post() передаємо свої дані на сервер, а через get() отримуємо завдання для виконавчого механізму.

Бажаємо успіхів!