Bloc code - déclaration variable en dehors du bloc code

bonjour,

je cherche à récupérer depuis internet la température à toutes les heures de la journée.
l’objectif de ce parsing est ensuite de calculer l’amplitude thermique sur cette journée.

j’ai donc déclaré un tableau de 24 entrées afin de stocker ces températures.

la difficulté est que vu que je déclare ce tableau ds le bloc code, celui-ci est réinitialisé à chaque lancement du bloc code.

j’ai par la suite cherché à mettre une condition sur la déclaration du tableau (par exemple, déclaration du tableau uniquement lors de la scrutation à 23h et après calcul de l’amplitude thermique). mais l’exécution du bloc code génère une erreur et ne s’exécute pas.

il existe bien la solution de stocker les différentes températures dans des variables Jeedom, mais je souhaiterai directement les stocker ds un tableau afin de faciliter le traitement des données via le bloc code.

du coup, existe-t-il une méthode pour initialiser un tableau de variable afin que celui-ci ne soit pas réinitialisé à chaque lancement du bloc code permettant le traitement des données stockées ds ce tableau ?

Je ne suis pas spécialiste mais si j’avais à faire ça, je transformerai le tableau en JSON pour le stocker dans une variable.

json_encode
json_decode

Hello

Oui json c’est pas mal.
Les tags scénario aussi ça marcherai

1 « J'aime »

bonjour,
effectivement l’utilisation d’un tableau format JSON semble répondre à mon besoin.
ne connaissant pas ce format j’ai fait des recherches.

maintenant, j’arrive :

  • à lire les données d’un tableau au format JSON après décodage
  • à modifier une données du tableau au format JSON

par contre je ne sais pas décoder/encoder depuis une variable Jeedom.

en effet, j’ai déclaré ds Jeedom une variable « testjson », mais je n’arrive pas à l’adresser pour le décodage/encodage …

$jsonobj = '{"0h":35,"1h":37,"2h":43,"3h":43,"4h":43,"5h":43,"6h":43,"7h":43,"8h":43,"9h":43,"10h":43,"11h":43,"12h":43,"13h":43,"14h":43,"15h":43,"16h":43,"17h":43,"18h":43,"19h":43,"20h":43,"21h":43,"22h":3,"23h":43}';

// décodage tableau JSON
$arrayobj=json_decode(variable(testjson),true);

// recherche d'une valeur ds l'image du tableau json
$value=intval($arrayobj["22h"]);
$scenario->setLog($value);

// modification d'une valeur ds l'image du tableau json
$scenario->setLog($arrayobj["20h"]);
$arrayobj["20h"]="999";
$scenario->setLog($arrayobj["20h"]);

// encodage tableau json
variable(testjson) = json_encode($arrayobj);

pour le décodage lorsque je remplace « variable(testjson) » par "$jsonobj ", le decodage fct.

peut-on stocker le tableau au format JSON ds une variable Jeedom ?
si oui, comment fait-on pour utiliser cette variable pour encodage/decodage ?

$scenario->setData($key, $data);
$data = $scenario->getData($key);

merci pour ton aide,

j’ai donc modifié le code avec les instructions « setData » et « getData ».

je dois faire une erreur car cela ne marche pas.

ds un premier temps, j’exécute le code avec la ligne 2 active et 5 commentée.
puis ds un 2ième temps, j’exécute le code avec la ligne 2 commentée et la ligne 5 active.

// A conserver uniquement pour TEST
//$jsonobj = '{"0h":35,"1h":37,"2h":43,"3h":43,"4h":43,"5h":43,"6h":43,"7h":43,"8h":43,"9h":43,"10h":43,"11h":43,"12h":43,"13h":43,"14h":43,"15h":43,"16h":43,"17h":43,"18h":43,"19h":43,"20h":43,"21h":43,"22h":3,"23h":43}';

// chargement de la variable Jeedom ds la variable php "$jsonobj"
$jsonobj = $scenario->getData('testjson');

// décodage tableau JSON
$arrayobj=json_decode($jsonobj,true);

// recherche d'une valeur ds l'image du tableau json
$value=intval($arrayobj["22h"]);
$scenario->setLog($value);

// modification d'une valeur ds l'image du tableau json
$scenario->setLog($arrayobj["20h"]);
$arrayobj["20h"]="999";
$scenario->setLog($arrayobj["20h"]);

// encodage tableau json + transfert ds variable jeedom
$scenario->setData('testjson', json_encode($arrayobj));

comme on peut le voir ds les LOG, la mémorisation ds la variable « testjson » en marche pas …

------------------------------------
[2021-01-16 17:49:15][SCENARIO] Start : Scenario lance manuellement.
[2021-01-16 17:49:15][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-01-16 17:49:15][SCENARIO] Exécution d'un bloc code
[2021-01-16 17:49:15][SCENARIO] 3
[2021-01-16 17:49:15][SCENARIO] 43
[2021-01-16 17:49:15][SCENARIO] 999
[2021-01-16 17:49:15][SCENARIO] Fin correcte du scénario
------------------------------------
[2021-01-16 17:49:33][SCENARIO] Start : Scenario lance manuellement.
[2021-01-16 17:49:33][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-01-16 17:49:33][SCENARIO] Exécution d'un bloc code
[2021-01-16 17:49:33][SCENARIO] 0
[2021-01-16 17:49:33][SCENARIO] 
[2021-01-16 17:49:33][SCENARIO] 999
[2021-01-16 17:49:33][SCENARIO] Fin correcte du scénario

si je remplace

$scenario->setData('testjson', json_encode($arrayobj));

par

$scenario->setData(testjson, json_encode(34));

la variable « testjson » de jeedom prend la valeur 34.
j’ai donc une erreur avec la mémorisation de mon tableau au format JSON, mais ??

Que donne

$scenario->setLog(json_encode($arrayobj));

l’encodage semble fonctionner correctement.
par contre le décodage retourne « array » ?

// A conserver uniquement pour TEST
$jsonobj = '{"0h":35,"1h":37,"2h":43,"3h":43,"4h":43,"5h":43,"6h":43,"7h":43,"8h":43,"9h":43,"10h":43,"11h":43,"12h":43,"13h":43,"14h":43,"15h":43,"16h":43,"17h":43,"18h":43,"19h":43,"20h":43,"21h":43,"22h":3,"23h":43}';

// chargement de la variable Jeedom ds la variable php "$jsonobj"
//$jsonobj = $scenario->getData(testjson);

// décodage tableau JSON
$arrayobj=json_decode($jsonobj,true);
$scenario->setLog(json_decode($jsonobj,true));

// recherche d'une valeur ds l'image du tableau json
$value=intval($arrayobj["22h"]);
$scenario->setLog($value);

// modification d'une valeur ds l'image du tableau json
$scenario->setLog($arrayobj["20h"]);
$arrayobj["20h"]="999";
$scenario->setLog($arrayobj["20h"]);

// encodage tableau json + transfert ds variable jeedom
$scenario->setData('testjson', json_encode($arrayobj));
$scenario->setLog(json_encode($arrayobj));

LOG :

------------------------------------
[2021-01-16 18:21:48][SCENARIO] Start : Scenario lance manuellement.
[2021-01-16 18:21:48][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-01-16 18:21:48][SCENARIO] Exécution d'un bloc code
[2021-01-16 18:21:48][SCENARIO] Array
[2021-01-16 18:21:48][SCENARIO] 3
[2021-01-16 18:21:48][SCENARIO] 43
[2021-01-16 18:21:48][SCENARIO] 999
[2021-01-16 18:21:48][SCENARIO] {"0h":35,"1h":37,"2h":43,"3h":43,"4h":43,"5h":43,"6h":43,"7h":43,"8h":43,"9h":43,"10h":43,"11h":43,"12h":43,"13h":43,"14h":43,"15h":43,"16h":43,"17h":43,"18h":43,"19h":43,"20h":"999","21h":43,"22h":3,"23h":43}
[2021-01-16 18:21:48][SCENARIO] Fin correcte du scénario
------------------------------------
[2021-01-16 18:21:49][SCENARIO] Start : Scenario lance manuellement.
[2021-01-16 18:21:49][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-01-16 18:21:49][SCENARIO] Exécution d'un bloc code
[2021-01-16 18:21:49][SCENARIO] Array
[2021-01-16 18:21:49][SCENARIO] 3
[2021-01-16 18:21:49][SCENARIO] 43
[2021-01-16 18:21:49][SCENARIO] 999
[2021-01-16 18:21:49][SCENARIO] {"0h":35,"1h":37,"2h":43,"3h":43,"4h":43,"5h":43,"6h":43,"7h":43,"8h":43,"9h":43,"10h":43,"11h":43,"12h":43,"13h":43,"14h":43,"15h":43,"16h":43,"17h":43,"18h":43,"19h":43,"20h":"999","21h":43,"22h":3,"23h":43}
[2021-01-16 18:21:49][SCENARIO] Fin correcte du scénario

