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

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

Модератор: immortal

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

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

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

Внес изменения в коды методов RequiredTempUp и RequiredTempDown, где была допущена логическая недоработка. Эти методы должны быть "объектовыми" (код из методов класса по ним надо будет удалить).

Вижу, что вы проделали определенную работу. Сразу вопрос, состояние насосов в интерфейсе соответствует фактическому их состоянию (речь, понятное дело, о ситуации с автономным включением/выключением насосов Мегой)?

Раз появился уличный температурный датчик, в код 1-го HTML-блока, где отображается температура на улице, вместо "О.P" надо вписать "SensorTemp_04.Value".
А вот из модуля "MegaD" я бы все привязки объектов.свойств к цифровым датчикам убрал (очистил). А то получается, что датчики опрашиваются нашими скриптами (подконтрольно) и идет запись в свойства. И одновременно те же датчики опрашиваются модулем "MegaD" (бесконтрольно), и идет запись в те же свойства. Бесконтрольный опрос тех же датчиков со стороны модуля "MegaD" тут явно лишний.

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

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

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

Да, насколько я вижу, все соответствует.
Значения RequiredTemp сами не обновляются, обновляются только при включении/выключении контура
Уличная температура показывается, просто скрин я сделал еще до этого )))
Chainik
Сообщения: 1387
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 230 раз
Поблагодарили: 433 раза

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

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

Понятно. Но с обновлением на контроллере RequiredTemp так должно было быть при старых кодах методов RequiredTempUp и RequiredTempDown. С новыми кодами методов RequiredTempUp и RequiredTempDown ситуация изменилась?
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

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

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

Нет, не изменилась. Убрал код из метода класса и вставил обновленный код в метод объекта, но все по прежнему
Chainik
Сообщения: 1387
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 230 раз
Поблагодарили: 433 раза

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

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

Странно.
Попробуем временно заменить в коде какого-нибудь из этих методов строчку

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

SetTimeOut($ot."_RequiredTempCh","file_get_contents('http://192.168.0.211/sec/?pt=31&misc='.$RequiredTemp);",5);
на строчку

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

SetTimeOut($ot."_RequiredTempCh","file_get_contents('http://192.168.0.211/sec/?pt=31&misc='.$RequiredTemp);say('Код_сработал_'.time())",5);
Надо убедиться, что при нажатии клавиши код запускается.
После внесения изменений попробуйте также страницу с интерфейсом обновить (F5). А также не забывать обновлять страницу с портом веб-интерфейса Меги (F5).
И мы помним, что между нажатием на кнопку и действием у нас 5-секундная задержка.

Текст в логе Алисы появляется после нажатия на кнопку?

А..., еще ";" забыл...

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

SetTimeOut($ot."_RequiredTempCh","file_get_contents('http://192.168.0.211/sec/?pt=31&misc='.$RequiredTemp);say('Код_сработал_'.time());",5);
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

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

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

Нет, не работает, лог молчит.
При этом, сам метод запускается. Если просто вставить в код say('Метод работает'.timeNow(),10); то в логе все появляется
Chainik
Сообщения: 1387
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 230 раз
Поблагодарили: 433 раза

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

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

Очень странно. У меня команда к Меге проходит и запись в лог идет.
Сейчас попробую практически ваш код, только порт на Меге настрою. Посмотрим, что будет.

Мда..., тоже команда не проходит. Буду искать ошибку в коде.

UPD:
Ага... Мой косяк. Строчка должна выглядеть так:

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

SetTimeOut($ot."_RequiredTempCh","file_get_contents('http://192.168.0.211/sec/?pt=31&misc=$RequiredTemp');",5);
Бывает же такое, что застреваешь практически на "пустом месте"...

Внесу правку в коды методов.
Chainik
Сообщения: 1387
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 230 раз
Поблагодарили: 433 раза

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

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

А вот и первый подход к автоматике. При температуре на улице ниже 8 гр. радиаторный контур должен включаться, а выше этого порога -- выключаться.

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

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

//Алгоритм управления Радиаторным контуром 1-го этажа в режиме Auto


//Если активирован режим "Auto", то выполняем код метода
if ($this->getProperty('Mode') != 1) return;

