Страница 1 из 2

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

Добавлено: Пн авг 22, 2022 6:37 pm
Bagir
Предлагаю вашему вниманию сценарий, который нарисует вот такую таблицу:
table.jpg
table.jpg (131.11 КБ) 1039 просмотров
В ней будут объекты класса 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>'.
оставил для примера как добавить нужное свойство объекта комнаты в название.

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

Добавлено: Пн авг 22, 2022 10:46 pm
Logrus
в идеале, тема ширше, до вики модуля с настройками и заметками оконечных устройств
аналога дискавери из хас и т.д. и тп.

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

Добавлено: Пн авг 22, 2022 11:38 pm
Bagir
Logrus писал(а):
Пн авг 22, 2022 10:46 pm
в идеале, тема ширше
Это конечно. Просто я пишу по старинке. Классы, объекты, методы так сказать. Недавно попал тут прод критику :oops: и сейчас переписываю у себя много чего. В начале знакомства с МД, я действительно злоупотребил поллингом, проверяя в циклах свойства объектов. Сейчас придерживаюсь событие - следствие. Добрался до датчиков безопасности. Вот и пришла идея сделать такую простенькую таблицу, чтобы видеть что куда отправляет. У меня сильный упор на конструкцию: "железо" -> объект датчика класса keySensors -> объект комнаты класса Rooms -> общий сценарий действий

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

Добавлено: Ср ноя 02, 2022 12:45 pm
nickneo
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 КБ) 792 просмотра

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

Добавлено: Ср ноя 02, 2022 1:39 pm
Jilber
Спасибо. работает, но появляется ошибка: "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".

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

Добавлено: Ср ноя 02, 2022 3:02 pm
nickneo
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?

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

Добавлено: Ср ноя 02, 2022 3:28 pm
Jilber
Заменил, ошибка исчезла. А можно как-то узнать на какой именно датчик ругается при преобразовании ?

Upd. Кажется понял, в чём было дело. У некоторых объектов свойство "updated" было пустое.

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

Добавлено: Ср ноя 02, 2022 3:44 pm
nickneo
Jilber писал(а):
Ср ноя 02, 2022 3:28 pm
Заменил, ошибка исчезла. А можно как-то узнать на какой именно датчик ругается при преобразовании ?
Кажется понял, в чём было дело. У некоторых объектов свойство "updated" было пустое.
Ошибки исчезла потому что вы у себя убрали преобразование даты и у вас в столбце "Обновлен" сейчас дата выводится в таком виде: "1667341112"
нужно понять где у вас неправильно задана дата обновления.

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

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

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

Добавлено: Ср ноя 02, 2022 3:57 pm
nickneo
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 Обновил