Main

<<< Сценарии

Слежение за температурой контура отопления

Используемые модули: Objects, Control Menu, Events

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

На странице Схема контроллера представлена схема подключения температурных датчиков к контроллеру Arduino.

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

Создали данный класс:

Данному классу добавим следующие свойства:

выше видно что мы заполнили свойства для данного класса.

Перейдём в закладку Methods/Events и создадим метод tempChanged

данный метод будет содержать следующий код:

//$params['t']
$old_temp=$this->getProperty('temp');
$t=round($params['t']*2)/2;
$this->setProperty('temp',$t);
if ($t>$old_temp) {
 $d=1;
} elseif ($t<$old_temp) {
 $d=-1;
} else {
 $d=0;
}
$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));

Далее добавляем объекты для данного класса:

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

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

вставляем соответствующий код в пункт меню

Котёл: %sensorKotel.temp% C (%sensorKotel.updatedTime%) (то что обозначено %% заменяется соответствующим значением свойства объекта) в итоге получаем наглядный пример проделанной работы

Далее мы рассмотрим пример Построение графиков изменения значений переменной (на примере графика температуры).

 
 

Обсуждение

 

zverev.sv: Здравствуйте, подскажите пожалуйста, по какой причине не выводится время изменения температуры, хотя сама температура выводится нормально?

sergejey: Здравствуйте, подскажите пожалуйста, по какой причине не выводится время изменения температуры, хотя сама температура выводится нормально? Возможно, используется прямая установка значения свойства temp без использования метода tempChanged? именно в последнем есть код, который не только устанавливает значение свойства, но и устанавливает время обновления.

zverev.sv: Делаю все по Вашему описанию :http://smartliving.ru/Main.ScMonitorHeating , температура выводится, а время в скобках нет?

zverev.sv: вот код метода TemperatureChanged: //$params $old_Temperature=$this->getProperty('Temperature'); $t=round($params*2)/2; $this->setProperty('Temperature',$t); if ($t>$old_Temperature) { $d=1; } elseif ($t<$old_Temperature) { $d=-1; } else { $d=0; } $this->setProperty('Direction',$d); $this->setProperty("Updated",time()); $this->setProperty("UpdatedTime",date("H:i",time())); вот код, по которому осуществляется вставка: <div align="center">Тестовая t: C. ()

Vit: вот код метода TemperatureChanged: //$params $old_Temperature=$this->getProperty('Temperature'); $t=round($params*2)/2; $this->setProperty('Temperature',$t); if ($t>$old_Temperature) { $d=1; } elseif ($t<$old_Temperature) { $d=-1; } else { $d=0; } $this->setProperty('Direction',$d); $this->setProperty("Updated",time()); $this->setProperty("UpdatedTime",date("H:i",time())); вот код, по которому осуществляется вставка: <div align="center">Тестовая t: C. () покажите еще скрины класса и объектов с их свойствами

zverev.sv: Вот скрины

sergejey: Кажется, я понял. Задана связь между свойством 1wire и свойством объекта, поэтому данные передаются в свойство корректно, но при этом метод не вызывается. Можно сделать следующее -- там в настройках 1wire можно указать сценарий, который будет выполняться при изменении свойств и который вызовет нужные метод. Вот такой код сценария: if ($params['temperature']) { callMethod('Sensor_Temperature_test.TemperatureChanged',array('t'=>$params['temperature']['VALUE'])); }

Anton_kulibin: У меня тоже не работало добавил сценарий и все Ок стало. Сергей спасибо.

Vit: Можно еще такой вариант... в сценарии датчика 1-wire добавить следующий код, который будет изменять свойства объекта в выше указанном примере будет следующий код if (isset($params)) { setGlobal('Sensor_Temperature_Test.Updated_Time',date('H:i')); } выбирайте какой больше вариант нравиться... в любом случае за обои варианты огромное спасибо Сергею))

zverev.sv: Большое спасибо,

zverev.sv: Большое спасибо, заработало

Vit: пользуйтесь...всегда рады помочь))

Jager: В примере http://smartliving.ru/Main/ScMonitorHeating описано как завести данные используя вот этот скетч http://smartliving.ru/Main/ArduinoCode и там видно каким способом отправляются данные ("GET /objects/?object=sensorKotel&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp1, abs(temp1)); sendHTTPRequest();) Но как отправить данные из этого скетча? https://github.com/sochkasov/majordomo- ... Server.ino

sergejey: На сколько я понимаю, нужно опрашивать устройство через веб-переменные.

