Структура объектов

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

Модератор: immortal

Ответить
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Структура объектов

Сообщение Bagir » Пн сен 12, 2022 11:31 am

Ну что приверженцы старого стиля, есть ещё такие? Мне очень понравилась объектная структура, и хочу поделиться некоторыми моментами реализации логики. Речь пойдет о условиях работы реле. Есть у меня релюшки с простецкой логикой. Есть и более сложные, работа которых зависит от множества условий.
Для примера будем разбирать ситуацию с реле для включения света. Причиной будут методы onActivity и onIdle класса Rooms. Код в них будет простой
onActivity

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

cm('RelayBhLightRestroom1.logic', array('status'=>1));
onIdle

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

cm('RelayBhLightRestroom1.logic', array('status'=>0));
Суть тут в вызове метода logic класса Relays c предложением ему включить или выключить реле.
Теперь сам метод logic класса Rerays. Родительский код

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

global $do_not_execute_object_method;  //ToTest

$ms=$this->getProperty('modeSwitch');
if (is_numeric($ms)) {
  if ($ms==0) { $f=0; }
  elseif ($ms==1) { $f=1; }
  elseif ($ms>=2) {
    // вкл/выкл при существовании таймера или рекомендации
    if (timeOutExists($this->object_title.'_nowork')) { $f=0; }
    elseif (isset($params['status'])) { 
      if ($params['status']) { $f=1; } else { $f=0; }
    }
    elseif (timeOutExists($this->object_title.'_work')) { $f=1; }
  }
  if (isset($f)) {
    // переключить реле 
    $s=$this->getProperty('status');
    if ($f>$s) { $this->callMethod('turnOn'); }
    if ($f<$s) { $this->callMethod('turnOff'); }
    // запретить выполнение кода метода объекта
    $do_not_execute_object_method=true;
    return 3;
  }
}

// решение на усмотрение метода объекта при его наличии
$do_not_execute_object_method=false;
return 2;
// если метод объекта есть, он перезапишет на 1
Что тут есть. А есть тут свойство modeSwitch, которое может быть 0,1,2 или не быть задано вовсе. Это глобальный переключатель, так сказать. Выкл, Вкл, Авто. Еще могут быть таймеры _work и _nowork с именем объекта реле вначале. Запрещающий таймер главнее. Допустим мы сами выключили свет, и не хотим чтобы он сразу включился, но и авторежим отключать тоже не хотим. Или же котел отключил нагрев, и нужно выдержать паузу перед следующим включением. Суть разрешающего таймера это когда мы хотим что то включить на время. По его истечении может быть опять вызван метод logic, и решение о работе реле будет пересмотрено.
Не все реле требуют большой и сложной логики, и поэтому кода родительского метода может быть вполне достаточно для управления реле. В моем случае для света далеко не у всех релюшек есть своя логика. И в этом плюс такого подхода. Очень быстро масштабируется. Конкретно у этого объекта RelayBhLightRestroom1 своего метода logic нет.
Но есть и такие, у которых есть. И тут ещё момент. Чтобы там ни было написано, если. например, командует modeSwitch, то выполнять метод объекта уже и не требуется. Для этого в родительском коде есть переменная $do_not_execute_object_method. А в коде объекта в самом начале будет завершение выполнения, если решение о работе реле уже окончательно принято. Вот пример наличия логики в другом объекте реле

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

/*
 если решение принято по переключателю режима работы,
 или существованию одного из таймеров,
 то прекратить работу кода объекта
*/

// *** Прервать выполнение по инструкции родительского кода
global $do_not_execute_object_method;  //ToTest
if ($do_not_execute_object_method) { return 3; }

// *** Проверка свойств объектов, которые могут изменить решение.
$f = 0; // Предполагаем, что реле будет выключено

// Не включать при максимальной экономии
if (gg('EconomMode.status') >= -1) {
  // Уровень освещенности
  if (gg('DuskMode.status')) { 
    // Кто то тут
    if (gg('Gazebo.SomebodyHere')) {
      $f = 1;
    }
  }
}

// *** Выполнить 
$s=$this->getProperty('status');
if ($f>$s) { $this->callMethod('turnOn'); }
if ($f<$s) { $this->callMethod('turnOff'); }
Теперь, если родительский код не принял решение о работе реле, то будет продолжаться выполнение кода объекта. Это решение дает баланс между лишним выполнением методов объектов с проверкой разных условий, и простотой добавления новых объектов в систему.
Мало? тогда дадим ещё: Непросто так в различных частях кода при его завершении после return указана цифра. Это позволяет отследить кто принял решение о работе реле. Родительский код, код метода объекта, да и есть ли вообще код метода.
Пример использования:

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

 if ((int)cm('RelayBhLightRestroom2.logic') == 2) {
  if (!gg('RelayBhLightRestroom2.status')) {
   callMethod('RelayBhLightRestroom2.turnOn');
  }
 }
