Удобное использование TTS яндекс станции в скриптах при интеграции в Home Assistant

Зайчатки разума

Записная книжка айтишника

Удобное использование TTS яндекс станции в скриптах при интеграции в Home Assistant

2020-10-22 15:20:57 — Evgeniy Shumilov

  Я просто оставлю это здесь на всякий случай как шпаргалку. У меня периодически возникает необходимость оповещения о чём-то голосом. Например, о провале выполнения какого-нибудь процесса бекапа или об окончании процесса печати детали 3д принтером или о чём угодно другом. 


  Интеграцию модуля управления станцией с HA я описывать не буду, она описана в документации на сам модуль. Но вот что позволило мне использовать TTS простым и удобным образом - это небольшая автоматизация для HA, которая ждёт отправки текста в определённый топик MQTT и затем уже воспроизводит на яндекс станции. Выглядит это следующим образом:

 - id: '1595590318766'
   alias: Yandex station tts by mqtt
   description: ''
   trigger:
   - platform: mqtt
     topic: /ys/tts
   condition: []
   action:
   - data_template:
       media_content_id: '{{ trigger.payload }}'
       media_content_type: text
     entity_id: media_player.yandex_station_94....70f # здесь нужно указать id станции, полученный после интеграции
     service: media_player.play_media
   mode: single

  Теперь можно отправить в mqtt топик '/ys/tts' текст и станция его произнесёт. Для этого на удалённых инстансах (домашний сервер, множество всяких PI для различных нужд и т.п.) существует скрипт sendtts:

#!/bin/sh
cd `dirname "$0"`
[ -f "config" ] && . ./config

[ -z "$MQTT_HOST" ] && echo "MQTT host is not configured, using 127.0.0.1 by default" && MQTT_HOST=127.0.0.1
[ -z "$MQTT_PORT" ] && echo "MQTT port is not configured, using 127.0.0.1 by default" && MQTT_PORT=127.0.0.1
[ -z "$MQTT_TTSTOPIC" ] && echo "MQTT tts topic is not defined, using /ys/tts by default" && MQTT_TTSTOPIC='/ys/tts'
mqtt="mosquitto_pub -h $MQTT_HOST -p $MQTT_PORT"
[ -n "$MQTT_USER" ] && mqtt="$mqtt -u $MQTT_USER"
[ -n "$MQTT_PORT" ] && mqtt="$mqtt -P $MQTT_PASS"
mqtt="$mqtt -t $MQTT_TTSTOPIC -m "

$mqtt "$1"

  И файл с именем config, лежащий в той же директории:

MQTT_HOST=somehost # меняем на свой адрес
MQTT_PORT=1883     
MQTT_USER=user     # в случае наличия
MQTT_PASS=pass     # в случае наличия
MQTT_TTSTOPIC=/ys/tts 

  Пример вызова:

./sendtts 'Мама мыла раму'

  Один из моих сценариев использования - на одну из кнопок многоклавишного выключателя на стене рядом с диваном, на котором я последние полгода пандемии обитаю, подвешена функция прогрева стола и сопла 3D принтера. При нажатии на кнопку HA через SSH запускает скрипт на OrangePi PC, который подключен к 3D принтеру. Скрипт отправляет на TTS оповещение о включении принетра, включает блок питания принтера через модуль реле, ждёт, пока появится TTY устройство, пытается подключиться к принтеру, в случае успеха отправляет на TTS фразу "доступ у управлению принтером получен", затем запускает прогрев с нужными параметрами и озвучивает их - температуру стола и экструдера.

  Выглядит это примерно так:

#!/bin/sh
EXTTEMP=225
BEDTEMP=80

[ -n "$1" ] && EXTTEMP="$1"
[ -n "$2" ] && BEDTEMP="$2"

cd `dirname "$0"`
echo "Turning on the printer..."
[ -f "sendtts" ] && ./sendtts "Включение питания эндер 3"
#.printer 1
./api on
echo "Waiting for powering on..."
sleep 3
echo "Waiting for connection..."
./api connect
while [ -z "$(./api stat | grep -F '"operational":true,')" ]; do
	sleep 1
done
[ -f "sendtts" ] && ./sendtts "Доступ к управлению эндер 3 получен, включение прогрева. Экструдер $EXTTEMP, стол $BEDTEMP."
echo "Sending to home position, heating..."
./api cmds "\"G28 R X Y Z\",\"M140 S$BEDTEMP\",\"M104 S$EXTTEMP\""

  Нужно ещё дописать в скрипт статистики проверку выхода на рабочую температуру и добавить ещё одно опопвещение - об окончании нагрева. Пока просто не успел. Ничего в принципе сложного, но уже чувствуешь себя немного в будущем. Как-нибудь в другой раз напишу отдельно о скриптах для облегчения управления принтером.

Теги: 3d-printing, automatization, smarthome, homeassistant

comments powered by Disqus