Criar automatização para ler o estádo do tempo com text to speech

Boas sou novo no homeassistant e gostava de criar uma automatização que fosse capaz de usar os dados do tempo por exemplo da integração do IPMA ou do que já vem com o Hass para utilizar numa automatização que dissesse o estado do tempo numa coluna inteligente. Alguém pode ajudar , obrigado.

Tecnicamente é possível mas a maioria das colunas inteligentes diz-te o estado do tempo se perguntares, sem passar pelo HA.

Vais ter uma trabalheira gigante para reinventar a roda.

Olá @riquemarquesc. Eu fiz “algo”, semelhante ao que queres.
No meu caso fala em PT de Portugal, pois usa o TTS, e podes personalizar como quiseres; acho muito mais flexível do que ouvir sempre a mesma coisa, em PR-BR.
Tens de substituir a entidade do media_player e do weather para as tuas entidades.
Pode ser melhorada, para cumprimentar de forma correcta consoante a hora do dia, consoante quem está ao pé, caso consigas distinguir de alguma forma. Já dá alguma mensagens diferentes mesmo que o tempo seja igual, pois uso o “random” para escolher aleatoriamente cada vez que corre.

Crias um novo script com este código, ou insere este serviço numa automação.

service: tts.google_translate_say
data:
  entity_id: media_player.coluna_da_cozinha
  message: >
    {% if states('sun.sun') == 'below_horizon' %}
      {% set cumprimento = 'boa noite' %}
    {% elif (as_local(now()).strftime("%H")|int(default=0) <= 12) %}
      {% set cumprimento = 'bom dia' %}
    {% else %}
      {% set cumprimento = 'boa tarde' %}
    {% endif %}
    {% set tempo = {
        'clear-night': 'limpo',
        'cloudy': ['nublado','com muitas nuvens']|random,
        'fog': ['enevoado','com muito nevoeiro','de nevoeiro']|random,
        'hail': ['com chuviscos','de chuva fraca']|random,
        'lightning': ['com relâmpagos','de trovoada']|random,
        'lightning-rainy': ['de tempestade','com relâmpagos e trovoadas']|random,
        'mostlycloudy': ['muito nublado','com algumas nuvens']|random,
        'partlycloudy': ['parcialmente nublado','com nuvens dispersas']|random,
        'pouring': ['muito chuvoso','de chuva intensa','com chuva intensa']|random,
        'rainy': ['chuvoso','de chuva']|random,
        'snowy': ['com neve','de neve']|random,
        'snowy-rainy': ['chuvoso e com neve','de chuva e neve','com chuva e neve']|random,
        'sunny': ['de sol','ensolarado','de sol maravilhoso','lindo','limpo']|random,
        'windy': ['ventoso','com muito vento','com ventos fortes','com muito vento']|random,
        'windy-variant': 'muito ventoso' } %}
    {% set estado = states('weather.casa_da_soeira') %}
    {% set condicoes = tempo[estado] %}
    Olá, {{ cumprimento }}. São agora {{as_local(now()).strftime("%H:%M")}}. {{["Lá fora","No exterior","Na rua"]|random }} estão {{state_attr('weather.casa_da_soeira','temperature')|round(default=0)}} graus e vai estar um dia {{ tempo[state_attr('weather.casa_da_soeira','forecast')[0].condition] }}, com mínima de {{ state_attr('weather.casa_da_soeira','forecast')[0].templow|round(default=0) }} e máxima de {{ state_attr('weather.casa_da_soeira','forecast')[0].temperature|round(default=0)}} graus.

Podes personalizar até com estados de tempo “humurísticos”, bastando para tal adicionar opções entre os [ ] das condições do tempo: por exemplo:

'rainy': ['chuvoso','de chuva','chuvoso, não te esqueças do guarda-chuva']|random,
...
'windy-variant': ['muito ventoso','de arrancar a peruca','estupidamente ventoso']|random

PS: entretanto já adicionei o “cumprimento” consoante a hora do dia. :wink:

Exemplo de resultado do texto:

Olá, boa tarde. São agora 13:27. Lá fora estão 19 graus e vai estar um dia ensolarado, com mínima de 9 e máxima de 20 graus.

Se precisares de ajuda, diz. E se o post era o que querias, marca como “solução” :blush:.

Bom dia, como colocaste as horas e os graus noutra cor, usei o teu exemplo para um card com essa informação, mas gostava de salientar algumas coisas como as horas e os graus. Eu tenho assim:

" Bom dia, Luís!