Ответом на вызов метода logic может быть
3 - если modeSwitch = 0; 1; >=2 и есть таймер (ToTest есть рекомендация)
2 - если нет логики объекта и родительский код не принял решение
1 - есть логика в объекте
Условие в коде на ==2 говорит что решение не принято родительским методом, а собственного метода у реле нет. Ситуации бывают разные, и в некоторых случаях нам это может пригодиться.

Прикручиваем радиопереключатель к этой структуре Тут есть пример использования таймера для поддержания работы реле

Управление реле и авторежимом из шаблонов поведенияСсылка ведет в шаблоны поведения. Проследуйте до кода по ветке Включи или Выключи => Свет Освещение => комната Тут есть пример таймера, запрещающего работу.
Последний раз редактировалось Bagir Пн сен 12, 2022 4:32 pm, всего редактировалось 1 раз.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Logrus
Сообщения: 2079
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: Структура объектов

Сообщение Logrus » Пн сен 12, 2022 2:40 pm

а зачем в логик родительский и все усложнения далее?
в мдм есть настройка порядка вызова или не вызова родительского она убирает оверхед.
так же можно это, особенно актуально при большой вложенности классов, доработать в ядре.
таймеры чуть более напряжнее ивентов, а если в ядре доработать кеш, то в него можно писать служебные свойства минуя сг и читать с помошью стандартного гг из кеша, и если уж так вообще заморачиваться то там можно в одном хранить несколько через разделитель и даже подобным всякое среднее скользящее и подобное.

ну и т.д. молчу о сложности поддержки и модернизации описанного выше
Последний раз редактировалось Logrus Пн сен 12, 2022 2:49 pm, всего редактировалось 1 раз.
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Re: Структура объектов

Сообщение Bagir » Пн сен 12, 2022 2:49 pm

Logrus писал(а):
Пн сен 12, 2022 2:40 pm
а зачем в логик родительский и все усложнения далее?
Чтобы не писать в каждом методе объекта одинаковый код. И даже вообще не создавать эти методы в объектах, если реле не требует сложных настроек логики. Что позволяет легко добавлять новые объекты реле, даже не редактируя их код
Logrus писал(а):
Пн сен 12, 2022 2:40 pm
в мдм есть настройка порядка вызова или не вызова родительского она убирает оверхед.
Блокировка кода объекта если родительский код принял однозначное решение о статусе работы реле только лишь чтобы не выполнять лишние проверки.
Logrus писал(а):
Пн сен 12, 2022 2:40 pm
таймеры чуть более напряжнее ивентов.
Полностью согласен, но таймер позволяет мне по завершению опять вызвать метод logic. Полезно в случае таймера разрешающего работу. Возможно после его завершения больше нет никаких условий для продолжения работы. Например, включение света на время. Да и не так часто эти таймеры будут использоваться, а в родительском коде есть только проверка существования таймера, что не вызывает больших затрат.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Logrus
Сообщения: 2079
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: Структура объектов

Сообщение Logrus » Пн сен 12, 2022 2:52 pm

метод логик индувидуален для каждого устройства и нужен при сложной логике
так там вполне достаточно он офф и управления из режимов к примеру
т.е. заморочки и усложнения с родительским, ты сам потом в этом запутаешься
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Logrus
Сообщения: 2079
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: Структура объектов

Сообщение Logrus » Пн сен 12, 2022 2:55 pm

с таймерами тогда в примере ты не раскрыл эту фишку, читающим будет не очевидно
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Re: Структура объектов

Сообщение Bagir » Пн сен 12, 2022 3:03 pm

Logrus писал(а):
Пн сен 12, 2022 2:55 pm
с таймерами тогда в примере ты не раскрыл эту фишку, читающим будет не очевидно
Да, примеры с таймерами есть только в статьях ниже по ссылкам. Надо будет добавить небольшой примерчик их использования в статью.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Re: Структура объектов

Сообщение Bagir » Пн сен 12, 2022 3:43 pm

Logrus писал(а):
Пн сен 12, 2022 2:52 pm
метод логик индувидуален для каждого устройства и нужен при сложной логике
В том и суть. У таких объектов как раз присутствует этот метод. Но без кода проверки "глобального переключателя" и таймеров. В родительский код вынесены только общие условия проверки, которые справедливы для всех моих объектов реле. Да, есть у меня объекты, которые не используют те же таймеры или "глобальный переключатель". Проверка этого из родительского кода - сопутствующий ущерб за общие правила игры.
Logrus писал(а):
Пн сен 12, 2022 2:52 pm
ты сам потом в этом запутаешься
Этот код у меня уже несколько лет. Но последнее время я его подкорректировал и решил поделиться. Ранее он не был так универсален. По крайней мере он подходит подавляющему большинству моих реле.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Logrus
Сообщения: 2079
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: Структура объектов

Сообщение Logrus » Вт сен 13, 2022 10:56 am

прикол в том что тем кто может и понимает это не нужно
а тем кто не может и не понимает вредно ...
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Ответить