[Модуль] MySensors (mysensor)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

werwolfx
Сообщения: 2
Зарегистрирован: Вт ноя 17, 2015 8:07 am
Благодарил (а): 0
Поблагодарили: 0

Re: Модуль MySensor

Сообщение werwolfx » Ср дек 30, 2015 8:46 am

Объект один, в поиске тоже один.
Доп. инфо: использую wifigeteway по tcp соединяется, но на сервере вижу ошибки чтения сокета в строке 72 файла phpMSTcp.php
PHP Warning: socket_read(): unable to read from socket[4]:interrupted system call in /var/www/modules/mysensor/phpMSTcp.php on line 72
Это все на Linux Ubuntu Wily
в serial вот такая строка формируется гейтом

serial(PSTR("%d;%d;%d;%d;%d;%s\n"),message.sender, message.sensor, mGetCommand(message), mGetAck(message), message.type, message.getString(convBuf));
Вложения
Снимок.png
Снимок.png (23.95 КБ) 12793 просмотра
NightRider
Сообщения: 70
Зарегистрирован: Пт авг 21, 2015 2:27 pm
Благодарил (а): 8 раз
Поблагодарили: 4 раза

Re: Модуль MySensor

Сообщение NightRider » Пн янв 04, 2016 2:50 am

AirKing писал(а):Подтверждаю работает, НО.
У меня Малинка и на ней данный модуль жрет 70-85 % CPU.
Соответственно все тормозит. как только его останавливаю все начинает летать.

Что он такой жадный до процессора?
Появилась у меня новая игрушка - raspberry 2. Естественно появилось желание перенести на нее MD и подключить напрямую NRF24. Собственно подключил и обнаружил проблему как у AirKing - загрузка одного ядра на 100%.

1. Начал разбираться, и выяснился первый момент. Если остановить скрипт модуля MySensor - все 100% будет занимать PiGatewaySerial. Из зарубежных форумов стало ясно, это "фича" данной библиотеки. Но как только к данному виртуальному порту кто-либо подключился - загрузка сразу падает практически до нуля. Соответственно это перестает быть проблемой :) окей, едем дальше.
2. Выходит скрипт подключается к ttyMySensorsGateway, а ядро все-равно загружено, причем теперь php (это видно из top). Немного проанализировав исходники модуля, выяснил такую особенность: в очередном витке цикла в файле phpMSCom.php после считывания данных командой

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

$c = fread($this->Serial->_dHandle, 1); 
анализируются принятые данные и если пусто

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

if ($c == "") continue; 
- считывание повторяется. Все бы хорошо (реакция на полученные данные моментальна), но именно это приводит к полной загрузке ядра. Предлагаю немного изменить логику: как только мы ничего не получили, т.е. буфер порта пуст, не ожидать данные пол секунды, а "отпустить" виток цикла "наружу". Там происходит проверка очереди на отправку и отправка если необходимо. Скорректировав строчку на

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

if ($c == "") return ""; 
получаем загрузку уже порядка 60% ядра.
3. После предыдущего изменения получается что увеличилось число итераций основного цикла (раньше он выполнялся приблизительно раз в пол секунды), а теперь сотни раз в секунду. В основном цикле у нас запросы к базе данных, такое количество обращений ну оочень не хорошо. И на мой взгляд избыточно. Самый простой способ снизить число циклов в секунду - вставить

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

usleep(50000); 
(например), где-нибудь в основном цикле модуля. Еще можно засекать время и вызывать чтение или запись в порт также через определенные промежутки времени.

В итоге у меня приблизительно 20 раз в секунду происходит проверка на необходимость отправки сообщений и просмотр на предмет принятых новых. При этом загрузка ядра данным циклом снижается до считанных процентов.
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Модуль MySensor

Сообщение Ivan » Пн янв 04, 2016 10:19 am

Спасибо за подробный отчет. Добавлю в ближайшее время.

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

Ps. Я нашел как проверить мертвый tcp. В следующей версии зависания данных при мертвом tcp будет максимум 10 сек
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
NightRider
Сообщения: 70
Зарегистрирован: Пт авг 21, 2015 2:27 pm
Благодарил (а): 8 раз
Поблагодарили: 4 раза

Re: Модуль MySensor

Сообщение NightRider » Пн янв 04, 2016 4:41 pm

Что за тайм-аут на чтение? Где он устанавливается?
Anton_kulibin
Сообщения: 354
Зарегистрирован: Вт окт 09, 2012 8:05 am
Откуда: Луза Кировская обл. Россия
Благодарил (а): 20 раз
Поблагодарили: 35 раз

Re: Модуль MySensor

Сообщение Anton_kulibin » Пн янв 04, 2016 7:56 pm

Ivan, не выявили причину проблемы взаимодействия вебсокетами и mysensor? В принципе и без вебсокетов не плохо, но хотелось бы все включить))
Linux версия. Ubuntu Server 16.04+2xArduinoMega+Eth_GW_Mysensors_10node+WeatherStation+Xiaomi
CONNECT
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Модуль MySensor

Сообщение Ivan » Вт янв 05, 2016 9:59 pm

Проблема была не моя. А вебсокетов. Они тормозили обработку на 2 сек и более. Через 5 дней доходило до 45 секунд.

Насчёт тайм аута. из-за того что работа идёт в 1 соединение отправка/получение. То получается следующий алгоритм
1. Если есть ли данные на отправку. Отправляем
2. Читаем канал (тайм аут). Если нет переходим на 1
3. Обрабатываем переходим на 1
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Stunt
Сообщения: 39
Зарегистрирован: Вс мар 16, 2014 8:17 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

Re: Модуль MySensor

Сообщение Stunt » Вс янв 10, 2016 5:55 am

