Main

Управление клапаном контура отопления

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

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

Условно назовём комнату Zal.

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

Добавим сценарий checkZal:

if (gg("Econom")) {
 $wanted=gg('ZalTempEco');
} else {
 $wanted=gg('ZalTemp');
}
$now=gg('sensorZal.temp');

if ($now>$wanted) {
 //надо охладить
} elseif ($now<$wanted) {
 //надо подогреть
}

Код, приведённый выше, считывает и сравнивает заданную желаемой температуру (об этом чуть ниже) с текущей температурой в комнате. Предполагается, что она содержится в свойстве объекта sensorZal.temp. Если температура выше заданной, то выполняется часть кода, связанная с необходимостью охладить комнату. Если выше, то связанный с подогревом. Если температура равна установленной, то ничего не происходит.

Заданная температура берётся из двух различных переменных ZalTempEco и ZalTemp -- ниже мы их создадим, а пока лишь скажу, что они выбираются в зависимости от установленного значения режима экономии (переменная Econom).

Итак, теперь нам надо иметь возможность задать эти две переменные. Для этого добавляем в интерфейс (модуль Меню управления) два пункта типа слайдер следующего вида:

и аналогично второй:

Они отличаются лишь связанным свойством. Обращаю внимание, что так же задан вызов сценария checkZal при изменении значения слайдера, для того, чтобы изменения сразу вступали в силу.

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

Далее, нам следует добавить автоматический вызов сценария checkZal по времени, добавив следующий код в метод OnNewMinute в разделе Классы объектов

Для вызова сценария каждую минуту:

  runScript('checkZal');

Если мы хотим вызывать сценарий раз в полчаса, то можно сделать вызов с таким условием:

 if ($m=="00" || $m=="30") {
  runScript('checkZal');
 }

Итак, на данном этапе у нас сделано всё для проверки состояния и реакции, но нам нужно реализовать непосредственно реакцию, а именно управление клапаном.

Для этого в разделе сценарии создадим три сценария:

  • valveOn (для открытия клапана)
  • valveOff (для закрытия клапана)
  • refreshValve (для обновления состояния клапана)

Содержимое сценария valveOn:

 setGlobal('valveStatus',1); // устанавливаем статус
// действия ниже зависят уже от аппаратной реализации управления клапаном
 $url='http://192.168.0.73/?CLICK,6';
 getURL($url,0);

Содержимое сценария valveOff:

 setGlobal('valveStatus',0); // устанавливаем статус
// действия ниже зависят уже от аппаратной реализации управления клапаном
 $url='http://192.168.0.73/?CLICK,7';
 getURL($url,0);

Содержимое сценария refreshValve:

if (getGlobal('valveStatus')) {
 runScript('valveOn');
} else {
 runScript('valveOff');
}

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

Теперь у нас есть возможность управлять клапаном, поэтому мы можем добавить это в наш сценарий checkZal:

if (gg("Econom")) {
 $wanted=gg('ZalTempEco');
} else {
 $wanted=gg('ZalTemp');
}
$now=gg('sensorZal.temp');

if ($now>$wanted) {
 //надо охладить
 if (gg('valveStatus')) { 
  say("Температура выше желаемой, закрываю клапан");
  runScript("valveOff");
 } else {
  //say("Температура выше желаемой, но клапан уже закрыт -- ничего делать не нужно"); 
 }
} elseif ($now<$wanted) {
 //надо подогреть
 if (!gg('valveStatus')) {
  say("Температура ниже желаемой, открываю клапан"); 
  runScript("valveOn"); 
 } else {
  //say("Температура ниже желаемой, но клапан уже открыт -- ничего делать не нужно");
 }
}

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

Вот и всё, удачи в реализации!

 
 

Обсуждение

 

sergejey: Обсуждение страницы Управление клапаном контура отопления

Vit: Реализовал данный сценарий для управления фазой котла на базе 1-wire. http://clip2net.com/clip/m117725/1352809942-clip-7kb.png http://clip2net.com/clip/m117725/1352810001-clip-21kb.jpg

