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
Cześć,
Dodałem w Domoticzu selektor obsługujący bramę z listą wyboru typu: "uchyl bramę na 15/60 s", "otwórz na 1/5/10 minut" itp. Napisałem do tego działający skrypt, który w zależności od wybranej opcji zwiera styki w bramie 2 lub 3 razy wykonując sekwencje uchylenia lub pełnego otwarcia bramy po czym zamyka ją po zadanym czasie. Na samym początku dodałem warunek sprawdzający czy brama w ogóle jest zamknięta, żeby nie powodować niepożądanych działań (zamknięcie już otwartej bramy) i to mi też działa.
I teraz clou tematu: Takie samo zabezpieczenie/sprawdzenie chciałbym dodać przed ostatnim zwarciem styków przekaźnika czyli zamknięciem bramy. Jeżeli otworzę sobie bramę na 10 minut, ale w międzyczasie zamknę ją jakimkolwiek innym sposobem, to chciałbym aby to ostatnie zwarcie się nie odbyło, bo mi to tylko ponownie otworzy bramę. Mam jednak problem w tym, że skrypt widzi cały czas ten sam status bramy (tak jakby nie sprawdzał w trakcie wykonywania skryptu, tylko z góry i zapamiętywał wartość. Jakieś pomysły jak z tym postąpić? Próbowałem na kilka sposobów, ale może ktoś już to kiedyś rozgryzł, więc zapytam.
W załączniku skrypt. Chodzi mi o te zakomentowane formuły - psują działanie skryptu.
@bartolomeo możesz spróbować dodać sobie zmienną , która będzie reprezentowała stan bramy i zacząć skrypt od sprawdzania tej zmiennej ( tak jak zrobiłeś warunek tak dodajesz że jeśli brama otwarta to zmienna.value == ' open' jak zamknięta to 'closed' , potem w każdym if sprawdzaj stan zmiennej . Nie dam głowy że to zadziała bo nie robiłem takich auto- zamknięć a tak na szybko tylko to mi przychodzi do głowy
Spróbowałem. Niestety nic nie daje - efekt taki sam jak wcześniej... Zacząłem kombinować i testować na wylot. Niestety wartość (status bramy) która jest przesyłana np. po 20 sekundach nie odpowiada obecnej tylko tej sprzed 20 sekund. Dla mnie to jest błąd logiczny w tym języku programowania.
Ale obszedłem to następująco. Zrobiłem 3 skrypty - skrótowo/przykładowo opisuję:
1. Brama-czasowka-otworz --> Uruchamiany przełącznikiem typu selektor --> otwiera/uchyla bramę i przesyła po określonym czasie "rozkaz zamknięcia" (wartość całkowita 1) bramy do zmiennych użytkownika
if (funkcjaBramy.state == 'Otwórz i zamknij po 1 min') then
shelly.switchOn()
domoticz.variables('Rozkaz_zamknięcia').set(1).afterSec(czas_otw+60)
end
2. Brama-czasowka-przekaznik --> uruchamiany zmianą wartości zmiennej "rozkaz zamknięcia" --> sprawdza ponownie status bramy aktualny w danym momencie i aktualizuje kolejną zmienną użytkownika 'Prawdziwy status bramy'
if domoticz.variables('Rozkaz_zamknięcia').value == 1 then
domoticz.variables('Prawdziwy status bramy').set(statusBramy.state)
domoticz.variables('Rozkaz_zamknięcia').set(0).silent()
3. Brama-czasowka-zamknij --> uruchamiany zmianą wartości zmiennej 'Prawdziwy status bramy' --> jeśli jest otwarta to zamyka, a już zamknięta to nic nie robi.
if domoticz.variables('Prawdziwy status bramy').value == 'Open' then
shelly.switchOn()
end
I nie pytajcie dlaczego nie wystarczyły dwa skrypty. Nie wiem. Nie działało jeśli łączyłem drugi z trzecim 😐
Jeśli ktoś ma lepszy patent to chętnie się podszkolę, ale generalnie działa.