Envoyer une capture du plugin caméra via bloc code

Bonjour à tous
Je suis très débutant en php (ça va se voir tout de suite !)
Je voudrais envoyer une capture d’une caméra à un destinataire Telegram via un bloc code. Le but étant d’avoir un module générique qui va traiter l’envoi de n’importe laquelle de mes caméras vers n’importe lequel des destinataires Telegram (réception de la caméra et du destinataire via tag).

Je pioche terriblement dans l’envoi de la commande.

  • Je mets dans $DestCpl le nom du destinataire Telegram, tel qu’il apparaît dans la commande, par exemple [Phyllox].
    -Je mets dans $CamCpl le nom de la caméra tel qu’il apparaît dans la commande (par exemple [terrasse]).

Je reçois le message : array callback has to contain indices 0 or 1

Voici le code d’exécution de la commande :

$DestCpl = « #[Maison][Telegram] ».$DestCpl.« # »;
$commande = cmd::byString(« #[Caméras] ».$CamCpl.« [Enregistrer]# »);
$commande->execCmd($options=array(‹ title ›=>‹ 1 ›, ‹ message ›=> « $DestCpl »), $cache=0);

Alors bien entendu, l’execCmd, je l’ai recopié dans du code trouvé sur ce forum (ou un autre, je ne sais plus) pour envoyer des messages via Telegram, en remplaçant juste 'jeedom" par ‹ 1 › dans ‹ title ›. Je ne comprends pas grand chose à la syntaxe
J’ai essayé de regarder comment ça devrait s’articuler en faisant « Edition texte » sur un scénario envoyant la commande, mais je n’arrive pas à faire le lien avec ce que je dois envoyer en php.
Je suis vraiment très débutant !

Quelqu’un aurait une idée de la syntaxe à employer pour passer les paramètres de la commande ?

A noter que je poste ce message dans le plugin caméra, plutôt que scénario, parce que j’ai pensé que la syntaxe était peut être liée à la façon dont s’articule la commande.

Merci d’avance
Bonne soirée

Bonjour,

Je passe probablement à côté de ta question, mais je n’ai pas compris pourquoi tu n’utilises pas la fonction intégrée à Jeedom ?

@SWR, hello
Les conditions multiples (j’ai 6 caméra et 5 destinataires) sont beaucoup plus faciles à coder en php qu’en multipliant les if dans les scénarios Jeedom qui deviennent illisibles. Encore ici je pourrais m’en sortir, mais j’ai d’autres besoins plus complexes qui nécessiteront de passer par du code, alors j’ai besoin de savoir le faire.

Et je ne peux pas coder les conditions en php et exécuter la commande dans le scénario avec les commandes du plugin, puisque la commande même sera un tag.

Quelqu’un qui passerait par là et saurait le faire ? J’ai essayé pas mal d’options sans succès.
Merci

Salut,

Voilà ce que j’ai (dans user.function.class.php) :

		public static function snapOfCam($_id) {
			$base= realpath(dirname(__FILE__).'/../../captures/'.$_id);
			$files = scandir($base, SCANDIR_SORT_DESCENDING);
			return $base.'/'.$files[0];
		}

ça retourne le chemin+nom de la dernière capture en date dont on passe l’ID en argument.
Tu peux utiliser ça pour fournir l’image à telegram, contenue dans un tag.


A adapter et à améliorer bien sûr

Bonsoir @naboleo
Merci beaucoup pour ta réponse.
Comme je l’ai dis, et comme tu l’as compris déjà la dernière fois, je débute. Si je comprends ce que fais ton code (ce qui n’est pas certain…) il va chercher dans un répertoire de capture d’une caméra (dont il faut connaître l’ID) le dernier fichier capturé.
Effectivement, c’est une excellente idée, mais si je n’ai pas loupé une marche au passage, il faudrait que la capture ait été faite au préalable ? Je n’ai pas de capture encore faite. Je veux qu’un événement (une fenêtre qui s’ouvre, une présence) déclenche la capture et l’envoi dans la foulée.
De plus, je voulais que mon code détermine aussi à qui on doit envoyer le message, et que je passe aussi le destinataire à la commande d’envoi.
Il y a certainement un moyen de faire la capture, et de sélectionner le destinataire, mais je n’y ai pas réfléchi…
L’avantage de la commande du plugin caméra c’est qu’elle fait la capture et qu’elle l’envoie au destinataire choisi dans a même action.
C’est pour ça que je voulais utiliser cette méthode.
Enfin il est un peu tard pour moi ce soir pour réfléchir correctement à ça.
Je reste à l’affût de toute solution alternative, ou tout complément d’information.
Merci d’avance

Exactement!

Également. L’idée de l’événement déclencheur est parfaitement adaptée.

C’est là où les choses se compliquent. Tu as assez peu de chances de te voir proposer un code tout fait qui réponde à ton besoin à 100%. D’une part parce qu’on a jamais exactement la même problématique et d’autre part parce pour apprendre c’est nul.
À mon avis il faut que tu conçoives les choses comme 3 étapes successives (capture, choix du destinataire, envoi) et que tu commences à créer ton scénario et ton code au fur et à mesure. Si tu affrontes ces 3 trucs d’un coup, au mieux tu fais un truc bancale, au pire ça ne marchera pas. De plus les rendre indépendants permettra de les réutiliser sans tout refaire… Typiquement le choix du destinataire c’est pas limité au caméras seulement…

C’est le bon moment de se poser la question et de définir exactement ce que tu veux. Par exemple la caméra1 est toujours à destination de la même personne ? La 2 à une autre ? Ou bien c’est en fonction de qui est à la maison ? De la période de la journée peut être ?

Oui mais la conséquence directe c’est le manque de souplesse… Attention également à ne pas se focaliser sur une solution technique et d’essayer de la tordre pour répondre au besoin… Et puis la documentation du plugin est vraiment minimale et ne montre pas tout ce que le plugin fait en réalité (sauf si grosse mise à jour que j’ai raté)

Bref. Défini le besoin, construit ta solution pas à pas. Il y a pas de raison de ne pas avoir un truc efficace et beau. On aura le temps d’en discuter au fur et à mesure

hello @ naboleo
Merci de me répondre.

Non, je sais exactement ce que je veux - je suis nul en php mais j’ai l’habitude du développement - et dans mon besoin, les deux événements captures et envoi sont toujours associés (cas d’absence de tous les habitants de la maison). Quant aux destinataires, ils sont choisis par des scénarios en amont et passés en paramètres, mais pas avec le nom complet Telegram. Bien entendu, la procédure pour faire le lien entre le paramètre et le ou les noms exacts doit être distincte.

C’est très vrai, mais j’ai un besoin urgent de mise en place. La seule chose qui me manque ici, c’est pour passer en php une commande du plugin du type :


C’est pourquoi j’ai posté dans le plugin et pas en scénario. Sur le fond, encore une fois, tu as raison, dissocier les événements est l’idéal, car s’adapte à tous les cas, mais tout est prêt dans ce que j’ai fait, sauf cet envoi de commande, et dans l’urgence, si je trouvais la syntaxe php pour l’envoyer, j’en aurais terminé et pourrais continuer à passer du temps pour faire mieux plus souple pour le prochain besoin et avoir l’esprit libre pour le besoin immédiat.

D’autant que même en dissociant, je ne suis pas certain de trouver la syntaxe pour envoyer une image Telegram en php. Je l’ai trouvé pour du texte, mais c’est peut être différent pour une image. La problématique est à peu près semblable à celle de la commande pour laquelle j’ai demandé de l’aide au départ.

Bon, si personne ne me répond sur cette commande, je pense que je vais en attendant de pouvoir faire mieux en suivant tes conseils bâcler un scénario bavard Jeedom pour pourvoir à mon besoin immédiat.

Merci encore de tes idées et conseils

.

Jete un oeil à
https://kiboost.github.io/jeedom_docs/jeedomV4Tips/CodesScenario/fr_FR/
L’exécution d’une commande n’est pas spécifique à un plugin en soit.
Là ou il va falloir creuser, c’est les arguments/tags à faire passer

@naboleo

Bien sûr, je connais cette page précieuse, j’en ai même fait un résumé en local sur mon ordi.

Oui, c’est justement là que ça coince, comme je l’ai indiqué dans mon message initial, avec un message d’erreur qui semble signifier une erreur de tableau, mais j’ai essayé pas mal d’options sans succès.

Merci

Il manque pas quelque chose a ta function ? … }