immortal: жду 1-ware ключи, а можно посмотреть настройки 1-ware и все сценарии которые с этим связаны.

Ivan: Тоже интересно. Ключ валяется но настроить с первой попытки не получилось. Сейчас работаю над проектом Arduini-Slave_1Ware с возможностью эмалировать несколько микросхем на одной плате. К примеру Ключ 8 и потенциометер Пока удалось реализовать 2 микросхемы: Метка, термометр. Остальное не получается т.к. не могу разобраться и протоколом. У кого есть внятная информация по ключам отзовитесь. Если интересно могу выгрузить проэкт

immortal: у меня 11 офисных помещений (10 кабинетов и коридор), на каждом помещении стоит клапан на отоплении и на клапане термический сервопривод, в каждом помещении датчик температуры на высоте 1 метр. мне в принципе понятно как работает ключ. в понедельник обещали посылочку с ключами отправить я думаю у меня 1-ware ключи будут связаны со свойствами status объекта clapani у меня температура с 1-ware датчиков пишется в свойство temp объекта tempDi где i - номер кабинета, clapan1 и tempD1 соответственно в 1-м кабинете. поскольку 1-ware датчики дают иногда значение 85 или пустое значение пришлось в свойствах 1варе датчиков не писать связанные свойства, а написать сценарий $temp12 = $params['temperature12']['VALUE']; if ($temp12<>"" and $temp12<>0 and $temp12<>85 ) { $temp12 = round($temp12,1); sg("tempD1.temp", $temp12); callMethod('tempD1.tempChanged',array('t'=>$temp12)); } в сценарии EconomChanged $j=11; //количество кабинетов for ($i = 1; $i <= j; $i++) { //получение значения температуры с датчика $tempcab[$i]=gg("tempD".$i.".temp"); //проверка режима и установка температуры для контроля if (gg("Econom")) { $tempstab[1]=gg("EnergoMinTemp"); }else{ $tempstab[$i]=gg("tempP".$i); } if($tempstab[$i]<$tempcab[$i]){ //включить сервопривод sg("clapan".$i.".status", "1"); }else{ //выключить сервопривод sg("clapan".$i.".status", "0"); } } управление термическими сервоприводами у меня ещё используются переменные: ThisComputer.EnergoMinTemp - температура во всех помещениях в режиме экономии ThisComputer.tempPi - температура комфорта в i-том помещении. в режиме экономии температура во всех помещениях будет снижаться до установленной в обычном режиме сервоприводы регулируют температуру в каждом конкретном помещении в соответствии с установленной в этом помещении. сценарий EconomChanged должен вызываться раз в 5 минут, чаще не стоит, поскольку полное закрытие клапана сервоприводом составляет 3 минуты.

adzam: Если можно поподробней про клапана, где взяли, как поставили, как обвязали Сейчас занимаюсь этим вопросом, и будет интересно

immortal: Темроэлектрический сервопривод (2-хпозицонный), при отсутствии напряжения открыт, 230 V, я не знаю какие куплены, покупал не я, я лишь требования предъявлял, вот типа такого http://www.mtk-gr.ru/katalog/servoprivo ... connyj-927 Клапан терморегулирующий радиаторный, Ду20, прямой типа такого http://www.mtk-gr.ru/katalog/termostati ... ss-ra-2821 делаю в офисе и у себя в 4-х комнатной квартире. в квартире понятно, клапана стоят на батареях, пока сервоприводы не покупал в офисе по кабинетам сделан теплый пол гофрированной трубой kofulso собственно в каждом кабинете стоит термодатчик на высоте 1 метр ds18B20 и клапанами должны управлять семисторные ключи 1 варе (заказал на ab-log) программинг собственно в мажордомо весь выше. в принципе возможно применение и 24-х вольтовых клапанов и тогда наверно можно вести к ним просто витую пару, но в офисе не проблема было подвести 220 вольт и не понятно как бы себя повели семисторы при включении, надо было бы релейные ключи юзать.