//ВКЛючаем контур, если температура на улице ниже 8 гр.
//Если контур уже включен, переходим к следующему блоку
if ($this->getProperty('Status') == 1) Goto Next_1;
//Узнаем температуру на улице
$OutDoorTemp = gg('SensorTemp_04.Value');
//Если текущая температура на улице больше или равна 8 гр., переходим к следующему блоку
if ($OutDoorTemp >= 8) Goto Next_1;
//Узнаем среднюю температуру на улице за последние полчаса
$OutDoorTempAvg = getHistoryAvg('SensorTemp_04.ValueSaved', strtotime('-30 minute'));
//Если средняя температура на улице больше или равна 8 гр., переходим к следующему блоку
if ($OutDoorTempAvg >= 8) Goto Next_1;
//Если средняя и текущие температуры на улице меньше 8 гр., включаем контур отопления
if ($OutDoorTemp < 8 && $OutDoorTemp < 8) $this->callMethod('turnOn');


Next_1:
//ВЫКЛючаем контур, если температура на улице выше 9 гр.
//Если контур уже выключен, переходим к следующему блоку
if ($this->getProperty('Status') == 0) Goto Next_2;
//Узнаем температуру на улице
$OutDoorTemp = gg('SensorTemp_04.Value');
//Если текущая температура на улице меньше или равна 9 гр., переходим к следующему блоку
if ($OutDoorTemp <= 9) Goto Next_2;
//Узнаем среднюю температуру на улице за последние полчаса
$OutDoorTempAvg = getHistoryAvg('SensorTemp_04.ValueSaved', strtotime('-30 minute'));
//Если средняя температура на улице меньше или равна 9 гр., переходим к следующему блоку
if ($OutDoorTempAvg <= 9) Goto Next_2;
//Если средняя и текущие температуры на улице больше 9 гр., выключаем контур отопления
if ($OutDoorTemp > 9 && $OutDoorTemp > 9) $this->callMethod('turnOff');


Next_2:
"Зазор" в 1 градус сделан для того, чтобы исключить эффект "дребезга" контура, когда температура на улице колеблется возле 8 градусов. Также это позволит нивелировать дрейф показаний датчика. Ведь любой, даже откалиброванный датчик не выдает идеально точные показания. Всегда могут присутствовать небольшие колебания. Учет усредненных значений тоже направлен на это. Лишний раз дергать контур и насосы ни к чему.

В сущности, код 2-го радиаторного контура (2-го этажа) будет точно таким же пока), кроме "шапки" с названием (первая строчка).

Код будет работать, когда выставлен режим "Auto". А производить запуск предлагаю раз в 10 минут, записав в OnNewMinute 2 строчки:

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

if ($m%10 == 0) callMethodSafe('RadiatorBranch_01.AutoMode');
if ($m%10 == 0) callMethodSafe('RadiatorBranch_02.AutoMode');


UPD:
Наверное, сказывается конец трудовой недели. Поправил код метода AutoMode, в строках, где вычисляется средняя температура надо указать имя свойства "ValueSaved". Мы же работаем с историческими данными.

И еще одно дополнение. В метод changeMode.
Чтобы после переключения в режим "Auto" не ждать, когда OnNewMinute "пнет" метод "AutoMode", допишем строчку на его запуск в метод changeMode:

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

$Mode = $this->getProperty('Mode');
if ($Mode == 0 || $Mode == "") {
  $this->setProperty('Mode', 1);
  $this->callMethod('AutoMode');
} else {
  $this->setProperty('Mode', 0);
}
А в самом методе AutoMode, когда он докажет свою состоятельность, заменим потом "жесткие" значения порогов срабатывания на переменные.
За это сообщение автора Chainik поблагодарил:
John (Сб май 08, 2021 1:13 am)
Рейтинг: 1.18%
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

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

Сообщение John » Сб май 08, 2021 1:15 am

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

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

Сообщение Chainik » Сб май 08, 2021 1:41 am

Значит средняя температура именно за эти полчаса преодолевала порог 8-9 градусов.
Тогда можно будет менять "жесткие" значения на переменные. Но это вторично.

Вопрос в том, надо ли как-то увязывать температуру в эталонном помещении и температуру на термостате конкретного отопительного контура (автоматическое ее изменение методом "AutoMode")? Даст ли это какой-то эффект? Если надо увязывать, то по какому алгоритму (хотя бы примерно)?
На эти вопросы без знания поведения реальной системы отопления не ответить.

Я уже приводил этот пример. Вот человек, исходя из опыта эксплуатации системы отопления за пару-тройку сезонов понял, что должна делать автоматика с его системой отопления (https://ab-log.ru/forum/viewtopic.php?f ... start=1398).
За это сообщение автора Chainik поблагодарил:
John (Сб май 08, 2021 12:41 pm)
Рейтинг: 1.18%
Ответить