вызов метода при изменении свойства объекта

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

Модератор: immortal

Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: вызов метода при изменении свойства объекта

Сообщение tarasfrompir » Пн янв 27, 2020 11:44 pm

alexpzas писал(а):
Пн янв 27, 2020 11:41 pm
Всем привет, помогите плиз. Проблема в том, что на уровне класса в свойстве в поле - Запускать метод при изменении, выбрал нужный мне метод,(кстати свойство привязано к mqtt паблику), и теперь каждую секунду метод отрабатывает, хотя значение свойства не меняется. Я так понимаю это из за того , что каждую сек. обновляется состояние свойства, и хоть его значение не меняется, но МДМ понимает это по другому и вызывает метод. Как сделать так, чтобы метод вызывался только при смене значения свойства.
в начале метода вставь
if ($params['NEW_VALUE'] == $params['OLD_VALUE']) return;
За это сообщение автора tarasfrompir поблагодарили (всего 2):
alexpzas (Пн янв 27, 2020 11:53 pm) • Garik908 (Сб июн 20, 2020 11:36 am)
Рейтинг: 2.33%
Спасибо нам ПОМОЖЕТ..!
alexpzas
Сообщения: 25
Зарегистрирован: Пн авг 19, 2013 4:17 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: вызов метода при изменении свойства объекта

Сообщение alexpzas » Пн янв 27, 2020 11:55 pm

Вот код моего метода

if ($params['NEW_VALUE'] == $params['OLD_VALUE']) return;
if(gg('SensorHome.secure') == 1) {
say('Охрана on',2);
}
if(gg('SensorHome.secure') == 0) {
say('Охана off',2);
}

