Kontrola czasu włączenia TV

Witam

Potrzebuję pomocy w wykonaniu “małej” kontroli rodzicielskiej a dokładnie kontroli włączenia telewizora.
Ogarnąłem sobie już zliczanie czasu korzystania, wyłączanie TV, wł/wy całej “kontroli” ale ugrzęzłem z tematem dodania “dodatkowego” czasu oglądania.
Nie chcę wchodzić w noda i ręcznie zmieniać wartości ale chciałbym dodać czas z poziomu panelu

Mógłbym prosić o pomoc jak to ogarnąć??

Pozdrawiam

Zależy jak wygodnie byłoby to obsługiwać… w HA trzeba zrobić pomocnika np. suwak, lista lub wprowadzanie czasu.

Tą informacje przekazać do NR w celu korekty czasu… nic nie pokazałeś, więc nie wiadomo jak mierzysz czas i jak wpłynąć na jego długość.
Ten wprowadzany, dodatkowy czas (“extra time”) musiałby być sumowany z “normal time” i dopiero sprawdzany na bieżąco w procesie. Po wyłączeniu TV extra time dobrze wyzerować automatycznie.

Przykład takiej korekty, o której pisze @RobinI30 , możesz znaleźć w tym wątku Automatyczne nawodnienie trawnika - ESP32 - #46 przez RobinI30
Co prawda nie dotyczy to wyłączania TV, ale zasada, czy idea jest taka jakiej chyba potrzebujesz.
Jest tam gotowy flow do zaimportowania i modyfikacji do własnych potrzeb.

Jako idea to może tak… jednak w tamtym korekta uwzględniana jest raz - na początku procesu.
Tu przydałaby się możliwość dynamicznej zmiany, ponieważ z reguły pod koniec oglądania jest - “tata jeszcze…”

Dziękuję za rozpoczęcie dyskusji. Przesyłam PrtSc tego co mam zrobione.
Czas liczę poprzez “history stats”. Zrobiłem też “pomocnika” jako switch aby wł/wy całą automatyzację.
Bawiąc się stworzyłem noda w którym wartość ustalam przez pomocnika w panelu ale to nie jest to o co chodzi




Nawet nie wiem jak odpowiedzieć :thinking:

Twój proces, po za odczytywaniem stanów encji z HA nic nie robi i w zasadzie nie jest do uratowania.
Nie da się go w żaden sposób poprawić tylko napisać od nowa.
Z załączonego obrazka widać, że jeszcze niewiele wiesz (bez urazy :slight_smile: )
Dla takich zastosowań porównania czasu najlepiej operować na znaczniku timestamp.

  1. Po włączeniu TV zapamiętujesz znacznik w którym nastąpiło włączenie - “start_time”.
  2. Za pomocą noda inject co minutę uruchamiasz proces. Ten nod zwraca znacznik obecnego czasu “now_time”.
  3. sprawdzasz warunek (now_time - start_time) < (dozwoly czas + extra) - nodem warunkowym jest switch

!!! timestamp w NR jest w milisekndach więc dozwolony czas i extra trzeba przeliczyć na [ms]
Operacje na czasie “zegarowym” na tym etapie są za trudne.
Minej/więcej takie coś:

Mam bardzo podobny problem, dotyczący czasu el. ogrzewania podłogowego. Mój flow wygląda tak:

  • limit dobowy jest wartością pomocnika typu number - tu ustawiony na 5 (w minutach)
  • czas ogrzew jest sensorem zliczającym czas pracy ogrzewania (zeruje się codziennie o północy) - tu wynosi 0.0
  • zał. od godz jest wartością pomocnika typu czas - timestamp - parametr użytkownika - tu ustawiony na godz. 00:00:00

Skoro znam czas załączenia zał od godz i dobowy limit czasu pracy limit dobowy, to w nodzie funkcji zał do godz próbuję napisać funkcję obliczającą czas wyłączenia ogrzewania:

const do_godz = msg.od_godz + msg.limit_dobowy * 60000;
msg =
    {
        "do_godz.": do_godz,
    }
return msg;

Zwiększam więc znacznik czasu o 5 minut czyli 300,000 msek.
Ale funkcja, zamiast zmiennej czasowej timestamp zwraca string…

