Плагин Modbus



  • 02.02 17:29:47.930 IH: get [{"id":"TUl","value":-38}]
    02.02 17:29:47.931 IH: set {"ACTORA1":{"aval":-4,"err":0}}
    
    

    Вот. Вместо -3,8 показывает -4



  • @intrapro:

    А что вы с расписанием делать хотите? И каков смысл этих 42 нулей?

    Поставил такие настройки в расписании

    строка приняла вид

    (9) Комнатное устройство : Расписание	[0,154,193,394,456,678,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]	modbus: 43375
    
    


  • @Erik:

    > 02.02 17:29:47.930 IH: get [{"id":"TUl","value":-38}]
    > 02.02 17:29:47.931 IH: set {"ACTORA1":{"aval":-4,"err":0}}
    > 
    

    Вот. Вместо -3,8 показывает -4

    А формула какая? value/10 ?



  • @Erik:

    @intrapro:

    А что вы с расписанием делать хотите? И каков смысл этих 42 нулей?

    Поставил такие настройки в расписании

    строка приняла вид

    > (9) Комнатное устройство : Расписание	[0,154,193,394,456,678,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]	modbus: 43375
    > 
    

    Да, загадочно 😉 Если подойти по простому, получается, на каждый элемент настройки всего по два элемента массива. Это время в минутах от начала суток. А где положение ползунка? Что он кстати означает?

    Я так понимаю, это интерфейс самого контроллера. А в IH вы что хотите видеть? Цель какая?



  • @intrapro:

    А формула какая? value/10 ?

    Math.round(value/10)
    
    


  • @Erik:

    @intrapro:

    А формула какая? value/10 ?

    > Math.round(value/10)
    > 
    

    Math.round как раз и округляет. Если хотите с десятыми, просто value/10



  • @intrapro:

    Да, загадочно 😉 Если подойти по простому, получается, на каждый элемент настройки всего по два элемента массива. Это время в минутах от начала суток. А где положение ползунка? Что он кстати означает?

    Я так понимаю, это интерфейс самого контроллера. А в IH вы что хотите видеть? Цель какая?

    Там можно задать от 0 до 3-х периодов в день, когда работает режим комфорт.

    В остальное время работает режим эконом.

    Поэтому там у каждого дня недели по 3 полосы (в графическом интерфейсе).

    А в регистре модбас эти периоды подряд перечисляются, через запятую - начало, конец, начало, конец, в минутах от начала суток.



  • Отображалку сделал.

    Все работает.



  • @Erik:

    Отображалку сделал.

    Получилось хорошо. Мне нравится.

    При этом сделано на контроллере с плагином Modbus :!:

    Вы показывали скриншот с большим количеством сетевых соединений в мажордомо:

    https://frm.intrahouse.ru/viewtopic.php?f=18&t=5321&sid=51f9c0ff16eaaf41d3c451e8b15a8386&start=30

    Какая ситуация сейчас в intraHouse с плагином Modbus?



  • @intrahouse:

    @Erik:

    Отображалку сделал.

    Получилось хорошо. Мне нравится.

    При этом сделано на контроллере с плагином Modbus :!:

    Вы показывали скриншот с большим количеством сетевых соединений в мажордомо:

    https://frm.intrahouse.ru/viewtopic.php?f=18&t=5321&sid=51f9c0ff16eaaf41d3c451e8b15a8386&start=30

    Какая ситуация сейчас в intraHouse с плагином Modbus?

    Сейчас все отлично! Все регистры опрашиваются/записываются внутри одного TCP соединения, ошибок нет, работает устойчиво.

    Сделал все исключительно на аналоговых актуаторах. 🙂

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

    Вопросов по взаимодействию с модбас устройством на этом этапе не возникло, все легко и понятно. Когда доберусь до более сложных задач (типа расписания), тогда возможно появятся вопросы. А пока мне производитель контроллера сообщил, что через модбас с раписанием работать в текущей прошивке нельзя 🙂

    Чего лично мне не хватило в IH.

    Возможности привязывать состояние одного объекта к значению или состоянию другого.

    Чтобы в выборе "границ" состояний можно было еще и другое устройство указать.

    Тогда без лишних трудозатрат можно на одном виджете отображать разные наборы элементов.

    Спасибо за отличный плагин!



  • @intrapro:

    Здесь нужны кнопки + сценарии

    Можно сделать мультисценарий, который будет присваивать новое значение c заданным шагом, при этом еще проверять выход за границы. step - шаг - будем передавать с кнопки как параметр

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

    /** 
    * @name Увеличение уставки T комнаты на шаг  
    * @desc  
    * @version 4  
    */
    
    script({
        start(step) {
           step = Number(step);
           let newvalue1 = ACTORA7.value+step;
           if ((ACTORA3.value = 0)) ACTORA7.setValue(newvalue1);
           let newvalue2 = ACTORA8.value+step;
           if ((ACTORA3.value = 1))  ACTORA8.setValue(newvalue2);
           let newvalue3 = ACTORA9.value+step;
           if ((ACTORA3.value = 3))  ACTORA9.setValue(newvalue3);
        } 
    });
    
    

    И ничего не просиходит. Ни ошибок, ни действий.

    Сделайте в блоках арифметику, пожалуйста 🙂

    Из-за "+1" заставлять учить синтаксис - это же геноцид!!! 🙂



  • @Erik:

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

    И ничего не просиходит. Ни ошибок, ни действий.

    Сделайте в блоках арифметику, пожалуйста 🙂

    Из-за "+1" заставлять учить синтаксис - это же геноцид!!! 🙂

    Все нормально у вас с синтаксисом

    Просто в сценарии нужно объявить устройства, с которыми он работает

    Если вы не хотите использовать мультисценарий, достаточно написать так

    /** 
    * @name Увеличение уставки T комнаты на шаг  
    * @desc  
    * @version 4  
    */
    
    const ACTORA3 = Device("ACTORA3");
    const ACTORA7 = Device("ACTORA7");
    const ACTORA8 = Device("ACTORA8");
    const ACTORA9 = Device("ACTORA9");
    
    script({
        start(step) {
           step = Number(step);
           let newvalue1 = ACTORA7.value+step;
           if (ACTORA3.value == 0) ACTORA7.setValue(newvalue1);
           let newvalue2 = ACTORA8.value+step;
           if (ACTORA3.value == 1)  ACTORA8.setValue(newvalue2);
           let newvalue3 = ACTORA9.value+step;
           if (ACTORA3.value == 3)  ACTORA9.setValue(newvalue3);
        } 
    });
    
    

    И операция проверки равенства это ==

    Одиночный = это присваивание

    Увидеть ошибку сценария после его запуска можно в PM - Рабочие сценарии. Там ошибка должна быть, что устройства не определены

    Также там есть Отладчик, аналогичный отладчику плагина. Можно в отдельной вкладке открыть PM, встать на сценарий, выбрать Отладчик, нажать play, там будет виден ход выполнения сценария.

    Насчет арифметики в блок-схеме - да, вы правы, сделаем.Но не в ближайшем будущем 🙂



  • Спасибо.

    Мультисценарий не понимаю, как сделать.

    В другой комнате все актуаторы другие.

    Передавать сценарию номера 4-х актуаторовв и значение шага через запятую?

    А в сценарии парсить строку параметров?

    Что-то типа

    const ao = Device("ActorA","Регулируемый актуатор");
    start(A,B,C,D,step) {
           A = Number(A,,,,);
           B = Number(,B,,,);
           C = Number(,,C,,);
           D = Number(,,,D,);
           step = Number(,,,,step);
           let newvalue1 = aoB.value+step;
           if ((aoA.value == 0)) aoB.setValue(newvalue1);
           let newvalue2 = aoC.value+step;
           if ((aoA.value == 1))  aoC.setValue(newvalue2);
           let newvalue3 = aoD.value+step;
           if ((aoA.value == 3))  aoD.setValue(newvalue3);
        } 
    ;
    
    


  • @intrapro:

    Просто в сценарии нужно объявить устройства, с которыми он работает

    Если вы не хотите использовать мультисценарий, достаточно написать так

    Сравнение с нулем оказывается 3 знака равенства (===) 🙂

    Скрипт работает, спасибо.

    Но.

    Скрипт изменяет значение, но в поле оно сразу не отображается. Оно улетает на контроллер функцией FC6, потом считывается функцией FC3, и только потом отображается. Контроллер у меня не спешный, и между нажатиям и изменением отображаемого значения проходит 1-2 секунды.

    Нужно модбас устройство, которое имеет только функцию записи (FC6). Чтобы в виждете устройство отображало цифру, введенную на сервере, и писало ее в контроллер при изменении.

    С одной стороны тут бы как раз параметры из свойств устройств модбаса пригодились.

    Создать модбас устройство не привязанное к своему регистру, но с параметром, записывающим чужой регистр?



  • @Erik:

    Мультисценарий не понимаю, как сделать.

    В другой комнате все актуаторы другие.

    Передавать сценарию номера 4-х актуаторовв и значение шага через запятую?

    А в сценарии парсить строку параметров?

    Идея мультисценария в том, что в Device задается не конкретное устройство, а класс: "SensorD", "SensorA", "ActorD", "ActorA", "Meter"

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

    Чтобы из простого сценария сделать мульти, нужно:

    1. Вместо конкретных устройств проставить класс - в вашем случае ActorD или ActorA.

    Чтобы ориентироваться в таблице "Запуск для устройств" можно добавить названия каждого параметра

    /** 
    * @name Увеличение уставки комнаты на шаг  
    * @desc  
    * @version 4  
    */
    const ACTORA3 = Device("ActorA", "Режим");
    const ACTORA7 = Device("ActorA", "Уставка комфорт");
    const ACTORA8 = Device("ActorA", "Уставка ночь");
    const ACTORA9 = Device("ActorA", "Уставка эконом");
    
    script({
        start(step) {
           step = Number(step);
           let newvalue1 = ACTORA7.value+step;
           if (ACTORA3.value == 0) ACTORA7.setValue(newvalue1);
           let newvalue2 = ACTORA8.value+step;
           if (ACTORA3.value == 1)  ACTORA8.setValue(newvalue2);
           let newvalue3 = ACTORA9.value+step;
           if (ACTORA3.value == 3)  ACTORA9.setValue(newvalue3);
        } 
    });
    
    

    Сами названия устройств - параметров можно оставить как есть, можно заменить на более общие - неважно

    Сохранить скрипт

    2. В нижней табличке (там же где скрипт) выбрать "Запуск для устройств" и создать наборы для комнат:

    Там все просто - выбираются устройства для каждого параметра.

    В результате получаются сценарии:

    Увеличение уставки комнаты на шаг(ACTORA3, ACTORA7, ACTORA8, ACTORA9) - для одной комнаты

    Увеличение уставки комнаты на шаг(ACTORA3, ACTORA17, ACTORA18, ACTORA19) - для другой комнаты

    и т д

    3. На кнопку теперь нужно привязать конкретный сценарий. Они все будут доступны в списке

    А параметр (step) - остается как есть



  • каким образом скрипт разберется какой ActorA куда подставлять?



  • @Erik:

    каким образом скрипт разберется какой ActorA куда подставлять?

    По имени

    scene_dev_set.png



  • @Erik:

    Скрипт работает, спасибо.

    Но.

    Скрипт изменяет значение, но в поле оно сразу не отображается. Оно улетает на контроллер функцией FC6, потом считывается функцией FC3, и только потом отображается. Контроллер у меня не спешный, и между нажатиям и изменением отображаемого значения проходит 1-2 секунды.

    Нужно модбас устройство, которое имеет только функцию записи (FC6). Чтобы в виждете устройство отображало цифру, введенную на сервере, и писало ее в контроллер при изменении.

    Тогда теряем обратную связь 😞 Нет гарантии, что записанное нами принято контроллером

    В Berry у нас был флаг "Односторонняя связь" для устройств, в которые можно только писать. Его же применяли для "задумчивых" устройств.

    В этом случае значение принимается сервером как текущее в момент отправки.

    Мы как раз планировали добавить этот флаг. Будет при следующем обновлении системы.



  • Сделал обзор IH на форуме производителя моего контроллера.

    http://www.hydrotherm.ru/proba/phorum/read.php?1,3475



  • Отлично! 😄


Log in to reply