Ten drugi sposób super rozwiązanie, ale tego już sam nie ogarnę.
Podasz kod gotowca ?
Przesyłam gotowy kod zmodyfikowany o powyższe funkcje:
Subflow_powiadomienia_v2.json (12,3 KB)
Dodałem jeszcze ustawienie poziomu głośności przed wypowiedzeniem powiadomienia zależne od godziny. Między 6-21 powiadomienia będą głośniejsze, (w razie potrzeby łatwo to usunąć).
Szukam jeszcze sposobu, aby zwiększyć głośność powiadomień w stosunku do słuchanej muzyki, radia. Może znasz jakiś sposób?
Dziękuje pięknie za podzielenie się kodem
Teraz jest idealnie.
Niestety chyba tu nie pomogę ale rozumiem, że chodzi Ci żeby sprawdzić jak głośno gra np. google home mini i od poziomu głośności z jakim gra ustawić głośność powiadomienia ?
Przykładowo. Wywołuje powiadomienie i ustawiam dźwięk głośnika na poziomie 0,6, aby było dobrze słyszalne w całym domu. W momencie kiedy uruchomię radio po takim powiadomieniu poziom 0,6 jest za duży i przyciszam głośnik. Kiedy radio działa i zostanie odczytane powiadomienie poziom znowu wraca na 0,6 i muszę iść po pilota i zmniejszyć na 0,4. W tym czasie córka się budzi i … masakra.
Chciałbym rozgraniczyć multimedia od powiadomień i ustawić różne poziomy (jak w telefonie).
Jedynie co mi na razie przyszło do głowy to:
nie jest idealne ale może uratuje od
Jeżeli dobrze zrozumiałem, musisz odczytać i zapisać aktualny stan głośności i po odczytaniu powiadomienia przywrócić go,
zobacz sobie moje:
[{"id":"e7454f6e.0e3b5","type":"subflow","name":"Sprawdź czy jest ktoś w domu?","info":"","category":"","in":[{"x":430,"y":320,"wires":[{"id":"af2a24ef.3db6f8"},{"id":"632641b2.883be"}]}],"out":[{"x":1410,"y":290,"wires":[{"id":"8eeeda86.36c4a8","port":0}]},{"x":1410,"y":370,"wires":[{"id":"a848628b.58d69","port":0}]}],"env":[],"color":"#DDAA99","outputLabels":["TAK","NIE"]},{"id":"af2a24ef.3db6f8","type":"api-current-state","z":"e7454f6e.0e3b5","name":"","server":"4d0e02c9.2307bc","version":1,"outputs":2,"halt_if":"home","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"person.kamila","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":680,"y":310,"wires":[["8eeeda86.36c4a8"],["1bc2ac7b.ac4b64"]]},{"id":"632641b2.883be","type":"api-current-state","z":"e7454f6e.0e3b5","name":"","server":"4d0e02c9.2307bc","version":1,"outputs":2,"halt_if":"home","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"person.bartek","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":680,"y":370,"wires":[["8eeeda86.36c4a8"],["998f8654.709338"]]},{"id":"8eeeda86.36c4a8","type":"delay","z":"e7454f6e.0e3b5","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":1270,"y":280,"wires":[[]]},{"id":"a848628b.58d69","type":"delay","z":"e7454f6e.0e3b5","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":1270,"y":370,"wires":[[]]},{"id":"1bc2ac7b.ac4b64","type":"api-current-state","z":"e7454f6e.0e3b5","name":"","server":"4d0e02c9.2307bc","version":1,"outputs":2,"halt_if":"home","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"person.bartek","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":950,"y":250,"wires":[["8eeeda86.36c4a8"],["a848628b.58d69"]]},{"id":"998f8654.709338","type":"api-current-state","z":"e7454f6e.0e3b5","name":"","server":"4d0e02c9.2307bc","version":1,"outputs":2,"halt_if":"home","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"person.kamila","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":950,"y":420,"wires":[["8eeeda86.36c4a8"],["a848628b.58d69"]]},{"id":"ffa9b8d4.4ed828","type":"subflow","name":"Głośnik Łazienka Komunikat","info":"","category":"","in":[{"x":150,"y":140,"wires":[{"id":"c8464e8b.84112"}]}],"out":[],"env":[],"color":"#DDAA99"},{"id":"8715060b.29c538","type":"api-call-service","z":"ffa9b8d4.4ed828","name":"Ustawienie głośności","server":"4d0e02c9.2307bc","version":1,"debugenabled":false,"service_domain":"media_player","service":"volume_set","entityId":"media_player.lazienka","data":"{\"volume_level\":\"0.5\"}","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":400,"y":440,"wires":[["f21be3bb.ad0fc"]]},{"id":"8147df40.39583","type":"delay","z":"ffa9b8d4.4ed828","name":"100 milisekund","pauseType":"delay","timeout":"100","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":200,"y":440,"wires":[["8715060b.29c538"]]},{"id":"f9f353ff.49203","type":"api-call-service","z":"ffa9b8d4.4ed828","name":"Głośnik STOP","server":"4d0e02c9.2307bc","version":1,"debugenabled":false,"service_domain":"media_player","service":"media_stop","entityId":"media_player.lazienka","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":1060,"y":300,"wires":[["8147df40.39583"]]},{"id":"69f32a23.2541d4","type":"change","z":"ffa9b8d4.4ed828","name":"Zapisuję na boku 3","rules":[{"t":"set","p":"glosnosc","pt":"flow","to":"data.attributes.volume_level","tot":"msg"},{"t":"set","p":"playing","pt":"flow","to":"music","tot":"str"},{"t":"set","p":"stacja","pt":"flow","to":"data.attributes.media_content_id","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":870,"y":300,"wires":[["f9f353ff.49203"]]},{"id":"866ef62d.5720d8","type":"change","z":"ffa9b8d4.4ed828","name":"Zapisuję na boku 1","rules":[{"t":"set","p":"glosnosc","pt":"flow","to":"data.attributes.volume_level","tot":"msg"},{"t":"set","p":"playing","pt":"flow","to":"off","tot":"str"},{"t":"set","p":"stacja","pt":"flow","to":"off","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":870,"y":260,"wires":[["f9f353ff.49203"]]},{"id":"e8d3100e.b4a4c","type":"switch","z":"ffa9b8d4.4ed828","name":"Gra?","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"playing","vt":"str"},{"t":"eq","v":"playing","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":710,"y":300,"wires":[["866ef62d.5720d8"],["69f32a23.2541d4"]]},{"id":"1cf39ee5.7faba1","type":"api-current-state","z":"ffa9b8d4.4ed828","name":"Pobieram dane głośnika","server":"4d0e02c9.2307bc","version":1,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"media_player.lazienka","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":530,"y":300,"wires":[["e8d3100e.b4a4c"]]},{"id":"eae44c3d.9e8d3","type":"api-call-service","z":"ffa9b8d4.4ed828","name":"Ustawiam głośność","server":"4d0e02c9.2307bc","version":1,"debugenabled":false,"service_domain":"media_player","service":"volume_set","entityId":"media_player.lazienka","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":1370,"y":610,"wires":[[]]},{"id":"7f952d13.8574c4","type":"function","z":"ffa9b8d4.4ed828","name":"Ustawiam zapisaną głosność","func":"var glosnosc = flow.get(\"glosnosc\");\nmsg.payload =\n{\n \"data\":\n {\n \"volume_level\":glosnosc,\n }\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1140,"y":610,"wires":[["eae44c3d.9e8d3"]]},{"id":"a2f8506f.6fff7","type":"function","z":"ffa9b8d4.4ed828","name":"Ustawiam zapisaną stację","func":"var stacja = flow.get(\"stacja\");\nvar playing = flow.get(\"playing\");\nmsg.payload =\n{\n \"data\":\n {\n \"media_content_id\":stacja,\n \"media_content_type\":playing,\n }\n}\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":930,"y":560,"wires":[["e046de7a.77545"]]},{"id":"e046de7a.77545","type":"api-call-service","z":"ffa9b8d4.4ed828","name":"Ustawiam stację","server":"4d0e02c9.2307bc","version":1,"debugenabled":false,"service_domain":"media_player","service":"play_media","entityId":"media_player.lazienka","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":1180,"y":560,"wires":[[]]},{"id":"633ade43.a5a78","type":"api-call-service","z":"ffa9b8d4.4ed828","name":"Głosnik Łazienka","server":"4d0e02c9.2307bc","version":1,"debugenabled":false,"service_domain":"tts","service":"google_translate_say","entityId":"media_player.lazienka","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":890,"y":440,"wires":[["25de209a.b7388"]]},{"id":"a0a4113.e1f6cf","type":"switch","z":"ffa9b8d4.4ed828","name":"Grało?","property":"playing","propertyType":"flow","rules":[{"t":"eq","v":"music","vt":"str"},{"t":"neq","v":"music","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":650,"y":580,"wires":[["a2f8506f.6fff7","7f952d13.8574c4"],["7f952d13.8574c4"]]},{"id":"25de209a.b7388","type":"delay","z":"ffa9b8d4.4ed828","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1060,"y":440,"wires":[["77f74f38.39e83"]]},{"id":"f21be3bb.ad0fc","type":"function","z":"ffa9b8d4.4ed828","name":"msg.payload= msg.komunikat","func":"msg.payload= msg.komunikat\n \nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":650,"y":440,"wires":[["633ade43.a5a78"]]},{"id":"50e5750e.f0d66c","type":"change","z":"ffa9b8d4.4ed828","name":"","rules":[{"t":"delete","p":"payload","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":300,"wires":[["1cf39ee5.7faba1"]]},{"id":"dd055700.1a1ce8","type":"delay","z":"ffa9b8d4.4ed828","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":830,"y":140,"wires":[["50e5750e.f0d66c"]]},{"id":"c8464e8b.84112","type":"delay","z":"ffa9b8d4.4ed828","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"10","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":280,"y":140,"wires":[["24699863.30ab68"]]},{"id":"24699863.30ab68","type":"subflow:e7454f6e.0e3b5","z":"ffa9b8d4.4ed828","name":"","env":[],"x":510,"y":140,"wires":[["dd055700.1a1ce8"],[]]},{"id":"77f74f38.39e83","type":"ha-wait-until","z":"ffa9b8d4.4ed828","name":"","server":"4d0e02c9.2307bc","outputs":1,"entityId":"media_player.lazienka","entityIdFilterType":"exact","property":"state","comparator":"is","value":"idle","valueType":"str","timeout":0,"timeoutType":"num","timeoutUnits":"seconds","entityLocation":"","entityLocationType":"none","checkCurrentState":true,"blockInputOverrides":true,"x":1210,"y":440,"wires":[["a0a4113.e1f6cf"]]},{"id":"4d0e02c9.2307bc","type":"server","name":"Asystent domowy","legacy":false,"addon":false,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]
Od jakiegoś czasu ma problem z tą automatyzacją.
Jak jestem po za swoja siecią lokalną to po wywołaniu automatyzacji w NR na bramce AIS w bibliotece mediów zapisuje się zdjęcie z godziną 14:00:23 taka jak wywołana automatyzacja (czyli OK):
a na telefon dostaje jakieś stare zdjęcie z 06.10
Jak jestem w swojej sieci LAN wtedy działa prawidłowo.
Te zdjęcie z 06.10 to chyba właśnie jest z ostatniej automatyzacji złapanej jak byłem w swojej sieci lokalnej.
a jak wklejam w przeglądarkę
“https://dom-xxxxxxxxxxxxxe.paczka.pro/local/img/snapshot_camera.jpg”
to dostaje jeszcze coś innego:
Cache czyściłem ale to nie to.
Nic nie kumam…
Edit
trochę pomieszałem w opisie
Lokalnie działa jak zmienia w nodzie z powiadomieniem na:
http://192.168.20.2/local/img/snapshot_camera.jpg
ale wtedy jak jestem po za siecią lokalną to nie dostaje snpahota
Zapewne tak się zaczęło dziać po zmianie tunelu na CloudFlare - skutecznie cache’ują.
W powiadomieniu z linkiem do zdjęcia dodaj na końcu parametr z timestamp, np:
https://dom-xxxxxxxxxxxxxxxxx.paczka.pro/local/img/snapshot_camera.jpg?v={{ now().timestamp() }}
@Sebastian dodałem ale nie działa prawidłowo…
tj. za pierwszym razem pokazał ok, potem po wywołaniu automatyzacji znowu wyświetla nie aktualny screen, po jakiejś godzinie znowu siadłem się pobawić i znowu za pierwszym razem pokazało prawidłowo a przy kolejnych znowu nie aktualny screen
a w przeglądarce dopiero jak dam spacje za {
i przed }
to wtedy link zmienia postać na
https://dom-xxxxxxxxxxxxxxxx.paczka.pro/local/img/snapshot_camera.jpg?v={{%20%20%20%20%20now().timestamp()%20%20%20%20%20}}
i wyświetla aktualny screen
kolejne wywołanie i znowu muszę dodać spacje i link zmienia postać na
https://dom-xxxxxxxxxxxxxxxx.paczka.pro/local/img/snapshot_camera.jpg?v={{%20%20%20%20%20%20now().timestamp()%20%20%20%20%20%20}}
i dopiero wyświetla aktualny screen
Czyli nie zmienia się URL i jest za każdym razem jest taki sam, popraw na:
image: >-
https://dom-xxxxxxxxxxxxxxxxx.paczka.pro/local/img/snapshot_camera.jpg?v={{ now().timestamp() }}
Wszystko ma być w jednym ciągu, w jednej linii, pisane razem.
{{ now().timestamp() }} - w linku pojawi się jako unikalna liczba np. 1634020551.259837 co zapobiega cashe’owaniu zdjęcia. To na pewno zadziała w automatyzacji z HA.
Ale jeśli link tworzysz w Node-Red to prawdopodobnie musisz użyć innej metody, np:
var date=new Date();
var timestamp =date.getTime();
lub w inny sposób wygenerować losową liczbę i dokleić na końcu linka jako
?v=<timestamp_lub_losowa_liczba>
Dzięki @Sebastian faktycznie na HA działa prawidłowo.
@bartas87poz, @bartik22 Wy jesteście eksperci w NR, znajdzie ktoś chwile żeby poprawić te sublfow
No ale daj flow gdzie robisz snapa i puszczasz go dalej jako wiadomość z linkiem.
W tym subflow tylko przekazujesz tą wiadomość tylko w odpowiednie miejsce
a masz
“usunięty flow”
W takim rozwiązaniu oczywiście działa:
Ale wykorzystując subflow zrobione przez @bartas87poz nie umiem tego poskładać żeby działało
Spróbowałbym dodać to do pierwszej funkcji subflow’u Powiadomienia, ale skoro to bartas87poz tworzył to może znajdzie lepsze miejsce na edycję tej ścieżki.
env.set('tomasz_image', env.get('tomasz_image') + date.getTime())
no to wstaw sobie tutaj w tym subflow i bedzie dzialac
tak chyba tez powinno dzialac: najpierw pobieramy ten domyslny adres potem dodajemy do niego timestampa
hmm nie działa, w obu przypadkach wrzuca stare zdjęcie, zrobiłem na razie bez subflow
Spróbuj zrobić coś takiego @Tomasz :
(zmienna “numer_powiad_bartek” jest inkrementowana przy każdym wywołaniu)
var wiadomosc = flow.get('text')||null;
var bartek_image = env.get("bartek_image")||null;
var bartek_say = env.get("bartek_say");
var numer_powiad_bartek = global.get('numer_powiad_bartek')||null;
if (bartek_image != null){bartek_image=bartek_image+"?v="+numer_powiad_bartek}
msg.payload = {"data":{"priority":"high","notification_id":numer_powiad_bartek,"device_id":"<tu_wpisac_numer_urzadzenia>","message":wiadomosc,"image":bartek_image,"say":bartek_say,"click_action":"/lovelace/info_bartek"}}
return msg;
Proponuje takie rozwiązanie aby w przypadku niewypełnienia pola Subflow (bartek_image) wartość tego parametru była: null
@Sebastian miałbym pytanie odnośnie parametrów przy usłudze (AIS AI: mob_notify)
- image: http://ai-speaker.com/images/doorbell.jpg?v=1
- say: true
Mam aplikacje AIS i AIS MOB (niedawno opisywaną na wzór oryginalnego HA).
W aplikacji AIS powyższe argumenty działają (czyta wiadomość i wyświetla zdjęcie)
W Aplikacji AIS MOB działa samo powiadomienie ale już nie jest czytane i brakuje obrazu.
Czy tak powinno być? Pomija pisanie w Node-red (testowałem bezpośrednio z Narzędzi deweloperskich - usługi)
@bartik22 zapis który proponowałeś:
msg.timestamp - zwraca undefined
ja bym to zrobił tak:
tomasz_image1=tomasz_image+“?v=”+msg._msgid
(losowy numer komunikatu Node-red)