mysensors

binladin
Сообщения: 143
Зарегистрирован: Чт фев 06, 2014 9:32 pm
Благодарил (а): 0
Поблагодарили: 5 раз

Re: mysensors

Сообщение binladin » Вс ноя 16, 2014 5:50 pm

AlexeyKr писал(а):всё получилось. управление по mqtt работает без дополнительных скриптов и методов.

4. Выбираем объект, от которого приходит сообщение и его свойство. У меня например комнатный модуль Node2, температура.
Объект со свойствами и методами, я так понимаю, надо предварительно создать самому ?
AlexeyKr писал(а):всё работает, НО мы изменяем свойство объекта без контроля выполнения команды. При тестировании обнаружено, что при потере управляющего сообщения, в меню выключатель включен, а фактически источник света выключен. Также по неизвестной причине зависал скрипт mqtt_daemon.php и не реагировал на входящие сообщения.
Думаю требуется другой метод отправки сообщения на mqtt-шлюз, без изменения свойства объекта. А свойство объекта изменять по пришедшему от шлюза сообщению.
В голову пришёл костыль - по переключению реле, на сенсоре формировать и публиковать сообщение "status.changed" и контролировать его приход в МДМ.
binladin
Сообщения: 143
Зарегистрирован: Чт фев 06, 2014 9:32 pm
Благодарил (а): 0
Поблагодарили: 5 раз

Re: mysensors

Сообщение binladin » Вс ноя 16, 2014 6:40 pm

AlexeyKr писал(а): Аналогично для сообщения от источника света

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

всё работает, НО мы изменяем свойство объекта без контроля выполнения команды. При тестировании обнаружено, что при потере управляющего сообщения, в меню выключатель включен, а фактически источник света выключен. Также по неизвестной причине зависал скрипт mqtt_daemon.php и не реагировал на входящие сообщения.
Думаю требуется другой метод отправки сообщения на mqtt-шлюз, без изменения свойства объекта. А свойство объекта изменять по пришедшему от шлюза сообщению.
Поразмышлял немного... Я не программер, но мне кажется, что исходя из объектно-ориентированной концепции платформы, Свойства должны ОТОБРАЖАТЬ характеристики Объекта, а изменять свойства призваны Методы. Другими словами об изменении Свойства должен сообщить сам Объект, после того как из МДМ мы применили к нему Метод.

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

while (Вася.послушность < 185) { 
 Вася.ЗапрещатьИгратьвWoT }

Serial.println ("Вася достаточно хороший мальчик");

Вася.ПредложитьПряникзаУроки;
if (Вася.ВыполнениеУроков == 1) {
Serial.println ("Вася умничка");
}
 
Т.е. вызов метода Вася.ПредложитьПряникзаУроки может повлечь увеличение послушности Васи, а может не повлечеть. Это зависит от "Васиной" прошивки, хотя код "Васиной мамы" на стороне МДМ, в упрощенном варианте, может не опрашивать Васю на предмет его послушности, а принять решение о Васином состоянии сам, но в этом случае есть риск нестыковки с действительным Васиным состоянием.
AlexeyKr
Сообщения: 28
Зарегистрирован: Сб мар 30, 2013 7:34 am
Благодарил (а): 3 раза
Поблагодарили: 4 раза

Re: mysensors

Сообщение AlexeyKr » Вс ноя 16, 2014 8:20 pm

Объект со свойствами и методами, я так понимаю, надо предварительно создать самому ?
да, однозначно. Объекты в системе отображают структуру вашего умного дома.
Свойства должны ОТОБРАЖАТЬ характеристики Объекта, а изменять свойства призваны Методы.
Текущий механизм отправки mqtt запроса удобен с точки зрения настройки системы, но согласен, надо что-то придумать для достоверности отображения состояния системы.
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: mysensors

Сообщение Ivan » Чт ноя 20, 2014 5:13 pm

Результаты тестирования датчика окон/дверей.

Устройство:
ProMini = 116р
RF24 = 40р
2 AAA = ?

