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

Новые релизы, обновления и т.п.

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Вт янв 10, 2017 6:31 pm

В альфа-ветке обновлений ядра добавился новым модуль: Простые устройства

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

Изображение

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

Для устройств автоматически создаются классы, свойства, методы, объекты (не надо заморачиваться вообще что это такое). Так же, через интерфейс работы с простыми устройствами можно их добавить в меню и на сцены. Кроме того, простые устройства и их функции появляются в интерфейсе программирования 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 в случае успешного добавления

вышеописаный код надо выполнять для каждого автоматически найденного устройства
За это сообщение автора sergejey поблагодарили (всего 24):
Smolalex (Вт янв 10, 2017 6:44 pm) • Sayler (Вт янв 10, 2017 7:30 pm) • Victor_S (Вт янв 10, 2017 9:16 pm) • Ivan Akimov (Вт янв 10, 2017 11:49 pm) • tsember (Ср янв 11, 2017 2:40 am) • Ivan (Ср янв 11, 2017 9:35 am) • Alien (Пт янв 20, 2017 1:41 pm) • kas5858 (Пт янв 20, 2017 11:59 pm) • ErmolenkoM (Вт янв 24, 2017 7:38 am) • fynto (Пн янв 30, 2017 8:03 am) и ещё 14
Рейтинг: 27.91%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Smolalex
Сообщения: 110
Зарегистрирован: Вт апр 29, 2014 9:16 pm
Благодарил (а): 7 раз
Поблагодарили: 13 раз

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

Сообщение Smolalex » Вт янв 10, 2017 6:46 pm

Сергей спасибо большое за твое детище и дай Бог тебе здоровья и удачи во всем.
За это сообщение автора Smolalex поблагодарили (всего 4):
tsember (Ср янв 11, 2017 2:40 am) • Genplane (Пт фев 24, 2017 9:51 am) • Otto (Пт мар 24, 2017 3:21 pm) • Kotjul (Вт сен 19, 2017 11:35 pm)
Рейтинг: 4.65%
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Ср фев 01, 2017 2:52 pm

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

И оно связывает с моим модулем linked_object и linked_property? Или а если мне не нужно связывать с модулем linked_object и linked_property (потому что мне не требуется отслеживать изменение этих свойств)...тоже связывает??
За это сообщение автора nick7zmail поблагодарил:
SolarW (Чт фев 02, 2017 2:13 am)
Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Ср фев 01, 2017 5:53 pm

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

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
kostya066
Сообщения: 53
Зарегистрирован: Чт ноя 27, 2014 10:43 am
Благодарил (а): 7 раз
Поблагодарили: 13 раз

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

Сообщение kostya066 » Вс фев 05, 2017 8:41 am

Создал устройство, датчик движения. В действиях прописал "say("Движение", 2);" Но при смене статуса, ничего не происходит. Что делать?
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

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

Сообщение DimSun75 » Вс фев 05, 2017 1:08 pm

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

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



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



Отправлено с моего SM-G850F через Tapatalk
За это сообщение автора DimSun75 поблагодарили (всего 2):
kostya066 (Чт фев 09, 2017 4:01 pm) • Samir77 (Вс сен 30, 2018 9:06 pm)
Рейтинг: 2.33%
kostya066
Сообщения: 53
Зарегистрирован: Чт ноя 27, 2014 10:43 am
Благодарил (а): 7 раз
Поблагодарили: 13 раз

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

Сообщение kostya066 » Чт фев 09, 2017 4:01 pm

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

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



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

 


Отправлено с моего SM-G850F через Tapatalk
Спасибо, как замудренно...
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

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

Сообщение DimSun75 » Чт фев 09, 2017 4:11 pm

kostya066 писал(а): Спасибо, как замудренно...
Это все новое, поэтому пока так. А так мне идея определенно нравится.
Vit
Сообщения: 867
Зарегистрирован: Вт янв 17, 2012 12:31 pm
Благодарил (а): 121 раз
Поблагодарили: 78 раз

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

Сообщение Vit » Чт фев 09, 2017 4:22 pm

Парни, с разделом "Простые устройства" все уже предусмотрено....там вообще код не нужен, Сергей все внутри системы прописал, дабы облегчить задачу простым пользователям......У вас просто видимо автоматически не прописался выполнение метода при смене статуса...
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

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

Сообщение DimSun75 » Чт фев 09, 2017 5:02 pm

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. Это для большинства железа честно говоря неудобно.
Ответить