Время изменения свойства
Добавлено: Вс авг 14, 2022 2:40 pm
Допустим у нас есть объект и у него есть некое свойство. Рассмотрим ситуацию на примере объекта комнаты класса Rooms. Теперь мы хотим узнать значение этого свойства. Всё просто, пишем код и получаем значение
А теперь мы хотим узнать ещё и время, когда это свойство было изменено. Подобная необходимость может возникнуть, когда мы спрашиваем Алису "Какая температура в комнате?". Если свойство давно не обновлялось, то Алиса добавит, что данные уже не актуальны. Или мы считаем среднюю температуру по дому, беря среднее арифметическое температур всех объектов комнат. Но если, в какой то комнате у датчика сели батарейки, и он уже давно не передавал данные, правильнее будет не учитывать температуру этой комнаты.
У меня есть варианты, как можно получить желаемое. Причем стоит отметить, что на ряду со временем изменения свойства, нам скорее всего понадобится и его значение. И чтобы не долбить SQL повторными запросами, хотелось бы получить всё сразу.
Вариант, когда у нас есть имя объекта и имя свойства
Вариант, когда ранее в коде уже определен объект
Теперь сравнивая $rec['UPDATED'] с time() можно понять как давно это было. В примере ниже $i будет содержать количество секунд, прошедшее после изменения свойства
Может быть кто то предложит вариант лучше, или с использованием штатных функций?
Мой вариант функции можно посмотреть тут
Код: Выделить всё
$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'];
Код: Выделить всё
$i=time()-$rec['UPDATED'];
Мой вариант функции можно посмотреть тут