[Модуль] MegaD (megad)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

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

Re: Модуль "MegaD"

Сообщение Chainik » Ср фев 28, 2018 7:17 pm

Ну что же, надо обращаться к сообществу. Итак, дано:

1. Сценарий, запускающий опрос датчика htu21d (работает по протоколу I2C). Код сценария:
СпойлерПоказать

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

define("SCL", "8");
define("SDA", "9");
define("MD", "http://192.168.0.14/sec/?");

require_once("mod_i2c_htu21d.php");

$temperature = get_htu21d_temperature();
echo "Temperature: ".$temperature;

$humidity = get_htu21d_humidity();
echo "Humidity: ".$humidity;

$hum_compensated = $humidity + (25 - $temperature) * -0.15;
echo "Humidity (compensated): ".$hum_compensated; 
Из кода сценария происходит обращение к файлу драйвера датчика (mod_i2c_htu21d.php).

2. Файл драйвера датчика htu21d (mod_i2c_htu21d.php).
mod_i2c_htu21d.rar
(2.35 КБ) 134 скачивания
Из файла драйвера происходит вызов I2C-библиотеки (файла mod_i2c_lib.php). Код этого вызова:

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

require_once("mod_i2c_lib.php"); 
3. Файл библиотеки I2C -- mod_i2c_lib.php.
i2c-php-lib.zip
(1.14 КБ) 122 скачивания
Внимание, вопрос! Что надо сделать, чтобы все это в совокупности заработало (привело к получению показаний "датчика-партизана")?
Т.е. куда правильно поместить файлы драйвера и библиотеки, как поправить код сценария и драйвера, чтобы "процесс пошел"?

Просьба тех, кто понимает (в отличие от нас), откликнуться.
(Сам протестировать не смогу, т.к. нахожусь далеко от оборудования.)
seaven
Сообщения: 13
Зарегистрирован: Чт мар 01, 2018 4:15 pm
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Модуль "MegaD"

Сообщение seaven » Чт мар 01, 2018 5:51 pm

sergejey писал(а):
barsmaster писал(а):Метод свитч абсолютно стандартный, не переопределялся.
https://gyazo.com/79b0fd6466178e632e4321aa597c221d
У релюх переопределены статус апдейтед, они вызываются автоматически при смене статуса. Собственно поэтому мега и дергает метод свитч, чтобы инвертировать состояние status.
https://gyazo.com/c44e627d0e1d2a3ac7d026cf150965c8

В общем вышел из положения так: вход меги инвертирует выход меги (релюшку), к статусу релюшки привязал статус светильника. Так работает.
Получается MD не корректно вызывает методы, а может работать только со свойствами.
Не совсем так. Смотрите, что получается, при переключении из интерфейса идёт команда в мегу и после неё дополнительный запрос на считывание всех значений -- это нужно, если по какой-то внутренней логике мега переключила другие выходы. Так вот, почему-то в этих считываемых данных есть признак изменений на входе, подключенном к физическому выключателю и вызывается метод, связанный с этим выключателем. Давайте попробуем исправить, но для этого надо включить в настройках модуля MegaD логирование входящих данных и прислать мне кусок лога, который появляется в момент воспроизведения ошибки.
Добрый день, Сергей!
Насколько я понимаю, ошибка не исправлена и многие новички с этим сталкиваются.
Я очень плохой программист, но готов помочь, чем смогу.
Если я ничего не путаю, то у меня проблема проявляется в повторном (двойном) выполнении методов через десятки секунд. В логе MegaD лишних строк я не вижу.
Fav0rit
Сообщения: 60
Зарегистрирован: Чт мар 19, 2015 10:27 pm
Благодарил (а): 8 раз
Поблагодарили: 22 раза

Re: Модуль "MegaD"

Сообщение Fav0rit » Пт мар 02, 2018 12:00 pm

Нашел ошибку в модуле при обработке, которая возникает при обработке GET запроса с MegaD. К меге подключено два релейных модуля, при замыкании контактов на одном из них мега шлет на сервер GET запрос:
GET /megad.php?pt=17&cnt=39&mdid=1 HTTP/1.1" 200 157 "-" "megad"
В этом запросе присутствует номер замкнутого контакта, счетчик и ID контроллера.
Мега ожидает получить ответ вида: "23:2", например, это команда на переключение выхода 23, НО из-за того, что в запросе присутствует параметр счетчика, который может запускать метод, в моем случае это метод onActivity в комнате, в ответе сервера присутствует еще и результат вызова метода, причем раньше тех самых 23:2 которые он тоже выводит.
Проблема в коде в файле megad.class.php
Блок if ($ecmd) вынес выше чем if (isset($cnt))
В последнем в строке 430 заменил
callMethod($prop['LINKED_OBJECT2'].'.'.$prop['LINKED_METHOD2'], $params);
на
callMethodSafe($prop['LINKED_OBJECT2'].'.'.$prop['LINKED_METHOD2'], $params);
Таким образом вызов выполняется в отдельном потоке и не портит ответ своими результатами.
Alexiy2
Сообщения: 104
Зарегистрирован: Вт май 12, 2015 9:59 pm
Благодарил (а): 16 раз
Поблагодарили: 13 раз

Re: Модуль "MegaD"

Сообщение Alexiy2 » Ср мар 07, 2018 11:43 am

