Помогите с кодом (с логикой) пожалуйста

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

Модератор: immortal

John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Чт май 06, 2021 10:48 am

При автономном переключении статус не меняется, а вот если вручную запустить метод getStatus, то вполне обновляет свойство.
Chainik
Сообщения: 1386
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 228 раз
Поблагодарили: 433 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Чт май 06, 2021 11:04 am

Надо добиться, чтобы и в автономном режиме работало переключение свойства. Значит модуль по каким-то причинам не "отлавливает" параметры, прилетающие от Меги. Надо проверять настройку в модуле MegaD. Кстати, какая у вас версия прошивки в Меге (может быть у вас очень старая)?

В модуле в настройках должен быть прописан "Local IP:" (это адрес вашего сервера). Как вот тут (https://www.ab-log.ru/forum/viewtopic.p ... 104#p40104) на картинке.
У вас вообще MegaD что-нибудь когда-нибудь "отлавливал" (например, нажатия на выключатели освещения)?
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Чт май 06, 2021 11:40 am

Да, все работает! Мой косяк, галку напротив Act не поставил ))
С Megad я немного знаком, у меня их в системе сейчас 11 штук, 8 из них занимаются светом, 2 датчиками (температура, движение, CO2, влажность) и вот один сейчас я поставил на бойлер.
Chainik
Сообщения: 1386
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 228 раз
Поблагодарили: 433 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Чт май 06, 2021 11:45 am

Т.е. теперь при автономном переключении насоса Мегой свойство насоса "Status" меняется?
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Чт май 06, 2021 12:03 pm

Да, сейчас все обновляется
Chainik
Сообщения: 1386
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 228 раз
Поблагодарили: 433 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Чт май 06, 2021 12:19 pm

Замечательно!
Тогда, возможно, сегодня вечером, если не отвлекут неотложные дела, выложу что получилось (логика+интерфейс) в первом приближении.
Chainik
Сообщения: 1386
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 228 раз
Поблагодарили: 433 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Чт май 06, 2021 11:03 pm

Простейшие логика + интерфейс

Для отопления создаем отдельный класс. Пусть будет "HeatingSystem".

В класс добавляем свойства:
Status -- состояние контура (включен/выключен)
StatusAll -- состояние всех контуров (если хотя бы один включен, то "включено")
RequiredTemp -- требуемая температура в контуре
Mode -- режим управления контурами ("ручной"/Авто)

Добавляем методы:
turnOn -- читает выставленную на сервере требуемую температуру в контуре, и передает ее на термостат Меги
turnOff -- устанавливает у термостата Меги нереально низкую требуемую температуру, тем самым условно выключая его
switch -- включает/выключает термостат Меги
requiredTempUp -- увеличивает требуемую температуру в контуре
requiredTempDown -- уменьшает требуемую температуру в контуре
turnOffAll -- выключает термостат сразу на всех контурах
checkStatusAll -- проверяет, есть ли хоть один работающий контур (активность термостата)
changeMode -- изменяет режим работы контура ("ручной"/Авто)
AutoMode -- алгоритм автоматического управления контуром

Добавляем объекты:
BranchesAll -- объект, обобщающий все ветки отопления
RadiatorBranch_01 -- радиаторный контур 1-го этажа
RadiatorBranch_02 -- радиаторный контур 2-го этажа
WarmFloorBranch_01 -- контур ТП

Код метода turnOn (метод ОБЪЕКТА контура)
Заполняется для каждого контура индивидуально (поскольку правится номер порта, к которому подключен температурный датчик соответствующего контура).

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

//Запрос требуемой температуры
$RequiredTemp = $this->getProperty('RequiredTemp');
//Включение термостата MegaD на радиаторном контуре 1-го этажа
file_get_contents("http://192.168.0.211/sec/?pt=31&misc=".$RequiredTemp);
//Изменяем статус термостата на контуре
$this->setProperty('Status', 1);
sg('BranchesAll.StatusAll', 1);
Код метода turnOff (метод ОБЪЕКТА)
Заполняется для каждого контура индивидуально (поскольку правится номер порта, к которому подключен температурный датчик соответствующего контура).

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

//Выключение термостата MegaD на радиаторном контуре 1-го этажа
file_get_contents("http://192.168.0.211/sec/?pt=31&misc=5");
//Изменяем статус термостата на контуре
$this->setProperty('Status', 0);
$this->callMethod('checkStatusAll');
Код метода switch (классовый)

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

