Модуль Noolite

crazy_russian_bear
Сообщения: 33
Зарегистрирован: Пт авг 03, 2018 5:47 pm
Благодарил (а): 2 раза
Поблагодарили: 2 раза

Re: Модуль Noolite

Сообщение crazy_russian_bear » Пт мар 01, 2019 7:48 pm

ilvas писал(а):
Ср фев 27, 2019 2:48 pm
crazy_russian_bear писал(а):
Сб сен 22, 2018 8:24 pm
У меня тоже мдм стоит на малине. Все ок работает. От ноолайт у меня MTR64 UART. Силовой блок я к нему подключил - все замечательно управляется. ...
Как Вы это сделали, дружище? Куда глянули? Ни в ветке форума, ни на видео по ноолайту про MTR64 UART ни слова.
И в коннекте не могу достучаться с простой просьбой настроить такую комбинацию.
Я подключал через переходник USB-UART. В настройках модуля выбираете /dev/ttyUSB0
За это сообщение автора crazy_russian_bear поблагодарил:
ilvas (Вс мар 03, 2019 10:55 am)
Рейтинг: 1.16%
Дмитрий Иванов
Сообщения: 83
Зарегистрирован: Вс фев 28, 2016 11:36 pm
Благодарил (а): 17 раз
Поблагодарили: 25 раз

Re: Модуль Noolite

Сообщение Дмитрий Иванов » Ср апр 10, 2019 8:03 pm

Всем привет!
Пособирал по данному модулю баги и прежде чем запостить в коннект Сергею, решил описать их здесь, что бы найти (или не найти) подтверждение у других пользователей модуля.
Исходные данные:
Система установлена на Linux Debian 9, платформа PC Celeron n3050 2 ядра.
Обнаруженные баги:
1. MTRF в режиме приема имеет 64 канала - от 0-63. Под windows в программе nooLite ONE каналы нумеруются от 1 до 64, а в командах передается от 0 до 63. В МажорДоМо под линукс как нумеруются каналы так и передаются команды, но привязать к нулевой ячейке ничего не возможно. Даже привязав к этой ячейке пульт в программе nooLite ONE в мажордомо ни какой реакции, хотя светодиод на приемнике мигает. Модуль ноолайт просто не интерпритирует нулевую ячейку приемника. В итоге, для подключения пультов(выключателей) и датчиков можно пользоваться только каналами с 1-го по 63й. При работе с силовыми блоками данной проблемы не возникает - нулевой канал на передачу работает.

2. Трансивер MTRF предполагает привязку 64 устройств по протоколу Noolite и 64 устройств по протоколу Noolite-F. Таким образом можно привязать 64 выключателя (Noolite) и 64 силовых блока (Noolite-F). Проблема в том, что данный сценарий можно реализовать, только если сначала создать в модуле ноолайт каналы приёмников, привязав к ним устройства, а только потом силовые блоки. Так как если сначала создать силовой блок (F), например на первом канале, то потом на первый канал невозможно будет привязать радиопульт. Просто не появляется поле с данными, хотя на самом деле все привязалось.

3. (не до конца проверено) Радиопульты PK315 могут работать как в режиме switch, когда при нажатии и последующем отпускании кнопки отправляется команда Switch, так и в режиме on/off когда при нажатии кнопки подается команда on, а при размыкании off (для работы с обычными выключателями не имеющих возвратных пружин). Так вот, при связке PK315, работающем в режиме on/off и SUF-1-300 (в режиме F), при привязке их на один номер канала в МД столкнулся с проблемой: При привязке силового блока и радиопульта к объекту MD через свойство status, возник бесконечный цикл приема-передачи на привязанном канале. Однако, если пульт перевести в режим switch (соответсвенно кнопка пульта вызывает метод switch), то данная проблема не возникает (оба устройства на одном номере канала). Предположительно, если устройства на разных номерах каналов, то такая проблема не возникает (так и не проверил, оставил в режиме switch)...

4.Высокая загрузка CPU циклом noolite - 18-20 процентов. Надо отметить, что у меня довольно много устройств ноолайт (около 30 каналов на приём занято радиопультами/датчиками и 22 канала на передачу занято силовыми блоками).
Cycle_noolite.php.jpg
Cycle_noolite.php.jpg (114.39 КБ) 7207 просмотров
Если у кого есть мысли мысли по данным вопросам - пишите.
Спасибо!
I_I_Imonder
Сообщения: 256
Зарегистрирован: Сб янв 11, 2014 2:54 pm
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Модуль Noolite

Сообщение I_I_Imonder » Ср июл 10, 2019 7:10 am

Друзья, поведайте кто как управляет RGB силовым блоком? включить выключить получается, а вот остальные плюшки нет(
Алиса на линуксе
Krinopotam
Сообщения: 77
Зарегистрирован: Вт июл 10, 2018 11:38 am
Благодарил (а): 13 раз
Поблагодарили: 33 раза

Re: Модуль Noolite

Сообщение Krinopotam » Вс авг 25, 2019 8:36 pm

Добрый день!

Поднял Majordomo на Ubuntu 18.04+NginX.
Подключил MTRF-64-USB и настроил плагин ноолайт как Serial port:/dev/ttyUSB0.
У меня все силовые блоки серии F, плюс 10-ти канальный силовой блок SRF-10-1000.
Все работает.
Но заметил особенность - задержка примерно в 5 секунд до исполнения следующей команды после предыдущей.
Например, включаем лампочку - она включается моментально. Но если сразу же ее попытаться выключить или попробовать включить другую, то реакция будет только через 5 секунд.
Такое ощущение, что где-то в модуле стоит принудительная задержка после каждой команды.
На других устройствах, управляемых другими модулями такого не наблюдается. Под Windows с nooLite One такого поведения тоже не было.

Можно ли как-то убрать или уменьшить данную задержку между командами?
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: Модуль Noolite

Сообщение xor » Пн авг 26, 2019 12:02 am

Krinopotam писал(а):
Вс авг 25, 2019 8:36 pm
Добрый день!

Поднял Majordomo на Ubuntu 18.04+NginX.
Подключил MTRF-64-USB и настроил плагин ноолайт как Serial port:/dev/ttyUSB0.
У меня все силовые блоки серии F, плюс 10-ти канальный силовой блок SRF-10-1000.
Все работает.
Но заметил особенность - задержка примерно в 5 секунд до исполнения следующей команды после предыдущей.
Например, включаем лампочку - она включается моментально. Но если сразу же ее попытаться выключить или попробовать включить другую, то реакция будет только через 5 секунд.
Такое ощущение, что где-то в модуле стоит принудительная задержка после каждой команды.
На других устройствах, управляемых другими модулями такого не наблюдается. Под Windows с nooLite One такого поведения тоже не было.

Можно ли как-то убрать или уменьшить данную задержку между командами?
есть в модуле функция sendAPICommand

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

        if ($cmdline) {
            $latest_command_sent = (int)getGlobal('ThisComputer.LatestNooliteCommand');
            $diff = $latest_command_sent - time();
            if ($diff < 0) {
                DebMes("Noolite instant cmd: " . $cmdline, 'noolite');
                setGlobal('ThisComputer.LatestNooliteCommand', time(), 0, $this->name);
                exec($cmdline);
            } else {
                $diff = $diff + 1;
                DebMes("Noolite delayed (" . ($diff) . ") cmd: " . $cmdline, 'noolite');
                setGlobal('ThisComputer.LatestNooliteCommand', time() + $diff, 0, $this->name);
                setTimeOut('noocommand' . md5($cmdline), 'exec(\'' . $cmdline . '\');', $diff);
            }
        }
там задержка есть в 1 с, может, у вас ещё набегает, в логе ноо видите записи Noolite delayed ? Может, у вас поллинг по всем устройствам ещё стоит?
а если у вас апи сериал, то

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

elseif ($this->config['API_TYPE'] == 'serial') {
            addToOperationsQueue('noolite_queue','command',$api_command);
, то вот с этой очередью разбирайтесь
За это сообщение автора xor поблагодарил:
Krinopotam (Пн авг 26, 2019 4:10 pm)
Рейтинг: 1.16%
Krinopotam
Сообщения: 77
Зарегистрирован: Вт июл 10, 2018 11:38 am
Благодарил (а): 13 раз
Поблагодарили: 33 раза

Re: Модуль Noolite

Сообщение Krinopotam » Вт авг 27, 2019 9:45 pm

Krinopotam писал(а):
Вс авг 25, 2019 8:36 pm
Добрый день!

Поднял Majordomo на Ubuntu 18.04+NginX.
Подключил MTRF-64-USB и настроил плагин ноолайт как Serial port:/dev/ttyUSB0.
У меня все силовые блоки серии F, плюс 10-ти канальный силовой блок SRF-10-1000.
Все работает.
Но заметил особенность - задержка примерно в 5 секунд до исполнения следующей команды после предыдущей.
Например, включаем лампочку - она включается моментально. Но если сразу же ее попытаться выключить или попробовать включить другую, то реакция будет только через 5 секунд.
Такое ощущение, что где-то в модуле стоит принудительная задержка после каждой команды.
На других устройствах, управляемых другими модулями такого не наблюдается. Под Windows с nooLite One такого поведения тоже не было.

Можно ли как-то убрать или уменьшить данную задержку между командами?
Разобрался.
В цикле cycle_noolite.php небольшой баг.
В нем присутствует следующий код:

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

        while (1) {
            // CHECKPORT
            $r = fread($fp, 1);
            $ch = binaryToString($r);
            ...
            ...
            if ($ch == 'ad') { 
            	//блок условия 1 - чтение старшего байта (заголовка)
                $in = $ch;
                $readInProgress = 1;
                $readStarted = time();
            } elseif ($ch == 'ae') { 
            	//блок условия 2 - чтение младшего байта ("хвоста")
                $errors=0;
                $line = $in . $ch;
                echo date('H:i:s') . " In: [" . $line . "];\n";
                $data = HexStringToArray($line);
                $readInProgress = 0;
                ...
                ...
            } else { 
            	//блок условия 3 - чтение остальных байтов
                $in .= $ch;
                $readInProgress = 2;
            }

            if ($readInProgress > 0 && (time() - $readStarted) > 3) {
                //read not finished within 3 seconds for some reason
                $readInProgress = 0;
            }
Суть его в том, что он последовательно считывает блок значений по одному байту с помощью fread($fp, 1) и склеивает их в одну строку. Причем строка начинается со старшего байта 'ad', а заканчивается младшим байтом 'ae', а все остальные байты помещаются между этими значениями.
Во тут и стоит обратить внимание на переменную $readInProgress, которая означает текущий этап считывания байтов.
Когда считался заголовок в виде 'ad', то $readInProgress = 1. Если считались любые другие промежуточные байты, то $readInProgress = 2. А если считался хвостовой байт 'ae', то $readInProgress = 0, что означает, что чтение блока закончилось. Пока $readInProgress>0 (то есть пока блок не прочитан полностью), или пока не будет таймаута >3 секунд, исполнение кода не пойдет дальше. Но нюанс в том, что чтение всех прочих байт происходит вне зависимости, был ли уже прочтен полностью блок или нет (блок условия 3). Даже если блок уже полностью прочтен и читать больше нечего (возвращается пустой результат), все равно срабатывает блок условия 3 и переменная $readInProgress становится равна 2. Соответственно код не пускает исполнение дальше и продолжает пытаться читать пустой поток, пока не произойдет таймаут больше 3 секунд.

Чтобы исправить, можно добавить переменную, которая бы хранила состояние, начался ли читаться блок и если он прочелся полностью, то не пытаемся обрабатывать пустой поток.
Например так:

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

        $sequenceStart = false; //новая переменная
        while (1) {
            // CHECKPORT
            $r = fread($fp, 1);
            $ch = binaryToString($r);
            ...
            ...

            if ($ch == 'ad') {
                $in = $ch;
                $readInProgress = 1;
                $readStarted = time();
                $sequenceStart = true; //показываем, что началось чтение блока байт из потока
            } elseif ($ch == 'ae') {
                $errors=0;
                $line = $in . $ch;
                echo date('H:i:s') . " In: [" . $line . "];\n";
                $data = HexStringToArray($line);
                $readInProgress = 0;
                ...
                ...
                ...                                
                $sequenceStart = false ; //показываем, что чтение блока байт из потока завершено
            } else {
                if ($sequenceStart) { //принимаем результаты чтения из потока только тогда, когда чтение бока еще не завершено
                    $in .= $ch;
                    $readInProgress = 2;
                }
            }

            if ($readInProgress > 0 && (time() - $readStarted) > 3) {
                //read not finished within 3 seconds for some reason
                $readInProgress = 0;
            }
Теперь включение света на моей железке с Ubintu+Nginx+PHP-FPM срабатывает мгновенно.
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: Модуль Noolite

Сообщение xor » Чт авг 29, 2019 1:29 am

Krinopotam писал(а):
Вт авг 27, 2019 9:45 pm
...
Теперь включение света на моей железке с Ubintu+Nginx+PHP-FPM срабатывает мгновенно.
оформите как баг в коннекте, там, кмк, быстрее правят https://connect.smartliving.ru/ideas.ht ... type=&tab=
eaten
Сообщения: 7
Зарегистрирован: Вт июн 13, 2017 3:03 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Модуль Noolite

Сообщение eaten » Вт мар 03, 2020 11:40 pm

Добрый день!

Есть ли возможность изменить/дополнить текущий модуль noolite для mjdm, что бы модуль более правильно понимал пульты, которые работают в режиме 1-off/2-on, когда каждый из 4 каналов (для примера взят двуклавишный выключатель pb212(412), но такая же ситуация и для первой версии пультов) работают в режиме switch.

После привязки пульта к mjdm, в "данных" появляется 2 св-ва - "switch" (постоянная 1) и "bind" (постоянный 0), см. фото
Данные.jpg
Данные.jpg (28.95 КБ) 6116 просмотров
И что бы не нажимал - данные св-в не меняются.
Хотя, как я понимаю, должны быть св-ва на 4 канала с значением onn/off (1/0) с каждой кнопки (канала).

Пример из x-ray для такого типа пульта:
REQUEST: /ajax/noolite.html?serial=1&mode=1&answ=0&toggl=4&cell=60&cmd=4&fmt=0&d0=0&d1=0&d2=0&d3=0&id=00000000&crc=242

toggl и crc - всегда +1 идет.
graffiti
Сообщения: 4
Зарегистрирован: Вт авг 18, 2015 11:44 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Модуль Noolite

Сообщение graffiti » Вт апр 21, 2020 5:54 pm

Помогите подружить MTRF-64-USB и nooliterx

Задача - собирать данные температуры с датчиков noolite

Исходники брал здесь: https://github.com/olegart/noolite

Тоже не смог победить сборку на ubuntu 18.04 LTS - аналогичные ошибки, как у кого-то здесь были. По отдельности, если добавить -lusb -lusb-1.0 то собирается, но при попытке запустить nooliterx - "No compatible devices were found"
На CentOS 7.7.1908 собралось, но тоже "No compatible devices were found"
Модуль MTRF-64-USB в системе появляется, виден как /dev/ttyUSB0
lsusb говорит Bus 001 Device 006: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC

Это уже 5 проект у меня на датчиках noolite, каждый раз были проблемы со сборкой nooliterx, но в конце-концов как-то получалось. Каждый раз думал - теперь точно не забуду, и вот опять.
Никак не получается подружить MTRF-64-USB и nooliterx, помогите, пожалуйста.
Serg159
Сообщения: 1
Зарегистрирован: Пн май 25, 2020 12:01 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Модуль Noolite

Сообщение Serg159 » Пн май 25, 2020 12:38 pm

Добрый день!

помогите разобраться с модулем noolite. Имеется стандартный образ под Raspberry, в нем создано несколько устройств noolite. К Raspberry через UART подключен модуль noolite. При попытке привязать устройство ничего не происходит, в лог файл ничего не пишется и файл date_noolite.log за текущий день отсутствует. При этом service noolite - online. Если нажать кнопку restart для сервиса, появляется лог файл и в нем записи:

11:54:45 0.59395700 Init string: stty -F /dev/ttyS0 cs8 9600 -icrnl -ixon -ixof$
11:54:45 0.61267800 Opening port /dev/ttyS0

при этом у меня есть рабочий прошлогодний образ. На том же оборудовании работает и привязка и управление устройствами.

Подскажите куда смотреть? в чем может быть причина?

Сергей.
Ответить