Как вызывается метод statusUpdated у Devices? (2)

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

Модератор: immortal

ksv
Сообщения: 102
Зарегистрирован: Вт июл 17, 2018 10:19 am
Благодарил (а): 23 раза
Поблагодарили: 4 раза

Как вызывается метод statusUpdated у Devices? (2)

Сообщение ksv » Вт дек 17, 2019 12:13 pm

Прошу прощения, что дублирую тему. Прошлый раз мне отвечали не на поставленный вопрос, и проблему я так и не решил.

ПРОБЛЕМА: При пропадании данных от датчика (класс SDivices) его свойство UpdatedText продолжает ежечасно обновляться. В итоге я не вижу, что датчик умер.

ВОПРОС: Как найти все места, откуда может вызываться метод statusUpdated?

Фактические наблюдения.
Датчик подключен по MQTT, где по времени последнего сообщения видно, что они давно перестали приходить.
Свойство Status у объекта класса SDevices действительно перестаёт обновляться, его текст не меняется (а при живом датчике должен).
Но свойство updatedText продолжает ежечасно обновляться, как будто датчик жив и раз в час отвечает. Это неверное логическое поведение с моей точки зрения.

Что удалось выяснить.
В X-Ray Timers я вижу, что вызов метода setUpdatedText действительно запланирован и вызывается ежечасно. Зачем?
При обновлении свойства Status вызывается метод StatusUpdated, который исполняет скрипт SDevices_statusUpdated.php. В теле скрипта я вижу вызов метода setUpdatedText, который выполняет скрипт SDevices_setUpdatedText.php. В теле этого скрипта я вижу что он самостоятельно планирует вызов самого себя по таймеру, что я и вижу в X-Ray Timers. Зачем это делать? Опять непонятно. Также из кода ясно, что планирование самовызова будет продолжаться в течение 20 часов после последнего обновления данных (20*60*60), после чего вызов по идее должен прекратиться. Но он не прекращается. А это значит, что $passed всегда < 20*60*60, а это в свою очередь значит, что свойство Updated продолжает обновляться. А обновляется оно в SDevices_statusUpdated.php, значит его кто-то вызывает. Либо где-то ещё вызывается метод statusUpdated, либо где-то есть иньекция скрипта SDevices_statusUpdated.php. Вот как найти откуда ещё есть вызов, зачем и почему?
freesh
Сообщения: 189
Зарегистрирован: Сб окт 12, 2019 2:10 pm
Благодарил (а): 6 раз
Поблагодарили: 30 раз

Re: Как вызывается метод statusUpdated у Devices? (2)

Сообщение freesh » Вт дек 17, 2019 12:21 pm

ksv писал(а):
Вт дек 17, 2019 12:13 pm
Прошу прощения, что дублирую тему. Прошлый раз мне отвечали не на поставленный вопрос, и проблему я так и не решил.

ПРОБЛЕМА: При пропадании данных от датчика (класс SDivices) его свойство UpdatedText продолжает ежечасно обновляться. В итоге я не вижу, что датчик умер.

ВОПРОС: Как найти все места, откуда может вызываться метод statusUpdated?

Фактические наблюдения.
Датчик подключен по MQTT, где по времени последнего сообщения видно, что они давно перестали приходить.
Свойство Status у объекта класса SDevices действительно перестаёт обновляться, его текст не меняется (а при живом датчике должен).
Но свойство updatedText продолжает ежечасно обновляться, как будто датчик жив и раз в час отвечает. Это неверное логическое поведение с моей точки зрения.

