Node Red Telegram envoi de la bonne photo

Bonsoir,

J’ai un petit souci de synchro pour envoyer les bonnes photos avec Node Red vers Telegram.
Pas de souci pour envoyer texte et photos déjà disponible dans mon dossier d’enregistrement.

Flow Node Red mini de test :

Dans la fonction :

function getRandomInt(max) {
    return Math.floor(Math.random() * Math.floor(max));
}

var numberal = getRandomInt(100000);

msg.payload = Number(numberal);
global.set('numblc', msg.payload);
return msg;

La photo est bien prise avec le nom attendu :

{"filename":"/config/tmp/test_{{ entity_id.name }}_"&payload&".jpg"}

Dans le nœud « Send photo Ext » je voudrai faire référence à la variable globale ‹ numblc › mais je ne trouve pas la bonne syntaxe.

{
    "photo": "/config/tmp/test_CameraSalon_{{ici la globale numblc}}.jpg",
    "caption": "Photo extérieur"
}

Merci à vous et bon we.
Bob

Dans quel noeud est fabriqué le payload? Le noeud telegram que je connais attend le msg.payload en entrée. C’est bien le cas ici?

Pour récupérer des variables flow ou globale, j’utilise jsonata. Avec

$globalContext(« numblc »)

Tu récupères la valeur.

Bonjour @golfvert
En sortie du « delay 5s » je récupère bien mon nombre aléatoire.
Le nœud « Send photo Ext » est un noeud Telegram « payload ».
image

Pour le jsonata j’ajoute ceci à ma palette alors ?
image

Merci

Non, rien de plus à rajouter. Le jsonata c’est natif dans la plupart des noeuds nodered.

Par exemple, le debug. Il faut choisir l’espèce de S:

Je ne sais pas si le noeud payload de cette palette telegram le fait ou pas. Sinon, il faut le faire avec un change node avant et passer le msg.payload en entrée du noeud telegram.

Et ensuite on formate le jsonata.

Merci @golfvert,

Le nœud payload de Telegram attend du json, là j’ai mis une référence à une photo disponible :
image

J’ai fait un test comme ceci pour générer le json dans le payload :
image

Le nœud « change 4 rules » remplace une chaine de caractère par mon nombre aléatoire.

La fonction 4 génère un paylod :

var monnum = global.get('numblc');
msg.payload = {
    "caption": "Photo" +monnum +"!",
    "photo": "/config/tmp/test_CameraSalon_" + monnum+".jpg"
};
return msg;

En sortie debug 53 j’ai bien le json que j’attends :
image

Mais je ne vois pas quoi mettre dans le nœud payload telegram pour remplacer :

{
    "photo": "/config/tmp/test_CameraSalon_9281.jpg",
    "caption": "Photo Mezzanine blc"
}

Par mon payload json généré :

{
    "caption": "Photo15056!",
    "photo": "/config/tmp/test_CameraSalon_15056.jpg"
}

Alors là, il faut savoir si le noeud « Message » accepte le payload comme entrée ou s’il ne sait faire qu’avec du payload statique (ce qui serait assez beta…). Le screenshot du noeud n’est de ce point de vue pas trop engageant.
C’est quelle palette telegram? Il y en a une palanquée…
Faut regarder la doc de ce noeud, voir son niveau de configuration.

Merci :wink:
Pour la question sur la palette je pensais qu’il n’y en avait qu’une :hugs:
Voici ce que je vois :
image

Si je ne défini pas de json dans « message », il ne prend pas le payload d’entrée.
Je n’ai pas choisi la meilleure « Palette » peut être mais je sens que ça va très vite fonctionner.
Je regarde la doc, ce que l’on devrait faire toujours :wink:
Merci

Bob

Le noeud sender (que l’on voit à gauche et qui vient de telegrambot sans le -home) sait prendre le msg.payload en entrée.
Il ne prend même que ça. Ce qui dans la logique NodeRed est plus propre que le truc en dur de celui que tu as.

Je reprends avec un nœud « sender » mais qui indique ne pas être initialisé:

msg : string[20]
"bot not initialized."

Après avoir ajouté le token dans configuration des nodes OK.

ça fonctionne nickel:

Je construis le payload dans la « fonction 4 » :

let monnum = global.get('numblc');
let d = new Date();
let hours = d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds();

msg.payload = {
    "type": "photo",
    "chatId": "5000000986",
    "caption": "Photo à " + hours + " N° " +monnum,
    "content": "/config/tmp/test_CameraSalon_" + monnum +".jpg"
};
return msg;

Merci @golfvert
je vais pouvoir intégrer ça à mon flow de surveillance.

Pour le fun, remplacer le noeud fonction par un noeud change en écrivant le payload en jsonata.
La « logique » de nodered, c’est d’essayer d’éviter les fonctions le plus possible et de faire avec la palette d’outils. En plus, un noeud fonction est un peu moins efficace qu’un noeud change.
Bon, vu l’usage, on s’en moque, on n’est pas à une picoseconde.
C’est donc, juste pour le plaisir :slight_smile:

OK, je vais essayer ça aussi :wink:
Je savoure déjà cette solution fonctionnelle :grin::hugs:, merci encore :+1:

Tout fonctionne mais j’ai des erreurs Node Red, je pense que je ne peux pas utiliser le même bot pour le nœud Sender et le nœud action, ça m’embêterai un peu d’ajouter un bot juste pour les actions !

Suite demain
Bonne soirée

Je suppose que « Action » écoute. « Sender » ne fait qu’envoyer, normalement.
Il doit y avoir un autre noeud Action ou un autre noeud qui écoute sur le même bot.
On ne peut établir qu’une seule connexion d’écoute par bot avec telegram. C’est une fonctionnalité/limite de NodeRed.

Bonsoir,

Mis à part ce message d’erreur tout fonctionne :

ETELEGRAM: 409 Conflict: terminated by other getUpdates request; make sure that only one bot instance is running

J’ai créé un nouveau bot que j’ai associé à action, dans ce cas, pas d’erreur mais pas de message d’action dans Telegram.
C’est mon seul flow qui utilise Telegram, c’est peut être qu’en utilisant Sender, je ne dois pas utiliser Action mais Command ?

Bob

Tu dois avoir dans ha une connexion vers ce même bot….
Si ton bot est activé (/start dans ton téléphone) ça doit rouler.
Ou problème de token. Avec les 40 et quelques caractères une erreur est vite arrivée!