Доброго времени суток.
Бьюсь который день (точнее ночь!)...
Загрузил с http://www.mysensors.org/build/ethernet_gateway
скетч и прошил его в ардуино UNO - не "взлетело"! =(
код скетчаПоказать

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

/**
 * The MySensors Arduino library handles the wireless radio link and protocol
 * between your home built sensors/actuators and HA controller of choice.
 * The sensors forms a self healing radio network with optional repeaters. Each
 * repeater and gateway builds a routing tables in EEPROM which keeps track of the
 * network topology allowing messages to be routed to nodes.
 *
 * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
 * Copyright (C) 2013-2015 Sensnology AB
 * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
 *
 * Documentation: http://www.mysensors.org
 * Support Forum: http://forum.mysensors.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 *******************************
 *
 * REVISION HISTORY
 * Version 1.0 - Henrik EKblad
 * Contribution by a-lurker and Anticimex, 
 * Contribution by Norbert Truchsess <norbert.truchsess@t-online.de>
 *
 * 
 * DESCRIPTION
 * The EthernetGateway sends data received from sensors to the ethernet link. 
 * The gateway also accepts input on ethernet interface, which is then sent out to the radio network.
 *
 * The GW code is designed for Arduino 328p / 16MHz.  ATmega168 does not have enough memory to run this program.
 * 
 *
 * COMPILING WIZNET (W5100) ETHERNET MODULE
 * > Edit MyConfig.h in (libraries\MySensors\) to enable softspi (remove // before "#define SOFTSPI").
 *
 * COMPILING ENC28J60 ETHERNET MODULE
 * > Use Arduino IDE 1.5.7 (or later) 
 * > Disable DEBUG in Sensor.h before compiling this sketch. Othervise the sketch will probably not fit in program space when downloading. 
 * > Remove Ethernet.h include below and include UIPEthernet.h 
 * > Remove DigitalIO include 
 * Note that I had to disable UDP and DHCP support in uipethernet-conf.h to reduce space. (which means you have to choose a static IP for that module)
 *
 * VERA CONFIGURATION:
 * Enter "ip-number:port" in the ip-field of the Arduino GW device. This will temporarily override any serial configuration for the Vera plugin. 
 * E.g. If you want to use the defualt values in this sketch enter: 192.168.178.66:5003
 *
 * LED purposes:
 * - To use the feature, uncomment WITH_LEDS_BLINKING in MyConfig.h
 * - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved
 * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
 * - ERR (red) - fast blink on error during transmission error or recieve crc error  
 * 
 * See http://www.mysensors.org/build/ethernet_gateway for wiring instructions.
 *
 */
#define NO_PORTB_PINCHANGES 

#include <DigitalIO.h>     // This include can be removed when using UIPEthernet module  
#include <SPI.h>  

#include <MySigningNone.h>
#include <MyTransportRFM69.h>
#include <MyTransportNRF24.h>
#include <MyHwATMega328.h>
#include <MySigningAtsha204Soft.h>
#include <MySigningAtsha204.h>

#include <MyParserSerial.h>  
#include <MySensor.h>  
#include <stdarg.h>
#include <PinChangeInt.h>
#include "GatewayUtil.h"


// Use this if you have attached a Ethernet ENC28J60 shields  
// #include <UIPEthernet.h>  

// Use this for WizNET W5100 module and Arduino Ethernet Shield 
#include <Ethernet.h>   


#define INCLUSION_MODE_TIME 1 // Number of minutes inclusion mode is enabled
#define INCLUSION_MODE_PIN  3 // Digital pin used for inclusion mode button

#define RADIO_CE_PIN        5  // radio chip enable
#define RADIO_SPI_SS_PIN    6  // radio SPI serial select

#define RADIO_ERROR_LED_PIN 7  // Error led pin
#define RADIO_RX_LED_PIN    8  // Receive led pin
#define RADIO_TX_LED_PIN    9  // the PCB, on board LED


// NRFRF24L01 radio driver (set low transmit power by default) 
MyTransportNRF24 transport(RADIO_CE_PIN, RADIO_SPI_SS_PIN, RF24_PA_LEVEL_GW);  
//MyTransportRFM69 transport;

// Message signing driver (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h)
//MySigningNone signer;
//MySigningAtsha204Soft signer;
//MySigningAtsha204 signer;

// Hardware profile 
MyHwATMega328 hw;

// Construct MySensors library (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h)
// To use LEDs blinking, uncomment WITH_LEDS_BLINKING in MyConfig.h
#ifdef WITH_LEDS_BLINKING
MySensor gw(transport, hw /*, signer*/, RADIO_RX_LED_PIN, RADIO_TX_LED_PIN, RADIO_ERROR_LED_PIN);
#else
MySensor gw(transport, hw /*, signer*/);
#endif


#define IP_PORT 5003        // The port you want to open 
IPAddress myIp (192, 168, 2, 150);  // Configure your static ip-address here    COMPILE ERROR HERE? Use Arduino IDE 1.5.7 or later!

// The MAC address can be anything you want but should be unique on your network.
// Newer boards have a MAC address printed on the underside of the PCB, which you can (optionally) use.
// Note that most of the Ardunio examples use  "DEAD BEEF FEED" for the MAC address.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  // DEAD BEEF FEED

// a R/W server on the port
EthernetServer server = EthernetServer(IP_PORT);
// handle to open connection
EthernetClient client = EthernetClient();

char inputString[MAX_RECEIVE_LENGTH] = "";    // A string to hold incoming commands from serial/ethernet interface
int inputPos = 0;
bool sentReady = false;

void output(const char *fmt, ... ) {
   va_list args;
   va_start (args, fmt );
   vsnprintf_P(serialBuffer, MAX_SEND_LENGTH, fmt, args);
   va_end (args);
   Serial.print(serialBuffer);
   server.write(serialBuffer);
}

void setup()  
{ 
  Ethernet.begin(mac, myIp);

  setupGateway(INCLUSION_MODE_PIN, INCLUSION_MODE_TIME, output);

  // Add interrupt for inclusion button to pin
  PCintPort::attachInterrupt(pinInclusion, startInclusionInterrupt, RISING);

  // give the Ethernet interface a second to initialize
  delay(1000);

  // Initialize gateway at maximum PA level, channel 70 and callback for write operations 
  gw.begin(incomingMessage, 0, true, 0);

  
  // start listening for clients
  server.begin();

}


void loop() {
  gw.process();  
  
  checkButtonTriggeredInclusion();
  checkInclusionFinished();
  
  // if an incoming client connects, there will be
  // bytes available to read via the client object
  EthernetClient newclient = server.available();
  // if a new client connects make sure to dispose any previous existing sockets
  if (newclient) {
      if (client != newclient) {
       client.stop();
       client = newclient;
       output(PSTR("0;0;%d;0;%d;Gateway startup complete.\n"),  C_INTERNAL, I_GATEWAY_READY);
     }
   }
            
   if (client) {
     if (!client.connected()) {
       client.stop();
     } else if (client.available()) { 
       // read the bytes incoming from the client
       char inChar = client.read();
       if (inputPos<MAX_RECEIVE_LENGTH-1) { 
         // if newline then command is complete
         if (inChar == '\n') {  
           //Serial.println("Finished");
            // a command was issued by the client
            // we will now try to send it to the actuator
            inputString[inputPos] = 0;
      
            // echo the string to the serial port
            //Serial.print(inputString);
      
            parseAndSend(gw, inputString);
      
            // clear the string:
            inputPos = 0;
         } else {  
           // add it to the inputString:
           inputString[inputPos] = inChar;
           inputPos++;
         }
      } else {
         // Incoming message too long. Throw away 
         inputPos = 0;
      }
    }
  }
}
Библиотеки все свежие, SoftSPI - раскоментировал ( шилд W5100).
Порт и IP-адрес правильные, и МЖД и гейт в одной подсети.
Настройки MySensors в МЖД сделал....
screen1.jpg
screen1.jpg (32.76 КБ) 12657 просмотров
ТИШИНА! =(
В МЖД ничего не появляется, как и не настраивал ничего.
В АрдуиноIDE (SerialMonitor) - тишина.
Платы - Ардуино УНО (обе), на одной гейт, на второй кнопка - http://www.mysensors.org/build/binary.
Транссиверы рабочие, проверял тестовыми скетчами.
Подключение проверял десятки раз...
В Debmess - 00:42:11 running cycle_mysensor.php
Попробовал прошить скетч гейта в Mega2560 - тоже тишина...
Куда копать, направьте пожалуйста?
P.S. При нажатии в интерфейсе МЖД на кнопку "Добавить запись" выпадает - ошибка 500...
devoff
Сообщения: 181
Зарегистрирован: Пт апр 04, 2014 10:17 pm
Благодарил (а): 37 раз
Поблагодарили: 54 раза

Re: Модуль MySensor

Сообщение devoff » Вс янв 10, 2016 4:53 pm

Stunt - попробуйте прошить serial gateway и добейтесь работы в мониторе, после этого уже подключайте к МЖД.
скетч и прошил его в ардуино UNO - не "взлетело"! =(
что за ошибка при прошивке ? и если не заработало, то нужно сначала с этим разобраться же.
Stunt
Сообщения: 39
Зарегистрирован: Вс мар 16, 2014 8:17 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

Re: Модуль MySensor

Сообщение Stunt » Вс янв 10, 2016 8:09 pm

Ошибок не выдает, не при компиляции не при прошивке.
Окно Ардуино IDEПоказать
Новый.jpg
Новый.jpg (168.89 КБ) 12596 просмотров
В сериал мониторе тоже не понятно -
Serial monitorПоказать
Новый1.jpg
Новый1.jpg (19.2 КБ) 12596 просмотров
Anton_kulibin
Сообщения: 354
Зарегистрирован: Вт окт 09, 2012 8:05 am
Откуда: Луза Кировская обл. Россия
Благодарил (а): 20 раз
Поблагодарили: 35 раз

Re: Модуль MySensor

Сообщение Anton_kulibin » Пн янв 11, 2016 9:37 am

Stunt даже без подключения к МДМ Гейт в порт пишет инфу, например если не подключен радио, или еще какие проблемы, если он стартанул, тоже напишет, скорость порта выберите другую вроде 115200.
Если все гуд, пишите настройки в модуле MySensors в МДМ, перезапускаете главный цикл. Смотрите в папку debmes, если появился log_cycle_mysensors.php (может немного по другому называться, точно не скажу мдм нет под рукой), смотрите лог, если нет, значит что-то в настройках.
Linux версия. Ubuntu Server 16.04+2xArduinoMega+Eth_GW_Mysensors_10node+WeatherStation+Xiaomi
CONNECT
Ответить