Calculer durée entre 2 déclenchements pompe

j’ai essayé de faire ceci

stateChanges(#[Cave][pompe cave][pompe active ]#,1 , 1 hour)

Mais le problème est que chaque changement de valeur de la puissance il me remet un 1 sur le virtuel


Il me repete le 1 alors que j’ai mis ceci sur mon info binaire :

Perso, je ne sait pas exactement comment faire, mais dans l’idée je regarderais pour caculer la valeur moyenne (entre 0 et 1 du coup) les X dernières minutes/heures.
Je ne sais pas à quelle cadence tu veux gérer le truc mais par exemple :
Tu calcul la valeur moyenne du retour de marche la dernière heure et la valeur moyenne du retour de marche les 4 drenières heures.
Ca te donne une idée de la tendance.
Et tu peux coupler ça à la détection de marche + de 30min.
Bon par contre je ne suis pas sûr que tu puisse t’en sortir sans faire un script… Et c’est là que mes modestes connaissances prennent fin… ^^

Perso je partirai plus sur un capteur de niveau d’eau ce serait bcp plus fiable

1 « J'aime »

Merci pour ta réponse. C’est quand meme bizarre que la non répétition de la valeur ne fonctionne pas dans mon virtuel non ?

j’y ai pensé mais pas forcement car il peut y avoir de l’eau, mais l’important c’est le débit… et pour le débit la seule solution que j’ai trouvée ce sont les déclenchements de la pompe…

Pas si tu définis un niveau haut et bas si ?

Peut être que ça peut t’aider ! :slight_smile:

En fait comme je pompe l’eau des que possible je ne peux pas avoir le niveau max.

Tu saurais pourquoi ca ne fonctionne pas chez moi la non répétitions des valeurs identiques ?
Je vais ouvrir un nouveau sujet pour comprendre le problème

Salut,

Chez mon cousin j’ai mis un capteur d’inondation Aqara dans le regard à la hauteur voulu, quand l’eau fait contact cela déclenche une prise connecté ou est branché la pompe.

Après si tu es DIY une sonde, un ESP et ça le fait aussi :wink:

le capteur est bien pour activer la prise certes mais chez moi je veux savoir la quantité, la heuteur ne m’importe pas car je ne veux pas qu’elle monte.
Ma seule facon serait de le faire en fonction du delais d’activation de la pompe mais je ne sais pas comment faire ca… j’arrive a savoir quand elle est allumée via mon virtuel mais pour le reste je galere un peu .

stateChanges(#[Cave][pompe cave][pompe active ]#,1 , 1 hour)

Ca ca aurait été ce qu’il me faut si la non répetition des valeurs fonctionnait…

Il suffirait de transformer la puissance de la prise connectée en info d’état avec la formule
#value# > 5 ? 1 : 0
Puis de faire un scénario avec comme déclencheur cette valeur et d’enregistrer dans 2 virtuels les dates de changement d’état :
D0 = D1
D1 = valueDate([prise pompe][puissance])
Puis de calculer la différence des dates
time_diff(D1,D0,s)
Pour avoir la durée en seconde du fonctionnement de la pompe ou des arrêts

Ok du coup je vais tester cette manière de faire concernant la maniere de convertir l’info de puissance en binaire ?
C’est quoi la différence entre cette methode et la mienne ?

#[Cave][shelly plug S][Puissance]# >5

C’est comme ce ci qu’il faut faire le scénario ?

Les commandes doivent etre en numérique ou autre ?
Encore merci

le calcul de na durée ne fonctionne pas car il me calcule le temps d’apsiration et non le temps entre 2 allumages

Il faut mettre comme déclencheur le changement d’état et faire le calcul pour chaque changement d’état 0 ou 1 puis si l’état vaut 1 le calcul donnera le temps d’arrêt et si l’état vaut 0 le calcul donnera le temps de fonctionnement

En ce moment la pompe ne se met en marche que 45 sec toutes les 20minutes environ, du coup sur mon Dashboard je ne vois pas l’ancienne valeur
et si je ne veux que le temps d’arret c’est possible ?


et avoir l’histoirque de tous ces temps d’arret pour savoir s’il y a une tendance a la hausse ou à la baisse. Plus le temps d’arret et long moins l’eau arrive vite

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.
1 « J'aime »

Mettre dans la formule de calcul de la configuration de l’info puissance de la prise connecté
#value# > 5 ? 1 : 0
Donc #[Aucun][pompe][puissance]# sera égal à 0 ou 1 suivant que la pompe tourne ou pas

Puis faire le sénario :

  • Nom du scénario : TEST1

  • Mode du scénario : provoke

    • Evènement : #[Aucun][pompe][puissance]#

    ACTION
    event - #[Aucun][TEST1][D1]#« ,« value »: »#[Aucun][TEST1][D2]#« }
    event - #[Aucun][TEST1][D2]# »,« value »:« valueDate(#[Aucun][pompe][puissance]#) »}

    SI #[Aucun][pompe][puissance]# == 1
    ALORS
    event - #[Aucun][TEST1][DIF_arret]#« ,« value »:« time_diff(#[Aucun][TEST1][D1]# , #[Aucun][TEST1][D2]#,s) »}
    SINON
    event - #[Aucun][TEST1][DIF_marche]# »,« value »:« time_diff(#[Aucun][TEST1][D1]# , #[Aucun][TEST1][D2]#,s) »}

avec D1 et D2 des infos virtuelles de type autre
et DIF_arret et DIF_marche des infos virtuelles de type numérique

Il suffit d’historiser les info DIF et la puissance pour avoir toutes les données voulues

Pour garder les 4 dernières valeurs créer 4 infos virtuelles ou variables DIF1,DIF2,DIF3,DIF4
Et ajouter dans le sénario
DIF1=DIF2 ; DIF2= DIF3 ; DIF3 = DIF4 ; DIF4 = DIF_arret
Et si (DIF1-DIF2 + DIF2-DIF3 + DIF3-DIF4) reste négatif c’est que le temps augmente sinon il diminue

1 « J'aime »

petite question encore… je ne comprends pas ce passage. D1 = pompe eteinte et D2 pompe allumée ? Du coup je fais une action pour envoyer quoi dans D1 ? la valeur de D2 ?
et dans D2 j’envoie la date du changement d’etat de la pompe ?

D1 et D2 sont les dates de changement d’état pour calculer la durée de fonctionnement et d’arrêt de la pompe.
D2 c’est la date du changement d’état actuel et D1 c’est la date du changement précédent sans préjuger si la pompe est allumée ou éteinte
donc D1 devient D2 avant que D2 prenne la valeur de la date du changement d’état qui vient de déclencher le scénario
Ensuite Si l’état qui a déclencher le scénario est à 1 c’est que l’état précédent était à 0 et donc que la pompe était arrêtée ; la durée calculée avec time_dif est bien un temps d’arrêt de la pompe.
Si l’état qui a déclencher le scénario est à 0 c’est que l’état précédent était 1 et donc la durée calculée est un temps de fonctionnement de la pompe

1 « J'aime »

C’est cool ca fonctionne bien ! merci !
j’essaye de faire fonctionner la commande tendance
tendance(commande,période,seuil)
Mais je ne suis pas sur de bien la configurer. Ma commande renvoie des minutes de ce type : 120.05
si je mets ceci tendance(#[Cave][pompe cave][dif arret]#,12 hours,1)
ca veut dire que la tendance va varier si sur 12 heures ca a varié de + ou - 1 mn ?
Si je veux que la tendance changer si ca varie de 10 minutes sur 12 h il suffit de mettre 10 ?
tendance(#[Cave][pompe cave][dif arret]#,12 hours,10)