UWAGA: Strona oraz Forum Smart'ny Dom nie będzie dostępne 23 Grudnia 2024 ze względu na przenoszenie serwisu na mocniejszą maszynę.
W tym czasie polecam poświęcenie swojego czasu na pomoc partnerowi w przygotowaniu udanych Świąt 😉
Za niedogodności z góry przepraszam, admin
Witam jak w temacie.
Rules:
rule "Zapis FC6" when Item Pk1S_S changed then if (Pk1S_S.state == ON) { Pk1S.sendCommand(1) } else { Pk1.sendCommand(0) } end
Things:
Bridge modbus:tcp:Przekazniki "Przekaźniki Bridge" [ host="192.168.xx.xx", port=4196, id=1] { Bridge poller PkStrych "PK" [ start=2, length=2, refresh=1000, type="holding" ] { Thing data Pk1 "PK1" [ writeStart="3", writeValueType="int16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="false"] } }
Items:
Switch Pk1S_S "PK1" {channel="modbus:data:Przekazniki:PkStrych:Pk1:switch"} Number Pk1S "PK 1 [%d]" {channel="modbus:data:Przekazniki:PkStrych:PK1:number"}
Efekty nieco inne niż potrzebuję. Podsłuch z analizatora daje po przełączeniu przycisku w OH 01 06 00 03 00 01 B8 0A oraz 01 06 00 03 00 00 79 CA a chciałbym 01 06 00 03 03 00 CRC oraz 01 06 00 03 00 00 79 CA
Wygląda jakby Pk1S.sendCommand(1) zmieniało ostatni bit a ja potrzebuję przedostatni.
Jak to wykonać? Zmiana wartości 1 na np 3, 00, 0x300 w Pk1S.sendCommand(1) nic nie zmienia efekt ten sam 01 06 00 03 00 01 B8 0A
Przykładowa ramka:
Podejrzewam że reguła w ogóle nie działa a zapis bitu 01 i 00 bierze się z zapisu z zmiany pozycji przełącznika.
Czołem
Może być jak mówisz - w zbyt wielu miejscach próbujesz wysyłać modbusem i robi się misz-masz.
Ja bym podszedł do tego tak:
Bridge modbus:tcp:Przekazniki "Przekaźniki Bridge" [ host="192.168.xx.xx", port=4196, id=1] { Bridge poller PkStrych "PK" [ start=0, length=16, refresh=1000, type="holding" ] { Thing data Pk1 "PK1" [ readStart="0.1", readValueType="bit", writeStart="0.1", writeValueType="bit" ] Thing data Pk2 "PK2" [ readStart="1.1", readValueType="bit", writeStart="1.1", writeValueType="bit" ] Thing data Pk3 "PK3" [ readStart="2.1", readValueType="bit", writeStart="2.1", writeValueType="bit" ] Thing data Pk4 "PK4" [ readStart="3.1", readValueType="bit", writeStart="3.1", writeValueType="bit" ] Thing data Pk5 "PK5" [ readStart="4.1", readValueType="bit", writeStart="4.1", writeValueType="bit" ] Thing data Pk6 "PK6" [ readStart="5.1", readValueType="bit", writeStart="5.1", writeValueType="bit" ] Thing data Pk7 "PK7" [ readStart="6.1", readValueType="bit", writeStart="6.1", writeValueType="bit" ] Thing data Pk8 "PK8" [ readStart="7.1", readValueType="bit", writeStart="7.1", writeValueType="bit" ] } }
items:
Switch Pk1S_S "PK1" {channel="modbus:data:Przekazniki:PkStrych:Pk1:switch"}
Jedyny problem, to odwrócenie logiki ON w OH będzie oznaczało open a OFF close. Można to obejść używając readTransform i writeTransform.
Witam Panie
Wiesz logika to kosmetyka przy całości 😉
Odczyt musi być raczej od 2 chyba jest takie przesunięcie...
Próbowałem podobnych zapisów bez efektów.
Co do Twojej wersji to wklejam
CONFIGURATION_ERROR writeType=null, writeStart=3.1, and writeValueType=bit should be all present, or all missing! Alternatively, you can provide just writeTransformation, and use transformation returning JSON.
log co ciekawe odnosi się do czego co nie ma
Loading model 'Przekazniki.things' 21:58:53.795 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk1' changed from OFFLINE (CONFIGURATION_ERROR): Out-of-bounds: Poller is reading from index 2 to 16 (inclusive) but this thing configured to read 'bit' starting from element 0. Exceeds polled data bounds. to UNINITIALIZED 21:58:53.815 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk1' changed from UNINITIALIZED to UNINITIALIZED (HANDLER_MISSING_ERROR) 21:58:53.816 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk2' changed from OFFLINE (CONFIGURATION_ERROR): Out-of-bounds: Poller is reading from index 2 to 16 (inclusive) but this thing configured to read 'bit' starting from element 1. Exceeds polled data bounds. to UNINITIALIZED 21:58:53.821 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk2' changed from UNINITIALIZED to UNINITIALIZED (HANDLER_MISSING_ERROR)
things okroiłem na szybko
Bridge modbus:tcp:Przekazniki "Przekaźniki Bridge" [ host="192.168.xx.xx", port=4196, id=1] { Bridge poller PkStrych "Przekaźniki strych" [ start=2, length=15, refresh=1000, type="holding" ] { Thing data Pk3 "PK3" [ readStart="2.1", readValueType="bit", writeStart="2.1", writeValueType="bit" ] Thing data Pk4 "PK4" [ readStart="3.1", readValueType="bit", writeStart="3.1", writeValueType="bit" ] Thing data Pk5 "PK5" [ readStart="4.1", readValueType="bit", writeStart="4.1", writeValueType="bit" ] Thing data Pk6 "PK6" [ readStart="5.1", readValueType="bit", writeStart="5.1", writeValueType="bit" ] Thing data Pk7 "PK7" [ readStart="6.1", readValueType="bit", writeStart="6.1", writeValueType="bit" ] Thing data Pk8 "PK8" [ readStart="7.1", readValueType="bit", writeStart="7.1", writeValueType="bit" ] } }
Faktycznie, adresy nie zaczynają się od 0 tylko od 1 (wg info zamieszonego w tym artykule http://cool-emerald.blogspot.com/2021/10/16-channel-rs485-modbus-relay-board.html). Jeśli chcesz włączyć przekaźnik Pk1, wysyłasz 1 (OFF) na adres 1, jak chcesz wyłączyć wysyłasz 0 (ON). Wg mnie, niepotrzebne wysyłasz 3 (toggle), bo nie wiesz, w jakim stanie jest teraz przekaźnik, lecz zmieniasz po prostu jego stan "na ślepo".
Zgodnie z logiką OH powinieneś odczytać stan poprzez poller, Switch przyjmuje stan odczytany z modułu, np OFF (odczytano 1). Po naciśnięciu switcha stan zmienia się na przeciwny czyli ON, co powoduje wysłanie polecenia 0 do modułu. Poller odczytuje stan z modułu (0) czyli mamy stan ON. Następne naciśnięcie przycisku zmienia stan w OH na OFF, co powoduje wysłanie polecenia 1 do modułu, itd.
Lepiej byłoby tak:
.things
Bridge modbus:tcp:Przekazniki "Przekaźniki Bridge" [ host="192.168.xx.xx", port=4196, id=1] { Bridge poller PkStrych "PK" [ start=1, length=16, refresh=1000, type="holding" ] { Thing data Pk1 "PK1" [ readStart="1", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="1", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk2 "PK2" [ readStart="2", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="2", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk3 "PK3" [ readStart="3", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="3", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk4 "PK4" [ readStart="4", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="4", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk5 "PK5" [ readStart="5", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="5", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk6 "PK6" [ readStart="6", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="6", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk7 "PK7" [ readStart="7", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="7", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] }
.items
Switch Pk1S_S "PK1" {channel="modbus:data:Przekazniki:PkStrych:Pk1:switch"}
Read16relay.js
(function(inputData) { var out = inputData ; if (inputData == '1' { out = '0' ; } else if (inputData == '0' { out = '1' ; } return out ; })(input)
Write16relay.js
(function(inputData) { var out = inputData ; if (inputData == '1' || inputData == 'ON' || inputData == 'OPEN') { out = '0' ; } else if (inputData == '0' || inputData == 'OFF' || inputData == 'CLOSED') { out = '1' ; } return out ; })(input)
Skrypty są z opisu Modbus binding 🙂
A co do dziwnego zachowania modułu, jakie wcześniej opisywałeś, to sprawdzibym, czy moduł nie głupieje, jak odpytujesz zbyt często, albo pytasz o zbyt wiele rejestrów jednocześnie, niektóre urzadzenia sobie z tym nie radzą. Do tego warto sprawdzić, czy napięcia są w porządku na module i czy zasilacz nie jest za słaby.
Za transformacje wczesniej się nawet nie brałem skoro zapis mi nie wychodził 😉
Co do adresów początek czytania od 0 lub 1 wywala mase błędów dopiero 2 akceptuje jako początek nawet w qmode czy innym programie.
Bez dopisku writeMultipleEvenWithSingleRegisterOrCoil="false" bedzie zapisywał do FC06?
Link nie prowadzi do żadnej dokumentacji
Log
Loading model 'Przekazniki.things' 06:59:34.833 [WARN ] [ort.modbus.internal.ModbusManagerImpl] - Try 1 out of 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]). Will try again soon. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 3 [operation ID 09a03de2-b743-4634-abaa-4882d3c3c4ef] 06:59:34.868 [WARN ] [ort.modbus.internal.ModbusManagerImpl] - Poll task was canceled -- not executing/proceeding with the poll: sleep interrupted [operation ID 09a03de2-b743-4634-abaa-4882d3c3c4ef] 06:59:34.870 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:poller:Przekazniki:PkStrych' changed from OFFLINE (COMMUNICATION_ERROR): Error with read: org.openhab.core.io.transport.modbus.internal.ModbusSlaveErrorResponseExceptionImpl: Slave responded with error=3 (ILLEGAL_DATA_VALUE) to OFFLINE 06:59:34.878 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:poller:Przekazniki:PkStrych' changed from OFFLINE (COMMUNICATION_ERROR): Error with read: org.openhab.core.io.transport.modbus.internal.ModbusSlaveErrorResponseExceptionImpl: Slave responded with error=3 (ILLEGAL_DATA_VALUE) to ONLINE 06:59:34.882 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk4' changed from OFFLINE (BRIDGE_OFFLINE): No online bridge to ONLINE 06:59:34.883 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk3' changed from OFFLINE (BRIDGE_OFFLINE): No online bridge to ONLINE 06:59:34.885 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk7' changed from OFFLINE (BRIDGE_OFFLINE): No online bridge to ONLINE 06:59:34.887 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk6' changed from OFFLINE (BRIDGE_OFFLINE): No online bridge to ONLINE 06:59:34.888 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk2' changed from OFFLINE (BRIDGE_OFFLINE): No online bridge to ONLINE 06:59:34.890 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk5' changed from OFFLINE (BRIDGE_OFFLINE): No online bridge to ONLINE 06:59:34.906 [WARN ] [ort.modbus.internal.ModbusManagerImpl] - Try 1 out of 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]). Will try again soon. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 3 [operation ID 81ec52e1-7ddc-46ff-9ca2-7d260b1c082d] 06:59:34.995 [WARN ] [ort.modbus.internal.ModbusManagerImpl] - Try 2 out of 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]). Will try again soon. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 3 [operation ID 81ec52e1-7ddc-46ff-9ca2-7d260b1c082d] 06:59:35.084 [ERROR] [ort.modbus.internal.ModbusManagerImpl] - Last try 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]). Aborting. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 3 [operation ID 81ec52e1-7ddc-46ff-9ca2-7d260b1c082d] 06:59:35.088 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk2' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) 06:59:35.089 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk3' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) 06:59:35.092 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk4' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) 06:59:35.096 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk5' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) 06:59:35.098 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk6' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) 06:59:35.100 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk7' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) 06:59:35.101 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:poller:Przekazniki:PkStrych' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error with read: org.openhab.core.io.transport.modbus.internal.ModbusSlaveErrorResponseExceptionImpl: Slave responded with error=3 (ILLEGAL_DATA_VALUE) 06:59:35.103 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk3' changed from OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) to OFFLINE (BRIDGE_OFFLINE): No online bridge 06:59:35.104 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk7' changed from OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) to OFFLINE (BRIDGE_OFFLINE): No online bridge 06:59:35.105 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk6' changed from OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) to OFFLINE (BRIDGE_OFFLINE): No online bridge 06:59:35.107 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk2' changed from OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) to OFFLINE (BRIDGE_OFFLINE): No online bridge 06:59:35.108 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk5' changed from OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) to OFFLINE (BRIDGE_OFFLINE): No online bridge 06:59:35.110 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:Przekazniki:PkStrych:Pk4' changed from OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=3). Message: Slave responded with error=3 (ILLEGAL_DATA_VALUE) to OFFLINE (BRIDGE_OFFLINE): No online bridge 06:59:36.125 [WARN ] [ort.modbus.internal.ModbusManagerImpl] - Try 1 out of 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]). Will try again soon. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 3 [operation ID d7529840-a9fd-44c7-ab5f-3d1ac747119e] 06:59:36.214 [WARN ] [ort.modbus.internal.ModbusManagerImpl] - Try 2 out of 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]). Will try again soon. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 3 [operation ID d7529840-a9fd-44c7-ab5f-3d1ac747119e] 06:59:36.303 [ERROR] [ort.modbus.internal.ModbusManagerImpl] - Last try 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_MULTIPLE_REGISTERS, start=2, length=16, maxTries=3]). Aborting. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 3 [operation ID d7529840-a9fd-44c7-ab5f-3d1ac747119e]
Moduł pracuje bez obciążenia na zasilaczu 2A wiec jest stabilnie. Odpytywanie raz na sekundę 16 rejestrów to chyba znikomo 😉
Ramka działająca wygląda tak 01 06 00 01 03 00 D8 FA tylko do testów używam togg z czystej wygody/lenistwa potem będzie on off i próba skryptu do rolet
Zapis
writeMultipleEvenWithSingleRegisterOrCoil="false"
jest domyślny (dokumentacja Modbus Binding). Poza tym używaną przy zapisie funkcję definiujemy tutaj:
writeType="holding"
Faktycznie, coś z linkiem nie poszło, ale znalazłem lepszą dokumentację i zauważam kilka rzeczy:
- numeracja rejestrów zaczyna się od 1, więc jeśli czytasz 16 rejestrów od adresu 2 to musi być błąd (może na początek ograniczmy się do 4 przekaźników?)
- starszy bajt danych odpowiada za komendę a młodszy za opóźnienie, zatem nie wysyłamy 0x001, aby wyłączyć natychmiast, tylko 0x0100,
- open to 1, a close to 2, gdy wysyłamy komendę.
Czego dotyczy "masa błędów"? Bo Exception 3 to "Illegal Data Value", co może wynikać z drugiego punktu, ale może ten moduł zawsze zwraca Exception3, gdy występuje błąd.
Zatem spróbujmy tak:
.things
Bridge modbus:tcp:Przekazniki "Przekaźniki Bridge" [ host="192.168.xx.xx", port=4196, id=1] { Bridge poller PkStrych "PK" [ start=1, length=4, refresh=2000, type="holding" ] { Thing data Pk1 "PK1" [ readStart="1", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="1", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk2 "PK2" [ readStart="2", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="2", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk3 "PK3" [ readStart="3", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="3", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk4 "PK4" [ readStart="4", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="4", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] }
Read16relay.js:
(function(inputData) { var out = inputData ; if (inputData == '1' { out = '0'; //closed } else if (inputData == '0' { out = '1' ; //opened } return out ; })(input)
Write16relay.js
(function(inputData) { var out = inputData ; if (inputData == '1' || inputData == 'ON' || inputData == 'OPEN') { out = '0x0200'; //close } else if (inputData == '0' || inputData == 'OFF' || inputData == 'CLOSED') { out = '0x0100' ; //open } return out ; })(input)
🤣 ta dokumentację już 1000x przeglądałem
Wchodząc z założenia że w trybie false nie trzeba jej wpisywać bo jest tam domyślnie to zauważyłem pewne różnice między jej wpisaniem na sztywno, a pozostawieniem w domyśle dlatego pytałem.
Tcpview qmodbus i parę innych zgłaszają błąd poniżej adresu 2 więc może Pan Alli coś zmienił?
Na testach ograniczałem się w odczytach od 2 długości 4 i też poniżej 2 nie dało się łączyć.
Co do skryptu nim nie próbowałem sterować ale regułą przez sendcommand(0x0100) itp i ciągle zmieniało się tylko opóźnienie w zasadzie czy dałem 0300 czy 0600 to u tak zmiana była 0 lub 1
PS co do dokumentacji chyba nie jest do końca do tej ver płytki. Na mojej nie ma padów do lutowania w celu przełączenia się między Modbua a AT itp choć może programowo jest to samo 😜
log
transformation throws exception [transformation=JS(Read16relay.js), response=1] org.openhab.core.transform.TransformationException: An error occurred while loading JavaScript. /share/CACHEDEV1_DATA/.qpkg/OpenHab3/conf/transform/Read16relay.js (No such file or directory) at org.openhab.transform.javascript.internal.JavaScriptEngineManager.getCompiledScriptByFilename(JavaScriptEngineManager.java:82) ~[?:?] at org.openhab.transform.javascript.internal.JavaScriptTransformationService.transform(JavaScriptTransformationService.java:119) ~[?:?] at org.openhab.binding.modbus.internal.SingleValueTransformation.transform(SingleValueTransformation.java:140) ~[?:?] at org.openhab.binding.modbus.internal.CascadedValueTransformationImpl.transform(CascadedValueTransformationImpl.java:51) ~[?:?] at org.openhab.binding.modbus.internal.ValueTransformation.transformState(ValueTransformation.java:48) ~[?:?] at org.openhab.binding.modbus.internal.handler.ModbusDataThingHandler.lambda$16(ModbusDataThingHandler.java:1001) ~[?:?] at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1603) ~[?:?] at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) ~[?:?] at org.openhab.binding.modbus.internal.handler.ModbusDataThingHandler.processUpdatedValue(ModbusDataThingHandler.java:969) ~[?:?] at org.openhab.binding.modbus.internal.handler.ModbusDataThingHandler.onRegisters(ModbusDataThingHandler.java:847) ~[?:?] at org.openhab.binding.modbus.internal.handler.ModbusDataThingHandler.lambda$11(ModbusDataThingHandler.java:801) ~[?:?] at java.util.Optional.ifPresent(Optional.java:183) ~[?:?] at org.openhab.binding.modbus.internal.handler.ModbusDataThingHandler.onReadResult(ModbusDataThingHandler.java:801) ~[?:?] at org.openhab.binding.modbus.handler.ModbusPollerThingHandler$ReadCallbackDelegator.lambda$2(ModbusPollerThingHandler.java:144) ~[?:?] at java.util.concurrent.CopyOnWriteArrayList.forEach(CopyOnWriteArrayList.java:807) ~[?:?] at org.openhab.binding.modbus.handler.ModbusPollerThingHandler$ReadCallbackDelegator.notifyChildren(ModbusPollerThingHandler.java:142) ~[?:?] at org.openhab.binding.modbus.handler.ModbusPollerThingHandler$ReadCallbackDelegator.handleResult(ModbusPollerThingHandler.java:88) ~[?:?] at org.openhab.binding.modbus.handler.ModbusPollerThingHandler$ReadCallbackDelegator.handle(ModbusPollerThingHandler.java:105) ~[?:?] at org.openhab.core.io.transport.modbus.internal.ModbusLibraryWrapper.invokeCallbackWithResponse(ModbusLibraryWrapper.java:333) ~[?:?] at org.openhab.core.io.transport.modbus.internal.ModbusManagerImpl$PollOperation.lambda$1(ModbusManagerImpl.java:216) ~[?:?] at org.openhab.core.io.transport.modbus.internal.SimpleStopWatch.timeRunnable(SimpleStopWatch.java:152) ~[?:?] at org.openhab.core.io.transport.modbus.internal.ModbusManagerImpl$PollOperation.accept(ModbusManagerImpl.java:216) ~[?:?] at org.openhab.core.io.transport.modbus.internal.ModbusManagerImpl$PollOperation.accept(ModbusManagerImpl.java:1) ~[?:?] at org.openhab.core.io.transport.modbus.internal.ModbusManagerImpl.executeOperation(ModbusManagerImpl.java:614) ~[?:?] at org.openhab.core.io.transport.modbus.internal.ModbusManagerImpl$ModbusCommunicationInterfaceImpl.lambda$1(ModbusManagerImpl.java:812) ~[?:?] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?] at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) [?:?] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) [?:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?] at java.lang.Thread.run(Thread.java:834) [?:?] Caused by: java.io.FileNotFoundException: /share/CACHEDEV1_DATA/.qpkg/OpenHab3/conf/transform/Read16relay.js (No such file or directory) at java.io.FileInputStream.open0(Native Method) ~[?:?] at java.io.FileInputStream.open(FileInputStream.java:219) ~[?:?] at java.io.FileInputStream.<init>(FileInputStream.java:157) ~[?:?] at java.io.FileInputStream.<init>(FileInputStream.java:112) ~[?:?] at org.openhab.transform.javascript.internal.JavaScriptEngineManager.getCompiledScriptByFilename(JavaScriptEngineManager.java:75) ~[?:?] ... 30 more 09:43:17.751 [WARN ] [ternal.handler.ModbusDataThingHandler] - Channel switch will not be updated since transformation was unsuccessful. Channel is expecting the following data types [OnOffType, UnDefType]. Input data: number value 1 (value type 'int16' taken into account) and bool value true. Transformation: CascadedValueTransformationImpl(SingleValueTransformation [transformation=JS(Read16relay.js), transformationServiceName=JS, transformationServiceParam=Read16relay.js])
Przecież wyraźnie pisze "brak pliku":
org.openhab.core.transform.TransformationException: An error occurred while loading JavaScript. /share/CACHEDEV1_DATA/.qpkg/OpenHab3/conf/transform/Read16relay.js (No such file or directory)
A 0300 i 0x0300 to nie to samo 🙂
Tak nie neguję tego tylko że ten plik tam jest 🤣 to się czasem pojawia razem z próbą odczytu od 1
Channel switch will not be updated since transformation was unsuccessful. Channel is expecting the following data types [OnOffType, UnDefType]. Input data: number value 1 (value type 'int16' taken into account) and bool value true. Transformation: CascadedValueTransformationImpl(SingleValueTransformation [transformation=JS(Read16relay.js), transformationServiceName=JS, transformationServiceParam=Read16relay.js])
Po ustawieniu start odczytu od 2 już inny komunikat.
Wiem że nie ma sensu taka reakcja 😵💫
0x0300 też było.
W pewnym momencie myślałem że ubiłem OH ale restart pomógł
No to może tak:
Read16relay.js:
(function(inputData) { var out = inputData ; if (inputData == '1' { out = 'OFF'; //opened } else if (inputData == '0' { out = 'ON' ; //closed } return out ; })(input)
Czasami trzeba zakomentarzować cały poller, zapisać plik, a potem go odkomentarzować i zapisać, bo czasem zmiany w plikach mają nieoczekiwane efekty. Można też zatrzymać i ponownie uruchomić Modbus binding.
Restart OH to ostateczność (duuużo czasu).
log
13:13:17.634 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pk1S_S' received command ON 13:13:17.636 [INFO ] [openhab.event.ItemStatePredictedEvent] - Item 'Pk1S_S' predicted to become ON 13:13:17.639 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Pk1S_S' changed from OFF to ON 13:13:17.642 [WARN ] [ternal.handler.ModbusDataThingHandler] - Cannot process command ON (of type OnOffType) with channel modbus:data:Przekazniki:PkStrych:Pk3:switch since transformation was unsuccessful 13:13:18.000 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Pk1S_S' changed from ON to OFF 13:13:18.111 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pk1S_S' received command OFF 13:13:18.113 [INFO ] [openhab.event.ItemStatePredictedEvent] - Item 'Pk1S_S' predicted to become OFF 13:13:18.118 [WARN ] [ternal.handler.ModbusDataThingHandler] - Cannot process command OFF (of type OnOffType) with channel modbus:data:Przekazniki:PkStrych:Pk3:switch since transformation was unsuccessful
@szpila86 To może tak?
(function(inputData) { var out = inputData; if (inputData == '1' || inputData == 'ON' || inputData == 'OPEN') { out = 0x0200; //close } else if (inputData == '0' || inputData == 'OFF' || inputData == 'CLOSED') { out = 0x0100; //open } return out; })(input)
Dopiero wróciłem z pracy. Przepraszam za wcześniejsze odpowiedzi na szybko.
Zacznijmy od końca 🙂 - DZIAŁA
Zmieniłem 0x0100 z 0x0200 żeby pasowało logicznie 😉
Write16relay.js
(function(inputData) { var out = inputData; if (inputData == '1' || inputData == 'ON' || inputData == 'OPEN') { out = 0x0100; //close } else if (inputData == '0' || inputData == 'OFF' || inputData == 'CLOSED') { out = 0x0200; //open } return out; })(input)
Read16relay.js
(function(inputData) { var out = inputData ; if (inputData == '0' ){ out = 'OFF'; //opened } else if (inputData == '1' ){ out = 'ON' ; //closed } return out ; })(input)
Things:
Bridge modbus:tcp:Przekazniki "Przekaźniki Bridge" [ host="192.168.xx.xx", port=4196, id=1] { Bridge poller PkStrych "PKS" [ start=1, length=16, refresh=1000, type="holding" ] { Thing data Pk1 "PK1" [ readStart="1", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="1", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk2 "PK2" [ readStart="2", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="2", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk3 "PK3" [ readStart="3", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="3", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk4 "PK4" [ readStart="4", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="4", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk5 "PK5" [ readStart="5", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="5", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk6 "PK6" [ readStart="6", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="6", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk7 "PK7" [ readStart="7", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="7", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk8 "PK8" [ readStart="8", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="8", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk9 "PK9" [ readStart="9", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="9", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk10 "PK10" [ readStart="10", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="10", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk11 "PK11" [ readStart="11", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="11", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk12 "PK12" [ readStart="12", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="12", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk13 "PK13" [ readStart="13", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="13", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk14 "PK14" [ readStart="14", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="14", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk15 "PK15" [ readStart="15", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="15", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] Thing data Pk15 "PK16" [ readStart="16", readValueType="int16", readTransform="JS(Read16relay.js)", writeStart="16", writeValueType="int16", writeTransform="JS(Write16relay.js)", writeType="holding" ] } }
Items:
Switch Pk1S_S "Przekaźnik 1" {channel="modbus:data:Przekazniki:PkStrych:Pk1:switch"} Switch Pk2S_S "Przekaźnik 2" {channel="modbus:data:Przekazniki:PkStrych:Pk2:switch"} Switch Pk3S_S "Przekaźnik 3" {channel="modbus:data:Przekazniki:PkStrych:Pk3:switch"} Switch Pk4S_S "Przekaźnik 4" {channel="modbus:data:Przekazniki:PkStrych:Pk4:switch"} Switch Pk5S_S "Przekaźnik 5" {channel="modbus:data:Przekazniki:PkStrych:Pk5:switch"} Switch Pk6S_S "Przekaźnik 6" {channel="modbus:data:Przekazniki:PkStrych:Pk6:switch"} Switch Pk7S_S "Przekaźnik 7" {channel="modbus:data:Przekazniki:PkStrych:Pk7:switch"} Switch Pk8S_S "Przekaźnik 8" {channel="modbus:data:Przekazniki:PkStrych:Pk8:switch"} Switch Pk9S_S "Przekaźnik 9" {channel="modbus:data:Przekazniki:PkStrych:Pk9:switch"} Switch Pk10S_S "Przekaźnik 10" {channel="modbus:data:Przekazniki:PkStrych:Pk10:switch"} Switch Pk11S_S "Przekaźnik 11" {channel="modbus:data:Przekazniki:PkStrych:Pk11:switch"} Switch Pk12S_S "Przekaźnik 12" {channel="modbus:data:Przekazniki:PkStrych:Pk12:switch"} Switch Pk13S_S "Przekaźnik 13" {channel="modbus:data:Przekazniki:PkStrych:Pk13:switch"} Switch Pk14S_S "Przekaźnik 14" {channel="modbus:data:Przekazniki:PkStrych:Pk14:switch"} Switch Pk15S_S "Przekaźnik 15" {channel="modbus:data:Przekazniki:PkStrych:Pk15:switch"} Switch Pk16S_S "Przekaźnik 16" {channel="modbus:data:Przekazniki:PkStrych:Pk16:switch"}
Sitemap:
Switch item=Pk1S_S label="Przekaźnik 1" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk2S_S label="Przekaźnik 2" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk3S_S label="Przekaźnik 3" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk4S_S label="Przekaźnik 4" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk5S_S label="Przekaźnik 5" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk6S_S label="Przekaźnik 6" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk7S_S label="Przekaźnik 7" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk8S_S label="Przekaźnik 8" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk9S_S label="Przekaźnik 9" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk10S_S label="Przekaźnik 10" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk11S_S label="Przekaźnik 11" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk12S_S label="Przekaźnik 12" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk13S_S label="Przekaźnik 13" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk14S_S label="Przekaźnik 14" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk15S_S label="Przekaźnik 15" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika Switch item=Pk16S_S label="Przekaźnik 16" icon="switch" mappings=[ON="Włącz", OFF="Wyłącz"] // Dodaj mapowanie dla przełącznika
Prawie koniec zabawy. Teraz tranformacja w przełączniki do rolet
Możesz mi jeszcze wytłumaczyć ten przykład przykład?
things/modbus_ex_rollershutter.things: Bridge modbus:tcp:localhostTCPRollerShutter [ host="127.0.0.1", port=502 ] { Bridge poller holding [ start=0, length=3, refresh=1000, type="holding" ] { // Since we are using advanced transformation outputting JSON, // other write parameters (writeValueType, writeStart, writeType) can be omitted Thing data rollershutterData [ readStart="0", readValueType="int16", writeTransform="JS:rollershutter.js" ] // For diagnostics Thing data rollershutterDebug0 [ readStart="0", readValueType="int16", writeStart="0", writeValueType="int16", writeType="holding" ] Thing data rollershutterDebug1 [ readStart="1", readValueType="int16" ] Thing data rollershutterDebug2 [ readStart="2", readValueType="int16" ] } } items/modbus_ex_rollershutter.items: // We disable auto-update to make sure that rollershutter position is updated from the slave, not "automatically" via commands Rollershutter RollershutterItem "Roller shutter position [%.1f]" <temperature> { autoupdate="false", channel="modbus:data:localhostTCPRollerShutter:holding:rollershutterData:rollershutter" } // For diagnostics Number RollershutterItemDebug0 "Roller shutter Debug 0 [%d]" <temperature> { channel="modbus:data:localhostTCPRollerShutter:holding:rollershutterDebug0:number" } Number RollershutterItemDebug1 "Roller shutter Debug 1 [%d]" <temperature> { channel="modbus:data:localhostTCPRollerShutter:holding:rollershutterDebug1:number" } Number RollershutterItemDebug2 "Roller shutter Debug 2 [%d]" <temperature> { channel="modbus:data:localhostTCPRollerShutter:holding:rollershutterDebug2:number" } sitemaps/modbus_ex_rollershutter.sitemap: sitemap modbus_ex_rollershutter label="modbus_ex_rollershutter" { Switch item=RollershutterItem label="Roller shutter [(%d)]" mappings=[UP="up", STOP="X", DOWN="down", MOVE="move"] // For diagnostics Setpoint item=RollershutterItemDebug0 minValue=0 maxValue=100 step=20 Text item=RollershutterItemDebug0 Text item=RollershutterItemDebug1 Text item=RollershutterItemDebug2 } transform/rollershutter.js: // Wrap everything in a function // variable "input" contains data passed by openHAB (function(cmd) { var cmdToValue = {"UP": 1, "DOWN": -1, "MOVE": 1, "STOP": 0}; var cmdToAddress = {"UP": 1, "DOWN": 1, "MOVE": 2, "STOP": 2}; var value = cmdToValue[cmd]; var address = cmdToAddress[cmd]; if(value === undefined || address === undefined) { // unknown command, do not write anything return "[]"; } else { return ( "[" + "{\"functionCode\": 6, \"address\":" + address.toString() + ", \"value\": [" + value + "] }" + "]" ); } })(input)
Czy takie coś ma prawo bytu?
rule "Roleta test" when Item RolTest received command then switch(receivedCommand) { case UP: { Pk1S_S.sendCommand(OFF) Pk2S_S.sendCommand(ON) } case STOP: Pk1S_S.sendCommand(OFF) Pk2S_S.sendCommand(OFF) } case DOWN: { Pk2S_S.sendCommand(OFF) Pk1S_S.sendCommand(ON) } default : { logInfo("Rolety test","ROLETA: " + receivedCommand) } } end
Niby to działa ale czy jest bezpieczne, prawidłowe?
@szpila86 Super, że się udało 🙂
Co do writeTransform z JSONem:
Są 3 rodzaje transformat przy zapisie:
- stała (zawsze ta sama wartość, bez względu na otrzymane polecenie),
- zwraca określoną wartość dla danego polecenia (command)
- zwraca JSONa, który definiuje funkcję MODBUS, adres i daną, jaka zostanie wysłana w zależności od polecenia.
Ten ostatni jest w podanym przez Ciebie przykładzie. Sterowanie roletą w tym przykładzie wymaga wysłania określonej wartości na odpowiedni adres. Weźmy polecenie DOWN: należy wysłać (FC06) wartość -1 (cmdToValue) na adres 1 (cmdToAddress). Zatem należy stworzyć następującego JSONa:
[ {"functionCode": 6, "address": 1, "value": [-1] } ]
Można zapisywać jednocześnie do kilku rejestrów wtedy bloczków w klamrach {} będzie więcej.
@szpila86 Ja bym proponował zrobić to inaczej 🙂
Potraktuj 2 sąsiednie przekaźniki jako jeden rejestr 32-bitowy, niech UP to będzie przekaźnik 1 a DOWN to przekaźnik 2. W ten sposób będziesz miał wirtualnie 8 kanałów roletowych.
Wtedy polecenie UP to będzie wysłanie na adres 1 wartości 0x02000100 (przekaźnik UP włączony, DOWN wyłączony)
Odpowiednio DOWN to 0x01000200, a STOP 0x02000200.
Stanem zabronionym będzie 0x01000100, ale jak tej wartości nigdzie nie wpiszesz, to ona raczej nie wystąpi 🙂
Bridge modbus:tcp:Przekazniki "Przekaźniki Bridge" [ host="192.168.xx.xx", port=4196, id=1] { Bridge poller PkStrych "PKS" [ start=1, length=16, refresh=1000, type="holding" ] { Thing data Rol1 "Roleta1" [ readStart="1", readValueType="int32", readTransform="JS(Read_roller.js)", writeStart="1", writeValueType="int32", writeTransform="JS(Write_roller.js)", writeType="holding" ] Thing data Rol2 "Roleta2" [ readStart="3", readValueType="int32", readTransform="JS(Read_roller.js)", writeStart="3", writeValueType="int32", writeTransform="JS(Write_roller.js)", writeType="holding" ] }
Ciekawe wyjście i zajmuje mniej miejsca w plikach 😉
To jak będzie wyglądał item i transformacja dla tego? Czy mogę tak przypisać?
Rollershutter Rol1 "Roleta 1" { channel="modbus:data:Przekazniki:PkStrych:Rol1:number", ga="BLINDS" } Rollershutter Rol2 "Roleta 2" { channel="modbus:data:Przekazniki:PkStrych:Rol2:number", ga="BLINDS" }
@szpila86 A czemu nie tak, jak w przykładzie, który podałeś tutaj?
Rollershutter Rol1 "Roleta 1" { channel="modbus:data:Przekazniki:PkStrych:Rol1:rollershutter", ga="BLINDS" } Rollershutter Rol2 "Roleta 2" { channel="modbus:data:Przekazniki:PkStrych:Rol2:rollershutter", ga="BLINDS" }
Pozostanie jeszcze dorobienie logiki (np. w rules), żeby pokazywało stan rolety (% otwarcia) i wykonywało STOP po czasie pełnego przebiegu rolety. Zwykle tym zajmuje się sterownik rolety, którego tu nie ma.
readTransform nie będzie, bo rollershutter oczekuje pozycji rolety, a nie aktualnie wykonywanego polecenia.
writeTransform będzie miało 3 warunki zamiast 2 (UP, DOWN, STOP) i 3 wartości. Wszystko napisałem w poprzednim poście, tylko przerobić writeTransform z wersji z przekaźnikami.
Aj z tym:Number zamiast :rollershutter dałem ciała, myślę o jednym wstawiam drugie.
Właśnie zastanawiam się nad readTransform. Podałeś je w przykładzie u góry. Choć z innej strony rollershutter ma wartości UP,DOWN,STOP a tego nie mogę przekazać do rejestru. I się zastanawiam czy nie powinno się przechwycić polecenia UP i zastąpić 0x02000100.
Myślałem o
(function(inputData) { var out = inputData; if (inputData == 'UP') { out = 0x02000100; //close } else if (inputData == 'DOWN') { out = 0x01000200; //open }else if (inputData == 'STOP') { out = 0x02000200; //stop } return out; })(input)
Stop realizuję regułą dla każdej rolety dla każdego kierunku. Nawet jak wcześniej dojedzie do końca to krańcowy rozłączy przed czasowym choć ręczne zatrzymanie może się przydać :p
rule "Roleta w dół " when Item Pk4S_S received command ON then createTimer(now.toInstant().plusMillis(19000).atZone(now.zone), [ | Pk4S_S.sendCommand(OFF) ] ) end
Za to procent otwarcia już raz rzeźbiłem i nie wychodziło