Podzielę się informacją jak odczytywać z ww licznika informację w OH2.4:
- Instalujemy w PaperUI binding-modbus - 2.4.0, transformation-javascript - 2.4.0
- w things tworzymy plik np. modbus.things, konfigurujemy w nim nasz port szeregowy port="/dev/ttyUSB1"
- w transform divide10.js, divide100.js, divide1000.js,
- w items:
ok a możesz wytłumaczyć jak go podłączyłeś do sieci??
ok a możesz wytłumaczyć jak go podłączyłeś do sieci??
Faza z licznika na L-IN(1) neutralny na N i L-out(3) faza na odbiorniki
Nie tej sieci:) chodziło mi o sieć internetowa
RS485 do komputera poprzez przejściówkę RS485->USB za 8zł. Resztę obrabia OpenHab. To nie leci przez sieć LAN/WAN.
Wykres z grafany: GRAF
a jak nie mam możliwości podłączenia do komputera?? skrzynka prądowa jest w garażu. PC nie posiadam, a openhab jest na Raspberry. Czyli podłączyć na USB do raspberry??
Tak do komputera z zainstalowanym OpenHab. Jeśli używasz do tego raspberry, to do niego podłączasz.
to jeszcze podpytam jak podłączyłeś przewód RS485 do tego licznika? bo tam są dwa wejścia a kabel ma 4 żyły??
Chciałbym podłączyć OR-WE-504 Modbus. Bardzo podobny liczni i ta sama firma tylko inaczej ma podobno rejestry poukładane od adresu 0x0. Mam pytanie ponieważ właśnie uczę się pracy na OH3 to chciałbym się dowiedzieć czy ta konfiguracja ( https://www.smartnydom.pl/forum/openhab/licznik-orno-or-we-514-modbus-rs485/#post-7108) jak powyżej opisana jest wykonalna dla OH3 bo jakoś nie bardzo mogę się połapać gdzie i jak wpisać. Nie bardzo wiem gdzie tam można utworzyć plik. Czy to robić przez terminal albo WinSCP np.?
Z tego co widzę, to w OH3 jest tak samo, jak w OH2.
Pliki wrzucasz do folderów w konfiguracji (pliki .things do folderu things, a .items do folderu items).
Najwygodniej przez WinSCP, jako edytor polecam notepad++ albo coś polecanego na stronie OpenHAB. Można przez terminal, ale to niezbyt wygodne. Najlepiej ustawić notepad++ jako domyślny edytor. Jak wybierzesz w WinSCP edycję, to plik Ci się otworzy w notepad++. Jak klikniesz Zapisz w notepadzie to WinSCP zaktualizuje plik na RPi czy gdzie tam masz tego OpenHABa.
Zastanawiałem się, dlaczego każdy rejestr ma osobny poller w powyższym kodzie, bo wiadomo, że szybciej się odczyta 30 rejestrów ciągiem niż 10 pojedynczo, ale na elektrodzie piszą, że licznik się nie wyrabia jak dane idą za szybko, pewnie dlatego.
Jeśłi Twój licznik ma kolejne rejestry np. od 300 i da radę, to możesz zrobić pojedynczy poller w ten sposób:
modbus.things
Bridge modbus:serial:localSerial [port="/dev/ttyUSB1", id=1, baud=9600, stopBits="1", parity="none", dataBits=8, encoding="rtu"] { Bridge poller Licznik [ start=300, length=16, refresh=60000, type="holding" ] { Thing data kWh [ readStart="300", readValueType="uint32", readTransform="JS(divide100.js)" ] Thing data biernakWh [ readStart="302", readValueType="uint32", readTransform="JS(divide100.js)" ] Thing data Hz [ readStart="304", readValueType="uint16", readTransform="JS(divide100.js)" ] Thing data V [ readStart="305", readValueType="uint16", readTransform="JS(divide100.js)" ] Thing data A [ readStart="306", readValueType="uint32", readTransform="JS(divide1000.js)" ] Thing data P [ readStart="308", readValueType="uint32" ] Thing data biernaP [ readStart="310", readValueType="uint32" ] Thing data pozornaP [ readStart="312", readValueType="uint32" ] Thing data fimocy [ readStart="314", readValueType="uint16", readTransform="JS(divide1000.js)" ] } }
modbus.items
Number OU_kWh "Stan licznika energii [%.2f kWh]" (OU_Liczniki, gLiczniki ) {channel="modbus:data:localSerial:Licznik:kWh:number"} Number:Power OU_P "Moc chwilowa [%d W] " (OU_Liczniki, gLiczniki) {channel="modbus:data:localSerial:Licznik:P:number"} Number:ElectricPotential OU_V "Napięcie [%.2f V]" (OU_Liczniki, gLiczniki) {channel="modbus:data:localSerial:Licznik:V:number"} Number:ElectricCurrent OU_A "Prąd [%.2f A]" (OU_Liczniki, gLiczniki) {channel="modbus:data:localSerial:Licznik:A:number"} Number:Frequency OU_Hz "Częstotliwość [%.2f Hz]" (OU_Liczniki, gLiczniki) {channel="modbus:data:localSerial:Licznik:Hz:number"} Number OU_fimocy "Współczynnik mocy" (OU_Liczniki, gLiczniki) {channel="modbus:data:localSerial:Licznik:fimocy:number"} Number:Power OU_biernaP "Moc bierna chwilowa [%d var]" (OU_Liczniki, gLiczniki) {channel="modbus:data:localSerial:Licznik:biernaP:number"} Number:Power OU_pozornaP "Moc pozorna chwilowa [%d VA]" (OU_Liczniki, gLiczniki) {channel="modbus:data:localSerial:Licznik:pozornaP:number"} Number OU_biernakWh "Stan licznika energia bierna [%.2f kvar]" (OU_Liczniki, gLiczniki) {channel="modbus:data:localSerial:Licznik:biernakWh:number"}
UWAGA: Nie mam dokumentacji, więc numery rejestrów są przypadkowe, należy je poprawić wg rozpiski producenta
Trzeba też dopisać transformaty divide100.js i divide1000.js i wrzucić do folderu transform. W razie czego pomogę.
Cześć @kamikac, bardzo fajnie, że można sobie te pliki modyfikować Notepadem++. Jestem trochę zielony jeśli chodzi o te ustawienia ale powoli jakoś załapię. Dzięki za pomoc 🙂 Na razie wrzuciłem według instrukcji no i na stronce OH mam coś takiego w załączniki zrzut. Te oznaczone removing to moje pozostałości po poprzednich eksperymentach. Ciekawe, że nie chcą się usunąć. Może po restarcie OH? W każdym razie zastanawia mnie dlaczego wrzuciło tyle thingsów skoro licznik ma mieć jeden pool na 16 rejestrów. To intuicyjnie wydawało mi się że będzie jedno things oraz 16 items. Ale muszę się jeszcze sporo nauczyć z strony openhaba, aby nie katować kolegów banalnymi pytaniami.
Przy okazji zapytam gdzie są ukryte things i items które dodaję przez stronę openHab-> things-> (+) Choose Binding
Mógłbym wtedy zmodyfikować kanały.
Nie ma dostępu do tekstowej konfiguracji things i items dodanych przez paperUI.
Po zmianie things (edycja, usunięcie) powinieneś zrestartować OH. Ewentualnie przejdź na OH3 - na niej zarządzanie things działa trochę lepiej.
@andry W OH2 te dane są w plikach .json w folderze userdata/jsondb/. Nie zaleca się jednak ich edytowania ręcznie, gdyż składnia jest skomplikowana i łatwo o pomyłkę.
Wszystkie przykłady w necie są podawane w postaci plików, tak jest łatwiej nad tym zapanować niż przeklikiwać dziesiątki pozycji w poszukiwaniu tej, w której zrobiliśmy byka.
Na początku coś tam grzebałem w GUI, ale szybko to porzuciłem. Okazało się, że szybciej było np wygenerować things do modbusa w arkuszu kalkulacyjnym i przekopiować do notepada, niż pisać to ręcznie (aktualnie ma 275 linii i wciąż rośnie).
Po zabawach w GUI warto wszystko wyczyścić, bo jak się zdefiniuje item w pliku i jednocześnie w GUI to się dzieją dziwne rzeczy.
Korzystanie z plików na jeszcze jedną zaletę: wystarczy folder conf skopiować w bezpieczne miejsce i mamy prawie całą konfigurację OpenHaba zabezpieczoną.
Tak po chłopsku: things powstaje w bindingu czyli interfejsie z urządzeniem/usługą. Item jest definicją obiektu w OpenHAB. Item sam z siebie nie ma stanu, chyba, że go ręcznie wymusimy (np przez BasicUI), zlinkujemy z thing lub wpiszemy regułą.
Nie znam na razie OH3, ale intuicja mi podpowiada, że po restarcie OH (można jeszcze wyczyścić cache) powinno się to wyprostować.
Co do niektórych informacji mogę się mylić, bo ja mam OH2.5 na QNAPie i pewne rzeczy mogą się różnić w stosunku do RPi czy innego linuxa jak i OH3.
@edass andry ma właśnie OH3, stąd pewne rzeczy, o których piszę mogą u niego nie działać.
Trzeba też dopisać transformaty divide100.js i divide1000.js i wrzucić do folderu transform. W razie czego pomogę.
Cześć.
Jak dopisać te transformaty divide100.js i divide1000.js ? Korzystam z OH 2.5 i folderze /transform mam tylko pliki .map
Stwórz pliki z zawartością:
divide100.js
(function(inputData) { // on read: the polled number as string // on write: openHAB command as string var DIVIDE_BY = 100; return parseFloat(inputData) / DIVIDE_BY; })(input)
divide1000.js
(function(inputData) { // on read: the polled number as string // on write: openHAB command as string var DIVIDE_BY = 1000; return parseFloat(inputData) / DIVIDE_BY; })(input)
Kupiłem licznik DTS1946-4P - VCX, który ma u dokumentacji inną adresację modbus. Za pomocą kodu Pythona potrafię odczytać np. napięcie na wszystkich fazach, gdzie rejestr od L1 to 0x200, od L2 0x201 i 0x202
from pymodbus.client.sync import ModbusSerialClient as ModbusClient client = ModbusClient(method='rtu', port='/dev/ttyUSB1', timeout=1, stopbits = 1, bytesize = 8, parity='N', baudrate= 9600) client.connect() request = client.read_holding_registers(0x200,1,unit=10) print request.registers
Niestety nie potrafię poradzić sobie z plikiem .things - próbowałem różnych kombinacji ale zawsze jest błąd...
Bridge modbus:serial:localSerial [port="/dev/ttyUSB1", id=1, baud=9600, stopBits="1", parity="none", dataBits=8, encoding="rtu"] { Bridge poller Faza1 [ start=512, length=1, refresh=10000, type="holding" ] { Thing data Faza1 [readStart="512",readValueType="uint16",readTransform="JS(divide100.js)"] } Bridge poller Faza2 [ start=512, length=2, refresh=10000, type="holding" ] { Thing data Faza2 [readStart="513",readValueType="uint32",readTransform="JS(divide100.js)"] } Bridge poller Faza3 [ start=512, length=4, refresh=10000, type="holding" ] { Thing data Faza3 [readStart="514",readValueType="uint32",readTransform="JS(divide100.js)"] } }
Jaką wpisać wartość dla lenght i readValueType? Czy poprawnie zmieniam wartość HEX np. 0x200 na 512?
Producent dał taką dokumentację do modbus: https://vcx.com.pl/wp-content/uploads/2022/02/DTS1946-4P-INSTRUKCJA-KOMUNIKACJI.doc
- nie ma potrzeby dla każdej danej robić osobnego pollera tym bardziej, że są Faza1-Faza3 to są kolejne rejestry (w Twoim .things wymuszasz komunikację 3 razy, aby otrzymać 3 wartości - strata czasu,
- początek przeliczyłeś dobrze (200 w hex to 512 w dec), potem się trochę pogubiłeś z tymi pollerami, długościami i ilością bitów
Spróbuj tak:
Bridge modbus:serial:localSerial [port="/dev/ttyUSB1", id=1, baud=9600, stopBits="1", parity="none", dataBits=8, encoding="rtu"] { Bridge poller Licznik [start=512, length=3, refresh=10000, type="holding" ] { Thing data NapFaza1 [readStart="512", readValueType="int16", readTransform="JS(divide10.js)"] Thing data NapFaza2 [readStart="513", readValueType="int16", readTransform="JS(divide10.js)"] Thing data NapFaza3 [readStart="514", readValueType="int16", readTransform="JS(divide10.js)"] } }
Jak to działa?
Poller odpytuje 3 rejestry (w jednej "transakcji").
Następnie interpretuje pierwszy rejestr jako NapFaza1, drugi jako NapFaza2 itd. i dokonuje ich transformacji (jednostką jest 0,1V, więc trzeba podzielić przez 10, nie przez 100).
Zmieniłem kod ale nadl coś jest nie tak🤔
PortInUseException
Czyli albo coś korzysta z portu, albo openHAB jakiegoś powodu nie może go otworzyć.
Czytałeś ten artykuł?
Jaki jest wynik poniższego polecenia w konsoli?
lsof /dev/ttyUSB1