Main

<<< Сценарии

Система безопасности и реакции на движение в доме

Используемые модули: Objects, Scripts, Events, Scheduled Jobs

Ниже описан сценарий использования датчиков движения для запуска различных сценариев "умного дома". В данном случае, предполагается наличие подключенного контроллера безопасности, однако приведённый принцип может применяться и для других систем контроля движения.

Что мы получим в итоге:

  • Реакцию системы на обнаруженное движение
  • Реакцию системы на утреннее пробуждение (первое движение в утреннее время)
  • Реакцию системы на отсутствие движения в доме в течении некоторого времени (в нашем случае 2 часа)

Данный сценарий не так прост в реализации, но весьма полезен, т.к. даёт множество путей модификации, а так же детально раскрывает некоторые принципы программирования системы.

Предположим, что у нас есть сеть датчиков движения, расположенных в доме и при срабатывании любого из датчиков, обеспечивается срабатывание события в системе. При программировании своего контроллера безопасности я сделал вызов такого типа:

http://homeserver/objects/?object=sensorMovement1&op=m&m=statusChanged&status=1

(homenetserver это адрес сервера, который, конечно же, должен быть заменён на ваш собственный)

Это запрос значит, что вызывается событие statusChanged объекта sensorMovement1 с параметром status=1. Т.е. каждый раз при срабатывании датчика, сервер будет получать такой запрос и он должен его корректно обработать.

Для этого нужно сделать следующие вещи:

1. Зайдём в панель управления MajorDoMo в модуль Классы объектов, там добавим новый класс keySensors

Этот класс может быть использован позже и для других датчиков (чуть позже здесь будут ссылки на другие сценарии).

2. После создания класса, перейдём в раздел Properties и создадим следующие свойства класса:

  • status -- текущий статус сенсора
  • statusText -- текстовое значение статуса сенсора
  • updatedTimestamp. -- время последнего изменения статуса сенсора

В будущем нам пригодятся эти свойства, т.к. они общие для большинства датчиков, не зависимо от их природы.

В итоге закладка Properties будет выглядеть так:

3. Перейдём в закладку Methods/Events и создадим метод statusChanged со следующим кодом:

$this->setProperty('status',$params['status']); // установка свойство статуса, передаваемого в параметре status
$this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса

Думаю, что суть метода очевидна из комментариев выше.

На данный момент мы имеем описание класса сенсоров, но не имеем ни одного объекта этого класса.

3. Создаём новый класс объектов под названием inhouseMovementSensors, причём при создании выбираем родительским классом созданный ранее класс keySensors. Окно создание должно выглядеть вот так:

После создания, новый класс inhouseMovementSensors унаследует свойства и методы "родительского" класса. Возможно, это сложнова-то для людей, не связанных с программированием, но на самом деле тут ничего сложного. Считайте, что выше мы создали описание для всех типов датчиков, а сейчас уточнили что есть ещё под-тип "домашние датчики движения", которые всё равно обладают свойствами всех датчиков, но имеют свои особенности, о которых ниже.

4. Перейдём в закладку Methods/Events нашего нового класса и создадим такой же метод statusChanged -- он перекроет метод "родительского" класса.

5. Прежде, чем задавать код этого нового метода, сделаем некоторые приготовления.

Перейдём в раздел Скрипты и создадим скрипт nobodyHome -- он будет выполняться, когда система посчитает, что никого нет дома (каким образом это будет "считаться", будет описано ниже).

В моём случае этот скрипт имел следующий код:

say("По-моему никого нет дома...");
setGlobal('somebodyHome',0); // ставим глобальный флаг на то что никого нет дома
setGlobal('somebodyHomeText','Никого нет дома');
if (timeBetween('00:00', '7:00')) {
 say("Хотя скорее всего все спят :) Ночь ведь!");
}

Тоже самое на скриншоте:

Глобальный флаг мне может пригодится в других скриптах, а остальное это просто информирование, которое может быть заменено на полезные команды.

Так же я создал ещё один скрипт под названием morningGreeting следующего содержания:

say("Доброе утро!");

Чем его дополнить так же зависит только от вашей фантазии.

6. Вернёмся к методу statusChanged для класса inhouseMovementSensors, созданного в пункте 4.

Зададим ему следующий код:

$this->setProperty('status',$params['status']); // выставляем статус сенсора
$this->setProperty('updatedTimestamp',time()); // выставляем время срабатывания сенсора

if ($params['status']) { // если статус = 1
 setGlobal('somebodyHome',1); // ставим глобальный флаг на то что кто-то дома
 setGlobal('somebodyHomeText','Дома кто-то есть'); // так же ставим свойства глобальной переменной для текстового статуса
 ClearTimeOut("nobodyHome"); // очищаем таймер события "никого нет дома"
 SetTimeOut("nobodyHome","runScript('nobodyHome');", 1*60*60); // назначаем новый таймер. срабатывает через час после последнего срабатывания датчика.
 $last_register=registeredEventTime('inhouseMovement'); // проверяем когда в последний раз срабатывало событие "движение внутри дома"
 if (!$last_register || ((time()-$last_register)>2*60*60)) { // срабатывало более 2х часов назад (либо никогда не срабатывало ранее)
  say("Ну наконец-то кто-то появился дома!");
  if (timeBetween('06:00', '12:00')) { // движение замечено утром
   runScript('morningGreeting'); // запускаем скрипт "доброе утро"
  }
 }
 registerEvent('inhouseMovement',$this->name,7); // регистрируем событие "движение внутри дома"
}

Код выше, достаточно подробно прокомментирован, чтобы понять что он делает. В коде используется несколько общих функций системы, включающих:

  • Установку глобальных переменны (setGlobal)
  • Работа с таймером (ClearTimeOut, SetTimeOut)
  • Работа с событиями (registeredEventTime, registerEvent)
  • Проверку текущего времени (timeBetween)
  • Вызов заданного скрипта (runScript)

Подробнее об этих функциях можно прочитать на отдельной странице

7. Теперь у нас есть модель реагирование на движения, но чтобы оно заработало нам надо добавить объект, который будет обладать свойствами описанных классов. Добавим один объект, но прелесть классов как раз в том, что они дают гибкость и может быть добавлено любое количество объектов с различными именами, обладающими свойствами класса.

Напомню, что инициируемый "железом" вызов выглядит так:

http://homeserver/objects/?object=sensorMovement1&op=m&m=statusChanged&status=1

Т.е., в нашем случае надо создать объект с именем sensorMovement. Для создания достаточно зайти в закладку Objects класса inhouseMovementSensors и задать следующие данные для объекта:

Собственно всё. Мы получили то, что хотели. В дальнейшем можем добавлять новые датчики движения с другими именами, модифицировать скрипты и подстаивать систему под свои нужды.

 
 

Обсуждение

 

Vip: Организовал датчик на основе камеры и WebCam XP. Вот только не понятно что за глобальные переменные такие и где они объявлены: setGlobal('somebodyHome',1); // ставим глобальный флаг на то что кто-то дома setGlobal('somebodyHomeText','Дома кто-то есть'); // так же ставим свойства глобальной переменной для текстового статуса Например: getGlobal('ThisComputer.weatherFull'); получает значение свойства weatherFull объекта ThisComputer, наследника класса Computer. А переменная 'somebodyHome' в setGlobal('somebodyHome',1) к какому объекту относится?

sergejey: Организовал датчик на основе камеры и WebCam XP. Вот только не понятно что за глобальные переменные такие и где они объявлены: setGlobal('somebodyHome',1); // ставим глобальный флаг на то что кто-то дома setGlobal('somebodyHomeText','Дома кто-то есть'); // так же ставим свойства глобальной переменной для текстового статуса Например: getGlobal('ThisComputer.weatherFull'); получает значение свойства weatherFull объекта ThisComputer, наследника класса Computer. А переменная 'somebodyHome' в setGlobal('somebodyHome',1) к какому объекту относится? Глобальные переменные это свойства объектов. Всегда. Если не прописан объект, то это ThisComputer. Соответственно setGlobal('somebodyHome',1) аналогично setGlobal('ThisComputer.somebodyHome',1) Свойства можно прописывать заранее в классах объектов, а можно и не прописывать, тогда они будут создаваться автоматически в объекте при первой установке значения.

Vip: Спасибо за разъяснения. Теперь всё стало ясно.

senovr: у меня есть z-wave датчик движения, как его интегрировать в этот скрипт? в окне z-wave y меня следующее: Название: (*) Местоположение: basic; sensor binary; battery operated; ... Basic: Level: 0 Battery level, %: 100 Свойства: Название Значение Связанный объект.Свойство Basic . Level 0 . Battery 100 .

Ivan: Насчёт Z-Wave устройств. Иногда приходится в настройках интерфейса указывать точную модель устройства. После этого в MD всё отображается нормально

Ivan: Пробовал в свою сеть 1-Wire включить ключь с датчиком движения и пришёл к разочерованию. Всё время вылетает мастер. постоянные проблемы по питанию итд. Вспомнил что на сайте Сергей описывал контролер безопастности с беспроводными датчиками и контролем через Ардуину. Но увы ссылки уже побились. Попробовал посмотреть в сторону китайских GSM сигналок - но там тоже затык. к НИМ НЕЛЬЗЯ ПРИКРУТИТЬ АРДУИНУ с контролем конкретного датчика. Вопрос к форумчанам: Посоветуйте что-то подобное. Хотелось бы готовое решение что-то типа этого^ http://www.ebay.com/itm/Wireless-Wired- ... 2c7eb2103f Но с возможностью считывать датчики и прикрутить к МажорДому

sergejey: Пробовал в свою сеть 1-Wire включить ключь с датчиком движения и пришёл к разочерованию. Всё время вылетает мастер. постоянные проблемы по питанию итд. Вспомнил что на сайте Сергей описывал контролер безопастности с беспроводными датчиками и контролем через Ардуину. Но увы ссылки уже побились. Попробовал посмотреть в сторону китайских GSM сигналок - но там тоже затык. к НИМ НЕЛЬЗЯ ПРИКРУТИТЬ АРДУИНУ с контролем конкретного датчика. Вопрос к форумчанам: Посоветуйте что-то подобное. Хотелось бы готовое решение что-то типа этого^ http://www.ebay.com/itm/Wireless-Wired- ... 2c7eb2103f Но с возможностью считывать датчики и прикрутить к МажорДому Можно использовать те же беспроводные датчики движения, что используются в указанной выше сигнализации и им подобным (на 433Mhz) и перехватывать сигналы от них с помощью Arduino, RF-ресивера на той же частоте и библиотеки RC Switch. Каждый датчик при срабатывании запускает в эфир пакет со своим идентификатором, их можно перехватывать и отправлять событие в MajorDoMo. У меня сейчас два таких датчика обкатываются с устроенным подобным образом приёмником -- вроде ничего.

Ivan: С частотой понятно. 433 Иногда спрашивают чипсет Можно конкретную ссылку на модуль и датчики Ещё уточните время реакции. Получится ли включать свет?

sergejey: С частотой понятно. 433 Иногда спрашивают чипсет Можно конкретную ссылку на модуль и датчики Ещё уточните время реакции. Получится ли включать свет? Датчик http://www.dx.com/ru/p/hw-01a-wireless- ... 2dDwyg7hy8 Приёмник http://www.dx.com/ru/p/diy-433mhz-wirel ... 2dD4Cg7hy8 + Arduino, подключенный к системе либо с Ethernet-шилдом событие о движении в систему попадает мгновенно, дальше зависит уже от исполнительных модулей. у меня некоторые сценарии предполагают включение света в нескольких комнатах, при первом обнаружении движения -- задержка в пару секунд, но думаю это как раз из-за некоторой тормознутости процедуры включения света через утилиту ноолайт.

PAV: А подскажите, у кого стоит такой приемник 433, как он работает??? Далеко берет? Я тут пытался отсканировать код (rcswitch) - ничего, впритык к приемнику - о, пошел. Но на расстоянии метра и более уже все. При этом передатчик этой же серии все стены бьет в квартире и отлично работает.

sergejey: А подскажите, у кого стоит такой приемник 433, как он работает??? Далеко берет? Я тут пытался отсканировать код (rcswitch) - ничего, впритык к приемнику - о, пошел. Но на расстоянии метра и более уже все. При этом передатчик этой же серии все стены бьет в квартире и отлично работает. Относительно далеко. Только антенну надо ставить (17см). Ну и эти приёмники чувствительны к питанию -- у меня при 9В питании он работает гораздо лучше, чем при 5В.

Ivan: У меня работает. 15 метров в прямой видимости. 6 через стены

vit34: Здравствуйте, Планирую установить беспроводную сигнализацию http://falconeye.su/Products/332/80/FE-NEXT/ Ее датчики работают на частоте 433МГц Датчики движения,температуры и влажности от Noolite 433,92 МГц Будет ли приведенный RF-ресивер перехватывать сигналы от этих всех датчиков? Какое кол-во датчиков может одновременно слушать?

sergejey: Здравствуйте, Планирую установить беспроводную сигнализацию http://falconeye.su/Products/332/80/FE-NEXT/ Ее датчики работают на частоте 433МГц Датчики движения,температуры и влажности от Noolite 433,92 МГц Будет ли приведенный RF-ресивер перехватывать сигналы от этих всех датчиков? Какое кол-во датчиков может одновременно слушать? Нет, не будет. Протокол передачи датчиков ноолайт отличается и их сигнал не будет восприниматься приёмниками других производителей.

sega6549: Всем привет, тема конечно уже старая но я думаю актуальная, подскажите а метод на основе камеры и пинка сотового телефона может вообще иметь право на жизнь, то есть когда телефон в локальной сети то дом снят с охраны, если не в локальной сети то на охране, как в моем видео https://www.youtube.com/watch?v=W4xWrKdu7aw, интересует именно вопросы безопасности и практичности, что можно изменить и на столько ли это надежно?

lanket: Всем привет, тема конечно уже старая но я думаю актуальная, подскажите а метод на основе камеры и пинка сотового телефона может вообще иметь право на жизнь, то есть когда телефон в локальной сети то дом снят с охраны, если не в локальной сети то на охране, как в моем видео https://www.youtube.com/watch?v=W4xWrKdu7aw, интересует именно вопросы безопасности и практичности, что можно изменить и на столько ли это надежно? Села батарейка у телефона. Не прошол пинг. Сработала и заорала сигнализация. Отправлено с моего HM NOTE 1LTEW через Tapatalk

NiKiToS: Обсуждение страницы Система безопасности на базе контроллера сигнализации Сергей. все это уже в прошлом, появился модуль простые устройства и наверно стоит выложить подробное описание "Система безопасности на базе контроллера сигнализации" через простые устройства, тут описано довольно конкретно, но хотелось бы увидеть такое же подключение через простые устройства с такими же возможностями.

[ Обсудить на форуме ]

 

MajorDomo

Информация

Проекты

Партнёры

edit SideBar

 
 
 

 

Blix theme adapted by David Gilbert, powered by PmWiki