Помощь в php

Если вы только начинаете осваивать систему MajorDoMo и чего-то не знаете или не можете понять, то задавайте свои вопросы в этой ветке.

Модератор: immortal

Ответить
IrisKo
Сообщения: 50
Зарегистрирован: Пт фев 15, 2019 12:19 pm
Благодарил (а): 16 раз
Поблагодарили: 1 раз

Помощь в php

Сообщение IrisKo » Сб авг 24, 2019 3:17 pm

Я не очень опытный программист если можно так сказать :) и поэтому возник вопрос каким образом организовать выполнение кода при смене одного свойства на другое. Например есть у меня робот пылесос который имеет свойство "mode" в которое записываются цифры в зависимости от того что он сейчас делает. Когда пылесосит свойство принимает значение "5", когда заряжается свойство принимает значение "8". Так вот хотелось бы как то прописать в коде следующее:
Если свойство меняется с 5 на 8 то сообщить "уборка закончена", если свойство меняется с 8 на 5 то сообщить "началась уборка"...и так далее.
Или например еще вариант использования для юзеров и свойства "расстояние от дома". Если значение свойства уменьшается, то юзер приближается к дому и запускаются определенные сценарии - включается кондиционер, чайник, музыка и феерверки :), а если значение свойства увеличивается то юзер уезжает и все выключается...
Вариантов применения много но вот не знаю как прописать в php именно изменение конкретных значении свойства в течении времени. Или например провести сравнение предыдущего значения свойства с текущим, какой командой?
fandaymon
Сообщения: 1018
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 33 раза
Поблагодарили: 412 раз

Re: Помощь в php

Сообщение fandaymon » Сб авг 24, 2019 3:59 pm

php тут в принципе не при чём. Первая задача решается при помощи метода связанного с изменением свойства. Объект пылесос со свойством mode принадлежит к какому-то классу объектов, ну например класс называется Пылесосы. В меню Объекты находим это класс, выбираем редактировать, выбираем вкладку - Методы, добавляем метод, например ModeChanged и вписываем в этом метод примерно такой код

if ($params['OLD_VALUE']==5 and $params['NEW_VALUE']==8) {
say('Уборка закончена');
}

if ($params['OLD_VALUE']==8 and $params['NEW_VALUE']==5) {
say('Уборка началась');
}

Сохраняем.
Далее выбираем вкладку Свойства
выбираем редактировать наше свойство Mode и в комбобоксе Запускать метод при изменении - выбрать наш новый метод - ModeChanged. Сохранить. Ну и в принципе всё.

Теперь когда у нашего объекта Пылесос меняется свойство Mode, то будет вызываться метод ModeChanged c параметрами OLD_VALUE, где будет хранится наше старое значение свойства и NEW_VALUE, где будет хранится новое значение.

Более того - сообщения будут выдаваться и если добавить ещё какой-нибудь объект Пылесос 1, принадлежащий к классу Пылесосы.

Если нам нужны разные реакции для разных пылесосов, то можно зайти в методы нашего объекта и теперь там появился метод ModeChanged - в его настройках можно вписать какой-то другой код и выбрать - выполнять ли родительский код (тот код который мы записали для класса)
За это сообщение автора fandaymon поблагодарили (всего 2):
IrisKo (Сб авг 24, 2019 5:21 pm) • Bagir (Сб май 23, 2020 1:38 pm)
Рейтинг: 2.47%
IrisKo
Сообщения: 50
Зарегистрирован: Пт фев 15, 2019 12:19 pm
Благодарил (а): 16 раз
Поблагодарили: 1 раз

Re: Помощь в php

Сообщение IrisKo » Сб авг 24, 2019 5:21 pm

О спасибо огромное. Я как раз не знала что есть такая фишка как $params['OLD_VALUE'] и $params['NEW_VALUE']. О том что можно запускать метод при изменении свойства была вкурсе, а вот про то что можно выхватить как то значение свойства которое было и которое стало не знала :)
Logrus
Сообщения: 1583
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 276 раз
Поблагодарили: 311 раз

Re: Помощь в php

Сообщение Logrus » Сб авг 24, 2019 5:32 pm

а параметры очень полезны, для попробовать