Hoje é sábado, 18 de Março de 2023. São agora 09:24. Na rua estão 12 graus e vai estar um dia com nuvens dispersas, com mínima de 8º e máxima de 19 º graus."

1 Curtiu

A coisa tá já está muito diferente deste lado passado 1 ano :crazy_face:. Mas sim, o bom do HA é podermos fazer TUDO como queremos. O importante é perceber como fazer o que pretendemos, e quando não sabemos saber como procurar e a quem perguntar. Serve para tudo na vida​:blush:! Siga! :blush:

E para a Alexa como seria ?

Boas. Não tenho Alexa, mas presumo que só o serviço mudaria. O template é igual, só muda o destino do template.

Obrigado pela pronta resposta, mas não será.
Dá erro

Estranho…
O template apenas gera texto, é o serviço que depois manda este texto para onde se quiser. Mas no serviço da Alexa terá parâmetros diferentes certamente; é só ver onde encaixar a mensagem.

Vê lá que o serviço de tts da Alexa é diferente:

Saquei de outro post:

      - service: notify.alexa_media
        data_template:
          data:
            type: tts
          target: 
            - media_player.alexa_1
          message: 'This is an example of a message'

ou

      - service: notify.alexa_media
        data:
          target: media_player.alexa_1
          message: 'This is an example of an announcement'
          data:
            type: announce
            method: speak

no message: colocas o template.
PS: Não tenho Alexa para testar…

Boa noite .
Desde já o meu muito obrigado pela tentativa de ajuda, mas dá erro:

Error running action

Error rendering data template: UndefinedError: None has no element 0

O script ficou assim:

service: notify.alexa_media
data_template:
data:
type: tts
target:
- media_player.alexa_da_sala
message: >
{% if states(‘sun.sun’) == ‘below_horizon’ %}
{% set cumprimento = ‘boa noite’ %}
{% elif (as_local(now()).strftime("%H")|int(default=0) <= 12) %}
{% set cumprimento = ‘bom dia’ %}
{% else %}
{% set cumprimento = ‘boa tarde’ %}
{% endif %}
{% set tempo = {
‘clear-night’: ‘limpo’,
‘cloudy’: [‘nublado’,‘com muitas nuvens’]|random,
‘fog’: [‘enevoado’,‘com muito nevoeiro’,‘de nevoeiro’]|random,
‘hail’: [‘com chuviscos’,‘de chuva fraca’]|random,
‘lightning’: [‘com relâmpagos’,‘de trovoada’]|random,
‘lightning-rainy’: [‘de tempestade’,‘com relâmpagos e trovoadas’]|random,
‘mostlycloudy’: [‘muito nublado’,‘com algumas nuvens’]|random,
‘partlycloudy’: [‘parcialmente nublado’,‘com nuvens dispersas’]|random,
‘pouring’: [‘muito chuvoso’,‘de chuva intensa’,‘com chuva intensa’]|random,
‘rainy’: [‘chuvoso’,‘de chuva’]|random,
‘snowy’: [‘com neve’,‘de neve’]|random,
‘snowy-rainy’: [‘chuvoso e com neve’,‘de chuva e neve’,‘com chuva e neve’]|random,
‘sunny’: [‘de sol’,‘ensolarado’,‘de sol maravilhoso’,‘lindo’,‘limpo’]|random,
‘windy’: [‘ventoso’,‘com muito vento’,‘com ventos fortes’,‘com muito vento’]|random,
‘windy-variant’: ‘muito ventoso’ } %}
{% set estado = states(‘weather.casa_da_soeira’) %}
{% set condicoes = tempo[estado] %}
Olá, {{ cumprimento }}. São agora {{as_local(now()).strftime("%H:%M")}}. {{[“Lá fora”,“No exterior”,“Na rua”]|random }} estão {{state_attr(‘weather.casa_da_soeira’,‘temperature’)|round(default=0)}} graus e vai estar um dia {{ tempo[state_attr(‘weather.casa_da_soeira’,‘forecast’)[0].condition] }}, com mínima de {{ state_attr(‘weather.casa_da_soeira’,‘forecast’)[0].templow|round(default=0) }} e máxima de {{ state_attr(‘weather.casa_da_soeira’,‘forecast’)[0].temperature|round(default=0)}} graus.

Afinal vi agora que não tinha alterado a entidade do tempo para a minha do ipma.
após mudar começou a dar este erro:

Error running action

Error rendering data template: UndefinedError: ‘dict object’ has no attribute ‘templow’

Tirei a linha da minima e já funciona. !!!
strange !!

