Итак, сейчас мы рассмотрим вариант, когда в качестве контроллера у нас будет выступать MegaD (
https://ab-log.ru/smart-house/ethernet/megad-2561), а в качестве датчика -- цифровой датчик температуры DS18B20.
Немного о подключении датчика
Датчик DS18B20 можно подключить напрямую к цифровым портам контроллера MegaD-2561. Однако лучше это сделать через специальный исполнительный модуль MegaD-14-IOR (
https://ab-log.ru/smart-house/ethernet/megad-14-ior). Модуль MegaD-14-IOR пришел на смену модулю MegaD-14-IN, который сейчас не выпускается, но принцип подключения остался прежним и соответствующая статья не утратила своего значения (
https://ab-log.ru/smart-house/ethernet/megad-14-in).
После того, как "поигрались на столе", датчик можно разместить в интерьере (
https://ab-log.ru/smart-house/ethernet/ ... dapter-box).
У контроллера есть свой web-интерфейс, в котором производятся необходимые настройки. Настройки, в первую очередь необходимы потому, что в зависимости от типа подключенного исполнительного модуля на один и тот же порт можно "повесить" различное оборудование: выключатели-кнопки (
http://ab-log.ru/smart-house/accessories) и датчики с выходом типа "сухой контакт" (герконы, датчики движения, протечки и пр.), датчики, работающие по различным цифровым протоколам и т.д. Поэтому своими настройками мы должны "объяснить" контроллеру, как он должен работать с тем или иным портом.
Как узнать температуру?
Для этого можно зайти в web-интерфейс контроллера на страницу порта, к которому подключен датчик (допустим, порт P32).
- MegaD-2561-web-port-config-dsen-ds18b20.gif (7.38 КБ) 5935 просмотров
И мы тут же увидим температуру на датчике (в данном случае 28.56 С⁰).
Еще можно ввести в адресную строку браузера
и нажать Enter. И мы увидим ответ в виде значения "temp:28.56".
Также мы можем послать запрос со стороны сервера на языке PHP:
Код: Выделить всё
$T = file_get_contents('http://192.168.0.14/sec/?pt=32&cmd=get');
//возьмем из ответа (temp:28.56) только последние 5 символов (только цифры)
$T = substr($T,-5,5);
При этом в переменной $T сохранится наше значение температуры (28.56).
Получим значение температуры в MajorDoMo
Вообще, для того, чтобы общаться со всевозможным оборудованием, в MajorDoMo предусмотрены различные модули. Подавляющая их часть в момент инсталляции программы не устанавливается. В зависимости от конкретной потребности люди потом сами устанавливают необходимые им модули из маркета дополнений (Панель управления --> СИСТЕМА --> Маркет дополнений --> Вкладка «Оборудование»).
- Модули из Маркета дополнений.jpg (291.4 КБ) 5935 просмотров
Для работы с контроллерами MegaD предназначен модуль "MegaD devices".
Но это я рассказал для сведения, поскольку для получения температуры и использования ее в интерфейсе УД устанавливать модуль "MegaD devices" совершенно не обязательно.
Базовыми компонентами MajorDoMo являются
классы, объекты, свойства, методы. Для простоты скажем, что классы служат для группировки однотипных объектов или объектов "на одну тему". Объекты -- виртуальные сущности, отражающие в системе УД объекты реального мира, например, датчики температуры (хотя, объекты могут быть и сугубо виртуальными). Свойства отражают те или иные признаки объектов (например, для температурных датчиков свойством может служить значение их температуры). Методы заключают в себе программный код, выполняющий обработку данных. Например, для объекта "Датчик температуры" логичным является метод получения температуры для данного датчика.
Теперь создадим класс, объект, свойство и метод для нашего датчика температуры. Допустим у нас будут (как пример):
класс --
TempSensors -- сюда будем добавлять объекты наших температурных датчиков
объект --
TempSensor01-- это объект нашего датчика в системе УД
свойство --
Value -- здесь будет сохраняться значение температуры
метод --
GetValue -- программный код на PHP, с при исполнении которого в свойство в Value будет сохранятся значение температуры, запрошенное у контроллера.
Все очень просто.
Создаем новый класс с именем TempSensors.
Создаем в классе новое свойство с именем Value.
Создаем в классе новый метод с именем GetValue.
Создаем в классе новый объект с именем TempSensor01.
Код методов можно писать в метод класса и в метод конкретного объекта внутри класса (сейчас не буду останавливаться на отличиях). Мы напишем код PHP в метод нашего ОБЪЕКТА TempSensor01:
Код: Выделить всё
//после выполнения запроса контроллер сохранит в переменную $T значение (состояние) порта P32 (в нашем случае -- значение температуры)
$T = file_get_contents('http://192.168.0.14/sec/?pt=32&cmd=get');
//возьмем из ответа только последние 5 символов (только цифры)
$T = substr($T,-5,5);
//полученное значение температуры запишем в свойство текущего объекта
$this->setProperty('Value', $T);
//можно записать свойство и так, как я указал ниже, но "идеологически правильно" использовать конструкцию $this->
//setProperty('TempSensor01.Value', $T);
Теперь, если мы запустим наш Объект.Метод "TempSensor01.GetValue" вручную, то в Объект.Свойство "TempSensor01.Value" запишется значение температуры с датчика.
Но мы хотим увидеть нашу температуру в интерфейсе. Вариантов множество. Один из самых простых, использовать информер на сцене. При настройке информера надо всего лишь сослаться на свойство "Value" объекта "TempSensor01". При изменении значения Объект.Свойства "TempSensor01.Value" цифры на информере будут автоматически меняться.
В вопросе топикстартера упоминался
график. Ясно, что для построения графика одного значения маловато, необходим целый ряд значений за определенный период времени. Чтобы MajorDoMo "запоминал" (сохранял в базу данных) все значения свойства, у свойства необходимо включить
историю. Для этого надо в КЛАССЕ в настройках свойства установить у параметра "Хранить историю дней:" значение больше нуля.
Понятно, что если запускать Объект.Метод "TempSensor01.GetValue" вручную, то быстро вспотеешь. Поэтому "поручим" работу по периодическому опросу датчика MajorDoMo. Вариантов тут несколько, но на мой взгляд, самый простой -- такой. Можно записать в «onNewMinute» (Панель управления --> ОБЪЕКТЫ --> Объекты --> [класс] Timer --> ClockChime --> onNewMinute) такой код (ниже строки «$m=date('i',time());»):
Код: Выделить всё
if ($m%5 == 0) {callMethod('TempSensor01.GetValue');}
Каждые 5 минут будет запускаться Объект.Метод "TempSensor01.GetValue" и значение температуры будет актуализироваться, что, собственно, нам и нужно для построения графика.
А график я учился строить по этому видео (
https://youtu.be/Tz9-tu9R7dM).