Main

<<< Scripts

Security system and the response to the motion in the house

Modules Used: Objects, Scripts, Events, Scheduled Jobs

The following scenario describes the use of motion sensors to run different scenarios of "smart home". In this case, it is assumed that you are connected safety controller, but these principles can be applied to other systems, the control of movement.

What we get in the end:

  • System response to detected motion
  • System response to morning awakening (the first move in the morning)
  • System response to the lack of movement in the house for some time (in this case 2 hours)

This scenario is not as simple to implement, but very useful, as provides many ways to modify, as well as detail reveals some of the principles of programming.

Suppose that we have a network of motion sensors, located in the home and at operation of any of the sensors provided triggering events in the system. When programming a security controller I made ​​a call of this type:

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

(Homenetserver this server address, which, of course, to be replaced with your own)

This request means that the event is called statusChanged sensorMovement1 object with parameter status = 1. Ie each time the sensor is triggered, the server receives such a request, and it should handle it correctly.

To do this, do the following things:

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 и задать следующие данные для объекта:

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

MajorDomo

Project

Partners

edit SideBar

 

Blix theme adapted by David Gilbert, powered by PmWiki