Итак я наклепал кучу контроллеров с MySensors и подключил их к MajorDoMo через шлюз. Данная статья о том как с этим жить дальше. Ведь для подключения к MajorDoMo с каждым устройством приходится выполнять немало действий: создание объектов и подключение их к сенсорам Mysensors, настройка обработки приходящих значений, отображение показаний на экранных формах (планах, сценах), формирования отчетов по показаниям датчиков.
Для подключения устройств Mysensor к MajorDoMo я вижу два пути:
Максимально воспользоваться тем что есть. То есть прицепить все сенсоры, которые подключились к системе, к существующим классам системы, а далее цеплять их к сценам, формам, графикам и сценариям.
Создать свою иерархию классов , соответствующих моим устройствам, максимально заложить в них логику работы и отображения данных и уже цеплять все подключившиеся сенсоры к ним.
До сих пор я максимально шел по первому пути, разве что немного расширял существующие классы. В результате я получил огромное количество однотипных объектов (ведь каждому сенсору моего устройства, которых у меня получается от 2 до 10, нужно создать отдельный объект соответствующего класса)
Кончилось все это переустановкой MajorDoMo (почему то при вызове сцен стал подвисать Apache c 100% загрузкой процессора), и вместе с этим я решил навести порядок в классах.
Задача
Требуется максимально упростить подключение большого количества однотипных датчиков влажности почвы. Все датчики имеют батарейное питание и выдают три параметра. Напряжение батареи, значение АЦП, которое может быть пересчитано во влажность почвы и температуру от отдельного сенсора DS18B20, который может быть установлен в устройстве.
Подготовительный этап. Создание базовых классов
Для начала создадим базовый класс SMyVccDevices для всех моих устройств с батарейным питанием.
Далее создаю общие свойства для всех батарейных устройств:
Name — имя устройства, которое будет отображаться в отчетах и формах
Vcc — напряжение питания, В — ключевое значение с хранением истории в базе
VccMin и VccMax — значения необходимые для вычисления состояния батареи
VccText — тестовое сообщение о состоянии батареи
Далее создадим метод vccUpdated, который будет срабатывать при каждом изменении свойства Vcc
Данный метод вычисляет напряжение батареи в процентах, формирует строку состояния батареи из записывает в VccText, а также пишет текущее время в свойство updated и запускает метод родительского класса setUpdatedText
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Изменяем время
$this->setProperty('updated',time());
$this->callMethodSafe('setUpdatedText');
// Считываем значения
$min=$this->getProperty('VccMin');
if($min==''||$min<=0)$min=2;
$max=$this->getProperty('VccMax');
if($max==''||$max<=0)$max=3;
$vcc=$this->getProperty('Vcc');
// Рассчитываем вольтаж в процентах
$proc=0;
if($vcc>$max)$proc=100;
elseif($vcc<$min)$proc=0;
elseif($min==$max)$proc=0;
else$proc=($vcc-$min)/($max-$min)*100;
// Пишем состояние батареи
if($proc>50)$text='Батарея в норме';
elseif($proc>10)$text='Низкий заряд батареи';
else$text='Критический заряд батареи';
// Пишем значение свойств
$this->setProperty('VccText',$text);
Класс SMyVccDevices готов. Теперь можно создавать классы конкретных устройств наследуя данный класс. Следующим создадим класс устройств измерения температуры влажности SMyTempHumDevices. Выделения этого класса может пригодиться для датчиков с DHT22, HTU21D и прочимих термо-гигрометров.
У данного класса создадим два ключевых свойства с хранением истории значений:
Temp — температура
Hum — относительная влажность
Собственных методов у данного класса нету
Создание класса моего устройства
Теперь собственно класс для резистивных устройств измерения относительной влажности почвы.
У него будет два дополнительных свойства:
HumADC — значения АЦП контроллера, которое будем привязывать к непосредственно сенсор
HymText — текстовое поле оценки влажности для отчетов и форм
И метод humUpdated, привязанный к изменению свойства HumADC. Алгоритм пересчета значений я оставлю прежним
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$adc=$this->getProperty('HumADC');
$new_value=0.000001*$adc*$adc*$adc*-1;
$new_value+=$adc*$adc*0.001649;
$new_value+=$adc*-0.686978;
$new_value+=121.559157;
$new_value=round($new_value,1);
if($new_value>100)$new_value=100;
$this->setProperty('Hum',$new_value);
if($new_value==''||$new_value<=0)
$this->setProperty('HumText','Нет данных');
elseif($new_value<40)
$this->setProperty('HumText','Нужен полив');
elseif($new_value<50)
$this->setProperty('HumText','Скоро полив');
elseif($new_value<75)
$this->setProperty('HumText','В норме');
else$this->setProperty('HumText','Очень влажно');
Для данного класса создадим шаблон отображения — вид, каким объекты данного класса будут выводиться на планах и сценах MajorDoMo
Мне удобнее табличный вид отображения всех значений в одну строчку