Помогите с кодом (с логикой) пожалуйста
Модератор: immortal
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Помогите с кодом (с логикой) пожалуйста
Внес изменения в коды методов RequiredTempUp и RequiredTempDown, где была допущена логическая недоработка. Эти методы должны быть "объектовыми" (код из методов класса по ним надо будет удалить).
Вижу, что вы проделали определенную работу. Сразу вопрос, состояние насосов в интерфейсе соответствует фактическому их состоянию (речь, понятное дело, о ситуации с автономным включением/выключением насосов Мегой)?
Раз появился уличный температурный датчик, в код 1-го HTML-блока, где отображается температура на улице, вместо "О.P" надо вписать "SensorTemp_04.Value".
А вот из модуля "MegaD" я бы все привязки объектов.свойств к цифровым датчикам убрал (очистил). А то получается, что датчики опрашиваются нашими скриптами (подконтрольно) и идет запись в свойства. И одновременно те же датчики опрашиваются модулем "MegaD" (бесконтрольно), и идет запись в те же свойства. Бесконтрольный опрос тех же датчиков со стороны модуля "MegaD" тут явно лишний.
Сейчас подумаю над логикой автоматического запуска/остановки отопления в зависимости от температуры на улице.
Вижу, что вы проделали определенную работу. Сразу вопрос, состояние насосов в интерфейсе соответствует фактическому их состоянию (речь, понятное дело, о ситуации с автономным включением/выключением насосов Мегой)?
Раз появился уличный температурный датчик, в код 1-го HTML-блока, где отображается температура на улице, вместо "О.P" надо вписать "SensorTemp_04.Value".
А вот из модуля "MegaD" я бы все привязки объектов.свойств к цифровым датчикам убрал (очистил). А то получается, что датчики опрашиваются нашими скриптами (подконтрольно) и идет запись в свойства. И одновременно те же датчики опрашиваются модулем "MegaD" (бесконтрольно), и идет запись в те же свойства. Бесконтрольный опрос тех же датчиков со стороны модуля "MegaD" тут явно лишний.
Сейчас подумаю над логикой автоматического запуска/остановки отопления в зависимости от температуры на улице.
Re: Помогите с кодом (с логикой) пожалуйста
Да, насколько я вижу, все соответствует.
Значения RequiredTemp сами не обновляются, обновляются только при включении/выключении контура
Уличная температура показывается, просто скрин я сделал еще до этого )))
Значения RequiredTemp сами не обновляются, обновляются только при включении/выключении контура
Уличная температура показывается, просто скрин я сделал еще до этого )))
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Помогите с кодом (с логикой) пожалуйста
Понятно. Но с обновлением на контроллере RequiredTemp так должно было быть при старых кодах методов RequiredTempUp и RequiredTempDown. С новыми кодами методов RequiredTempUp и RequiredTempDown ситуация изменилась?
Re: Помогите с кодом (с логикой) пожалуйста
Нет, не изменилась. Убрал код из метода класса и вставил обновленный код в метод объекта, но все по прежнему
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Помогите с кодом (с логикой) пожалуйста
Странно.
Попробуем временно заменить в коде какого-нибудь из этих методов строчку
на строчку
Надо убедиться, что при нажатии клавиши код запускается.
После внесения изменений попробуйте также страницу с интерфейсом обновить (F5). А также не забывать обновлять страницу с портом веб-интерфейса Меги (F5).
И мы помним, что между нажатием на кнопку и действием у нас 5-секундная задержка.
Текст в логе Алисы появляется после нажатия на кнопку?
А..., еще ";" забыл...
Попробуем временно заменить в коде какого-нибудь из этих методов строчку
Код: Выделить всё
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);
Re: Помогите с кодом (с логикой) пожалуйста
Нет, не работает, лог молчит.
При этом, сам метод запускается. Если просто вставить в код say('Метод работает'.timeNow(),10); то в логе все появляется
При этом, сам метод запускается. Если просто вставить в код say('Метод работает'.timeNow(),10); то в логе все появляется
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Помогите с кодом (с логикой) пожалуйста
Очень странно. У меня команда к Меге проходит и запись в лог идет.
Сейчас попробую практически ваш код, только порт на Меге настрою. Посмотрим, что будет.
Мда..., тоже команда не проходит. Буду искать ошибку в коде.
UPD:
Ага... Мой косяк. Строчка должна выглядеть так:
Бывает же такое, что застреваешь практически на "пустом месте"...
Внесу правку в коды методов.
Сейчас попробую практически ваш код, только порт на Меге настрою. Посмотрим, что будет.
Мда..., тоже команда не проходит. Буду искать ошибку в коде.
UPD:
Ага... Мой косяк. Строчка должна выглядеть так:
Код: Выделить всё
SetTimeOut($ot."_RequiredTempCh","file_get_contents('http://192.168.0.211/sec/?pt=31&misc=$RequiredTemp');",5);
Внесу правку в коды методов.
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Помогите с кодом (с логикой) пожалуйста
А вот и первый подход к автоматике. При температуре на улице ниже 8 гр. радиаторный контур должен включаться, а выше этого порога -- выключаться.
Добавляем метод AutoMode (метод ОБЪЕКТА контура)
"Зазор" в 1 градус сделан для того, чтобы исключить эффект "дребезга" контура, когда температура на улице колеблется возле 8 градусов. Также это позволит нивелировать дрейф показаний датчика. Ведь любой, даже откалиброванный датчик не выдает идеально точные показания. Всегда могут присутствовать небольшие колебания. Учет усредненных значений тоже направлен на это. Лишний раз дергать контур и насосы ни к чему.
В сущности, код 2-го радиаторного контура (2-го этажа) будет точно таким же пока), кроме "шапки" с названием (первая строчка).
Код будет работать, когда выставлен режим "Auto". А производить запуск предлагаю раз в 10 минут, записав в OnNewMinute 2 строчки:
UPD:
Наверное, сказывается конец трудовой недели. Поправил код метода AutoMode, в строках, где вычисляется средняя температура надо указать имя свойства "ValueSaved". Мы же работаем с историческими данными.
И еще одно дополнение. В метод changeMode.
Чтобы после переключения в режим "Auto" не ждать, когда OnNewMinute "пнет" метод "AutoMode", допишем строчку на его запуск в метод changeMode:
А в самом методе AutoMode, когда он докажет свою состоятельность, заменим потом "жесткие" значения порогов срабатывания на переменные.
Добавляем метод 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:
В сущности, код 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);
}
- Рейтинг: 1.16%
Re: Помогите с кодом (с логикой) пожалуйста
Положил уличный датчик в банку со льдом, ровно через пол часа отопление включилось, потом достал его из банки и все выключилось через те же пол часа )))))
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Помогите с кодом (с логикой) пожалуйста
Значит средняя температура именно за эти полчаса преодолевала порог 8-9 градусов.
Тогда можно будет менять "жесткие" значения на переменные. Но это вторично.
Вопрос в том, надо ли как-то увязывать температуру в эталонном помещении и температуру на термостате конкретного отопительного контура (автоматическое ее изменение методом "AutoMode")? Даст ли это какой-то эффект? Если надо увязывать, то по какому алгоритму (хотя бы примерно)?
На эти вопросы без знания поведения реальной системы отопления не ответить.
Я уже приводил этот пример. Вот человек, исходя из опыта эксплуатации системы отопления за пару-тройку сезонов понял, что должна делать автоматика с его системой отопления (https://ab-log.ru/forum/viewtopic.php?f ... start=1398).
Тогда можно будет менять "жесткие" значения на переменные. Но это вторично.
Вопрос в том, надо ли как-то увязывать температуру в эталонном помещении и температуру на термостате конкретного отопительного контура (автоматическое ее изменение методом "AutoMode")? Даст ли это какой-то эффект? Если надо увязывать, то по какому алгоритму (хотя бы примерно)?
На эти вопросы без знания поведения реальной системы отопления не ответить.
Я уже приводил этот пример. Вот человек, исходя из опыта эксплуатации системы отопления за пару-тройку сезонов понял, что должна делать автоматика с его системой отопления (https://ab-log.ru/forum/viewtopic.php?f ... start=1398).
- Рейтинг: 1.16%