мдм, мегаД, d18b20

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

Модератор: immortal

Ответить
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

мдм, мегаД, d18b20

Сообщение yden » Вт янв 12, 2021 3:41 pm

Добрый.
Плиз подскажите пожалуйста. К мегед подключены несколько датчиков d18b20. Мега их видит, формат: 19c177911102:15.50;53d91e000080:-2.62;ffe212821704:17.00;ffbaad811704:5.00;ff912d811705:5.50;ff052b811705:9.50
В модуле Меги в мдм этот порт (р30) не отображается.
Как мне значения температуры завести в мдм?

благодарю
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: мдм, мегаД, d18b20

Сообщение Chainik » Вт янв 12, 2021 3:59 pm

Чтобы получать и использовать значения с датчиков, задействовать программный модуль "MegaD" вовсе не обязательно.
В вашем случае можно сделать по-аналогии (https://mjdm.ru/forum/viewtopic.php?f=5 ... start=1073). Адреса датчиков и параметры доступа к Меге, конечно, ваши.

Т.е.:
1. Создаем сценарий/метод с кодом опроса датчика(ов).
2. Организуем периодический запуск сценария/метода с кодом опроса. Проще всего это сделать, записав в «onNewMinute» (Панель управления --> ОБЪЕКТЫ --> Объекты --> [класс] Timer --> ClockChime --> onNewMinute) такой код (ниже строки «$m=date('i',time());»):

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

//В случае сценария
if ($m%15 == 0) {runScriptSafe("Имя_вашего_сценария");}
//В случае метода
if ($m%15 == 0) {callMethodSafe("Имя_объекта.Имя_метода");}
Опрос будет происходить в данном случае раз в 15 минут.
За это сообщение автора Chainik поблагодарил:
yden (Вт янв 12, 2021 4:29 pm)
Рейтинг: 1.16%
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Re: мдм, мегаД, d18b20

Сообщение yden » Ср янв 13, 2021 3:24 pm

Chainik писал(а):
Вт янв 12, 2021 3:59 pm
Чтобы получать и использовать значения с датчиков, задействовать программный модуль "MegaD" вовсе не обязательно.
В вашем случае можно сделать по-аналогии (https://mjdm.ru/forum/viewtopic.php?f=5 ... start=1073). Адреса датчиков и параметры доступа к Меге, конечно, ваши.

Т.е.:
1. Создаем сценарий/метод с кодом опроса датчика(ов).
2. Организуем периодический запуск сценария/метода с кодом опроса. Проще всего это сделать, записав в «onNewMinute» (Панель управления --> ОБЪЕКТЫ --> Объекты --> [класс] Timer --> ClockChime --> onNewMinute) такой код (ниже строки «$m=date('i',time());»):

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

//В случае сценария
if ($m%15 == 0) {runScriptSafe("Имя_вашего_сценария");}
//В случае метода
if ($m%15 == 0) {callMethodSafe("Имя_объекта.Имя_метода");}
Опрос будет происходить в данном случае раз в 15 минут.
Сенк за ссылку.
Сделал. Но есть проблема.
Суть: мегаД формирует строку вида: 19c177911102:14.00;53d91e000080:-6.43;ffe212821704:23.50;ffbaad811704:4.00;ff912d811705:5.50;ff052b811705:9.00
После знака ":" идет несколько цифр - температура.
Строка в коде:
$temp = substr(strstr($Val, '19c177911102:'), 13, 5);
Находит необходимый фрагмент из 13 символов в коде, и после него переменной $temp присваивает 5 символов
Например, T=10.00, т.е 5 символов, $temp = 10.00. Все в норме. Проблемы начинаются, если появляются значения температуры меньше 10 и минусовые.
Например, Т=9.00, $temp = 9.00;
Лишний символ ";".
Например, Т=-10.87, $temp = -10.8
Символ "7" потерян.
Датчики же не только в одинаковых по температуре помещениях могут находиться. На улице датчик вообще может показывать от минусовой до плюсовой температуры, замучаешься код править.
Как можно выйти из это ситуации.
Датчики подключены шиной.

благодарю
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: мдм, мегаД, d18b20

Сообщение Chainik » Ср янв 13, 2021 5:03 pm

Да, согласен, есть "логический недосмотр" с моей стороны.
Давайте попробуем чуть модифицировать код.
Обработка строки будет производиться так:

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

preg_match('~19c177911102:(.*?);~',$Val,$T1);
preg_match('~53d91e000080:(.*?);~',$Val,$T2);
preg_match('~ffe212821704:(.*?);~',$Val,$T3);
//...
Использование значения -- так:

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

sg('Ваш_объект.Ваше_свойство_для_Т1', $T1[1]);
sg('Ваш_объект.Ваше_свойство_для_Т2', $T2[1]);
sg('Ваш_объект.Ваше_свойство_для_Т3', $T3[1]);
//и т.д.
//или для say
say("T1=".$T1[1]);
//и т.д.
Попробуйте. Надеюсь, ничего не накосячил в коде, пока писал.
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Re: мдм, мегаД, d18b20

Сообщение yden » Ср янв 13, 2021 5:59 pm

Chainik писал(а):
Ср янв 13, 2021 5:03 pm
Да, согласен, есть "логический недосмотр" с моей стороны.
Давайте попробуем чуть модифицировать код.
Обработка строки будет производиться так:

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

preg_match('~19c177911102:(.*?);~',$Val,$T1);
preg_match('~53d91e000080:(.*?);~',$Val,$T2);
preg_match('~ffe212821704:(.*?);~',$Val,$T3);
//...
Использование значения -- так:

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

sg('Ваш_объект.Ваше_свойство_для_Т1', $T1[1]);
sg('Ваш_объект.Ваше_свойство_для_Т2', $T2[1]);
sg('Ваш_объект.Ваше_свойство_для_Т3', $T3[1]);
//и т.д.
//или для say
say("T1=".$T1[1]);
//и т.д.
Попробуйте. Надеюсь, ничего не накосячил в коде, пока писал.
Сенк.
Почти взлетел. :)
Но в строке от меги в самом конце, в данных от датчика, нет символа ";".
19c177911102:15.00;53d91e000080:-7.43;ffe212821704:18.50;ffbaad811704:3.00;ff912d811705:2.50;ff052b811705:9.50
После "9.50".
Я в этом шаманстве со строками полный ноль. Строка в коде: preg_match('~ff052b811705:(.*?);~',$Val,$tempPodvalServer);

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

//--------------------------------------------------------------------------------------
//Получаем список значений 
$Val = file_get_contents("http://10.12.10.117/sec/?pt=30&cmd=list");
preg_match('~19c177911102:(.*?);~',$Val,$tempFloorTambur);
preg_match('~53d91e000080:(.*?);~',$Val,$tempBudka);
preg_match('~ffe212821704:(.*?);~',$Val,$tempFloorVeranda);
preg_match('~ffbaad811704:(.*?);~',$Val,$tempTambur);
preg_match('~ff912d811705:(.*?);~',$Val,$tempWater);
preg_match('~ff052b811705:(.*?);~',$Val,$tempPodvalServer);

if ($Val != "busy") 
	{
		sg('ClimatFloorTambur.tempIn', $tempFloorTambur[1]);
		sg('ClimatFloorVeranda.tempIn', $tempFloorVeranda[1]);
		sg('ClimatBudka.tempIn', $tempBudka[1]);
		sg('ClimatTambur.tempIn', $tempTambur[1]);		
		sg('ClimatPodvalServer.tempIn', $tempPodvalServer[1]);
		sg('ClimatWaterIn.tempIn', $tempWater[1]);
	}
	
//--------------------------------------------------------------------------------------
fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: мдм, мегаД, d18b20

Сообщение fandaymon » Ср янв 13, 2021 6:08 pm

Регулярные выражения это конечно хорошо, но в данном случае они тут не нужны

Если у нас в переменной $mega находится строка 19c177911102:14.00;53d91e000080:-6.43;ffe212821704:23.50;ffbaad811704:4.00;ff912d811705:5.50;ff052b811705:9.00, то при помощи команды explode(';',$mega) мы получаем пары id датчика: температура в массиве. Далее перебираем элементы массива и снова делаем explode, но уже по разделителю : и заносим температуру в объекты:

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

$temps = explode(';',$mega);

if ($t) {
 foreach ($temps as $temp) {
  $t = explode(':', $temp);
  sg($t[0] .'value', $t[1]);
 }
}
За это сообщение автора fandaymon поблагодарил:
Chainik (Ср янв 13, 2021 6:41 pm)
Рейтинг: 1.16%
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: мдм, мегаД, d18b20

Сообщение Chainik » Ср янв 13, 2021 6:56 pm

yden писал(а):
Ср янв 13, 2021 5:59 pm
Почти взлетел. :)
Но в строке от меги в самом конце, в данных от датчика, нет символа ";".
Вот видите, как элегантно решают задачу настоящие программисты.
А я, на правах чайника )) могу вам предложить просто дописать "недостающий" символ в конец строки:

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

