Dans un bloc code de scénario j’utilise des instructions event ou addHistoryValue pour ajouter des lignes dans history. Mais ces instructions mettent à jour la ligne dans history si elle existe déjà.
Je cherche donc (et je ne trouve pas…) une instruction (ou un paramètre des instructions que j’utilise déjà…) qui permette d’ajouter une ligne une première fois mais qui ne mette pas cette ligne à jour si elle existe déjà.
J’avais un lien vers la liste des instructions de l’API PHP mais ve lien e fonctionne plus et je n’arive pas à retrouver cette liste…
Tout dépend du « Mode de lissage » défini dans la configuration des commandes.
Avec lissage Aucun, une nouvelle ligne est créée à chaque valeur avec l’heure actuelle. Lors de l’archivage chaque nuit, les valeurs sont conservées à l’identique.
Avec les autres Modes de lissage, les nouvelles valeurs sont lissées par tranche de 5 minutes. Les valeurs sont lissées par tranche d’une heure lors de l’archivage.
Non désolé, ce n’est pas ça, le mode de lissage est bien à « Aucun », mais si la ligne existe déjà dans history celle-ci est mise à jour par une nouvelle exécution des instructions que j’utilise actuellement.
EDIT ; je précise que l’id et datetime ne varient pas lors des exécutions suivantes. Je parle bien de history. Je ne m’occupe pas de historyarch, c’est le boulot automatique de Jeedom
Je cherche une autre instruction ou un paramètre à ajouter aux instructions que j’utilise actuellement.
Donc la date est forcée et écrase la valeur précédente de la même heure.
En mettant $histoProdPV->addHistoryValue($indexProdPVOpt);, l’heure actuelle sera utilisée dans history.
Mais JE VEUX forcer la date à la valeur que mon scénario à déterminer…
Je veux créer cette ligne à LA date et LA valeur déterminées par le scénario. Mais il se peut que plus tard le même contexte se présente et dans ce cas je ne veux pas que la ligne soit mise à jour, c’est à dire que LA valeur de la ligne ne soit pas modifiée.
Je pourrais arriver à ce résultat en détectant la répétition du contexte… Mais j’espérais pouvoir trouver un moyen, une instruction ou un paramètre qui bloque la mise à jour d’une ligne existante. En SQL la différence entre INSERT et UPDATE…
S’il y a une fonction qui fait ce que vous voulez, je ne la connais pas.
A voir dans les fichiers core/class/cmd.class.php et core/class/history.class.php si elle existe.
En gros tu dois vérifier la présence ou non d’une valeur en historique à la même date/heure avant d’ajouter ta valeur en historique, tu dois pouvoir t’en sortir avec quelque chose dans cette idée :
Oui, c’est tout à fait ce que je vais devoir faire.
Je vais essayer de décrypter le début de l’instruction, pas sûr que j’y arrive…
SI (je ne comprends pas le début du test) la date de la ligne history est différente de $date alors je crée une nouvelle ligne dans history
J’ai testé en forçant $date avec la valeur existante dans history et en forçant la valeur de $indexProdPVOpt à 5000 puis à 6000
Le teste « != $date » est toujours vrai et donc la ligne déjà existante dans history est mise à jour.
Mais comme je ne comprends pas la première partie du teste "!=’ je suis paumé…
Précision : $history vaut « toujours » 1
La présence du paramètre .$history dans $scenario-> bloque complètement l’alimentation du Log du scénario. J’en déduis que le contenu de $history n’est pas affichable…
Quant à l’instruction suivante, je ne comprends pas la partie 1 du test « != »
Autrement dit, je ne comprends pas :
!is_object($history) // history n'est pas un objet: commande non historisée ou sans historique pour l'instant
|| // ou
(is_object($history) && $history->getDatetime() != $date) // history est un objet et sa date est différente de $date
history::byCmdIdAtDatetime retourne la dernière history <= $date → le test si datetime != $date est nécessaire