Sterowanie roletami...
 
Powiadomienia
Wyczyść wszystko

openHAB Sterowanie roletami PLC

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

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.

drab

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 😉

 
Dodane : 16/09/2021 12:27 pm
(@kamikac)
Wpisów: 226
Pomocny
 

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

 
Dodane : 16/09/2021 11:45 pm
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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?

 
Dodane : 17/09/2021 5:28 am
(@kamikac)
Wpisów: 226
Pomocny
 

@szpila86 

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

 
Dodane : 17/09/2021 7:05 am
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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 '�'
 
Dodane : 17/09/2021 9:46 am
(@kamikac)
Wpisów: 226
Pomocny
 

@szpila86

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.

 
Dodane : 17/09/2021 12:32 pm
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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'.
 
Dodane : 17/09/2021 1:40 pm
(@kamikac)
Wpisów: 226
Pomocny
 

A nie powinno być

switch (RolJad.receivedCommand) {

i UP, STOP i DOWN w cudzysłowiu?

 

 
Dodane : 17/09/2021 1:53 pm
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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

 

 
Dodane : 17/09/2021 2:50 pm
(@kamikac)
Wpisów: 226
Pomocny
 

@szpila86

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?

 

 
Dodane : 17/09/2021 7:45 pm
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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"

 
Dodane : 17/09/2021 8:30 pm
(@kamikac)
Wpisów: 226
Pomocny
 

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?

 
Dodane : 17/09/2021 8:50 pm
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

już restartowałem pare razy...

wersja 2.5.10 ale to nie powinno mieć znaczenia

 
Dodane : 17/09/2021 8:59 pm
(@kamikac)
Wpisów: 226
Pomocny
 

@szpila86

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

 

 
Dodane : 17/09/2021 9:22 pm
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

Number sprawdzałem ale String... 

tylko teraz nie podam polecenia samego fatekplc="plc2:M230" ani przez
sendCommand

 
Dodane : 18/09/2021 6:19 am
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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

 
Dodane : 18/09/2021 7:07 am
(@kamikac)
Wpisów: 226
Pomocny
 

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.

 
Dodane : 18/09/2021 8:52 am
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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ć

 
Dodane : 18/09/2021 9:19 am
(@kamikac)
Wpisów: 226
Pomocny
 

@szpila86

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ą 😀

 
Dodane : 18/09/2021 9:32 am
(@szpila86)
Wpisów: 363
Weteran Patron Strony Donator 2K22, Donator 2K23, Donator 2K24
Autor tematu
 

@kamikac 

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

 
Dodane : 18/09/2021 9:43 am
Strona 1 / 2
Udostępnij: