Jednorazowe wyzwalanie czujnikiem ruchu gdzie popełniam błąd

Chciałbym, żeby czujnik ruchu wyzwolił akcję przy pierwszym wykryciu ruchu między godzinami 7 i 9 rano. Wymyśliłem coś takiego gdzie nod Jajo to czujnik ruchu
nod1
flows (5).json (1,6 KB)
Dzieje się jednak rzecz dziwna bo po pierwszym wyzwoleniu wyzwala mi sam co trzy godziny tak jakby dla niego ciągle była godzina 7.00-9.00. Gdzie popełniłem błąd

Dzieje się tak ponieważ taka jest idea działania noda którego użyłeś, czyli noda Delay. Pierwsza wiadomość idzie po wykryciu ruchu przez czujnik i przelatuje przez nod Time Range a następnie przez nod Delay. Od tej pory nod Delay nie wypuści kolejnej wiadomości przez 3 godziny, co nie zmienia faktu, że je przyjmuje, a one przecież przychodzą bo czujnik ruchu nadal je wysyła jeśli wykryje ruch, a nod Time Range w określonym zakresie czasu nadal je przepuszcza. Dlatego pomimo, że zakres czasu z noda Time Range już minął, to nod delay wypuszcza kolejno co 3 godziny otrzymane wcześniej wiadomości i tym samym wyzwala akcję.
Przestaw miejscami nody Time Range oraz Delay i uzyskasz zamierzony efekt.

To znaczy, że są jakby buforowane i po kolejnych 3 godz. wypluwa kolejne wyzwolenie? To w takim razie jak najprościej rozwiązać problem jednorazowego wyzwolenia?

Możesz użyć np. noda Throttle:

Przetestuj sobie coś takiego:


Kliknij szybko kilka razy w przycisk przed nodem z napisem true i obserwuj z prawej strony jak pojawiają się odpowiedzi. Zwróć uwagę na bufor pod nodem delay
test.json (1,2 KB)

U Ciebie mogłoby to wyglądać tak:
Bez tytułu

flows.json (1,5 KB)

Świetnie to wytłumaczyłeś. Teraz widzę jak to działa. Inna sprawa, że nie spodziewałem się takiego działania i zachodziłem w głowę co się dzieje. Dzięki za lekcję i rozwiązanie.

W takich przypadkach wystarczy zdarzenie zapamiętać w zmiennej. Nie ma potrzeby niczego “dogrywać” i komplikować sobie życia :). To można zbudować na nodach podstawowych.

once

[{"id":"540da6c754876e2a","type":"switch","z":"d5ebfa8d.412cf8","name":"Once?","property":"once","propertyType":"flow","rules":[{"t":"false"}],"checkall":"true","repair":false,"outputs":1,"x":370,"y":740,"wires":[["87e8a19a63867823"]]},{"id":"28cba39e1c057ac1","type":"inject","z":"d5ebfa8d.412cf8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":740,"wires":[["540da6c754876e2a"]]},{"id":"dfacc53f3cd6e6cf","type":"inject","z":"d5ebfa8d.412cf8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":230,"y":800,"wires":[["09349fe62de8e436"]]},{"id":"87e8a19a63867823","type":"change","z":"d5ebfa8d.412cf8","name":"Set Once","rules":[{"t":"set","p":"once","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":740,"wires":[["e72076f20a75225a"]]},{"id":"e72076f20a75225a","type":"debug","z":"d5ebfa8d.412cf8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":690,"y":740,"wires":[]},{"id":"09349fe62de8e436","type":"change","z":"d5ebfa8d.412cf8","name":"Reset Once","rules":[{"t":"set","p":"once","pt":"flow","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":530,"y":800,"wires":[[]]}]

Ale rozwiązanie Mariusz jest krótsze :slight_smile:
A tak na marginesie to w Twoim rozwiązaniu należałoby wywołać Reser Once przed kolejną godziną siódmą. Dobrze myślę?

Pisałem bardziej jako przypadek uniwersalny, - nie zawsze znajdziesz stosowną bibliotekę.
Głównie chodzi o to aby nie tworzyć nowych bytów :wink:

Raz zaraz po restacie NR oraz resetować np. każdym msg poza zakresem czasu (dolnym wyjściem filtra czasu).

Biblioteka nodów jest po to żeby z niej korzystać i tym samym ułatwiać sobie życie.

Z głową…throttle i cała logika posypie się gdy pierwsze zdarzenie wystąpi np. o 8:30.
…ot i cała prostota poszła się…

Naprawdę przykro jest czytać te twoje mądrości.
Nic się nie posypie jeżeli ustawisz właściwy czas w nodzie throttle, np 3godz… Podałem wcześniej tylko przykład… ot i cała prawda, Ale ty i tak przecież wiesz lepiej.

1 Like

W nodzie delay zmień z Queue na Drop
image

2 Likes

Nie ma takiego obowiązku… najlepiej nie czytaj, nie cytuj i nie odpowiadaj skoro masz problem gdy ktoś śmie mieć inne zdanie.

Dziękuję za wszystkie rozwiązania. Spasujcie Panowie - weekend jest :slight_smile: