Плагин MegaD
-
А по моему вопросу есть решение. Или я не правильно описал проблему.
-
И ещё. Возник вопрос. Как управлять RGB лентой? Есть пример?
-
Есть проблемка со скриптом управления температурой и megaD. Попробую описать. Если запускаем одновременно сервер и роутер, а роутер подвис. Температура сервере установлена 30. Т.к. датчика нет то сервер видит последнюю то есть например 28 и сервер дает команду, но устройства нет в сети. Батареи включается на интерфейсе. Перезагрузил роутер. Батарея включена на интересе дома. А по факту выход не активен. И так пока температура не подниматься выше 30 и снова упадёт. Как с этим бороться? Я так понимаю должна быть индикация аварии если устройства нет в сети.
Вы правы, такая проблема есть.
Дело в том, что MegaD не дает feedback, т е не подтверждает операции переключения, поэтому применяется односторонняя (или оптимистичная :)) связь при управлении: при отправке команды считается, что команда выполнена.
Ситуацию усугубляет то, что в новом плагине MegaD не учитывается отсутствие связи при выполнении команды.
Планируется переработать плагин с учетом этой ситуации, а также включая поправки, которые предлагает Alex_Jet (по мере возможности).
Ориентировочно, после 10 ноября выпустим новый плагин.
По RGB - в Cherry виджет для визуализации RGB запланирован, но пока не сделан.
Я правильно понимаю, Вы хотите управлять RGB с MegaD, посылая команды на диммируемые выхода?
Пока можно управлять, диммируя каждый канал отдельно.
Или в MegaD есть какой-то новый механизм для RGB?
-
Вы правы, такая проблема есть.
Дело в том, что MegaD не дает feedback, т е не подтверждает операции переключения, поэтому применяется односторонняя (или оптимистичная :)) связь при управлении: при отправке команды считается, что команда выполнена.
На самом деле сервер всегда может запросить состояние всех портов и распарсить их значения. Или во всяком случае MegaD ведь выдает 200 OK в TCP-сессии - это уже можно считать подтверждением выполнения команды (если эта команда однозначная, а не типа "переключения" выходов).
Или в MegaD есть какой-то новый механизм для RGB?
К ней с некоторых пор можно подключать I2C расширитель ШИМ-портов! Правда готовых плат с силовыми элементами для него нет.
-
А также с недавних пор поддерживает управление LED-лентами на базе чипов WS2818, WS2811, WS2813. При этом задействуется всего один порт для управления RGB. Хотел сделать функцию мягкого пробуждения человека с помощью RGB света.
-
Пример: включить все диоды красным цветом
http://192.168.0.14/sec/?pt=35&ws=FF0000
Но хотелось бы из интерфейса управлять цветом. И настраивать цвет пробуждения в параметрах.
-
С учётом того, что "обычные" ШИМ-каналы в MegaD скорее всего будут использоваться и для диммирования, то для RGB логичнее использовать либо расширитель ШИМ по I2C или подключать к контроллеру WS28xx. А для этого нужен какой-то функционал для записи значений в канал для устройства типа "актюатор аналоговый". Кстати вывод информации на OLED можно таким же образом сделать, а потом в скрипте написать функцию записи в OLED значений в нужную строку и столбец.
-
Вопрос к разработчикам? Может сделать отдельно плагин для MegaD-328 и MegaD-2561.
-
Вопрос к разработчикам? Может сделать отдельно плагин для MegaD-328 и MegaD-2561.
Почему? Разве они не совместимы снизу вверх?
-
Можно еще проще - привязать бинарный актуатор, а интерактивные операции для него отключить
В принципе эта идея сработала. При поднесении нужного ключа к считывателю актуатор меняет свое состояние. Отталкиваясь от его состояния можно написать сценарий установки/снятия с охраны. Единственный неопределенный момент в том, что когда MegaD опрашиваем командой cmd=all, то канал, соответствующий считывателю находится в неопределенном состоянии (ранее писал, что не верно под неопределенным состоянием считать 0). Возникает вопрос - после перезагрузки MegaD в каком состоянии окажется привязанный к этому каналу актуатор (ну или сенсор, если добавите ему обработку toggle). Или все же это правильно - считать за 0/OFF неопределенное состояние порта?
-
Здравствуйте.
Подскажите, можно ли и как сделать "расширение" без сообщения от меги?
У меня задача передать меге команду выключить, подождать, включить. Скриптом этого делать нельзя, потому, что перезапускается розетка, к которой подключено сетевое оборудование. Скриптом получается только выключить
А как сделать расширение без входящего сообщения от контроллера, чтобы передать меге команду с паузой, и привязать это расширение к кнопке на экране?
-
Здравствуйте.
Подскажите, можно ли и как сделать "расширение" без сообщения от меги?
У меня задача передать меге команду выключить, подождать, включить. Скриптом этого делать нельзя, потому, что перезапускается розетка, к которой подключено сетевое оборудование. Скриптом получается только выключить
А как сделать расширение без входящего сообщения от контроллера, чтобы передать меге команду с паузой, и привязать это расширение к кнопке на экране?
Плагины сейчас могут получать любые команды в своем формате непосредственно от сценария
Но плагин должен поддерживать эту возможность.
Для плагина MegaD запланирована переработка, эта опция будет добавлена.
Тогда для решения вашей задачи достаточно будет к кнопке привязать сценарий с командой
this.pluginCommand({unit:'megad1', command:'/sec/?cmd=7:0;p10;7:1'});
Ориентировочный срок выпуска новой версии плагина - после 10 ноября.
-
Еще дополнение по доработке плагина для MegaD - в случае если MegaD перезагрузилась (пришла команда st=1):
1. Принять команды по состоянию каналов-входов (после перезагрузки MegaD если канал не в штатном состоянии, то по нему летят соответствующие сообщения) и присвоить значения сенсорам
2. Восстановить состояние каналов-выходов на те, которые были до перезагрузки MegaD
3. Опросить все каналы MegaD, распарсить их значения и присвоить к соответствующим сенсорам
Странно, но факт - иногда в MegaD срабатывает watchdog и контроллер перезагружается. Я бы хотел это явление наблюдать в основном журнале так же как недоступность MegaD - чтобы понять в чем проблема.
Up1: еще можно по умолчанию сделать список из 38 каналов (с 0 по 37) - каждый канал можно в любой момент отредактировать как необходимо пользователю и они всегда будут отображаться по порядку. А вот создавать все 38 каналов вручную - муторное занятие. Пользователю придется создавать только "виртуальные" каналы - для опроса I2C датчиков, датчиков на 1Wbus. Я их делаю с номерами типа 30_1, 30_2 и т.д.
Кстати, надо попробовать подключить датчики на 1WBus - как их система будет идентифицировать и присваивать значения? - так же как в Berry? - то есть номер канала должен быть типа 30_адрес_сенсора?
-
Решил еще немного разжевать что должен обрабатывать плагин MegaD.
По подключению датчиков по I2C есть 2 варианта:
1. "Нативное" подключение - с настройкой порта MegaD на работу с конкретным датчиком:
В таком случае можно:А. Опрашивать канал "штатным" образом только по одному каналу (по факту нужно 2-3 канала в зависимости от того сколько параметров отдает датчик) - http://192.168.0.14/sec/?pt=32&cmd=get - и это сейчас работает (парсится и привязывается к соответствующим каналам):
07.11 12:04:35.614 megad5: localhost => 192.168.11.25 HTTP GET /sec/?pt=32&cmd=get 07.11 12:04:35.640 megad5: localhost <= 192.168.11.25 response: statusCode=200 contentType = text/html 07.11 12:04:35.640 megad5: body: temp:28.16/press:746.21 07.11 12:04:35.641 IH: get [{"id":"32_1","value":"28.16"},{"id":"32_2","value":"746.21"}] 07.11 12:04:35.641 IH: set {"STEMP1_02":{"aval":"28.16"},"SHUMIDITY1_02":{"aval":"746.21"}}
Б. Опрашивать канал по конкретным параметрам датчика - (Температура - http://192.168.0.14/sec/?pt=32&scl=34&i2c_dev=bmp180&i2c_par=1, давление - http://192.168.0.14/sec/?pt=32&scl=34&i2c_dev=bmp180) - и это сейчас не работает (значения не привязываются к соответствующим каналам):
07.11 11:55:02.303 megad5: localhost => 192.168.11.25 HTTP GET /sec/?pt=32&scl=34&i2c_dev=bmp180&i2c_par=1 07.11 11:55:02.329 megad5: localhost <= 192.168.11.25 response: statusCode=200 contentType = text/html 07.11 11:55:02.330 megad5: body: 28.16 07.11 11:55:02.330 IH: get [] 07.11 11:55:02.331 IH: set {} 07.11 11:55:02.504 megad5: 07.11 11:55:02.504 megad5: localhost => 192.168.11.25 HTTP GET /sec/?pt=32&scl=34&i2c_dev=bmp180 07.11 11:55:02.532 megad5: localhost <= 192.168.11.25 response: statusCode=200 contentType = text/html 07.11 11:55:02.532 megad5: body: 746.21 07.11 11:55:02.533 IH: get [] 07.11 11:55:02.533 IH: set {}
2. Параллельное подключение датчиков к I2C шине. В этом случае в выпадающем списке можно выбрать ANY или SSD1306 (в таком случае контроллер при загрузке будет инициализировать OLED):
[attachment=0]MegaD_I2C_ANY&SSD1306.png[/attachment]
В таком случае данные с датчиков можно снимать только по варианту 1Б (см.выше).По обработке данных плагином при перезагрузке MegaD и при старте самого плагина:
1. В случае если MegaD по каким-либо причинам перезагрузилась (подача питания, сработал watchdog, нажата кнопка сброса, изменены параметры, приводящие к перезагрузке), то есть отправила на сервер команду st=1 необходимо:
А. Записать в журнал это событие (для дальнейшего поиска неисправностей)
12.10 12:36:15.112 megad5: 192.168.11.25 => localhost:11025 HTTP GET /mod_megad.php?st=1 12.10 12:36:15.112 megad5: 192.168.11.25 <= localhost:11025
Б. Принять сообщения от MegaD по не нормативному состоянию каналов и перевести их в нужное состояние
12.10 12:36:15.125 megad5: 192.168.11.25 => localhost:11025 HTTP GET /mod_megad.php?pt=5&cnt=1 12.10 12:36:15.126 IH: get [{"id":"5","value":"1"}] 12.10 12:36:15.127 IH: set {"SGERKON4_02":{"dval":0}} 12.10 12:36:15.127 megad5: 192.168.11.25 <= localhost:11025 12.10 12:36:15.140 megad5: 192.168.11.25 => localhost:11025 HTTP GET /mod_megad.php?pt=6&cnt=1 12.10 12:36:15.140 IH: get [{"id":"6","value":"1"}] 12.10 12:36:15.141 IH: set {"SMOTION4_02":{"dval":0}} 12.10 12:36:15.141 megad5: 192.168.11.25 <= localhost:11025 12.10 12:36:15.154 megad5: 192.168.11.25 => localhost:11025 HTTP GET /mod_megad.php?pt=19&cnt=1 12.10 12:36:15.155 IH: get [{"id":"19","value":"1"}] 12.10 12:36:15.155 IH: set {"SFIRE1_04":{"dval":0}} 12.10 12:36:16.082 megad5: 192.168.11.25 => localhost:11025 HTTP GET /mod_megad.php?pt=6&m=2&cnt=1 12.10 12:36:16.083 IH: get [{"id":"6","value":"1"}] 12.10 12:36:16.083 IH: set {"SMOTION4_02":{"dval":0}} 12.10 12:36:16.084 megad5: 192.168.11.25 <= localhost:11025 12.10 12:36:16.094 megad5: 192.168.11.25 => localhost:11025 HTTP GET /mod_megad.php?pt=5&m=2&cnt=1 12.10 12:36:16.095 IH: get [{"id":"5","value":"1"}] 12.10 12:36:16.095 IH: set {"SGERKON4_02":{"dval":0}} 12.10 12:36:16.096 megad5: 192.168.11.25 <= localhost:11025 12.10 12:36:16.107 megad5: 192.168.11.25 => localhost:11025 HTTP GET /mod_megad.php?pt=19&m=2&cnt=1 12.10 12:36:16.108 IH: get [{"id":"19","value":"1"}] 12.10 12:36:16.109 IH: set {"SFIRE1_04":{"dval":0}} 12.10 12:36:16.109 megad5: 192.168.11.25 <= localhost:11025
В. Поскольку MegaD уже сообщила о том какие каналы находятся в не нормативном состоянии, то можно не запрашивать состояние всех остальных (cmd=all), а принять их состояние за нулевое (правда могут быть каналы с состоянием "undefined" - см.ниже).
Г. Провести опрос каналов, которые должны периодически опрашиваться (период опроса отличен от 0).
Д. Восстановить последнее запомненное состояние всех выходов контроллера (если он перезагружается, то у нас, например, на всем этаже гаснет свет… после того как контроллер загрузился надо включить освещение там где оно было включено).
Е. Установить системное время в контроллере. Как вариант, сделать это опцией в настройках самого плагина
http://192.168.0.14/sec/?cf=7&stime=10:57:06:4
2. В случае если произошла перезагрузка плагина (изменение параметров каналов и прочее), то необходимо:
А. Запросить состояние всех каналов (cmd=all) и перевести их в соответствующее состояние. Учесть что некоторые каналы имеют состояние "undefined" (в ответе присутствует ";;;"). Это либо канал с шинами 1WBUS и I2C, либо считыватель типа TouchButton (1W/Wiegand) - соответственно, первые должны быть "поставлены" на периодический опрос в каналах плагина, а вторые - отдают команды серверу при внешнем воздействии.
Б. Провести опрос каналов, которые должны периодически опрашиваться (период опроса отличен от 0).
По обработке показаний датчиков. Нужно сделать как было в Berry - к каждому каналу можно было привязать свой скрипт обработки данных! Для многих систем актуально не дергаться по каждому дуновению ветра, а усреднять несколько показаний от датчиков, откидывая "бракованные"! Например, подобным скриптом:
function (val, depo) { var result; if (!depo.res) depo.res = []; depo.res.push(val); if (depo.res.length < 5) //Нужны еще измерения, значение не возвращаем return { reqsek:60 }; else { depo.res.sort(); result = ((depo.res[1] + depo.res[2] + depo.res[3]) / 3).toFixed(2); } depo.res = []; //Перед следующими измерениями сбрасываем массив return { val:result, reqsek:60 }; //Возвращаем значение }
По состоянию устройства-плагина для контроллера MegaD уже писал тут - https://frm.intrahouse.ru/viewtopic.php?f=18&t=5312&start=40#p7901
По RGB-лентам и выводу информации на OLED уже писал тут - https://frm.intrahouse.ru/viewtopic.php?f=18&t=5312&start=50#p7936.
Если по RGB-лентам все понятно - устройство, привязанное к нужному каналу MegaD формирует цвет в шестнадцатеричном формате и это значение улетает в контроллер командой:
http://192.168.0.14/sec/?pt=35&ws=FF0000
А вот по OLED - GUI сделать сложнее, но на данном этапе можно отсылать информацию на дисплей с помощью скриптов типа:
/** * @name Вывод значения на OLED крупным шрифтом * @desc При изменении значения, получаемого с датчика температуры, оно отображается * крупным шрифтом на OLED */ const dt = DeviceT("SensorA", "Датчик температуры"); const text = 'Температура'; const script = { start() { this.pluginCommand({unit:'megad1', command:'/sec/?pt=33&text=' +text+ '&col=5&row=0'}); this.pluginCommand({unit:'megad1', command:'/sec/?pt=33&text=' +dt.aval+ ':'}); } };
Все бы было очень хорошо с OLED в таком случае, особенно если бы Вы помогли портировать скрипт центрирования Андрея с PHP на JS, а также помогли правильно вывести русские буквы на дисплее (кодовая страница CP866).
По использованию MegaD в качестве SMS-шлюза. На самом деле не являюсь сторонником использовать MegaD в качестве шлюза. Все же подсоединение GSM-модема к MegaD - это мера для более гибкой локальной работы контроллера и возможности создания GSM-сигнализации. По надежности - так как помимо самого GSM-модема, все же используем и MegaD, хотя и без преобразователей UART-USB, которые по сути есть в обычных USB GSM-модемах, то с учетом "стороннего" питания контроллера, свитчей и их питания, длинных патчкордов и их контактов мне кажется что USB-модем, воткнутый непосредственно в сервер, надежнее.
Опять же, если из скриптов можно будет давать команду на MegaD, то никаких проблем в организации из контроллера GSM-шлюз не вижу. Разбор SMS можно проводить из раздела "Расширения" плагина, обрабатывая входящий "trap" контроллера.
-
Решил еще немного разжевать что должен обрабатывать плагин MegaD.
…
Чуть позже распишу по действиям при перезагрузке MegaD (после загрузки выдает st=1) и при старте плагина Megad.
Большое спасибо, надеемся также на помощь при тестировании, т к имеем только MegaD 328 с довольно старой прошивкой.
-
Большое спасибо, надеемся также на помощь при тестировании, т к имеем только MegaD 328 с довольно старой прошивкой.
Вы бы обратились к разработчику с просьбой предоставить новую MegaD для обкатки серверных решений. А лучше к товарищу d.v.ermakov - чтобы он предоставил Вам свой вариант перспективной MegaD2561-24I14O-RTC-POE. Мне реализация очень понравилась - для УД самое то, хотя с расширенным функционалом program и на промышленные объекты можно было бы ставить (я бы наши Овен с радостью на них заменил ).
-
Большое спасибо, надеемся также на помощь при тестировании
Коллеги! Очень жду доработку плагина. Уже очень хочется перейти на Cherry.
-
Коллеги! Очень жду доработку плагина. Уже очень хочется перейти на Cherry.
Добрый день.
Решили сначала закончить переработку движка сценариев.
Но до Нового года обновим точно
-
Обновления, связанные с каналами MegaD-2561 в режиме DSEN/1WBUS и OUT/DS2413. На оба таких канала можно одновременно подключить как DS18B20, так и DS2413 - по несколько штук в том числе! В общем случае, при запросе вида http://192.168.0.14/sec/?pt=32&cmd=list будет выдано следующее:
aad6a070000:25.43;79c439000000:OFF/ON
Отличия настроек каналов DSEN/1WBUS и OUT/DS2413:
1. DSEN/1WBUS - контроллер сам посылает запрос на конвертацию температуры. Поэтому при переходе по ссылке Device List (или запросе http://192.168.0.14/sec/?pt=32&cmd=list) по адресам датчиков температуры будет выдано действительное значение температур, а по адресам DS2413 - состояние их портов:
aad6a070000:25.43;85a56a070000:32.43;79c439000000:OFF/OFF;c6c439000000:ON/ON
2. OUT/DS2413 - контроллер не посылает запрос на конвертацию температуры, а в веб-интерфейсе контроллера есть кнопки ON/OFF для включения/отключения портов А и В DS2413. При этом если подключено несколько DS2413, то из веб-интерфейса контроллера будут включаться/выключаться порты всех DS2413 (соответственно - А или В). Раздельно можно включать только с помощью сервера - обращаясь к контроллеру с конкретным адресом:
http://192.168.0.14/sec/?cmd=32A:1&addr=c6c439000000
При переходе по ссылке Device List (или запросе http://192.168.0.14/sec/?pt=32&cmd=list) по адресам датчиков температуры будет выдано значение температур до их конвертации, а по адресам DS2413 - состояние их портов:
aad6a070000:85.00;85a56a070000:85.00;79c439000000:OFF/OFF;c6c439000000:ON/ON
Для данного случае чтобы получить действительные значения температур с датчиков необходимо перед считыванием состояния порта посылать команду на конвертацию температуры:
http://192.168.0.14/sec/?pt=32&cmd=conv
Поскольку данные к каналам будут привязываться по адресам устройств, а запрос необходимо выполнять всего лишь раз, то логично в одном канале производить запрос на конвертацию температур, а в другом запрос по значениям. То есть для всей кучки из 100500 датчиков, подключенных к порту MegaD-2561 с режимом OUT/DS2413 нужно будет два запроса - на конвертацию температуры и запрос значений.
-
Обновления, связанные с каналами MegaD-2561 в режиме DSEN/1WBUS и OUT/DS2413. На оба таких канала можно одновременно подключить как DS18B20, так и DS2413 - по несколько штук в том числе! В общем случае, при запросе вида http://192.168.0.14/sec/?pt=32&cmd=list будет выдано следующее:
> aad6a070000:25.43;79c439000000:OFF/ON >
Отличия настроек каналов DSEN/1WBUS и OUT/DS2413:
1. DSEN/1WBUS - контроллер сам посылает запрос на конвертацию температуры. Поэтому при переходе по ссылке Device List (или запросе http://192.168.0.14/sec/?pt=32&cmd=list) по адресам датчиков температуры будет выдано действительное значение температур, а по адресам DS2413 - состояние их портов:
> aad6a070000:25.43;85a56a070000:32.43;79c439000000:OFF/OFF;c6c439000000:ON/ON >
2. OUT/DS2413 - контроллер не посылает запрос на конвертацию температуры, а в веб-интерфейсе контроллера есть кнопки ON/OFF для включения/отключения портов А и В DS2413. При этом если подключено несколько DS2413, то из веб-интерфейса контроллера будут включаться/выключаться порты всех DS2413 (соответственно - А или В). Раздельно можно включать только с помощью сервера - обращаясь к контроллеру с конкретным адресом:
> http://192.168.0.14/sec/?cmd=32A:1&addr=c6c439000000 >
При переходе по ссылке Device List (или запросе http://192.168.0.14/sec/?pt=32&cmd=list) по адресам датчиков температуры будет выдано значение температур до их конвертации, а по адресам DS2413 - состояние их портов:
> aad6a070000:85.00;85a56a070000:85.00;79c439000000:OFF/OFF;c6c439000000:ON/ON >
Для данного случае чтобы получить действительные значения температур с датчиков необходимо перед считыванием состояния порта посылать команду на конвертацию температуры:
> http://192.168.0.14/sec/?pt=32&cmd=conv >
Поскольку данные к каналам будут привязываться по адресам устройств, а запрос необходимо выполнять всего лишь раз, то логично в одном канале производить запрос на конвертацию температур, а в другом запрос по значениям. То есть для всей кучки из 100500 датчиков, подключенных к порту MegaD-2561 с режимом OUT/DS2413 нужно будет два запроса - на конвертацию температуры и запрос значений.
Често говоря, очень не хочется тащить все эти A и B в код плагина.
Вероятно, оптимальный подход - сделать для опросов двухуровневую таблицу "Запрос - связанные каналы", с настройкой парсинга для канала. Примерно как в новом http плагине, только добавив все эти прыжки в связи с st=1 и cmd=all
Плюс, как становится ясно, одного запроса недостаточно, нужен опциональный предзапрос (для конвертации).
В целом объем настройки увеличится, но зато всю обработку вытащим явно.
А что думаете по поводу разбора входящих - блок Расширения?