Страница 4 из 25
Re: mysensors
Добавлено: Вс ноя 16, 2014 5:50 pm
binladin
AlexeyKr писал(а):всё получилось. управление по mqtt работает без дополнительных скриптов и методов.
4. Выбираем объект, от которого приходит сообщение и его свойство. У меня например комнатный модуль Node2, температура.
Объект со свойствами и методами, я так понимаю, надо предварительно создать самому ?
AlexeyKr писал(а):всё работает, НО мы изменяем свойство объекта без контроля выполнения команды. При тестировании обнаружено, что при потере управляющего сообщения, в меню выключатель включен, а фактически источник света выключен. Также по неизвестной причине зависал скрипт mqtt_daemon.php и не реагировал на входящие сообщения.
Думаю требуется другой метод отправки сообщения на mqtt-шлюз, без изменения свойства объекта. А свойство объекта изменять по пришедшему от шлюза сообщению.
В голову пришёл костыль - по переключению реле, на сенсоре формировать и публиковать сообщение "status.changed" и контролировать его приход в МДМ.
Re: mysensors
Добавлено: Вс ноя 16, 2014 6:40 pm
binladin
AlexeyKr писал(а):
Аналогично для сообщения от источника света
6. Управление источником света можно производить изменением свойства объекта, при этом автоматически отправляется в связанный mqtt топик сообщение с новым значением свойства.
для этого для объекта можно создать элемент управления типа переключатель в меню управления
всё работает, НО мы изменяем свойство объекта без контроля выполнения команды. При тестировании обнаружено, что при потере управляющего сообщения, в меню выключатель включен, а фактически источник света выключен. Также по неизвестной причине зависал скрипт mqtt_daemon.php и не реагировал на входящие сообщения.
Думаю требуется другой метод отправки сообщения на mqtt-шлюз, без изменения свойства объекта. А свойство объекта изменять по пришедшему от шлюза сообщению.
Поразмышлял немного... Я не программер, но мне кажется, что исходя из объектно-ориентированной концепции платформы,
Свойства должны
ОТОБРАЖАТЬ характеристики
Объекта, а изменять свойства призваны
Методы. Другими словами об изменении Свойства должен сообщить сам Объект, после того как из МДМ мы применили к нему Метод.
Код: Выделить всё
while (Вася.послушность < 185) {
Вася.ЗапрещатьИгратьвWoT }
Serial.println ("Вася достаточно хороший мальчик");
Вася.ПредложитьПряникзаУроки;
if (Вася.ВыполнениеУроков == 1) {
Serial.println ("Вася умничка");
}
Т.е. вызов метода Вася.ПредложитьПряникзаУроки может повлечь увеличение послушности Васи, а может не повлечеть. Это зависит от "Васиной" прошивки, хотя код "Васиной мамы" на стороне МДМ, в упрощенном варианте, может не опрашивать Васю на предмет его послушности, а принять решение о Васином состоянии сам, но в этом случае есть риск нестыковки с действительным Васиным состоянием.
Re: mysensors
Добавлено: Вс ноя 16, 2014 8:20 pm
AlexeyKr
Объект со свойствами и методами, я так понимаю, надо предварительно создать самому ?
да, однозначно. Объекты в системе отображают структуру вашего умного дома.
Свойства должны ОТОБРАЖАТЬ характеристики Объекта, а изменять свойства призваны Методы.
Текущий механизм отправки mqtt запроса удобен с точки зрения настройки системы, но согласен, надо что-то придумать для достоверности отображения состояния системы.
Re: mysensors
Добавлено: Чт ноя 20, 2014 5:13 pm
Ivan
Результаты тестирования датчика окон/дверей.
Устройство:
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();
};
}
Re: mysensors
Добавлено: Чт ноя 20, 2014 5:20 pm
Ivan
Результат с датчиком подсчёта импульсов
По железу датчик не отличается от "окон/дверей" описанный выше.
Скеч можно попробовать стандартный "EnergyMeterPulseSensor".
Но возникает вопрос:
Когда инициализируется датчик он запрашивает у GateWay (брокер MajorDomo) предыдущие показания счётчика
Так вот MajorDomo не выдаёт предыдущие данные датчику. Мне кажется что проблема с реализацией протокола MQTT. Исследованные библиотеки поверхностно ничего не дало.
Кто сталкивался - помогите пожалуйста
Re: mysensors
Добавлено: Чт ноя 20, 2014 8:08 pm
binladin
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
Re: mysensors
Добавлено: Чт ноя 20, 2014 9:16 pm
Ivan
За пример возьмем EnergyMeterPulseSensor.ino
В настройках и в цикле запрашивается
Данные должен вернуть брокер MD. принимаются в incomingMessage
Так вот в логе mqtt MD виден запрос переменной. Но MD не возвращает результат. Хотя в таблице уже зарегистрировался этот объект с данными. Но в них почему то стоит 1.4.1 (Версия протокола).
В логе устройства также не видно что результат пришёл.
Если нужно могу выложит все логи (устройства, гейта, брокера)
Гейт - MQTT gateway is basically a Ethernet. Сетевуха ENC28J60
Re: mysensors
Добавлено: Чт ноя 20, 2014 10:13 pm
binladin
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 (как
здесь,
здесь или
здесь).
Ну или изменить подход к подсчету импульсов на ноде и их отправке, взяв другой пример счетчика импульсов, например
Сбор показаний электро-счётчика (для механических счётчиков).
Re: mysensors
Добавлено: Чт ноя 20, 2014 10:51 pm
Ivan
Спасибо за исчерпываюший ответ.
Хочется использовать именно mysensors
Придется помогать Сергею. Писать самому
Re: mysensors
Добавлено: Пт ноя 21, 2014 12:57 am
AlexeyKr
Ivan, у вас mqtt gate собран по схеме mySemsors? Скетч без изменений? Просто у меня был собран ethernet gate на enc28j60 и pro-mini с библиотекой ethercard, и я редактировал назначение пинов под свою схему. В итоге гейт работает, но включается крайне нестабильно. То есть после заливки стартует и работает, но если отключить serial кабель и выключить-включить питание - может повиснуть. Питание проверял, конденсаторы навешивал, ставил в скетче задержки на инициализацию сети - ничего не помогло. Причем ethernet-gate с библиотекой ethercard на этом железе стартует и работает без проблем. У вас mqtt gate включается нормально? таких проблем нет?