Резервные датчики

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

Модератор: immortal

Ответить
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Резервные датчики

Сообщение Bagir » Вс мар 11, 2018 11:11 pm

С чего всё началосьПоказать
Как то сломался у меня датчик на газовом котле. Домашний радио термостат. Покупку нового Алиса не одобрила. Сказала сама буду котлом рулить. Всё было отлично, пока я не заленился поменять батарейки в беспроводных датчиках температуры. А больше температуру у меня в доме никто не считывал. Чтобы больше такого безобразия не было, я установил еще пару проводных даткиков температуры. Разместить их красиво где было бы им удобно измерять температуру, у меня не получилось. Так что в приоритете всё равно остались радиодатчики, которые без проблем располагаются на нужной высоте.
Чтож, данные с датчиков теперь есть, но засунуть их в одну таблицу - дело гиблое. Данные разных сенсоров несколько отличаются друг от друга в виду их собственной погрешности и разного расположения. Я не ушел от первоначальной идеи, когда данные от разных датчиков приходят в класс keySensors и затем передаются объектам комнат класса Rooms. В сухом остатке, для примера, имеем два объекта датчиков ts_1 и ts_2. У обоих в свойстве LinkedRoom указано одинаковое имя объекта комнаты. Если всё оставить так, то данные с ts_1 и ts_2 будут передаваться в объект комнаты, и ввиду небольшой разности показаний даже на небольшом графике будет "пила" а не прямая линия.
Решение одно. Один датчик должен быть главным, а другой, или даже другие, резервным. Значит в код метода statusChanged класса Rooms нужно добавить код, который будет определять, нужно ли передавать данные от резервного датчика, или главный датчик работает сам.
Теперь весь рассказ и задача в целом сводится к добавлению в систему возможности создавать резервные датчики. Вот мой вариант реализации:
Добавляем новое свойство distance в класс датчиков. Если свойство будет не задано, или в нем будет значение 0, то датчик считается главным, и его данные всегда будут передаваться объекту комнаты. Чем больше значение distance, тем дальше по списку резерва стоит датчик. Если у датчика задано свойство distance, то перед передачей его данных, будет проведен поиск всех датчиков, и если при этом не будет найдено ни одного живого датчика с дистанцией меньше, то данные будут переданы объекту комнаты.

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

// Передать данные слинкованной комнате
$linked_room=$this->getProperty("LinkedRoom");
if ($linked_room) { 
 
 // Если НЕ задано свойство distance, то датчик считается главным, и его данные просто будут переданы объекту комнаты.
 if (!$this->getProperty('distance')) {
   setGlobal($linked_room.'.Temperature', $s);

 // Иначе будет проведен поиск других живых датчиков с более короткой дистанцией.
 } else {
   // Получить id свойства для работы с базой данных
   $alive_pid=$this->getPropertyByName('alive', $this->class_id, $this->id);
   $distance_pid=$this->getPropertyByName('distance', $this->class_id, $this->id);
   $LinkedRoom_pid=$this->getPropertyByName('LinkedRoom', $this->class_id, $this->id);

   $arr_s = SQLSelectOne("
   SELECT VALUE FROM `pvalues` WHERE PROPERTY_ID = ".$distance_pid." AND OBJECT_ID IN (
    SELECT OBJECT_ID FROM `pvalues` WHERE PROPERTY_ID = ".$LinkedRoom_pid." AND VALUE = '".$linked_room."' AND OBJECT_ID NOT IN (
     SELECT OBJECT_ID FROM `pvalues` WHERE PROPERTY_ID = ".$alive_pid." AND VALUE = 0
    )
   ) 
   ORDER BY VALUE LIMIT 1
   ");
  
   //Если не найдено других живых датчиков с более короткой дистанцией
   if ($this->getProperty("distance") <= $arr_s['VALUE']) {
    setGlobal($linked_room.'.Temperature', $s);
   }
 }
} 
Делал ли кто нибудь ранее подобную схему с резервными датчиками? Или может быть есть идеи как сделать лучше. По коду возможно есть более простой способ получения id нужных свойств. И конечно же сам SQL. Я в нем не силен, и скорее всего есть способ проще и оптимальнее. Немного пояснений:

SELECT OBJECT_ID FROM `pvalues` WHERE PROPERTY_ID = ".$alive_pid." AND VALUE = 0
Выбрать всё НЕ живые датчики из нашего класса keySensors, или его подкласса. $alive_pid укажет на принадлежность свойства к нужному классу.

SELECT OBJECT_ID FROM `pvalues` WHERE PROPERTY_ID = ".$LinkedRoom_pid." AND VALUE = '".$linked_room."' AND OBJECT_ID NOT IN (<<<<неживые>>>>)
Выбрать датчики со свойством LinkedRoom='объект_комната' и исключить неживые

SELECT VALUE FROM `pvalues` WHERE PROPERTY_ID = ".$distance_pid." AND OBJECT_ID IN (<<<<>>>>) ORDER BY VALUE LIMIT 1
Получить минимальное значение distance. Это будет свойство живого датчика, у которого в LinkedRoom указана та же комната. Дальше всё просто. Сравниваем со значением distance текущего датчика и принимаем решение о передаче данных.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: Резервные датчики

Сообщение xor » Пн мар 12, 2018 12:26 am

А не проще сраэу выбирать датчик с условием:
заданная комната
класс
живой
минимальная дистанция ?
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Re: Резервные датчики

Сообщение Bagir » Пн мар 12, 2018 12:34 am

По сути SQL код это и делает. А как это сделать по другому? Хотелось бы получить универсальный вариант для кода метода statusChanged. Разве что попробовать перебрать датчики всего класса, например, с помощью

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

$objects=getObjectsByClass("TempSensors");
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: Резервные датчики

Сообщение xor » Пн мар 12, 2018 1:55 am

Чёт запутался на ночь глядя,
как у вас статусчангед комнаты меняется? По таймеру, что ли?
Если комната должна определять, какой датчик считывать, то пусть она берёт температуру с основного, если он жив, иначе с другого, следующего и тд.
Много у вас их будет в комнате?
А чего вы 0 не считаете за реальность?
Морозов не бывает?
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: Резервные датчики

Сообщение xor » Пн мар 12, 2018 2:24 am

А ещё можно посмотреть в сторону

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

$objects=getObjectsByProperty('linkedRoom', '=', 'Спальня'); 
и проверять классы на предмет температурных датчиков, живости и приоритета-дистанции.
Этот цикл будет покороче, чем getObjectsByClass("TempSensors")
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Re: Резервные датчики

Сообщение Bagir » Пн мар 12, 2018 10:38 pm

Да, верно, про getObjectsByProperty я и забыл совсем. Очень полезная функция.
У меня на данный момент statusChanged класса keySensors передает данные в свойства объектов класса Rooms. Туда и добавил предложенный выше код. Пока что всё хорошо, но ещё надо понаблюдать и создать разные ситуации.
Считываемых датчиков в комнате у меня было по одному. Сейчас добавил проводные. Получилось два. Так то есть еще сенсор в z-wave датчике дыма. Думаю что тоже задействую его в качестве ещё одного резервного, указав большую дистанцию.
А где я ноль пропустил? если по коду "VALUE = 0" то это свойство датчика alive. Так отсеиваю все неживые.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Logrus
Сообщения: 2084
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: Резервные датчики

Сообщение Logrus » Пт апр 13, 2018 9:12 pm

интересней бы было среднее со всех в комнату передавать
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Re: Резервные датчики

Сообщение Bagir » Сб апр 21, 2018 1:09 am

Да, возможно, но тут может быть трудность в реализации при условии конструкции "объекты датчиков и комнат". При получении новых данных, объект датчика обрабатывает их и передает объекту комнаты. Первоначальное событие возникает именно при получения данных от датчика в его объект. Чтобы рассчитать среднее, нужно где то указать какие именно ещё датчики необходимо взять. Ещё при этом учесть их статус alive. Получается много кода с указанием множества "имен" в каждом из них.
Так что я всё же остановился на варианте указания приоритета. Наблюдаю за работой уже давно. Пока всё радует. Варианты отказа основных беспроводных датчиков ещё раз были. Резервный проводной уверенно заменял отказавший (батарейки надо было просто не лениться менять) Но тем не менее ситуация имеет место быть. А в моем случае это аукнется на управлении газовым котлом.
К стати, для обеспечения надежности работы котла я просто продублировал управляющее реле двумя простыми проводными термостатами типа сухой контакт. Выставив на них температуры немного ниже и выше желаемых. Так что даже если просто выключить сервер - беды не будет.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить