[Article] Dialoguer avec votre maison via Telegram (et intégrations HA)

on pourais le voire sur une page telegram?

oui , c’est toujour intersent

voici un exemple sous NodeRed

il faut ajouter l’intégration « node-red-contrib-telegrambot » et redéfinir votre bot dans le node « send question » et « telegram receiver » et pensez aussi a ajouter l’ID de votre CAT dans la fonction message ici : chatId: ID_DE_VOTRE_BOT

image
image

il existe d’autres intégrations dans nodered qui peuvent faire la même chose, mais je ne les ai pas toutes testées car la gestion du bot sous nodered a changée l’année dernière avec la version de septembre ou octobre si mes souvenirs sont bons.

[{"id":"9b2f091593345232","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"333d147cf9d459d9","type":"function","z":"9b2f091593345232","name":"message","func":"context.global.keyboard = { pending : true };\n\nvar opts = {\n  reply_to_message_id: msg.payload.messageId,\n  reply_markup: JSON.stringify({\n    keyboard: [\n      ['Ouvrir la porte'],\n      ['Fermer la porte'],\n      ['Rien du tout']],\n      'resize_keyboard' : true, \n      'one_time_keyboard' : true\n  })\n};\n\nmsg.method = \"sendPoll\";\nmsg.payload = {\n  chatId: ID_DE_VOTRE_BOT,\n  sentMessageId: 111,\n  type: 'message',\n  content: 'bonjour, que voules-vous faire ?',\n  options: opts,\n};\nreturn msg;\n","outputs":"1","noerr":0,"initialize":"","finalize":"","libs":[],"x":340,"y":80,"wires":[["4eb8753ad8e20b4e"]]},{"id":"4eb8753ad8e20b4e","type":"telegram sender","z":"9b2f091593345232","name":"send question","bot":"480d50a30d8dc6f5","haserroroutput":false,"outputs":1,"x":720,"y":80,"wires":[[]]},{"id":"d9a578376b4d0b98","type":"telegram receiver","z":"9b2f091593345232","name":"","bot":"480d50a30d8dc6f5","saveDataDir":"","filterCommands":false,"x":190,"y":140,"wires":[["76b2768510965801"],[]]},{"id":"76b2768510965801","type":"switch","z":"9b2f091593345232","name":"","property":"payload.content","propertyType":"msg","rules":[{"t":"eq","v":"Ouvrir la porte","vt":"str"},{"t":"eq","v":"Fermer la porte","vt":"str"},{"t":"eq","v":"Rien du tout","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":390,"y":140,"wires":[[],[],[]]},{"id":"fd48c1d54bf4ebbb","type":"inject","z":"9b2f091593345232","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":80,"wires":[["333d147cf9d459d9"]]},{"id":"480d50a30d8dc6f5","type":"telegram bot","botname":"votre bot","usernames":"","chatids":"","baseapiurl":"","updatemode":"polling","pollinterval":"300","usesocks":false,"sockshost":"","socksprotocol":"socks5","socksport":"6667","socksusername":"anonymous","sockspassword":"","bothost":"","botpath":"","localbotport":"8443","publicbotport":"8443","privatekey":"","certificate":"","useselfsignedcertificate":false,"sslterminated":false,"verboselogging":false}]
1 « J'aime »

Bonjour,
Avec le code suivant : `- alias: Test bouton telegram
trigger: []
condition: []
action:
- service: notify.lilp_bot
data:
message: >-
Merci de fermer le volet…
data:
inline_keyboard:
- Ignore:/piscine_ignore_ferme, Ferme volet:/piscine_ferme

  • alias: ‹ Piscine : fermeture par telegram ›
    description: Traite la réponse de demande de fermeture du volet par telegram
    trigger:
    • platform: event
      event_type: telegram_callback
      event_data:
      command: /piscine_ferme
      action:
    • service: telegram_bot.edit_replymarkup
      data:
      message_id: last
      chat_id: ‹ {{ trigger.event.data.chat_id }} ›
      inline_keyboard: null
    • service: notify.lilp_bot
      data:
      message: Volet piscine fermé.
      initial_state: true
      mode: single`

J’ai les boutons qui s’affiche, mais aucun retour suite à la validation du bouton « piscine_ferme ».
Cela fait 3j que je bloque dessus.
Une idée du soucis ?

Le « action: » dans le trigger est en trop, mais pas sûr que ce soit cela. le reste semble bon.
Tu redémarres bien HA après modif. j’imagine (?)

Appuie sur le bouton dans Telegram, puis regarde dans les traces de l’automatisation.
Tu verra si :

  • L’automatisation a été lancée ou pas
  • Si une éventuelle condition a été à vrai ou fausse
  • Si l’action a été lancée.

Vérifie aussi bien tes logs, car il peut y avoir une erreur.

Quelle action est de trop, celui du « Test bouton telegram » ou du « piscine :fermeture par telegram » ?
En l’état, voici les traces des automations :
Pour la 1er :

Triggered manually at 29 septembre 2023 à 10:33:48
Appeler le service « Notifications: Send a notification with lilp_bot » sur
Finished at 29 septembre 2023 à 10:33:48 (runtime: 0.04 seconds)

Pas de traces pour la 2eme sauf en lancement manuelle ou j’ai :

Triggered manually at 29 septembre 2023 à 10:50:40

Appeler le service « Telegram bot: Edit reply markup » sur

Stopped because an error was encountered at 29 septembre 2023 à 10:50:40 (runtime: 0.31 seconds)

Error rendering data template: UndefinedError: ‹ dict object › has no attribute ‹ event ›

Le « Action » en gras ci-dessous est en trop :

  • platform: event
    event_type: telegram_callback
    event_data:
    command: /piscine_ferme
    action:

Tu devrais avoir une trace, ce qui veux dire que le callback n’est effectivement pas fait. A voir ce qui se passera si tu enlèves « Action »…

Il est normal d’avoir une erreur si tu lance à la main, car il n’y a pas de contexte de réponse à Telegram.

Pour débugger les événements, tu dois utiliser la gestion d’événements dans l’outils de développement. Cela reste un bon exercice :blush:

Pour simuler et déclencher un callback à la main, saisi cela et clique sur « déclencher l’événement » :

Pour lancer l’écoute d’un événement, saisi le nom de l’événement et clique sur « écouter » :
image

Ensuite clique sur le bouton dans Telegram pour voir ce qui est reçu.
Tiens moi au courant…

Quand je supprime la zone action comme précisé, mon automation passe avec le message d’erreur :

L’automatisation n’est pas disponible
Déclencheurs: required key not provided @ data[1][‹ platform ›]


Résultat du déclencheur d’évènement :

Autant pour moi, « action » est pour le code qui suit et il faut le laisser. Sur le forum, prends l’habitude de mettre ton code dans « texte préformatté » ce qui permet de mieux lire le YAML avec les décalages, qui sont importants.

Si tu lances l’événement à la main dans l’outil de développement, tu as bien une trace dans l’automatisation ? Elle est bien appelée ?
Si tu écoutes l’événement et cliques sur le bouton dans telegram, tu reçois aussi le bon événement dans l’outil de développement ?

Un des 2 doit mal se passer…

La trace timeline de l’évènement :

Triggered by the event 'telegram_callback' at 29 septembre 2023 à 14:28:43
Appeler le service "Telegram bot: Edit reply markup" sur
Stopped because an error was encountered at 29 septembre 2023 à 14:28:44 (runtime: 0.05 seconds)

expected int for dictionary value @ data['chat_id']

Si je comprend bien, il n’arrive pas à récupérer le chat ID et donc à envoyer le message au bot.

Bonjour, j’ai une petit problème sur les notifications,

Je reçois les bonnes images en notifications , parcontre je ne vois pas les messages qui sont dans l’ automation comme on peut voir.

Es normal?

J’ai corrigé en précisant en dure (via secret.yaml) le chat id, et lancer le test à la main.
J’ai le message de retour.


Mais je n’ai rien lorsque je click manuellement sur le bouton.

Oui.
Essaie de mettre le message derrière le mot clé caption :

      - service: notify.telegram_maison
        data:
          message: Mouvement devant
          data:
            photo:
              - file: /media/local/image.jpg
                caption: "Mouvement devant"
1 « J'aime »

Bon tu avances, l’erreur doit être sur le passage du chat_id.

Essaie de mettre des double quote, et remplacer
chat_id: ‹ {{ trigger.event.data.chat_id }} ›
par
chat_id: "{{ trigger.event.data.chat_id }}"

Et pour envoyer une vidéo?

J’ai le même retour avec les doubles quotes.

Triggered by the event ‹ telegram_callback › at 29 septembre 2023 à 20:20:15
Appeler le service « Telegram bot: Edit reply markup » sur
Stopped because an error was encountered at 29 septembre 2023 à 20:20:15 (runtime: 0.03 seconds)
expected int for dictionary value @ data[‹ chat_id ›]

Avec le chat id en dur via le fichier secret.yaml, j’ai :


Je me demande si c’est pas à cause du paramètre « message_id: last ».
Il n’arrive peut-être pas à trouver le message en question.

Bonjour à tous,
donc le problème est que le champ « message » et « title » n’apparaissent ni dans la notif ni dans la conversation mais uniquement dans le cas où je joins un fichier.

Sinon pas de soucis.

Le seul moyen d’avoir un texte dans la notif et dans la conversation est d’utiliser le champ « caption ».

Je rédige comme ca :

service: notify.ha
data:
  message: Personne détectée
  title: Détection
  data:
    photo:
      - file: /media/detections/captures/entree_detection.jpg
        caption: >-
          Porte entrée : test 

Dans cet exemple je verrai « Porte entrée : test » dans la notif et la conversation mais rien de plus.

Autre bizzarerie mais qui fonctionne est que le chemin du fichier sous le format « /media/local/xxx » qui fonctionne pour une notif classique, ne doit pas comporter « /local » pour une notif Telegram…

Pour les vidéos c’est bon ca passe.

Merci à @titof2375 d’avoir anticipé les demandes pour mes problèmes.

1 « J'aime »

Non je n’y crois pas, j’utilise bien message_id: last et ça fonctionne.

Autrement, une précision : le bouton ne fonctionne que pour le dernier message telegram reçu. Tu es bien dans ce cas ?

C’est ma première automatisation avec interaction.
Le bouton n’est utilisé que dans cette automation.
J’ai modifié la variable message_id en précisant :

message_id: ‹ {{ trigger.event.data.message.message_id }} ›

Lors du lancement j’ai bien le retour du callback.
Il me restera à tester avec l’autre commande. Et un déclenchement de l’automation par une commande aussi du style /start.

Oui mettre le message_id reçu dans le trigger est tout à fait logique et cela fonctionne.
Je vais encore tester et modifierai l’article en conséquence si confirmé.
Merci pour ton retour. Tout marche bien maintenant ?