Интеграция датчика освещенности гидропонной установки в 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)