1 « J'aime »

As-tu fais un test avec un truc du genre ?

$options=array("message"=>"$DestCpl","file"=>"/path/capture.png");

file c’est ce qu’attends telegram pour joindre le fichier

Hello @naboleo
J’approche de la solution. Enfin j’ai déplacé le problème.
Si je fais un bloc code avec ça :


la bonne personne reçoit la bonne capture. C’est donc le format correct de la commande.

Mais dès que j’essaye de le passer dans un bloc code qui reçoit des paramètres, j’ai des erreurs (affectation de valeur à une variable ou array…)
Si je rajoute ça au début du bloc code ci-dessus :

$tags = $scenario->getTags();
$Camera = $tags(‹ #gCamera# ›);
$Dest = $tags(‹ #gDest# ›);

J’ai une erreur.
Avec juste ces 3 lignes en plus, j’ai :

Array callback has to contain indices 0 or 1

Bref, j’avais peut être juste au départ avec un résultat faussé par mes récupérations de tags…

Et encore, j’ai viré toutes les affectations de variable pour faire le test sinon j’avais des erreurs sur toutes mes affectations genre $Variable = « Truc »;
Ah, je suis loin de postuler chez Jeedom !
Si quelqu’un a une idée ?

Essaye de voir si la mise en forme de tag n’a pas changée par rapport à la forme en dur en l’affichant dans les logs

$scenario->setLog('cam='.$tags['#gDest#'].' dest='.$tags['#gDest#']);

@naboleo
Merci pour ce retour, j’avais déjà essayé de faire des $scenario->setlog à différents endroits du code, mais avec ce message d’erreur, la log ne les affiche pas.
J’ai mis le tien :

$tags = $scenario->getTags();
$Camera = $tags(‹ #gCamera# ›);
$Dest = $tags(‹ #gDest# ›);
$scenario->setLog(‹ cam= ›.$tags[‹ #gDest# ›].’ dest=‹ .$tags[ ›#gDest#']);

Mais la log n’affiche rien que le message d’erreur

[2020-07-19 17:04:08][SCENARIO] Exécution du sous-élément de type [action] : action
[2020-07-19 17:04:08][SCENARIO] Mise à jour du tag #gCamera# => q3s
[2020-07-19 17:04:08][SCENARIO] Mise à jour du tag #gDest# => P
[2020-07-19 17:04:08][SCENARIO] Exécution du sous-élément de type [action] : action
[2020-07-19 17:04:08][SCENARIO] Exécution du sous-élément de type [action] : code
[2020-07-19 17:04:08][SCENARIO] Exécution d’un bloc code
[2020-07-19 17:04:08][SCENARIO] Array callback has to contain indices 0 and 1
[2020-07-19 17:04:08][SCENARIO] Fin correcte du scénario

Pour info, j’ai essayé de transposer mon bloc code dans un script, supposé plus bavard avec les erreurs, en remplaçant donc les $Camera = $tags(‹ #gCamera# ›) par des $Camera = $argv[1];
Mais les scripts ne semble pas apprécier le :
$commande = cmd::byString($CamCpl);
Problème de classe !

Erreur sur php /var/www/html/plugins/script/data/SndCamImg.php absence mouvement 2>&1 valeur retournée : 255. Détails : PHP Fatal error: Uncaught Error: Class ‹ cmd › not found in /var/www/html/plugins/script/data/SndCamImg.php:36 Stack trace: #0 {main} thrown in /var/www/html/plugins/script/data/SndCamImg.php on line 36

Encore un mauvais jour !
Merci

ça vient d’ou ces traces ? et est-ce normal que ce soit super différent des #xxxxxxxxxxxx# ?

Pour tester, je crée les tag dans deux actions au début du scénario…Ce sont les paramètres passés au code qui les transforme en #…#

Je viens juste de trouver mon erreur - alors que pourtant je l’avais déjà faite et corrigée une fois - en remplaçant les parenthèses de $tags par des crochets. En plus c’est ce que disait le message. Mais le modèle d’origine internet est faux et je continue à le copier tel quel !

En attendant, j’avais fait des modifs :
-Création d’un 1er script qui récupère le nom de la commande caméra #…[Camera][Enregistrer]
-Création d’un 2e script qui récupère le nom de la commande Telegram #[Maison][Telegram][Phyllox]#

J’exécute chacuns leur tour les 2 scripts, et je vérifie en m’envoyant les tags récupérés que les valeurs récupérées sont les bonnes (juste pour le test). Les 2 scripts font bien leur boulot ! (Du reste, la log me le confirme).

Appel du bloc code suivant :

$tags = $scenario->getTags();
$Camera = $tags[‹ #CplCam# ›];
$Dest = $tags[‹ #CplDest# ›];
$scenario->setLog(‹ cam= ›.$tags[‹ #CplCam# ›].’ dest=‹ .$tags[ ›#CplDest#']);
$commande = cmd::byString($Camera);
$commande->execCmd($options=array(« background »=>« 0 »,« title »=>« 1 »,« message »=>$Dest), $cache=0);

Du coup je n’ai plus d’erreur…
Par contre je ne reçois toujours pas mon image alors que les variables ont les mêmes valeurs que dans le test qui fonctionne !
C’est vraiment pas ma journée !
Merci

En fait ma question étant pourquoi les valeurs des tags « varient » (1 fois un vrai nom de commande « #xxxxx# » une autre fois c’est « q3s »…

Donc si j’ai bien compris les 2 tags que tu passes à ton bloc script dans ton scénario sont maintenant tous corrects y compris dans les logs

Pour l’image, remonte quelques posts plus haut… Si tu ne donne pas à un moment "file"=>"/path/capture.png"
dans le tableau $options, c’est quasi sur que ça me marchera pas…

Commence par lui filer un chemin en dur … ça permettra de valider cet hypothèse… Il restera après à récupérer la bonne valeur depuis la commande « Enregistrer »

@naboleo
En fait, j’ai trouvé à quoi correspond le souci.
Dans le bloc code, je fais une comparaison des deux variables issue des deux tags avec les variable que j’avais en dur dans le test qui fonctionnait… Vu que je passe la même chose, elles devraient être les mêmes…
Et voilà ce que me donne la log :

[2020-07-19 18:41:22][SCENARIO] cam=#[Caméras][Axis][Enregistrer]# dest=#[Maison][Telegram][Phyllox]#
[2020-07-19 18:41:22][SCENARIO] Commandes caméra différentes : #[Caméras][Axis][Enregistrer]# et #4230#
[2020-07-19 18:41:22][SCENARIO] Destinataires Telegram différents : #[Maison][Telegram][Phyllox]# et #3971#

Les #chiffre# étant les deux variables rentrées en dur $Variable = « #[Caméras][Axis][Enregistrer] » par exemple.
#3971# est bien l’id de la commande Telegram. Mais je ne peux pas vérifier directement pour la commande caméra, il n’y a pas de commande qui apparaissent, et on ne peut pas en vérifier l’ID. Commande codées en dur ?
Bref, y a-t-il un moyen de récupérer en php l’ID d’une commande y compris de la commande Camera qui est forcément dans Jeedom ?

Merci

@naboleo
C’est bon, ça fonctionne avec un ->getId();
J’ai eu une grosse frayeur, un scénario quelconque c’est mis à m’envoyer plein de photos de la même caméra en boucle, et comme le scénario était arrêté, je ne savais pas trop quoi faire pour cesser cette avalanche. J’ai dû en recevoir 400 avant de pouvoir désactiver le scénario fautif, à moins que ce soit un bug Telegram ou du plugin ou de Jeedom, en tous cas, ça a cessé, et ça fonctionne !

Merci beaucoup pour ton aide précieuse.
Bonne soirée

Cool si ça marche.
Poste ton code complet et clôture le sujet… ça servira pour les suivants