[Модификация] Элемент сцены Температура

Вносятся изменения в файлы или устанавливаются доп программы

Модераторы: immortal, newz20

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

[Модификация] Элемент сцены Температура

Сообщение Bagir » Чт фев 26, 2015 10:49 pm

Релиз элемента температуры для сцен. Вариант с круговым градиентом.
ИзображениеИзображениеИзображение
Добавлена индикация неживого датчика
Изображение
Вариант с тенью у шрифта
Изображение
Element details:Показать
Тип HTML
Ширина 60
Высота 60
Код

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

<style>
div.element_39 {
  font-size:12pt;
  font-weight:700;
  text-align: center;
  background-image: radial-gradient(%Officeroom.TempHEX% -15px, rgba(0,0,0,0) 65%);
}
.element_39 .icon0 {
  width: 12px;
  height: 12px;
  background: red;
  border-radius: 6px;
}
.element_39 .icon1 {
  width: 0;
  height: 0;
  border-left: 10px solid transparent;
  border-right: 10px solid transparent;
  border-top: 10px solid blue;
}
.element_39 .icon2 {
}
.element_39 .icon3 {
  width: 0;
  height: 0;
  border-left: 10px solid transparent;
  border-right: 10px solid transparent;
  border-bottom: 10px solid OrangeRed;
}
</style>

<script> 
 var ad="icon" + (2+Number(%ts_office.direction%)) * Number(%ts_office.alive%);
 document.getElementById('f39').setAttribute('class', ad);
 // 0-не живой, 1-падает, 2-без изменений, 3-растет
</script>

<br style="height:33%"/>
<span style="text-shadow: 1px 1px 2px white;">%Officeroom.Temperature% ℃</span>
<div id="f39"></div>
Описание:
Цвет градиента меняется в зависимости от значения температуры. Есть индикация направления изменения показаний. В планах индикация статуса объекта датчика - живой/мертвый.
Применены правила перевода градусов в цвет. Значение цвета рассчитывается при изменении температуры, и при желании можно все легко поправить. За основу взяты следующие положения:
1. Будут использованы три цвета и переходы между ними. Голубой->Синий->Красный
2. 18 градусов - синий цвет;
3. 30 градусов - красный цвет;
4. Из этого следует, что голубой цвет это 12 градусов;
5. Все что ниже 12 градусов так и останется голубым;
6. Все что выше 30 градусов так и будет красным.
Для оценки воздуха комнаты это вполне справедливо.
Таблица изменения градиента в зависимости от температурыПоказать
Изображение
Настройка:
  • 1. Поменять везде номер элемента на свой element_39. У имени f39 просто заменить цифру в двух местах.
    2. Officeroom.Temperature - это свойство объекта со значением температуры.
    3. ts_office.direction - направление изменения: 1 - растет (красный треугольник вверх), -1 - снижается (синий треугольник вниз), 0 - значение не изменилось. Ничего отображаться не будет.
    4. ts_office.alive - признак что датчик живой. 1 - живой, 0 - не отвечает.
    5. Officeroom.TempHEX - цветовое представление температуры.
В классе Rooms создам новое свойство TempHEX. В него будет записываться HEX значение цвета. В свойстве Temperature укажем запускать метод при изменении onTempChanges и создадим этот метод
КодПоказать

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