immortal: не понял как записать значение параметра 1-ware устройства, как к нему обратиться из сценария? связанный объект - связанное свойство не подходит, видимо работает только на установку свойства, как программно "нажать" ссылку "установить" и установить значение свойства 1-ware элемента. можно конечно использовать owhttpd сервер и включать и выключать путем http запросов, но мне сейчас даже не проверить, почему то не могу зайти на порт. Но хотелось бы не использовать owhttpd сервер.

shemnik69: Я не гуру пока в системе, учу мат часть день и ночь, но скажу что разобраться с управлением ключей DS помогла вот эта статья http://smartliving.ru/Main/ScSensorLight, внимательно просмотрите, и по шагово проиграйте на железе..все работает. На Убунту это вроде должно стабильно идти.

immortal: с ключами DS2413 возникла проблема: подключаю 2413 без подключения питания, определяются, в этой же 1-варе сети висят датчики температуры, подключаю питание на 2413, всё видится, температура мониторится, перевожу в другое состояние допустим PIO.A, светодиод загорается и семистор открывается, после чего в сети 1-варе не вижу 2413 ни ds18b20, и даже 9490 не видится, причем не всегда так происходит, сеть видится после "перезагрузки" - выключения питания Более того, подключил 2413 и питание, не включая выходы 2413 оставил тестироваться, отваливается и подключается не зависимо от включения/выключения 2413 блоки питания менял. причем не только в системе МД такое наблюдается, но и при просмотре через owhttpd собирал на семисторах сам по схеме в инете только полностью на smd компонентах увидел такой глюк, думал, что я не так собрал, заказал на ab-log - ситуация такая же. Грешу конечно на owfs в убунту, поэтому для исключения повесил тестить на tp-link с openwrt Никто не сталкивался?

Ivan: Так спалил один DS9490R гдето описывал как востановить. Грешу на кривой хаб где возможно было пробитие питаня на шину. Смотрите на флаги питания устройства. Если owfs видит что питание пассивное в линию на период замера или переключения подается питание, у кого нет развязки или защиты может пригореть, если большое потребление может выгорать DS9490R

Satgate_M: Если кто данную процедуру налаживал, то подскажите где надо создать valveStatus понять не могу где хранить данную штуку, но в коде она фигурирует! Заранее спасибо.

meboo: Господа, помогите, пожалуйста, со сценарием:
if 
(gg("Econom")) {
 $wanted=gg('neededChimneyTemp');
}
 else {
 $wanted=gg('neededChimneyTemp');
}
$now=gg('ChimneyT.temp');

if ($now>$wanted) {
 //надо включить
 if (gg('BoilerValveStatus')) { 
  say
("Chimney temperature is high, valve will turned on");
  runScript("BoilerValveOn");
 } else {
  //say("Chimney temperature is high, but valve is already turned on "); 
 }
}
 elseif ($now<$wanted) {
 //надо виключить
 if (!gg('BoilerValveStatus')) {
  say("Chimney temperature is low, valve is turning off"); 
  runScript
("BoilerValveOff"); 
 
} else {
  //say("Chimney temperature is low, but valve is already turned off");
 }
Делал по аналогии с температурой по дому. Тот работает, этот нет. В системе задается переменная neededChimneyTemp, вижу ее изменение, скрипты (BoilerValveOff, BoilerValveOn) тоже работают. Нужно чтобы этот скрипт брал переменную neededChimneyTemp (например 80) сравнил ее с текущим статусом переменной ChimneyT.temp (300) и если ChimneyT.temp больше neededChimneyTemp запустил сценарий BoilerValveOn, если меньше - BoilerValveOff. Этот сценарий тоже прописан в onNewMinute, сразу после checkTemp Уже 3 день бьюсь с этой проблемой. P.S. Есть ли разница для скрипта какие цифры сравнивать? Может проблема в трехзначном числе?

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

 

MajorDomo

Информация

Проекты

Партнёры

edit SideBar

 
 
 

 

Blix theme adapted by David Gilbert, powered by PmWiki