obraz
… i nie dodaje 300.000 msek do wartości stempla czasowego od_godz i nie zwraca wyniku liczbowego w zmiennej do_godz, tylko go dokleja do do_godz jako string…
W obiekcie payload widzę zmienną start jako liczbę (wyrażoną z msek). Czyli jest to liczba.
Błąd jest pewnie w moim rozumieniu pojęcia timestamp… Czy mogę prosić o podpowiedź, jak ta funkcja powinna wyglądać?

Nie mam w tej chwili za bardzo czasu aby wnikliwie to przeczytać.

Pierwsze co rzuca się w oczy to operujesz na domyślnych typach string
Musisz operować na numerach i dokonać jawnej konwersji parseInt();

Inaczej będziesz sklejał zapis tych liczb - w debug musisz otrzymać prezentacje bez “”.

…edit
Nie wszystko da się zrobić w/g tego samego szablonu.
Napisz tylko co chcesz uzyskać ( nie jak), wydaje się, że to trzeba zrobić inaczej :slight_smile:
Wchodzisz z zakres operacji na czasie

zupełnie niepotrzebnie na pierwszy rzut oka.

A zatem:
Mam 2 encje pomocnicze:

  • godzina załączenia ogrzewania: input_datetime.start
  • dzienny limit czasu jego pracy (liczba minut): input_number.limit_minut

Chcę zbudować funkcję w NR (lub alternatywnie zdefiniować templatkę sensora sensor.koniec), która na wyjściu będzie podawała godzinę wyłączenia ogrzewania koniec obliczaną jako znaną porę startu powiększoną o wielkość znanego limitu wyrażonego w minutach (limit_minut), czyli:

koniec = start + limit_minut

Moim aktualnym marzeniem byłoby zbudować taką właśnie funkcję :wink:

Cześć,
Nie czytałem całości, ale jeżeli dobrze rozumiem potrzebujesz coś takiego. U mnie na przykładzie sterowania rekuperatorem.
Tryb ręcznik uruchamia minutnik z założonym czasem w jakim tryb ręczny ma być aktywny i przelicza o której godzinie tryb ręczny się skończy.

Jeżeli o to chodzi to możemy spróbować dostosować.
obraz

i po uruchomieniu trybu ręcznego

obraz

Breaking News:

Mam! Wymyśliłem! Oto upragniona funkcja:

const start = msg.od_godz;
const limit = "00:" + msg.limit_dobowy + ":00";
var now = new Date();

now.setHours(start.split(":")[0]);
now.setMinutes(start.split(":")[1]);
now.setHours(now.getHours()+parseInt(limit.split(":")[0]));
now.setMinutes(now.getMinutes()+parseInt(limit.split(":")[1]));
var hours = (now.getHours()<10?'0':'') + now.getHours();
var minutes = (now.getMinutes()<10?'0':'') + now.getMinutes();
var do_godz = hours + ":" + minutes + ":00";

msg =
    {
        "do_godz.": do_godz,
    }
return msg;

Przetestowałem dla klikunastu różnych wartości zmiennych msg.od_godz i msg.limit_dobowy.
Na razie działa bez zarzutu, nawet poprawnie przekręca licznik godzin przy limicie powyżej 60 minut.

Zobaczcie:
obraz

I dla koszerności posta zamieszczam sam flow:

Pomysł do wykorzystania!

:+1:
Zobacz ten poradnik

Skoro już opanowałeś funkcje operacji na czasie to łatwiej będzie Ci zrozumieć moje podejście

  1. Pobierasz czas startu
  2. Konwertujesz na timestamp (TS)
  3. Do TS dodajesz limit
  4. Robisz odwrotną konewrsję TS > Date = koniec;
1 polubienie

Nie prościej będzie mimo wszystko wykorzystać timer? w atrybutach z automatu dostępna część wymaganych informacji.

Ja też się pobawiłem, niby działa ale czy tak jak oczekujesz

var start = msg.start; 
var limitMinut = msg.limit_minut;


var startTime = new Date("1970-01-01T" + start);


var endTime = new Date(startTime.getTime() + (limitMinut * 60000)); 


var koniec = endTime.toTimeString().substring(0, 8);


msg.payload = koniec;
return msg;

@MariuszAK