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.
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 ).
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é "