Et un scenario avec un bloc code PHP ? C’est parfaitement adapté à ce genre de situation.
Pour te donner une idée, un exemple en pur PHP avec les données visibles dans la capture d’écran en début de fil. Il faut adapter pour récupérer l’historique depuis Jeedom et réinjecter dans un virtuel ou agir comme tu le souhaites. La répétition des données n’est pas gênante avec un scipt PHP :
<?php
// Tableau initial contenant les données avec des dates, des heures et des valeurs qui représentent un état.
$donnees = [
// Chaque entrée est un tableau associatif avec les clés 'jour', 'heure' et 'valeur'.
// 'jour' est la date, 'heure' est l'heure de l'enregistrement, et 'valeur' est un état (0 ou 1).
['jour' => '12/03/24', 'heure' => '11:43:37', 'valeur' => 0],
['jour' => '12/03/24', 'heure' => '11:43:31', 'valeur' => 1],
['jour' => '12/03/24', 'heure' => '11:43:11', 'valeur' => 1],
['jour' => '12/03/24', 'heure' => '11:43:02', 'valeur' => 1],
['jour' => '12/03/24', 'heure' => '11:42:56', 'valeur' => 1],
['jour' => '12/03/24', 'heure' => '11:42:46', 'valeur' => 0],
['jour' => '12/03/24', 'heure' => '11:42:44', 'valeur' => 0],
['jour' => '12/03/24', 'heure' => '11:42:33', 'valeur' => 0],
['jour' => '12/03/24', 'heure' => '10:53:40', 'valeur' => 0],
];
// Cette fonction valide une seule entrée du tableau de données.
function validerEntree($entree, $index) {
// Validation de la date : elle doit être au format 'jour/mois/année'.
$date = DateTime::createFromFormat('d/m/y', $entree['jour']);
// Si la création de la date échoue ou si le format ne correspond pas exactement, on arrête le script.
if (!$date || $date->format('d/m/y') !== $entree['jour']) {
exit("Erreur à l'entrée $index: 'jour' n'est pas une date valide.\n");
}
// Validation de l'heure : elle doit être au format 'heure:minutes:secondes'.
$time = DateTime::createFromFormat('H:i:s', $entree['heure']);
// De même, on arrête le script si l'heure n'est pas valide.
if (!$time || $time->format('H:i:s') !== $entree['heure']) {
exit("Erreur à l'entrée $index: 'heure' n'est pas une heure valide.\n");
}
// Validation de la valeur : elle doit être un booléen, donc 0 ou 1.
// Si la valeur n'est pas un booléen ou n'est pas égale à 0 ou 1, on arrête le script.
if (!is_bool($entree['valeur']) && ($entree['valeur'] !== 0 && $entree['valeur'] !== 1)) {
exit("Erreur à l'entrée $index: 'valeur' n'est pas un booléen.\n");
}
}
// Parcourt toutes les entrées du tableau pour les valider.
foreach ($donnees as $index => $entree) {
validerEntree($entree, $index);
}
// Si toutes les entrées sont valides, on affiche un message de confirmation.
echo "Toutes les entrées sont valides.\n";
// Fonction de tri personnalisée pour trier le tableau par date et heure.
usort($donnees, function($a, $b) {
// On crée un timestamp pour chaque entrée pour les comparer.
$timeA = DateTime::createFromFormat('d/m/y H:i:s', $a['jour'] . ' ' . $a['heure'])->getTimestamp();
$timeB = DateTime::createFromFormat('d/m/y H:i:s', $b['jour'] . ' ' . $b['heure'])->getTimestamp();
// L'opérateur <=> retourne -1, 0 ou 1, ce qui permet de trier le tableau.
return $timeA <=> $timeB;
});
// Cette fonction crée un timestamp à partir de la date et de l'heure fournies.
function creerTimestamp($date, $heure) {
$format = 'd/m/y H:i:s';
$dateHeure = DateTime::createFromFormat($format, $date . ' ' . $heure);
return $dateHeure->getTimestamp();
}
// Prépare les variables pour suivre l'état précédent et le timestamp précédent.
$valeurPrecedente = $donnees[0]['valeur'];
$timestampPrecedent = creerTimestamp($donnees[0]['jour'], $donnees[0]['heure']);
// Tableau pour stocker la durée entre les changements d'état.
$dureesChangementEtat = [];
// Parcourt le tableau pour calculer la durée entre les changements d'état.
for ($i = 1; $i < count($donnees); $i++) {
// Récupère la valeur et le timestamp de l'entrée actuelle.
$valeurActuelle = $donnees[$i]['valeur'];
$timestampActuel = creerTimestamp($donnees[$i]['jour'], $donnees[$i]['heure']);
// Si la valeur actuelle est différente de la précédente, c'est un changement d'état.
if ($valeurActuelle !== $valeurPrecedente) {
// Calcule la différence de temps en secondes.
$diffSecondes = $timestampActuel - $timestampPrecedent;
// Ajoute cette durée au tableau des changements d'état.
$dureesChangementEtat[] = [
'dateHeure' => $donnees[$i]['jour'] . ' ' . $donnees[$i]['heure'],
'valeurPrecedente' => $valeurPrecedente,
'valeurActuelle' => $valeurActuelle,
'dureeSecondes' => $diffSecondes
];
// Met à jour la valeur et le timestamp précédents pour la prochaine comparaison.
$valeurPrecedente = $valeurActuelle;
$timestampPrecedent = $timestampActuel;
}
}
// Affiche les résultats en format texte pour chaque changement d'état détecté.
foreach ($dureesChangementEtat as $duree) {
echo "{$duree['dateHeure']} - Changement d'état de {$duree['valeurPrecedente']} à {$duree['valeurActuelle']} - Durée depuis dernier changement d'état : {$duree['dureeSecondes']} secondes.\n";
}
?>
Ce qui donne une fois exécuté depuis un terminal :
Toutes les entrées sont valides.
12/03/24 11:42:56 - Changement d'état de 0 à 1 - Durée depuis dernier changement d'état : 2956 secondes.
12/03/24 11:43:37 - Changement d'état de 1 à 0 - Durée depuis dernier changement d'état : 41 secondes.