приём показаний температуры/влажности с датчиков noolite

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

приём показаний температуры/влажности с датчиков noolite

Сообщение sergejey » Пт сен 12, 2014 2:09 pm

Имеем в наличии:

1. датчик температуры-влажности Датчик температуры и влажности Noolite PT111:
Изображение

2. USB-приёмник Адаптер для компьютера RX2164 (приёмник, приём команд с пультов nooLite)
Изображение

Соответственно, софт под приёмник на компьютере ну и MajorDoMo, само собой.

"Спариваем" датчик с программой на какую-нибудь ячейку, чтобы программа приёмника начала получать показания:

Добавляем вызов внешнего приложения на комадну Send_Temp_Humi=21

В настройках команды запуска ставим:
c:\_majordomo\htdocs\obj.bat
Дополнительные аргументы:
script:nooTempHum sensor:Sensor01

Обязательно ставим галочку "Использовать принятые данные как аргумент"

Изображение

Далее, создаём в системе два объекта humSensor01 и tempSensor01 -- у меня это объекты разных классов с методами humChanged и tempChanged соответственно и свойствами humidity и temp так же соответственно.

Для примера вот код метода tempChanged:

Код: Выделить всё

//$params['t']
 $this->setProperty("updated",time());
 $this->setProperty("updatedTime",date("H:i",time()));
 $this->setProperty("alive",1); 

if (!isset($params['t'])) {
 return;
}

$old_temp=$this->getProperty('temp');
$t=round($params['t'],1);

if ($t>110) return;

$this->setProperty('temp',$t);
if ($params['uptime']) {
 $this->setProperty('uptime',$params['uptime']);
}
(аналогичный для метода humChanged, только там параметр передаётся не "t", а "h")

Для передачи данных в эти объекты создаём скрипт под названием nooTempHum (именно его "дёргает" приложение приёмника при получении данных от датчика).

Вот код скрипта:

Код: Выделить всё

$sensor=$params['sensor'];
if (!$sensor) return 0;

$hum=(int)str_replace('-','',$params['other_params'][6]);
if ($hum>0 && $hum<=100) {
 callMethod('hum'.$sensor.'.humChanged',array('h'=>$hum));
}

//$temp=((int)str_replace('-','',$params['other_params'][4]))/10;
$b1 =(int)str_replace('-','',$params['other_params'][4]);
$b2 =(int)str_replace('-','',$params['other_params'][5]);
$y_temp=256*($b2 & 15)+$b1;
if  (($b2 & 8) != 0 ) { // отритцательное значение температуры
 $y_temp=4096-$y_temp;
 $temp = -1*($y_temp)/10;
} else { // положительное значение температуры
 $temp = $y_temp/10;
}

if ($temp>-30 && $temp<=100) {
 callMethod('temp'.$sensor.'.tempChanged',array('t'=>$temp));
}
Всё. Система начинает дёргать наши объекты и передавать данные температуры/влажности, дальше делаем с ними всё, что захотим. Аналогичным образом можно подключать сколько угодно датчиков, создавая новые объекты и меняя в программе аргументы с "script:nooTempHum sensor:Sensor01" на "script:nooTempHum sensor:Sensor02" и т.п.
За это сообщение автора sergejey поблагодарил:
Roderick (Вт авг 11, 2015 2:21 pm)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Roderick
Сообщения: 3
Зарегистрирован: Вт авг 11, 2015 1:53 pm
Благодарил (а): 2 раза
Поблагодарили: 0

Re: приём показаний температуры/влажности с датчиков noolite

Сообщение Roderick » Вт авг 11, 2015 2:15 pm

Доброго времени суток! Я попытался подключить датчик температуры РТ112 к MajorDoMo через RX2164 описанным выше способом. Не получилось. Информация с датчика поступает в утилиту noolite RX 2.0 благополучно, судя по логу. А вот далее передачи температуры в соответствующее свойство объекта TempSensor01 не происходит. Все действия я проводил в соответствии с приведённым выше описанием. В связи с этим несколько вопросов:

1) Будет ли работать описанная методика при отсутствии датчика влажности?
2) Я создал объект TempSensor01 класса tempSensors с методом tempChanged и свойством temp. Правилен ли выбор класса для этого объекта?
3) Почему в дополнительных аргументах команды запуска утилиты noolite RX 2.0 ("script:nooTempHum sensor:Sensor01") указан Sensor01, а не TempSensor01? Указания на описание объекта Sensor01 я не нашёл.

Надеюсь на помощь.
Roderick
Сообщения: 3
Зарегистрирован: Вт авг 11, 2015 1:53 pm
Благодарил (а): 2 раза
Поблагодарили: 0

Re: приём показаний температуры/влажности с датчиков noolite

Сообщение Roderick » Ср авг 26, 2015 9:45 pm

Я пока так и не смог нормально подключить датчик. Остаётся всего лишь один, но очень важный для меня вопрос - скрипт nooTempHum (в моём случае скорее nooTemp, т.к. датчик РТ112 только температурный) не передаёт данные объекту TempSensor01. Не передаёт и всё. Прямо беда.

