Страница 1 из 124

Простые устройства / Simple Devices

Добавлено: Вт янв 10, 2017 6:31 pm
sergejey
В альфа-ветке обновлений ядра добавился новым модуль: Простые устройства

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

Изображение

Пока поддерживаются такие типы устройств:
* Управляемое реле/Выключатель
* Диммер
* Датчик движения
* Кнопка
* Датчик температуры
* Датчик влажности

Для устройств автоматически создаются классы, свойства, методы, объекты (не надо заморачиваться вообще что это такое). Так же, через интерфейс работы с простыми устройствами можно их добавить в меню и на сцены. Кроме того, простые устройства и их функции появляются в интерфейсе программирования blockly и могут быть использованы в любых сценариях.
Ничего отдельно программировать не нужно, но при желании можно -- добавлять новые свойства классов, править код методов и т.п. При обновлении системы будет обновляться только базовая структура, базовый код и представление.

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

1. Через интерфейс пользователя. Аналог использования связанных объектов/свойств.

Возьмём к примеру как я это делал для модуля noolite. После добавления устройства в систему есть закладка Данные -- в этой закладке таблица данных, у каждой записи которой есть поля LINKED_OBJECT, LINKED_PROPERTY и LINKED_METHOD. В шаблон вывода данных на этой закладке (файл noodevices_edit_data.html) добавляем следующую конструкцию для каждой записи:

[#if SDEVICE_TYPE!=""#]
[#module name="devices" action="link" type="<#PROPERTIES.SDEVICE_TYPE#>" source_table="noocommands" source_table_id="<#PROPERTIES.ID#>" linked_object="<#PROPERTIES.LINKED_OBJECT#>"#]
[#else#]
&nbsp;
[#endif#]

внешне оно будет выглядеть вот так:
http://c2n.me/3G99vCK.png
или так, если устройство привязано:
http://c2n.me/3G99Ccb.png

значение SDEVICE_TYPE должно быть заполнено самим модулем, т.к. типы возможных простых устройств и типы данных не будут совпадать.
для заполнения SDEVICE_TYPE я добавил такой код в файл noodevices_edit.inc.php:
http://c2n.me/3G98eOX.png

т.е. в зависимости от того, какой тип данных я выставляю возможный тип простого устройства.
простые устройства могут быть следующих типов:
relay, dimmer, button, sensor_temp, sensor_humidity
если для данных нельзя подобрать устройство, то ставим SDEVICE_TYPE пустым, чтобы закрыть возможность привязки устройства к этим данным. если мы считаем, что пользователь сам сможет выбрать, какой тип устройства лучше всего подходит, то можем ставить любое значение, например any -- тогда окно привязки к устройству откроется, но тип устройства не будет выбран заранее

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

include_once(DIR_MODULES.'devices/devices.class.php');
$dev=new devices();

$device_type='relay'; // тип устройства (см выше допустимые типы)
$options=array(); // опции добавления

$options['TABLE']='noocommands'; // таблица, куда потом запишется LINKED_OBJECT и LINKED_PROPERTY
$options['TABLE_ID']=22; // ID записи в вышеназванной таблице (запись уже должна быть создана такая)
$options['LOCATION_ID']=1; // ID расположения (не обязательно)
$options['LINKED_OBJECT']='NooSwitch1'; // название связанного объекта, который создастся автоматически, если такого нет (не обязательно)
$options['TITLE']='MyDevice'; // название устройства (не обязательно)

$options['ADD_MENU']=1; // добавлять интерфейс работы с устройством в меню (не обязательно)
$options['ADD_SCENE']=1; // добавлять интерфейс работы с устройством на сцену (не обязательно)

$result=$dev->addDevice($device_type, $options); // добавляем устройство -- возвращает 1 в случае успешного добавления

вышеописаный код надо выполнять для каждого автоматически найденного устройства

Re: Простые устройства / Simple Devices

Добавлено: Вт янв 10, 2017 6:46 pm
Smolalex
Сергей спасибо большое за твое детище и дай Бог тебе здоровья и удачи во всем.

Re: Простые устройства / Simple Devices

Добавлено: Ср фев 01, 2017 2:52 pm
nick7zmail
Интересная штука...правда пока не совсем понял как применяется)))
Пример: датчик качества воздуха А1. Пользователь, к примеру добавил его к себе в модуль бродлинк....
Устройство передаёт 5 параметров (температуру, влажность, освещенность, уровень шума, и, собственно качество воздуха). Мне под него 5 простых девайсов создавать?)) Это странно...

И оно связывает с моим модулем linked_object и linked_property? Или а если мне не нужно связывать с модулем linked_object и linked_property (потому что мне не требуется отслеживать изменение этих свойств)...тоже связывает??

Re: Простые устройства / Simple Devices