Датчики:
Геркон - на открытие.
Датчик вибрации - для сигнализации при разбитии окна.
Виртуальный датчик температуры - по косвенному напряжению Ардуина
Виртуальный датчик уровня на батареи - по косвенному напряжению Ардуина

Используется механизм сна с прерываниями по датчикам и таймаутом (5мин) для отправки уровня батареек и температуры

Потребление во сне (с доробаткой ProMini):
при разомкнутом контакте 0.015 мА
при замкнутом 0.125 мА

То есть по расчётам должно хватит на 2 года (Саморазряд батареи)

Хочу засунуть это все в белую коробочку = 78 рублей. За одно в получу зарядник.

Но чтобы это всё влезло поставлю меньше аккумуляторы LR123A

Скеч доработанный BinarySwitchSleepSensor
СпойлерПоказать

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

// Interrupt driven binary switch example with dual interrupts
// Author: Patrick 'Anticimex' Fallberg
// Connect one button or door/window reed switch between 
// digitial I/O pin 3 (BUTTON_PIN below) and GND and the other
// one in similar fashion on digital I/O pin 2.
// This example is designed to fit Arduino Nano/Pro Mini

#include <MySensor.h>
#include <SPI.h>

#define SKETCH_NAME "Binary Sensor"
#define SKETCH_MAJOR_VER "1"
#define SKETCH_MINOR_VER "0"

#define PRIMARY_CHILD_ID 3
#define SECONDARY_CHILD_ID 4
#define CHILD_ID_DEV 254

unsigned long SEND_FREQUENCY = 300000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway. 

#define PRIMARY_BUTTON_PIN 2   // Arduino Digital I/O pin for button/reed switch
#define SECONDARY_BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch

#if (PRIMARY_BUTTON_PIN < 2 || PRIMARY_BUTTON_PIN > 3)
#error PRIMARY_BUTTON_PIN must be either 2 or 3 for interrupts to work
#endif
#if (SECONDARY_BUTTON_PIN < 2 || SECONDARY_BUTTON_PIN > 3)
#error SECONDARY_BUTTON_PIN must be either 2 or 3 for interrupts to work
#endif
#if (PRIMARY_BUTTON_PIN == SECONDARY_BUTTON_PIN)
#error PRIMARY_BUTTON_PIN and BUTTON_PIN2 cannot be the same
#endif
#if (PRIMARY_CHILD_ID == SECONDARY_CHILD_ID)
#error PRIMARY_CHILD_ID and SECONDARY_CHILD_ID cannot be the same
#endif
 
MySensor sensor_node;

double oldTemp = 0;
float oldBatteryV = 0;

// Change to V_LIGHT if you use S_LIGHT in presentation below
MyMessage msg(PRIMARY_CHILD_ID, V_TRIPPED);
MyMessage msg2(SECONDARY_CHILD_ID, V_TRIPPED);

MyMessage TempMsg(CHILD_ID_DEV, V_TEMP);
MyMessage BattMsg(CHILD_ID_DEV, V_VOLTAGE);

long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}

double GetTemp(void)
{
  unsigned int wADC;
  double t;

  // The internal temperature has to be used
  // with the internal reference of 1.1V.
  // Channel 8 can not be selected with
  // the analogRead function yet.

  // Set the internal reference and mux.
  ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
  ADCSRA |= _BV(ADEN);  // enable the ADC

  delay(20);            // wait for voltages to become stable.

  ADCSRA |= _BV(ADSC);  // Start the ADC

  // Detect end-of-conversion
  while (bit_is_set(ADCSRA,ADSC));

  // Reading register "ADCW" takes care of how to read ADCL and ADCH.
  wADC = ADCW;

  // The offset of 324.31 could be wrong. It is just an indication.
  t = (wADC - 324.31 ) / 1.22;

  // The returned temperature is in degrees Celcius.
  return (t);
} 

