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

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

Модератор: immortal

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

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

Сообщение Chainik » Вс ноя 18, 2018 10:41 pm

Nail писал(а):
Вс ноя 18, 2018 10:16 pm
Знает кто как реализовать в МД , сразу двух датчиков на одном порту Меги 2561?
Можно попробовать строковые функции:

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

//Получаем список значений (адрес, пароль, порт, разумеется, ваши)
$Val = file_get_contents("http://192.168.0.14/sec/?pt=32&cmd=list");
$T1 = substr($Val,"eedb39231601:",5);
$T2 = substr($Val,"ffdb02541604:",5);
sg('Ваш_объект.Ваше_свойство_для_Т1', $T1);
sg('Ваш_объект.Ваше_свойство_для_Т2', $T2);
За это сообщение автора Chainik поблагодарил:
Nail (Пн ноя 19, 2018 3:10 pm)
Рейтинг: 1.16%
Аватара пользователя
Nail
Сообщения: 373
Зарегистрирован: Пн мар 05, 2018 7:09 am
Откуда: Самара
Благодарил (а): 174 раза
Поблагодарили: 28 раз

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

Сообщение Nail » Вс ноя 18, 2018 10:49 pm

Val = file_get_contents("http://192.168.0.14/sec/?pt=32&cmd=list");
Порт наверно мне указать pt =31?
я в РНР новичок, куда вставлять код?
Mini AMD A6 1450 Quad-core.Ubuntu Server 18.04 (64-bit). MegaD. Zigbee2mqtt+SLS ZigBee Gateway. Broadlink.
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Вс ноя 18, 2018 11:13 pm

Nail писал(а):
Вс ноя 18, 2018 10:49 pm
Val = file_get_contents("http://192.168.0.14/sec/?pt=32&cmd=list");
Порт наверно мне указать pt =31?
я в РНР новичок, куда вставлять код?
Тут, скорее, знание основ Мажордомо. Конечно, указываете тот порт, к которому подключена шина с датчиками.
В общем, в админке
1. В объектах создаем новый класс. Назовем его, к примеру, «TempSensors».
2. Добавим в созданный класс свойства. Допустим, назовем свойство для значения температуры "Value", а для уникального адреса датчика -- "SensorAddress".
3. Добавим в класс метод. Назовем его, к примеру, "GetValue". И запишем в него код метода:

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

//Получаем список значений (адрес, пароль, порт, разумеется, ваши)
$Val = file_get_contents("http://192.168.0.14/sec/?pt=31&cmd=list");
//Если шина в момент запроса значений занята их конвертацией, то дополнительно имеет смысл перезапустить метод, выждав небольшую паузу
if ($Val == "Busy") {
setTimeOut($this->object_title,'callMethod($this->object_title.".GetValue");',1);
return"";
}

$Address = $this->getProperty('SensorAddress');
$T = substr($Val,$Address,5);
$this->setProperty('Value',$T);
4. Добавим в класс объекты (отдельный на каждый датчик температуры). Назовем их, к примеру, «TempSensors_01», «TempSensors_02» и т.д.
Теперь для каждого объекта заполним свойство "SensorAddress". Т.е. для «TempSensors_01» -- "eedb39231601:", а для «TempSensors_02» -- "ffdb02541604:".

Ну и пробуем запускать методы внутри объектов вручную. Если я не накосячил с кодом, после исполнения в свойствах объектов "Value" должно появляться значение температуры.

Чтобы запускать методы автоматически с определенной периодичностью, можете сделать по аналогии с тем вариантом, который я описал на предыдущей странице.
Последний раз редактировалось Chainik Пн ноя 19, 2018 12:39 am, всего редактировалось 4 раза.
За это сообщение автора Chainik поблагодарил:
Nail (Вс ноя 18, 2018 11:35 pm)
Рейтинг: 1.16%
Аватара пользователя
Nail
Сообщения: 373
Зарегистрирован: Пн мар 05, 2018 7:09 am
Откуда: Самара
Благодарил (а): 174 раза
Поблагодарили: 28 раз

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

Сообщение Nail » Вс ноя 18, 2018 11:35 pm

СПС. Попробую отпишусь.
Mini AMD A6 1450 Quad-core.Ubuntu Server 18.04 (64-bit). MegaD. Zigbee2mqtt+SLS ZigBee Gateway. Broadlink.
beavisgood
Сообщения: 51
Зарегистрирован: Пт дек 18, 2015 5:42 pm
Благодарил (а): 20 раз
Поблагодарили: 10 раз

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

Сообщение beavisgood » Вт ноя 20, 2018 7:26 am

Привет, у меня вопрос по подключению, кнопки и реле, с железными кнопками возникли проблемы.
Кнопка P0, Реле Р7, классика.