//$params['ORIGINAL_OBJECT_TITLE'] //имя объекта
//$params['PROPERTY'] //имя свойства вызвавшего по изменению метод (к примеру темп контроль может вызываться изменением температуры, уставок - оные можно и динамически менять, режимов работы, а в методе это обрабатывать)
//$params['SOURCE'] //4-й аргумент в сетглобал или сейчас юрл кто вызвал и с какими параметрами
//$params['OLD_VALUE']
//$params['NEW_VALUE']

//DebMes(json_encode($this));
//DebMes(json_encode($params));

//DebMes(gr('NEW_VALUE')); //или любой
Последний раз редактировалось Logrus Сб май 23, 2020 5:42 pm, всего редактировалось 1 раз.
За это сообщение автора Logrus поблагодарили (всего 9):
Chainik (Сб авг 24, 2019 5:43 pm) • IrisKo (Пт авг 30, 2019 11:32 am) • 2007-i (Вс сен 01, 2019 12:31 am) • ImHuman (Вт сен 10, 2019 5:58 pm) • Mavric (Ср сен 18, 2019 8:09 pm) • Bagir (Сб май 23, 2020 1:39 pm) • astotskiy (Сб май 23, 2020 5:47 pm) • SmoKE_xDDD (Сб май 23, 2020 10:20 pm) • Yashalta (Вс май 24, 2020 9:08 pm)
Рейтинг: 11.11%
Мой CONNECT | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо - ТАМ =>
Аватара пользователя
Bagir
Сообщения: 1407
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 181 раз
Поблагодарили: 304 раза

Re: Помощь в php

Сообщение Bagir » Сб май 23, 2020 1:46 pm

Спасибо и от меня. Я тоже не знал, что при вызове метода по изменению свойства объекта массив $params такой богатый. Надо будет где то обязательно это попробовать.
И мне ещё очень интересно, что за пылесос и каким способом получаем от него статусы. Мой жужик не особо общителен, и всё закончилось микро выключателем, приклеенным к базе.
Windows XP, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Logrus
Сообщения: 1583
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 276 раз
Поблагодарили: 311 раз

Re: Помощь в php

Сообщение Logrus » Сб май 23, 2020 5:40 pm

//DebMes(json_encode(get_defined_vars()));
это побогаче будет, а параметры обязательно надо использовать, а не лезть повторно в бд
Снимок.PNG
Снимок.PNG (92.64 КБ) 283 просмотра
Мой CONNECT | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо - ТАМ =>
Yashalta
Сообщения: 291
Зарегистрирован: Вс май 20, 2018 9:27 am
Благодарил (а): 142 раза
Поблагодарили: 17 раз

Re: Помощь в php

Сообщение Yashalta » Вс май 24, 2020 11:09 pm

Logrus писал(а):
Сб авг 24, 2019 5:32 pm
а параметры очень полезны, для попробовать

//$params['ORIGINAL_OBJECT_TITLE'] //имя объекта
//$params['PROPERTY'] //имя свойства вызвавшего по изменению метод (к примеру темп контроль может вызываться изменением температуры, уставок - оные можно и динамически менять, режимов работы, а в методе это обрабатывать)
//$params['SOURCE'] //4-й аргумент в сетглобал или сейчас юрл кто вызвал и с какими параметрами
//$params['OLD_VALUE']
//$params['NEW_VALUE']

//DebMes(json_encode($this));
//DebMes(json_encode($params));

//DebMes(gr('NEW_VALUE')); //или любой
А можно для чайников, поподробнее желательно с примерами! Я не понимаю для чего это но, чуйка подсказывает, что это мне нужно!
я тут с трудом осилил только два параметра $params['OLD_VALUE'] и $params['NEW_VALUE']!
ниже мой пример
я взял код метода термостата от сюда viewtopic.php?f=5&t=3003&hilit=AddSched ... =20#p34480
и переделал его с использованием для меня новых параметров $params['OLD_VALUE'] и $params['NEW_VALUE']!

Код: Выделить всё

if ($params['OLD_VALUE']<=($this->getProperty('need_temp')) and $params['NEW_VALUE']>=($this->getProperty('need_temp'))) {
say('Включаю охлаждение');
say('Текущая температура '.$this->getProperty('current_temp').' Нужная вам температура '.$this->getProperty('need_temp').".");
}