Сергей!!! Прошу, разъясните пожалуйста вот такой момент:
имею на борту системы модуль MegaD. При сканировании устройств модуль находит их, но устройство MegaD-14-in при сканировании почему то порт P1 находит как вход и как выход одновременно! Думал, что это косяк системы или прошивки самой MegaD, но по эксперементировав, пришел к выводу, что это все же виноват сам модуль!
скриншот во вложении
Вложения
Безымянный.png
Безымянный.png (33.47 КБ) 6027 просмотров
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Модуль "MegaD"

Сообщение Chainik » Ср мар 07, 2018 1:01 pm

Alexiy2 писал(а):При сканировании устройств модуль находит их, но устройство MegaD-14-in при сканировании почему то порт P1 находит как вход и как выход одновременно!
У меня такого нет (и остальные не жаловались). Много кто пользуется модулем. Уже бы "всплыло" раньше. Попробуйте перечитать конфигурацию (Read Config) на вкладке Advenced.
Alexiy2
Сообщения: 104
Зарегистрирован: Вт май 12, 2015 9:59 pm
Благодарил (а): 16 раз
Поблагодарили: 13 раз

Re: Модуль "MegaD"

Сообщение Alexiy2 » Пт мар 09, 2018 4:10 am

И конфиги перечитал, и Мегу прошил на версии 3.56 и 3.57b1, и память ей почистил ключём "-ее" при прошивке, и на совершенно новую систему установил, но все осталось на прежнем уровне!!! Канал Р1 определяется и как вход, и как выход!!! Осталось только откатить прошивку Меги на версию помладше!!! А не подскажешь, у тебя какая версия???
Система на ubuntu server 16.04

Отправлено с моего Lenovo TB3-730X через Tapatalk
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Модуль "MegaD"

Сообщение Chainik » Пт мар 09, 2018 10:49 am

У меня в распоряжении 2 Меги-328 (fw: 3.43) и (fw: 3.56). Нигде подобных проблем не замечено. Ни разу не перепрошивал (за ненадобностью).
Система на Win10.
condor77
Сообщения: 36
Зарегистрирован: Пн окт 30, 2017 9:54 am
Благодарил (а): 8 раз
Поблагодарили: 2 раза

Re: Модуль "MegaD"

Сообщение condor77 » Сб мар 10, 2018 6:22 pm

Ура, я победил i2c датчик HTU21D. Проблема оказалась в конденсаторах установленных по входу на землю.
Теперь при выполнении скрипта я получаю вот такую строку в ответ.
Temperature: 23.40 Humidity: 35.18 Humidity (compensated): 34.94
Дак вот теперь у меня вопрос как это всё правильно распихать по нужным свойствам нужных объектов?
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Модуль "MegaD"

Сообщение Chainik » Сб мар 10, 2018 8:15 pm

Тут уже надо работать со строковыми функциями PHP. Что-нибудь типа того:

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

//То, что для примера используется как текст в кавычках, конечно, должно быть указано в виде переменной
$T="Temperature: 23.40 Humidity: 35.18 Humidity (compensated): 34.94";
$Temp = substr($T, 13, 5);
sg('Имя_Объекта.Имя_Свойства_Temp',$Temp);
$Hum = substr($T, 29, 5);
sg('Имя_Объекта.Имя_Свойства_Hum',$Hum);
$HumComp = substr($T, 59, 5);
sg('Имя_Объекта.Имя_Свойства_HumComp',$HumComp); 
Мог что-то напутать с кодом, но смысл, думаю, понятен.
Еще, результат (возможно), будет получен в виде текста (а не числового значения). Это может препятствовать формированию графиков. Т.е. в этом случае, надо будет дополнительно преобразовать текст в число.

И, с практической точки зрения, вряд ли вам понадобятся сразу две "влажности".
Последний раз редактировалось Chainik Сб мар 10, 2018 11:02 pm, всего редактировалось 1 раз.
condor77
Сообщения: 36
Зарегистрирован: Пн окт 30, 2017 9:54 am
Благодарил (а): 8 раз
Поблагодарили: 2 раза

Re: Модуль "MegaD"

Сообщение condor77 » Сб мар 10, 2018 8:40 pm

О вариант решения тоже довольно интересный. Но я до такого не додумался.
Я пока сейчас сидел экспериментировал додумался только добавить в скрипт получения данных с датчика после каждой строчки вывода, строчку присвоения. Получилось так:
Код скрипта GetТemHumMegaD1Показать

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

define("SCL", "5");
define("SDA", "6");
define("MD", "http://110.110.110.115/sec/?");

// Вариант реализации I2C: 1 - полностью программный; 2 - частично аппаратный (прошивка 3.43beta1 и выше)
define("V", "1");

require_once("mod_i2c_htu21d.php");

$temperature = get_htu21d_temperature();
echo "Temperature: ".$temperature."\n";
sg("TempSensor3.temp",$temperature);

$humidity = get_htu21d_humidity();
echo "Humidity: ".$humidity."\n";
sg("humSensor02.humidity",$humidity);

$hum_compensated = $humidity + (25 - $temperature) * -0.15;
echo "Humidity (compensated): ".$hum_compensated."\n"; 
Получилось всё отлично. Вывод в цифрах как надо.
Ответить