Итак, Датчик РТ112, утилита noolite RX 2.0 (туда данные приходят, смотрел по логам), в настройках команды запуска стоит

Код: Выделить всё

c:\_majordomo\htdocs\obj.bat
Дополнительные аргументы:

Код: Выделить всё

script:nooTemp sensor:Sensor01
. Галочка "Использовать принятые данные как аргумент" стоит.

Мой скрипт nooTemp:

Код: Выделить всё

$sensor=$params['sensor'];
if (!$sensor) return 0;

//$temp=((int)str_replace('-','',$params['other_params'][4]))/10;
$b1 =(int)str_replace('-','',$params['other_params'][4]);
$b2 =(int)str_replace('-','',$params['other_params'][5]);
$y_temp=256*($b2 & 15)+$b1;
if  (($b2 & 8) != 0 ) { // отрицательное значение температуры
 $y_temp=4096-$y_temp;
 $temp = -1*($y_temp)/10;
} else { // положительное значение температуры
 $temp = $y_temp/10;
}

if ($temp>-30 && $temp<=100) {
 callMethod('temp'.$sensor.'.tempChanged',array('t'=>$temp));
}
т.е. тот же самый скрипт, что и в первом сообщении, но без части кода по влажности.

Итог - при отработке скрипта данные в объект TempSensor01 не попадают. При принудительном задании произвольного значения TempSensor01.temp через командную строку с использованием obj.bat температура устанавливается, т.е. структура объекта работает.

Буду рад любой помощи.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: приём показаний температуры/влажности с датчиков noolite

Сообщение sergejey » Пн сен 14, 2015 10:51 am

Добрый день!

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

В настройках программы можно указать к примеру такую ссылку: http://127.0.0.1/objects/?script=noodata&
Изображение

И у вас должен быть скрипт, который обрабатывает этот запрос и раскидывает данные от него по различным объектам.
Вот, к примеру, текст моего скрипта noodata:

Код: Выделить всё

DebMes("Noodata: ".$_SERVER['REQUEST_URI']);
$o=$params['name'];
$cmd=$params['cmd'];
$m='';

 if ($cmd==4) {
  $m='onSwitch';
 } elseif ($cmd==0) {
  $m='onTurnOff';    
 } elseif ($cmd==2) {
  $m='onTurnOn';  
 } elseif ($cmd==5) {
  $m='onBrightBack';
 } elseif ($cmd==7) {
  $m='onLoadPreset'; 
 } elseif ($cmd==10) {
  $m='onStopReg';   
 } elseif ($cmd==16) {  
  $m='onLoadPreset';
 } elseif ($cmd==17) {
  $m='onSwitchColor'; 
 } elseif ($cmd==18) {
  $m='onSwitchMode';
 } elseif ($cmd==19) {
  $m='onSpeedMode';
 } elseif ($cmd==20) { 
  $m='onBetteryLow';  
 } elseif ($cmd==21) {
  $m='onTempHum';    
 }

if ($o!='' && $m!='') {
 if (preg_match('/NooRemote/is',$o)) {
   callMethod($o.'.'.$m);
  } elseif (preg_match('/motion/is',$o) && $m=='onTurnOn') {
   callMethod($o.'.statusChanged',array('status'=>1));
  } elseif (preg_match('/motion/is',$o) && $m=='onTurnOff') {
   callMethod($o.'.statusChanged',array('status'=>0));  
  } elseif ($m=='onTempHum') {
 
  $hum=(int)str_replace('-','',$params['d2']);
  if ($hum>0 && $hum<=100) {
   callMethod('hum'.$o.'.humChanged',array('h'=>$hum));
  } else {
   DebMes("Incorrect humidity: ".$hum);
  }
  
  $b1 =(int)str_replace('-','',$params['d0']);
  $b2 =(int)str_replace('-','',$params['d1']);
  $y_temp=256*($b2 & 15)+$b1;
  if  (($b2 & 8) != 0 ) { // отритцательное значение температуры
   $y_temp=4096-$y_temp;
   $temp = -1*($y_temp)/10;
  } else { // положительное значение температуры
   $temp = $y_temp/10;
  }
  if ($temp>0 && $temp<=100) {
   callMethod('temp'.$o.'.tempChanged',array('t'=>$temp));
  } else {
   DebMes("Incorrect temp: ".$temp);
  }
  
 }
}
 
Обратите внимания, что в моём случае система считает что объекты датчиков движения содержат слово "motion", пульты содержат "NooRemote", а датчики температуры влажности начинаются с "temp" и "hum" (например tempSensor01/humSensor01). Названия этих объектов должны быть прописаны в названиях ячеект программы ноолайт.
За это сообщение автора sergejey поблагодарил:
Roderick (Пн сен 14, 2015 7:02 pm)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Roderick
Сообщения: 3
Зарегистрирован: Вт авг 11, 2015 1:53 pm
Благодарил (а): 2 раза
Поблагодарили: 0

Re: приём показаний температуры/влажности с датчиков noolite

Сообщение Roderick » Пн сен 14, 2015 7:02 pm