Jager: На сколько я понимаю, нужно опрашивать устройство через веб-переменные. Что то не получается у меня через переменные :(

Anton_kulibin: У меня получилось осталось только шаблон поиска организовать

Jager: У меня получилось осталось только шаблон поиска организовать скриншот с описанием, пожалуйста.

Anton_kulibin: http://img-fotki.yandex.ru/get/6426/158531608.0/0_ae959_16a0b726_L.jpg Проблема осталась только в обновлении

Jager: Проблема осталась только в обновлении Качество скриншота конечно...не видно же. (.+?)< так? UPD: Все, разобрался. Надо было перезапустить систему и все заработало. UPD: Что бы обновлялось, сделай в скетче так void loop() { char buff; int len = 64; webserver.processConnection(buff, &len); // process incoming connections one at a time forever sensors.requestTemperatures(); delay(1000); }

Anton_kulibin: Sorry за качество скрина, некогда было искать файлообменник. Спасибо за строку в скетче, думал уже про это но еще не добрался до него.

Jager: На сколько я понимаю, нужно опрашивать устройство через веб-переменные. Брать температуру через web переменные получилось, осталось решить проблему с записью времени в "tempSensors. updatedTime" там пусто.

sergejey: На сколько я понимаю, нужно опрашивать устройство через веб-переменные. Брать температуру через web переменные получилось, осталось решить проблему с записью времени в "tempSensors. updatedTime" там пусто. Можно попробовать прописать такие строчки в код, запускаемый при обновлении веб-переменной: $params=array('t'=>$new_status); callMethod('mySensor.tempChanged',$params); вместо mySensor -- нужное имя объекта http://clip2net.com/clip/m1/1356512316-clip-6kb.png

immortal: Напишите пожалуйста пошагово как подключить 1-wire датчик температуры и вывести результат в меню и в график, в устройствах датчики видны.

Outrider: Sorry за качество скрина, некогда было искать файлообменник. Спасибо за строку в скетче, думал уже про это но еще не добрался до него. Приведите, пжлста, в текстовом виде шаблон поиска? Где-то так T0:283AC2E603000039(*?); ?

Jager: Приведите, пжлста, в текстовом виде шаблон поиска? Где-то так T0:283AC2E603000039(*?); ? 283AC2E603000039:(.+?);

elik745i: Можно еще такой вариант... в сценарии датчика 1-wire добавить следующий код, который будет изменять свойства объекта в выше указанном примере будет следующий код if (isset($params)) { setGlobal('Sensor_Temperature_Test.Updated_Time',date('H:i')); } выбирайте какой больше вариант нравиться... в любом случае за обои варианты огромное спасибо Сергею)) моем случае: передача данных от датчика посредством радиопередатчика на 433мгц, прием на ардуино и передача в мдомо через arduinoGW я сделал так: 1) Create Scenario called easyRF: $device_id=$params; $destination_id=$params; $packet_id=$params; $command_id=$params; $data=$params; setGlobal('GarageTS.temp',$data); 2) Create/Add Proprties to object: TempSensors 3) Add/modify TempSensors properties to: direction (keep history let's say 7 days) temp (Start method on change: tempUpdated, keep history let's say 7 days) updated (keep history let's say 7 days) updatedTime (keep history let's say 7 days) 4) Create Object under TempSensors: GarageTS Set Method of GarageTS Object to: setGlobal('GarageTS.updatedTime',date("H:i",time())); но как же быть с изменением направления, я в тупике подскажите код плиз!

immortal: может кому нибудь будет полезен код обработки с датчика температуры 1-ware температуру берет со свойства temperature12 имя объекта tempD5 свойство temp, свойства не связываем, просто устанавливаем интервал обновления и пишем следующий код: $temp12 = $params['temperature12']['VALUE']; if ($temp12<>"" and $temp12<>0 and $temp12<>85 ) { $temp12 = round($temp12,1); sg("tempD5.temp", $temp12); callMethod('tempD5.tempChanged',array('t'=>$temp12)); } округление температуры до десятых я не понял как он вбазу пишет, пишет ли если значение не изменилось, если в базу необходимо писать только измененные значения то код будет иметь следующий вид: $temp12 = $params['temperature12']['VALUE']; if ($temp12<>"" and $temp12<>0 and $temp12<>85 ) { $temp12 = round($temp12,1); $temp00=getGlobal("tempD5.temp"); if ($temp12<>$temp00){sg("tempD5.temp", $temp12);} callMethod('tempD5.tempChanged',array('t'=>$temp12)); } в данном коде если температура совпадает, то значение температуры не пишется, а время обновления данных всё равно обновляется но как же быть с изменением направления, я в тупике подскажите код плиз! добавить в конец: $old_temp = getGlobal("GarageTS.temp"); if ($data>$old_temp) { $d=1; } elseif ($data<$old_temp) { $d=-1; } else { $d=0; } setGlobal('GarageTS.direction',$d); вроде так, у Вас значение температуры я так понял в переменной $data

West727: Подскажите кто может не устанавливает updatedTime и все тут 0.70b ubuntu 14 $this->setProperty("updated",time()); $this->setProperty('updatedTime',date("H:i",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=30*60; } clearTimeOut($ot."_alive"); setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); if (!isset($params)) { return; } $old_temp=$this->getProperty('temp'); $t=round($params,1); if ($t>110) return; $this->setProperty('temp',$t); if ($params) { $this->setProperty('uptime',$params); } if ($t>$old_temp) { $d=1; } elseif ($t<$old_temp) { $d=-1; } else { $d=0; } $this->setProperty('direction',$d); $linked_room=$this->getProperty("LinkedRoom"); if ($linked_room) { setGlobal($linked_room.'.Temperature',$t); } причем не устанавливает даже direction

gromozeka: Добрый день! Взяли всё необходимое оборудование и пытались реализовать по инструкции. Затык на загрузке прошивки в Ардуино: http://smartliving.ru/Main/ArduinoCode Библиотеки подгрузил...их видно. Но зависает компиляция и всё. Что можно ещё сделать? Или мне нужно обращаться к техподдержке Ардуино?

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

 

MajorDomo

Информация

Проекты

Партнёры

edit SideBar

 
 
 

 

Blix theme adapted by David Gilbert, powered by PmWiki