Но ситуация таже ((
alexpzas
Сообщения: 25
Зарегистрирован: Пн авг 19, 2013 4:17 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: вызов метода при изменении свойства объекта

Сообщение alexpzas » Вт янв 28, 2020 12:00 am

ага вроде разобрался, нужно было этод код вставить на уровне обьекта , а не класса.
andrusha7778
Сообщения: 85
Зарегистрирован: Сб авг 12, 2017 11:03 am
Благодарил (а): 15 раз
Поблагодарили: 3 раза

Re: вызов метода при изменении свойства объекта

Сообщение andrusha7778 » Пт май 21, 2021 12:23 pm

Подскажите пожалуйста, как при вызове метода при изменении свойств объекта понять, какой именно метод или модуль вызвал изменение этого свойства?
То есть задача примерно следующая: есть свойство объекта (целевая температура контура отопления), это свойство могут менять различные методы из разных модулей, в зависимости от этого необходимо реализовывать разную логику. Простой пример - на термостате на радиаторе выбираю необходимую Т отопления, эти данные попадают в свойство объекта Термостат.целеваятемпература, далее есть объект контур отопления у которого такое же свойство. Целевая температура контура отопления может меняться как термостатом, так и центральной панелью управления (другой объект другое устройство другой модуль). Поскольку за работу термостатов и центральной панели отвечают разные модули, то объекты для этих устройств тоже разные, а общий объект у них - контур отопления, свойство которого и надо менять с разных устройств.
fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: вызов метода при изменении свойства объекта

Сообщение fandaymon » Пт май 21, 2021 1:39 pm

andrusha7778 писал(а):
Пт май 21, 2021 12:23 pm
Подскажите пожалуйста, как при вызове метода при изменении свойств объекта понять, какой именно метод или модуль вызвал изменение этого свойства?
То есть задача примерно следующая: есть свойство объекта (целевая температура контура отопления), это свойство могут менять различные методы из разных модулей, в зависимости от этого необходимо реализовывать разную логику. Простой пример - на термостате на радиаторе выбираю необходимую Т отопления, эти данные попадают в свойство объекта Термостат.целеваятемпература, далее есть объект контур отопления у которого такое же свойство. Целевая температура контура отопления может меняться как термостатом, так и центральной панелью управления (другой объект другое устройство другой модуль). Поскольку за работу термостатов и центральной панели отвечают разные модули, то объекты для этих устройств тоже разные, а общий объект у них - контур отопления, свойство которого и надо менять с разных устройств.
Реализуй разную логику в тех разных местах, которые свойство меняют
За это сообщение автора fandaymon поблагодарил:
andrusha7778 (Пт май 21, 2021 6:49 pm)
Рейтинг: 1.16%
andrusha7778
Сообщения: 85
Зарегистрирован: Сб авг 12, 2017 11:03 am
Благодарил (а): 15 раз
Поблагодарили: 3 раза

Re: вызов метода при изменении свойства объекта

Сообщение andrusha7778 » Пт май 21, 2021 7:54 pm

В истории свойства объекта вижу столбец src, по данным из которого можно понять, что же являлось источником изменений этого свойства.
Дело в том, что при изменении свойства "целевая температура" работает один и тот же метод, который должен менять другие свойства у других объектов. Получается, что если в случае изменении свойства одним методом - методА (от другого объекта) нужна одна логика, а если свойство этого объекта поменял методБ - другая логика.
Непонятно, как делать логику в трех разных местах, если свойство объекта (целевая температура контура отопления) должна изменяться и с термостата и с панели управления контроллера и с веб морды, а последнее выставленное значение должно автоматически приезжать на все устройства (термостат и контроллер). При этом термостат и контроллер отопления никак не связаны, только через логическое устройство "контур отопления" в MD. В какую-то одну сторону вся система отлично работает.
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: вызов метода при изменении свойства объекта

Сообщение xor » Сб май 22, 2021 3:08 am

andrusha7778 писал(а):
Пт май 21, 2021 7:54 pm
В истории свойства объекта вижу столбец src, по данным из которого можно понять, что же являлось источником изменений этого свойства.
Дело в том, что при изменении свойства "целевая температура" работает один и тот же метод, который должен менять другие свойства у других объектов. Получается, что если в случае изменении свойства одним методом - методА (от другого объекта) нужна одна логика, а если свойство этого объекта поменял методБ - другая логика.
Непонятно, как делать логику в трех разных местах, если свойство объекта (целевая температура контура отопления) должна изменяться и с термостата и с панели управления контроллера и с веб морды, а последнее выставленное значение должно автоматически приезжать на все устройства (термостат и контроллер). При этом термостат и контроллер отопления никак не связаны, только через логическое устройство "контур отопления" в MD. В какую-то одну сторону вся система отлично работает.
а параметр SOURCE передается же в привязанный метод, наравне с NEW_VALUE и OLD_VALUE
и анализируйте $params['SOURCE'] в привязанном методе
За это сообщение автора xor поблагодарил:
andrusha7778 (Вс май 23, 2021 11:34 am)
Рейтинг: 1.16%
andrusha7778
Сообщения: 85
Зарегистрирован: Сб авг 12, 2017 11:03 am
Благодарил (а): 15 раз
Поблагодарили: 3 раза

Re: вызов метода при изменении свойства объекта

Сообщение andrusha7778 » Вс май 23, 2021 11:37 am

xor писал(а):
Сб май 22, 2021 3:08 am
а параметр SOURCE передается же в привязанный метод, наравне с NEW_VALUE и OLD_VALUE
и анализируйте $params['SOURCE'] в привязанном методе
Спасибо большое! Дело в том, что я ничего подобного на Wiki и в базе знаний не нашел. Буду пробовать!
UPD - попробовал, но всё не очень однозначно.
К примеру есть свойство TartgetTemp у объекта HeatingCircuit которое меняется модулем Zont. В модуле это свойство привязано к получаемым данным, всё ок.
При изменении этого свойства вызывается метод TargetTempChanged. Внутри этого метода прописал через say вывод $params['SOURCE'], однако получаю пустое значение. Подумал что может это массив, попробовал обработать его через print_r предварительно - получаю "1", а если через json_encode - то просто ""
Что должно быть внутри $params['SOURCE'] ?
Объекты или ссылки на них? Или если меняется значение из модуля напрямую (а не методом) то я ничего не получу?
Последний раз редактировалось andrusha7778 Вс май 23, 2021 11:53 am, всего редактировалось 1 раз.
Logrus
Сообщения: 2079
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: вызов метода при изменении свойства объекта

Сообщение Logrus » Вс май 23, 2021 11:47 am

andrusha7778 писал(а):
Вс май 23, 2021 11:37 am
xor писал(а):
Сб май 22, 2021 3:08 am
а параметр SOURCE передается же в привязанный метод, наравне с NEW_VALUE и OLD_VALUE
и анализируйте $params['SOURCE'] в привязанном методе
Спасибо большое! Дело в том, что я ничего подобного на Wiki и в базе знаний не нашел. Буду пробовать!
зато на форуме неоднократно и с примерами расписано
За это сообщение автора Logrus поблагодарил:
andrusha7778 (Вс май 23, 2021 11:55 am)
Рейтинг: 1.16%
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
andrusha7778
Сообщения: 85
Зарегистрирован: Сб авг 12, 2017 11:03 am
Благодарил (а): 15 раз
Поблагодарили: 3 раза

Re: вызов метода при изменении свойства объекта

Сообщение andrusha7778 » Вс май 23, 2021 11:55 am

Странно, при изменении через админку свойства объекта получаю в $params['SOURCE'] ссылку, однако если меняется из модуля то данные не приходят.
Ответить