$Status = $this->getProperty('Status');
if ($Status == 0 || $Status == "") {
  $this->callMethod('turnOn');
} else {
  $this->callMethod('turnOff');
}
Кода метода turnOffAll (классовый)

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

$objects=getObjectsByClass("HeatingSystem");
foreach($objects as $obj) {
	if (gg($obj['TITLE'].".Status") == 1) {
  	callMethod($obj['TITLE'].".turnOff");
	}
}

Метод изменения режима работы контура ("ручной"(0)/Авто(1))
Пока ни на что влиять не будет, но уверен, в будущем пригодится.
Код метода changeMode (классовый)

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

$Mode = $this->getProperty('Mode');
if ($Mode == 0 || $Mode == "") {
  $this->setProperty('Mode', 1);
  $this->callMethod('AutoMode');
} else {
  $this->setProperty('Mode', 0);
}
Код метода checkStatusAll (классовый)

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

$objects=getObjectsByClass("HeatingSystem");
foreach($objects as $obj) {
	if (gg($obj['TITLE'].".Status") == 1) {
	sg('BranchesAll.StatusAll', 1);
	return;
	}
}
sg('BranchesAll.StatusAll', 0);
Код метода requiredTempDown (метод ОБЪЕКТА контура)
Для конкретного контура в коде меняется номер порта контроллера, к которому подключен соответствующий температурный датчик.

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

$RequiredTemp = $this->getProperty('RequiredTemp') - 1;
$this->setProperty('RequiredTemp', $RequiredTemp);
$ot = $this->object_title;
SetTimeOut($ot."_RequiredTempCh","file_get_contents('http://192.168.0.211/sec/?pt=31&misc=$RequiredTemp');",5);
Код метода requiredTempUp (метод ОБЪЕКТА контура)
Для конкретного контура в коде меняется номер порта контроллера, к которому подключен соответствующий температурный датчик.

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

$RequiredTemp = $this->getProperty('RequiredTemp') + 1;
$this->setProperty('RequiredTemp', $RequiredTemp);
$ot = $this->object_title;
SetTimeOut($ot."_RequiredTempCh","file_get_contents('http://192.168.0.211/sec/?pt=31&misc=$RequiredTemp');",5);
Перед внесением изменений в настройки порта контроллера сделана 5-секундная пауза, чтобы лишний раз не "дергать" контроллер при изменении требуемой температуры на несколько единиц подряд.

Код метода AutoMode (метод ОБЪЕКТА контура)
[код метода будет добавлен после тестирования]



Интерфейс
изображение_2021-05-06_223737.png
изображение_2021-05-06_223737.png (19.43 КБ) 359 просмотров
Пусть пока выглядит неказисто, но сейчас это не главное.

Помещаем иконки по пути: \htdocs\cms\scenes\
icons-Heating.rar
(152.6 КБ) 9 скачиваний
Если никогда раньше не вписывали код в HTML-блоки, то отмечу, что код вписывается в "Данные: установить".

Состоит из 2-х HTML-блоков.
Первый отвечает за индикацию активности отопления, исходя из активности каждой ветки. Плюс иконка является кнопкой, выключающей термостаты на всех ветках сразу.

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

<style type="text/css">
.gorizontalno {
display: inline-block
}

.button:active {
  transform: scale(0.9, 0.9);
}

</style>

<div class="gorizontalno">
<div class="button">
<div style='display:%BranchesAll.StatusAll|"block;none"%' onClick='callMethod("%BranchesAll.turnOffAll");'><img src="\cms\scenes\styles\switch\i_warm_on.png" width="48" height="32"><font size="4" color="gray"> ОТОПЛЕНИЕ</font></div>
<div style='display:%BranchesAll.StatusAll|"none;block"%' onClick='callMethod("%BranchesAll.turnOffAll");'><img src="\cms\scenes\styles\switch\i_warm_on.png" width="48" height="32" style="background-color: yellow;"><b> ОТОПЛЕНИЕ</b></div>
</div>
</div>

<div><font size="1">Температура на улице: %О.P%</font></div>
<div><font size="1">Температура в доме: %О.P%</font></div>
Для отображения температуры на улице и в доме вместо "О.P" надо вписать имена Объектов.Свойств, куда сохраняется значение температуры с соответствующих температурных датчиков.

Второй блок отвечает за управление конкретной веткой отопления. В частности, это пример ветки радиаторного контура 1-го этажа.

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

