Таблица линкованных датчиков

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

Модератор: immortal

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

Таблица линкованных датчиков

Сообщение Bagir » Пн авг 22, 2022 6:37 pm

Предлагаю вашему вниманию сценарий, который нарисует вот такую таблицу:
table.jpg
table.jpg (131.11 КБ) 1007 просмотров
В ней будут объекты класса Rooms у которых есть разные датчики класса (и подклассов) keySensors, связанные с помощью их свойства LinkedRoom.
Неживые серым цветом. Объекты подкласса AlarmSensors, в моем случае class_id = 52 тоже выделены.

Написал на коленках, на красивый дизайн не претендую. Делал чтобы убедиться, что у меня тут порядок. Но в итоге отловил 4 инцидента, о которых даже не подозревал или уже давно забыл. Таблицу можно повесить в домашние страницы, но я применяю только в технических целях. Запускаю сценарий по ссылке и смотрю результат.
Код сценария:

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

$f=0; // флаг начала комнаты
$t=0; // флаг начала таблицы
$locat=['','Дом','Баня','Подсобка','Улица','Теплица','Курятник'];

$objRooms=getObjectsByClass('Rooms');
$objSensors=getObjectsByClass('keySensors');

foreach($objRooms as $objr) {
  $objr=getObject($objr['TITLE']);
 
  foreach($objSensors as $objs) {
    $objs=getObject($objs['TITLE']);
    if ($objr->object_title == $objs->getProperty('LinkedRoom')) {
    
      // При первом разе открыть спойлер с именем комнаты  
      if (!$f) {
       $f=1;
       echo '<details open>'.
         '<summary><big>'.
          '<b style="color:#008080">'. $objr->description .' '. $objr->object_title .'</b>'.
          '<b style="color:#ff0000">'. $objr->getProperty('Alarms').'</b>'.
         '</big></summary>';
      }    

      if (!$t) { 
       echo '<table border="1" bordercolor="grey">'; $t=1;
       echo '<tr>';
       echo '<td>ID</td>';
       echo '<td>Название</td>';
       echo '<td>Статус</td>';    
       echo '<td>Описание</td>';
       echo '<td>Локация</td>';
       echo '<td>Живой</td>';
       echo '<td>Обновлен</td>';
       echo '</tr>';
      }    
     
      // Разный цвет текста
          if ($objs->getProperty('alive')<1) { $cn='<font color="gray">'; $ce='</font>'; }
      elseif ($objs->class_id==52) { $cn='<font color="red">'; $ce='</font>'; } 
      else { $cn=''; $ce=''; }
     
      // Напечатать имена и описание объектов
      echo '<tr>';
      echo '<td>'.$cn.$objs->id.$ce.'</td>';
      echo '<td>'.$cn.$objs->object_title.$ce.'</td>';
      echo '<td>'.$cn.$objs->getProperty('status').$ce.'</td>';    
      echo '<td>'.$cn.$objs->description.$ce.'</td>';
      echo '<td>'.$cn.$locat[$objs->location_id].$ce.'</td>';
      echo '<td>'.$cn.$objs->getProperty('alive').$ce.'</td>';
      $updt=$objs->getProperty('updated');
      if ($updt) { echo '<td>'.$cn.date("d.m.Y  H:i", $updt).$ce.'</td>'; } 
      echo '</tr>';
    }
  
  }
  if ($t) { echo '</table>'; $t=0;} 
  if ($f) { echo '</details><br />'; $f=0;} 
}
{"freeze":"470"} в названии объекта Подъезд, это мой способ передачи тревог от датчиков безопасности. грохните в коде строку
'<b style="color:#ff0000">'. $objr->getProperty('Alarms').'</b>'.
оставил для примера как добавить нужное свойство объекта комнаты в название.
За это сообщение автора Bagir поблагодарили (всего 5):
Logrus (Пн авг 22, 2022 10:45 pm) • Chainik (Вт авг 23, 2022 6:38 pm) • nickneo (Вт ноя 01, 2022 12:08 pm) • Jilber (Ср ноя 02, 2022 3:35 pm) • xor (Чт ноя 03, 2022 1:36 pm)
Рейтинг: 5.81%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Logrus
Сообщения: 2079
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: Таблица линкованных датчиков

Сообщение Logrus » Пн авг 22, 2022 10:46 pm

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

Re: Таблица линкованных датчиков

Сообщение Bagir » Пн авг 22, 2022 11:38 pm

Logrus писал(а):
Пн авг 22, 2022 10:46 pm
в идеале, тема ширше
Это конечно. Просто я пишу по старинке. Классы, объекты, методы так сказать. Недавно попал тут прод критику :oops: и сейчас переписываю у себя много чего. В начале знакомства с МД, я действительно злоупотребил поллингом, проверяя в циклах свойства объектов. Сейчас придерживаюсь событие - следствие. Добрался до датчиков безопасности. Вот и пришла идея сделать такую простенькую таблицу, чтобы видеть что куда отправляет. У меня сильный упор на конструкцию: "железо" -> объект датчика класса keySensors -> объект комнаты класса Rooms -> общий сценарий действий
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
nickneo
Сообщения: 89
Зарегистрирован: Чт дек 07, 2017 2:36 pm
Благодарил (а): 38 раз
Поблагодарили: 30 раз

Re: Таблица линкованных датчиков