Добавлено: Ср фев 01, 2017 5:53 pm
sergejey
nick7zmail писал(а):Интересная штука...правда пока не совсем понял как применяется)))
Пример: датчик качества воздуха А1. Пользователь, к примеру добавил его к себе в модуль бродлинк....
Устройство передаёт 5 параметров (температуру, влажность, освещенность, уровень шума, и, собственно качество воздуха). Мне под него 5 простых девайсов создавать?)) Это странно...
Комбинированные датчики не поддерживаются. Да, если собираются несколько параметров, то надо несколько простых устройств.
nick7zmail писал(а):И оно связывает с моим модулем linked_object и linked_property? Или а если мне не нужно связывать с модулем linked_object и linked_property (потому что мне не требуется отслеживать изменение этих свойств)...тоже связывает??
Если ваш модуль поддерживает создание простых устройств прямо из своего интерфейса, то да. Если в модуле интеграции такой нет, то можно вручную создавать простые устройство и уже затем в вашем модуле их привязывать как обычные объекты и свойства.

Re: Простые устройства / Simple Devices

Добавлено: Вс фев 05, 2017 8:41 am
kostya066
Создал устройство, датчик движения. В действиях прописал "say("Движение", 2);" Но при смене статуса, ничего не происходит. Что делать?

Re: Простые устройства / Simple Devices

Добавлено: Вс фев 05, 2017 1:08 pm
DimSun75
kostya066 писал(а):Создал устройство, датчик движения. В действиях прописал "say("Движение", 2);" Но при смене статуса, ничего не происходит. Что делать?
Все правильно. Если у других устройств нужно в свойство что-то писать, то тут нужно вызывать метод motionDetected. Я тоже долго не мог понять почему ничего не работает. Самый простой костыль, это добавить в метод statusUpdated класса SMotions что-то типа:

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



 if ($params['NEW_VALUE'] == '1'){
   $this -> callMethod('motionDetected');
}



Отправлено с моего SM-G850F через Tapatalk

Re: Простые устройства / Simple Devices

Добавлено: Чт фев 09, 2017 4:01 pm
kostya066
DimSun75 писал(а):
kostya066 писал(а):Создал устройство, датчик движения. В действиях прописал "say("Движение", 2);" Но при смене статуса, ничего не происходит. Что делать?
Все правильно. Если у других устройств нужно в свойство что-то писать, то тут нужно вызывать метод motionDetected. Я тоже долго не мог понять почему ничего не работает. Самый простой костыль, это добавить в метод statusUpdated класса SMotions что-то типа:

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



 if ($params['NEW_VALUE'] == '1'){
   $this -> callMethod('motionDetected');
}

 


Отправлено с моего SM-G850F через Tapatalk
Спасибо, как замудренно...

Re: Простые устройства / Simple Devices

Добавлено: Чт фев 09, 2017 4:11 pm
DimSun75
kostya066 писал(а): Спасибо, как замудренно...
Это все новое, поэтому пока так. А так мне идея определенно нравится.

Re: Простые устройства / Simple Devices

Добавлено: Чт фев 09, 2017 4:22 pm
Vit
Парни, с разделом "Простые устройства" все уже предусмотрено....там вообще код не нужен, Сергей все внутри системы прописал, дабы облегчить задачу простым пользователям......У вас просто видимо автоматически не прописался выполнение метода при смене статуса...

Re: Простые устройства / Simple Devices

Добавлено: Чт фев 09, 2017 5:02 pm
DimSun75
Vit писал(а):Парни, с разделом "Простые устройства" все уже предусмотрено....там вообще код не нужен, Сергей все внутри системы прописал, дабы облегчить задачу простым пользователям......У вас просто видимо автоматически не прописался выполнение метода при смене статуса...
Неа. Для датчика движения statusUpdate:

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

 $tm=time();
 $this->setProperty('updated', $tm);
 $this->setProperty('updatedText', date('H:i', $tm));

 $this->setProperty('alive', 1);

 $alive_timeout=2*24*60*60; // 2 days alive timeout

 $ot=$this->object_title;

 setTimeout($ot.'_alive_timer', 'setGlobal("'.$ot.'.alive", 0);', $alive_timeout);
а вот motionDetected:

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

 $this->setProperty('status', 1);

 $motion_timeout=20; // seconds timeout
 $ot=$this->object_title;
 setTimeout($ot.'_motion_timer', 'setGlobal("'.$ot.'.status", 0);', $motion_timeout);

 $this->callMethod('logicAction');

 $linked_room=$this->getProperty('linkedRoom');

 if (getGlobal('NobodyHomeMode.active')) {
  callMethod('NobodyHomeMode.deactivate');
 }
 ClearTimeOut("nobodyHome"); 
 SetTimeOut("nobodyHome","callMethod('NobodyHomeMode.activate');", 1*60*60);

 if ($linked_room) {
  callMethod($linked_room.'.onActivity', array('sensor'=>$ot));
 }
Видно, что для это типа предполагалось не связывать свойство status, а вызывать метод motionDetected. Это для большинства железа честно говоря неудобно.