Интеграция датчика освещенности гидропонной установки в Home Assistant
Интеграция датчика освещенности гидропонной установки в Home Assistant
Для того чтобы растения нормально росли и развивались в гроубоксе, в теплице, в оранжереи или в какой то гидропонной установке, как известно, им нужно достаточно света для фотосинтеза. Следить за изменением освещенности можно изготовив самостоятельно датчик освещенности (люксометр), например прямо на макетной плате. Далее загружать данные в автоматическом режиме в Home Assistant, осуществляя сбор данных через контроллер Ардуино. Можно воспользоваться готовым решением, купить датчик освещенности на Алиэкспресс . Но можно собрать самостоятельно (Фото 1), для этого необходимо:
Содержание
Собрать датчик по схеме
Сначала нам надо собрать принципиальную схему нашего датчика.
(Фото 2) Для этого используем три фоторезистора: 90мВт, 2-6кОм, 540нм, Монтаж: THT, 100ВDC, dLED: 5мм и резисторы сопротивлением: 1, 10, 100 КОм.
Три фоторезистора нам нужны, чтобы производить замеры в трех разных диапазонах освещенности, в вечернее время, днем и при ярком солнечном свете.
Загрузить в Arduino программный код
Загружаем в контроллер Arduino или ESP8266, или ESP32 программный код для отображение данных в COM порту. И проводим несколько замеров при разной освещенности на улице — в солнечную погоду и при облаках, а так же в помещении. (Фото 3), (Фото 4)
////////////////////////////////////////////// // 2023.07.06 woronin, umkiedu@gmail.com // Датчик освещености — люксометр // Robot UMKI controller K6_3 ////////////////////////////////////////////// int light0 = 0; int light1 = 0; int light2 = 0; void setup() { Serial.begin(9600); pinMode(A0, INPUT); pinMode(A1, INPUT); pinMode(A2, INPUT); } void loop() { light0 = analogRead(A0); Serial.println(light0); light1 = analogRead(A1); Serial.println(light1); light2 = analogRead(A2); Serial.println(light2); delay(10); // Delay a little bit to improve simulation performance }
Откалибровать полученные данные
Получаем набор «сырых» данных в вольтах, на основе которых будем производить калибровку для пересчета в люксы. Сводим полученные данные в таблицу.
Для заполнения столбца люксов, будем использовать технологию фотографирования белого листа цифровым фотоаппаратом или смартфоном. Калибровка освещенности с телефона производим по калькулятору c сайта www.gidroponika.su
Значение люксы HA(V) Lx 274 2400 350 2800 479 8900 498 9900 609 23700 620 26000 634 30000 735 61000
После заполнения таблицы измеренными значениями в вольтах и в люксах, строим график в любом табличном процессоре. Например в LibreOffice Calc, используя опцию: Построение линии тренда, показать формулу.
(Фото 5)
Вывод, в нашем случае коэффициенты пересчета получаются такие:
Y=259* EXP(0,00741* Х)
Теперь можно приступать к настройке постоянных замеров освещенности в НА.
Настроить интеграцию с Home Assistant
Настраиваем интеграцию через Firmata Для этого присоединим по USB плату Arduino к HA и в конфигурационном фале , который находится например в путях /config/configuration.yaml добавляем несколько строчек. После этого перегружаем НА.
firmata: - serial_port: /dev/ttyUSB0 serial_baud_rate: 57600 sampling_interval: 1000 sensors: - name: raw_light0 pin: A0 pin_mode: ANALOG differential: 20 - name: raw_light1 pin: A1 pin_mode: ANALOG differential: 20 - name: raw_light2 pin: A2 pin_mode: ANALOG differential: 20
Если все сделано без ошибок, то мы сможем увидеть новые объекты в меню: Настройки>>Устройства и службы>>Объекты . У них будут ID объекта: sensor.raw_light0, sensor.raw_light1, sensor.raw_light2, а Интеграция: firmata.
Но это пока еще сырые данные - в вольтах. Для того чтобы пересчитать их в люксы, с использованием наших поправочных коэффициентов, необходимо внести в этот же файл конфигурации /config/configuration.yaml еще один раздел:
sensor: - platform: template sensors: light_01: friendly_name: "освещенность в яркий день" unit_of_measurement: lk value_template: "{{ 259 * (e**(0,00741*states('sensor.raw_light0' )))| int }}" light_02: friendly_name: "освещенность в пасмурную погоду" unit_of_measurement: lk value_template: "{{ 259 * (e**(0,00741*states('sensor.raw_light1' )))| int }}" light_03: friendly_name: "освещенность вечером" unit_of_measurement: lk value_template: "{{ 259 * (e**(0,00741*states('sensor.raw_light2' )))| int }}"
И перезагрузить НА.
Теперь у нас в Объектах добавятся: sensors.light_01, sensors.light_02, sensors.light_03, их мы можем выводить на панель НА. Для этого заведем новую карточку на панели
graph: line hours_to_show: 24 type: sensor entity: sensors.light_01 unit: lk detail: 1 name: Освещенность
Результат представлен на (Фото 6), (Фото 7), (Фото 8)
Расчет суммарной освещенности
Рассчитываем суммарную освещенность за весь период собранных данных. В нашем примере это данные с 2023-06-26 01:12:22 по 2023-07-06 18:44:49 всего данных собранных на данный момент: 8548 записей замеров освещенности в люксах. Это составляет среднюю величину за весь период замеров: 5266 лк (Сумма всех люксов, деленная на число записей)
Запрос к базе данных имеет следующий синтаксис:
SELECT state, datetime(states.last_updated_ts, 'unixepoch') FROM states LEFT JOIN states_meta ON (states.metadata_id=states_meta.metadata_id) LEFT JOIN state_attributes ON (states.attributes_id=state_attributes.attributes_id) WHERE last_changed_ts is NULL AND states_meta.entity_id='sensor.light_01';
Результат будет примерно такой:
625,54 2023-06-26 01:12:22 630,19 2023-06-26 01:13:22 639,6 2023-06-26 01:14:22 644,36 2023-06-26 01:15:22 658,84 2023-06-26 01:16:22 663,75 2023-06-26 01:17:22 683,71 2023-06-26 01:18:22 693,92 2023-06-26 01:19:22
Для того чтобы выгрузить из базы данных выбранные значения в файл, нужно экспортировать следующими командами
cd homeassitant sqlite3 home-assistant_v2.db .mode csv .output hotbed_lux.csv Select ***
Для того чтобы построить по выгруженным данным график в GNUPLOT необходимо выполнить следующий скрипт:
#!/bin/bash # скрипт для генерации графиков в гнуплоте из файлов for FILE in hotbed_lux.csv do gnuplot << EOF set xdata time set timefmt "%s" set format x "%m.%d" set terminal png size 2048, 768 set output 'Lux.png' plot "$FILE" using 2:1 with lines linetype 1 lw 1 lc 6 title "Lx" EOF done
Результат представлен на (Фото 8)