<style type="text/css">
.gorizontalno {
display: inline-block
}

.button:active {
  transform: scale(0.9, 0.9);
}

</style>

<div><font size="3">Радиаторный контур 1 эт.</font></div>

<div class="gorizontalno">
<div class="button">
<div style='display:%RadiatorBranch_01.Status|"block;none"%' onClick='callMethod("%RadiatorBranch_01.switch");'><img src="\cms\scenes\styles\switch\i_warm_on.png"></div>
<div style='display:%RadiatorBranch_01.Status|"none;block"%' onClick='callMethod("%RadiatorBranch_01.switch");'><img src="\cms\scenes\styles\switch\i_warm_on.png" style="background-color: yellow;"></div>
</div>
</div>
 
<div class="gorizontalno">
<div class="button">
<div style='display:%RadiatorBranch_01.Mode|"block;none"%' onClick='callMethod("%RadiatorBranch_01.changeMode");'><img src="\cms\scenes\Manual.png"></div>
<div style='display:%RadiatorBranch_01.Mode|"none;block"%' onClick='callMethod("%RadiatorBranch_01.changeMode");'><img src="\cms\scenes\Auto.png"></div>
</div>
</div>

<div class="gorizontalno">
<div class="button">
<div style='display:%PumpHeat_01.Status|"block;none"%' onClick='callMethod("%PumpHeat_01.turnOn");'><img src="\cms\scenes\PumpHeatOff.png"></div>
<div style='display:%PumpHeat_01.Status|"none;block"%' onClick='callMethod("%PumpHeat_01.turnOff");'><img src="\cms\scenes\PumpHeatOn.gif"></div>
</div>
</div>

<div class="gorizontalno">
<div class="button">
<div onClick='callMethod("%RadiatorBranch_01.requiredTempDown");'><img src="\cms\scenes\minus3.jpg"></div>
</div>
</div>

<div class="gorizontalno">
<div style='font-size:18pt; text-align:center'>%RadiatorBranch_01.RequiredTemp%</div>
</div>

<div class="gorizontalno">
<div class="button">
<div onClick='callMethod("%RadiatorBranch_01.requiredTempUp");'><img src="\cms\scenes\plus3.jpg"></div>
</div>
</div>

<div class="gorizontalno">
<div style='font-size:18pt; font-weight:bold; font-stretch:condensed; text-align:center; color:blue; -webkit-text-stroke:1px yellow; left:52px; bottom:12px'><i>%SensorTemp_01.Value%</i></div>
</div>
По остальным веткам надо будет сделать такие же блоки и поправить код на соответствующие объекты веток. Думаю, тут все интуитивно понятно. Но к оформлению остальных блоков имеет смысл приступать, когда у вас заработает все вот это.

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

Ну и должен отметить, что баги и косяки практически неизбежны. Так что отладка -- процесс естественный.

А уж потом, как заработает вот этот простейший вариант, подумаем, как добавить интеллекта к системе отопления (авторежим) и, может быть, привязать в интерфейс "бантики".

Если уже выбросили температурный датчик на улицу, подскжите, пожалуйста, имя объекта этого уличного датчика.
Последний раз редактировалось Chainik Сб май 08, 2021 12:42 am, всего редактировалось 5 раз.
За это сообщение автора Chainik поблагодарил:
John (Пт май 07, 2021 7:52 pm)
Рейтинг: 1.18%
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Пт май 07, 2021 2:34 pm

Уф, датчик на улицу вывел, подключит к 33 порту, сейчас займусь кодами
Chainik
Сообщения: 1386
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 228 раз
Поблагодарили: 433 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Пт май 07, 2021 3:03 pm

Мне бы имя объекта этого датчика в системе...

Вот и первый замеченный логический "косяк". Методы на изменение температуры контура (+/-) свойство меняют, а новое значение контроллеру не отправляют...
Вечером доберусь до компьютера, перепишу их. А вы пока впишите то что есть в методы ОБЪЕКТА радиаторного контура 1-го этажа.
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Пт май 07, 2021 5:28 pm

Имя объекта SensorTemp_04
Поместил его в тот же класс, что и остальные датчики температуры, в модуле Megad указал связанный объект и свойство Value
В сценарий добавил строчку для запуска метода getValue
В объекты контуров все вписал, интерфейс на сцену добавил
Вложения
1.jpg
1.jpg (148.52 КБ) 286 просмотров
Ответить