$Val = file_get_contents("http://10.12.10.117/sec/?pt=30&cmd=list").';';
За это сообщение автора Chainik поблагодарил:
yden (Ср янв 13, 2021 7:01 pm)
Рейтинг: 1.16%
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Re: мдм, мегаД, d18b20

Сообщение yden » Ср янв 13, 2021 7:01 pm

Chainik писал(а):
Ср янв 13, 2021 6:56 pm
yden писал(а):
Ср янв 13, 2021 5:59 pm
Почти взлетел. :)
Но в строке от меги в самом конце, в данных от датчика, нет символа ";".
Вот видите, как элегантно решают задачу настоящие программисты.
А я, на правах чайника )) могу вам предложить просто дописать "недостающий" символ в конец строки:

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

$Val = file_get_contents("http://10.12.10.117/sec/?pt=30&cmd=list").';';
Заработало.
Удачи! Не болейте.
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Re: мдм, мегаД, d18b20

Сообщение yden » Ср янв 20, 2021 7:00 am

Добрый.
Подскажите пожалуйста.
Разбираю строку от мегиД с помощью кода выше, сохраняю в свойства объектов данные температур скриптом.
Есть проблема с busy.
Парсю строку с меги раз в минуту. Иногда в момент конвертации (busy) происходит запуск скрипта, и естественно данные в мдм не сохраняются. По мануалу с ab-log.ru мегаД конвертирует данные раз в 30 секунд. Поэтому минут по 5 данные в мдм не влетают - совпадают периоды.
Как можно это решить?

благодарю
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: мдм, мегаД, d18b20

Сообщение Chainik » Ср янв 20, 2021 8:55 am

В случае "busy" можно дать команду на повторный опрос датчиков через пару секунд:

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

if ($Val != "busy") 
	{
		sg('ClimatFloorTambur.tempIn', $tempFloorTambur[1]);
		...
		sg('ClimatWaterIn.tempIn', $tempWater[1]);
	} else {
	setTimeOut('myTimer99_RepeatedRequest','runScript("Имя_скрипта");',2);
	//Если код опроса в методе, то
	//setTimeOut('myTimer99_RepeatedRequest','callMethod("Имя_объекта.Имя_метода");',2);
	}
За это сообщение автора Chainik поблагодарил:
yden (Ср янв 20, 2021 9:18 am)
Рейтинг: 1.16%
Ответить