Wywołanie usługi ais_ai_service.mob_notify z Node-RED

Ten drugi sposób super rozwiązanie, ale tego już sam nie ogarnę.
Podasz kod gotowca :pray: :wink: ?

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?

2 polubienia

Dziękuje pięknie za podzielenie się kodem :clap:
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:
SharedScreenshot

nie jest idealne ale może uratuje od :speaking_head: :baby:

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):
image
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.

2 polubienia

{{ 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>

1 polubienie

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 :slight_smile:

1 polubienie

a masz :wink:
“usunięty flow”

Hm… testowałeś to co podał Sebastian? Bo u mnie to działa.

image

1 polubienie

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)

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)