Automação para enviar imagem via Telegram

E quando quero enviar imagem da minha câmera pelo telegram?

Antes de mais nada, você precisa definir onde serão salvas as imagens. Isso é necessário pois desde o Home Assistant na versão 0.48, é necessário colocar na lista de permissões a pasta (whitelist) de origem do arquivo que você deseja incluir na notificação.

Então se você colocar as imagens dentro da pasta www, você deve incluir a seguinte configuração dentro do arquivo configuration.yaml.

homeassistant:
  whitelist_external_dirs:
    - /tmp
    - /config/www

Após isso, é necessário reiniciar o seu HA.

Automação para enviar imagem

- alias: 'Envia imagem quando acender a luz e não estiver ninguém em casa'
  initial_state: true
  trigger:
    - platform: state
      entity_id: light.luz_cozinha
      to: 'on'
  condition:
    - condition: state
      entity_id: device_tracker.douglas
      state: 'not_home'
    - condition: state
      entity_id: device_tracker.luana
      state: 'not_home'              
  action:
    - service: camera.snapshot
      data:
         entity_id: camera.cozinha
         #vai salvar o nome da foto com data e hora da ação
         filename: '/config/www/images/cameras/camera_cozinha_{{ now().strftime("%Y%m%d-%H%M%S") }}.jpg'
    - service: notify.telegramgrupo
      data_template:
        message: "Nova foto da cozinha."
        data:
          photo:
            file: '/config/www/images/cameras/camera_cozinha_{{ now().strftime("%Y%m%d-%H%M%S") }}.jpg'
            caption: "Foto da cozinha."

Eu poderia além de enviar uma foto, mandar meu media player (google home, echo dot da amazon, chromecast) enviar uma notificação que está sendo monitorado.

- alias: 'Enviar imagem e notificar possível ladrão'
  initial_state: true
  trigger:
    - platform: state
      entity_id: light.luz_cozinha
      to: 'on'
  condition:
    - condition: state
      entity_id: device_tracker.douglas
      state: 'not_home'
    - condition: state
      entity_id: device_tracker.luana
      state: 'not_home'              
  action:
    - service: camera.snapshot
      data:
         entity_id: camera.cozinha
         #vai salvar o nome da foto com data e hora da ação
         filename: '/config/www/images/cameras/camera_cozinha_{{ now().strftime("%Y%m%d-%H%M") }}.jpg'
    - service: notify.telegramgrupo
      data_template:
        message: "Nova foto da cozinha."
        data:
          photo:
            file: '/config/www/images/cameras/camera_cozinha_{{ now().strftime("%Y%m%d-%H%M") }}.jpg'
            caption: "Foto da cozinha."
    - service: tts.google_translate_say
        entity_id: media_player.google_home #pode ser qualquer media player configurado
        data_template:
          message: >
             Ladrão, eu sei que você está na cozinha, e sua imagem já foi enviado para a polícia.   

E se eu quiser receber mais duas imagens após 10 e 20 segundos? Usamos a ação delay.

- alias: 'Enviar 3 imagens e notificar possível ladrão'
  initial_state: true
  trigger:
    - platform: state
      entity_id: light.luz_cozinha
      to: 'on'
  condition:
    - condition: state
      entity_id: device_tracker.douglas
      state: 'not_home'
    - condition: state
      entity_id: device_tracker.luana
      state: 'not_home'              
  action:
    #foto 1
    - service: camera.snapshot
      data:
        entity_id: camera.cozinha
        filename: '/config/www/images/cameras/camera_cozinha_{{ now().strftime("%Y%m%d-%H%M") }}.jpg'
    - service: notify.telegramgrupo
      data_template:
        message: "Nova foto da cozinha."
        data:
          photo:
            file: '/config/www/images/cameras/camera_cozinha_{{ now().strftime("%Y%m%d-%H%M") }}.jpg'
            caption: "Foto da cozinha."
    #avisa ladrão
    - service: tts.google_translate_say
      entity_id: media_player.google_home #pode ser qualquer media player configurado
      data_template:
        message: Ladrão, eu sei que você está na cozinha, e sua imagem já foi enviado para a polícia.
    #foto 2
    - delay:
        seconds: 10
    - service: camera.snapshot
      data:
        entity_id: camera.cozinha
        filename: '/config/www/images/cameras/camera_cozinha_{{ now().strftime("%Y%m%d-%H%M") }}.jpg'
    - service: notify.telegramgrupo
      data_template:
        message: "Nova foto da cozinha 2"
        data:
          photo:
            file: '/config/www/images/cameras/camera_cozinha_{{ now().strftime("%Y%m%d-%H%M") }}.jpg'
            caption: "Foto da cozinha 2"
    #foto 3
    - delay:
        seconds: 10
    - service: camera.snapshot
      data:
        entity_id: camera.cozinha
        filename: '/config/www/images/cameras/camera_cozinha_{{ now().strftime("%Y%m%d-%H%M") }}.jpg'
    - service: notify.telegramgrupo
      data_template:
        message: "Nova foto da cozinha 3"
        data:
          photo:
            file: '/config/www/images/cameras/camera_cozinha_{{ now().strftime("%Y%m%d-%H%M") }}.jpg'
            caption: "Foto da cozinha 3"

