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

Материал из УМКИwiki
Версия от 11:44, 17 декабря 2023; Woronin (обсуждение | вклад) (→‎Собрать датчик по схеме)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску
(Фото 1) Датчик освещенности, люксометр

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

Для того чтобы растения нормально росли и развивались в гроубоксе, в теплице, в оранжереи или в какой то гидропонной установке, как известно, им нужно достаточно света для фотосинтеза. Следить за изменением освещенности можно изготовив самостоятельно датчик освещенности (люксометр), например прямо на макетной плате. Далее загружать данные в автоматическом режиме в Home Assistant, осуществляя сбор данных через контроллер Ардуино. Можно воспользоваться готовым решением, купить датчик освещенности на Алиэкспресс . Но можно собрать самостоятельно (Фото 1), для этого необходимо:

Собрать датчик по схеме

Сначала нам надо собрать принципиальную схему нашего датчика.

(Фото 2) Для этого используем три фоторезистора: 90мВт, 2-6кОм, 540нм, Монтаж: THT, 100ВDC, dLED: 5мм и резисторы сопротивлением: 360 Ом, 1 Ком, 33 КОм. (такие были под рукой)

Три фоторезистора нам нужны, чтобы производить замеры в трех разных диапазонах освещенности, в вечернее время, днем и при ярком солнечном свете.

Загрузить в 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) Люксометр схема с резисторами номиналом: 360 Ом, 1КОм, 33КОм
(Фото 3) Замер освещенности на улице
Файл:Замер освещённости в гроубоксе.png
(Фото 4) Замер освещённости в гроубоксе
(Фото 5) Пересчет освещенности экспонента
(Фото 6) История освещенности на моб
(Фото 7) График освещенности построенный в HomeAssistant
Файл:Освещенность в gnuplot.png
(Фото 8) График освещенности построенный в gnuplot