Плагин MegaD
-
Уважаемые разработчики. В своем проекте использую несколько контроллеров MegaD-2561. Использую несколько датчиков с i2c интерфейсов. Все работает прекрасно. Задумал подключить к контроллеру Ардуину и управлять ею через i2c API. Однако Andrey_B предлагает для этого библиотеку на РНР. Собственно вопрос. Можно ли как-то послать байт через контроллер на устройство с определенным адресом по протоколу i2c.
-
@int144, так у контроллера есть API для I2C! Собственно от него отталкиваетесь, а на контроллер из iH можно послать что угодно! Например, функция для отправки команд на ленту WS:
//Функция формирования данных для ленты WS2818 SendDataToWS2818(plugin, channel, cmd, chip) { this.pluginCommand({unit: plugin, command: '/sec/?pt=' +channel+ '&ws=' +cmd+ '&chip=' +chip}); }
В случае с I2C можно сделать такую функцию:
SendDataToMegaD(plugin, cmd, data) { this.pluginCommand({unit: plugin, command: '/sec/?pt=35&scl=34&i2c_' +cmd+ '=' +data}); }
Таким образом, чтобы дать команду на отправку данных нужно в скрипте указать:
script({ plugin: 'megad1', cmd: '', data: '', start() { //Инициализация this.cmd = 'cmd'; this.data = 1; SendDataToMegaD(this.plugin, this.cmd, this.data); //Старт this.cmd = 'cmd'; this.data = 2; SendDataToMegaD(this.plugin, this.cmd, this.data); //Отправка данных в hex-виде this.cmd = 'send'; this.data = 80; SendDataToMegaD(this.plugin, this.cmd, this.data); //и т.д. } });
-
@Alex_Jet , спасибо за быстрый и развернутый ответ. Но у меня есть некотрые сомнения. Вашу функцию управления лентой я видел. Но ее управление поддерживается прошивкой контроллера. Достаточно в http запросе присвоить правильное значение и лента работает. При использовании i2c API в запросе фигурирует "i2c_send=". Эта функция есть в библиотке Andrey_B. Она распределяет данные на адрес и направление передачи, кажется. Поэтому я и засомневался. А Вы не пробовали таким образом передавать данные i2c устройствам, не поддерживаемым прошивкой?
-
@int144, нет, у меня особенных I2C девайсов нет, которые не поддерживаются прошивкой.
Я же вам привел как минимум половину цикла работы с шиной - инициализация, старт, передача данных! Вы обратите внимание на входные аргументы. Все это можно переписать/объединить в одну большую функцию отправки-приема данных. Думаю, вы это сами сможете сделать, поскольку у меня нет времени на эти эксперименты и эксперименты ни к чему.
-
@Alex_Jet , прошу прощения, что туплю, буду пробовать. Еще раз большое спасибо
-
Здравствуйте! устройство megad-2w (3 шт.). При формировании запроса плагин выдает в дебагере:
localhost => 192.168.0.14 HTTP GET /sec/?cmd=32A:0&adr=92af39000000.
а в инcтрукции написано что запрос должен быть : /sec/?cmd=32A:0&addr=92af39000000 (с двумя d);
-
@ted, интересно! У меня тоже выдает так:
16.01 20:15:36.436 megad1: localhost => 192.168.11.21 HTTP GET /sec/?cmd=35A:1&adr=9a2938000000
При этом канал включается и выключается!!! Хотя в описании написано так - Если к шине подключено несколько модулей, то для включения или выключения всех каналы "А" или "B" всех модулей достаточно исключить из запроса параметр "addr".
Поэтому раз в команде есть adr, то контроллер его просто не видит...в итоге дает команду общую. А у меня на шине висит всего лишь один MegaD-2W
-
@ted
Добрый день!
Да, действительно ПоправилиНа github выложена новая версия плагина https://github.com/intrahouseio/intraHouse.plugin-MegaD/releases/tag/v1.1.17
-
У устройства megaD есть режим термостат. Как сделать управление этим режимом.
То есть изменять значение в этом режиме по нажатию кнопки. Вверх добавить температуру вниз убавить. Ну и с вашего примера сценария управления тёплыми полами осталось управление.
-
@cd1room, MegaD сделана так, чтобы без участия сервера с помощью контроллера можно было автономно выполнять какие-либо действия (включение света, управление термостатом и т.п.). Опять же - только в том случае если сервер отключен (по питанию, отсоединен патчкорд) или он по http не отвечает контроллеру! Поэтому все локальные функции контроллера - фактически являются байпасом сервера!
Считаю, что сервером намного удобнее рулить теми или иными вещами. Например, реализовать тот же термостат используя любой датчик контроллера и любой выход контроллера.
Хотя функционал "удаленного" изменения уставки термостата заложен его создателем, но не вижу смысла его применения когда для УД используется сервер.
Вот элементарный мультисценарий, который завязан на уставки температурных датчиков:const heater = Device("ActorD", "Нагреватель"); const dt = Device("SensorA", "Датчик температуры", [ {"name":"hist", "note":"Гистерезис включения/отключения нагревателя, °C", "type":"number", "val":0.15} ]); const dt_ext = Device("SensorA", "Датчик уличной температуры"); const dt_ext_rez = Device("SensorA", "Датчик уличной температуры (резервный)"); startOnChange(dt); script({ ust_min: 0, ust_max: 0, text: "", sensor_ext: '', check() { //Определение уставок this.ust_min = dt.setpoint - dt.getParam("hist"); this.ust_max = dt.setpoint + dt.getParam("hist"); //Проверка работоспособности датчика уличной температуры //При его неисправности - работаем по резервному датчику if(!dt_ext.isError()) this.sensor_ext = dt_ext; else this.sensor_ext = dt_ext_rez; //Проверка основных условий return heater.auto && ( heater.isOff()&&(dt.value <= this.ust_min)&&(this.sensor_ext.value < this.sensor_ext.setpoint) || heater.isOn()&&(dt.value >= this.ust_max) ); }, start() { if(heater.isOff()) heater.turnOnSaveAuto(); else heater.turnOffSaveAuto(); } });
Поле ввода гистерезиса отображается в боковой панели устройства датчика температуры. Датчики уличной температуры используются чтобы не расходовать ресурсы когда на улице жарко, но вы можете сами отредактировать этот сценарий.
-
@intrapro спасибо !
-
@intrapro, очень хочу чтобы вы учли мои выкладки по тем же DS2413 в этом посте. А также допилили чтобы в каналах плагина OFF-состояние для каналов DS2413 отображалось 0, а не "-" как сейчас. И да, почему-то по этим каналам нет "онлайн"данных в столбце "Значение с канала".
-
@Alex_Jet, конечно, мы имеем в виду ваши замечания и предложения!
Но в данный момент, как Вы знаете, доработка плагинов заморожена. Исправляем только баги, как в предыдущем случае, или функционал, без которого не обойтись.
Новая версия плагина будет использовать новое API сервера и иерархическую модель каналов.И да, почему-то по этим каналам нет "онлайн"данных в столбце "Значение с канала".
Вот это не понятно. То есть в устройство данные приходят, а в каналах не отображаются?
-
Участник @intrapro написал в Плагин MegaD:
Вот это не понятно. То есть в устройство данные приходят, а в каналах не отображаются?
Да, именно так. Включаю канал, но 1 в столбце не появляется (появится только если переключиться на Отладчик/Расширения/Манифест и обратно на Каналы). Выключаю - то же самое, но при этом когда выключено отображается "-".
Раз все снова будет переписываться (не знал о ваших дальнейших планах по плагинам, ожидаю только пятерку), то можем это считать не критичным багом.
-
@Alex_Jet Тогда как второй вопрос. Как можно по нажатию кнопки добавлять или убавлять температуру как на картинке выше? Нет ли у вас примера?
-
@cd1room, читаем тут. Надо сделать кнопку (button) в веб-интерфейсе, чтобы при нажатии на нее срабатывал выбранный сценарий с параметрами, например, {"ip":"192.168.11.11","act":"up"}
Создать сценарий с таким кодом (не проверял, написал только что):
script({ //Параметры управления unit: "megad1", port: 24, temp: 20, max: 50, min: 10, step: 1, start(param) { const obj = JSON.parse(param); //Формирование команд управления if(obj.ip == "192.168.11.11") { if(obj.act == "up") { if(this.temp < this.max) this.temp = this.temp + this.step; else this.temp = this.max; } if(obj.act == "down") { if(this.temp > this.min) this.temp = this.temp - this.step; else this.temp = this.min; } } //Отправка команды плагину HTTP this.SendCommandToMegaD(); }, SendCommandToMegaD() { this.pluginCommand({unit: this.unit, command: "/sec/?pt=" +this.port+ "&misc=" +this.temp}); } });
-
Здравствуйте. Подскажите пожалуйста как в IH настроить megad2561 с электросчетчиком по rs485 если следовать этой статье https://ab-log.ru/smart-house/ethernet/megad-rs485 . За ранее большое спасибо!
-
@artem521, думаю все просто - из сценария соответствующему плагину нужно подать две команды - /?uart_tx=0103000C0001&mode=rs485 и /?uart_rx=1&mode=rs485 (скорее всего с небольшой паузой).
Чтобы по последней команде получить ответ от контроллера нужно использовать то, что разработчики описали ТУТ - см. "// Анализируем body ...."
-
Участник @Alex_Jet написал в Плагин MegaD:
@artem521, думаю все просто - из сценария соответствующему плагину нужно подать две команды - /?uart_tx=0103000C0001&mode=rs485 и /?uart_rx=1&mode=rs485 (скорее всего с небольшой паузой).
Чтобы по последней команде получить ответ от контроллера нужно использовать то, что разработчики описали ТУТ - см. "// Анализируем body ...."Спасибо большое за информацию;)
-
Коллеги, прошу совета. Имею контроллер MegaD-2561 с установленным модулем SIM800 для использования в качестве sms-шлюза. При входящем sms запускается сценарий, в котром проверяется номер телефона и текст смс и выполняются определенные действия. Но есть проблема. В отладчике плагина в ответ на входящий запрос /megad1?sms_phone=+79000001234&sms_text=arm пишется start scene..., затем arg {"sms_phone":" 79000001234", ...}. Т.е. при передачи параметров в сценарий вместо плюса передается пробел. Можно как-то решить эту проблему, или помогут только костыли. Типа, в сценарии обрезаем пробел с помщью функции такой-то, вручную добавляем "плюс" и т.д. Заранее спасибо