Помогите с кодом (с логикой) пожалуйста
Модератор: immortal
Re: Помогите с кодом (с логикой) пожалуйста
При автономном переключении статус не меняется, а вот если вручную запустить метод getStatus, то вполне обновляет свойство.
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Помогите с кодом (с логикой) пожалуйста
Надо добиться, чтобы и в автономном режиме работало переключение свойства. Значит модуль по каким-то причинам не "отлавливает" параметры, прилетающие от Меги. Надо проверять настройку в модуле MegaD. Кстати, какая у вас версия прошивки в Меге (может быть у вас очень старая)?
В модуле в настройках должен быть прописан "Local IP:" (это адрес вашего сервера). Как вот тут (https://www.ab-log.ru/forum/viewtopic.p ... 104#p40104) на картинке.
У вас вообще MegaD что-нибудь когда-нибудь "отлавливал" (например, нажатия на выключатели освещения)?
В модуле в настройках должен быть прописан "Local IP:" (это адрес вашего сервера). Как вот тут (https://www.ab-log.ru/forum/viewtopic.p ... 104#p40104) на картинке.
У вас вообще MegaD что-нибудь когда-нибудь "отлавливал" (например, нажатия на выключатели освещения)?
Re: Помогите с кодом (с логикой) пожалуйста
Да, все работает! Мой косяк, галку напротив Act не поставил ))
С Megad я немного знаком, у меня их в системе сейчас 11 штук, 8 из них занимаются светом, 2 датчиками (температура, движение, CO2, влажность) и вот один сейчас я поставил на бойлер.
С Megad я немного знаком, у меня их в системе сейчас 11 штук, 8 из них занимаются светом, 2 датчиками (температура, движение, CO2, влажность) и вот один сейчас я поставил на бойлер.
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Помогите с кодом (с логикой) пожалуйста
Т.е. теперь при автономном переключении насоса Мегой свойство насоса "Status" меняется?
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Помогите с кодом (с логикой) пожалуйста
Замечательно!
Тогда, возможно, сегодня вечером, если не отвлекут неотложные дела, выложу что получилось (логика+интерфейс) в первом приближении.
Тогда, возможно, сегодня вечером, если не отвлекут неотложные дела, выложу что получилось (логика+интерфейс) в первом приближении.
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Помогите с кодом (с логикой) пожалуйста
Простейшие логика + интерфейс
Для отопления создаем отдельный класс. Пусть будет "HeatingSystem".
В класс добавляем свойства:
Status -- состояние контура (включен/выключен)
StatusAll -- состояние всех контуров (если хотя бы один включен, то "включено")
RequiredTemp -- требуемая температура в контуре
Mode -- режим управления контурами ("ручной"/Авто)
Добавляем методы:
turnOn -- читает выставленную на сервере требуемую температуру в контуре, и передает ее на термостат Меги
turnOff -- устанавливает у термостата Меги нереально низкую требуемую температуру, тем самым условно выключая его
switch -- включает/выключает термостат Меги
requiredTempUp -- увеличивает требуемую температуру в контуре
requiredTempDown -- уменьшает требуемую температуру в контуре
turnOffAll -- выключает термостат сразу на всех контурах
checkStatusAll -- проверяет, есть ли хоть один работающий контур (активность термостата)
changeMode -- изменяет режим работы контура ("ручной"/Авто)
AutoMode -- алгоритм автоматического управления контуром
Добавляем объекты:
BranchesAll -- объект, обобщающий все ветки отопления
RadiatorBranch_01 -- радиаторный контур 1-го этажа
RadiatorBranch_02 -- радиаторный контур 2-го этажа
WarmFloorBranch_01 -- контур ТП
Код метода turnOn (метод ОБЪЕКТА контура)
Заполняется для каждого контура индивидуально (поскольку правится номер порта, к которому подключен температурный датчик соответствующего контура).
Код метода turnOff (метод ОБЪЕКТА)
Заполняется для каждого контура индивидуально (поскольку правится номер порта, к которому подключен температурный датчик соответствующего контура).
Код метода switch (классовый)
Кода метода turnOffAll (классовый)
Метод изменения режима работы контура ("ручной"(0)/Авто(1))
Пока ни на что влиять не будет, но уверен, в будущем пригодится.
Код метода changeMode (классовый)
Код метода checkStatusAll (классовый)
Код метода requiredTempDown (метод ОБЪЕКТА контура)
Для конкретного контура в коде меняется номер порта контроллера, к которому подключен соответствующий температурный датчик.
Код метода requiredTempUp (метод ОБЪЕКТА контура)
Для конкретного контура в коде меняется номер порта контроллера, к которому подключен соответствующий температурный датчик.
Перед внесением изменений в настройки порта контроллера сделана 5-секундная пауза, чтобы лишний раз не "дергать" контроллер при изменении требуемой температуры на несколько единиц подряд.
Код метода AutoMode (метод ОБЪЕКТА контура)
[код метода будет добавлен после тестирования]
Интерфейс Пусть пока выглядит неказисто, но сейчас это не главное.
Помещаем иконки по пути: \htdocs\cms\scenes\ Если никогда раньше не вписывали код в HTML-блоки, то отмечу, что код вписывается в "Данные: установить".
Состоит из 2-х HTML-блоков.
Первый отвечает за индикацию активности отопления, исходя из активности каждой ветки. Плюс иконка является кнопкой, выключающей термостаты на всех ветках сразу.
Для отображения температуры на улице и в доме вместо "О.P" надо вписать имена Объектов.Свойств, куда сохраняется значение температуры с соответствующих температурных датчиков.
Второй блок отвечает за управление конкретной веткой отопления. В частности, это пример ветки радиаторного контура 1-го этажа.
По остальным веткам надо будет сделать такие же блоки и поправить код на соответствующие объекты веток. Думаю, тут все интуитивно понятно. Но к оформлению остальных блоков имеет смысл приступать, когда у вас заработает все вот это.
Если первоначально в интерфейсе будут появляться множественные иконки -- это нормально. Все потому, что свойства могут быть не заполнены. Просто понажимайте на иконки или заполните свойства руками.
Ну и должен отметить, что баги и косяки практически неизбежны. Так что отладка -- процесс естественный.
А уж потом, как заработает вот этот простейший вариант, подумаем, как добавить интеллекта к системе отопления (авторежим) и, может быть, привязать в интерфейс "бантики".
Если уже выбросили температурный датчик на улицу, подскжите, пожалуйста, имя объекта этого уличного датчика.
Для отопления создаем отдельный класс. Пусть будет "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);
Заполняется для каждого контура индивидуально (поскольку правится номер порта, к которому подключен температурный датчик соответствующего контура).
Код: Выделить всё
//Выключение термостата MegaD на радиаторном контуре 1-го этажа
file_get_contents("http://192.168.0.211/sec/?pt=31&misc=5");
//Изменяем статус термостата на контуре
$this->setProperty('Status', 0);
$this->callMethod('checkStatusAll');
Код: Выделить всё
$Status = $this->getProperty('Status');
if ($Status == 0 || $Status == "") {
$this->callMethod('turnOn');
} else {
$this->callMethod('turnOff');
}
Код: Выделить всё
$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);
}
Код: Выделить всё
$objects=getObjectsByClass("HeatingSystem");
foreach($objects as $obj) {
if (gg($obj['TITLE'].".Status") == 1) {
sg('BranchesAll.StatusAll', 1);
return;
}
}
sg('BranchesAll.StatusAll', 0);
Для конкретного контура в коде меняется номер порта контроллера, к которому подключен соответствующий температурный датчик.
Код: Выделить всё
$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);
Для конкретного контура в коде меняется номер порта контроллера, к которому подключен соответствующий температурный датчик.
Код: Выделить всё
$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);
Код метода AutoMode (метод ОБЪЕКТА контура)
[код метода будет добавлен после тестирования]
Интерфейс Пусть пока выглядит неказисто, но сейчас это не главное.
Помещаем иконки по пути: \htdocs\cms\scenes\ Если никогда раньше не вписывали код в 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>
Второй блок отвечает за управление конкретной веткой отопления. В частности, это пример ветки радиаторного контура 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 раз.
- Рейтинг: 1.16%
Re: Помогите с кодом (с логикой) пожалуйста
Уф, датчик на улицу вывел, подключит к 33 порту, сейчас займусь кодами
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Помогите с кодом (с логикой) пожалуйста
Мне бы имя объекта этого датчика в системе...
Вот и первый замеченный логический "косяк". Методы на изменение температуры контура (+/-) свойство меняют, а новое значение контроллеру не отправляют...
Вечером доберусь до компьютера, перепишу их. А вы пока впишите то что есть в методы ОБЪЕКТА радиаторного контура 1-го этажа.
Вот и первый замеченный логический "косяк". Методы на изменение температуры контура (+/-) свойство меняют, а новое значение контроллеру не отправляют...
Вечером доберусь до компьютера, перепишу их. А вы пока впишите то что есть в методы ОБЪЕКТА радиаторного контура 1-го этажа.
Re: Помогите с кодом (с логикой) пожалуйста
Имя объекта SensorTemp_04
Поместил его в тот же класс, что и остальные датчики температуры, в модуле Megad указал связанный объект и свойство Value
В сценарий добавил строчку для запуска метода getValue
В объекты контуров все вписал, интерфейс на сцену добавил
Поместил его в тот же класс, что и остальные датчики температуры, в модуле Megad указал связанный объект и свойство Value
В сценарий добавил строчку для запуска метода getValue
В объекты контуров все вписал, интерфейс на сцену добавил
- Вложения
-
- 1.jpg (148.52 КБ) 2103 просмотра