Время изменения свойства

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

Модератор: immortal

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

Время изменения свойства

Сообщение Bagir » Вс авг 14, 2022 2:40 pm

Допустим у нас есть объект и у него есть некое свойство. Рассмотрим ситуацию на примере объекта комнаты класса Rooms. Теперь мы хотим узнать значение этого свойства. Всё просто, пишем код и получаем значение

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

$s=getGlobal('Livingroom.Temperature');
А теперь мы хотим узнать ещё и время, когда это свойство было изменено. Подобная необходимость может возникнуть, когда мы спрашиваем Алису "Какая температура в комнате?". Если свойство давно не обновлялось, то Алиса добавит, что данные уже не актуальны. Или мы считаем среднюю температуру по дому, беря среднее арифметическое температур всех объектов комнат. Но если, в какой то комнате у датчика сели батарейки, и он уже давно не передавал данные, правильнее будет не учитывать температуру этой комнаты.
У меня есть варианты, как можно получить желаемое. Причем стоит отметить, что на ряду со временем изменения свойства, нам скорее всего понадобится и его значение. И чтобы не долбить SQL повторными запросами, хотелось бы получить всё сразу.

Вариант, когда у нас есть имя объекта и имя свойства

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

$prop_id=getValueIdByName('Livingroom', 'Temperature');
$rec = SQLSelectOne("SELECT UNIX_TIMESTAMP(UPDATED) as UPDATED, VALUE FROM pvalues WHERE ID=".$prop_id);
echo 'VALUE = '.$rec['VALUE'].' UPDATED = '.$rec['UPDATED'];
Вариант, когда ранее в коде уже определен объект

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

$obj=getObject('KitchenArea');

$prop_id = $obj->getPropertyByName('Temperature', $obj->class_id, $obj->id);
$rec = SQLSelectOne('SELECT UNIX_TIMESTAMP(UPDATED) as UPDATED, VALUE FROM pvalues 
                     WHERE PROPERTY_ID = ' . (int)$prop_id . ' AND OBJECT_ID  = ' . (int)$obj->id);
echo 'VALUE = '.$rec['VALUE'].' UPDATED = '.$rec['UPDATED'];
Теперь сравнивая $rec['UPDATED'] с time() можно понять как давно это было. В примере ниже $i будет содержать количество секунд, прошедшее после изменения свойства

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

$i=time()-$rec['UPDATED'];
Может быть кто то предложит вариант лучше, или с использованием штатных функций?
Мой вариант функции можно посмотреть тут
Последний раз редактировалось Bagir Пн авг 15, 2022 3:03 pm, всего редактировалось 1 раз.
За это сообщение автора Bagir поблагодарил:
Chainik (Вс авг 14, 2022 3:07 pm)
Рейтинг: 1.18%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Logrus
Сообщения: 1933
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 305 раз
Поблагодарили: 415 раз

Re: Время изменения свойства

Сообщение Logrus » Вс авг 14, 2022 3:13 pm

у меня функция из пвалюес через вере пропнейм, там и индекс по нему
т.е. $время = функция(объект.свойство);

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

Re: Время изменения свойства

Сообщение Bagir » Вс авг 14, 2022 3:48 pm

Logrus писал(а):
Вс авг 14, 2022 3:13 pm
вообще правил помнится там много, еще когда с траблами в бд из за мусора столкнулся
оказалось не всегда верно заполнялось поле пропнейм
после починки через него очень удобно и много где изменено и дополнено
Если я правильно понял, то тоже было подобное. Выполнял следующее:
Заменить колонку PROPERTY_NAME именами из таблиц объектов и свойств
UPDATE `pvalues` SET `PROPERTY_NAME` = CONCAT( (
SELECT title
FROM `objects`
WHERE pvalues.OBJECT_ID = objects.id
), '.', (

SELECT title
FROM `properties`
WHERE pvalues.PROPERTY_ID = properties.id
) )
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

Re: Время изменения свойства

Сообщение Bagir » Вс авг 14, 2022 3:54 pm

Logrus писал(а):
Вс авг 14, 2022 3:13 pm
у меня функция из пвалюес через вере пропнейм, там и индекс по нему
Если можно, пример пожалуйста. Я всё думаю как бы одним SQL с подзапросом обойтись чтобы базу не долбить.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Logrus
Сообщения: 1933
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 305 раз
Поблагодарили: 415 раз

Re: Время изменения свойства

Сообщение Logrus » Вс авг 14, 2022 4:44 pm

Bagir писал(а):
Вс авг 14, 2022 3:54 pm
Logrus писал(а):
Вс авг 14, 2022 3:13 pm
у меня функция из пвалюес через вере пропнейм, там и индекс по нему
Если можно, пример пожалуйста. Я всё думаю как бы одним SQL с подзапросом обойтись чтобы базу не долбить.
банальный селект без подзапросов, еще и поиск по полю с индексом

в пропнейм запись объект.свойство
т.е. $время = функция(объект.свойство);
где функция из пвалюес через вере пропнейм, там и индекс по нему
и возвращает преобразованное в таймштамп поле апдейт

ну и при создании классового свойства создаются записи в пвалюес сразу на все объекты класса
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Logrus
Сообщения: 1933
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 305 раз
Поблагодарили: 415 раз

Re: Время изменения свойства

Сообщение Logrus » Вс авг 14, 2022 5:01 pm

вообще то вопрос намного ширше и глубже
вот про правильную и верную и вовремя запись пропнейм подняли
а можно посмотреть в сторону кеш валуес и хранения апдейт там, но это потянет за собой такую кучу переделок, что ой (а там это ой ой ой такого понахреновертили абсолютно не задумываясь как оно все вместе нормально будет работать и дальше это развивать), хотя если продумывать архитектуру ядра, то такого надо переделать кучу

а дальше ты в исторические заглянешь, и возможно и их перепишешь и т.д. :)
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
xor
Сообщения: 1914
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 260 раз
Поблагодарили: 592 раза