Что удалось выяснить.
В X-Ray Timers я вижу, что вызов метода setUpdatedText действительно запланирован и вызывается ежечасно. Зачем?
При обновлении свойства Status вызывается метод StatusUpdated, который исполняет скрипт SDevices_statusUpdated.php. В теле скрипта я вижу вызов метода setUpdatedText, который выполняет скрипт SDevices_setUpdatedText.php. В теле этого скрипта я вижу что он самостоятельно планирует вызов самого себя по таймеру, что я и вижу в X-Ray Timers. Зачем это делать? Опять непонятно. Также из кода ясно, что планирование самовызова будет продолжаться в течение 20 часов после последнего обновления данных (20*60*60), после чего вызов по идее должен прекратиться. Но он не прекращается. А это значит, что $passed всегда < 20*60*60, а это в свою очередь значит, что свойство Updated продолжает обновляться. А обновляется оно в SDevices_statusUpdated.php, значит его кто-то вызывает. Либо где-то ещё вызывается метод statusUpdated, либо где-то есть иньекция скрипта SDevices_statusUpdated.php. Вот как найти откуда ещё есть вызов, зачем и почему?
У меня такая же беда только c Sonoff rf bridge, у которому привязаны радиокнопки, происходят сработки StatusUpdated в который я запихнул свои действия, хотя сам статус не меняется а менялся только StatusUpdatedText, пришлось городить костыль в создании нового свойства StatusOld и при реальном нажатии (когда реально меняется статус) заносить его ещё в StatusOld а в LogicAction сначала проверять Status<>StatusOld чтобы понять что это точно нажатие.
Raspberry pi3, xiaomi, sonoff rf.
ksv
Сообщения: 102
Зарегистрирован: Вт июл 17, 2018 10:19 am
Благодарил (а): 23 раза
Поблагодарили: 4 раза

Re: Как вызывается метод statusUpdated у Devices? (2)

Сообщение ksv » Вт дек 17, 2019 12:33 pm

Ну, как обойти проблему понятно. Я могу сделать и так, например - при обновлении свойства Status вызывать свой метод, в котором выполнить свой код а затем уже стандартный StatusUpdated. И в своем методе я могу обновлять своё свойство какое-нибудь MyUpdatedText.

Хочется понять именно логику встроенного поведения, может я не знаю чего-то, что мне может быть полезно.
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Как вызывается метод statusUpdated у Devices? (2)

Сообщение fandaymon » Вт дек 17, 2019 11:27 pm

freesh писал(а):
Вт дек 17, 2019 12:21 pm

У меня такая же беда только c Sonoff rf bridge, у которому привязаны радиокнопки, происходят сработки StatusUpdated в который я запихнул свои действия, хотя сам статус не меняется а менялся только StatusUpdatedText, пришлось городить костыль в создании нового свойства StatusOld и при реальном нажатии (когда реально меняется статус) заносить его ещё в StatusOld а в LogicAction сначала проверять Status<>StatusOld чтобы понять что это точно нажатие.
А зачем так странно делать?! Есть же $params['NEW_VALUE'] и $params['OLD_VALUE']. В StatusUpdated проверяешь что они разные и там же выполняешь нужное действие
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Как вызывается метод statusUpdated у Devices? (2)

Сообщение fandaymon » Вт дек 17, 2019 11:36 pm

ksv писал(а):
Вт дек 17, 2019 12:33 pm
Ну, как обойти проблему понятно. Я могу сделать и так, например - при обновлении свойства Status вызывать свой метод, в котором выполнить свой код а затем уже стандартный StatusUpdated. И в своем методе я могу обновлять своё свойство какое-нибудь MyUpdatedText.

Хочется понять именно логику встроенного поведения, может я не знаю чего-то, что мне может быть полезно.
UpdatedText это поле в которое вписывается когда последний раз сработал датчик (1 мин назад, 1 час назад и т.д.) Это сообщение которое выводится в ПУ, рядом с иконкой датчика
Умер датчик или нет - хранится в поле alive, по идее оно сбрасывается таймером в 0, если в течение aliveTimeOut не было сообщений от датчика
ksv
Сообщения: 102
Зарегистрирован: Вт июл 17, 2018 10:19 am
Благодарил (а): 23 раза
Поблагодарили: 4 раза

Re: Как вызывается метод statusUpdated у Devices? (2)

Сообщение ksv » Вт дек 17, 2019 11:50 pm

