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.
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” .
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."
A coisa tá já está muito diferente deste lado passado 1 ano . 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!
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”
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
Se precisares de ajuda para adaptar, é dizer.