Плагин MegaD



  • Нет. Никогда он не создавался как АО.
    И, кроме того, я его удалял и создавал заново, сразу как DI. Чтобы исключить некорректный конфиг.
    Поэтому, кстати, он последний в списке.

    И по поводу этой части лога.

    15.12 07:29:19.050 megad1: 192.168.13.10 => localhost:8083 HTTP GET /?pt=16&m=2&cnt=1
    15.12 07:29:19.051 IH: get [ { id: '16', value: '1' }, { id: '23', value: '1' } ]
    set { SENSOR6: { dval: 1, err: 0 }, LAMP13: { dval: 1, err: 0 } }
    

    При всем моем уважении. Сервер даже на включение меге команду не послал, пока я в расширениях запись не создал.
    Так там созданы только для /?pt=16 и /?pt=16&m=1
    Для /?pt=16&m=2 нет. На каком основании он отрабатывается вообще?



  • Участник @Erik написал в Плагин MegaD:

    Нет. Никогда он не создавался как АО.
    И, кроме того, я его удалял и создавал заново, сразу как DI. Чтобы исключить некорректный конфиг.
    Поэтому, кстати, он последний в списке.

    Да, возможно. Сейчас проверили - в последней версии плагина параметры значений физического и логического уровня добавляются для все каналов, но скрываются в зависимости от типа при редактировании. Когда Вы редактируете канал - этих свойств ведь нет?
    Наш недочет - не нужно показывать параметры, зависимые от типа, в таблице.
    Но это к вашей проблеме никакого отношения не имеет.
    Вы можете скопировать каналы, созданные ранее, и этих параметров не будет. Или совсем удалите канал, это ничего не изменит.

    При всем моем уважении. Сервер даже на включение меге команду не послал, пока я в расширениях запись не создал.
    Так там созданы только для /?pt=16 и /?pt=16&m=1
    Для /?pt=16&m=2 нет. На каком основании он отрабатывается вообще?

    Алгоритм обработки входящих сообщений такой: ищется максимально совпадающий запрос.

    • Для /pt=16&m=1&cnt=xx это /pt=16&m=1

    • Для /pt=16&cnt=xx это /pt=16

    • Для /pt=16&m=2&cnt=xx это тоже /pt=16, так как других нет

    Если Вы добавите /pt=16&m=2 с пустой командой, то он команду отсылать не будет, отправит пустой ответ.



  • @Erik, честно говоря, нет необходимости в плагине делать каналы для выключателей, СМК, датчиков движения, то есть для всех, которые имеют "сухой контакт". Все их сработки просто должны быть описаны в расширениях.
    В качестве примера привожу расширениях с 3-х разных своих MegaD:
    Switch_Click&M2.png

    Участник @intrapro написал в Плагин MegaD:

    Алгоритм обработки входящих сообщений такой: ищется максимально совпадающий запрос.

    Как я уже говорил, тут то ли какие-то чудеса, то ли @intrapro (без обид!) не понимает где есть проблема. Потому что алгоритм в iH Berry работал безупречно. То есть:

    1. Если было прописано условие pt=0, то оно срабатывало только при входящем pt=0&cnt=xx
    2. Если было прописано условие pt=0&m=1, то оно срабатывало только при входящем pt=0&m=1&cnt=xx
    3. Если было прописано условие pt=0&m=2, то оно срабатывало только при входящем pt=0&m=2&cnt=xx
      Поскольку при переходе на iH Cherry и воссоздании всех настроек из iH Berry у меня все стало работать по другому...
      В общем, надо допилить этот алгоритм - чтобы он работал как полагается:)

    Мои рассуждения:

    1. Имеем, например, нужное условие срабатывания pt=0&m=1
    2. Имеем входящее pt=0&m=1&cnt=xx
      Нам нужно из всех условий данного плагина сформировать массив и при входящем сообщении отбросить у него ключ cnt и полученное сообщение сравнить со всеми элементами массива:
    massiv[number_element].indexOf("pt=0&m=1") >= 0
    

    Как итог, на выходе мы получим, что по заданному входящему есть совпадения в массиве, соответствующие, только pt=0&m=1...
    Другой момент, если нам надо будет обращать внимание на значение ключа cnt.

    @intrapro, в вашем коде мне немного не хватает комментариев чтобы читать код с листа, но у Вас все так и делается - утилитой формируется массив из всех условий и ищется первый номер условия, которое совпадает со входящим сообщением:

    for (var i = 0; i < tableMReq[pathname][id].length; i++) {
      if (isSuitable(tableMReq[pathname][id][i].queryprops, query)) {
      return tableMReq[pathname][id][i];
    }
    

    А вот эта функция как раз отвечает за принцип поиска совпадений сообщения body в массиве условий, но она мне реально не понятна...

    function isSuitable(patobj, qobj) {
        if (!patobj || !qobj) return;
    
        for (var prop in patobj) {
          if (patobj[prop] == "*") {
            if (qobj[prop] == undefined) return;
          } else if (qobj[prop] != patobj[prop]) return;
        }
        return true;
      }
    


  • @Alex_Jet , у меня ситуация странная.
    Потому, что до обновления прошивки на мегах все работало отлично.
    После обносления прошивки вылез этот один косяк, но только после того, как мегу присоединил к серверу. Без связки с сервером работает корректно.

    Я сам не могу найти проблему. Вот и бегаю между двумя форумами - ab-log и IntraHouse.

    Усложняется все тем, что это дача, и я на ней только в выходные бываю. А косяк проявляется только при физическом переключении выключателя. В следующий приезд попробую прошивку предыдущую поставить, или старую вернуть. И файлы плагина на сервере стереть и по новой записать. Больше идей вообще нет.

    Каналы на выключатели мне нужны. Они у меня кроме включения нагрузки еще и автоматику выключают. Например, свет в туалете включается скриптом по датчику движения на 3 минуты, и выключается. Но если включить выключателем, этот скрипт не будет запускаться. И никаких выключений через 3 минуты не наступит.
    Или, включить выключатель, и выключить свет иконкой в интерфейсе - тот же эффект, скрипт по датчику движения не запустится.
    То же самое с вентиляторами. Автоматика - на 2 минуты после выключения света (например), а выключателем можно или включить надолго, или отключить автоматику.
    Плюс дополнительный датчик безопасности. Если кто при включенном режиме охраны щелкает выключателем - оно сообщает.
    Плюс комбинации состояний выключателей (пример - скрипт кодового замка минибара).

    Мне вообще выключатели нравятся больше кнопок. И каналы для них нужны. Это вам не кнопки! 🙂



  • @Erik, классно, что Вы придумали и реализовали такой богатый функционал! Предлагалось удалить канал только для тестирования. Чтобы вы увидели, что плагин с каналом ничего не делает. Но, думаю, поможет примерно также как и стирание плагина 🙂

    @Alex_Jet , по алгоритму плагина

    Как я уже говорил, тут то ли какие-то чудеса, то ли @intrapro (без обид!) не понимает где есть проблема. Потому что алгоритм в iH Berry работал безупречно. То есть:
    1.Если было прописано условие pt=0, то оно срабатывало только при входящем pt=0&cnt=xx
    2. Если было прописано условие pt=0&m=1, то оно срабатывало только при входящем pt=0&m=1&cnt=xx
    3. Если было прописано условие pt=0&m=2, то оно срабатывало только при входящем pt=0&m=2&cnt=xx

    Все и сейчас так работает, если прописаны все три условия. Другой вопрос, если третье условие НЕ прописано.
    С нашей точки зрения, при разработке плагина для развивающегося продукта (а MegaD развивается, и это здорово) не должно быть привязки к конкретной реализации, насколько это возможно.

    Поэтому алгоритм обработки входящих запросов такой:

    1. Из таблицы входящих запросов формируются объекты, чтобы не было зависимости от порядка параметров в строке:
    "pt=0&m=1" => {pt:0, m:1}, "pt=0" => {pt:0}, "pt=0&m=2&cnt=*" => {pt:0, m:2, cnt='*'},
    
    1. Существенным параметром считается номер порта pt. Все объекты группируются в массивы по портам плюс отдельная группа запросов, в которых порт не участвует. Массив упорядочивается по количеству параметров от большего к меньшему
    Для pt=0 -  [{pt:0, m:2, cnt='*'}, {pt:0, m:1}, {pt:0}]
    
    1. Когда приходит реальный запрос (который тоже преобразуется в объект), то ищется подходящая группа по номеру порта pt, и в ней подбирается соответствие перебором массива образцов.
      Функция isSuitable(patobj, qobj) получает каждый элемент массива образцов patobj и входящий объект qobj. Во входящем объекте должны быть все параметры, которые задал пользователь, в этом случае функция возвращает true. Обратное не требуется, т е во входящем запросе может быть сколько угодно не упомянутых в образце параметров
    if (patobj[prop] == "*") {//  в образце может быть звездочка - тогда требуется просто присутствие
           if (qobj[prop] == undefined) return;  // не подходит, так как во входящем нет совсем
    } else if (qobj[prop] != patobj[prop]) return; // не подходит, так как параметра нет или значение не совпадает
    
    

    Поскольку массив упорядочен по убыванию количества параметров, если совпадение не найдено, далее берется образец с меньшим числом параметров. Если вы не прописали pt=0&m=2, то последний образец будет pt=0, и он подходит. Для изменения ситуации достаточно прописать pt=0&m=2 с пустой командой.

    В общем, надо допилить этот алгоритм - чтобы он работал как полагается:)

    Это замечательная идея. Поскольку плагин расположен в публичном репозитарии на github https://github.com/intrahouseio/intraHouse.plugin-MegaD, есть масса вариантов:

    1. Можно сделать pull-request в действующий репозитарий. Для этого откорректируйте код прямо в репо, вам будет предложено создать pull-request. После ревью и одобрения ваши изменения будут включены в действующий плагин.

    2. Можно сделать fork текущего плагина и менять на свой вкус.

    3. Можно разработать новый плагин с использованием нового API плагинов https://github.com/intrahouseio/intraHouse-Cherry/wiki/Plugin-API-4.6

    В любом случае, если это будет реально работающий вариант, можем разместить плагин у себя для скачивания как альтернативный, а в перспективе и как основной. Welcome 🙂



  • Участник @intrapro написал в Плагин MegaD:

    Предлагалось удалить канал только для тестирования. Чтобы вы увидели, что плагин с каналом ничего не делает.

    Вы просто плохо его знаете!!!!
    Если неисправность возникает только при взаимодействии с сервером - значит сервер как минимум соучастник. Тут даже к следователю не ходи.
    Вопрос только - по злому умыслу, или непреднамеренно? 🙂

    Я файлы плагина уже удаленно поменял. И предварительный результат есть - канал выключателя передал значение "выключено". А то раньше постоянно включенным оставался независимо от перезагрузок плагина, сервера или меги.
    Но нужно таки им пошевелить физически, чтобы убедиться.

    Но если (надеюсь) помогла замена файлов плагина - что могло быть такого в старых файлах, и откуда? Как часто нужно их менять?



  • Участник @Erik написал в Плагин MegaD:

    Если неисправность возникает только при взаимодействии с сервером - значит сервер как минимум соучастник. Тут даже к следователю не ходи.

    После этого не значит вследствие этого.
    Если следователь не профессионал, то да. Решит, как проще, и дело закрыто.

    Но мы же не следователи, технари. Мы и голову иногда можем по назначению использовать.

    Вводные:
    Контроллер - самостоятельное устройство. Он может изменить настройку портов

    a) при действиях пользователя через web-интерфейс контроллера

    б) через внутреннюю программу контроллера, которая может изменить настройку, например, в защитных целях. Ну только предположим, что при нажатии на включатель идет дребезг, с частотой, которая проходит входные фильтры, но не позволяет отправлять сообщения на сервер так часто. Контроллер смотрит - P&R и при этом есть настройка сервера и решает - P&R
    не получится, буду работать в режиме P с программной фильтрацией. И никакого взаимодействия с сервером, заметьте, пока не было.

    в) под внешним воздействием. Разработчик MegaD говорит: "Отправлять GET-запросы, меняющие конфигурацию, может не только пользователь из браузера, но и сервер" То есть существует конкретный запрос, который нужно передать на контроллер по 80 порту.
    ОК, тогда этот запрос можно увидеть. Не верите отладчику, не доверяете плагину - подключите любой сниффер, wireshark или tcpdump прямо на сервере IH. Если увидите этот запрос - вопросы к серверу. Если нет - значит контроллер подвержен какому-то магическому внешнему воздействию или надо рассматривать вариант б)

    Но если (надеюсь) помогла замена файлов плагина - что могло быть такого в старых файлах, и откуда? Как часто нужно их менять?

    Наверно, нужно изучить фазы луны. Можно еще сервер тряпочкой протирать 🙂



  • @intrapro
    Вы очень здорово рассуждаете, но никак не объясняете причину бага.

    Баг такой - при добавлении сервера происходит искажение настройки порта.
    Если сервер не добавлять - не происходит. Мало того. Если убрать настройку сервера - настройки порта сами возвращаются в корректное состояние.

    Поддержка сервера предлагает изучать фазы луны. И протирать сервер тряпочкой. Прекрасно. Прошу уточнить марку тряпочки. И гарантировать, что это поможет.



  • Участник @Erik написал в Плагин MegaD:

    Но если (надеюсь) помогла замена файлов плагина - что могло быть такого в старых файлах, и откуда? Как часто нужно их менять?

    Замена файлов помочь не могла. Код плагина не менялся с марта 2019 года



  • Участник @Erik написал в Плагин MegaD:

    @intrapro
    Вы очень здорово рассуждаете, но никак не объясняете причину бага.

    Баг такой - при добавлении сервера происходит искажение настройки порта.
    Если сервер не добавлять - не происходит. Мало того. Если убрать настройку сервера - настройки порта сами возвращаются в корректное состояние.

    Поддержка сервера предлагает изучать фазы луны. И протирать сервер тряпочкой. Прекрасно. Прошу уточнить марку тряпочки. И гарантировать, что это поможет.

    Не с кем не охота вступать в дискуссию, но если все же это не косяк IH ? Дабы не обвинять ни кого, нужно более плотно подойти к анализу диагностики этой проблемы. Давайте рассмотрим мистическую и очень маловероятную вещь: если прошивка megad была старая, а при переходе на новую, было куча изменений, то при включенном сервере IH в момент перепрошивки, произошло именно то, что мешает Вам в данный момент. Просто Ваша проблема у других пользователей не проявляется. Опять же повторюсь, что для детальной диагностики этого бага нужно проблему изучать. Я бы на 2й машине с нуля установил без всего лишнего чисто для теста IH и проверил эту теорию.



  • И еще. Можно откатиться на ту же прошивку, при которой не было глюка и глянуть что будет.



  • Участник @artem521 написал в Плагин MegaD:

    Давайте рассмотрим мистическую и очень маловероятную вещь: если прошивка megad была старая, а при переходе на новую, было куча изменений, то при включенном сервере IH в момент перепрошивки, произошло именно то, что мешает Вам в данный момент.

    Нет. При прошивке я отелючал Мегу от сети, подключал к нотбуку патчкордом и прошивал. Сервер на прошивку влиять не мог.



  • Участник @intrahouse написал в Плагин MegaD:

    Замена файлов помочь не могла. Код плагина не менялся с января 2019 года

    Посмотрим.
    Файлы меняются не только при изменениях версии. Но и при некорректных отключениях питания, например. Юникс битый файл какой либо ценностью не считает. И просто удаляет его из файловой системы.
    Чтобы хотя бы это исключить, я переустановил плагин. И изменения поведения уже видны.
    Точнее протестирую в выходные.



  • @Erik, замена файла плагина на точно такой же без всякого на то основания - это из области ритуалов. Кто верит, тому помогает 🙂

    Вы очень здорово рассуждаете, но никак не объясняете причину бага.

    Я причину объяснить не могу, у меня недостаточно информации. Могу предложить варианты поиска проблемы

    Баг такой - при добавлении сервера происходит искажение настройки порта.

    Баг возникает на контроллере при прописывании сервера. Если это так - сервер совсем не при чем.
    Или не при прописывании, а при отправке контроллером сообщения на сервер (то есть при замыкании входа)?

    Можно попробовать:
    Тест 1. На сервере убрать обработку этого канала. Посмотреть, будет ли сбрасываться настройка.

    Тест 2. Прописать в качестве сервера не IH, а очень простой http-сервер, который просто слушает порт и точно ничего не отсылает

    Тест 3. Попробовать замыкать вход не выключателем, а напрямую на контроллере

    И самое главное - если все же думаете о внешнем воздействии на контроллер - исследуйте трафик



  • Участник @artem521 написал в Плагин MegaD:

    И еще. Можно откатиться на ту же прошивку, при которой не было глюка и глянуть что будет.

    Я это планирую. Выше написано.



  • @intrapro

    Вы к словам только не придирайтесь, пожалуйста.

    Баг возникает после прописывания сервера, при замыкании входа.

    Если просто поменять IP сервера в настройках меги, или даже порт, ошибка пропадает.

    А косяков полно, разной степени критичности. Я же выше даже скриншот прислал, как после изменения настроек плагина меняется отображение его версии.
    Вы на это не прореагировали даже.

    Или это тоже больше ни у кого не проявляется? Или вы считаете это корректной работой?



  • Участник @intrapro написал в Плагин MegaD:

    Можно попробовать:
    Тест 1. На сервере убрать обработку этого канала. Посмотреть, будет ли сбрасываться настройка.
    Тест 2. Прописать в качестве сервера не IH, а очень простой http-сервер, который просто слушает порт и точно ничего не отсылает
    Тест 3. Попробовать замыкать вход не выключателем, а напрямую на контроллере
    И самое главное - если все же думаете о внешнем воздействии на контроллер - исследуйте трафик

    В выходные попробую. Но поясните цель тестов, пожалуйста.

    1. Разве это не то же самое, что отсутствие настройки сервера, или указание несуществующего адреса? Запрос на сервер уйдет, а ответа не будет.
    2. То же самое, запрос уйдет, а ответа не будет, в чем смысл теста?
    3. Какая цель? Если без настройки сервера нажатия выключателя отрабатываются, зачем исключать провода?


  • Участник @Erik написал в Плагин MegaD:

    В выходные попробую. Но поясните цель тестов, пожалуйста.

    Цель - понять, что приводит к переключению настройки.

    1. Разве это не то же самое, что отсутствие настройки сервера, или указание несуществующего адреса? Запрос на сервер уйдет, а ответа не будет.

    Нет, плагин (его слушающий сервер) отвечает на все входящие, которые не смог распознать, пустым сообщением. Можно это увидеть в отладчике.

    1. То же самое, запрос уйдет, а ответа не будет, в чем смысл теста?

    Да, здесь ответа не будет, или будет статус 404, или еще что-то. А Вы уверены, что переключение происходит при получении ответа? Может все же при (или после) отправки запроса

    1. Какая цель? Если без настройки сервера нажатия выключателя отрабатываются, зачем исключать провода?

    Без настройки сервера нажатия отрабатываются на контроллере без отправки сообщений. Проверьте, если есть возможность и ситуация стабильно повторяется. Хуже, если это происходит не всегда, тогда выводы делать труднее.

    Если ситуация стабильно воспроизводится, нужно исследовать сетевой трафик, можно по простому tcpdump-ом на IH сервере:

    Установить, если не установлен

    sudo apt-get install tcpdump
    

    Запустить с IP MegaD, будут показаны все входящие и исходящие пакеты, т е порты 80 и слушающий (8083 в вашем случае)

    sudo tcpdump host 192.168.0.14 -X
    


  • @Erik, если есть свободный выход у MegaD, то чтобы экспериментировать удаленно можно этим выходом замыкать вход, имитируя ваш выключатель.
    Про кнопки/выключатели - конечно вы завязали выключали на очень широкий функционал, но, ИМХО, кнопки:

    1. Приятнее "на ощуп"
    2. Имеют как минимум 3 действия (одинарный, двойной клики и удержание)
    3. Не нужно создавать каналы в плагине.

    Про щелкания выключателем в режиме охраны - надуманная вещь. Во-первых, вор не знает/не видит где находится выключатель, во-вторых, не будет включать свет чтобы не привлечь внимания (зависит от условий). В нашем микрорайоне один из соседелй у себя на втором этаже лазил с фонариком под утро - и другие соседи, увидев это, сразу написали в нашу группу Whatsapp)))
    Про привязку сценариев - при щелкании кнопки всегда что-то включается, поэтому создано устройство "актуатор", соответственно, у меня все сценарии к этим актуаторам и привязаны.



  • @Alex_Jet
    Свободных выходов нет.

    1. Это субъективно. Но выключатель никогда не оставляет сомнений.
    2. У выключателя есть не только действия, но и состояния.
    3. Если оставаться в рамках того, что поддерживает мега - не нужно. А что особенно грустно - и бесполезно.
      🙂

Авторизуйтесь, чтобы ответить