Estás a usar a versão diária ou horária no IPMA? Isto só funciona para a integração em versão diária. A horária não tem previsão de temperatura mínima. Além disso a máxima vai-te dar valor errado, pois assim, na versão horária, estás a dar a temperatura da próxima hora, já deves ter reparado.

@FragMenthor boa tarde. Tinha uma automação com base nesta e estive uns tempos desligado do HA e percebi agora que já não há atributos forecast. Por acaso alteraste isto e podes dizer como o fizeste? Obrigado

Boas! Olha, ainda não fiz mas sei como fazer, mais ou menos. Assim que tiver um tempinho jogo-me a isso e posto aqui, combinado? Está na minha lista de “afazeres” :stuck_out_tongue_closed_eyes:

1 Curtiu

Olha, isto é o que tenho, agora já com o novo formato:

sequence:
  - action: weather.get_forecasts
    target:
      entity_id: weather.openweathermap
    data:
      type: daily
    response_variable: previsao
  - data:
      entity_id: media_player.coluna_da_cozinha
      message: |
        {%- set tempo = {
             'clear-night': 'limpo',
             'cloudy': ['nublado','com algumas nuvens']|random,
             'fog': ['enevoado','com muito nevoeiro','de nevoeiro','com nevoeiro']|random,
             'hail': ['com chuviscos','de chuva fraca','com chuva fraca']|random,
             'lightning': ['com relâmpagos','de trovoada']|random,
             'lightning-rainy': ['de tempestade','com relâmpagos e trovoadas']|random,
             'mostlycloudy': ['muito nublado','com muitas nuvens']|random,
             'partlycloudy': ['parcialmente nublado','com nuvens dispersas']|random,
             'pouring': ['muito chuvoso','de chuva intensa','com chuva intensa']|random,
             'rainy': ['chuvoso','de chuva']|random,
             'snowy': ['com neve','de neve']|random,
             'snowy-rainy': ['chuvoso e com neve','de chuva e neve','com chuva e neve']|random,
             'sunny': ['de sol','ensolarado','de sol maravilhoso','lindo','limpo']|random,
             'windy': ['ventoso','com muito vento','com ventos fortes','de muito vento']|random,
             'windy-variant': ['muito ventoso','de forte vendaval','com grande vendaval'] } -%}
         {%- if states('binary_sensor.presenca_pedro') == 'on' and states('binary_sensor.presenca_marta') == 'off' -%}
           {%- set pessoa = " Pedro, " -%}
         {%- elif states('binary_sensor.presenca_marta') == 'on' and states('binary_sensor.presenca_pedro') == 'off' -%}
           {%- set pessoa = " Marta, " -%}
         {%- elif states('binary_sensor.modo_dormir_pedro') == 'off' and states('binary_sensor.modo_dormir_marta') == 'on' -%}
           {%- set pessoa = " Pedro, " -%}
         {%- elif states('binary_sensor.modo_dormir_marta') == 'off' and states('binary_sensor.modo_dormir_pedro') == 'on' -%}
           {%- set pessoa = " Marta, " -%}
         {%- else -%}
           {%- set pessoa = ", " -%}
         {%- endif -%}
         {%- set estado = states('weather.casa_da_soeira') -%} {%- set condicoes =
         tempo[estado] -%} {%- set texto = '' -%} {%- set texto = texto + 'Olá' +
         pessoa + states('sensor.cumprimento_hora_dia') + '. São agora ' +
         as_local(now()).strftime("%H:%M") + '. ' -%} {%- set texto = texto +
         ["Lá fora","No exterior","Na rua"]|random + ' estão ' +
         state_attr('weather.casa_da_soeira','temperature')|round(default=0)|string +
         ' graus e vai estar um dia ' -%} {%- set texto = texto +
         tempo[previsao['weather.openweathermap'].forecast[0].condition] +
         ', com mínima de ' +
         previsao['weather.openweathermap'].forecast[0].templow|round(default=0)|string
         + ' e máxima de ' +
         previsao['weather.openweathermap'].forecast[0].temperature|round(default=0)|string
         + ' graus.' -%} {%- if states('binary_sensor.alarme_meteorologico_evora') ==
         'on' -%}
           {%- set texto = texto + 'ATENÇÃO: Há um ' + state_attr('binary_sensor.alarme_meteorologico_evora','headline') + ' e prevê-se ' + state_attr('binary_sensor.alarme_meteorologico_evora','description') + '.' -%} 
         {%- endif -%} {{-texto-}}
    action: tts.google_translate_say

Está um pouco complexo demais, toma em consideração mais umas coisas cá por casa, mas é assim a minha vida :smiley:
Se precisares de ajuda para adaptar, é dizer.


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade