мдм, мегаД, d18b20
Модератор: immortal
-
- Сообщения: 141
- Зарегистрирован: Пн авг 22, 2016 10:03 am
- Благодарил (а): 28 раз
- Поблагодарили: 5 раз
мдм, мегаД, 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) не отображается.
Как мне значения температуры завести в мдм?
благодарю
-
- Сообщения: 1462
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
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("Имя_объекта.Имя_метода");}
- Рейтинг: 1.16%
-
- Сообщения: 141
- Зарегистрирован: Пн авг 22, 2016 10:03 am
- Благодарил (а): 28 раз
- Поблагодарили: 5 раз
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" потерян.
Датчики же не только в одинаковых по температуре помещениях могут находиться. На улице датчик вообще может показывать от минусовой до плюсовой температуры, замучаешься код править.
Как можно выйти из это ситуации.
Датчики подключены шиной.
благодарю
-
- Сообщения: 1462
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
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]);
//и т.д.
-
- Сообщения: 141
- Зарегистрирован: Пн авг 22, 2016 10:03 am
- Благодарил (а): 28 раз
- Поблагодарили: 5 раз
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]);
}
//--------------------------------------------------------------------------------------
-
- Сообщения: 1553
- Зарегистрирован: Сб янв 13, 2018 5:00 pm
- Благодарил (а): 39 раз
- Поблагодарили: 574 раза
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]);
}
}
- Рейтинг: 1.16%
-
- Сообщения: 1462
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: мдм, мегаД, d18b20
Вот видите, как элегантно решают задачу настоящие программисты.
А я, на правах чайника )) могу вам предложить просто дописать "недостающий" символ в конец строки:
Код: Выделить всё
$Val = file_get_contents("http://10.12.10.117/sec/?pt=30&cmd=list").';';
- Рейтинг: 1.16%
-
- Сообщения: 141
- Зарегистрирован: Пн авг 22, 2016 10:03 am
- Благодарил (а): 28 раз
- Поблагодарили: 5 раз
Re: мдм, мегаД, d18b20
Заработало.Chainik писал(а): ↑Ср янв 13, 2021 6:56 pmВот видите, как элегантно решают задачу настоящие программисты.
А я, на правах чайника )) могу вам предложить просто дописать "недостающий" символ в конец строки:Код: Выделить всё
$Val = file_get_contents("http://10.12.10.117/sec/?pt=30&cmd=list").';';
Удачи! Не болейте.
-
- Сообщения: 141
- Зарегистрирован: Пн авг 22, 2016 10:03 am
- Благодарил (а): 28 раз
- Поблагодарили: 5 раз
Re: мдм, мегаД, d18b20
Добрый.
Подскажите пожалуйста.
Разбираю строку от мегиД с помощью кода выше, сохраняю в свойства объектов данные температур скриптом.
Есть проблема с busy.
Парсю строку с меги раз в минуту. Иногда в момент конвертации (busy) происходит запуск скрипта, и естественно данные в мдм не сохраняются. По мануалу с ab-log.ru мегаД конвертирует данные раз в 30 секунд. Поэтому минут по 5 данные в мдм не влетают - совпадают периоды.
Как можно это решить?
благодарю
Подскажите пожалуйста.
Разбираю строку от мегиД с помощью кода выше, сохраняю в свойства объектов данные температур скриптом.
Есть проблема с busy.
Парсю строку с меги раз в минуту. Иногда в момент конвертации (busy) происходит запуск скрипта, и естественно данные в мдм не сохраняются. По мануалу с ab-log.ru мегаД конвертирует данные раз в 30 секунд. Поэтому минут по 5 данные в мдм не влетают - совпадают периоды.
Как можно это решить?
благодарю
-
- Сообщения: 1462
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
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);
}
- Рейтинг: 1.16%