// получить температуру
$x = $this->getProperty('Temperature');
// не больше и не меньше
if ($x<12) {$x=12;} elseif ($x>30) {$x=30;} 
// расчет величины цветовой шкалы
$x = round( ($x-12)*42,5 );
$hcolor = '#';
// расчет r
$y = $x-255;
if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;}
$y = dechex($y);
if (strlen($y) == 1) {$y = '0'.$y;}
$hcolor = $hcolor.$y;
// расчет g
$y = 255-$x;
if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;}
$y = dechex($y);
if (strlen($y) == 1) {$y = '0'.$y;}
$hcolor = $hcolor.$y;
// расчет b
$y = 765-$x;
if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;}
$y = dechex($y);
if (strlen($y) == 1) {$y = '0'.$y;}
$hcolor = $hcolor.$y;
// установить свойство цвета температуры
$this->setProperty('TempHEX', $hcolor); 
Теперь при каждом изменении свойства температуры будет рассчитываться HEX значение ее цвета для всех объектов комнат.
В коде элемента
<span style="text-shadow: 1px 1px 2px white;">%Officeroom.Temperature% ℃</span>
Атрибут style в этом теге задает тень для текста. При желании его можно убрать. А если нужно, отредактировать цвет. white - белый.
Вложения
Elements22-46-59.zip
(2.28 КБ) 386 скачиваний
За это сообщение автора Bagir поблагодарили (всего 6):
Alien (Чт май 07, 2015 10:19 am) • 1maikl (Вс фев 14, 2016 8:56 pm) • slgeo (Сб фев 20, 2016 10:03 pm) • neromih (Вс окт 29, 2017 8:55 pm) • TimonDK (Сб сен 15, 2018 12:38 pm) • vova-kit (Ср дек 25, 2019 12:53 am)
Рейтинг: 7.06%
Windows 7, HTTP, MegaD, Z-Wave, 1-Wire
1maikl
Сообщения: 29
Зарегистрирован: Сб янв 23, 2016 9:16 pm
Благодарил (а): 21 раз
Поблагодарили: 0

Re: Элемент сцены Температура

Сообщение 1maikl » Пн фев 15, 2016 4:23 pm

Настройка:

1. Поменять везде номер элемента на свой element_39. У имени f39 просто заменить цифру в двух местах.


Мужики, подскажите где должен находится element, какой тип файла, может быть есть образец элемента, прикрепите пожалуйста, что бы легче было понять как это работает. :roll:
В общем, на сцене кроме температуры ничего не отображается....
Alien
Сообщения: 190
Зарегистрирован: Пт дек 20, 2013 4:46 pm
Благодарил (а): 72 раза
Поблагодарили: 37 раз

Re: Элемент сцены Температура

Сообщение Alien » Пт фев 19, 2016 10:27 am

При редактировании элемента можно посмотреть его номер.
image1.png
image1.png (32.71 КБ) 16013 просмотров
За это сообщение автора Alien поблагодарил:
1maikl (Сб фев 20, 2016 7:12 am)
Рейтинг: 1.18%
Ubuntu на Banana pi M2U Connect
1maikl
Сообщения: 29
Зарегистрирован: Сб янв 23, 2016 9:16 pm
Благодарил (а): 21 раз
Поблагодарили: 0

Re: Элемент сцены Температура

Сообщение 1maikl » Пн фев 22, 2016 9:19 am

С температурой и градиентом разобрался, осталось разобраться с направлением измерения температуры ts_office.direction. Я так понимаю что это свойство объекта, но не пойму откуда он берёт данные, при помощи какого метода???? На сцене постоянно отображается красный кружок.Ткните пожалуйста где копнуть....
triada13
Сообщения: 242
Зарегистрирован: Вт мар 11, 2014 8:36 pm
Откуда: Челябинск
Благодарил (а): 107 раз
Поблагодарили: 7 раз

Re: Элемент сцены Температура

Сообщение triada13 » Пн фев 22, 2016 10:44 am

1maikl писал(а):С температурой и градиентом разобрался, осталось разобраться с направлением измерения температуры ts_office.direction. Я так понимаю что это свойство объекта, но не пойму откуда он берёт данные, при помощи какого метода???? На сцене постоянно отображается красный кружок.Ткните пожалуйста где копнуть....
Посмотри у bagir в Connecte.
Majordomo на Orange Pi Zero.
1maikl
Сообщения: 29
Зарегистрирован: Сб янв 23, 2016 9:16 pm
Благодарил (а): 21 раз
Поблагодарили: 0

Re: Элемент сцены Температура

Сообщение 1maikl » Пн фев 22, 2016 1:33 pm