// afficher un array
$a = print_r($array, true);
$scenario->setLog($a);

j’ai ajouté les ligne de code proposées pour visualiser le décodage du JSON.

tjrs avec le même protocole de test,
sur le 1er test, le décodage depuis le JSON ds le bloc code fonctionne bien
mais sur le 2ième test, décodage depuis la variable jeedom. le décodage renvoie vide ??

PROG :

// A conserver uniquement pour TEST
//$jsonobj = '{"0h":35,"1h":37,"2h":43,"3h":43,"4h":43,"5h":43,"6h":43,"7h":43,"8h":43,"9h":43,"10h":43,"11h":43,"12h":43,"13h":43,"14h":43,"15h":43,"16h":43,"17h":43,"18h":43,"19h":43,"20h":43,"21h":43,"22h":3,"23h":43}';

// chargement de la variable Jeedom ds la variable php "$jsonobj"
$jsonobj = $scenario->getData(testjson);

// décodage tableau JSON
$arrayobj=json_decode($jsonobj,true);
$scenario->setLog($arrayobj);
$a = print_r($arrayobj, true);
$scenario->setLog($a);

// recherche d'une valeur ds l'image du tableau json
$value=intval($arrayobj["22h"]);
$scenario->setLog($value);

// modification d'une valeur ds l'image du tableau json
$scenario->setLog($arrayobj["20h"]);
$arrayobj["20h"]="999";
$scenario->setLog($arrayobj["20h"]);

// encodage tableau json + transfert ds variable jeedom
$scenario->setData('testjson', json_encode($arrayobj));
$scenario->setLog(json_encode($arrayobj));

LOG :

------------------------------------
[2021-01-16 18:37:11][SCENARIO] Start : Scenario lance manuellement.
[2021-01-16 18:37:11][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-01-16 18:37:11][SCENARIO] Exécution d'un bloc code
[2021-01-16 18:37:11][SCENARIO] Array
[2021-01-16 18:37:11][SCENARIO] Array
(
    [0h] => 35
    [1h] => 37
    [2h] => 43
    [3h] => 43
    [4h] => 43
    [5h] => 43
    [6h] => 43
    [7h] => 43
    [8h] => 43
    [9h] => 43
    [10h] => 43
    [11h] => 43
    [12h] => 43
    [13h] => 43
    [14h] => 43
    [15h] => 43
    [16h] => 43
    [17h] => 43
    [18h] => 43
    [19h] => 43
    [20h] => 43
    [21h] => 43
    [22h] => 3
    [23h] => 43
)

[2021-01-16 18:37:11][SCENARIO] 3
[2021-01-16 18:37:11][SCENARIO] 43
[2021-01-16 18:37:11][SCENARIO] 999
[2021-01-16 18:37:11][SCENARIO] {"0h":35,"1h":37,"2h":43,"3h":43,"4h":43,"5h":43,"6h":43,"7h":43,"8h":43,"9h":43,"10h":43,"11h":43,"12h":43,"13h":43,"14h":43,"15h":43,"16h":43,"17h":43,"18h":43,"19h":43,"20h":"999","21h":43,"22h":3,"23h":43}
[2021-01-16 18:37:11][SCENARIO] Fin correcte du scénario
------------------------------------
[2021-01-16 18:37:27][SCENARIO] Start : Scenario lance manuellement.
[2021-01-16 18:37:27][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-01-16 18:37:27][SCENARIO] Exécution d'un bloc code
[2021-01-16 18:37:27][SCENARIO] 
[2021-01-16 18:37:27][SCENARIO] 
[2021-01-16 18:37:27][SCENARIO] 0
[2021-01-16 18:37:27][SCENARIO] 
[2021-01-16 18:37:27][SCENARIO] 999
[2021-01-16 18:37:27][SCENARIO] {"20h":"999"}
[2021-01-16 18:37:27][SCENARIO] Fin correcte du scénario

