Witam
potrzebuję zrobić sterowanie roletami przez OH. Standard otwórz zamknij i procentowo.
Nie mogę wymyślić nic sensownego więc piszę... 😀
To drabina od sterowania z PLC dwoma przekaźnikami.
Tu OH
Switch RolJadG "Roleta jadalnia [%d]" (Rolety) { fatekplc="plc2:M230", expire="1s,command=OFF" } Switch RolJadD "Roleta jadalnia [%d]" (Rolety) { fatekplc="plc2:M231", expire="1s,command=OFF" }
oraz
Switch item=RolJadG mappings=[ON="W gore"] Switch item=RolJadD mappings=[ON="W dol"]
Proszę o pomoc 😉
Czemu używasz Switch zamiast Rollershutter? U mnie wygląda to tak:
modbus.things:
Bridge modbus:tcp:wago [ host="wago.lan", connectMaxTries=1, reconnectAfterMillis=0, port=502, timeBetweenReconnectMillis=0, connectTimeoutMillis=10000, id=1, enableDiscovery=false ] { Bridge poller ReadHoldingReg [ start=256, length=60, refresh=1500, type="holding" ] { Thing data FDRolPokojPos [ readStart="299.1", readValueType="uint8", readTransform="JS(Read_rollershutter.js)", writeTransform="JS(Write_FDRolPokoj.js)" ] } }
Read_rolershutter.js (przeliczenie pozycji rolety z 0-255 w sterowniku na 100-0 w openHABie):
(function(i) { return Math.round((( 255 - parseFloat(i)) * 100 ) / 255); })(input)
Write_FDRolPokoj.js (tutaj jest magia przycisków UP, DOWN, STOP, w bicie 12483 mam sterowanie "góra", a w 12482 - "dół"):
// Wrap everything in a function // variable "input" contains data passed by openHAB (function(cmd) { var cmdToAddress = {"UP": 12483, "DOWN": 12482, "STOP": 0}; var address = cmdToAddress[cmd]; if(address === undefined) { // unknown command, do not write anything return "[]"; } else if (address == 0) { var addressUP = cmdToAddress["UP"]; var addressDOWN = cmdToAddress["DOWN"]; return ( "[" + "{\"functionCode\": 5, \"address\":" + addressUP.toString() + ", \"value\": [0] }," + "{\"functionCode\": 5, \"address\":" + addressDOWN.toString() + ", \"value\": [0] }" + "]" ); } else { return ( "[" + "{\"functionCode\": 5, \"address\":" + address.toString() + ", \"value\": [1] }" + "]" ); } })(input)
Żeby to funkcjonowało sensownie po stronie sterownika trzeba bity "góra" i "dół" wyzerować po czasie jaki zajmuje pełny ruch rolety z dołu do góry.
I wreszcie Domek.items, gdzie zdefiniowana jest roleta:
Rollershutter GF_GuestRoom_Shutter "Roleta [%d]" (GF_GuestRoom) ["Blinds"] { channel="modbus:data:wago:ReadHoldingReg:FDRolPokojPos:rollershutter", autoupdate="false" }
Mam nadzieję, że pomogłem.
Pozdrawiam
Dzięki Kamil
Niestety ja mam Fateka nie Wago i łączę się inaczej niż modbus, przez plik w services więc nie bardzo wiem jak to przekonwertować.
fatekplc:refresh=100 fatekplc:plc2.connectionUri=udp://192.168.86.19?plcId=2 fatekplc:plc1.connectionUri=udp://192.168.86.20?plcId=1
Od strony OH jak to wygląda? Roleta opuszcza się do momentu trzymania przycisku czy jak?
Może w opisie bindingu fatek jest opisane jak obsłużyć roletę? Poza tym na pewno FATEK obsługuje MODBUS.
Roleta przesuwa się dopóki nie naciśniesz STOP, dlatego trzeba ten STOP wymusić po stronie PLC po maksymalnym czasie ruchu rolety. Inaczej nie będzie można np podnieść rolety po jej zamknięciu, jeśli wcześniej nie wciśnie się STOP (pozostanie wciśnięte "dól", gdy wciśniemy "góra").
To z innej strony. Może by to regułami załatwić.
Switch item=RolJad mappings=[UP="W gore", STOP="X", DOWN="W dol", 50="50"]
oraz rules
rule “rolety” when Item RolJad received command then switch (receivedCommand) { case UP : logInfo("W górę") case STOP : case DOWN : case 50 : } end
a reszta warunków bezpieczeństwa po stronie PLC tylko mam błąd pliku reguł i nie wiem dlaczego
[WARN ] [del.core.internal.ModelRepositoryImpl] - Configuration model 'rolety.rules' has errors, therefore ignoring it: [1,6]: no viable alternative at input '�'
Oczywiście, że można to ogarnąć regułami. Po pierwsze sprawdź, czy kodowanie pliku .rules masz UTF-8, a po drugie zwróć uwagę na cudzysłowy w pierwszej linijce - są różne na początku i na końcu słowa "rolety" i pewnie to jest problemem.
Kodowanie ok faktycznie cudzysłów..... i coś jeszcze
[WARN ] [del.core.internal.ModelRepositoryImpl] - Configuration model 'rolety.rules' has errors, therefore ignoring it: [12,1]: no viable alternative at input 'case'
za to w tej postaci przechodzi
rule "rolety" when Item RolJad received command then switch receivedCommand { case UP: logInfo("W górę") case STOP: logInfo("W stop") case DOWN: logInfo("W stop") case 50: logInfo("50") } end
powodując błąd
14:48:34.483 [WARN ] [.rest.core.internal.item.ItemResource] - Received HTTP POST request at 'items/RolJad' with an invalid status value 'UP'. 14:48:36.604 [WARN ] [.rest.core.internal.item.ItemResource] - Received HTTP POST request at 'items/RolJad' with an invalid status value 'STOP'. 14:48:38.409 [WARN ] [.rest.core.internal.item.ItemResource] - Received HTTP POST request at 'items/RolJad' with an invalid status value 'DOWN'. 14:48:39.879 [WARN ] [.rest.core.internal.item.ItemResource] - Received HTTP POST request at 'items/RolJad' with an invalid status value '50'.
A nie powinno być
switch (RolJad.receivedCommand) {
i UP, STOP i DOWN w cudzysłowiu?
W ten sposób też próbowałem z tym samym błędem
rule "rolety" when Item RolJad received command then switch (RolJad.receivedCommand) { case "UP": logInfo("W górę") case "STOP": logInfo("W stop") case "DOWN": logInfo("W stop") case "50": logInfo("50") } end
15:47:01.680 [WARN ] [.rest.core.internal.item.ItemResource] - Received HTTP POST request at 'items/RolJad' with an invalid status value 'UP'. 15:47:04.360 [WARN ] [.rest.core.internal.item.ItemResource] - Received HTTP POST request at 'items/RolJad' with an invalid status value 'STOP'. 15:47:07.381 [WARN ] [.rest.core.internal.item.ItemResource] - Received HTTP POST request at 'items/RolJad' with an invalid status value 'DOWN'.
receivedCommand było dobrze. Pisałem z głowy. Zmień RolJad.receivedCommand na receivedCommand i po then wstaw logInfo("Rolety","command: " + receivedCommand).
I popraw resztę logInfo, bo logInfo wymaga 2 parametrów, a u Ciebie jest jeden.
Zastanawia mnie skąd ten HTTP POST. Nie masz tego Item RolJad podpiętego do things z fatek binding?
itemap
Switch item=RolJad mappings=[UP="W gore", STOP="X", DOWN="W dol", 50="50"]
items
Switch RolJad "Roleta jadalnia [%d]" (Rolety)
rules
rule "rolety" when Item RolJad received command then switch (receivedCommand) { case "UP": logInfo("Rolety","command: " + receivedCommand) case "STOP": logInfo("Rolety","command: " + receivedCommand) case "DOWN": logInfo("Rolety","command: " + receivedCommand) case "50": logInfo("Rolety","command: " + receivedCommand) } end
Nic więcej na temat rolet nie ma. Odwołanie do Fatek dopiero w case planuję dać coś jak fatekplc="plc2:M230"
Bardziej chodziło mi o coś takiego:
rule "rolety" when Item RolJad received command then logInfo("Rolety","command: " + receivedCommand) switch (receivedCommand) { case "UP": logInfo("Rolety","UP") case "STOP": logInfo("Rolety","STOP") case "DOWN": logInfo("Rolety","DOWN") case "50": logInfo("Rolety","50") } end
Spróbowałbym jeszcze restartu OH, jeśli nie zadziała. Ty masz wciąż OH2?
Voila!
Sitemap
Switch item=RolJad mappings=[UP="W gore", STOP="X", DOWN="W dol", 50="50"]
Items
String RolJad "Roleta jadalnia [%d]"
Rules
rule "rolety" when Item RolJad received command then logInfo("Rolety","command: " + receivedCommand) switch (receivedCommand) { case "UP": { logInfo("Rolety","UP")} case "STOP":{ logInfo("Rolety","STOP")} case "DOWN":{ logInfo("Rolety","DOWN")} case "50":{ logInfo("Rolety","50")} } end
Number sprawdzałem ale String...
tylko teraz nie podam polecenia samego fatekplc="plc2:M230" ani przez
sendCommand
Number sprawdzałem ale String...
tylko teraz nie podam polecenia samego fatekplc="plc2:M230" ani przez
sendCommand
Jedynie co chodzi ok to zdublowanie
String RolJad "Roleta jadalnia [%d]" (Rolety) Switch RolJadG "Roleta jadalnia [%d]" (Rolety) { fatekplc="plc2:M230", expire="1s,command=OFF" } Switch RolJadD "Roleta jadalnia [%d]" (Rolety) { fatekplc="plc2:M231", expire="1s,command=OFF" }
co daje w efekcie
08:04:56.194 [INFO ] [smarthome.event.ItemCommandEvent ] - Item 'RolJad' received command UP 08:04:56.200 [INFO ] [eclipse.smarthome.model.script.Rolety] - command: UP 08:04:56.202 [INFO ] [eclipse.smarthome.model.script.Rolety] - UP 08:04:56.207 [INFO ] [smarthome.event.ItemCommandEvent ] - Item 'RolJadG' received command ON 08:04:56.215 [INFO ] [smarthome.event.ItemStateChangedEvent] - RolJadG changed from OFF to ON 08:04:57.491 [INFO ] [smarthome.event.ItemCommandEvent ] - Item 'RolJadG' received command OFF 08:04:57.500 [INFO ] [smarthome.event.ItemStateChangedEvent] - RolJadG changed from ON to OFF
Droga wydaje mi się nie co na około...
A zajrzałeś w ogóle do dokumentacji?
https://v2.openhab.org/addons/bindings/fatekplc1/
Bo ja przed chwilą zajrzałem i mam wrażenie, że od 24 godzin wyważamy otwarte drzwi, bo postanowiłeś nie używać rollershutter item.
Niestandardowe podejście wymaga, jak widać, niestandardowych metod. Z dokumentacji wynika, że nie da się dostać do things z poziomu rules, więc jesteś skazany na proxy items, jak pokazałeś powyżej. Możesz jeszcze ukryć RolJadG i RolJadD w sitemapie.
rollershutter nie bardzo mi odpowiada choć bywa bardzo wygodny.
Docelowo chciałbym mieć w 1 linijce sterowanie w górę i dół, długość impulsu powiedzmy 3s oraz 0, 50, 100% otwarcia (też czasowo liczone), Jeszcze nie wiem jak ugryźć to 50% bo program nie wie czy jest całkiem zamknięte czy całkiem otwarte 😉
Poza tym niestandardowe podejście rozwija 😉 może komuś się to jeszcze przydać
Musisz zwracać w jakimś rejestrze PLC pozycję rolety do OH. Jednak najwygodniej mieć sterowanie roletą w PLC, bo odczyt w OH jest co jakiś czas a nie w przypadku każdej zmiany, opóźnienie odczytu, które z tego wynika może powodować duże niedokładności w pozycjonowaniu rolety. Pozycję rolety w PLC ustala się wg czasu, przez jaki jest włączony silnik znając czas przebiegu od w pełni zamkniętej do w pełni otwartej. Te 50% można zrealizować na regułach w OH, ale nadal potrzeba informacji o pozycji rolety.
W bibliotekach OSCAT dla WAGO (a właściwie CodeSys) są gotowe bloczki do sterowania roletami, np jest tam taka funkcjonalność, że każde pełne otwarcie rolety powoduje wydłużenie czasu "naciśnięcia" UP celem wyeliminowania niedokładniości liczenia pozycji (wydłużająć ruch w górę system "upewnia się", że roleta na pewno została w pełni otwarta) a także po zaniku zasilania, poza godzinami nocnego zamknięcia, otwiera rolety po czym dopiero ustawia je w zadanej pozycji. Musiałem tylko dołożyć zerowanie bitów odpowiadających za UP i DOWN z OH po czasie jaki zajmuje pełen ruch rolety, aby można było sterować roletą z przycisków bez wcześniejszego wciskania STOP w OH.
Nigdy nie lubiłem drabinki i nie mam ani kawałka programu w PLC zrobionego na drabince, więc tutaj nie pomogę 😉
A co do wyboru item, to w OH3 możesz sobie zrobić własny widget do sterowania roletami z przyciskami, jakie Ci się zamarzą 😀
Przewaga Wago dla domu jest bezdyskusyjna ogromne wsparcie bibliotek ale i cena większa Fateka 60 portowego miałem za około 1500zł w Wago to wiele by nie było...