Сообщение nickneo » Ср ноя 02, 2022 12:45 pm

Bagir писал(а):
Пн авг 22, 2022 6:37 pm
Предлагаю вашему вниманию сценарий, который нарисует вот такую таблицу:

table.jpg
В ней будут объекты класса Rooms у которых есть разные датчики класса (и подклассов) keySensors, связанные с помощью их свойства LinkedRoom.
Неживые серым цветом. Объекты подкласса AlarmSensors, в моем случае class_id = 52 тоже выделены.

Написал на коленках, на красивый дизайн не претендую.

---- skip----

оставил для примера как добавить нужное свойство объекта комнаты в название.
Добрый день.
Позаимствовал ваш код, подправил под себя и немного добавил "красивостей" измененный выложил на github

пример:
alive_pu.png
alive_pu.png (26.1 КБ) 760 просмотров
За это сообщение автора nickneo поблагодарили (всего 3):
Jilber (Ср ноя 02, 2022 3:35 pm) • xor (Чт ноя 03, 2022 1:36 pm) • ~220v (Пт май 19, 2023 3:48 pm)
Рейтинг: 3.49%
Jilber
Сообщения: 682
Зарегистрирован: Ср май 03, 2017 7:41 pm
Благодарил (а): 111 раз
Поблагодарили: 107 раз

Re: Таблица линкованных датчиков

Сообщение Jilber » Ср ноя 02, 2022 1:39 pm

Спасибо. работает, но появляется ошибка: "Warning: date() expects parameter 2 to be integer, string given in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(164) : eval()'d code on line 79 Warning: date() expects parameter 2 to be integer, string given in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(164) : eval()'d code on line 79".
Аватара пользователя
nickneo
Сообщения: 89
Зарегистрирован: Чт дек 07, 2017 2:36 pm
Благодарил (а): 38 раз
Поблагодарили: 30 раз

Re: Таблица линкованных датчиков

Сообщение nickneo » Ср ноя 02, 2022 3:02 pm

Jilber писал(а):
Ср ноя 02, 2022 1:39 pm
Спасибо. работает, но появляется ошибка: "Warning: date() expects parameter 2 to be integer, string given in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(164) : eval()'d code on line 79 Warning: date() expects parameter 2 to be integer, string given in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(164) : eval()'d code on line 79".
судя по ошибке ругается на преобразование даты из timestamp. ожидается целое число а у вас видимо както по другому передается...

если строку 79 заменить на эту:
$updt=$objs->getProperty('updated');
что выдаст?

и какая версия php?
Jilber
Сообщения: 682
Зарегистрирован: Ср май 03, 2017 7:41 pm
Благодарил (а): 111 раз
Поблагодарили: 107 раз

Re: Таблица линкованных датчиков

Сообщение Jilber » Ср ноя 02, 2022 3:28 pm

Заменил, ошибка исчезла. А можно как-то узнать на какой именно датчик ругается при преобразовании ?

Upd. Кажется понял, в чём было дело. У некоторых объектов свойство "updated" было пустое.
Аватара пользователя
nickneo
Сообщения: 89
Зарегистрирован: Чт дек 07, 2017 2:36 pm
Благодарил (а): 38 раз
Поблагодарили: 30 раз

Re: Таблица линкованных датчиков

Сообщение nickneo » Ср ноя 02, 2022 3:44 pm

Jilber писал(а):
Ср ноя 02, 2022 3:28 pm
Заменил, ошибка исчезла. А можно как-то узнать на какой именно датчик ругается при преобразовании ?
Кажется понял, в чём было дело. У некоторых объектов свойство "updated" было пустое.
Ошибки исчезла потому что вы у себя убрали преобразование даты и у вас в столбце "Обновлен" сейчас дата выводится в таком виде: "1667341112"
нужно понять где у вас неправильно задана дата обновления.
Jilber
Сообщения: 682
Зарегистрирован: Ср май 03, 2017 7:41 pm
Благодарил (а): 111 раз
Поблагодарили: 107 раз

Re: Таблица линкованных датчиков

Сообщение Jilber » Ср ноя 02, 2022 3:48 pm

Да, я видел, что в столбце "Обновлен" пропало преобразование даты. Полез проверять свойство "updated" и обнаружил, что у некоторых объектов оно было пустое. Заполнил свойство, вернул обратно 79 строку и ошибка исчезла. Спасибо.
Аватара пользователя
nickneo
Сообщения: 89
Зарегистрирован: Чт дек 07, 2017 2:36 pm
Благодарил (а): 38 раз
Поблагодарили: 30 раз

Re: Таблица линкованных датчиков

Сообщение nickneo » Ср ноя 02, 2022 3:57 pm

Jilber писал(а):
Ср ноя 02, 2022 3:48 pm
Да, я видел, что в столбце "Обновлен" пропало преобразование даты. Полез проверять свойство "updated" и обнаружил, что у некоторых объектов оно было пустое. Заполнил свойство, вернул обратно 79 строку и ошибка исчезла. Спасибо.
странно, у меня не ругается на пустое поле, может быть особенность работы php под Windows (на нем не тестировал)

попробуйте вот на эту строчку поменять:
$updt=date("d.m.Y H:i", ((int)$objs->getProperty('updated')));

по идее если свойство пустое, будет подставлять дату "01.01.1970 04:00"

файлик на GitHub Обновил
Ответить