Попытка 1: МОДУЛЬ MegaD:
Сначала пробовал связать эти два объекта через Модуль MegaD, на классических объектах Relay, (status, turnon, turnoff, switch)
из софта реле управляется отлично, но как в дело вступает железная кнопка, начинаются мигания, включения, отключения, реле живет своей жизнью.
Так то все красиво выглядит и логично, настроили модуль, кнопку нажали, мега отправила это событие к мажору.
Мажор принял решение, и выдал команду меге, включи реле, мега приняла эту команду, поменяла состояние порта.
Но к сожалению на связке модуль MegaD этот вариант не работает, Почему? мне не понятно до конца.

Попытка 2: ПРОСТЫЕ УСТРОЙСТВА + МОДУЛЬ MegaD
Пробовал этот вариант, задумка класс, быстро красиво, все понятно, но
не работает примерно так же как и выше описал, реле живет своей жизнью.
У меня есть подозрения, что причина в том что к одному объекту Relay, привязывается два объекта P0 и P7, которые связанны между собой.
Один включает, другой выключает, получается Лебедь, Рак, Щука, каждый меняет статус, в итоге глюки.

Попытка 3: Понял что на хромой кобыле к MegaD не подъедешь
Перечитал все MegaD ветки форума, а это ого го сколько....
В итоге что сделал:
Порт Р0 настроил в режиме Р, действие по умолчанию (ecmd: 7:2)
Создал класс и объекты по инструкции
https://ab-log.ru/forum/viewtopic.php?f=1&t=1328 (в конце поста, после подзаголовка "ДОПОЛНЕНИЕ/УТОЧНЕНИЕ").
Добавил в megad.class.php $params['m']=$m;,
вопрос почему эту строчку не добавляют в стандартную комплектацию модуля? обновления уже были, добавить же не сложно?

В метод switch добавил такой код:

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

if($_GET['m'] == 2) { // прилетело сообщение о длинном нажатии
  say("длинное нажатие",2);
  return "";
}

file_get_contents("http://".$this->getProperty('ipAddress')."/".$this->getProperty('Password')."/?cmd=".$this->getProperty('Port').":2");
$state = file_get_contents("http://".$this->getProperty('ipAddress')."/".$this->getProperty('Password')."/?pt=".$this->getProperty('Port')."&cmd=get");
if ($state == "ON") {
  $this->setProperty('Status', 1);
} else {
  $this->setProperty('Status', 0); }
  
Этот код отлавливает "второе пришествие m == 2 и выходит из метода ничего не делая.
Теперь заработало УРА. Мужики спасибо большое за эту работу.
Вопрос как теперь правильно обработать длинное нажатие? через связку объект:
this->getProperty('ipAddress')."/".$this->getPropert......... пример кода есть?

при условии Р0 настроил в режиме Р, действие по умолчанию (ecmd: 7:2), я это сделал специально, т.к. хочу сохранить автономность MegaD, когда сервер упал
Linux DietPi, OrangePi-PC, MyMegaD328
Connect: http://connect.smartliving.ru/profile/689
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Вт ноя 20, 2018 2:44 pm

beavisgood писал(а):
Вт ноя 20, 2018 7:26 am
Вопрос как теперь правильно обработать длинное нажатие? через связку объект:
this->getProperty('ipAddress')."/".$this->getPropert......... пример кода есть?
Для начала надо понять, что именно должен делать контроллер при длительном нажатии (т.е. какие порты включать/выключать)?
Будет ли действие отличаться, если на соседней кнопке будет длинное нажатие?

Да, если у вас Мега-328, то длительное нажатие реализовать, видимо, можно только программно. Наверное, проще в вашем случае будет вместо длительного использовать двойное нажатие. Вот добрый человек выкладывал видео, как можно это сделать (https://www.youtube.com/watch?v=ghi6KyTTDcE).

Информация к размышлению (https://ab-log.ru/forum/viewtopic.php?f ... start=1563).
beavisgood
Сообщения: 51
Зарегистрирован: Пт дек 18, 2015 5:42 pm
Благодарил (а): 20 раз
Поблагодарили: 10 раз

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

Сообщение beavisgood » Вт ноя 20, 2018 8:01 pm

Chainik писал(а):
Вт ноя 20, 2018 2:44 pm
Для начала надо понять, что именно должен делать контроллер при длительном нажатии (т.е. какие порты включать/выключать)?
Хотел бы реализовать так же на объектах методах и классах, т.е. не указывать в коде конкретный порт, а сделать
-класс типа Input
-свойство click
-свойство LongClick
А дальше уже это использовать в конкретных портах, или других сценариях, при этом не теряется гибкость ООП
вот только это все мне не поднять, с PHP я не очень, да и наверняка есть готовой код ?
Chainik писал(а):
Вт ноя 20, 2018 2:44 pm
Да, если у вас Мега-328, то длительное нажатие реализовать, видимо, можно только программно. Наверное, проще в вашем случае будет вместо длительного использовать двойное нажатие.
Вот добрый человек выкладывал видео, как можно это сделать (https://www.youtube.com/watch?v=ghi6KyTTDcE).
Информация к размышлению (https://ab-log.ru/forum/viewtopic.php?f ... start=1563).
Да я уже, конечно смотрел видео Сергея, пробовал этот вариант работает, но во всех решениях используется режим P&R, если есть другие варианты, просьба ссылку глянуть.
У меня идея оставить режим P, для возможности управлять светом автономно, если я правильно понимаю с режимом P&R это сделать невозможно?
Linux DietPi, OrangePi-PC, MyMegaD328
Connect: http://connect.smartliving.ru/profile/689
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Вт ноя 20, 2018 8:53 pm

beavisgood писал(а):
Вт ноя 20, 2018 8:01 pm
Хотел бы реализовать так же на объектах методах и классах, т.е. не указывать в коде конкретный порт, а сделать
-класс типа Input
-свойство click
-свойство LongClick
А дальше уже это использовать в конкретных портах, или других сценариях, при этом не теряется гибкость ООП
Вопрос конкретной программной реализации -- это дело творческое. Благо Мажордомо предоставляет большие возможности и кучу вариантов реализации задачи. Может быть click и LongClick должны быть методами...

Но перед тем, как выбирать конкретный вариант программной реализации, надо в принципе понять, поступает ли для нашего кода достаточная информация?
beavisgood писал(а):
Вт ноя 20, 2018 8:01 pm
У меня идея оставить режим P, для возможности управлять светом автономно, если я правильно понимаю с режимом P&R это сделать невозможно?
С режимом P&R в автономном варианте работы свет будет включаться только на период нажатия клавиши выключателя.
Касательно режима P, в свете проблемы обработки на сервере длительного нажатия, вопрос заключается в том, посылает ли что-то контроллер при "отжатии" клавиши на сервер? Если нет, то как можно определить длительность нажатия?
Ну представим себе, мы нажали на клавишу, Мега сообщила об этом контроллеру, затем отпустили клавишу. Откуда серверу знать, через 1 секунду (короткое нажатие) или через 3 секунды (длительное нажатие) мы отпустили клавишу (или что вообще ее отпустили)?

Если Мега все же отсылает что-то на сервер при "отжатии" клавиши в режиме P, тогда можно о чем-то говорить дальше. Так что вопрос № 1 в плане решения вашей задачки именно этот.

Но даже, если Мега в режиме "P" ничего не посылает на сервер при "отжатии" клавиши, представляется, что реализовать разную реакцию на длинное и короткое нажатие все же возможно. Только во всех случаях (и при коротком и при длинном нажатии) команда будет исполняться через 1,5-2 секунды. Потому что подождать 1,5 секунды чтобы понять, придет ли m=2 и нажатие было длинным или не придет, и нажатие было коротким. Алгоритм примерно такой:
Нажата клавиша >>> Запускаем таймер на 2 секунды с действием для короткого нажатия;
Если пришло m=2 >>> Убиваем таймер на 2 секунды >>> Выполняем действие для длинного нажатия.
Последний раз редактировалось Chainik Ср ноя 21, 2018 10:46 am, всего редактировалось 1 раз.
ei922
Сообщения: 11
Зарегистрирован: Вт окт 31, 2017 5:40 pm
Благодарил (а): 10 раз
Поблагодарили: 0

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

Сообщение ei922 » Ср ноя 21, 2018 12:03 am

Уважаемые, столкнулся сегодня с проблемой - при привязывания входа Р1 модуля 14IN МегаД2561 (прописан как DSEN, на нем висит датчик ds18b20) - выбираю переменную, ее св-во и метод, нажимаю Сохранить, окно обновляется и в окне этого входа снова пусто. С другими входами все ок: другие входы пишут в эту переменную, а Р1 - не пишут ни в какую переменную. Если просмотреть Объекты/Свойства - написано, что привязка к megaD есть, но данные не поступают в переменную. Обновлять модуль пробовал - не помогло.
Не подскажите - куда копать?
Кстати, автообновление показаний датчиков тоже похоже накрылось:(
Ivg_spb
Сообщения: 23
Зарегистрирован: Пт апр 06, 2018 10:51 pm
Откуда: Санкт-Петербург
Благодарил (а): 0
Поблагодарили: 0

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

Сообщение Ivg_spb » Пт ноя 23, 2018 1:12 am

Прошу помощи! Перешёл с винды на Linux Mind, долго и мучительно боролся с запуском системы и на третий день мне это удалось (к слову есть ещё резервный сервер на Ubuntu на котором самопроизвольно упала база). После установки в системе MegaD при попытке Read Config полная тишина в эфире: то есть сервер пишет ОК, но данных нет, портов не видно. Форум почитал, внятного ответа не увидел. Если кто знает где читать и что делать, ткните носом, пожалуйста!
Ответить