Как вызывается метод statusUpdated у Devices? (2)
Модератор: immortal
-
- Сообщения: 102
- Зарегистрирован: Вт июл 17, 2018 10:19 am
- Благодарил (а): 23 раза
- Поблагодарили: 4 раза
Как вызывается метод statusUpdated у Devices? (2)
Прошу прощения, что дублирую тему. Прошлый раз мне отвечали не на поставленный вопрос, и проблему я так и не решил.
ПРОБЛЕМА: При пропадании данных от датчика (класс 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. Вот как найти откуда ещё есть вызов, зачем и почему?
ПРОБЛЕМА: При пропадании данных от датчика (класс 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. Вот как найти откуда ещё есть вызов, зачем и почему?
-
- Сообщения: 189
- Зарегистрирован: Сб окт 12, 2019 2:10 pm
- Благодарил (а): 6 раз
- Поблагодарили: 30 раз
Re: Как вызывается метод statusUpdated у Devices? (2)
У меня такая же беда только c Sonoff rf bridge, у которому привязаны радиокнопки, происходят сработки StatusUpdated в который я запихнул свои действия, хотя сам статус не меняется а менялся только StatusUpdatedText, пришлось городить костыль в создании нового свойства StatusOld и при реальном нажатии (когда реально меняется статус) заносить его ещё в StatusOld а в LogicAction сначала проверять Status<>StatusOld чтобы понять что это точно нажатие.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. Вот как найти откуда ещё есть вызов, зачем и почему?
Raspberry pi3, xiaomi, sonoff rf.
-
- Сообщения: 102
- Зарегистрирован: Вт июл 17, 2018 10:19 am
- Благодарил (а): 23 раза
- Поблагодарили: 4 раза
Re: Как вызывается метод statusUpdated у Devices? (2)
Ну, как обойти проблему понятно. Я могу сделать и так, например - при обновлении свойства Status вызывать свой метод, в котором выполнить свой код а затем уже стандартный StatusUpdated. И в своем методе я могу обновлять своё свойство какое-нибудь MyUpdatedText.
Хочется понять именно логику встроенного поведения, может я не знаю чего-то, что мне может быть полезно.
Хочется понять именно логику встроенного поведения, может я не знаю чего-то, что мне может быть полезно.
-
- Сообщения: 1554
- Зарегистрирован: Сб янв 13, 2018 5:00 pm
- Благодарил (а): 39 раз
- Поблагодарили: 574 раза
Re: Как вызывается метод statusUpdated у Devices? (2)
А зачем так странно делать?! Есть же $params['NEW_VALUE'] и $params['OLD_VALUE']. В StatusUpdated проверяешь что они разные и там же выполняешь нужное действиеfreesh писал(а): ↑Вт дек 17, 2019 12:21 pm
У меня такая же беда только c Sonoff rf bridge, у которому привязаны радиокнопки, происходят сработки StatusUpdated в который я запихнул свои действия, хотя сам статус не меняется а менялся только StatusUpdatedText, пришлось городить костыль в создании нового свойства StatusOld и при реальном нажатии (когда реально меняется статус) заносить его ещё в StatusOld а в LogicAction сначала проверять Status<>StatusOld чтобы понять что это точно нажатие.
-
- Сообщения: 1554
- Зарегистрирован: Сб янв 13, 2018 5:00 pm
- Благодарил (а): 39 раз
- Поблагодарили: 574 раза
Re: Как вызывается метод statusUpdated у Devices? (2)
UpdatedText это поле в которое вписывается когда последний раз сработал датчик (1 мин назад, 1 час назад и т.д.) Это сообщение которое выводится в ПУ, рядом с иконкой датчикаksv писал(а): ↑Вт дек 17, 2019 12:33 pmНу, как обойти проблему понятно. Я могу сделать и так, например - при обновлении свойства Status вызывать свой метод, в котором выполнить свой код а затем уже стандартный StatusUpdated. И в своем методе я могу обновлять своё свойство какое-нибудь MyUpdatedText.
Хочется понять именно логику встроенного поведения, может я не знаю чего-то, что мне может быть полезно.
Умер датчик или нет - хранится в поле alive, по идее оно сбрасывается таймером в 0, если в течение aliveTimeOut не было сообщений от датчика
-
- Сообщения: 189
- Зарегистрирован: Сб окт 12, 2019 2:10 pm
- Благодарил (а): 6 раз
- Поблагодарили: 30 раз
Re: Как вызывается метод statusUpdated у Devices? (2)
Да, а так можно я ж интересующийся нубяра какой костыль придумался, такой и реализовалfandaymon писал(а): ↑Вт дек 17, 2019 11:27 pmА зачем так странно делать?! Есть же $params['NEW_VALUE'] и $params['OLD_VALUE']. В StatusUpdated проверяешь что они разные и там же выполняешь нужное действиеfreesh писал(а): ↑Вт дек 17, 2019 12:21 pm
У меня такая же беда только c Sonoff rf bridge, у которому привязаны радиокнопки, происходят сработки StatusUpdated в который я запихнул свои действия, хотя сам статус не меняется а менялся только StatusUpdatedText, пришлось городить костыль в создании нового свойства StatusOld и при реальном нажатии (когда реально меняется статус) заносить его ещё в StatusOld а в LogicAction сначала проверять Status<>StatusOld чтобы понять что это точно нажатие.
Raspberry pi3, xiaomi, sonoff rf.
-
- Сообщения: 1554
- Зарегистрирован: Сб янв 13, 2018 5:00 pm
- Благодарил (а): 39 раз
- Поблагодарили: 574 раза
Re: Как вызывается метод statusUpdated у Devices? (2)
Так оно и должно обновляться . Сначала каждую минуту, потом каждые 5, потом каждый час и т.д.
-
- Сообщения: 102
- Зарегистрирован: Вт июл 17, 2018 10:19 am
- Благодарил (а): 23 раза
- Поблагодарили: 4 раза
Re: Как вызывается метод statusUpdated у Devices? (2)
Прочтите первый пост внимательнее, пожалуйста. Понятно, что оно должно обновляться. Потому что так написан код. Вопрос - зачем? Второй вопрос - через 20 часов оно должно перестать обновляться, это тоже следует из кода (если я конечно верно его понял). Не перестаёт. Почему?
-
- Сообщения: 1554
- Зарегистрирован: Сб янв 13, 2018 5:00 pm
- Благодарил (а): 39 раз
- Поблагодарили: 574 раза
Re: Как вызывается метод statusUpdated у Devices? (2)
Я внимательно прочитал. Говорю же - в этом свойстве хранится в виде текста сколько прошло времени с последней сработки датчика. Например сработал датчика двери, в свойстве будет только-что. Через минуту туда впишется текст 1 мин назад, через 2 - 2... И так далее, потом интервал перезаписываний свойства увеличивается, потом снова увеличивается и становится равным 1 часу.ksv писал(а): ↑Вт дек 17, 2019 11:57 pmПрочтите первый пост внимательнее, пожалуйста. Понятно, что оно должно обновляться. Потому что так написан код. Вопрос - зачем? Второй вопрос - через 20 часов оно должно перестать обновляться, это тоже следует из кода (если я конечно верно его понял). Не перестаёт. Почему?
Зачем это нужно я тоже объяснил - для того чтобы можно было при помощи веб-сокетов перерисовывать сколько прошло времени на веб-страницах в целом и в ПУ в частности
- Рейтинг: 1.16%