Как принципиально подключаются устройства.

Если вы только начинаете осваивать систему MajorDoMo и чего-то не знаете или не можете понять, то задавайте свои вопросы в этой ветке.

Модератор: immortal

Fat-Zer
Сообщения: 6
Зарегистрирован: Ср фев 27, 2019 9:06 am
Благодарил (а): 2 раза
Поблагодарили: 2 раза

Как принципиально подключаются устройства.

Сообщение Fat-Zer » Пт мар 01, 2019 11:44 pm

Не могу разобраться в принципиальной схеме взаимодействия с конечными устройствами.

Конкретики ради, возьму пример простой задачи:
Отобразить данные с термодатчика процессора raspbery Pi в виде текущего значения и бегущего графика за последнюю минуту/полчаса/день/неделю.

На малине текущие данные доступны, например, через файл /sys/class/thermal/thermal_zone0/temp
Собственно что мне необходимо для этого?
Очевидно, некий модуль, который будет периодически проверять значение в файле. Как такие модули называются в терминологии majordomo? Они поставляются отдельно?

Далее, по видимому, этот модуль должен сохранять значение в базе. Ведь весь обмен «заднего конца» и «мордой» идёт через мускуль? Учитывая, что ежесекундные данные за долгий период времени не нужны, кто ответственен за их «генерализацию» (удаление ежесекундных/минутных/часовых/ежедневных/еженедельных данных и добавление средних за минуту/час/день/...)? По умолчанию для короткоживущих данных используются временные таблицы? На каком уровне искать крутилки регулирующие, сколько оставлять данных?

Затем эти данные должен получить некий «объект» веб сервера и передать их в интерфейс. Какома здесь типовая цепочка ответственности?

Как я предполагаю, есть какой-то «объект-сенсор», который берёт данные из базы и передаёт другому «логическому объекту», который отвечает за отображение. Это так? Очевидно, что «логических объектов» полно из коробки: в сценах, в меню и прочее. Но где искать/как добавить «объекты-сенсоры»?

Какова корректная терминология для всего вышеперечисленного в majordomo?
Аватара пользователя
xor
Сообщения: 2036
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 283 раза
Поблагодарили: 628 раз

Re: Как принципиально подключаются устройства.

Сообщение xor » Сб мар 02, 2019 1:02 am

читали https://kb.mjdm.ru/osnovnie-kompomemti- ... majordomo/
https://kb.mjdm.ru/category/razrabotchikam/?
Вообще, там много чего понаписано
Fat-Zer
Сообщения: 6
Зарегистрирован: Ср фев 27, 2019 9:06 am
Благодарил (а): 2 раза
Поблагодарили: 2 раза

Re: Как принципиально подключаются устройства.

Сообщение Fat-Zer » Сб мар 02, 2019 4:39 am

xor, спасибо, просмотрел, кое что стало понятно... описано много чего, но сведения очень отрывочные и поверхностные... думаю разбор на конкретном примере здесь бы помог больше...
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Как принципиально подключаются устройства.

Сообщение Chainik » Сб мар 02, 2019 9:01 am

Fat-Zer писал(а):
Сб мар 02, 2019 4:39 am
... думаю разбор на конкретном примере здесь бы помог больше...
Правильно. Потому что ответ на ваш первоначальный вопрос осложняется тем, что без привязки к конкретному оборудованию рассуждать абстрактно очень трудно. Дело в том, что оборудование может работать по-разному. Где-то устройство само посылает серверу сигнал об изменении значения датчика, где-то сервер сам опрашивает датчик с нужной периодичностью. Т.е. имеют место разные концепции (протоколы, железо, способы подключения и т.д.).

Сейчас нет времени, но вечером расскажу вам, как подключается простейший датчик на примере контроллеров MegaD.
fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Как принципиально подключаются устройства.

Сообщение fandaymon » Сб мар 02, 2019 4:44 pm

