Wczoraj go wgrałem, działał dołożyłem funkcje czasu ale się nie wyłączyły diody.
Wyłączyłem je z palca w nocy i dziś o 5:30 skrypt odpalił je ponownie .
@wojtek_gtx, jak robisz coś takiego: PM25>36-84 to tak naprawdę po prawej stronie znaku wykonujesz działanie artymetyczne i porównujesz PM25>-48 🙂 Dlatego zadziałało.
Diody na bazie tego skryptu wyłączą się tylko i wyłącznie raz o godzinie 21:30 pod warunkiem, że skrypt się o tej godzinie wykona (domoticz nieaktywny, brak zasilania i inne tego typu wyjątki mogą to popsuć)... jest pewnie 20 kolejnych sposobów na zabezpieczenie tego...
To poczekamy i sprawimy .
Choć też wczoraj zmieniałem godziny w skrypcie i nie wyłączyło
@wojtek_gtx, zapewniam, że u mnie działa. Żeby nie być gołosłownym przetestowałem przed chwilą trzy różne kombinacje wskazań wartości czujnika i zmieniłem godzinę zgaszenia lampek na 10:35. Najpierw paliła się zielona, później czerwona, później dwie na raz a o 10:35 zgasły i skrypt śpi do godziny 5:30.
Jeśli chcesz zmienić godziny gaszenia diód to musisz to zrobić w wierszu 3-cim i 15-tym kodu.
@bartolomeo moim skromnym zdaniem wkradło się w Twoim skrypcie trochę niekonsekwencji, mam na myśli ostatnią wersję do testowania na spokojnie. Ustawienie timera w taki sposób
timer = {'every 3 minutes and between 05:30 and 21:29', 'at 21:30'},
zakładając że wyzwalaczem jest czas , ten skrypt będzie się wykonywał co 3 min w przedziale 5:30 do 21:29 i powinien się wykonać raz o 21:30 , ale pod warunkiem, że w funkcji if zostanie mu to wskazane .
W Twoim skrypcie kończysz operacje na ledach o 21:29 i potem mówisz "else" wyłącz ledy .
Ale jeśli co ? Kiedy mam wyłączyć ?
Teraz jeżeli w skrypcie mamy wyzwalanie czasem i wskazaniami z czujników to zbędne jest wymuszanie wykonania co 3 minuty , to teoretycznie w niczym nie przeszkadza, ale powoduje że skrypt wykona się i co 3 minuty i po odczycie z czujnika , trochę bez sensu jeżeli czujniki się aktualizują np co 10 minut. A przy większej ilości skryptów takim wyzwalaniem tylko spowolnisz zapychasz system.
Spokojnie można ustawić timer na wyzwalanie tylko w zakresie godzin dziennych i godziny wyłączenia ledów.
timer = {'between 05:30 and 21:29' , 'at 21:30'},
a skrypt się wykona na podstawie aktualizacji czujników .
Tyle mojego , a poniżej do przetestowania skrypt, w którym trzeba dodać sobie drugi czujnik powietrza , i jeżeli @wojtek_gtx uzna to za przydatne czujnik alert , który odzwierciedla stan powietrza odpowiednim kolorem i opisem .
Dodałem też logi , które pomagają , ale nie są niezbędne i można się ich pozbyć
Skrypt nie jest testowany więc nie daję gwarancji, ale raczej powinien działać
Spokojnie można ustawić timer na wyzwalanie tylko w zakresie godzin dziennych i godziny wyłączenia ledów.
@isom dzięki za rozwianie wątpliwości co do timera.... Myślałem, że trzeba to programować w formacie:
devices = {['sensor pm10'] = { 'between 05:30 and 21:29' , 'at 21:30' }}
dlatego uprościłem do 3 minut i zaproponowałem coś co znam. Pierwsza propozycja była bodajże co 10 minut, żeby właśnie nie zapychać systemu.
W Twoim skrypcie kończysz operacje na ledach o 21:29 i potem mówisz "else" wyłącz ledy .
Ale jeśli co ? Kiedy mam wyłączyć ?
--> po prostu zawsze - bezwarunkowo - else - w każdym innym przypadku, po co dokładać tam warunek, który jest zbędny - chyba tylko dla czytelności, by wiedzieć o co tam chodzi?
@bartolomeo ok może ja nie wiem tak dobrze jak Ty, ale dalej nie kumam . Kiedy w tym skrypcie jest to zawsze - bezwarunkowo ?
Czy między 5:30 a 21:29, czy może o 21:30 ? Bo tylko te dwie opcje wchodzą w grę , a skoro aktualizacja czujników może nastąpić w tym przedziale czasowym, ale równie dobrze o 21:30 to kiedy ma ten skrypt wyłączyć led ?
Hm... i to jest już w sumie pytanie o rdzeń działania języka dzVents, a na tym się już raz przejechałem, ale moim zdaniem skrypt działa jakby w dwóch zakresach czasu: między 5:30 a 21:29, i osobno jeden raz o 21:30, i jest w nim zaprogramowany jeden nadrzędny warunek (najważniejszy w hierarchii- sprawdź czas) zbudowany mniej więcej tak:
if domoticz.time.matchesRule('between 05:30 and 21:29') then
"mruga lampkami według założeń"
else --(i tutaj przez to else jest rozumiany domyślnie zakres czasu od godziny 21:30 do 5:29, więc nie widzę konieczności tego sprawdzać.)
"zgaś lampki"
end
Jak Domoticz sobie sprawdzi, że jest po 21:29, to w ogóle nie sprawdza tych reguł, które mrugają lampkami, nie interesują go aktualizacje czujników i tylko przechodzi do wykonywania tego co stoi po else. Ale to tylko moje zdanie tak jak zaznaczyłem na początku posta, do którego jestem jednak głęboko przekonany ... 😉
Być może masz tu rację , nie zjadłem zębów na dzVents , też jestem samoukiem , ale w wolnej chwili to przeanalizuję dokładniej
Wgrałem to co @isom podrzucił, doprawiłem tym co @bartolomeo pokazał i póki co wszystko działa. Brak błędów.
Nie chce mi się zmieniać godzin zadziałania skryptu bo jeszcze coś popsuję 😉 więc poczekam do 21:30 .
Podoba mi się dodatkowo czujnik Alert.
Bardzo dziękuję @bartolomeo and @isom
Za porządki się wziąłem i nie miałem czasu, chciałem pokończyć tematy ale jak obiecałem załączam plik.
Jeszcze raz dziękuję za wszelka pomoc.
Witam szanowne grono.
Podłączę się pod temat, chcę zrobić coś podobnego tylko żeby wysłać komendę do ESP że ma włączyć kontrolkę
o złym stanie powietrza. Próbowałem cos wymodzić ale z marnym skutkiem, jest może jakaś przychylna dusza która
pomoże w rozwiązaniu problemu ?
return { execute = function(dz, item) local PM10=tonumber(dz.devices('PM 10').state) if (PM10<100) then os.execute ('curl -s "192.168.0.24/control?cmd=GPIO,14,0"') end if (PM10>100) then os.execute ('curl -s "192.168.0.24/control?cmd=GPIO,14,1"') end end }
@stefan_25 jak popatrzysz na przykłady innych skryptów to zobaczysz że s
krypt składa się z kilku sekcji , pierwsza to ustalenie co będzie wyzwalało ten skrypt i tu trzeba coś wskazać np czas , urządzenie, scena, zmienna itp . Taki początek może wyglądać tak jak poniżej gdy chcemy uruchamiać na podstawie czasu - tu co minutę
return { on = { timer = {'every minute'},
Funkcję ustawiłeś na "item " czyli wszystko może być wyzwalaczem dlatego trzeba wskazać że jeśli item = timer to zrób coś , czyli
if item.isTimer then
Dalej Twoje warunki i to co ma się podziać czyli domoticz ma uruchomić adres url , więc powinno to być w takiej formie
return { on = { timer = {'every minute'}, }, logging = { level = domoticz.LOG_DEBUG, -- set to LOG_ERROR when tested and OK marker = 'Pogodynka', }, execute = function(dz, item) local PM10 = ................................ if item.isTimer then if PM < ................................... -- tu logika -- jesli w ESPEASY masz login i hasło to tak jak poniżej dz.openURL ('http://admin:hasło@192.168.0.24/control?cmd=GPIO,14,1') -- bez logowania do ESP dz.openURL ('http://192.168.0.24/control?cmd=GPIO,14,1')
Celowo wstawiłem dodatkowe debugowanie skryptu żebyś miał łatwiej , wszystko co będzie źle zostanie opisane w logach
To nie jest działający skrypt , to tylko wskazówki co jest źle u Ciebie
A nie można tak prościej a nie zależne od czasu ?
Jakiś czas temu skleiłem taki do sygnalizacji lamp chodnikowych i działa, nie umie programować w tych językach więc
szukam czegoś co zadziała podobnie jak ten do lamp.
commandArray = {} if (devicechanged['Oswietlenie Chodnik'] == 'On') then os.execute ('curl -s "192.168.0.24/control?cmd=GPIO,12,1"') elseif (devicechanged['Oswietlenie Chodnik'] == 'Off') then os.execute ('curl -s "192.168.0.24/control?cmd=GPIO,12,0"') end return commandArray
@stefan_25 zamiast czasu możesz użyć device i reagować tylko na zmianę stanu czujnika.
Witam.
Czy mógłby ktoś napisać taką regułkę ? Proszę dlatego że nie umie w ogóle napisać programu w tym języku 'ach.