Les Carnets de Byfeel domotique , Objets connectés , DIY , Programmation, Nouvelles Technologies ….

Telegram vers NotifHeure

Ou comment afficher une notification sur le notifHeureXL depuis Telegram via Home Assistant.

Cet article, pour expliquer comment interagir entre Telegram et le NotifHeure. Le concept peut être appliqué à d’autres services ( SMS, email, etc . ) les sujets abordés seront les suivants :

  • Envoyer une notification sur le notifheureXL
  • Installation de Telegram sous Home Assistant
  • Les intéractions Telegram pour executer des commandes

Rappel comment envoyer une notification sur NotifHeure

Dans mon précédent article sur le notifheureXL et home assistant , j’indiquais comment envoyer une notification via un script MQTT. ( https://byfeel.info/notifheurexl-avec-home-assistant/ )

Pour la suite de cet article, je pars du principe que j’utilise ce script, si vous utilisez un autre script pour afficher les notifications, remplacer le mien par le vôtre.

# script envoie notif selon emplacement
script:
  notify_notifheure:
    sequence:
    - service: mqtt.publish
      data_template:
        payload: '{"msg":"{{ message }}","opt":"{{ options }}"}'
        qos: 1
        retain: false
        topic: >
          {% if target == "bureau" %} 
          byfeel/NotifheureXL/46aaa1/bureau/message 
          {% elif target == "salon" %} 
          byfeel/NotifheureXL/22bbb40/salon/message 
          {% else %} 
          byfeel/NotifheureXL/46aaa1/bureau/message 
          {% endif %}

Ce script est appelé de cette façon :

    - service: script.notify_notifheure
      data:
          message: "notification a envoyer"
          target: "salon"

Si besoin de modifier des options, le paramètre options peut être ajouté.

Installation de Telegram sous Home assistant

La documentation Home assistant explique comment installer Telegram, vous la trouverez ici.
Les prérequis sont la création d’un BOT Telegram.

Pour cela il faut voir auprès de botfather . Rendez vous sur la page https://telegram.me/BotFather ou simplement ajouter @botfather à son telegram.

En envoyant help , botfather affiche une liste de commande permettant de créer et modifier nos propres bot.

Création du bot pour mon Home assistant

Avec la commande /newbot je créé un nouveau bot , il suffit de répondre aux questions

/newbot
Alright, a new bot. How are we going to call it? Please choose a name for your bot.
Home Assistant   ( indiquez le nom que vous voulez )
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.
homeAssistantBOT     ( ce nom doit etre unique , si il a déjà utilisé vous aurez un message d'erreur , vous invitant a donner un autre nom )
Sorry, this username is already taken. Please try something different.
mon_bot_a_moi_qui_marche_avec_HA_bot   
Done! Congratulations on your new bot. You will find it at t.me/mon_bot_a_moi_qui_marche_avec_HA_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.
Use this token to access the HTTP API:
11222235:ABCDER1JGyZZXXZEJ77PZZgX_abcde-efghijklmn22
Keep your token secure and store it safely, it can be used by anyone to control your bot.

Je copie mon code TOKEN , et je le mets de coté.

Webhook polling , broadcast ?

Telegram, peut-être installé de trois façons sous home Assistant . Via la plateforme Polling WebHook ou broadcast . Si l’intégration de Telegram au sein de HA est utilisée uniquement pour notifier, le mode broadcast suffit.

Avantage et inconvénient de chaque mode :

  • Broadcast : Uniquement pour envoyer des notifications Telegram
  • Polling : Dans ce mode , seul Home Assistant interroge Telegram , vous n’avez pas besoin de configurer un accès extérieur à votre Home Assistant. Il est possible d’envoyer et de recevoir des notifications telegram . C’est Home Assistant qui interroge régulièrement Telegram. Avantage : facile à configurer et à mettre en place , Inconvénient Augmente l’activité de HA , en interrogeant régulièrement Telegram pour relever les notifications en attente.
  • Webhook : Le mode webhook est celui conseillé par HA , permet d’envoyer des notifications et de recevoir des messages envoyés depuis telegram. Avantage: Prend moins de ressources, car il n’y a pas d’interrogation régulière de l’application Telegram , c’est Télegram qui prend contact avec HA. Inconvénient , plus difficile à mettre en place , nécessite que Home assistant soit accessible depuis l’extérieur.

Dans le cas qui nous intéresse , avec interaction , ça sera le mode Polling ou webhook. HA conseille le mode webhook si possible.

Configuration avec Webhook

au niveau du fichier configuration.yaml , renseigner les informations suivantes

telegram_bot:
  - platform: webhooks
    api_key: 11222235:ABCDER1JGyZZXXZEJ77PZZgX_abcde-efghijklmn22
    url: https://maison.fr:8123
    allowed_chat_ids:
      - 12345678 # byfeel
     # - 12366556 # group parents
    trusted_networks:
      - 192.168.4.100   # si besoin en fonction de votre réseau
  • platform: webhooks ( choix possible – polling ou broadcast )
  • api_key: Votre numéro TOKEN Telegram
  • url: A renseigner si besoin , si non renseigner prend l’url réglé dans configuration générale
  • allowed_chat_id: indiquer ici , les personnes autorisés à communiquer avec votre bot

Pour récupérer son Id , il suffit de chercher le bot getIdsbot :

et de taper la commande /start

Hello, phil! I am a computer program that can chat (also known as a 'bot') and I can tell you something about you and the messages you send me.
Try it out, just forward me some messages ;)
Note from the developers:
This is a very early version of the bot. Therefore a few things (explainatory texts, etc.) are still missing. If you can code, here is the GitHub repo. If you don't know how to program, you can still help. Just tell us @wjclub.
 You
 ├ id: 12345678
 ├ is_bot: false
 ├ first_name: phil
 └ last_name: Byfeel

trusted_network: A renseigné en fonction de votre réseau, mon installation étant hébergée sur mon serveur NAS via docker, j’ai indiqué l’adresse IP de mon NAS. Si problème de communication vérifier les logs de HA, qui indique quels sont les IP non autorisés.

Enregistrer le fichier est redémarré Home assistant. Au redémarrage HA , devrait enregistrer automatiquement l’url webhook dans votre bot telegram.

Astuce : Vérification de l’enregistrement ou programmation du webhook , en cas d’erreur.
Pour cela il faut utiliser l’API de telegram. Renseigner la commande suivante depuis votre navigateur.

https://api.telegram.org/bot<VOTRE-BOT-TOKEN>/setWebhook?url=<Votre_URL-WEBHOOK>

URL webhook est construit sous la forme : https://<external_url>/api/telegram_webhooks
Ce qui donne si token = 11222235:ABCDER1JGyZZXXZEJ77PZZgX_abcde-efghijklmn22 et l’url externe de HA = http://maison.fr:8123 , il faudra envoyer :

https://api.telegram.org/bot11222235:ABCDER1JGyZZXXZEJ77PZZgX_abcde-efghijklmn22/setWebhook?url=http://maison.fr:8123/api/telegram_webhooks

Si tout se passe bien , vous obtenez un fichier json identique a celui ci ( result =true ):

{"ok":true,"result":true,"description":"Webhook is already set"}

Test notification telegram

pour tester l’envoie des notifications telegram depuis Home assistant , il faut utiliser le service telegram_bot.send_message , avec outils de développement.

Envoie d’un message vers telegram

Pour le test de réception de message depuis telegram, il suffit de tester avec les événements. Il y a trois types d’événement :

  • telegram_text: événement qui est déclenché quand un simple message est envoyé depuis telegram
  • telegram_command: événement qui est déclenché, quand une commande est envoyé. Les commandes sous telegram , sont sous la forme /command.
  • telegram_callback: événement qui est déclenché suite à une question posé par le Bot.

Pour le test de réception , je vais utiliser l’événement telegram_text. Pour cela il suffit de se rendre dans les outils de développement , onglet événements et renseigner l’information telegram_text dans écouter les événements ( en bas de page ).

Exemple événement text telegram

Envoyer un texte depuis telegram , si tout se passe bien , l’événement doit remonter dans home assistant.

Telegram vers NotifheureXL

Maintenant que tous les prérequis fonctionnent, je passe à l’écriture des scripts. Afin d’écouter uniquement les événements command, je choisis de passer par la création de la commande /notif, afin de déclencher le scénario de traitement des envois de notification.

### automation
automation:
  - alias: 'Telegram bot reponse a Notif'
    trigger:
      event_type: telegram_command
      platform: event
      event_data:
        command: '/notif'
    action:
      - service: telegram_bot.send_message
        data:
            title: '*Choix du NotifHeure*'
            target: '{{ trigger.event.data.user_id }}'
            message: '{% for state in trigger.event.data["args"] %} {{ state }} {% endfor %}'
            disable_notification: true
            inline_keyboard:
              - "Bureau:/bureau, Salon:/salon"
              - "Matt:/matt"

Dans ce script , la partie trigger , se déclenche sur l’évenement « telegram_command » , lorsque la commande /notif est envoyé.
En réponse , je renvoie un message via le service : telegram_bot.send_message en affichant un questionnaire pour choisir sur quel notifheure envoyé le message.

Le message est constitué des arguments qui suivent la commande /notif.

Exemple : /notif ceci est un message en provenance de telegram

Dans telegram , tous les éléments texte qui suivent une commandes sont considérés comme des arguments . Avec le template ‘{% for state in trigger.event.data[« args »] %} {{ state }} {% endfor %}’ , je reconstruis le message.

ce qui donne :

En fonction du choix du notifheure , le message sera transmis pour affichage sur ce dernier , via le script suivant.

 ### dans automation

 - alias: 'Telegram bot send to notifheureXL'
    trigger:
      - event_type: telegram_callback
        platform: event
        event_data:
          command: '/bureau'
      - event_type: telegram_callback
        platform: event
        event_data:
          command: '/salon'
      - event_type: telegram_callback
        platform: event
        event_data:
           command: '/matt'
    action:
    - service: script.notify_notifheure
      data:
          message: "{{ trigger.event.data.message.text[20:] }}"
          target: "{{ trigger.event.data.command[1:] }}"
    - service: telegram_bot.answer_callback_query
      data:
        callback_query_id: '{{ trigger.event.data.id }}'
        message: "ok notification envoyé sur {{ trigger.event.data.command[1:] }} "

La partie trigger , déclenche en fonction des trois commandes portant le même nom que mes notifheures.

Puis deux actions dans la partie « action » , la première appelle le script script.notify_notifheure , et transmet les deux data , message qui contient le message à afficher et target , sur quel notifheure .

message: « {{ trigger.event.data.message.text[20:] }} » , je coupe la chaine sur les 20 premiers caractères avec [20:] , car la chaine text renvoie aussi le titre ( choix du notifheure ).

Idem pour target , je supprime « / » avec la découpe [1:] sur la clé command.

la seconde action envoie un message de confirmation à telegram , afin de signaler que le message à bien été transmis au notifheure concerné.

Un pour tous …

Il est possible de notifier , l’ensemble des notifheures , avec un seul message pour cela , il suffit d’écrire un script pour publier sur tous les notifheure.

### Script notification tous les notifheure
script:
  notify_notifheure_all:
      alias: Notification vers tous les Notifheures
      sequence:
      - service: script.notify_notifheure
        data:
          message: '{{ message }}'
          target: salon
          options: '{{ option }}'
      - service: script.notify_notifheure
        data:
          message: '{{ message }}'
          target: bureau
          options: '{{ option }}'
      - service: script.notify_notifheure
        data:
          message: '{{ message }}'
          target: matt
          options: '{{ option }}'
      mode: single

Dans ce script le même message et les mêmes options sont envoyés sur les 3 notifheures de la maison.

Il suffit d’ajouter dans le script telegram une commande /tous ,

.......  
inline_keyboard:
              - "Bureau:/bureau, Salon:/salon"
              - "Matt:/matt"
              - "Tous les notifheures:/tous"
....

et de créer une automatisation pour cette commande.

 - alias: 'Telegram bot send to all notifheureXL'
    trigger:
      - event_type: telegram_callback
        platform: event
        event_data:
          command: '/tous'
    action:
    - service: script.notify_notifheure_all
      data:
          message: "{{ trigger.event.data.message.text[20:] }}"
    - service: telegram_bot.answer_callback_query
      data:
        callback_query_id: '{{ trigger.event.data.id }}'
        message: "ok notification globale envoyé "