Огромное спасибо, сегодня попробую сделать
utia38
Сообщения: 82
Зарегистрирован: Ср авг 26, 2015 9:22 pm
Откуда: г.Обнинск, Калужская обл.
Благодарил (а): 1 раз
Поблагодарили: 9 раз
Контактная информация:

Re: приём показаний температуры/влажности с датчиков noolite

Сообщение utia38 » Пн сен 14, 2015 8:13 pm

Да Сергей большое спасибо за скрипты, попробуем с Roderick ом сделать по инструкции.

Но вот еще вопрос :

с МЕТОДОМ tempChanged у общего объекта (класса) tempSensors все понятно, а как быть с методом tempChanged
у конкректного объекта TempSensor01 - у меня там пусто :?: - это разве верно ?
Вложения
визитка - копия.jpg
визитка - копия.jpg (78.17 КБ) 15387 просмотров
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: приём показаний температуры/влажности с датчиков noolite

Сообщение sergejey » Пн сен 14, 2015 10:34 pm

utia38 писал(а):с МЕТОДОМ tempChanged у общего объекта (класса) tempSensors все понятно, а как быть с методом tempChanged
у конкректного объекта TempSensor01 - у меня там пусто :?: - это разве верно ?
В этом то и смысл объектов и классов -- объект наследует содержимое метода от класса и не нужно писать собственную реализацию для каждого объекта в отдельности.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
utia38
Сообщения: 82
Зарегистрирован: Ср авг 26, 2015 9:22 pm
Откуда: г.Обнинск, Калужская обл.
Благодарил (а): 1 раз
Поблагодарили: 9 раз
Контактная информация:

Re: приём показаний температуры/влажности с датчиков noolite

Сообщение utia38 » Пт сен 18, 2015 3:26 pm

Наконец-то получилось считать температуру с датчика t noolite

только вот код скрипта noodata пришлось подправить (так сказать конкретно определить некоторые параметры)
вот скрипт который точно пашет ;)

DebMes("Noodata: ".$_SERVER['REQUEST_URI']);
$o=$params['name'];
$cmd=$params['cmd'];
$m='';

if ($cmd==4) {
$m='onSwitch';
} elseif ($cmd==0) {
$m='onTurnOff';
} elseif ($cmd==2) {
$m='onTurnOn';
} elseif ($cmd==5) {
$m='onBrightBack';
} elseif ($cmd==7) {
$m='onLoadPreset';
} elseif ($cmd==10) {
$m='onStopReg';
} elseif ($cmd==16) {
$m='onLoadPreset';
} elseif ($cmd==17) {
$m='onSwitchColor';
} elseif ($cmd==18) {
$m='onSwitchMode';
} elseif ($cmd==19) {
$m='onSpeedMode';
} elseif ($cmd==20) {
$m='onBetteryLow';
} elseif ($cmd==21) {
$m='onTemp'; // заменили onTempHum на onTemp во всех местах где встречается
}

if ($o!='' && $m!='') {
if (preg_match('/NooRemote/is',$o)) {
callMethod($o.'.'.$m);
} elseif (preg_match('/motion/is',$o) && $m=='onTurnOn') {
callMethod($o.'.statusChanged',array('status'=>1));
} elseif (preg_match('/motion/is',$o) && $m=='onTurnOff') {
callMethod($o.'.statusChanged',array('status'=>0));
} elseif ($m=='onTemp') {

/* // полностью убираем блок по влажности
$hum=(int)str_replace('-','',$params['d2']);
if ($hum>0 && $hum<=100) {
callMethod('hum'.$o.'.humChanged',array('h'=>$hum));
} else {
DebMes("Incorrect humidity: ".$hum);
}
*/


$b1 =(int)str_replace('-','',$params['d0']);
$b2 =(int)str_replace('-','',$params['d1']);
$y_temp=256*($b2 & 15)+$b1;
if (($b2 & 8) != 0 ) { // отрицательное значение температуры
$y_temp=4096-$y_temp;
$temp = -1*($y_temp)/10;
} else { // положительное значение температуры
$temp = $y_temp/10;
}
callMethod('TempSensor01.tempChanged',array('t'=>$temp)); // в "лоб" пропишем вызов метода для t
//callMethod('TempSensor02.tempChanged',array('t'=>$temp)); // для следующего датчика и т.д
}

}
RomanSl
Сообщения: 2
Зарегистрирован: Чт окт 22, 2015 9:06 am
Благодарил (а): 0
Поблагодарили: 0

Re: приём показаний температуры/влажности с датчиков noolite

Сообщение RomanSl » Пт окт 23, 2015 5:15 pm

а кто пробовал снимать данные не с USB noolite а с шлюза PR1132?
Посоветуйте как лучше забрать данные, есть вариант попробовать через веб-переменную.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: приём показаний температуры/влажности с датчиков noolite

Сообщение sergejey » Пт окт 23, 2015 5:18 pm

RomanSl писал(а):а кто пробовал снимать данные не с USB noolite а с шлюза PR1132?
Посоветуйте как лучше забрать данные, есть вариант попробовать через веб-переменную.
Подозреваю, что это наилучший вариант. Правда, информацию с датчиков движения и пультов так снять не получится -- этих данных там нет, на сколько я знаю.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ответить