Zmiana bitów w ramc...
 
Powiadomienia
Wyczyść wszystko

openHAB [Rozwiązany] Zmiana bitów w ramce modbus

54 Wpisów
3 Użytkownicy
0 Reactions
2,112 Wyświetleń
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

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:

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.

 
Dodane : 23/08/2023 6:14 am
(@kamikac)
Wpisów: 226
Pomocny
 

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.

 
Dodane : 23/08/2023 8:23 pm
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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" ]
    }
}
 
Dodane : 23/08/2023 9:01 pm
(@kamikac)
Wpisów: 226
Pomocny
 

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.

 
Dodane : 23/08/2023 10:51 pm
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

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

 
Dodane : 24/08/2023 6:05 am
(@kamikac)
Wpisów: 226
Pomocny
 

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)
 
Dodane : 24/08/2023 7:59 am
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

🤣 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])
 
Dodane : 24/08/2023 8:17 am
(@kamikac)
Wpisów: 226
Pomocny
 

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 🙂

 
Dodane : 24/08/2023 9:34 am
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

Tak nie neguję tego tylko że ten plik tam jest 🤣 to się czasem pojawia razem z próbą odczytu od 1

 
Dodane : 24/08/2023 9:36 am
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 
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ł 

 
Dodane : 24/08/2023 9:49 am
(@kamikac)
Wpisów: 226
Pomocny
 

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).

 
Dodane : 24/08/2023 10:12 am
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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
 
Dodane : 24/08/2023 12:16 pm
(@kamikac)
Wpisów: 226
Pomocny
 

@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)
 
Dodane : 24/08/2023 4:12 pm
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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)

 

 
Dodane : 24/08/2023 7:08 pm
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

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?

 
Dodane : 24/08/2023 8:13 pm
(@kamikac)
Wpisów: 226
Pomocny
 

@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.

 
Dodane : 24/08/2023 10:55 pm
(@kamikac)
Wpisów: 226
Pomocny
 

@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" ]
}
 
Dodane : 24/08/2023 11:09 pm
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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

 

 
Dodane : 25/08/2023 8:20 am
(@kamikac)
Wpisów: 226
Pomocny
 

@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.

 
Dodane : 25/08/2023 8:59 am
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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 

 
Dodane : 25/08/2023 9:43 am
Strona 1 / 3
Udostępnij: