Bug plugin script?

Tags: #<Tag:0x00007f28358f4a58> #<Tag:0x00007f28358f4990>

Bonjour,

Il semble que le plugin script ne retourne pas de résultat si utilisation d’une commande de type action.

Apparemment dans la dernière version seule une commande info retourne un résultat !

De plus une commande info ne prend pas de paramètre d’appel . Il semble bien que l’on se retrouve dans une impasse. Si l’on a besoin de passer des paramètres au script sous forme d’un slider ou d’un message et que l’on attende un résultat !

De plus, il a été ajouté à différents endroits du code un pseudo cache qui à mon sens ne sert à rien car forcément vide à chaque nouvel appel !

Pas glop glop les mises à jour !

A+
Bernard

Avec le plugin script, tu sais écrire dans des commandes. P-e ce que tu cherches a faire?

Re,

Qu’est-ce que tu veux dire ?
A+
Bernard

cette commande:

cmd::byString('#[Garage - Rez][Poubelle Global][Dechets organiques]#')->event(($val2));

Re,

Ce peut être une solution.
Mais un script peut retourner une valeur en faisant simplement en php un echo de la valeur.
De plus cela ne répond pas complètement au problème que je soulève. Je ne cherche pas un contournement !

Si la commande est de type info pour lui affecter une valeur il suffit que le script fasse un echo de cette valeur. C’est plus simple que de manipuler l’api jeedom.

Mais, une commande de type info n’a pas de paramètre de type message.

Et une commande de type action n’a pas de retour. Ce qui n’était pas le cas dans la version précédente.

Je m’en suis sorti en dupliquant le plugin script , en le modifiant pour mes besoins et je n’utilise pour le moment plus le plugin officiel script.

A+
Bernard

.

Je ne vois pas ce qui a changé selon toi.

J’ai des actions avec un echo, pour que l’info corresponde, et çà marche très bien, comme avant.

Avec une commande de type action ?

Ben oui j’en ai plein.

script

Bonjour @Bercolly

Je ne réponds qu’à cette remarque en donnant mon exemple d’utilisation pour récupère les paramètres de ma chaudière Viessmann.
L’interrogation se fait par une URL. Le retour est un json de 300ko. Il y a une trentaine de paramètres.
Dans un équipement script, j’ai créé autant de commandes script de type info json que de paramètres.
A la 1ère requête faite à Viessmann, le résultat est mis en cache et le 1er paramètre extrait du json.
Tous les autres paramètres sont récupérés du cache sans nouvelle requête à Viessmann.

Voila le pourquoi du « pseudo » cache.

Re,

Tu peux montrer le code que tu utilises ?

Moi je regarde le code en V4 + dernière version du script et je constate que seules les commandes de type info retournent une valeur.

Mystère !
A+
Bernard

J’ai regardé le code de l’api Viessmann. C’est cette appli qui gère un cache pas le script. Dans le script cela ne sert à rien !

Tu peux poser quelques traces en debug dans le code du plugin script pour constater que le pseudo cache est créé à chaque appel.
A+
Bernard

Je n’utilise pas l’API de thetrueavatar. Je n’ai jamais pu l’utiliser. (php 5.6 sur ma smart pour php 7 requis)
Et je la trouve trop compliquée pour juste parser un json.

J’ai fait un exemple simplifié:
Le script php appelé qui retourne du json:

<?php
echo json_encode(array("BoilerTemp" => 45, "RoomTemp" => 24 ));

Les 2 commandes dans le plugin script:
image