fandaymon писал(а):
Вт дек 17, 2019 11:36 pm
UpdatedText это поле в которое вписывается когда последний раз сработал датчик (1 мин назад, 1 час назад и т.д.)
ksv писал(а):
Вт дек 17, 2019 12:13 pm
ПРОБЛЕМА: При пропадании данных от датчика (класс SDivices) его свойство UpdatedText продолжает ежечасно обновляться.
ksv писал(а):
Вт дек 17, 2019 12:13 pm
ВОПРОС: Как найти все места, откуда может вызываться метод statusUpdated?
freesh
Сообщения: 189
Зарегистрирован: Сб окт 12, 2019 2:10 pm
Благодарил (а): 6 раз
Поблагодарили: 30 раз

Re: Как вызывается метод statusUpdated у Devices? (2)

Сообщение freesh » Вт дек 17, 2019 11:51 pm

fandaymon писал(а):
Вт дек 17, 2019 11:27 pm
freesh писал(а):
Вт дек 17, 2019 12:21 pm

У меня такая же беда только c Sonoff rf bridge, у которому привязаны радиокнопки, происходят сработки StatusUpdated в который я запихнул свои действия, хотя сам статус не меняется а менялся только StatusUpdatedText, пришлось городить костыль в создании нового свойства StatusOld и при реальном нажатии (когда реально меняется статус) заносить его ещё в StatusOld а в LogicAction сначала проверять Status<>StatusOld чтобы понять что это точно нажатие.
А зачем так странно делать?! Есть же $params['NEW_VALUE'] и $params['OLD_VALUE']. В StatusUpdated проверяешь что они разные и там же выполняешь нужное действие
Да, а так можно :oops: я ж интересующийся нубяра :) какой костыль придумался, такой и реализовал
Raspberry pi3, xiaomi, sonoff rf.
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Как вызывается метод statusUpdated у Devices? (2)

Сообщение fandaymon » Вт дек 17, 2019 11:53 pm

ksv писал(а):
Вт дек 17, 2019 11:50 pm
ПРОБЛЕМА: При пропадании данных от датчика (класс SDivices) его свойство UpdatedText продолжает ежечасно обновляться.
Так оно и должно обновляться . Сначала каждую минуту, потом каждые 5, потом каждый час и т.д.
ksv
Сообщения: 102
Зарегистрирован: Вт июл 17, 2018 10:19 am
Благодарил (а): 23 раза
Поблагодарили: 4 раза

Re: Как вызывается метод statusUpdated у Devices? (2)

Сообщение ksv » Вт дек 17, 2019 11:57 pm

fandaymon писал(а):
Вт дек 17, 2019 11:53 pm
Так оно и должно обновляться . Сначала каждую минуту, потом каждые 5, потом каждый час и т.д.
Прочтите первый пост внимательнее, пожалуйста. Понятно, что оно должно обновляться. Потому что так написан код. Вопрос - зачем? Второй вопрос - через 20 часов оно должно перестать обновляться, это тоже следует из кода (если я конечно верно его понял). Не перестаёт. Почему?
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Как вызывается метод statusUpdated у Devices? (2)

Сообщение fandaymon » Ср дек 18, 2019 12:07 am

ksv писал(а):
Вт дек 17, 2019 11:57 pm
fandaymon писал(а):
Вт дек 17, 2019 11:53 pm
Так оно и должно обновляться . Сначала каждую минуту, потом каждые 5, потом каждый час и т.д.
Прочтите первый пост внимательнее, пожалуйста. Понятно, что оно должно обновляться. Потому что так написан код. Вопрос - зачем? Второй вопрос - через 20 часов оно должно перестать обновляться, это тоже следует из кода (если я конечно верно его понял). Не перестаёт. Почему?
Я внимательно прочитал. Говорю же - в этом свойстве хранится в виде текста сколько прошло времени с последней сработки датчика. Например сработал датчика двери, в свойстве будет только-что. Через минуту туда впишется текст 1 мин назад, через 2 - 2... И так далее, потом интервал перезаписываний свойства увеличивается, потом снова увеличивается и становится равным 1 часу.
Зачем это нужно я тоже объяснил - для того чтобы можно было при помощи веб-сокетов перерисовывать сколько прошло времени на веб-страницах в целом и в ПУ в частности
За это сообщение автора fandaymon поблагодарил:
ksv (Ср дек 18, 2019 1:06 am)
Рейтинг: 1.16%
Ответить