Fat-Zer писал(а):
Сб мар 02, 2019 4:39 am
xor, спасибо, просмотрел, кое что стало понятно... описано много чего, но сведения очень отрывочные и поверхностные... думаю разбор на конкретном примере здесь бы помог больше...
По-моему в Базе знаний все вопросы освещены очень подробно.
Конкретно по взаимодействию физических устройств-МДМ. Каждое устройство представленно абстракцией - объектом, со своим набором свойств и методов. Объект принадлежит к какому-то классу. Какие-то классы уже содержат определенные свойства и методы. Свойства это, например, температура у датчика температуры, или состояние выключателя (вкл/выкл). У выключателя возможны методы TurnOn, TurnOff, т.е. команды которые можно отдать объекту. Общение с базой данных происходит в основном не напрямую, а через команды setGlobal, getGlobal, т.е. установить какое-то свойство или получить какое-то свойство
В МДМ есть API, т.е. часть устройств может общаться с системой через POST и GET запросы. Такой запрос может отдать свойство объекта или установить его или запустить какой-то метод объекта (например при помощи такого запроса можно включить свет)
Остальные устройства общаются с системой через модули-прослойки между конкретным протоколом и ядром. Скажем устройства, работающие через протокол MQTT работают через соответствующий модуль. Модуль написано довольно много, практически под все распространённые протоколы. Ну конечно если что-то отсутствует, то можно написать и свой.
Конкретно по поводу температуры Малинки - стандартного модуля нет, каждый пишет как ему удобно. Я например запускаю кроном скрипт на питоне и через urlopen отдаю данные в МДМ. Выглядит это примерно так -

Код: Выделить всё

import urllib
import os

temperature = os.popen('vcgencmd measure_temp').readline()
temperature =  temperature.replace("temp=","").replace("'C\n","")
link="http://127.0.0.1/objects/?op=set&object=ThisComputer&p=CpuTemp&v=" + temperature
f=urllib.urlopen(link)
Т.е. при помощи команды vcgencmd получаем температуру в каком-то виде, выделаем из результата число и записываем это число в свойство CpuTemp объекта ThisComputer

Кто-то пишет скрипт для забора температуры на PHP (для этого есть циклы по терминологии МДМ)

Проблемой неактуальных данных занимается модуль Оптимизация - при помощи этого модуля можно настроить разные схемы оптимизации хранения данных, например сделать так чтобы чем старше данные, тем длиннее период между точками. (лишние удаляются, значение оставшихся усредняются). Для каждого свойства можно выбрать свой план оптимизации.
За это сообщение автора fandaymon поблагодарил:
Fat-Zer (Вс мар 03, 2019 2:19 am)
Рейтинг: 1.16%
Аватара пользователя
nightwind
Сообщения: 333
Зарегистрирован: Вс июн 26, 2016 4:42 pm
Откуда: Барановичи
Благодарил (а): 28 раз
Поблагодарили: 52 раза
Контактная информация:

Re: Как принципиально подключаются устройства.

Сообщение nightwind » Сб мар 02, 2019 9:16 pm

fandaymon писал(а):
Сб мар 02, 2019 4:44 pm

Код: Выделить всё

import urllib
import os

temperature = os.popen('vcgencmd measure_temp').readline()
temperature =  temperature.replace("temp=","").replace("'C\n","")
link="http://127.0.0.1/objects/?op=set&object=ThisComputer&p=CpuTemp&v=" + temperature
f=urllib.urlopen(link)
оверхед космический! так скоро стоядерного процессора не хватит. :mrgreen: зато низкиq порог входа и не нужны {}
решается все одной строчкой, по быстродействию лучше в раз 100.

Код: Выделить всё

setGlobal("ThisComputer.CPU_temp",file_get_contents('/sys/class/thermal/thermal_zone0/temp') / 1000);
Последний раз редактировалось nightwind Сб мар 02, 2019 9:38 pm, всего редактировалось 1 раз.
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Как принципиально подключаются устройства.

Сообщение Chainik » Сб мар 02, 2019 9:20 pm

Итак, сейчас мы рассмотрим вариант, когда в качестве контроллера у нас будет выступать 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
MegaD-2561-web-port-config-dsen-ds18b20.gif (7.38 КБ) 5876 просмотров
И мы тут же увидим температуру на датчике (в данном случае 28.56 С⁰).
Еще можно ввести в адресную строку браузера

Код: Выделить всё

http://192.168.0.14/sec/?pt=32&cmd=get
и нажать 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
Модули из Маркета дополнений.jpg (291.4 КБ) 5876 просмотров
Для работы с контроллерами 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).
Последний раз редактировалось Chainik Сб мар 02, 2019 9:49 pm, всего редактировалось 1 раз.
За это сообщение автора Chainik поблагодарили (всего 3):
Fat-Zer (Вс мар 03, 2019 2:20 am) • Nail (Ср мар 20, 2019 2:27 pm) • madbob (Пн мар 25, 2019 9:58 pm)
Рейтинг: 3.49%
fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Как принципиально подключаются устройства.

Сообщение fandaymon » Сб мар 02, 2019 9:38 pm