void SendDevInfo()
{
  //========= Temperature =============
  double fTemp = GetTemp();
  
  if (oldTemp != fTemp){
    Serial.print("Temp:");
    Serial.println(fTemp);
  
    sensor_node.send(TempMsg.set(fTemp, 2));
      
    oldTemp = fTemp;
  }

  //========= Battery =============  
  float batteryV  = readVcc() * 0.001;

  if (oldBatteryV != batteryV){
    Serial.print("BatV:");
    Serial.println(batteryV);
  
    sensor_node.send(BattMsg.set(batteryV, 2));
    oldBatteryV = batteryV;
  }
}

void setup()  
{  
  sensor_node.begin();

  // Setup the buttons
  pinMode(PRIMARY_BUTTON_PIN, INPUT);
  pinMode(SECONDARY_BUTTON_PIN, INPUT);

  // Activate internal pull-ups
  digitalWrite(PRIMARY_BUTTON_PIN, HIGH);
  digitalWrite(SECONDARY_BUTTON_PIN, HIGH);
  
  // Send the sketch version information to the gateway and Controller
  sensor_node.sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER"."SKETCH_MINOR_VER);

  // Register binary input sensor to sensor_node (they will be created as child devices)
  // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage. 
  // If S_LIGHT is used, remember to update variable type you send in. See "msg" above.
  sensor_node.present(PRIMARY_CHILD_ID, S_DOOR);  
  sensor_node.present(SECONDARY_CHILD_ID, S_DOOR); 
}

// Loop will iterate on changes on the BUTTON_PINs
void loop() 
{
  uint8_t value;
  static uint8_t sentValue=2;
  static uint8_t sentValue2=2;
  
  // Short delay to allow buttons to properly settle
  sensor_node.sleep(5);
  
  value = digitalRead(PRIMARY_BUTTON_PIN);
  
  if (value != sentValue) {
     // Value has changed from last transmission, send the updated value
     sensor_node.send(msg.set(value==HIGH ? 1 : 0));
     sentValue = value;
  }

  value = digitalRead(SECONDARY_BUTTON_PIN);
  
  if (value != sentValue2) {
     // Value has changed from last transmission, send the updated value
     sensor_node.send(msg2.set(value==HIGH ? 1 : 0));
     sentValue2 = value;
  }

  // Sleep until something happens with the sensor
  if ( sensor_node.sleep(PRIMARY_BUTTON_PIN-2, CHANGE, SECONDARY_BUTTON_PIN-2, CHANGE, SEND_FREQUENCY) == -1){
    // Device Info
    SendDevInfo();
  };

} 
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: mysensors

Сообщение Ivan » Чт ноя 20, 2014 5:20 pm

Результат с датчиком подсчёта импульсов

По железу датчик не отличается от "окон/дверей" описанный выше.

Скеч можно попробовать стандартный "EnergyMeterPulseSensor".

Но возникает вопрос:
Когда инициализируется датчик он запрашивает у GateWay (брокер MajorDomo) предыдущие показания счётчика

Так вот MajorDomo не выдаёт предыдущие данные датчику. Мне кажется что проблема с реализацией протокола MQTT. Исследованные библиотеки поверхностно ничего не дало.

Кто сталкивался - помогите пожалуйста
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
binladin
Сообщения: 143
Зарегистрирован: Чт фев 06, 2014 9:32 pm
Благодарил (а): 0
Поблагодарили: 5 раз

Re: mysensors

Сообщение binladin » Чт ноя 20, 2014 8:08 pm

Ivan писал(а): Когда инициализируется датчик он запрашивает у GateWay (брокер MajorDomo) предыдущие показания счётчика

Так вот MajorDomo не выдаёт предыдущие данные датчику. Мне кажется что проблема с реализацией протокола MQTT. Исследованные библиотеки поверхностно ничего не дало.
Несколько наводящих вопросов:
1. Про "запрашивает предыдущие показания счётчика", Вы имеете следующий кусок ?

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

// Fetch last known pulse count value from gw
  gw.request(CHILD_ID, V_VAR1);
2. Поясните вот это - " GateWay (брокер MajorDomo)". Что есть "брокер МДМ" ? Речь о MQTT-шлюзе mysensors или что тогда является у вас шлюзом ?
3. Вот это читали ? Energy Meter Pulse Sensor - "lost parent / find parent" and VAR1
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: mysensors

