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

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

Добавлено: Вс авг 14, 2022 2:40 pm
Bagir
Допустим у нас есть объект и у него есть некое свойство. Рассмотрим ситуацию на примере объекта комнаты класса 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'];
Может быть кто то предложит вариант лучше, или с использованием штатных функций?
Мой вариант функции можно посмотреть тут

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

Добавлено: Вс авг 14, 2022 3:13 pm
Logrus
у меня функция из пвалюес через вере пропнейм, там и индекс по нему
т.е. $время = функция(объект.свойство);

вообще правил помнится там много, еще когда с траблами в бд из за мусора столкнулся
оказалось не всегда верно заполнялось поле пропнейм
после починки через него очень удобно и много где изменено и дополнено

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

Добавлено: Вс авг 14, 2022 3:48 pm
Bagir
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
) )

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

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

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

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

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

ну и при создании классового свойства создаются записи в пвалюес сразу на все объекты класса

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

Добавлено: Вс авг 14, 2022 5:01 pm
Logrus
вообще то вопрос намного ширше и глубже
вот про правильную и верную и вовремя запись пропнейм подняли
а можно посмотреть в сторону кеш валуес и хранения апдейт там, но это потянет за собой такую кучу переделок, что ой (а там это ой ой ой такого понахреновертили абсолютно не задумываясь как оно все вместе нормально будет работать и дальше это развивать), хотя если продумывать архитектуру ядра, то такого надо переделать кучу

а дальше ты в исторические заглянешь, и возможно и их перепишешь и т.д. :)

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

Добавлено: Вс авг 14, 2022 6:20 pm
xor
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

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

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

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

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

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

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

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

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