Управление отоплением



  • В принципе получилось. Но! По мне так неправильно:

    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 типы можно будет добавлять и изменять интерактивно



  • @intrapro:

    Это вопрос спорный 🙂 По одному датчику температуры могут несколько устройств работать. В версии Berry свойства добавляются к главному устройству сценария, которое управляется.

    Да, Вы правы. Тогда логичнее всего делать настройку гистерезиса (как тонкая настройка при ПНР) именно при выборе датчика температуры. Пытался сделать:) прописав в param:

    "HST":{"note":"Гистерезис температуры включения/выключения насоса", "type":"num", "defval":"1"}
    
    

    Понял, что обработчик не понимает меня…что вы и подтверждаете.
    @intrapro:

    Настройку можно скрыть, тогда пользователь ее не увидит - добавить свойство hide:

    Это конечно хорошо, но в Berry (в Cherry вроде Вы хотели реализовать редактирование скриптов через веб) надо значит по ssh лезть на сервер и ручками править defval. Не комильфо это для администратора системы, которая почти полностью настраивается через веб!
    @intrapro:

    Изменять настройку можно в PM - пункт Установки, который стандартно не задействован.

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

    Спасибо, но, думаю, не стоит заморачиваться раз все так "сложно". Было бы этих уставок как на большом промышленном объекте, тогда да.



  • @intrapro:

    Это было предусмотрено для группировки сценариев при просмотре. Для шаблонных сценариев сейчас это свойство не используется.

    Значит можно удалить.
    @intrapro:

    500 - Универсальный дискретный актуатор

    Вы правы, добавим список типов устройств как таблицу для просмотра в PM.

    В Cherry типы можно будет добавлять и изменять интерактивно

    Как вариант разместить в вики, тут ну или справочно в РМ. Главное не "перегрузить" РМ. А то меня вот этот перечень - 500,550,610,620,630,710 - заинтересовал. Кроме 500 ничего не знаю. А, кстати, в Berry было бы логично размещать коды устройств тут:
    Коды_Устройств.png
    Cherry пока не использовал.



  • @Alex_Jet:

    А, кстати, в Berry было бы логично размещать коды устройств тут:

    Да, наверно это логично. Но при разработке Berry была основная идея - как можно меньше всяческих кодов, как можно проще делать простые вещи. В Cherry упор на универсальность, будем надеяться, не в ущерб простоте.

    @Alex_Jet:

    Как вариант разместить в вики, тут ну или справочно в РМ.

    Дело в том, что набор типов устройств а) пополняется, б) зависит от конфигурации (Scada, Smart Home). Поэтому поступили проще - добавили в PM табличку "Типы устройств" сразу после "Устройства". Табличка только для просмотра, редактировать типы интерактивно в Berry нельзя.

    Можно обновиться и посмотреть.



  • В принципе все информативно стало - иконки - это те, которые по умолчанию назначены? Только в списке нет 550 и 620.



  • @Alex_Jet:

    иконки - это те, которые по умолчанию назначены?

    Да

    @Alex_Jet:

    Только в списке нет 550 и 620.

    Эти устройства есть в расширенной конфигурации, которая используется для наших инсталляций:

    550 - Управляемая розетка

    620 - Теплый пол

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



  • @intrapro:

    Эти устройства есть в расширенной конфигурации, которая используется для наших инсталляций:

    550 - Управляемая розетка

    620 - Теплый пол

    Да, кстати, недавно задумывался - "а почему же нет таких стандартных устройств". И мне не понятно почему Вы исключили их из стандартной версии…можно как-то поиметь для Berry? Или не заморачиваться и выбирать универсальный актюатор?



  • @Alex_Jet:

    Или не заморачиваться и выбирать универсальный актюатор?

    Можно не заморачиваться



  • Задача - управлять резервным (электрическим) котлом в зависимости от состояния насосов и температуры подачи основного котла. Поскольку пока не имею возможности вывести сигнал неисправности с основного газового котла 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?



  • @Alex_Jet:

    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), когда хотя бы один из насосов включен, то абсолютно верно.



  • @intrapro:

    Можно задать несколько команд - массив команд, и в каждой проверять условие:

    • если нужно включить котел, а он выключен - то включить. И наоборот.

    Все команды будут выполняться подряд. После включения можно сразу выйти: "exit":1

    Спасибо за ответы! Сразу выйти - это чтобы не проверять следующее условие? Или какое-то еще значение несет?



  • @Alex_Jet:

    Сразу выйти - это чтобы не проверять следующее условие? Или какое-то еще значение несет?

    Да, в данном случае этого можно не делать, т.к. температура не может быть одновременно и меньше и больше.

    Но если сделать например так:

                   { "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 будут выключены, то основная функция не сработает? Получаем что если котел был включен и все насосы вдруг выключились, то основное условие не отработает - значит котел не выключиться.



  • @Alex_Jet:

    Получаем что если котел был включен и все насосы вдруг выключились, то основное условие не отработает - значит котел не выключиться.

    Но раньше было:

    @Alex_Jet:

    Он же включен когда включен хотя бы один насос контуров отопления.

    и
    @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"}
                }
            ]
        }
    
    

    Просто когда в голове провернул текущий алгоритм включения и выключения резервного котла, то сделал умозаключение что может быть такое стечение обстоятельств (под конец режима прогрева основной котел ушел в ошибку, магистраль остыла, включился резервный котел, а дом по инерции прогрелся и все насосы отключились), что он не выключиться и будет бесполезно греть магистраль и маслать насосом пока дому снова не потребуется тепло.

    Это как с последним запуском ракето-носителя Союз… - "несовершенный алгоритм программного обеспечения системы управления разгонного блока "Фрегат" и неверные азимуты пуска".



  • @Alex_Jet:

    Поэтому не вижу смысла постоянно отслеживать температуру подачи основного котла.

    Да, Вы правы, это излишне. По температуре работают насосы.

    @Alex_Jet:

    …может быть такое стечение обстоятельств (под конец режима прогрева основной котел ушел в ошибку, магистраль остыла, включился резервный котел, а дом по инерции прогрелся и все насосы отключились), что он не выключиться и будет бесполезно греть магистраль и маслать насосом пока дому снова не потребуется тепло.

    Тогда добавим подзадачу: При остановке всех насосов резервный котел отключить

    Предусловие тогда будет таким: Бойлер в авто И (один из насосов включен ИЛИ все насосы выключены И Бойлер включен)

      "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"}
                }
            ]
        }
    
    

    Обратите внимание, что перенос строки в условии не допускается. Также как и комментарии.

    Здесь сделано только для удобства просмотра.

    @Alex_Jet:

    Это как с последним запуском ракето-носителя Союз… - "несовершенный алгоритм программного обеспечения системы управления разгонного блока "Фрегат" и неверные азимуты пуска".

    Короче, во всем виноваты проклятые программисты 😄


Log in to reply