мдм, мегаД, d18b20
Модератор: immortal
мдм, мегаД, d18b20
Добрый.
Плиз подскажите пожалуйста. К мегед подключены несколько датчиков d18b20. Мега их видит, формат: 19c177911102:15.50;53d91e000080:-2.62;ffe212821704:17.00;ffbaad811704:5.00;ff912d811705:5.50;ff052b811705:9.50
В модуле Меги в мдм этот порт (р30) не отображается.
Как мне значения температуры завести в мдм?
благодарю
Плиз подскажите пожалуйста. К мегед подключены несколько датчиков d18b20. Мега их видит, формат: 19c177911102:15.50;53d91e000080:-2.62;ffe212821704:17.00;ffbaad811704:5.00;ff912d811705:5.50;ff052b811705:9.50
В модуле Меги в мдм этот порт (р30) не отображается.
Как мне значения температуры завести в мдм?
благодарю
Re: мдм, мегаД, d18b20
Чтобы получать и использовать значения с датчиков, задействовать программный модуль "MegaD" вовсе не обязательно.
В вашем случае можно сделать по-аналогии (https://mjdm.ru/forum/viewtopic.php?f=5 ... start=1073). Адреса датчиков и параметры доступа к Меге, конечно, ваши.
Т.е.:
1. Создаем сценарий/метод с кодом опроса датчика(ов).
2. Организуем периодический запуск сценария/метода с кодом опроса. Проще всего это сделать, записав в «onNewMinute» (Панель управления --> ОБЪЕКТЫ --> Объекты --> [класс] Timer --> ClockChime --> onNewMinute) такой код (ниже строки «$m=date('i',time());»):
Опрос будет происходить в данном случае раз в 15 минут.
В вашем случае можно сделать по-аналогии (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("Имя_объекта.Имя_метода");}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());»):Опрос будет происходить в данном случае раз в 15 минут.Код: Выделить всё
//В случае сценария if ($m%15 == 0) {runScriptSafe("Имя_вашего_сценария");} //В случае метода if ($m%15 == 0) {callMethodSafe("Имя_объекта.Имя_метода");}
Сделал. Но есть проблема.
Суть: мегаД формирует строку вида: 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" потерян.
Датчики же не только в одинаковых по температуре помещениях могут находиться. На улице датчик вообще может показывать от минусовой до плюсовой температуры, замучаешься код править.
Как можно выйти из это ситуации.
Датчики подключены шиной.
благодарю
Re: мдм, мегаД, d18b20
Да, согласен, есть "логический недосмотр" с моей стороны.
Давайте попробуем чуть модифицировать код.
Обработка строки будет производиться так:
Использование значения -- так:
Попробуйте. Надеюсь, ничего не накосячил в коде, пока писал.
Давайте попробуем чуть модифицировать код.
Обработка строки будет производиться так:
Код: Выделить всё
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]);
//и т.д.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]); //и т.д.
Почти взлетел.
Но в строке от меги в самом конце, в данных от датчика, нет символа ";".
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]);
}
//--------------------------------------------------------------------------------------Re: мдм, мегаД, d18b20
Регулярные выражения это конечно хорошо, но в данном случае они тут не нужны
Если у нас в переменной $mega находится строка 19c177911102:14.00;53d91e000080:-6.43;ffe212821704:23.50;ffbaad811704:4.00;ff912d811705:5.50;ff052b811705:9.00, то при помощи команды explode(';',$mega) мы получаем пары id датчика: температура в массиве. Далее перебираем элементы массива и снова делаем explode, но уже по разделителю : и заносим температуру в объекты:
Если у нас в переменной $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]);
}
}Re: мдм, мегаД, d18b20
Вот видите, как элегантно решают задачу настоящие программисты.yden писал(а): Ср янв 13, 2021 5:59 pm Почти взлетел.
Но в строке от меги в самом конце, в данных от датчика, нет символа ";".
А я, на правах чайника )) могу вам предложить просто дописать "недостающий" символ в конец строки:
Код: Выделить всё
$Val = file_get_contents("http://10.12.10.117/sec/?pt=30&cmd=list").';';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").';';
Удачи! Не болейте.
Re: мдм, мегаД, d18b20
Добрый.
Подскажите пожалуйста.
Разбираю строку от мегиД с помощью кода выше, сохраняю в свойства объектов данные температур скриптом.
Есть проблема с busy.
Парсю строку с меги раз в минуту. Иногда в момент конвертации (busy) происходит запуск скрипта, и естественно данные в мдм не сохраняются. По мануалу с ab-log.ru мегаД конвертирует данные раз в 30 секунд. Поэтому минут по 5 данные в мдм не влетают - совпадают периоды.
Как можно это решить?
благодарю
Подскажите пожалуйста.
Разбираю строку от мегиД с помощью кода выше, сохраняю в свойства объектов данные температур скриптом.
Есть проблема с busy.
Парсю строку с меги раз в минуту. Иногда в момент конвертации (busy) происходит запуск скрипта, и естественно данные в мдм не сохраняются. По мануалу с ab-log.ru мегаД конвертирует данные раз в 30 секунд. Поэтому минут по 5 данные в мдм не влетают - совпадают периоды.
Как можно это решить?
благодарю
Re: мдм, мегаД, d18b20
В случае "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);
}