nightwind писал(а):
Сб мар 02, 2019 9:16 pm

Код: Выделить всё

import urllib
import os

temperature = os.popen('vcgencmd measure_temp').readline()
temperature =  temperature.replace("temp=","").replace("'C\n","")
link="http://127.0.0.1/objects/?op=set&object=ThisComputer&p=CpuTemp&v=" + temperature
f=urllib.urlopen(link)
оверхед космический! так скоро стоядерного процессора не хватит. :mrgreen: зато низкиq порог входа и не нужны {}
решается все одной строчкой, по быстродействию лучше в раз 100.

Код: Выделить всё

setGlobal("ThisComputer.CPU_temp",file_get_contents('/sys/class/thermal/thermal_zone0/temp') / 1000);
Да прям. Так уж и в 100 раз. У меня к тому же в этом же скрипте другие датчики опрашиваются, а температура это просто заодно
Fat-Zer
Сообщения: 6
Зарегистрирован: Ср фев 27, 2019 9:06 am
Благодарил (а): 2 раза
Поблагодарили: 2 раза

Re: Как принципиально подключаются устройства.

Сообщение Fat-Zer » Вс мар 03, 2019 7:24 am

fandaymon, Chainik, спасибо за ответы, многое теперь стало понятнее. Ключевой момент для меня был в том, что я не понимал, что свойства объектов обновляются исключительно вручную, через `setGlobal()`, что из пользовательских скриптов, что из web-сервера, что из циклов. Теперь всё встало на свои места. Плюс к этому думал, что объекты будут как-то автомагически создаваться поиском на шинах.
fandaymon писал(а):
Сб мар 02, 2019 4:44 pm
По-моему в Базе знаний все вопросы освещены очень подробно.
Проклятье знаний. Вещи, которые кажутся очевидными знающему обычно не так очевидны для непосвящённых.
fandaymon писал(а):
Сб мар 02, 2019 9:38 pm
Да прям. Так уж и в 100 раз. У меня к тому же в этом же скрипте другие датчики опрашиваются, а температура это просто заодно
Вполне вероятно, что это значение близко к истине (±порядок). ;)
Но (<Очень маленькая величина> × 100) обычно остаётся очень маленькой величиной, так что на практике это скорей всего будет незаметно.
Chainik писал(а):
Сб мар 02, 2019 9:20 pm
Датчик DS18B20 можно подключить напрямую к цифровым портам контроллера MegaD-2561.
А ты аффилирован с производителем как-то? Вопрос без намёков/претензий, просто интересно.
Chainik писал(а):
Сб мар 02, 2019 9:20 pm
Можно записать в «onNewMinute»
А из коробки какой-нибудь ежесекундный таймер есть? Или для этого придётся уже свой цикл делать?


Отвечу ещё на пару своих вопросов:
Fat-Zer писал(а):
Пт мар 01, 2019 11:44 pm
Ведь весь обмен «заднего конца» и «мордой» идёт через мускуль?
да
Fat-Zer писал(а):
Пт мар 01, 2019 11:44 pm
По умолчанию для короткоживущих данных используются временные таблицы?
Нет, такой возможности нет, все данные сохраняются напрямую в базу на диск. Хорошо было бы это реализовать.
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Как принципиально подключаются устройства.

Сообщение Chainik » Вс мар 03, 2019 8:35 am

Fat-Zer писал(а):
Вс мар 03, 2019 7:24 am
Chainik писал(а):
Сб мар 02, 2019 9:20 pm
Датчик DS18B20 можно подключить напрямую к цифровым портам контроллера MegaD-2561.
А ты аффилирован с производителем как-то? Вопрос без намёков/претензий, просто интересно.
Нет, никак не связан, кроме того что являюсь "счастливым обладателем" нескольких таких контроллеров. С другим оборудованием дела не имел, поэтому могу что-то подсказать/рассказать людям только на примере MegaD.
Fat-Zer писал(а):
Вс мар 03, 2019 7:24 am
Chainik писал(а):
Сб мар 02, 2019 9:20 pm
Можно записать в «onNewMinute»
А из коробки какой-нибудь ежесекундный таймер есть? Или для этого придётся уже свой цикл делать?
"Из коробки" нет, но несложно сделать (viewtopic.php?f=4&t=1534).
Меня, правда, всегда удивляло (с практической точки зрения) стремление опрашивать датчики ежесекундно.
Сеть не умрет, сервер не развалится, но зачем же так издеваться над системой, особенно если у свойств есть история...
Ответить