Scénarios bloc code détecteur de présence

Bonjour
J’ai un détecteur de présence humain je voudrais faire un scénario avec la présence.
Si c’est possible de faire un scénario avec un bloc code pour dire que si l’état de la détection reste « NONE » pendant 30 minutes et que la luminosité de la lumière est supérieur à 20 d’éteindre la lumière. Par contre si l’état de la détection est « LARGE ou SMALL » pendant les 30 minutes la lumière reste allumée.
Avec le code que j’ai mis la lumière ne s’éteint pas.
si toute fois quelqu’un peu m’aider je suis preneuse.
merci d’avance.

// ====== CONFIG ======
$cmdPresence = '#[Toilettes][Détecteur Présence][Etat détection]#';     // NONE / LARGE / SMALL
$cmdLux      = '#[Toilettes][Détecteur Présence][Luminosité]#';          // en lux
$cmdLightOff = '#[Toilettes][Lumière Toilettes][Eteindre]#';                 // commande OFF
$timeout     = 30 * 60;                                 // 30 minutes en secondes
$luxLimit    = 20;
// ====================

// Valeurs actuelles
$presence = cmd::byString($cmdPresence)->execCmd();
$lux      = cmd::byString($cmdLux)->execCmd();

// Récupération de la dernière détection
$lastPresenceTime = $scenario->getData('lastPresenceTime');

// Si présence détectée → on mémorise l'heure et on ne fait rien
if ($presence == 'LARGE' || $presence == 'SMALL') {
    $scenario->setData('lastPresenceTime', time());
    log::add('scenario', 'info', 'Présence détectée → lumière maintenue allumée');
    return;
}

// Si aucune présence (NONE)
if ($presence == 'NONE') {

    // Initialisation si vide
    if (empty($lastPresenceTime)) {
        $scenario->setData('lastPresenceTime', time());
        return;
    }

    $elapsed = time() - $lastPresenceTime;

    // Vérification des conditions
    if ($elapsed >= $timeout && $lux > $luxLimit) {
        log::add('scenario', 'info', 'Aucune présence depuis 30 min et luminosité > 20 → extinction');
        cmd::byString($cmdLightOff)->execCmd();
    }
}

Résumé

Ce texte sera masqué

Bonjour,

Pourquoi passer par un bloc code au lieu d’un scénario ?
Le debug est plus compliqué pour vérifier les valeurs des variables.

Salut,

Il faut voir comment ton détecteur se comporte.

Est-ce qu’il envoie NONE régulièrement ? Ça m’étonnerait.

Donc quand il ne détecte plus personne il va passer à NONE, déclencher le scénario, mais le temps d’absence calculé ne sera pas bien long donc jamais d’extinction.

Que donne les logs de ton scénario là ?

En principe on fait des scénarios classique avec dans l’idée des programmations pour indiquer que quand il n’y a plus de mouvement l’extinction doit se faire « Dans » x minutes.

S’il y a une présence, le scénario tourne et annule la programmation qui aurait pu être faite.

1 « J'aime »

Bonjour,

j’ai demander a gemini (ia)

peut apporter un éclaircissement

Le problème de votre code actuel vient du fait que le scénario s’arrête à chaque fois qu’il est lancé sans forcément vérifier si les 30 minutes sont écoulées depuis le vrai dernier mouvement. De plus, si le détecteur n’envoie pas de mise à jour quand il est sur « NONE », le scénario ne se déclenche plus et le calcul ne se fait jamais.

Voici une version corrigée et optimisée du bloc code pour Jeedom :

Pourquoi votre code ne fonctionnait probablement pas :

  1. Le déclencheur : Si le scénario n’est pas provoqué régulièrement, le calcul $elapsed >= $timeout ne se fait jamais.
  2. La variable : $scenario->getData récupère une chaîne de caractères, il est parfois nécessaire de s’assurer qu’elle est traitée comme un nombre pour le calcul.
  3. La luminosité : Attention, si vous éteignez la lumière, la luminosité va chuter. Si le scénario se relance, la condition $lux > $luxLimit ne sera plus vraie, ce qui est correct pour l’extinction, mais vérifiez bien que votre capteur mesure la luminosité ambiante (avec lumière allumée).

Le Bloc Code Corrigé :

// ====== CONFIG ======
$cmdPresence = '#[Toilettes][Détecteur Présence][Etat détection]#';
$cmdLux      = '#[Toilettes][Détecteur Présence][Luminosité]#';
$cmdLightOff = '#[Toilettes][Lumière Toilettes][Eteindre]#';
$timeout     = 1800; // 30 minutes en secondes
$luxLimit    = 20;

// ====================
// Valeurs actuelles
$presence = cmd::byString($cmdPresence)->execCmd();
$lux      = cmd::byString($cmdLux)->execCmd();

// Récupération de l'heure du dernier mouvement
$lastPresenceTime = $scenario->getData('lastPresenceTime', 0);

if ($presence == 'LARGE' || $presence == 'SMALL') {
    // On met à jour l'heure dès qu'il y a une présence
    $scenario->setData('lastPresenceTime', time());
    $scenario->setLog('Présence détectée (' . $presence . ') -> On réinitialise le compteur.');
} else {
    // Si c'est "NONE"
    if ($lastPresenceTime == 0) {
        $scenario->setData('lastPresenceTime', time());
        return;
    }

    $elapsed = time() - $lastPresenceTime;
    $scenario->setLog('Aucun mouvement depuis : ' . $elapsed . 's (Seuil : ' . $timeout . 's)');

    if ($elapsed >= $timeout) {
        if ($lux > $luxLimit) {
            $scenario->setLog('Conditions remplies : Aucun mouvement depuis 30min et Lux > ' . $luxLimit . '. Extinction.');
            cmd::byString($cmdLightOff)->execCmd();
            // Optionnel : remettre le compteur à 0 pour éviter d'éteindre en boucle
            $scenario->setData('lastPresenceTime', 0);
        } else {
            $scenario->setLog('Temps dépassé mais luminosité déjà basse (' . $lux . '), extinction ignorée.');
        }
    }
}

Configuration importante pour que ça marche :

  1. Déclencheurs du scénario :
  • Mettez bien #[Toilettes][Détecteur Présence][Etat détection]# en déclencheur provoqué.
  • TRÈS IMPORTANT : Ajoutez un déclencheur programmé (Cron) toutes les minutes ou toutes les 5 minutes (ex: */5 * * * *).
  • Pourquoi ? Parce que si le détecteur envoie « NONE » une seule fois et ne reparle plus pendant 30 minutes, le scénario ne se lancera jamais pour vérifier si le délai est dépassé. Le déclencheur programmé forcera cette vérification.
  1. Alternative sans bloc code : Vous pouvez aussi faire cela très simplement avec les fonctions natives de Jeedom, ce qui est souvent plus facile à maintenir :
  • Déclencheur : #[Etat détection]#
  • Bloc SI : #[Etat détection]# == 'NONE'
    • ALORS : DANS 30 (minutes)
      • SI #[Etat détection]# == 'NONE' AND #[Luminosité]# > 20
        • #[Eteindre]#
  • SINON (donc LARGE ou SMALL)
    • REMOVE_IN (Ceci annule l’extinction programmée dès qu’un mouvement est détecté).

La méthode REMOVE_IN est la plus propre dans Jeedom pour gérer ce que vous voulez faire (allumer/éteindre sur présence).

1 « J'aime »

Salut,

Je suis d’accord avec @Madcow pourquoi faire du code ? Pourquoi ajouter des variables ?

Bref pourquoi faire quelque chose de plus compliqué que ce que sait faire nativement jeedom avec des scénarios sans code sans valeur ajoutée supplémentaire ?

Et la cerise sur le gateau si je puis dire c’est de faire debugger un truc inadapté par une IA …

1 « J'aime »

Nouvelle fonction ? Ce ne serait pas plutot remove_inat ?

Je partage complêtement l’avis d’ @Aurel et @Madcow : A quoi bon s’embêter avec du code.

Rahh-la-la, sacrées IA, c’est rassurant, il y a encore du taff pour les humains :slight_smile:

1 « J'aime »

bonjour,

c’est vrai je suis d’accord avec vous
avec les fonctions jeedom on peut tout a fait faire la même chose
mais l’ia même imparfaite peut apporter un aiguillage pour les non spécialiste comme moi:rofl:
d’ailleurs l’ia le dit :

Alternative sans bloc code : Vous pouvez aussi faire cela très simplement avec les fonctions natives de Jeedom, ce qui est souvent plus facile à maintenir :

et la c’est pertinent :rofl:

1 « J'aime »

Bonjour

Cette condiftion n’est pas très pertinente, car tu risques d’avoir ta lumière allumée en permanence dès lors qu’il n’y a plus de présence constatée ET que la luminosité est inférieure à 20.

Il est préférable d’allumer SI celle-ci est inférieure à 20 et de l’éteindre en ne se basant que sur l’absence

J’ai un scénario de ce type pour ce genre de capteur, qui le fait avec un seuil de 70 et 5mn avant extinction

Ca pourrait peut-être correspondre à ton besoin

1 « J'aime »

Bonjour,

J’ai la même logique que @dan_73 pour l’allumage/extinction de certains luminaires chez moi. Inutile en effet de passer par un bloc code plus compliqué…

Avec un détecteur de présence, le fonctionnement est conforme à ce qu’on en attend.
J’utilise deux scénarios, avec des déclencheurs différents :

  • Scénario 1 : Allumage

Déclencheur = détection de présence (=1)

Le scénario :

Je teste s’il y a présence à la maison (s’il n’y a personne sensée être à la maison, inutile d’alerter mon cambrioleur ou d’aider le chat :wink:…), et si la luminosité ambiante renvoyée par le détecteur de présence est insuffisante (valeur = ‹ dim ›) ou une fois le soleil couché.
Si oui, j’allume la lumière. J’y ajoute un niveau de luminosité différent en fonction de l’heure, et en final une vérification que la lumière est bien allumée comme prévu.

  • Scénario 2 : extinction

Déclencheur = plus de détection de présence (=0) ET la lampe est allumée

Le scénario :

J’éteins progressivement la lumière sur 30 secondes avant de la passer sur OFF, mais si une présence est détectée pendant ce cycle, je stoppe ce scénario (il ne redémarre que lorsque la détection de présence repasse à 0).

Et ça fonctionne très bien.

1 « J'aime »

Merci pour votre réponse le code fonctionne parfaitement encore merci pour tout

1 « J'aime »

j’ia vous en pris :rofl:

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.