Et avec ?

$jsonobj = $scenario->getData('testjson');

pas de chgt.
en tout cas merci pour ton aide …

ma variable « testjson » est une variable jeedom déclarée ds « variables des scénarios ».
le type de la variable est configurable où uniquement type int ?

A priori, la valeur de la variable est sauvegardée dans un champ « text », soit une capacité de 65535 caractères.

A noter que si c’est juste pour s’en servir dans des scénario, la stocker sous forme de variable ça sert à rien.
Je suis même pas sûr que ce soit utile de garder les 24 valeurs, l’amplitude thermique c’est pas juste la différence entre le min et le max ?

ds l’onglet « variable des scénarios » sous jeedom, la variable « testjeedom » est égale à [object Object] ??

tout à fait d’accord l’amplitude thermique est l’écart entre le min en le max sur la journée.
pour autant le site sur lequel je récupère la température est rafraîchie au fil de la journée.
par exemple la température à 2h n’est plus dispo lorsque l’on consulte le site à 14h le même jour.
du coup, le stockage des données sur la journée est nécessaire pour mon besoin.

Que vois-tu dans la fenêtre « variables des scénarios » après un setData ?

Une copie d’écran pour lever tous les doutes?

Donc pour l’amplitude, on doit pouvoir limiter les valeurs à retenir à min et max…
A chaque (re)lecture du site, s’il existe un min plus petit ou un max plus grand => mise à jour et calcul de l’écart… Le reste on s’en fiche

1 « J'aime »

ci-dessous la capture d’écran de la variable :

@Jeandhom : la valeur est tjrs [object Object]

@naboleo : oui pour le calcul de l’amplitude thermique, on pourrait comme tu le suggères récupérer uniquement les min et max disponible. maintenant, j’aurai besoin ds le futur de récupérer d’autre donnée sur la journée entière.

essaye avec
$scenario->setData('testjson', implode($arrayobj));

(l’inverse c’est explode)

toujours pareil avec « implode »

------------------------------------
[2021-01-16 19:48:41][SCENARIO] Start : Scenario lance manuellement.
[2021-01-16 19:48:41][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-01-16 19:48:41][SCENARIO] Exécution d'un bloc code
[2021-01-16 19:48:41][SCENARIO] Array
[2021-01-16 19:48:41][SCENARIO] Array
(
    [0h] => 35
    [1h] => 37
    [2h] => 43
    [3h] => 43
    [4h] => 43
    [5h] => 43
    [6h] => 43
    [7h] => 43
    [8h] => 43
    [9h] => 43
    [10h] => 43
    [11h] => 43
    [12h] => 43
    [13h] => 43
    [14h] => 43
    [15h] => 43
    [16h] => 43
    [17h] => 43
    [18h] => 43
    [19h] => 43
    [20h] => 43
    [21h] => 43
    [22h] => 3
    [23h] => 43
)

[2021-01-16 19:48:41][SCENARIO] 3
[2021-01-16 19:48:41][SCENARIO] 43
[2021-01-16 19:48:41][SCENARIO] 999
[2021-01-16 19:48:41][SCENARIO] 353743434343434343434343434343434343434399943343
[2021-01-16 19:48:41][SCENARIO] Fin correcte du scénario
------------------------------------
[2021-01-16 19:49:14][SCENARIO] Start : Scenario lance manuellement.
[2021-01-16 19:49:14][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-01-16 19:49:14][SCENARIO] Exécution d'un bloc code
[2021-01-16 19:49:14][SCENARIO] 
[2021-01-16 19:49:14][SCENARIO] 
[2021-01-16 19:49:14][SCENARIO] 0
[2021-01-16 19:49:14][SCENARIO] 
[2021-01-16 19:49:14][SCENARIO] 999
[2021-01-16 19:49:14][SCENARIO] 999
[2021-01-16 19:49:14][SCENARIO] Fin correcte du scénario