Страница 1 из 2
Как вызывается метод statusUpdated у Devices? (2)
Добавлено: Вт дек 17, 2019 12:13 pm
ksv
Прошу прощения, что дублирую тему. Прошлый раз мне отвечали не на поставленный вопрос, и проблему я так и не решил.
ПРОБЛЕМА: При пропадании данных от датчика (класс 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. Вот как найти откуда ещё есть вызов, зачем и почему?
Re: Как вызывается метод statusUpdated у Devices? (2)
Добавлено: Вт дек 17, 2019 12:21 pm
freesh
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 чтобы понять что это точно нажатие.
Re: Как вызывается метод statusUpdated у Devices? (2)
Добавлено: Вт дек 17, 2019 12:33 pm
ksv
Ну, как обойти проблему понятно. Я могу сделать и так, например - при обновлении свойства Status вызывать свой метод, в котором выполнить свой код а затем уже стандартный StatusUpdated. И в своем методе я могу обновлять своё свойство какое-нибудь MyUpdatedText.
Хочется понять именно логику встроенного поведения, может я не знаю чего-то, что мне может быть полезно.
Re: Как вызывается метод statusUpdated у Devices? (2)
Добавлено: Вт дек 17, 2019 11:27 pm
fandaymon
freesh писал(а): ↑Вт дек 17, 2019 12:21 pm
У меня такая же беда только c Sonoff rf bridge, у которому привязаны радиокнопки, происходят сработки StatusUpdated в который я запихнул свои действия,
хотя сам статус не меняется а менялся только StatusUpdatedText, пришлось городить костыль в создании нового свойства StatusOld и при реальном нажатии (когда реально меняется статус) заносить его ещё в StatusOld а в LogicAction сначала проверять Status<>StatusOld чтобы понять что это точно нажатие.
А зачем так странно делать?! Есть же $params['NEW_VALUE'] и $params['OLD_VALUE']. В StatusUpdated проверяешь что они разные и там же выполняешь нужное действие
Re: Как вызывается метод statusUpdated у Devices? (2)
Добавлено: Вт дек 17, 2019 11:36 pm
fandaymon
ksv писал(а): ↑Вт дек 17, 2019 12:33 pm
Ну, как обойти проблему понятно. Я могу сделать и так, например - при обновлении свойства Status вызывать свой метод, в котором выполнить свой код а затем уже стандартный StatusUpdated. И в своем методе я могу обновлять своё свойство какое-нибудь MyUpdatedText.
Хочется понять именно логику встроенного поведения, может я не знаю чего-то, что мне может быть полезно.
UpdatedText это поле в которое вписывается когда последний раз сработал датчик (1 мин назад, 1 час назад и т.д.) Это сообщение которое выводится в ПУ, рядом с иконкой датчика
Умер датчик или нет - хранится в поле alive, по идее оно сбрасывается таймером в 0, если в течение aliveTimeOut не было сообщений от датчика
Re: Как вызывается метод statusUpdated у Devices? (2)
Добавлено: Вт дек 17, 2019 11:50 pm
ksv
fandaymon писал(а): ↑Вт дек 17, 2019 11:36 pm
UpdatedText это поле в которое вписывается когда последний раз сработал датчик (1 мин назад, 1 час назад и т.д.)
ksv писал(а): ↑Вт дек 17, 2019 12:13 pm
ПРОБЛЕМА: При
пропадании данных от датчика (класс SDivices) его свойство UpdatedText
продолжает ежечасно обновляться.
ksv писал(а): ↑Вт дек 17, 2019 12:13 pm
ВОПРОС: Как найти все места, откуда может вызываться метод statusUpdated?
Re: Как вызывается метод statusUpdated у Devices? (2)
Добавлено: Вт дек 17, 2019 11:51 pm
freesh
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 проверяешь что они разные и там же выполняешь нужное действие
Да, а так можно

я ж интересующийся нубяра

какой костыль придумался, такой и реализовал
Re: Как вызывается метод statusUpdated у Devices? (2)
Добавлено: Вт дек 17, 2019 11:53 pm
fandaymon
ksv писал(а): ↑Вт дек 17, 2019 11:50 pm
ПРОБЛЕМА: При
пропадании данных от датчика (класс SDivices) его свойство UpdatedText
продолжает ежечасно обновляться.
Так оно и должно обновляться . Сначала каждую минуту, потом каждые 5, потом каждый час и т.д.
Re: Как вызывается метод statusUpdated у Devices? (2)
Добавлено: Вт дек 17, 2019 11:57 pm
ksv
fandaymon писал(а): ↑Вт дек 17, 2019 11:53 pm
Так оно и должно обновляться . Сначала каждую минуту, потом каждые 5, потом каждый час и т.д.
Прочтите первый пост внимательнее, пожалуйста. Понятно, что оно должно обновляться. Потому что так написан код. Вопрос - зачем? Второй вопрос - через 20 часов оно должно перестать обновляться, это тоже следует из кода (если я конечно верно его понял). Не перестаёт. Почему?
Re: Как вызывается метод statusUpdated у Devices? (2)
Добавлено: Ср дек 18, 2019 12:07 am
fandaymon
ksv писал(а): ↑Вт дек 17, 2019 11:57 pm
fandaymon писал(а): ↑Вт дек 17, 2019 11:53 pm
Так оно и должно обновляться . Сначала каждую минуту, потом каждые 5, потом каждый час и т.д.
Прочтите первый пост внимательнее, пожалуйста. Понятно, что оно должно обновляться. Потому что так написан код. Вопрос - зачем? Второй вопрос - через 20 часов оно должно перестать обновляться, это тоже следует из кода (если я конечно верно его понял). Не перестаёт. Почему?
Я внимательно прочитал. Говорю же - в этом свойстве хранится в виде текста сколько прошло времени с последней сработки датчика. Например сработал датчика двери, в свойстве будет только-что. Через минуту туда впишется текст 1 мин назад, через 2 - 2... И так далее, потом интервал перезаписываний свойства увеличивается, потом снова увеличивается и становится равным 1 часу.
Зачем это нужно я тоже объяснил - для того чтобы можно было при помощи веб-сокетов перерисовывать сколько прошло времени на веб-страницах в целом и в ПУ в частности