if ($params['OLD_VALUE']>=($this->getProperty('need_temp')) and $params['NEW_VALUE']<=($this->getProperty('need_temp'))) {
say('Включаю обогрев');
say('Текущая температура '.$this->getProperty('current_temp').' Нужная вам температура '.$this->getProperty('need_temp').".");
}
Я токое же решение делал павда код в 2 раза длиннее!
А там еще такие параметры есть как $params['ORIGINAL_OBJECT_TITLE'], $params['PROPERTY'], DebMes(json_encode($this));, DebMes(json_encode($params));, DebMes(gr('NEW_VALUE')); которые даже в не представляю как использовать в коде!
подскажите, а?!?!
Аватара пользователя
SmoKE_xDDD
Сообщения: 470
Зарегистрирован: Ср апр 17, 2019 5:00 pm
Благодарил (а): 61 раз
Поблагодарили: 264 раза

Re: Помощь в php

Сообщение SmoKE_xDDD » Вс май 24, 2020 11:20 pm

Yashalta писал(а):
Вс май 24, 2020 11:09 pm
Logrus писал(а):
Сб авг 24, 2019 5:32 pm
а параметры очень полезны, для попробовать

//$params['ORIGINAL_OBJECT_TITLE'] //имя объекта
//$params['PROPERTY'] //имя свойства вызвавшего по изменению метод (к примеру темп контроль может вызываться изменением температуры, уставок - оные можно и динамически менять, режимов работы, а в методе это обрабатывать)
//$params['SOURCE'] //4-й аргумент в сетглобал или сейчас юрл кто вызвал и с какими параметрами
//$params['OLD_VALUE']
//$params['NEW_VALUE']

//DebMes(json_encode($this));
//DebMes(json_encode($params));

//DebMes(gr('NEW_VALUE')); //или любой
А можно для чайников, поподробнее желательно с примерами! Я не понимаю для чего это но, чуйка подсказывает, что это мне нужно!
я тут с трудом осилил только два параметра $params['OLD_VALUE'] и $params['NEW_VALUE']!
ниже мой пример
я взял код метода термостата от сюда viewtopic.php?f=5&t=3003&hilit=AddSched ... =20#p34480
и переделал его с использованием для меня новых параметров $params['OLD_VALUE'] и $params['NEW_VALUE']!

Код: Выделить всё

if ($params['OLD_VALUE']<=($this->getProperty('need_temp')) and $params['NEW_VALUE']>=($this->getProperty('need_temp'))) {
say('Включаю охлаждение');
say('Текущая температура '.$this->getProperty('current_temp').' Нужная вам температура '.$this->getProperty('need_temp').".");
}

if ($params['OLD_VALUE']>=($this->getProperty('need_temp')) and $params['NEW_VALUE']<=($this->getProperty('need_temp'))) {
say('Включаю обогрев');
say('Текущая температура '.$this->getProperty('current_temp').' Нужная вам температура '.$this->getProperty('need_temp').".");
}
Я токое же решение делал павда код в 2 раза длиннее!
А там еще такие параметры есть как $params['ORIGINAL_OBJECT_TITLE'], $params['PROPERTY'], DebMes(json_encode($this));, DebMes(json_encode($params));, DebMes(gr('NEW_VALUE')); которые даже в не представляю как использовать в коде!
подскажите, а?!?!
Ну вот смотрите, есть у меня датчик температуры, у него 3 параметра: temp, humi, bat_level. Все они привязаны к 1 методу, если изменится температура система вызовет метод и $params['PROPERTY'] будет = temp, я пойму что поменялась температура и запишу ее если пройдет через if($params['OLD_VALUE'] != $params['NEW_VALUE']), запишу я ее как $this->setProperty($params['ORIGINAL_OBJECT_TITLE'].'.'.$params['PROPERTY'], $params['NEW_VALUE']) а если значение не изменилось, я могу запустить, что то другое. Такое строение кода избавляет меня от нужды городить кучу if() условий
За это сообщение автора SmoKE_xDDD поблагодарили (всего 3):
Yashalta (Пн май 25, 2020 10:00 am) • Surgeon76 (Пн май 25, 2020 6:15 pm) • Bagir (Ср май 27, 2020 1:34 pm)
Рейтинг: 3.7%
ИзображениеИзображениеИзображение
Ответить