РЕКЛАМА НА ФОРУМХАУС на скрине версия биндинга 1.10 поэтому в paper ui он не появится настраивать по старинке)
Modbus binding 1.10 Верно уже заметили, что нужно его в ручную прописывать. Но работает стабильно. Нареканий нет.
Я собрал систему на OpenHAB2 и MegaD-2561 - получилось вполне себе бюджетно. Я даже не знаю, можно ли бюджетней собрать.
Кстати непонятно куда физически прописываются настройки биндингов 2. х никаких конфиг файлов не создается как бекапить конфигурацию? пока единственный вариант копировать весь каталог с ОН
Второй день стучания в бубен. Тесты с подбором параметров через Modbus Poll и какой-то косяк с комментами в файле items. Но все получилось. Удалось достучаться до реле. Работает реально быстро. Смена состояния в браузере отражается практически одновременно с установкой параметра MP. Теперь осталось понять как работать с битовыми масками, поскольку есть один регистр на вход и один на выход. Походу нужны какие-то виртуальные кнопки или как это лучше сделать? Плюс еще как-то отследить нажатие кнопки для перевода состояний. Как делается по циклу понимаю, а как сделать в концепте ОН пока не очень. Может у кого-то есть примеры?
Посмотрите мои примеры, я постил рулесы в соседней ветке. Смотреть в сторону тригеров Код: rule "Protect" when Item PCode_0 changed from CLOSED to OPEN or Item PCode_1 changed from CLOSED to OPEN or Item PCode_2 changed from OPEN to CLOSED or Item Test_Protect changed from OFF to ON .....
что имеется ввиду? что прилетает в он и что надо сделать? надо видеть ваши items, sitemap и rules чтобы рассмотреть предметно у меня macos. вся движуха происходит в каталоге он. полное копирование сохраняет настройки просто не видя конфигов создается ощущение что настройки могут слететь. может ошибаюсь какие файлы находятся в этих каталогах?
спасибо, уже разобрался. Сделал виртуальные свитчи, которые по 1 байтовому регистру управляют релюхами. Теперь осталось сделать отображение состояния релюх. Код: rule "Owen Switch1" when Item Owen_Switch1 received command then var n=(Owen_State.state as DecimalType).intValue logInfo("Owen_Switch1", "Processing command") if(receivedCommand != null){ switch(receivedCommand.toString.upperCase) { case "ON" : { Owen_State.sendCommand( n.bitwiseOr(0x01)) } case "OFF":{ Owen_State.sendCommand( n.bitwiseAnd(0x0E) ) } } } end
А это читали? https://docs.openhab.org/addons/bindings/modbus1/readme.html SwitchMySwitch "MyModbusSwitch" (ALL) {modbus="slave1:<6:>7"} статус в ui при этом обновляется автоматически тк вы прописываете в items связь выключателя (Switch) и канала в фигурных скобках {}. говорите ОН - по биндингу modbus, на канале "slave1" из адреса 6 читаем (знак <), в 7 пишем(>) через rule в текущем варианте статусы не сделаете. например, если с другого устройства переключить реле, ОН этого не заметит и в приложении статус не поменяется чтобы обновился статус, информация должна поступить в он, а без прописанного в items канала (например {modbus="slave1:<6:>7"}) это никак я вообще с modbus не работал, но в случае с knx смысл тот же Switch light_bath_up "Bath Light" (Lights,Bath_Lights) { knx="2/1/0+<2/1/1" } имеется биндинг и адреса куда писать и откуда читать
конечно видел - но не получается, Насколько понял для этого должен быть тип Coil, который Owen не поддерживает. Вр всяком слуае OH у меня нарисовал 10 файлов логов с ошибками. Но в целом согласен - получается крайне не удобно.
Не ну это говен, тут уже не подскажу. главное понять смысл - чтоб была обратная связь, инфа должна поступать в он хотя если почитать: Switch MySwitch "My Modbus Switch" (ALL) {modbus="slave1:5"} where slave1 is the name of the slave in openhab configuration, and 5 is the reference to the coil, discrete input, input register or holding register. то есть может быть: coil или discrete input или input register или holding register копните в этом направлении
ПЛК Овен + OH прекрасно работают с Coil Спойлер: Пример items DateTime Datum "[%1$tA, %1$td.%1$tm.%1$tY %1$tH:%1$tM]" <clock> { channel="ntp:ntp:local:dateTime" } String LocalTime_Date { channel="ntp:ntp:3b8ac082:String" } Number cfgMode "Mode[%s]" <shield> Number cfgModeCO "Режим СО[%s]" <settings> Number cfgModePol "Режим Пол[%s]" <settings> Number cfgModePwSw01 "Режим PwSw[%s]"<settings> Number Chart_Period "Период" Number Chart_Period2 "Период" Switch K1 "Котел 1[MAP (baxi.map):%s]" <switch> (Kotel_1) { modbus="slave1:0" } Switch K2 "Котел 2[MAP (baxi.map):%s]" <switch> (Kotel_2) { modbus="slave1:1" } Switch AlertWater "Датчик протечки [MAP (AlertWater.map):%s]" (Water) { modbus="slave1:2" } Contact ModeSO "Статус: СО [MAP (ModeSO.map):%s]" (Heat_Engine) { modbus="<[slave1:3]" } Contact ModePol "Статус: Пол [MAP (ModePol.map):%s]" (Heat_Engine) { modbus="<[slave1:4]" } Contact Tb "Режим ГВС/СО [MAP (Tb.map):%s]" (Heat_Engine) { modbus="<[slave1:5]" } Contact Ntpol_ "Насос ТП [MAP (Nasos.map):%s]" <pump> (Heat_Engine) { modbus="<[slave1:6]" } Contact Ngvs_ "Насос ГВС [MAP (Nasos.map):%s]" <pump> (Heat_Engine) { modbus="<[slave1:7]" } Contact Nso_ "Насос СО [MAP (Nasos.map):%s]" <pump> (Heat_Engine) { modbus="<[slave1:8]" } Contact K1gvs_ "Котел 1. Режим работы [MAP (KXgvs.map):%s]" (Kotel_1) { modbus="<[slave1:9]" } Contact K2gvs_ "Котел 2. Режим работы [MAP (KXgvs.map):%s]" (Kotel_2) { modbus="<[slave1:10]" } Contact K1so_ "Котел 1. Режим лето/зима [MAP (KXso.map):%s]" (Kotel_1) { modbus="<[slave1:11]" } Contact K2so_ "Котел 2. Режим лето/зима [MAP (KXso.map):%s]" (Kotel_2) { modbus="<[slave1:12]" } Contact Warning "Авария" <siren> (Heat_Engine) { modbus="<[slave1:13]" } Switch GLock "Gidro Lock [MAP (glock.map):%s]" <faucet> (Water) { modbus="slave1:14" } Switch Pompa "Помпа [MAP (pompa.map):%s]" (Water) { modbus="slave1:15" } Contact Door1 "Секционные [MAP (door.map):%s]" (Doors) { modbus="<[slave1:16]" } Contact Door2 "Калитка секц. [MAP (door.map):%s]" (Doors) { modbus="<[slave1:17]" } Contact Door3 "Распашные 1 [MAP (door.map):%s]" (Doors) { modbus="<[slave1:18]" } Contact Door4 "Калитка [MAP (door.map):%s]" (Doors) { modbus="<[slave1:19]" } Contact Door5 "Распашные 2 [MAP (door.map):%s]" (Doors) { modbus="<[slave1:20]" } Switch btDoor00 <slider> { modbus="slave1:21" } Switch btDoor02 <slider> { modbus="slave1:22" } Switch btDoor01 <slider> { modbus="slave1:23" } Contact l1 (Water) { modbus="<[slave1:24]" } Contact l2 (Water) { modbus="<[slave1:25]" } Contact l3 (Water) { modbus="<[slave1:26]" } Switch ProtectAlarm "Night" <siren> { modbus="slave1:30" } Switch ProtectRest "Night" <slider> { modbus="slave1:31" } Contact PCode_0 "Гараж [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:32]" } Contact PCode_1 "Мастерская [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:33]" } Contact PCode_2 "Котельная [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:34]" } Contact PCode_3 "Ванная 0 эт [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:35]" } Contact PCode_4 "Фойе 2 эт [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:36]" } Contact PCode_5 "Прихожая [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:37]" } Contact PCode_6 "Ванная 1 эт [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:38]" } Contact PCode_7 "Гараж-Стекло [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:39]" } Contact PCode_8 "Мастерская-Стекло [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:40]" } Contact PCode_9 "Котельная-Стекло [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:41]" } Contact PCode_10 "Ванная 0 эт-Стекло [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:42]" } Contact PCode_11 "Ванная 1 эт-Стекло [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:43]" } Contact PCode_12 "Секционные ворота [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:44]" } Contact PCode_13 "Калитка сек. ворот [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:45]" } Contact PCode_14 "Распашные ворота 1 [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:46]" } Contact PCode_15 "Распашные ворота 2 [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:47]" } Contact PCode_16 "Калитка уличная [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:48]" } Contact PCode_17 "Хозблок ворота [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:49]" } Contact PCode_18 "Резерв [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:50]" } Contact PCode_19 "Резерв [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:51]" } Contact PCode_20 "Резерв [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:52]" } Contact PCode_21 "Резерв [MAP (pcode.map):%s]" <protect> { modbus="<[slave1:53]" } Contact PCode_22 "KNS [MAP (pcode.map):%s]" <siren> { modbus="<[slave1:54]" } Contact PCode_23 "T ГВС! [MAP (pcode.map):%s]" <siren> { modbus="<[slave1:55]" } Contact PCode_24 "P SO! [MAP (pcode.map):%s]" <siren> { modbus="<[slave1:56]" } Contact, Switch - это все coil Код: # Bool modbus:tcp.slave1.connection=192.168.0.10:502 modbus:tcp.slave1.id=1 modbus:tcp.slave1.start=0 modbus:tcp.slave1.length=512 modbus:tcp.slave1.type=coil Все легко меняется. Если переменная изменилась в rules - нужно вызвать один из методов: NameVar.sendCommand(value) postUpdate(NemaVar, value) и она тут же отразится в интерфейсе
это да, если переменная изменилась но у kam711 она там не изменится в его конфигурации - я об этом да и каждую переменную обыгрывать в rules - чокнуться можно. это неправильный подход нужно их в items обрабатывать
Добился все-таки правильного отражения статусов. Даже при изменении из других источников. Код: rule "Owen State" when System started or Item Owen_State changed then var n=(Owen_State.state as DecimalType).intValue if(n.bitwiseAnd(0x01)!=0 ){ Owen_Switch1.sendCommand(ON) } else { Owen_Switch1.sendCommand(OFF) } if(n.bitwiseAnd(0x02)!=0 ){ Owen_Switch2.sendCommand(ON) } else { Owen_Switch2.sendCommand (OFF) } if(n.bitwiseAnd(0x04)!=0 ){ Owen_Switch3.sendCommand(ON) } else { Owen_Switch3.sendCommand (OFF) } if(n.bitwiseAnd(0x08)!=0 ){ Owen_Switch4.sendCommand(ON) } else { Owen_Switch4.sendCommand (OFF) } end Но блин такой секас мне как-то совсем не по душе. Код конечно тупой, но его получается много. Без Coil на модбасе с одним регистром делать нечего. Буду пробовать входы - посмотрим как будет получаться.