Интеграция датчика освещенности гидропонной установки в Home Assistant — различия между версиями

Материал из ЭНЭ
Перейти к: навигация, поиск
(Добавить на панель график с историей)
(Расчет суммарной освещенности)
 
(не показано 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, осуществляя сбор данных через контроллер Ардуино. Можно воспользоваться готовым решением, купить датчик освещенности на Алиэкспресс . Но мы можем его собрать самостоятельно. Для этого необходимо:
+
'''Интеграция датчика освещенности гидропонной установки в Home Assistant'''
 +
 
 +
Для того чтобы растения нормально росли и развивались в гроубоксе, в теплице, в оранжереи или в какой то гидропонной установке,  как известно, им нужно достаточно света для фотосинтеза. Следить за изменением освещенности можно изготовив самостоятельно датчик освещенности ([[:ru:люксометр|люксометр]]), например прямо на макетной плате. Далее загружать данные в автоматическом режиме в [[Home Assistant]], осуществляя сбор данных через контроллер [[Ардуино]]. Можно воспользоваться готовым решением, купить датчик освещенности на Алиэкспресс . Но можно собрать самостоятельно (Фото 1), для этого необходимо:
 +
 
 +
=== Собрать датчик по схеме ===
 +
Сначала нам надо собрать принципиальную схему нашего датчика.
 +
 
 +
(Фото 2) Для этого используем три фоторезистора: '''90мВт, 2-6кОм, 540нм, Монтаж: THT, 100ВDC, dLED: 5мм''' и резисторы сопротивлением: '''1, 10, 100 КОм.'''
  
=== Собрать датчик по схеме ===
+
Три фоторезистора нам нужны, чтобы производить замеры в трех разных диапазонах освещенности, в вечернее время, днем и при ярком солнечном свете.
Сначала нам надо собрать принципиальную схему нашего датчика  (Фото 2)
+
  
 
=== Загрузить в Arduino программный код ===
 
=== Загрузить в Arduino программный код ===
Загружаем в контроллер Arduino или ESP8266, или ESP32 программный код для отображение данных в COM порту. И проводим несколько замеров при разной освещенности на улице - в солнечную погоду и при облаках, а так же в помещении. (Фото 3), (Фото 4)
+
Загружаем в контроллер Arduino или ESP8266, или ESP32 программный код для отображение данных в COM порту. И проводим несколько замеров при разной освещенности на улице — в солнечную погоду и при облаках, а так же в помещении. (Фото 3), (Фото 4)
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
 
//////////////////////////////////////////////
 
//////////////////////////////////////////////
//     2023.07.06 woronin, umkiedu@gmail.com
+
// 2023.07.06 woronin, umkiedu@gmail.com
//     Датчик освещености  - люксометр
+
// Датчик освещености — люксометр
//     Robot UMKI controller K6_3
+
// 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
  
=== Откалибровать собранные данные ===
 
Для калибровки будем использовать технологию фотографирования белого листа цифровым фотоаппаратом или смартфоном. Калибровка освещенности с телефона производим по калькулятору c  сайта [https://www.gidroponika.su/gidroponika-teorija.html/osvewenie/163-kak-izmerit-osveschennost-pomescheniya-bez-lyuksmetra.html www.gidroponika.su]
 
Вывод, коэффициенты пересчета получаются такие:
 
  
'''Y=259* EXP(0,00741* Х )'''
+
После заполнения таблицы измеренными значениями в вольтах и в люксах, строим график в любом табличном процессоре. Например в ''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'' добавляем несколько строчек. После этого перегружаем НА.
(Фото 6)
+
<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'' еще один раздел:
(Фото 7)
+
<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)
  
(Фото 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|280px| (Фото 5) Пересчет освещенности экспонента]]
+
|+
| [[Файл:История освещенности.png|link=http://wiki.laser.ru/images/1/1c/История_освещенности.png |thumb|160px| (Фото 8) История освещенности]]  
+
| [[Файл:Пересчет освещенности экспонента.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

(Фото 1) Датчик освещенности, люксометр

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


(Фото 2) Люксометр схема
(Фото 3) Замер освещенности на улице
(Фото 4) Замер освещености в гроубоксе
(Фото 5) Пересчет освещенности экспонента
(Фото 6) История освещенности на моб
(Фото 7) График освещенности построенный в HomeAssistant
(Фото 8) График освещенности построенный в gnuplot