Para os exemplos acima, eu coloquei permissão nas seguintes pastas:

homeassistant:
  whitelist_external_dirs:
    - /tmp
    - /config/www
    - /config/www/images
    - /config/www/images/cameras
3 Likes

Quando é criado o arquivo “foto” é gravado na pasta “www”
filename: ‘/config/www/camera_cozinha_{{ now().strftime("%Y%m%d-%H%M%S") }}.jpg’

e nessa linha que seria pego a “foto” ele está procurando na pasta images/cameras
file: “/config/www/images/cameras/camera_cozinha_{{ now().strftime(”%Y%m%d-%H%M%S") }}.jpg"

No meu é esta dando esse erro ao tentar verificar a configuração:
found character ‘%’ that cannot start any token
in “/config/configuration/automations.yaml”, line 84, column 66

Pode testar agora?

Percebi que no serviço que envia a foto pelo telegram, estava começando com aspas duplas (") e para pegar a data e hora, utilizei também aspas duplas e isso gerou o problema. Eu corrigi colocando aspas simples (’). Até poderia começar com aspas duplas, mas dentro da função now() eu teria que utilizar simples ao invés de dupla.

Outro ajuste que fiz, foi gravar com a data e hora sem os segundos (removi essa parte %S), pois as vezes tem um delay entre gravar e enviar, e pode tentar enviar uma imagem que não foi gravada.

2 Likes

Funcionou em partes… mas ainda estou verificando as condições que coloquei, pois o arquivos (fotos) foram gerados sem problemas na pasta que eu configurei… Mas ainda não recebi via Telegram. Notei que coloquei uma condição quando eu não estiver em casa e estou em casa talvez seja isso… rsrs

uma outra duvida: Quando colocamos permissão na pasta “/config/www” as subpastas que estão dentro desta não recebe as permissões da pasta base ?

Então, é exatamente essa condição hehe. Você pode colocar a condição quando estiver em casa e testar. O bom da automação que todas os ajustes você não precisa reiniciar seu HA. Nesse caso você não deve receber nenhuma mensagem no seu Telegram. Agora se você recebe a mensagem, mas não envia a foto, então é o caminho da imagem que está incorreto na ação que envia a foto.

Apenas acessando o seguinte menu e clicar em recarregar já atualiza as modificações realizadas nas automações.

Configurações -> Controle do servidor -> Recarregar as automações

Quanto a outra questão, eu sempre coloco as subpastas, nos testes com uma versão bem mais antiga do HA não funcionava para as sub-pastas, não lembro de nenhuma atualização que tenha mudado isso, mas vale fazer o teste para garantir. E colocar as subpastas para permitir também não é grande trabalho.

Douglas, eu acabei não testando em casa, mesmo alterando o local para “home” como orientou. Já que hoje eu estaria no trabalho com uma disponibilidade para observar o funcionamento. Disparei o gatilho da automação, ela esta criando as imagens no local definidos mas não estou recebendo via Telegram. Olhei mais de uma vez o caminho de onde esta sendo gerado as imagens, mas não localizei onde pode esta o erro.

Marcelo, se está salvando a imagem, o mais difícil já foi resolvido. A minha dúvida é, está enviando a mensagem?

Se está enviando a mensagem sem a foto, o serviço de envio está funcionando. Então o problema é no caminho da imagem. Você removeu o segundos tanto para salvar quanto para enviar? Pois como falei, pode salvar com X segundos e como tem um delay até enviar pode estar tendanto enviar com Y segundos.

Outra dica é sempre verificar os logs, o pessoal precisa ter mais essa pratica de verificar os logs, lá sem dúvida ajuda muito a entender o problema.

Caso tenha feito tudo isso, eu preciso que você poste o código para avaliar o problema. E lembrando de ao colocar o código no fórum formatar para fiocar mais legível com o botão </> image

Opa Douglas, eu não removi os segundos… (acabei esquecendo disso)… Não recebo a mensagem também, mesmo sem o arquivo. Sobre o LOG você está certo, preciso aprender a olhar… vou fazer agora…


log:

Log Details (WARNING)

Tue Oct 08 2019 14:05:15 GMT-0300 (Horário Padrão de Brasília)

Retrying (Retry(total=2, connect=None, read=None, redirect=None)) after connection broken by ‘ConnectTimeoutError(<telegram.vendor.ptb_urllib3.urllib3.connectionpool.HTTPSConnectionPool object at 0x71a2e950>, ‘Connect timed out. (connect timeout=5.0)’)’: /bot815184654:AAHPPcZPGJ4SDm6Pj2rsJtUufTvQyqSnNac/getUpdates

Meu código esta assim!

- alias: camera da frente
  initial_state: true
  trigger: 
    - platform: state
      entity_id: switch.luz_garagem           
      to: 'on'
  condition:
    - condition: state
      entity_id: device_tracker.life360_marcelo 
      state: 'not-home'
  action:
    - service: camera.snapshot 
      data:
        entity_id: camera.frente1
        filename: '/config/www/imgs/cameras/camera.frente1_{{ now().strftime("%Y%m%d-%H%M") }}.jpg'
    - service: notify.aviso_telegram
      data_template:
        message: "Nova foto frente de casa"
        data:
          photo:
            file: '/config/www/imgs/cameras/camera.frente1_{{ now().strftime("%Y%m%d-%H%M") }}.jpg'
            caption: "Foto da frente."

segue o log… infelizmente não consegui entender…

Error sending file: urllib3 HTTPError (‘Connection aborted.’, timeout(‘The write operation timed out’)). Args: (822662086, <_io.BufferedReader name=’/config/www/imgs/cameras/camera.frente1_20191008-1449.jpg’>), kwargs: {‘caption’: ‘Foto da frente.’, ‘parse_mode’: ‘Markdown’, ‘disable_notification’: False, ‘disable_web_page_preview’: None, ‘reply_to_message_id’: None, ‘reply_markup’: None, ‘timeout’: None}

Conexão perdida. Reconectando…

… Pesquisando encontrei algumas possibilidades… Uma dela falar sobre aumentar o tempo limite… mas nao sei onde fica… ainda!

Marcelo, formatei seu código para ficar melhor. Sempre selecione o código com o mouse, e pressione o botão </> para formatar.

Fiz o teste com seu código e funcionou. Estranho, já tentou enviar para outro telegram? (contato, grupo…). O tamanho da imagem que está salvando é muito grande? Já tentou colocar o nome/caminho mais curto como /config/www/imgs/cameras/cam-frente.jpg ou um outro formato como “.cgi” ao invés de “.jpg”.?

Vi que você também postou no CPHA, vamos ver se o pessoal lá também tem alguma solução.

Bom dia Douglas, primeiramente obrigado pelo retorno e pela tentativa de ajudar.

Sobre o problema, o tamanho das imagens acredito não esta grande, por volta de 120Kbytes
não fiz ainda teste para outro Telegram, mas gostei da dica. Vou criar uma para minha esposa e tentar enviar para o dela. Farei também alteração no caminho onde esta salvando e a extensão para .cgi.
Manterei informado assim que concluir os testes.

Fiz os testes conforme me orientou. Reduzi o caminho onde está ficando as imagens. Funcionou… veja a tela capturado do Telegram

2 Likes