Нет протечкам! Подключим ДАТЧИК ПРОТЕЧКИ и шаровый кран с электроприводом
Защитой от протечек лучше всего озаботиться еще на этапе прокладки коммуникаций в части электропроводки и труб системы водоснабжения. Если проложены необходимые провода, то предотвратить появление «незапланированной Венеции» в своем жилище с помощью Меги проще простого. Подключим для этого датчик протечки и шаровый кран с электроприводом.
Можно взять заводской датчик протечки. А можно дать волю «очумелым ручкам» и «наколхозить» что-то самостоятельно. Вот, например, мой импровизированный «датчик протечки», сделанный из пары свитых между собой медных проводов. С одной стороны этого кольца с помощью наждака с проводов удалена изоляция.
Вода электропроводна и вход Меги замыкается, если подключенные к нему 2 жилы провода, противоположные концы которых погружены в воду и расположены на расстоянии ближе примерно 5 сантиметров друг от друга. Правда, знатоки говорят, что поскольку во входах Меги «гуляет» пусть и небольшое, но все же напряжение, то такие контакты при повышенной влажности неизбежно будут окисляться. Может быть так и есть, сам «в боевых условиях» не проверял. Однако для теста я возьму свою «самоделку», хотя располагаю заводским датчиком протечки. Так веселее, да и подавать питание на датчик не потребуется.
Подключение «датчика» в моем случае элементарное: 2 жилы провода - во вход P3 исполнительного модуля MegaD-7I7O-R. Режим работы порта установим «
P&R». В общем это ничем не будет отличаться от подключения геркона. Для эстетики и удобства подключения воспользуемся наружной интернет-розеткой, смонтированной на стене. От розетки до места расположения датчика дотянемся «хвостом» UTP нужной длины.
Интернет-розетка и «датчик протечки» на фото никуда не подключены, и лишь иллюстрируют «направление мысли» по возможному варианту монтажа «на конечном участке траектории».
Для подключения крана воспользуемся двумя выходами исполнительного модуля MegaD-7I7O-R. В моем шаровом кране с электроприводом три провода:
- открытие (красный);
- закрытие (зеленый);
- общий (черный).
К одному (обязательно перекидному) реле подключим провода, отвечающие за направление вращения крана. Пусть это будет порт P9. С соседнего выхода (P8) будем подавать постоянное напряжение 12В на порт P9 (с помощью перемычки). Общий провод подключается к земле на блоке питания. Замеры с использованием секундомера показали, что открытие/закрытие крана происходит за 16 секунд.
А теперь определимся с логикой работы и «набросаем» интерфейс в Мажордомо.
Работать, по моим представлениям, все это должно так.
1. При срабатывании датчика Мега дает команду на закрытие крана. Причем даже в ситуации, когда сервер недоступен. Поэтому в поле «Act» порта P3 запишем действие по умолчанию:
8:1;p180;8:0
С порта P8 через перемычку будет подаваться напряжение на порт P9 в течение 18 секунд. Передержка в 2 секунды нужна, чтобы кран гарантированно завершил закрытие и не представляет опасности для моего двигателя ввиду наличия в его конструкции концевых выключателей.
В интерфейсе Мажордомо (в меню и на сцене) должна появиться информация о протечке.
2. Мы должны иметь возможность открывать и закрывать кран из интерфейса.
3. Чтобы кран исправно сработал в аварийной ситуации, знающие люди рекомендуют с целью профилактики время от времени открывать и закрывать его, чтобы он не закис от длительного бездействия. Пусть это происходит раз в неделю.
Попробуем воплотить все это в интерфейсе.
1. Для шарового крана создадим виртуальный объект, например, в классе «Relays». Пусть он называется «BallValve1». У созданного объекта уже будет свойство «status», а также методы «turnOn» и «turnOff». Запишем в методы код PHP
В «
turnOn»
Код: Выделить всё
//Сначала переключим реле, отвечающее за направление вращения крана
file_get_contents("http://192.168.0.14/sec/?cmd=9:1");
//Сделаем паузу 0,1 сек., давая возможность реле переключиться (с учетом сетевого трафика)
usleep(100000);
//А теперь подадим напряжение. Таким образом, искрить будет только в одном реле, а не в двух
file_get_contents("http://192.168.0.14/sec/?cmd=8:1");
//Напряжение подается на время открытия + 2 сек. для гарантированного закрытия
//Устанавливаем состояние крана 3 (открывается)
sg('BallValve1.status',3);
//Устанавливаем состояние крана 1 (открыт) через 18 сек.
setTimeOut('myTimer_BallValve1','sg("BallValve1.status",1);',18);
sleep(18);
file_get_contents("http://192.168.0.14/sec/?cmd=8:0");
file_get_contents("http://192.168.0.14/sec/?cmd=9:0");
В «
turnOff»
Код: Выделить всё
file_get_contents("http://192.168.0.14/sec/?cmd=9:0");
usleep(100000);
file_get_contents("http://192.168.0.14/sec/?cmd=8:1");
//Устанавливаем состояние крана 2 (закрывается)
sg('BallValve1.status',2);
//Устанавливаем состояние крана 0 (закрыт) через 18 сек.
setTimeOut('myTimer_BallValve1','sg("BallValve1.status",0);',18);
sleep(18);
file_get_contents("http://192.168.0.14/sec/?cmd=8:0");
Для датчика протечки создадим виртуальный объект. Сделаем это в классе «keySensors» и назовем его, к примеру, «LeakSensor1». У него уже будет свойство «status» и метод «statusChanged». В метод «
statusChanged» запишем
Код: Выделить всё
if ( $_GET['m'] == "2" ) {
return"";
} else {
$state =file_get_contents("http://192.168.0.14/sec/?pt=3&cmd=get");
$state = substr($state,0,2);
if ($state == "ON") {
cm('BallValve1.turnOff');
say('В тронном зале произошла протечка. Водоснабжение перекрыто.',5);
}
}
Поскольку у нас установлен режим работы порта «
P&R», для «отфильтровывания» повторного запуска скрипта (с параметром m=2) необходимо, чтобы модуль умел этот параметр «отлавливать». С этой целью следует провести «модернизацию» модуля Мажордомо «MegaD» (добавить строчку $params['m']=$m; в файл megad.class.php) и перезагрузить Мажордомо. Подробнее о том, как это сделать, написано в заметке про геркон (в конце поста после подзаголовка «ДОПОЛНЕНИЕ/УТОЧНЕНИЕ»
http://ab-log.ru/forum/viewtopic.php?f= ... 309#p28309).
В модуле MegaD на вкладке «Данные» в настройках порта P3 выставим связанный объект «LeakSensor1», связанное свойство «status» и метод «statusChanged». Уже после этого при срабатывании датчика Объект.Свойство «LeakSensor1.status» будет меняться с «0» на «1» и обратно. Еще я всегда ставлю галку в поле «Skip default action», поскольку считаю, что «сервер всему голова».
При протечке на сцене должна появляться информация об этом. Пусть появляется соответствующая анимированная картинка, найденная в Интернете и помещенная в какую-нибудь папку Мажордомо. Я расположил картинку по пути \cms\scenes\styles\images\.
Реализуем задуманное с помощью HTML-блока. Наш элемент на сцене должен иметь как минимум одно состояние (добавляется через поле «State Название»). Назвать состояние можно как угодно, лишь бы оно было. В поле «Код» поместим следующую html-разметку
Код: Выделить всё
<div style='display:%LeakSensor1.status|"none;block"%'><img src="\cms\scenes\styles\images\water_leakage.gif" height="32"><font size="3" color=red>Протечка</font></div>
Структура того, что содержится внутри <div…</div> была позаимствована из примера, который кто-то приводил на форуме. Это я о пользе чтения форумов.
2. Помимо автоматического закрытия в случае протечки, мы должны иметь возможность произвольно открывать и закрывать кран из интерфейса. Можно, конечно, привязать кран к стандартному выключателю и не заморачиваться. Но хотелось бы чего-нибудь поинтереснее.
Те, кто дружит с html/css/ajax/svg/javascript и пр. могут «навоять» себе любую красоту. Мы же «академиев не заканчивали» и попробуем обойтись «малыми архитектурными формами». Хочется иметь активный элемент в меню и на сцене, при нажатии на который происходило бы открытие или закрытие крана, а сам этот элемент видоизменялся бы в зависимости от актуального состояния крана. Еще не хотелось бы, находясь под душем, остаться без воды, когда чьи-то шаловливые ручки случайно эту кнопку заденут. Значит, нам потребуется запрос подтверждения действия. Таким образом, у нас получается 6 возможных состояний кнопки.
0 – кран закрыт;
1 – кран открыт;
2 – кран закрывается;
3 – кран открывается;
4 – подтверждение команды на закрытие крана;
5 – подтверждение команды на открытие крана.
Подберем в Интернете соответствующие иконки и поместим их в какую-нибудь папку Мажордомо (например, сюда \cms\scenes\styles\images\).
???(не нашел открывающегося/закрывающегося вентиля)
Вращающийся вентиль найти не удалось. Но не беда. Спасение утопающих – дело рук самих утопающих! Сделаем gif-анимацию самостоятельно. Берем картинку со статичным вентилем.
Делаем копию этой картинки в нескольких экземплярах, поворачивая изображение каждого следующего экземпляра на небольшой угол, по сравнению с предыдущим. И воспользуемся первым попавшимся бесплатным ресурсом для изготовления gif-анимации
https://ru.toolson.net/GifAnimation
Рекомендуемый разработчиком размер иконок для Мажордомо = 32х32 пикселя. Для «изготовления» вентиля, вращающегося в другом направлении нужно просто выложить подготовленные картинки на приведенный интернет-сервис в обратном порядке.
В итоге получим нужные нам анимированные картинки.
Выложу архив с использованными иконками.
Теперь у объекта крана «BallValve1» создадим новый метод, в котором будет определяться поведение нашего элемента. В Мажордомо новые методы можно добавлять только к классу (а не к конкретному объекту внутри класса). Назовем метод, например, «
confirmation». Запишем в метод объекта «BallValve1» (а не класса) код
Код: Выделить всё
clearTimeOut('myTimer_BallValve1');
if (gg('BallValve1.status') == "1") {
//Устанавливаем состояние крана 4 (подтверждение закрытия)
sg('BallValve1.status',4);
//Устанавливаем состояние крана 1 (открыт)
setTimeOut('myTimer_BallValve1','sg("BallValve1.status",1);',3);
return"";
}
if (gg('BallValve1.status') == "4") {
cm('BallValve1.turnOff');
return"";
}
if (gg('BallValve1.status') == "0") {
//Устанавливаем состояние крана 5 (подтверждение открытия)
sg('BallValve1.status',5);
//Устанавливаем состояние крана 0 (закрыт)
setTimeOut('myTimer_BallValve1','sg("BallValve1.status",0);',3);
return"";
}
if (gg('BallValve1.status') == "5") {
cm('BallValve1.turnOn');
return"";
}
Теперь разместим наш элемент в меню и на сцене. В обоих случаях используем HTML-блок.
Код для меню (ясно, что предварительно в меню надо создать какой-нибудь объект):
Код: Выделить всё
<style type="text/css">
.blink1 {
-webkit-animation: blink1 3s linear infinite;
animation: blink1 3s linear infinite;
}
@-webkit-keyframes blink1 {
0% { color: rgba(34, 34, 34, 1); }
50% { color: rgba(34, 34, 34, 0); }
100% { color: rgba(34, 34, 34, 1); }
}
@keyframes blink1 {
0% { color: rgba(34, 34, 34, 1); }
50% { color: rgba(34, 34, 34, 0); }
100% { color: rgba(34, 34, 34, 1); }
}
</style>
<legend>Управление краном</legend>
<div style='display:%BallValve1.status|"none;none;none;none;none;block"%' onClick='callMethod("%BallValve1.confirmation");'><img src="\cms\scenes\styles\images\Animated-exclamation.gif" height="32">Открыть?</div>
<div style='display:%BallValve1.status|"none;none;none;none;block;none"%' onClick='callMethod("%BallValve1.confirmation");'><img src="\cms\scenes\styles\images\Animated-exclamation.gif" height="32">Закрыть?</div>
<div class="blink1">
<div style='display:%BallValve1.status|"none;none;block;none;none;none"%'><img src="\cms\scenes\styles\images\Ventil_Closing.gif"><strong>Закрывается</strong></div>
</div>
<div style='display:%BallValve1.status|"block;none;none;none;none;none"%' onClick='callMethod("%BallValve1.confirmation");'><img src="\cms\scenes\styles\images\kran_closed.jpg">Закрыт</div>
<div class="blink1">
<div style='display:%BallValve1.status|"none;none;none;block;none;none"%'><img src="\cms\scenes\styles\images\Ventil_Opening.gif"><strong>Открывается</strong></div>
</div>
<div style='display:%BallValve1.status|"none;block;none;none;none;none"%' onClick='callMethod("%BallValve1.confirmation");'><img src="\cms\scenes\styles\images\kran_opened.jpg">Открыт</div>
<div style='display:%LeakSensor1.status|"none;block"%'><img src="\cms\scenes\styles\images\water_leakage.gif" height="32"><font size="3" color=red>Протечка</font></div>
Код стиля css «.blink1» был раздобыт за полторы минуты в Интернете и отвечает за плавное мигание надписи рядом со вращающимся вентилем. Вы только не подумайте, что я во всем этом разбираюсь.
Кто желает увидеть, как это все выглядит «в живую», но не имеет Меги, могут просто из кода методов «turnOn» и «turnOff» удалить все, что связано с подачей команд Меге. Ну и таймер 18 секунд уменьшить хотя бы до 10 секунд, чтобы мультик двигался пошустрее. Если анимация не заработает, очистите кэш браузера или попробуйте в другом браузере.
Другими словами, в «
turnOn» оставьте только
Код: Выделить всё
//Устанавливаем состояние крана 3 (открывается)
sg('BallValve1.status',3);
//Устанавливаем состояние крана 1 (открыт) через 18 сек.
setTimeOut('myTimer_BallValve1','sg("BallValve1.status",1);',18);
а в «
turnOff» только
Код: Выделить всё
//Устанавливаем состояние крана 2 (закрывается)
sg('BallValve1.status',2);
//Устанавливаем состояние крана 0 (закрыт) через 18 сек.
setTimeOut('myTimer_BallValve1','sg("BallValve1.status",0);',18);
Почти такой же код поместим в HTML-блок на сцене (в поле «Код»). Не забудьте предварительно добавить для нашего элемента сцены какое-нибудь состояние.
Код: Выделить всё
<style type="text/css">
.blink1 {
-webkit-animation: blink1 3s linear infinite;
animation: blink1 3s linear infinite;
}
@-webkit-keyframes blink1 {
0% { color: rgba(34, 34, 34, 1); }
50% { color: rgba(34, 34, 34, 0); }
100% { color: rgba(34, 34, 34, 1); }
}
@keyframes blink1 {
0% { color: rgba(34, 34, 34, 1); }
50% { color: rgba(34, 34, 34, 0); }
100% { color: rgba(34, 34, 34, 1); }
}
</style>
<div style='display:%BallValve1.status|"none;none;none;none;none;block"%' onClick='callMethod("%BallValve1.confirmation");'><img src="\cms\scenes\styles\images\Animated-exclamation.gif"><font size="3" color="##FF0000">Открыть?</font></div>
<div style='display:%BallValve1.status|"none;none;none;none;block;none"%' onClick='callMethod("%BallValve1.confirmation");'><img src="\cms\scenes\styles\images\Animated-exclamation.gif"><font size="3" color="##FF0000">Закрыть?</font></div>
<div class="blink1">
<div style='display:%BallValve1.status|"none;none;block;none;none;none"%'><img src="\cms\scenes\styles\images\Ventil_Closing.gif"><font size="4"><strong>Закрывается</strong></font></div>
</div>
<div style='display:%BallValve1.status|"block;none;none;none;none;none"%' onClick='callMethod("%BallValve1.confirmation");'><img src="\cms\scenes\styles\images\kran_closed.jpg"><font size="3" color="##000000">Закрыт</font></div>
<div class="blink1">
<div style='display:%BallValve1.status|"none;none;none;block;none;none"%'><img src="\cms\scenes\styles\images\Ventil_Opening.gif"><font size="4"><strong>Открывается</strong></font></div>
</div>
<div style='display:%BallValve1.status|"none;block;none;none;none;none"%' onClick='callMethod("%BallValve1.confirmation");'><img src="\cms\scenes\styles\images\kran_opened.jpg"><font size="3" color="##000000">Открыт</font></div>
Выглядеть в результате все будет вот так (правда, статичные картинки нам не предадут анимацию).
А вот и видео. Тут при первом клике на элемент на 3 секунды выскакивает запрос подтверждения действия и только при повторном клике (подтверждение) начинается открытие или закрытие. (Имитировать срабатывание датчика протечки при подготовке видео не стал.)
3. Теперь последний пункт нашей программы - профилактическое закрывание/открывание крана раз в неделю.
Дополним объект «BallValve1» методом «
maintenance» со следующим кодом
Код: Выделить всё
//Если кран закрыт, то профилактическое закрывание/открывание производить не будем
if (gg('BallValve1.status') == 0) {
return"";
} else {
cm('BallValve1.turnOff');
say('Выполняется профилактика крана',1);
//Дадим крану перед открытием 10 секунд "отдохнуть"
setTimeOut('myTimer_ BallValve1_Mts','cm("BallValve1.turnOn");',10);
sleep(30);
say('Профилактика крана выполнена',1);
}
Осталось запускать этот метод раз в неделю. В Мажордомо есть возможность установить модуль «
Cron» и запускать задание из него. Но мы решили придерживаться минимализма. Попробуем реализовать задачу следующим образом.
Запишем в «OnNewMinute» следующий код
Код: Выделить всё
$day_num=(int)date('w');
if ($day_num == "3") {
if (timeIs('02:05')) cm('BallValve1.maintenance');}
В результате выполнения этого кода профилактика крана будет осуществляться ночью каждую неделю по средам в «02:05». (Для воскресенья надо указывать «0».)
Ну где будем делать тестовую «лужу»? В блюдце!
Есть контакт!