Просмотрел, ничего о свойстве .direction не нашёл :roll:
triada13
Сообщения: 242
Зарегистрирован: Вт мар 11, 2014 8:36 pm
Откуда: Челябинск
Благодарил (а): 107 раз
Поблагодарили: 7 раз

Re: Элемент сцены Температура

Сообщение triada13 » Пн фев 22, 2016 1:54 pm

1maikl писал(а):Просмотрел, ничего о свойстве .direction не нашёл :roll:
Посмотрите, оно?(внизу):
СпойлерПоказать

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

$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("Y-m-d H:i:s",time()));
$this->setProperty("alive",1);
$ot=$this->object_title;
$alive_timeout=(int)$this->getProperty("aliveTimeOut");
if (!$alive_timeout) { $alive_timeout=12*60*60; }
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);

// Получение среднего значения из истории
//Получить id свойства
$prop_id=$this->getPropertyByName('status', $this->class_id, $this->id);
//Получаем VALUE_ID для следующей таблицы
$pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$this->id."'");
//Получаем средние значения температуры за последние 30 минут
$start_time=time()-30*60; // 30 минут
$arr_s = SQLSelectOne("SELECT avg(VALUE) as AVG_V FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>='".date('Y-m-d H:i:s', $start_time)."'");
$avg_s=round($arr_s[AVG_V], 1);

$s=$params['status'];
if (isset($s)) {
 // Если некорректные данные
 if (($s > 50) || ($s < -50)) { return; }
 // Записать в свойство объекта
 $this->setProperty('status',$s);
} else {
 // Для слинкованных свойств и запуска этого метода без передачи данных, взять их из свойства.
 $s = $this->getProperty('status');
}

$s=round($s, 1);

// Сравнение
if ($s-$avg_s > 0.5) {
 $d=1;
} elseif ($s-$avg_s < -0.5) {
 $d=-1;
} else {
 $d=0;
}

$this->setProperty('direction',$d);

// Передать данные слинкованной комнате
$linked_room=$this->getProperty("LinkedRoom");
if ($linked_room) { setGlobal($linked_room.'.Temperature', $s); }
Метод statusChanged, класс TempSensors
За это сообщение автора triada13 поблагодарил:
1maikl (Пн фев 22, 2016 2:35 pm)
Рейтинг: 1.18%
Majordomo на Orange Pi Zero.
1maikl
Сообщения: 29
Зарегистрирован: Сб янв 23, 2016 9:16 pm
Благодарил (а): 21 раз
Поблагодарили: 0

Re: Элемент сцены Температура

Сообщение 1maikl » Вт фев 23, 2016 11:00 am

Нет, ничего не получается. alive-всегда 1, независимо от того датчик подключен или нет. Значение свойства direction вообще не отображается....
Alien
Сообщения: 190
Зарегистрирован: Пт дек 20, 2013 4:46 pm
Благодарил (а): 72 раза
Поблагодарили: 37 раз

Re: Элемент сцены Температура

Сообщение Alien » Вт фев 23, 2016 3:22 pm

Видать не все правильно отрабатываете.
Смотрите в методы свои. Грубо говоря алгоритм должен быть такой:
1. Получение температуры откуда-то меняет свойство Температура объекта.
2. Изменение свойства Температура должно тянуть за собой выполнение метода с вычислением direction.
С alive аналогично - таймер обнуляется при изменении свойства.

Пример все-таки нужно смотреть у Bagir
За это сообщение автора Alien поблагодарил:
1maikl (Чт фев 25, 2016 1:55 pm)
Рейтинг: 1.18%
Ubuntu на Banana pi M2U Connect
1maikl
Сообщения: 29
Зарегистрирован: Сб янв 23, 2016 9:16 pm
Благодарил (а): 21 раз
Поблагодарили: 0

Re: Элемент сцены Температура

Сообщение 1maikl » Вт фев 23, 2016 6:01 pm

Голову уже сломал, не пойму где искать. Пробовал метод у Sergejey и у Bagir/. Да, кстати а в коде самого метода ничего не надо менять?
Вложения
CropImage.png
CropImage.png (9.21 КБ) 15790 просмотров
Ответить