Зависание плагина MegaD



  • @Alex_Jet:

    Порт 31 сконфигурирован как 1-wire bus, на нем сейчас висит 3 датчика DS18B20. Период конвертации данных в MegaD - 30 секунд. Когда запрос попадает на момент конвертации, то MegaD выдает "busy". Однако это "busy" в логах плагина длилось порядка 1 часа, пока я не перезагрузил плагин.

    ….

    Вот такой вредный busy на канале с 1-wire bus! Так понимаю, что на протяжении примерно 30 минут запрос попадает на конвертацию температуры

    А сколько времени MegaD находится в состоянии busy? Если речь идет о 1-2 сек, то попав в зону busy, можно там и остаться, если период опроса кратен 30 сек ( в данном случае 60 сек). Вариант решения - сделать период не кратным 30 сек - 67 сек, например.



  • Как ответил разработчик MegaD - период конвертации для любого количества датчиков равен 750 мС. Конечно можно разносить период опроса вручную, но вероятно лучше программно обрабатывать тот же "busy" - если ответ такой, то повторяем запрос через 1 секунду, иначе следующий интервал опроса тот что в request.

    Кстати, в настройках железа устройств есть "Специальное значение, означающее ошибку датчика" как это работает? То есть впишу я туда "busy" и что сделает система когда датчик ответит ей "busy"? Надо бы это осветить!

    Пока больше зависаний плагина не могу зафиксировать. Спустя примерно 5 часов виснет сама MegaD! Сегодня поменяю железку на новую - тут виновата либо железо, либо система…



  • @Alex_Jet:

    Как ответил разработчик MegaD - период конвертации для любого количества датчиков равен 750 мС. Конечно можно разносить период опроса вручную, но вероятно лучше программно обрабатывать тот же "busy" - если ответ такой, то повторяем запрос через 1 секунду, иначе следующий интервал опроса тот что в request..

    Да, программно обрабатывать можно, просто не хотелось привязываться к деталям реализации…

    И жестко программировать повтор запросов, устройство довольно нежное 🙂

    Поскольку у нас нет возможности проверить (у нас есть только MegaD 238), проверьте пожалуйста, если цикл сдвинуть - ответ после busy все же придет?

    @Alex_Jet:

    Кстати, в настройках железа устройств есть "Специальное значение, означающее ошибку датчика" как это работает? То есть впишу я туда "busy" и что сделает система когда датчик ответит ей "busy"? Надо бы это осветить!

    Эту настройку плагин Mega пока не использует. Стандартное использование - если с канала читается что-то не то, то просто выставляется флаг ошибки датчика, будет алерт и соотв. индикация.

    @Alex_Jet:

    Пока больше зависаний плагина не могу зафиксировать. Спустя примерно 5 часов виснет сама MegaD! Сегодня поменяю железку на новую - тут виновата либо железо, либо система…

    Как в этом случае отрабатывает плагин? Ошибка индицируется? Что в логах?

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



  • @intrapro:

    Поскольку у нас нет возможности проверить (у нас есть только MegaD 238), проверьте пожалуйста, если цикл сдвинуть - ответ после busy все же придет?

    Да вот как это проверить? Например, запускается плагин и некоторое время все хорошо, а спустя 1-5 часов период опроса попадает на busy. И может час попадать на момент конвертации. Ждать больше не получалось пока (зависает MegaD или перезапускал плаги вручную).
    @intrapro:

    Эту настройку плагин Mega пока не использует. Стандартное использование - если с канала читается что-то не то, то просто выставляется флаг ошибки датчика, будет алерт и соотв. индикация.

    То есть на данный момент бесполезно там что-то писать?
    @intrapro:

    Как в этом случае отрабатывает плагин? Ошибка индицируется? Что в логах?

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

    Закрытие сокета вижу. MegaD уходит в зависание насовсем (ping нет, сам контроллер свои сценарии не отрабатывает), соответственно intrahouse говорит о том что "Контроллер MegaD. Ошибка!" и в лог такой:

    11.01.2017 01:30:16 MegaD plugin has started.
    11.01.2017 01:30:16 Listening localhost:8020
    11.01.2017 01:30:16 Address 36 (IA36). Loading script
    11.01.2017 01:30:16 Polling   192.168.12.20:80/sec/?cmd=all, interval 0 sek
    11.01.2017 01:30:16 Polling   192.168.12.20:80/sec/?pt=30&cmd=get, interval 60 sek
    11.01.2017 01:30:16 Polling   192.168.12.20:80/sec/?pt=36&cmd=get, interval 300 sek
    11.01.2017 01:30:16 Polling   192.168.12.20:80/sec/?pt=31&cmd=list, interval 60 sek
    11.01.2017 01:30:16 Polling   192.168.12.20:80/sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1, interval 60 sek
    11.01.2017 01:30:16 Polling   192.168.12.20:80/sec/?pt=34&scl=35&i2c_dev=htu21d, interval 60 sek
    11.01.2017 01:30:16 
    11.01.2017 01:30:16 localhost => 192.168.12.20:80 HTTP GET /sec/?cmd=all
    11.01.2017 01:30:16 localhost <=>192.168.12.20:80 socket handle=16\. Header: GET /sec/?cmd=all HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    11.01.2017 01:30:20 localhost <= 192.168.12.20:80 Error EHOSTUNREACH.  Stopped.
    
    


  • @Alex_Jet:

    То есть на данный момент бесполезно там что-то писать?

    Да
    @Alex_Jet:

    Пока больше зависаний плагина не могу зафиксировать. Спустя примерно 5 часов виснет сама MegaD! Сегодня поменяю железку на новую - тут виновата либо железо, либо система…

    Удалось ли восстановить работоспособность MegaD? Не хочется добавлять новый функционал, пока не разобрались с зависанием.



  • @intrapro:

    Удалось ли восстановить работоспособность MegaD? Не хочется добавлять новый функционал, пока не разобрались с зависанием.

    Проблема примерно локализована - необходимо время для проведения еще нескольких тестов.

    С тех пор как добавили закрытие сокетов в плагине он ни разу не зависал. Последний uptime-работы плагина - 18 часов, однако убран опрос I2C датчика HTU21D. Большая вероятность что именно из-за его обработки виснит MegaD.



  • Проясните, пожалуйста, коды ошибок, которые выдает плагин при перезапуске. Сегодня когда в очередной раз перезапускал контроллер MegaD обратил внимание что плагин рестартовал несколько раз:
    MegaD-2561.png

    По зависанию MegaD. Конечно этого не должно быть в принципе, но пока складывается ощущение, что контроллер вешается только в том случае если с помощью intrahouse начинаю опрашивать HTU21D с помощью команды /%pwd%/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1. То есть как только ввожу в действие опрос этого датчика, то MegaD спустя 4-9 часов зависает. Замечено, что если опрашиваю сразу по обоим параметрам (температура и влажность), причем интервал опроса один и то же для обоих каналов - 60 секунд, то контроллер вешается быстрее - от 2 до 3-х часов.

    Мое мнение такое - intrahouse cлишком быстр, в отличие от php и в какой-то момент запросы по каждому каналу начинают сыпаться один за другим с минимальным промежутком, в итоге MegaD виснет от ddos-атаки.

    У разработчика MegaD моя конфигурация на php уже работает несколько суток без каких-либо сбоев (опрос датчиков каждые 8 секунд). Сейчас провожу повторный тест - опрашиваю все каналы, которые были, кроме HTU21D (в прошлый раз на протяжении 34 часов контроллер работал без сбоев, потом я начал делать другой тест). Следующий тест - разнос опроса каналов по времени и включение опроса всех каналов (в том числе HTU21D).



  • @Alex_Jet:

    Проясните, пожалуйста, коды ошибок, которые выдает плагин при перезапуске. Сегодня когда в очередной раз перезапускал

    контроллер MegaD обратил внимание что плагин рестартовал несколько раз:

    Коды ошибок плагинов, которые приводят к завершению работы:

    code 1 - плагин запустился, но сразу закончил работу.

    Для MegaD - не задан IP контроллера или порт для прослушивания занят.

    code 2, 3 Ошибка связи или ошибка чтения

    Для MegaD - это ошибка во время выполнения запроса GET (м.б. EHOSTUNREACH, ECONNREFUSED, ESOCKETTIMEDOUT,..) В логе плагина для всех этих ошибок есть расшифровка ошибки со словом Stopped

    16.01.2017 12:32:20 localhost <= 192.168.0.14:80 Error EHOSTUNREACH.  Stopped.
    
    

    code 143 - плагин получил сигнал на остановку от сервера, но какие-то операции не завершены.

    Собственно, это не ошибка, уберем.

    @Alex_Jet:

    ..в какой-то момент запросы по каждому каналу начинают сыпаться один за другим с минимальным промежутком, в итоге MegaD виснет от ddos-атаки….Следующий тест - разнос опроса каналов по времени и включение опроса всех каналов (в том числе HTU21D).

    Предлагаю прямо в коде плагина принудительно разнести запросы.

    Сейчас следующий запрос уходит не раньше чем через 200 мС.

    Сделаем 2-3-5 сек в коде плагина /opt/intrahouse/server/ihlib/equip/megad.js, стр.71

    		// Http клиент. Сформировать массив запросов reqarr и массив таймеров
    		prepareOutReqAndTimers();
    		setInterval( runOutReq, 2000);  // 200 -> 2000  
    	} catch (e) {	
    		traceMsg( e.message+' Stopped.');
    		process.exit(1);
    	}
    
    
    

    После редактирования файла плагин нужно перезапустить. Сервер перезагружать не требуется.

    Другой вариант - заменить асинхронный механизм отправки запросов на синхронный однопоточный, как, видимо, это происходит в php. Т.е. не отправлять следующий запрос, пока не получен ответ на предыдущий. Можно сделать и так.

    Еще версия - опрос HTU21D имеет специфические требования? Контроллер ждет еще чего-то от сервера, а плагин переходит к следующему запросу..



  • @intrapro:

    После редактирования файла плагин нужно перезапустить. Сервер перезагружать не требуется.

    Все понятно! Спасибо за описание.
    @intrapro:

    Другой вариант - заменить асинхронный механизм отправки запросов на синхронный однопоточный, как, видимо, это происходит в php. Т.е. не отправлять следующий запрос, пока не получен ответ на предыдущий. Можно сделать и так.

    Мне кажется, что это будет как раз правильным решением. Поскольку контроллер, построенный на AVR с Ethernet-контроллером ENC28J60, не может обрабатывать много потоков. Зная, немного прошивку, - там этого просто нет.
    @intrapro:

    Еще версия - опрос HTU21D имеет специфические требования? Контроллер ждет еще чего-то от сервера, а плагин переходит к следующему запросу..

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



  • Разнес запросы по датчикам (см.ниже), однако спустя 4 часа 21 минуту MegaD завис. Разработчик MegaD проверяет версию по поводу ddos-атаки. Попробую внести изменения в работу плагина.

    17.01.2017 10:05:51 MegaD plugin has started.
    17.01.2017 10:05:51 Listening localhost:8020
    17.01.2017 10:05:51 Address 36 (IA36). Loading script
    17.01.2017 10:05:51 Polling   192.168.12.20:80/sec/?cmd=all, interval 0 sek
    17.01.2017 10:05:51 Polling   192.168.12.20:80/sec/?pt=30&cmd=get, interval 61 sek
    17.01.2017 10:05:51 Polling   192.168.12.20:80/sec/?pt=36&cmd=get, interval 300 sek
    17.01.2017 10:05:51 Polling   192.168.12.20:80/sec/?pt=31&cmd=list, interval 63 sek
    17.01.2017 10:05:51 Polling   192.168.12.20:80/sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1, interval 65 sek
    17.01.2017 10:05:51 Polling   192.168.12.20:80/sec/?pt=34&scl=35&i2c_dev=htu21d, interval 67 sek
    
    


  • @intrapro:

    Предлагаю прямо в коде плагина принудительно разнести запросы.

    Сейчас следующий запрос уходит не раньше чем через 200 мС.

    Сделаем 2-3-5 сек в коде плагина /opt/intrahouse/server/ihlib/equip/megad.js, стр.71

    Вчера обновился, отредактировал megad.js (у меня была стр.53) и запустил плагин (в 22:20). До сих пор (~15 часов) полет нормальный, все работает.



  • Значит 200 мС период все же был короткий. Нужно конечно по крайней мере 24 часа uptime.

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



  • Само собой тест будет так долго сколько получится! Единственное - смущают периодические ошибки по всем датчикам. Лог журнала из веба не копируется! А из консоли где его можно посмотреть?

    Приведу пример, помогите разобраться - по журналу в 18.01.2017 13:51:30 Ошибка датчика температуры и влажности (DHT22), который висит на 30-м порте. Лог плагина в промежутке с 18.01.2017 13:50:29 по 18.01.2017 13:52:49 прилагаю. Периодичность опроса датчиков как в предыдущем посте.

    18.01.2017 13:50:29 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1
    18.01.2017 13:50:29 localhost <=>192.168.12.20:80 socket handle=55\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1 HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:50:29 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:50:29 localhost <= 192.168.12.20:80 HTTP 26.14
    18.01.2017 13:50:29 MG2?341=26.14&
    18.01.2017 13:50:29 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:50:31 
    18.01.2017 13:50:31 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=31&cmd=list
    18.01.2017 13:50:31 localhost <=>192.168.12.20:80 socket handle=55\. Header: GET /sec/?pt=31&cmd=list HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:50:31 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:50:31 localhost <= 192.168.12.20:80 HTTP ff862a831501:24.06;ff6e2a831501:24.12;ff676b821503:23.68
    18.01.2017 13:50:31 MG2?31_ff862a831501=24.06&31_ff6e2a831501=24.12&31_ff676b821503=23.68&
    18.01.2017 13:50:31 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:50:33 
    18.01.2017 13:50:33 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get
    18.01.2017 13:50:33 localhost <=>192.168.12.20:80 socket handle=55\. Header: GET /sec/?pt=30&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:51:15 
    18.01.2017 13:51:15 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get
    18.01.2017 13:51:15 localhost <=>192.168.12.20:80 socket handle=56\. Header: GET /sec/?pt=36&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:51:15 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:51:15 localhost <= 192.168.12.20:80 HTTP 158
    18.01.2017 13:51:15 Address 36
    18.01.2017 13:51:15     run script: val=158 depo={ res: [] }
    18.01.2017 13:51:15  script return:{ reqsek: 5 } depo={ res: [ 158 ] }
    18.01.2017 13:51:15 Address 36\. Shift request interval: 5 sek.
    18.01.2017 13:51:15 MG2?
    18.01.2017 13:51:15 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:51:21 
    18.01.2017 13:51:21 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get
    18.01.2017 13:51:21 localhost <=>192.168.12.20:80 socket handle=56\. Header: GET /sec/?pt=36&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:51:21 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:51:21 localhost <= 192.168.12.20:80 HTTP 160
    18.01.2017 13:51:21 Address 36
    18.01.2017 13:51:21     run script: val=160 depo={ res: [ 158 ] }
    18.01.2017 13:51:21  script return:{ reqsek: 5 } depo={ res: [ 158, 160 ] }
    18.01.2017 13:51:21 MG2?
    18.01.2017 13:51:21 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:51:27 
    18.01.2017 13:51:27 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get
    18.01.2017 13:51:27 localhost <=>192.168.12.20:80 socket handle=56\. Header: GET /sec/?pt=36&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:51:27 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:51:27 localhost <= 192.168.12.20:80 HTTP 148
    18.01.2017 13:51:27 Address 36
    18.01.2017 13:51:27     run script: val=148 depo={ res: [ 158, 160 ] }
    18.01.2017 13:51:27  script return:{ reqsek: 5 } depo={ res: [ 158, 160, 148 ] }
    18.01.2017 13:51:27 MG2?
    18.01.2017 13:51:27 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:51:33 
    18.01.2017 13:51:33 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get
    18.01.2017 13:51:33 localhost <=>192.168.12.20:80 socket handle=56\. Header: GET /sec/?pt=36&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:51:33 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:51:33 localhost <= 192.168.12.20:80 HTTP 151
    18.01.2017 13:51:33 Address 36
    18.01.2017 13:51:33     run script: val=151 depo={ res: [ 158, 160, 148 ] }
    18.01.2017 13:51:33  script return:{ reqsek: 5 } depo={ res: [ 158, 160, 148, 151 ] }
    18.01.2017 13:51:33 MG2?
    18.01.2017 13:51:33 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:51:35 
    18.01.2017 13:51:35 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d
    18.01.2017 13:51:35 localhost <=>192.168.12.20:80 socket handle=56\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:51:35 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:51:35 localhost <= 192.168.12.20:80 HTTP 12.60
    18.01.2017 13:51:35 MG2?342=12.6&
    18.01.2017 13:51:35 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:51:37 
    18.01.2017 13:51:37 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1
    18.01.2017 13:51:37 localhost <=>192.168.12.20:80 socket handle=56\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1 HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:51:39 
    18.01.2017 13:51:39 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=31&cmd=list
    18.01.2017 13:51:39 localhost <=>192.168.12.20:80 socket handle=57\. Header: GET /sec/?pt=31&cmd=list HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:51:39 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:51:39 localhost <= 192.168.12.20:80 HTTP ff862a831501:24.00;ff6e2a831501:24.06;ff676b821503:23.62
    18.01.2017 13:51:39 MG2?31_ff862a831501=24.00&31_ff6e2a831501=24.06&31_ff676b821503=23.62&
    18.01.2017 13:51:39 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:51:41 
    18.01.2017 13:51:41 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get
    18.01.2017 13:51:41 localhost <=>192.168.12.20:80 socket handle=57\. Header: GET /sec/?pt=30&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:51:41 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:51:41 localhost <= 192.168.12.20:80 HTTP temp:24.60/hum:10.20
    18.01.2017 13:51:41 MG2?30_1=24.6&30_2=10.2&
    18.01.2017 13:51:41 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:51:43 
    18.01.2017 13:51:43 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get
    18.01.2017 13:51:43 localhost <=>192.168.12.20:80 socket handle=57\. Header: GET /sec/?pt=36&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:51:43 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:51:43 localhost <= 192.168.12.20:80 HTTP 151
    18.01.2017 13:51:43 Address 36
    18.01.2017 13:51:43     run script: val=151 depo={ res: [ 158, 160, 148, 151 ] }
    18.01.2017 13:51:43  script return:{ val: 880, reqsek: 300 } depo={ res: [] }
    18.01.2017 13:51:43 Address 36\. Shift request interval: 300 sek.
    18.01.2017 13:51:43 MG2?36=880&
    18.01.2017 13:51:43 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:52:43 
    18.01.2017 13:52:43 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d
    18.01.2017 13:52:43 localhost <=>192.168.12.20:80 socket handle=57\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:52:43 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:52:43 localhost <= 192.168.12.20:80 HTTP 12.67
    18.01.2017 13:52:43 MG2?342=12.67&
    18.01.2017 13:52:43 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:52:45 
    18.01.2017 13:52:45 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1
    18.01.2017 13:52:45 localhost <=>192.168.12.20:80 socket handle=57\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1 HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:52:45 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:52:45 localhost <= 192.168.12.20:80 HTTP 26.05
    18.01.2017 13:52:45 MG2?341=26.05&
    18.01.2017 13:52:45 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:52:47 
    18.01.2017 13:52:47 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=31&cmd=list
    18.01.2017 13:52:47 localhost <=>192.168.12.20:80 socket handle=57\. Header: GET /sec/?pt=31&cmd=list HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:52:47 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:52:47 localhost <= 192.168.12.20:80 HTTP ff862a831501:23.75;ff6e2a831501:23.81;ff676b821503:23.37
    18.01.2017 13:52:47 MG2?31_ff862a831501=23.75&31_ff6e2a831501=23.81&31_ff676b821503=23.37&
    18.01.2017 13:52:47 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 13:52:49 
    18.01.2017 13:52:49 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get
    18.01.2017 13:52:49 localhost <=>192.168.12.20:80 socket handle=57\. Header: GET /sec/?pt=30&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 13:52:49 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 13:52:49 localhost <= 192.168.12.20:80 HTTP temp:25.10/hum:10.30
    18.01.2017 13:52:49 MG2?30_1=25.1&30_2=10.3&
    18.01.2017 13:52:49 localhost <=>192.168.12.20:80 socket closed
    
    

    Мое предположение: на запрос 18.01.2017 13:50:33 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get от контроллера просто нет ответа! Почему время по журналу 18.01.2017 13:51:30??? В устройстве время не ответа стоит 120 секунд - на что это влияет?

    При детальном анализе лога плагина нашел, что частенько "множественный" опрос канала (с помощью скрипта) прерывается следующим образом:

    1. В 18.01.2017 13:51:15 идет запрос по каналу 36 (localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get), начинает работать скрипт - проходит 4 измерения

    2. Однако после 4-го следуют запросы по расписанию на порты шины I2C и 31,30:

    18.01.2017 13:51:35 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d

    18.01.2017 13:51:37 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1

    18.01.2017 13:51:39 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=31&cmd=list

    18.01.2017 13:51:41 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get

    3. Только потом очередь доходит до 5-го запроса по 36-му каналу, на основании которого делается расчет среднего значения:

    18.01.2017 13:51:43 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get

    После этого идет в штатном порядке.

    Ладно, пусть данные по этому датчику формируются не за 25 секунд (5 измерений через 5 секунд), а за 28-40 секунд. Это не так плохо, однако отслеживая графики (выложу позже), я вижу проблемы по датчикам, в частности для СО2 (о котором веду речь) в 01:03, 05:36, 10:13, 14:51 (обратите внимание на промежутки времени между этими точками - 4:33, 4:37, 4:38) были нулевые показания! Не могу сейчас посмотреть логи из консоли что было в это время, однако проблема есть.

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

    UPD: разработчик MegaD просит привести пример HTTP пакета, который генерирует ваш плагин. Сам только вечером wireshark-ом могу глянуть.



  • @Alex_Jet:

    Лог журнала из веба не копируется! А из консоли где его можно посмотреть?

    Если речь о журнале, который доступен из основного интерфейса, запись ведется в ежедневные журналы. Папка /opt/intrahouse/base/journal/

    @Alex_Jet:

    Единственное - смущают периодические ошибки по всем датчикам.

    Мои догадки:

    1. На запрос 18.01.2017 13:50:33 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get от контроллера просто нет ответа! В устройстве время не ответа стоит 120 секунд - на что это влияет? Почему время по журналу 18.01.2017 13:51:30???

    Вы установили "Время ожидания данных до сигнализации об ошибке" по кнопке "Железо", и если данные с датчика не поступают в течение этого интервала, сервер устанавливает ошибку. Время считается с момента последнего поступления данных в ядро системы. Не в плагин!

    Посмотрите, видимо последний раз данные пришли в 18.01.2017 13:49:30 (-120 сек), а следующий раз - наверно позже.

    Аналогично для 36 канала - мы получаем значение только после нескольких измерений, а сервер то об этом не догадывается, он получит только конечный результат.

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

    Либо поставить время достаточно большое, чтобы учесть пропуск значений и обработку функцией до получения конечного значения.



  • @Alex_Jet:

    UPD: разработчик MegaD просит привести пример HTTP пакета, который генерирует ваш плагин. Сам только вечером wireshark-ом могу глянуть.

    HTTP через wiresark:

    Req: GET /sec/?cmd=all HTTP/1.1 Host: 192.168.0.14 Connection: close

    Resp: HTTP/1.0 200 OK Content-Type: text/html

    Больше там ничего нет, это все выводится в логе.

    Или нужен весь TCP?

    @Alex_Jet:

    В общем, веду все это я к тому, что придется скорее всего делать такой же опрос, как происходит в php. Последовательно и синхронно..

    Хорошо, не проблема, cделаем 🙂
    @Alex_Jet:

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

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



  • @intrapro:

    Если речь о журнале, который доступен из основного интерфейса, запись ведется в ежедневные журналы. Папка /opt/intrahouse/base/journal/

    ОК, посмотрю там.
    @intrapro:

    Либо поставить время достаточно большое, чтобы учесть пропуск значений и обработку функцией до получения конечного значения.

    Само собой значения везде "нужные". С самого начала опрос всех датчиков был через 60 секунд, а "Время ожидания данных до сигнализации об ошибке" установлено 120 секунд. Для датчика CO2, данные по которому формируются скриптом с периодом 300 секунд, "Время ожидания данных до сигнализации об ошибке" установлено 320 секунд.
    @intrapro:

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

    Вам как профессионалам виднее. Я самоучка необразованный :lol:



  • Контроллер снова повесился!!! :twisted: :twisted: :twisted: Uptime - ~19 часов. Интересна сама причина - от чего он вешается. Думаю, пока Андрей не установит у себя вашу систему, так ни к чему и не придем.



  • Хорошо, не будем упираться. Синхронно так синхронно.

    К концу недели сделаем.

    А лог был включен?

    У нас работает MegaD 328 уже много дней, без проблем. Правда там все только дискретное



  • @intrapro:

    А лог был включен?

    У нас работает MegaD 328 уже много дней, без проблем. Правда там все только дискретное

    Лог включен всегда, прикладываю его в последние минуты работы контроллера (сбой по журналу - в 18.01.2017 17:34:08).

    MegaD-328 у меня работает примерно 4-5 месяцев без каких-либо сбоев, но там правда - все аналоговое (у меня висит на ней 1 шт. СМК, 2 шт. DS18B20, 2 шт. DHT22, 2 шт. АЦП - один со скриптом). А вот MegaD-2561 начала сбоить с тех пор как подключил HTU21D! Но выяснить причину этого пока не удается.

    18.01.2017 17:26:05 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get
    18.01.2017 17:26:05 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=30&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:26:05 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:26:05 localhost <= 192.168.12.20:80 HTTP temp:26.50/hum:13.00
    18.01.2017 17:26:05 MG2?30_1=26.5&30_2=13&
    18.01.2017 17:26:05 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:27:07 
    18.01.2017 17:27:07 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d
    18.01.2017 17:27:07 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:27:07 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:27:07 localhost <= 192.168.12.20:80 HTTP 16.23
    18.01.2017 17:27:07 MG2?342=16.23&
    18.01.2017 17:27:07 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:27:09 
    18.01.2017 17:27:09 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1
    18.01.2017 17:27:09 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1 HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:27:09 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:27:09 localhost <= 192.168.12.20:80 HTTP 27.09
    18.01.2017 17:27:09 MG2?341=27.09&
    18.01.2017 17:27:09 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:27:11 
    18.01.2017 17:27:11 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=31&cmd=list
    18.01.2017 17:27:11 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=31&cmd=list HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:27:12 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:27:12 localhost <= 192.168.12.20:80 HTTP ff862a831501:25.87;ff6e2a831501:25.93;ff676b821503:25.56
    18.01.2017 17:27:12 MG2?31_ff862a831501=25.87&31_ff6e2a831501=25.93&31_ff676b821503=25.56&
    18.01.2017 17:27:12 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:27:13 
    18.01.2017 17:27:13 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get
    18.01.2017 17:27:13 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=30&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:27:14 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:27:14 localhost <= 192.168.12.20:80 HTTP temp:26.50/hum:13.00
    18.01.2017 17:27:14 MG2?30_1=26.5&30_2=13&
    18.01.2017 17:27:14 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:28:16 
    18.01.2017 17:28:16 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d
    18.01.2017 17:28:16 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:28:16 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:28:16 localhost <= 192.168.12.20:80 HTTP 16.20
    18.01.2017 17:28:16 MG2?342=16.2&
    18.01.2017 17:28:16 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:28:18 
    18.01.2017 17:28:18 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1
    18.01.2017 17:28:18 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1 HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:28:18 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:28:18 localhost <= 192.168.12.20:80 HTTP 27.09
    18.01.2017 17:28:18 MG2?341=27.09&
    18.01.2017 17:28:18 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:28:20 
    18.01.2017 17:28:20 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=31&cmd=list
    18.01.2017 17:28:20 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=31&cmd=list HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:28:20 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:28:20 localhost <= 192.168.12.20:80 HTTP ff862a831501:25.93;ff6e2a831501:25.93;ff676b821503:25.56
    18.01.2017 17:28:20 MG2?31_ff862a831501=25.93&31_ff6e2a831501=25.93&31_ff676b821503=25.56&
    18.01.2017 17:28:20 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:28:22 
    18.01.2017 17:28:22 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get
    18.01.2017 17:28:22 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=30&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:28:22 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:28:22 localhost <= 192.168.12.20:80 HTTP temp:27.10/hum:13.70
    18.01.2017 17:28:22 MG2?30_1=27.1&30_2=13.7&
    18.01.2017 17:28:22 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:29:04 
    18.01.2017 17:29:04 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get
    18.01.2017 17:29:04 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=36&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:29:04 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:29:04 localhost <= 192.168.12.20:80 HTTP 163
    18.01.2017 17:29:04 Address 36
    18.01.2017 17:29:04     run script: val=163 depo={ res: [] }
    18.01.2017 17:29:04  script return:{ reqsek: 5 } depo={ res: [ 163 ] }
    18.01.2017 17:29:04 Address 36\. Shift request interval: 5 sek.
    18.01.2017 17:29:04 MG2?
    18.01.2017 17:29:04 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:29:10 
    18.01.2017 17:29:10 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get
    18.01.2017 17:29:10 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=36&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:29:10 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:29:10 localhost <= 192.168.12.20:80 HTTP 172
    18.01.2017 17:29:10 Address 36
    18.01.2017 17:29:10     run script: val=172 depo={ res: [ 163 ] }
    18.01.2017 17:29:10  script return:{ reqsek: 5 } depo={ res: [ 163, 172 ] }
    18.01.2017 17:29:10 MG2?
    18.01.2017 17:29:10 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:29:16 
    18.01.2017 17:29:16 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get
    18.01.2017 17:29:16 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=36&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:29:16 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:29:16 localhost <= 192.168.12.20:80 HTTP 167
    18.01.2017 17:29:16 Address 36
    18.01.2017 17:29:16     run script: val=167 depo={ res: [ 163, 172 ] }
    18.01.2017 17:29:16  script return:{ reqsek: 5 } depo={ res: [ 163, 172, 167 ] }
    18.01.2017 17:29:16 MG2?
    18.01.2017 17:29:16 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:29:22 
    18.01.2017 17:29:22 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get
    18.01.2017 17:29:22 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=36&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:29:22 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:29:22 localhost <= 192.168.12.20:80 HTTP 159
    18.01.2017 17:29:22 Address 36
    18.01.2017 17:29:22     run script: val=159 depo={ res: [ 163, 172, 167 ] }
    18.01.2017 17:29:22  script return:{ reqsek: 5 } depo={ res: [ 163, 172, 167, 159 ] }
    18.01.2017 17:29:22 MG2?
    18.01.2017 17:29:22 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:29:24 
    18.01.2017 17:29:24 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d
    18.01.2017 17:29:24 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:29:24 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:29:24 localhost <= 192.168.12.20:80 HTTP 16.36
    18.01.2017 17:29:24 MG2?342=16.36&
    18.01.2017 17:29:24 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:29:26 
    18.01.2017 17:29:26 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1
    18.01.2017 17:29:26 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1 HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:29:26 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:29:26 localhost <= 192.168.12.20:80 HTTP 27.07
    18.01.2017 17:29:26 MG2?341=27.07&
    18.01.2017 17:29:26 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:29:28 
    18.01.2017 17:29:28 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=31&cmd=list
    18.01.2017 17:29:28 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=31&cmd=list HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:29:28 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:29:28 localhost <= 192.168.12.20:80 HTTP ff862a831501:25.93;ff6e2a831501:26.00;ff676b821503:25.62
    18.01.2017 17:29:28 MG2?31_ff862a831501=25.93&31_ff6e2a831501=26.00&31_ff676b821503=25.62&
    18.01.2017 17:29:28 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:29:30 
    18.01.2017 17:29:30 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get
    18.01.2017 17:29:30 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=30&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:29:30 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:29:30 localhost <= 192.168.12.20:80 HTTP temp:26.40/hum:13.10
    18.01.2017 17:29:30 MG2?30_1=26.4&30_2=13.1&
    18.01.2017 17:29:30 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:29:32 
    18.01.2017 17:29:32 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=36&cmd=get
    18.01.2017 17:29:32 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=36&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:29:33 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:29:33 localhost <= 192.168.12.20:80 HTTP 166
    18.01.2017 17:29:33 Address 36
    18.01.2017 17:29:33     run script: val=166 depo={ res: [ 163, 172, 167, 159 ] }
    18.01.2017 17:29:33  script return:{ val: 1000, reqsek: 300 } depo={ res: [] }
    18.01.2017 17:29:33 Address 36\. Shift request interval: 300 sek.
    18.01.2017 17:29:33 MG2?36=1000&
    18.01.2017 17:29:33 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:30:32 
    18.01.2017 17:30:32 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d
    18.01.2017 17:30:32 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:30:32 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:30:32 localhost <= 192.168.12.20:80 HTTP 15.83
    18.01.2017 17:30:32 MG2?342=15.83&
    18.01.2017 17:30:32 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:30:34 
    18.01.2017 17:30:34 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1
    18.01.2017 17:30:34 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1 HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:30:34 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:30:34 localhost <= 192.168.12.20:80 HTTP 27.07
    18.01.2017 17:30:34 MG2?341=27.07&
    18.01.2017 17:30:34 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:30:36 
    18.01.2017 17:30:36 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=31&cmd=list
    18.01.2017 17:30:36 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=31&cmd=list HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:30:36 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:30:36 localhost <= 192.168.12.20:80 HTTP ff862a831501:25.87;ff6e2a831501:25.87;ff676b821503:25.50
    18.01.2017 17:30:36 MG2?31_ff862a831501=25.87&31_ff6e2a831501=25.87&31_ff676b821503=25.50&
    18.01.2017 17:30:36 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:30:38 
    18.01.2017 17:30:38 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get
    18.01.2017 17:30:38 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=30&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:30:38 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:30:38 localhost <= 192.168.12.20:80 HTTP temp:26.50/hum:13.20
    18.01.2017 17:30:38 MG2?30_1=26.5&30_2=13.2&
    18.01.2017 17:30:38 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:31:40 
    18.01.2017 17:31:40 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d
    18.01.2017 17:31:40 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:31:40 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:31:40 localhost <= 192.168.12.20:80 HTTP 14.87
    18.01.2017 17:31:40 MG2?342=14.87&
    18.01.2017 17:31:40 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:31:42 
    18.01.2017 17:31:42 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1
    18.01.2017 17:31:42 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1 HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:31:42 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:31:42 localhost <= 192.168.12.20:80 HTTP 27.05
    18.01.2017 17:31:42 MG2?341=27.05&
    18.01.2017 17:31:42 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:31:43 localhost => 192.168.12.20:80 HTTP GET /sec/?cmd=22:0
    18.01.2017 17:31:44 
    18.01.2017 17:31:44 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=31&cmd=list
    18.01.2017 17:31:44 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=31&cmd=list HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:31:44 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:31:44 localhost <= 192.168.12.20:80 HTTP ff862a831501:25.75;ff6e2a831501:25.81;ff676b821503:25.43
    18.01.2017 17:31:44 MG2?31_ff862a831501=25.75&31_ff6e2a831501=25.81&31_ff676b821503=25.43&
    18.01.2017 17:31:44 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:31:46 
    18.01.2017 17:31:46 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get
    18.01.2017 17:31:46 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=30&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:31:46 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:31:46 localhost <= 192.168.12.20:80 HTTP temp:26.50/hum:11.90
    18.01.2017 17:31:46 MG2?30_1=26.5&30_2=11.9&
    18.01.2017 17:31:46 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:32:48 
    18.01.2017 17:32:48 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d
    18.01.2017 17:32:48 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:32:48 localhost <= 192.168.12.20:80 response: statusCode=200 contentType = text/html
    18.01.2017 17:32:48 localhost <= 192.168.12.20:80 HTTP 15.08
    18.01.2017 17:32:48 MG2?342=15.08&
    18.01.2017 17:32:48 localhost <=>192.168.12.20:80 socket closed
    18.01.2017 17:32:50 
    18.01.2017 17:32:50 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1
    18.01.2017 17:32:50 localhost <=>192.168.12.20:80 socket handle=67\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1 HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:32:52 
    18.01.2017 17:32:52 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=31&cmd=list
    18.01.2017 17:32:52 localhost <=>192.168.12.20:80 socket handle=68\. Header: GET /sec/?pt=31&cmd=list HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:32:54 
    18.01.2017 17:32:54 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=30&cmd=get
    18.01.2017 17:32:54 localhost <=>192.168.12.20:80 socket handle=69\. Header: GET /sec/?pt=30&cmd=get HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:33:56 
    18.01.2017 17:33:56 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d
    18.01.2017 17:33:56 localhost <=>192.168.12.20:80 socket handle=70\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:33:58 
    18.01.2017 17:33:58 localhost => 192.168.12.20:80 HTTP GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1
    18.01.2017 17:33:58 localhost <=>192.168.12.20:80 socket handle=71\. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1 HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:33:58 localhost <= 192.168.12.20:80 Error EHOSTUNREACH.  Stopped.
    18.01.2017 17:34:04 
    18.01.2017 17:34:04 MegaD plugin has started.
    18.01.2017 17:34:04 Listening localhost:8020
    18.01.2017 17:34:04 Address 36 (IA36). Loading script
    18.01.2017 17:34:04 Polling   192.168.12.20:80/sec/?cmd=all, interval 0 sek
    18.01.2017 17:34:04 Polling   192.168.12.20:80/sec/?pt=30&cmd=get, interval 61 sek
    18.01.2017 17:34:04 Polling   192.168.12.20:80/sec/?pt=36&cmd=get, interval 300 sek
    18.01.2017 17:34:04 Polling   192.168.12.20:80/sec/?pt=31&cmd=list, interval 63 sek
    18.01.2017 17:34:04 Polling   192.168.12.20:80/sec/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1, interval 65 sek
    18.01.2017 17:34:04 Polling   192.168.12.20:80/sec/?pt=34&scl=35&i2c_dev=htu21d, interval 67 sek
    18.01.2017 17:34:05 
    18.01.2017 17:34:05 localhost => 192.168.12.20:80 HTTP GET /sec/?cmd=all
    18.01.2017 17:34:05 localhost <=>192.168.12.20:80 socket handle=16\. Header: GET /sec/?cmd=all HTTP/1.1
    Host: 192.168.12.20
    Connection: close
    
    18.01.2017 17:34:07 localhost <= 192.168.12.20:80 Error EHOSTUNREACH.  Stopped.
    
    

    Проанализировал сам. В 18.01.2017 17:32:48 контроллер последний раз ответил на запрос влажности с датчика HTU21D (localhost <=>192.168.12.20:80 socket handle=67. Header: GET /sec/?pt=34&scl=35&i2c_dev=htu21d HTTP/1.1). Вечером посмотрю на чем контроллер завис в предыдущий раз.



  • @Alex_Jet:

    контроллер вешается только в том случае если с помощью intrahouse начинаю опрашивать HTU21D с помощью команды /%pwd%/?pt=34&scl=35&i2c_dev=htu21d&i2c_par=1. То есть как только ввожу в действие опрос этого датчика, то MegaD спустя 4-9 часов зависает. Замечено, что если опрашиваю сразу по обоим параметрам (температура и влажность), причем интервал опроса один и то же для обоих каналов - 60 секунд, то контроллер вешается быстрее - от 2 до 3-х часов.

    У разработчика MegaD моя конфигурация на php уже работает несколько суток без каких-либо сбоев (опрос датчиков каждые 8 секунд).

    В свете вашего предыдущего сообщения проанализировали последний лог. Видимо Вы правы, проблема в запросе HTU21D повторно с небольшим интервалом.

    На php без сбоев работает c интервалом 8 сек! А у нас получился интервал 2 сек при зависании.

    Только для отладки: сделайте периоды опроса для датчиков небольшие (5-10 сек), датчик с 5-кратным съемом значений можно совсем не мучить, т.к. времена сдвинутся. Но интервал опроса в плагине сделайте 8 сек (вместо 2). Тогда следующий запрос не будет послан ранее чем через 8 сек.

    Иначе непонятно, поможет ли переписывание плагина в синхронном стиле. Если контроллер не отвечает на запрос при синхронной работе в течение 2 сек - все равно надо что-то делать. Нужен тайминг - когда можно снова посылать запрос. Или прекращать работу.


Log in to reply