Re: Время изменения свойства

Сообщение xor » Вс авг 14, 2022 6:20 pm

Bagir писал(а):
Вс авг 14, 2022 2:40 pm
Допустим у нас есть объект и у него есть некое свойство. Рассмотрим ситуацию на примере объекта комнаты класса Rooms. Теперь мы хотим узнать значение этого свойства. Всё просто, пишем код и получаем значение

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

$s=getGlobal('Livingroom.Temperature');
А теперь мы хотим узнать ещё и время, когда это свойство было изменено. Подобная необходимость может возникнуть, когда мы спрашиваем Алису "Какая температура в комнате?". Если свойство давно не обновлялось, то Алиса добавит, что данные уже не актуальны. Или мы считаем среднюю температуру по дому, беря среднее арифметическое температур всех объектов комнат. Но если, в какой то комнате у датчика сели батарейки, и он уже давно не передавал данные, правильнее будет не учитывать температуру этой комнаты.
У меня есть варианты, как можно получить желаемое. Причем стоит отметить, что на ряду со временем изменения свойства, нам скорее всего понадобится и его значение. И чтобы не долбить SQL повторными запросами, хотелось бы получить всё сразу.

Вариант, когда у нас есть имя объекта и имя свойства

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

$prop_id=getValueIdByName('Livingroom', 'Temperature');
$rec = SQLSelectOne("SELECT UNIX_TIMESTAMP(UPDATED) as UPDATED, VALUE FROM pvalues WHERE ID=".$prop_id);
echo 'VALUE = '.$rec['VALUE'].' UPDATED = '.$rec['UPDATED'];
Вариант, когда ранее в коде уже определен объект

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

$obj=getObject('KitchenArea');

$prop_id = $obj->getPropertyByName('Temperature', $obj->class_id, $obj->id);
$rec = SQLSelectOne('SELECT UNIX_TIMESTAMP(UPDATED) as UPDATED, VALUE FROM pvalues 
                     WHERE PROPERTY_ID = ' . (int)$prop_id . ' AND OBJECT_ID  = ' . (int)$obj->id);
echo 'VALUE = '.$rec['VALUE'].' UPDATED = '.$rec['UPDATED'];
Теперь сравнивая $rec['UPDATED'] с time() можно понять как давно это было. В примере ниже $i будет содержать количество секунд, прошедшее после изменения свойства

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

$i=time()-$rec['UPDATED'];
Может быть кто то предложит вариант лучше, или с использованием штатных функций?
функцию свою написать, типа getGlobalWithUpdated, чтобы массив возвращала значение/обновление. как, например, getHistory
Аватара пользователя
xor
Сообщения: 1914
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 260 раз
Поблагодарили: 592 раза

Re: Время изменения свойства

Сообщение xor » Вс авг 14, 2022 6:36 pm

ну а так, конечно, вводят свойства нужному объекту, например, lastUpdated. но это дополнительное чтение и дублирование того же updated))
Logrus
Сообщения: 1933
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 305 раз
Поблагодарили: 415 раз

Re: Время изменения свойства

Сообщение Logrus » Вс авг 14, 2022 8:02 pm

xor писал(а):
Вс авг 14, 2022 6:36 pm
ну а так, конечно, вводят свойства нужному объекту, например, lastUpdated. но это дополнительное чтение и дублирование того же updated))
а я вот даже не помню где и зачем нужно было читать время обновления свойства
и зачем делал функцию
помню что понадобилась (это и к теме времени в кеш валуес, оно в пма конечно удобно смотреть в табличке, но и излишне)

а так используя ивенты покрываются 99% таких хотелок причем без дублирующих свойств
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
xor
Сообщения: 1914
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 260 раз
Поблагодарили: 592 раза

Re: Время изменения свойства

Сообщение xor » Вс авг 14, 2022 8:47 pm

Logrus писал(а):
Вс авг 14, 2022 8:02 pm
xor писал(а):
Вс авг 14, 2022 6:36 pm
ну а так, конечно, вводят свойства нужному объекту, например, lastUpdated. но это дополнительное чтение и дублирование того же updated))
а я вот даже не помню где и зачем нужно было читать время обновления свойства
и зачем делал функцию
помню что понадобилась (это и к теме времени в кеш валуес, оно в пма конечно удобно смотреть в табличке, но и излишне)

а так используя ивенты покрываются 99% таких хотелок причем без дублирующих свойств
в счетчиках?
Ответить