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
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
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 )
Dla takich zastosowań porównania czasu najlepiej operować na znaczniku timestamp.
Po włączeniu TV zapamiętujesz znacznik w którym nastąpiło włączenie - “start_time”.
Za pomocą noda inject co minutę uruchamiasz proces. Ten nod zwraca znacznik obecnego czasu “now_time”.
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ś:
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:
Zwiększam więc znacznik czasu o 5 minut czyli 300,000 msek.
Ale funkcja, zamiast zmiennej czasowej timestamp zwraca string…
… 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
Wchodzisz z zakres operacji na czasie
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ę
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ć.
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.
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;