Интеграция датчика освещенности гидропонной установки в Home Assistant — различия между версиями
Woronin (обсуждение | вклад) (→Добавить на панель график с историей) |
Woronin (обсуждение | вклад) (→Расчет суммарной освещенности) |
||
(не показано 14 промежуточных версии 2 участников) | |||
Строка 1: | Строка 1: | ||
− | |||
− | |||
[[Файл:Люксометр самодельный.jpg|link=http://wiki.laser.ru/images/5/55/Люксометр_самодельный.jpg |thumb|360px| (Фото 1) Датчик освещенности, люксометр]] | [[Файл:Люксометр самодельный.jpg|link=http://wiki.laser.ru/images/5/55/Люксометр_самодельный.jpg |thumb|360px| (Фото 1) Датчик освещенности, люксометр]] | ||
− | Для того чтобы растения нормально росли и развивались, как известно, им нужно достаточно света для фотосинтеза. Следить за изменением освещенности | + | '''Интеграция датчика освещенности гидропонной установки в Home Assistant''' |
+ | |||
+ | Для того чтобы растения нормально росли и развивались в гроубоксе, в теплице, в оранжереи или в какой то гидропонной установке, как известно, им нужно достаточно света для фотосинтеза. Следить за изменением освещенности можно изготовив самостоятельно датчик освещенности ([[:ru:люксометр|люксометр]]), например прямо на макетной плате. Далее загружать данные в автоматическом режиме в [[Home Assistant]], осуществляя сбор данных через контроллер [[Ардуино]]. Можно воспользоваться готовым решением, купить датчик освещенности на Алиэкспресс . Но можно собрать самостоятельно (Фото 1), для этого необходимо: | ||
+ | |||
+ | === Собрать датчик по схеме === | ||
+ | Сначала нам надо собрать принципиальную схему нашего датчика. | ||
+ | |||
+ | (Фото 2) Для этого используем три фоторезистора: '''90мВт, 2-6кОм, 540нм, Монтаж: THT, 100ВDC, dLED: 5мм''' и резисторы сопротивлением: '''1, 10, 100 КОм.''' | ||
− | + | Три фоторезистора нам нужны, чтобы производить замеры в трех разных диапазонах освещенности, в вечернее время, днем и при ярком солнечном свете. | |
− | + | ||
=== Загрузить в Arduino программный код === | === Загрузить в Arduino программный код === | ||
− | Загружаем в контроллер Arduino или ESP8266, или ESP32 программный код для отображение данных в COM порту. И проводим несколько замеров при разной освещенности на | + | Загружаем в контроллер Arduino или ESP8266, или ESP32 программный код для отображение данных в COM порту. И проводим несколько замеров при разной освещенности на улице — в солнечную погоду и при облаках, а так же в помещении. (Фото 3), (Фото 4) |
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
////////////////////////////////////////////// | ////////////////////////////////////////////// | ||
− | // | + | // 2023.07.06 woronin, umkiedu@gmail.com |
− | // | + | // Датчик освещености — люксометр |
− | // | + | // Robot UMKI controller K6_3 |
////////////////////////////////////////////// | ////////////////////////////////////////////// | ||
int light0 = 0; | int light0 = 0; | ||
Строка 43: | Строка 47: | ||
− | === | + | === Откалибровать полученные данные === |
− | Получаем набор | + | Получаем набор «сырых» данных в вольтах, на основе которых будем производить калибровку для пересчета в люксы. Сводим полученные данные в таблицу. |
+ | |||
+ | Для заполнения столбца люксов, будем использовать технологию фотографирования белого листа цифровым фотоаппаратом или смартфоном. Калибровка освещенности с телефона производим по калькулятору c сайта [https://www.gidroponika.su/gidroponika-teorija.html/osvewenie/163-kak-izmerit-osveschennost-pomescheniya-bez-lyuksmetra.html www.gidroponika.su] | ||
+ | |||
+ | |||
Значение люксы | Значение люксы | ||
HA(V) Lx | HA(V) Lx | ||
Строка 56: | Строка 64: | ||
735 61000 | 735 61000 | ||
− | |||
− | |||
− | |||
− | ''' | + | После заполнения таблицы измеренными значениями в вольтах и в люксах, строим график в любом табличном процессоре. Например в ''LibreOffice Calc'', используя опцию: ''Построение линии тренда, показать формулу.'' |
(Фото 5) | (Фото 5) | ||
+ | |||
+ | Вывод, в нашем случае коэффициенты пересчета получаются такие: | ||
+ | |||
+ | '''Y=259* EXP(0,00741* Х)''' | ||
+ | |||
+ | Теперь можно приступать к настройке постоянных замеров освещенности в НА. | ||
== Настроить интеграцию с Home Assistant == | == Настроить интеграцию с Home Assistant == | ||
− | Настраиваем интеграцию через [https://www.home-assistant.io/integrations/firmata Firmata] | + | Настраиваем интеграцию через [https://www.home-assistant.io/integrations/firmata Firmata] Для этого присоединим по USB плату Arduino к HA и в конфигурационном фале , который находится например в путях ''/config/configuration.yaml'' добавляем несколько строчек. После этого перегружаем НА. |
− | + | <syntaxhighlight lang="C"> | |
+ | 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 | ||
+ | </syntaxhighlight> | ||
+ | Если все сделано без ошибок, то мы сможем увидеть новые объекты в меню: Настройки>>Устройства и службы>>Объекты . У них будут ID объекта: sensor.raw_light0, sensor.raw_light1, sensor.raw_light2, а Интеграция: firmata. | ||
− | + | Но это пока еще сырые данные - в вольтах. Для того чтобы пересчитать их в люксы, с использованием наших поправочных коэффициентов, необходимо внести в этот же файл конфигурации ''/config/configuration.yaml'' еще один раздел: | |
− | ( | + | <syntaxhighlight lang="C"> |
+ | 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 }}" | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | И перезагрузить НА. | ||
+ | |||
+ | Теперь у нас в Объектах добавятся: 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) | ||
− | |||
{| align="center" class="standard" | {| align="center" class="standard" | ||
|+ | |+ | ||
− | | [[Файл:Люксометр схема.png |link=http://wiki.laser.ru/images/8/8f/Люксометр_схема.png |thumb|280px| (Фото 2) Люксометр схема]] | + | | [[Файл:Люксометр схема.png |link=http://wiki.laser.ru/images/8/8f/Люксометр_схема.png |thumb|280px| (Фото 2) Люксометр схема]] |
| [[Файл:Замер освещенности на улице.png|link=http://wiki.laser.ru/images/6/60/Замер_освещенности_на_улице.png |thumb|280px| (Фото 3) Замер освещенности на улице]] | | [[Файл:Замер освещенности на улице.png|link=http://wiki.laser.ru/images/6/60/Замер_освещенности_на_улице.png |thumb|280px| (Фото 3) Замер освещенности на улице]] | ||
− | | [[Файл:Замер освещености в гроубоксе.png |link=http://wiki.laser.ru/images/a/a1/Замер_освещености_в_гроубоксе.png |thumb|160px| (Фото 4) Замер освещености в гроубоксе]] | + | | [[Файл:Замер освещености в гроубоксе.png |link=http://wiki.laser.ru/images/a/a1/Замер_освещености_в_гроубоксе.png |thumb|160px| (Фото 4) Замер освещености в гроубоксе]] |
− | | [[Файл:Пересчет освещенности экспонента.png |link=http://wiki.laser.ru/images/3/31/Пересчет_освещенности_экспонента.png |thumb| | + | |+ |
− | | [[Файл:История освещенности.png|link=http://wiki.laser.ru/images/1/1c/История_освещенности.png |thumb|160px| (Фото | + | | [[Файл:Пересчет освещенности экспонента.png |link=http://wiki.laser.ru/images/3/31/Пересчет_освещенности_экспонента.png |thumb|240px| (Фото 5) Пересчет освещенности экспонента]] |
− | + | | [[Файл:История освещенности.png|link=http://wiki.laser.ru/images/1/1c/История_освещенности.png |thumb|160px| (Фото 6) История освещенности на моб]] | |
+ | |+ | ||
+ | | [[Файл:Освещенность НА.png|link=http://wiki.laser.ru/images/6/61/Освещенность_НА.png |thumb|200px| (Фото 7) График освещенности построенный в HomeAssistant]] | ||
+ | | [[Файл:Освещенонсть в gnuplot.png |link=http://wiki.laser.ru/images/7/75/Освещенность_в_gnuplot.png |thumb|200px| (Фото 8) График освещенности построенный в gnuplot]] | ||
|+ | |+ |
Текущая версия на 17:09, 7 июля 2023
Интеграция датчика освещенности гидропонной установки в 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)