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

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

Модератор: immortal

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 КБ) 5875 просмотров
И мы тут же увидим температуру на датчике (в данном случае 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 КБ) 5875 просмотров
Для работы с контроллерами 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).
Меня, правда, всегда удивляло (с практической точки зрения) стремление опрашивать датчики ежесекундно.
Сеть не умрет, сервер не развалится, но зачем же так издеваться над системой, особенно если у свойств есть история...
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

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

Сообщение skysilver » Пн мар 04, 2019 1:49 pm

Fat-Zer писал(а):
Вс мар 03, 2019 7:24 am
Нет, такой возможности нет, все данные сохраняются напрямую в базу на диск. Хорошо было бы это реализовать.
Для пользователя такой возможности нет. Но архитектурно предусмотрены некоторые таблицы с типом MEMORY, которые размещаются в ОЗУ и ничего не пишут на диск. А в образах для малинок вообще вся база крутится в ОЗУ по умолчанию, чтобы уменьшить износ карты памяти.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
lexfin
Сообщения: 8
Зарегистрирован: Пн янв 08, 2018 12:49 pm
Благодарил (а): 2 раза
Поблагодарили: 0

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

Сообщение lexfin » Пн мар 04, 2019 3:57 pm

Если играться с Linux и устанавливать МД скриптом, то там же параллельно ставиться и MQTT. Прошивки с mqtt и для есп и для ардуины есть и платные и бесплатные. Данные идут с той скоростью с какой настроишь в прошивке. Модуль mqtt для МД это все читает. Остается наклепать в "Простых устройствах" датчиков и релюшек, которые автоматически создадут нужные объекты и привязать эти объекты к данным приходящим по mqtt. Там-же, в ПУ, пожно вывести эти данные на сцену и в меню. По моему это самый простой способ по которому иду сам. Ничего программировать не нужно.
Fat-Zer
Сообщения: 6
Зарегистрирован: Ср фев 27, 2019 9:06 am
Благодарил (а): 2 раза
Поблагодарили: 2 раза

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

Сообщение Fat-Zer » Пн мар 04, 2019 8:52 pm

Chainik писал(а):
Вс мар 03, 2019 8:35 am
Меня, правда, всегда удивляло (с практической точки зрения) стремление опрашивать датчики ежесекундно.
В плане сделать это для быстро меняющихся данных, например, текущие электрический ток/мощность и запустить это в живой график со значениями на пару минут. Мне нравится идея обратной связи «включил свет→увидел скачок потребления тока».
skysilver писал(а):
Пн мар 04, 2019 1:49 pm
Для пользователя такой возможности нет. Но архитектурно предусмотрены некоторые таблицы с типом MEMORY, которые размещаются в ОЗУ и ничего не пишут на диск.
Из коробки такая таблица всего одна — cached_values и она используется в основном для кеширования значений при чтении... в принципе на её основе было бы несложно сделать write-back кеш...
skysilver писал(а):
Пн мар 04, 2019 1:49 pm
А в образах для малинок вообще вся база крутится в ОЗУ по умолчанию, чтобы уменьшить износ карты памяти.
Образ, честно сказать, не смотрел, но подозреваю, что не вся, а только «значения свойств» (ситуация «моргнул свет→настраивай всё с нуля» думаю ни кого не устраивает)... В любом случае, обычной практикой является, что некоторое значения свойств представляют настройки пользователя (я прав?), а они не должны теряться.
lexfin писал(а):
Пн мар 04, 2019 3:57 pm
Если играться с Linux и устанавливать МД скриптом, то там же параллельно ставиться и MQTT. Прошивки с mqtt и для есп и для ардуины есть и платные и бесплатные.
Я чураюсь использовать беспроводные средства — полноценную защиту (класса wpa) на них не создашь (или я ошибаюсь?), так что мой внутренний параноик строго против... А ethernet ИМХО всё же тяжеловат для система организации УД и под него мало дешёвого готового оборудования. Пока склоняюсь к modbus+1wire в качестве основных шин сети. В них, конечно, очень не хватает прерываний, но большинство параметров этого не требуют. Благо вся закладка системы будет на стадии строительства, так что протянуть сотню-другую метров кабеля — не проблема...
lexfin
Сообщения: 8
Зарегистрирован: Пн янв 08, 2018 12:49 pm
Благодарил (а): 2 раза
Поблагодарили: 0

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

Сообщение lexfin » Вт мар 05, 2019 8:18 am

Так всеравнож домашний вайфай висит, смысл боятся к нему есп подключать? Параноика стоит иногда задвигать подальше).
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

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

Сообщение tarasfrompir » Вт мар 05, 2019 8:40 am

По поводу вафли - заведи внутреннюю сеть с многими буквами в пароле на нее .
Пока что сам не смог поламать свою сеть.. Хотя взломщик из меня по словарям :oops: :oops: :oops:
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
nightwind
Сообщения: 333
Зарегистрирован: Вс июн 26, 2016 4:42 pm
Откуда: Барановичи
Благодарил (а): 28 раз
Поблагодарили: 52 раза
Контактная информация:

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

Сообщение nightwind » Пт мар 08, 2019 10:54 pm

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 раз. У меня к тому же в этом же скрипте другие датчики опрашиваются, а температура это просто заодно
Друг, спорить на коньяк не стану, но судя по опыту - твой код будет тормознее еще больше, чем в сто раз. я фанат оптимизаций, довелось один эмбеддед проект ускорить более чем в 10 000 раз)
Ответить