Управление отоплением
-
В принципе получилось. Но! По мне так неправильно:
1. Что у насоса/радиатора теперь есть настройка "Гистерезис температуры включения/выключения насоса/радиатора". Эта настройка должна быть у датчика температуры, по которому работает насос/радиатор.
Это вопрос спорный По одному датчику температуры могут несколько устройств работать.
В версии Berry свойства добавляются к главному устройству сценария, которое управляется.
<quote>> 2. Обычный пользователь сможет из веба менять гистерезис для включения/отключения отопления.
Можно эту настройку сделать при настройке самого поведения в PM? То есть в том месте где мы выбираем датчик температуры, по которому включаем/отключаем насос/радиатор.
Настройку можно скрыть, тогда пользователь ее не увидит - добавить свойство hide:
"userparam": {"prop":"hst", "defval":1, "type":"num", "note":"Значение гистерезиса ", "hide":1}
При настройке поведения редактирование параметров пока не предусмотрено.
Изменять настройку можно в PM - пункт Установки, который стандартно не задействован.
Для этого нужно будет создать два дополнительных файла. Если такой вариант устроит - завтра выложим пример.
-
Подскажите что такое в сценариях (например, для радиаторов) "scengroup": 3
Это было предусмотрено для группировки сценариев при просмотре. Для шаблонных сценариев сейчас это свойство не используется.
<quote>> И можно где-нибудь расписать индексы типов устройств ("type":500 и прочие)?
500 - Универсальный дискретный актуатор
Вы правы, добавим список типов устройств как таблицу для просмотра в PM.
В Cherry типы можно будет добавлять и изменять интерактивно
-
Это вопрос спорный По одному датчику температуры могут несколько устройств работать. В версии Berry свойства добавляются к главному устройству сценария, которое управляется.
Да, Вы правы. Тогда логичнее всего делать настройку гистерезиса (как тонкая настройка при ПНР) именно при выборе датчика температуры. Пытался сделать:) прописав в param:
"HST":{"note":"Гистерезис температуры включения/выключения насоса", "type":"num", "defval":"1"}
Понял, что обработчик не понимает меня…что вы и подтверждаете.
@intrapro:Настройку можно скрыть, тогда пользователь ее не увидит - добавить свойство hide:
Это конечно хорошо, но в Berry (в Cherry вроде Вы хотели реализовать редактирование скриптов через веб) надо значит по ssh лезть на сервер и ручками править defval. Не комильфо это для администратора системы, которая почти полностью настраивается через веб!
@intrapro:Изменять настройку можно в PM - пункт Установки, который стандартно не задействован.
Для этого нужно будет создать два дополнительных файла. Если такой вариант устроит - завтра выложим пример.
Спасибо, но, думаю, не стоит заморачиваться раз все так "сложно". Было бы этих уставок как на большом промышленном объекте, тогда да.
-
Это было предусмотрено для группировки сценариев при просмотре. Для шаблонных сценариев сейчас это свойство не используется.
Значит можно удалить.
@intrapro:500 - Универсальный дискретный актуатор
Вы правы, добавим список типов устройств как таблицу для просмотра в PM.
В Cherry типы можно будет добавлять и изменять интерактивно
Как вариант разместить в вики, тут ну или справочно в РМ. Главное не "перегрузить" РМ. А то меня вот этот перечень - 500,550,610,620,630,710 - заинтересовал. Кроме 500 ничего не знаю. А, кстати, в Berry было бы логично размещать коды устройств тут:
Cherry пока не использовал.
-
А, кстати, в Berry было бы логично размещать коды устройств тут:
Да, наверно это логично. Но при разработке Berry была основная идея - как можно меньше всяческих кодов, как можно проще делать простые вещи. В Cherry упор на универсальность, будем надеяться, не в ущерб простоте.
Как вариант разместить в вики, тут ну или справочно в РМ.
Дело в том, что набор типов устройств а) пополняется, б) зависит от конфигурации (Scada, Smart Home). Поэтому поступили проще - добавили в PM табличку "Типы устройств" сразу после "Устройства". Табличка только для просмотра, редактировать типы интерактивно в Berry нельзя.
Можно обновиться и посмотреть.
-
В принципе все информативно стало - иконки - это те, которые по умолчанию назначены? Только в списке нет 550 и 620.
-
иконки - это те, которые по умолчанию назначены?
Да
Только в списке нет 550 и 620.
Эти устройства есть в расширенной конфигурации, которая используется для наших инсталляций:
550 - Управляемая розетка
620 - Теплый пол
Когда делали стандартный список типов - почистили. Ну а шаблоны сценариев общие для всех конфигураций, и в результате копипаста в примере типы которых нет в стандартной.
-
Эти устройства есть в расширенной конфигурации, которая используется для наших инсталляций:
550 - Управляемая розетка
620 - Теплый пол
Да, кстати, недавно задумывался - "а почему же нет таких стандартных устройств". И мне не понятно почему Вы исключили их из стандартной версии…можно как-то поиметь для Berry? Или не заморачиваться и выбирать универсальный актюатор?
-
-
Задача - управлять резервным (электрическим) котлом в зависимости от состояния насосов и температуры подачи основного котла. Поскольку пока не имею возможности вывести сигнал неисправности с основного газового котла Baxi, то как временное решение - определять его неисправность измеряя температуру на его подаче когда он включен. Он же включен когда включен хотя бы один насос контуров отопления. Правильно ли я написал скрипт или можно как-то лаконичнее?
"start":{ "event":"#BOILER#,#DT#", "if":"(#BOILER#.auto == 1) && (#DT#.aval < #BOILER#.temp)" }, "functions":{ "start":{ "if":"(#PUMP1#.dval == 1)&&(#PUMP2#.dval == 1)&&(#PUMP3#.dval == 1)&&(#PUMP4#.dval == 1)", "exec":{"do":"#BOILER#.aon"}, "else":{"do":"#BOILER#.aoff"} } }
Температуру включения резервного котла задаю в его настройках - свойство temp.
-
Задача - управлять резервным (электрическим) котлом в зависимости от состояния насосов и температуры на подаче основного котла. Поскольку пока не имею возможности вывести сигнал неисправности с основного газового котла Baxi, то как временное решение - определять его неисправность измеряя температуру на его подаче когда он включен. Он же включен когда включен хотя бы один насос контуров отопления. Правильно ли я написал скрипт или можно как-то лаконичнее?
"start":{ "event":"#BOILER#,#PUMP1#,#PUMP2#,#PUMP3#,#PUMP4#", "if":"(#BOILER#.auto == 1) && ( (#PUMP1#.dval == 1)&&(#PUMP2#.dval == 1)&&(#PUMP3#.dval == 1)&&(#PUMP4#.dval == 1) )" }, "timeout":60, "functions":{ "start":{ "if":"(#DT#.aval < #BOILER#.temp)", "exec":{"do":"#BOILER#.aon"}, "else":{"do":"#BOILER#.aoff"} } }
Температуру включения резервного котла задаю в его настройках - свойство temp.
PS: разрешите на форуме удалять/редактировать свои сообщения. А то выходит таймаут и отредактировать уже нельзя. Написал новое и предыдущее удалить уже нельзя:(
-
Заменил
"if":"(#BOILER#.auto == 1) && ( (#PUMP1#.dval == 1)&&(#PUMP2#.dval == 1)&&(#PUMP3#.dval == 1)&&(#PUMP4#.dval == 1) )"
на правильное условие:
"if":"(#BOILER#.auto == 1) && ( (#PUMP1#.dval == 1) || (#PUMP2#.dval == 1) || (#PUMP3#.dval == 1) || (#PUMP4#.dval == 1) )"
Вроде работает как задумано. Я правильно полагаю, что эти условия должны быть стартовыми? А далее проводим проверку только по температуре?
-
Поскольку при включении насосов рециркуляции не выполняется условие "if":"(#DT#.aval < #BOILER#.temp)", то резервный котел (электрический) отключается:
Температура уменьшилась: 04.12.2017 07:23:41 localhost => 192.168.11.24:80 HTTP GET /sec/?cmd=19:1 - НАСОС ТП1 04.12.2017 07:23:41 localhost => 192.168.11.24:80 HTTP GET /sec/?cmd=28:1 - Газовый котел 04.12.2017 07:23:41 localhost => 192.168.11.24:80 HTTP GET /sec/?cmd=27:0 - Электрический котел 04.12.2017 07:23:41 localhost => 192.168.11.24:80 HTTP GET /sec/?cmd=21:1 - НАСОС ТП2 04.12.2017 07:23:41 localhost => 192.168.11.24:80 HTTP GET /sec/?cmd=28:1 - Газовый котел 04.12.2017 07:23:47 localhost => 192.168.11.24:80 HTTP GET /sec/?cmd=27:0 - Электрический котел
1. Где и как правильно добавить условие чтобы не выполнялась бесполезная команда 27:0 если условие #DT#.aval < #BOILER#.temp соответствует false?
2. То же по основному котлу (газовый) - где и как правильно добавить условие чтобы во второй и последующие разы (события по 4-м насосам) не выполнялась бесполезная команда 28:1?
-
1. Где и как правильно добавить условие чтобы не выполнялась бесполезная команда 27:0 если условие #DT#.aval < #BOILER#.temp соответствует false?
2. То же по основному котлу (газовый) - где и как правильно добавить условие чтобы во второй и последующие разы (события по 4-м насосам) не выполнялась бесполезная команда 28:1?
Можно задать несколько команд - массив команд, и в каждой проверять условие:
- если нужно включить котел, а он выключен - то включить. И наоборот.
"functions":{ "start":[ { "if":"(#DT#.aval < #BOILER#.temp) && (#BOILER#.dval == 0)", "exec":{"do":"#BOILER#.aon", "exit":1 }}, { "if":"(#DT#.aval > #BOILER#.temp) && (#BOILER#.dval == 1)", "exec":{"do":"#BOILER#.aoff"}} ] }
Все команды будут выполняться подряд. После включения можно сразу выйти: "exit":1
<quote>> Я правильно полагаю, что эти условия должны быть стартовыми? А далее проводим проверку только по температуре?
Если идея в том, что сценарий должен срабатывать (запускать блок start), когда хотя бы один из насосов включен, то абсолютно верно.
-
Можно задать несколько команд - массив команд, и в каждой проверять условие:
- если нужно включить котел, а он выключен - то включить. И наоборот.
Все команды будут выполняться подряд. После включения можно сразу выйти: "exit":1
Спасибо за ответы! Сразу выйти - это чтобы не проверять следующее условие? Или какое-то еще значение несет?
-
Сразу выйти - это чтобы не проверять следующее условие? Или какое-то еще значение несет?
Да, в данном случае этого можно не делать, т.к. температура не может быть одновременно и меньше и больше.
Но если сделать например так:
{ "if":"(условие истинное) && (#BOILER#.dval == 0)", "exec":{"do":"#BOILER#.aon" }}, { "if":"(условие истинное) && (#BOILER#.dval == 1)", "exec":{"do":"#BOILER#.aoff"}}
То могут выполниться обе команды, так как #BOILER#.dval == 1 на момент проверки второго условия может быть уже true
-
Вопрос. Имеем такое "предусловие":
"start":{ "event":"#BOILER#,#PUMP1#,#PUMP2#,#PUMP3#,#PUMP4#", "if":"(#BOILER#.auto == 1) && ( (#PUMP1#.dval == 1) || (#PUMP2#.dval == 1) || (#PUMP3#.dval == 1) || (#PUMP4#.dval == 1) )" },
По нему получается что если все PUMP будут выключены, то основная функция не сработает? Получаем что если котел был включен и все насосы вдруг выключились, то основное условие не отработает - значит котел не выключиться.
-
Получаем что если котел был включен и все насосы вдруг выключились, то основное условие не отработает - значит котел не выключиться.
Но раньше было:
Он же включен когда включен хотя бы один насос контуров отопления.
и
@intrapro:Если идея в том, что сценарий должен срабатывать (запускать блок start), когда хотя бы один из насосов включен, то абсолютно верно.
Возможно, не полностью понимаю Вашу задачу. Но можно же убрать предусловие, а условия проверять внутри.
И наверно нужно добавить в триггеры датчик температуры
"start":{ "event":"#BOILER#,#PUMP1#,#PUMP2#,#PUMP3#,#PUMP4#,#DT#", "if":"(#BOILER#.auto == 1)" }, "functions":{ "start":[ // если котел включен, все насосы выключены - выключить котел и выйти { "if":"(#BOILER#.dval == 1)&&(#PUMP1#.dval == 0)&&(#PUMP2#.dval == 0)&&(#PUMP3#.dval == 0)&&(#PUMP4#.dval == 0)", "exec":{"do":"#BOILER#.aoff", "exit":1 }}, // если все насосы выключены - просто выйти { "if":"(#PUMP1#.dval == 0)&&(#PUMP2#.dval == 0)&&(#PUMP3#.dval == 0)&&(#PUMP4#.dval == 0)", "exec":{"exit":1 }}, //Дальше команды будут выполняться, если хотя бы один насос работает { "if":"(#DT#.aval < #BOILER#.temp) && (#BOILER#.dval == 0)", "exec":{"do":"#BOILER#.aon", "exit":1 }}, { "if":"(#DT#.aval > #BOILER#.temp) && (#BOILER#.dval == 1)", "exec":{"do":"#BOILER#.aoff"}} ] }
-
Задача - рулить резервным котлом в зависимости от:
1. Нужно ли тепло в данный момент (включен хотя бы один насос рециркуляции)?
2. Работает ли основной котел (косвенный признак его нормальной работы - температура на подаче равна 40+-5градусов)
Поэтому не вижу смысла постоянно отслеживать температуру подачи основного котла. Только состояние рециркуляционных насосов и auto-режима. Поймите, мне просто хочется глубже понять как работает синтаксис сценариев.
Сейчас у меня основные условия такие:
"start": { "event": "#BOILER#,#PUMP1#,#PUMP2#,#PUMP3#,#PUMP4#", "if": "(#BOILER#.auto == 1) && ( (#PUMP1#.dval == 1) || (#PUMP2#.dval == 1) || (#PUMP3#.dval == 1) || (#PUMP4#.dval == 1) )" }, "functions": { "start": [ { "if": "(#DT#.aval < (#BOILER#.temp - #BOILER#.hst)) && (#BOILER#.dval == 0)", "exec": { "do": "#BOILER#.aon"} }, { "if": "(#DT#.aval > (#BOILER#.temp + #BOILER#.hst)) && (#BOILER#.dval == 1)", "exec": {"do": "#BOILER#.aoff"} } ] }
Просто когда в голове провернул текущий алгоритм включения и выключения резервного котла, то сделал умозаключение что может быть такое стечение обстоятельств (под конец режима прогрева основной котел ушел в ошибку, магистраль остыла, включился резервный котел, а дом по инерции прогрелся и все насосы отключились), что он не выключиться и будет бесполезно греть магистраль и маслать насосом пока дому снова не потребуется тепло.
Это как с последним запуском ракето-носителя Союз… - "несовершенный алгоритм программного обеспечения системы управления разгонного блока "Фрегат" и неверные азимуты пуска".
-
Поэтому не вижу смысла постоянно отслеживать температуру подачи основного котла.
Да, Вы правы, это излишне. По температуре работают насосы.
…может быть такое стечение обстоятельств (под конец режима прогрева основной котел ушел в ошибку, магистраль остыла, включился резервный котел, а дом по инерции прогрелся и все насосы отключились), что он не выключиться и будет бесполезно греть магистраль и маслать насосом пока дому снова не потребуется тепло.
Тогда добавим подзадачу: При остановке всех насосов резервный котел отключить
Предусловие тогда будет таким: Бойлер в авто И (один из насосов включен ИЛИ все насосы выключены И Бойлер включен)
"if": "(#BOILER#.auto == 1) && ( (#PUMP1#.dval == 1) || (#PUMP2#.dval == 1) || (#PUMP3#.dval == 1) || (#PUMP4#.dval == 1) || (#PUMP1#.dval == 0) && (#PUMP2#.dval == 0) && (#PUMP3#.dval == 0) &&(#PUMP4#.dval == 0)&&(#BOILER#.dval == 1))" // В функцию start добавим первую строку для обработки этой ситуации "functions": { "start": [ { "if": " (#PUMP1#.dval == 0) && (#PUMP2#.dval == 0) && (#PUMP3#.dval == 0) &&(#PUMP4#.dval == 0)", "exec": {"do": "#BOILER#.aoff", "exit":1} }, { "if": "(#DT#.aval < (#BOILER#.temp - #BOILER#.hst)) && (#BOILER#.dval == 0)", "exec": { "do": "#BOILER#.aon"} }, { "if": "(#DT#.aval > (#BOILER#.temp + #BOILER#.hst)) && (#BOILER#.dval == 1)", "exec": {"do": "#BOILER#.aoff"} } ] }
Либо можно сделать всего две строки - объединить условия для выключения
"functions": { "start": [ { "if": "(#BOILER#.dval == 1) && ((#DT#.aval > (#BOILER#.temp + #BOILER#.hst)) || || (#PUMP1#.dval == 0) && (#PUMP2#.dval == 0) && (#PUMP3#.dval == 0) &&(#PUMP4#.dval == 0))", "exec": {"do": "#BOILER#.aoff", "exit":1} }, { "if": "(#BOILER#.dval == 0)&&(#DT#.aval < (#BOILER#.temp - #BOILER#.hst))", "exec": { "do": "#BOILER#.aon"} } ] }
Обратите внимание, что перенос строки в условии не допускается. Также как и комментарии.
Здесь сделано только для удобства просмотра.
Это как с последним запуском ракето-носителя Союз… - "несовершенный алгоритм программного обеспечения системы управления разгонного блока "Фрегат" и неверные азимуты пуска".
Короче, во всем виноваты проклятые программисты