Сообщение Ivan » Чт ноя 20, 2014 9:16 pm

За пример возьмем EnergyMeterPulseSensor.ino

В настройках и в цикле запрашивается

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

  gw.request(CHILD_ID, V_VAR1); 
Данные должен вернуть брокер MD. принимаются в incomingMessage

Так вот в логе mqtt MD виден запрос переменной. Но MD не возвращает результат. Хотя в таблице уже зарегистрировался этот объект с данными. Но в них почему то стоит 1.4.1 (Версия протокола).

В логе устройства также не видно что результат пришёл.

Если нужно могу выложит все логи (устройства, гейта, брокера)

Гейт - MQTT gateway is basically a Ethernet. Сетевуха ENC28J60
За это сообщение автора Ivan поблагодарил:
ABola (Вт янв 19, 2016 4:51 pm)
Рейтинг: 1.16%
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
binladin
Сообщения: 143
Зарегистрирован: Чт фев 06, 2014 9:32 pm
Благодарил (а): 0
Поблагодарили: 5 раз

Re: mysensors

Сообщение binladin » Чт ноя 20, 2014 10:13 pm

Ivan писал(а): Данные должен вернуть брокер MD. принимаются в incomingMessage
Вы немного заблуждаетесь, в MD встроен не брокер, а всего лишь клиент. Роль брокера выполняет скетч на вашем MQTT-шлюзе. Настоятельно рекомендую вышеуказанную ссылку на форум mysensors (тамошний топикстартер проблему решил, пусть и не очень изящно).
Описание проблемы:
@hek The MAIN problem is that the sensor node (9) is not receiving VAR1 so it never actually starts transmitting any watt and kwh.

I use Domoticz as a controller, though controller may not be the right word since it is only one-way communication for storing sensor data via a Python script that I cobbled together to take MQTT readings and transmit them to Domoticz JSON.

I got the impression that VAR1 etc are stored in the gateway only. If not then I clearly have a very obvious problem.

Any ideas on how to code this to communicate with the MQTT gateway via code? I already tried to publish "MyMQTT/9/1/V_VAR1" with a payload to the MQTT Gateway but that didn't seem to work.
Ответ:
Nothing gets stored in the gateway except routing information. The controller (or in your case python script) must answer the REQ command with a SET command containing the payload the node is interested in.
А ответ такой - "На шлюзе ничего не хранится, за исключением информации по маршрутизации. Ответ должен давать контроллер получив команду REQ и выдав на неё команду SET с содержимым интересующим ноду".

Контроллер в нашем случае, это МДМ и соответственно нода ждёт его ответа. Вопрос как его организовать: отснифить этот запрос и сваять какой нибудь метод на событие с его поступлением или просить Сергея всё бросить и внести в библиотеку phpMQTT функции Request/Response (как здесь, здесь или здесь).

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

Re: mysensors

Сообщение Ivan » Чт ноя 20, 2014 10:51 pm

Спасибо за исчерпываюший ответ.
Хочется использовать именно mysensors
Придется помогать Сергею. Писать самому
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
AlexeyKr
Сообщения: 28
Зарегистрирован: Сб мар 30, 2013 7:34 am
Благодарил (а): 3 раза
Поблагодарили: 4 раза

Re: mysensors

Сообщение AlexeyKr » Пт ноя 21, 2014 12:57 am

Ivan, у вас mqtt gate собран по схеме mySemsors? Скетч без изменений? Просто у меня был собран ethernet gate на enc28j60 и pro-mini с библиотекой ethercard, и я редактировал назначение пинов под свою схему. В итоге гейт работает, но включается крайне нестабильно. То есть после заливки стартует и работает, но если отключить serial кабель и выключить-включить питание - может повиснуть. Питание проверял, конденсаторы навешивал, ставил в скетче задержки на инициализацию сети - ничего не помогло. Причем ethernet-gate с библиотекой ethercard на этом железе стартует и работает без проблем. У вас mqtt gate включается нормально? таких проблем нет?
Ответить