J’ai modifié le plugin script pour avoir un message selon la provenance du json. C’est dans la fonction execute:

	case 'json':
		$request = str_replace('"', '', $request);
		if($this->getType() == 'info' && isset(script::$_requet_cache[$this->getConfiguration('urlJson')])){
log::add(__CLASS__, 'error', "FROM cache: " .$this->getConfiguration('urlJson')); // Ligne ajoutée
			$json_str = script::$_requet_cache[$this->getConfiguration('urlJson')];
		}else{
log::add(__CLASS__, 'error', "NEW: " .$this->getConfiguration('urlJson'));  // Ligne ajoutée
			if ($this->getConfiguration('json_username') != '' && $this->getConfiguration('json_password') != '') {

A chaque sauvegarde de l’équipement script, dans le log scriptCmd, j’ai ça:

[2020-05-22 19:16:10][ERROR] : NEW: http://jeedom/plugins/script/data/Viessmann/viessmanTest.php
[2020-05-22 19:16:10][ERROR] : FROM cache: http://jeedom/plugins/script/data/Viessmann/viessmanTest.php

et quand je clique sur Tester j’ai les bonnes valeurs…
Idem quand je fais le refresh de la tuile sur le dashboard.

Re,

Dans le cache (?) tu as l’url et non les valeurs ! A chaque fois tu appelles ton module Viessmann.
Comment accèdes-tu à la chaudière ? (En fait qu’y a-t-il dans ton code Viessmann?).
Tu as un vitoconnect ?
A+
Bernard
Il ya quand même un mystère sur le cache.

Dans le code au dessus,
$this->getConfiguration('urlJson') contient l’URL de la requête et $_requet_cache[$this->getConfiguration('urlJson')] contient le résultat de la requête en json qui est utilisé.
Il n’y a pas de mystère la d’dans.

En faisant une requête entities > 111 > properties > value > value sur le json je récupère la temp de la pièce. Le pb est le numéro 111 qui varie selon les features ajoutées/supprimées.
J’ai pris l’exemple de ma chaudière Viessmann pour montrer à quoi peut servir le cache mais en réalité je parse le json dans le script.
Dans la version qui est sur mon Github, le script crée des variables qui sont récupérées dans un virtuel
Dans la version que j’utilise en ce moment, je renseigne les cmds d’un virtuel avec cmd::byEqLogicIdAndLogicalId et checkAndUpdateCmd.

J’ai un vitoconnect.
Mon Github: https://github.com/jpty/Jeedom-viessmann
Je n’ai fait que la recup des données. Pas d’action. Et uniquement le circuit de chauffage 0

Bon, j’ai dépouillé en large et en travers le plugin script.

A chaque appel du plugin script , les variables sont ré_initialisées, il ne peut y avoir de cache au niveau de la classe. C’est le principe du php à chaque appel de la classe au travers d’un appel http la classe est recrée et donc ses variables internes sont vides.

Donc, dans ton cas à chaque création d’une instance script il y a accès à Viessmann. Si dans ton occurrence de plugin il y a plusieurs scripts json le premier fait un appel Viessmann, et les suivants sur la même url vont taper dans le cache. Si 5 secondes plus tard tu recommences, un nouvel appel Viessmann est fait et bla,bla bla …

Par la même, si il n’y a qu’un appel dans le script le cache ne sert à rien.

De plus, j’ai regardé la doc jeedom du plugin , cette doc indique qu’il est possible de mettre les infos en cache et de définir un temps de conservation du cache. Mais, je ne vois pas comment le saisir au niveau de la définition d’un script json ! Une erreur de doc ? Une régression ?
A+
Bernard

re,

Curieux l’utilisation du $_GET sur un nom de fichier qui n’est pas une url.
Tu peux expliquer comment cela marche ?
A+
Bernard

Le cache n’est utile que s’il y a plusieurs données à extraire d’un même appel.
Après ce n’est qu’une variable conservée le temps de vie de l’exécution de toutes les cmds de l’équipement script.

Il fonctionne aussi pour le xml et le html. Cela réduit le trafic si l’on veut récupérer plusieurs valeurs sur une page html.

Si vous n’avez qu’une seule valeur à récupérer, on est d’accord il ne sert pas.

Pour le Lifetime du cache dans le bloc Options qui apparait dans la doc:
image
C’est une erreur dans la doc du plugin script.
Dans le commit du 3 décembre 2015, les 2 lignes suivantes ont été supprimées du fichier desktop/js/script.js

 tr += '<span><input type="checkbox" class="cmdAttr bootstrapSwitch" data-size="mini" data-l1key="cache" data-l2key="enable" checked data-label-text="{{Cache}}" /></span> ';
 tr += '<input style="width : 100px;" class="tooltips cmdAttr form-control input-sm" data-l1key="cache" data-l2key="lifetime" placeholder="{{Durée de vie du cache (s)}}" title="Durée de vie du cache (s)">';

Parfait,

On est d’accord.
Pour la doc, dommage car il me semble qu’elle vient d’être remise en forme.

Peux-tu préciser l’utilisation des $_GET ?
A+
Bernard

Il y a un PR qui est attente que j’ai fait, j’ai ajouté votre modif