Création d'un Listener en double

Hello,

Je n’arrive pas à comprendre pourquoi j’ai des listener qui se crée en double.

Est-ce que quelqu’un voit le problème ?

    $listener = listener::byClassAndFunction('solcast', 'solcast_event', array('solcast_id' => intval($this->getId())));
    if (is_object($info)) {
      log::add('solcast', 'debug', 'isobject yes');
      if (!is_object($listener)) {
        log::add('solcast', 'debug', 'isobject listener no');
        $listener = new listener();
      }
      $listener->setClass('solcast');
      $listener->setFunction('solcast_event');
      $listener->emptyEvent();
      $listener->addEvent($info->getId());
      $listener->setOption(array('solcast_id' => $this->getId()));
      $listener->save();
    }
[2024-10-24 20:15:24] DEBUG  isobject yes
[2024-10-24 20:15:24] DEBUG  isobject listener no

Je ne comprends pas comment passer l’argument « option » pour qu’il ressorte bien un objet c’est affolant :slight_smile:

Bon, j’ai modifié comme ça, ça a l’air mieux mais si quelqu’un a une explication je veux bien

    if (is_object($info)) {
      $listener = listener::searchClassFunctionOption('solcast', 'solcast_event', $this->getId());
      if(count($listener) == 0){
        log::add('solcast', 'debug', 'Création du Listener');
        $listener = new listener();
        $listener->setClass('solcast');
        $listener->setFunction('solcast_event');
        $listener->emptyEvent();
        $listener->addEvent($info->getId());
        $listener->setOption(array('solcast_id' => $this->getId()));
        $listener->save();
      }
    }

Hello,

$listener = listener::byClassAndFunction('solcast', 'solcast_event', array('solcast_id' => intval($this->getId())));

Tu fais un intval sur l’id, donc j’aurait tendance a dire qu’il faut en faire de même sur le setOption

Hello,

Ah j’ai oublié de le retirer avant de poster.

C’est pas ça non, il n’y était pas dans la définition $listener et en cherchant sur Community j’ai vu que Flobul (me semble) avait mis intval donc j’ai essayé mais dans plus de succès.

Cela vient peut-être de deb12 ? pas d’erreur en http.error ?

Rien dans le http.error ni dans le listener

J’ai remis comme ça :

    if (is_object($info)) {
      $listener = listener::byClassAndFunction('solcast', 'solcast_event', array('solcast_id' => $this->getId()));
      if (!is_object($listener)) {
        log::add('solcast', 'debug', 'Création du Listener');
        $listener = new listener();
        $listener->setClass('solcast');
        $listener->setFunction('solcast_event');
        $listener->emptyEvent();
        $listener->addEvent($info->getId());
        $listener->setOption(array('solcast_id' => $this->getId()));
        $listener->save();
      }

Un 2eme listener identique est crée

Bonne journée

Je vient de faire le test en deb12, et j’ai aucun soucis.

Bon j’ai un peu triché pour la simulation, mais c’est équivalent je pense.
j’ai fait la modif dans le cronDaily de solcast que je déclenche par scénario pour effectuer le test :

  /* Fonction exécutée automatiquement tous les jours par Jeedom */
  public static function cronDaily() {
    foreach (eqLogic::byType('solcast') as $solcast) {
      $solcast->testBison(1655);
      break; // only first for test
    }
  }

  /* test - call by cronDaily */
  public function testBison($id) {
    log::add('solcast', 'debug', '┌──:fg-success: testBison :/fg:──');
    $info = cmd::byId($id);
    if (is_object($info)) {
      //listener::removeByClassFunctionAndEvent('solcast', 'solcast_event', '["#1655#"]'); // for delete listener test
      $listener = listener::byClassAndFunction('solcast', 'solcast_event', array('solcast_id' => $this->getId()));
      if (!is_object($listener)) {
        log::add('solcast', 'debug', '| Création du Listener');
        $listener = new listener();
        $listener->setClass('solcast');
        $listener->setFunction('solcast_event');
        $listener->emptyEvent();
        $listener->addEvent($info->getId());
        $listener->setOption(array('solcast_id' => $this->getId()));
        $listener->save();
      } else {
        log::add('solcast', 'debug', '| Listener existant');
      }
    }
    log::add('solcast', 'debug', '└────────────────────');
  }

J’ai exécuté 2x le déclenchement du cronDaily :

0000|[2024-10-25 14:17:00] DEBUG  ┌── testBison ──
0001|[2024-10-25 14:17:00] DEBUG  | Création du Listener
0002|[2024-10-25 14:17:00] DEBUG  └────────────────────
0003|[2024-10-25 14:17:06] DEBUG  ┌── testBison ──
0004|[2024-10-25 14:17:06] DEBUG  | Listener existant
0005|[2024-10-25 14:17:06] DEBUG  └────────────────────

C’est bien beau ce p’tit log !! :heart_eyes:

J’y comprends rien c’est bien pour ça que je demande, c’est vraiment bizarre.

Là c’est dans le postsave d’un équipement mais ça devrait être la même chose

Ah mais j’ai peut-être une piste !!

Ton 1er listener n’aura pas été set en php7 ?
php7 → $this->getId() → renvoi un string → bdd {"solcast_id":"95"}
php8 → $this->getId() → renvoi un integer → bdd {"solcast_id":95}

facile a confirmer, au bout de la 3ème execution, le listener doit être trouvé.

Si, j’avais remarqué aussi les différences de double quote mais depuis j’ai supprimé le listener donc c’est devrait le créer comme il faut non ?

Faudrait supprimer l’ensemble des listener de solcast ?

Normalement en supp les listener il ne devrait plus avoir ce soucis, mais tu as soulevé un point important qu’il faudra prendre en compte lorsque le core basculera en Deb12.

Je tenterai de toutes les supprimer

sinon la solution c’est de forcer le typage, j’ai pas testé mais sa devrait ressembler a un truc comme ca :

$listener = listener::byClassAndFunction('solcast', 'solcast_event', array('solcast_id' => (string)$this->getId()));

$listener->setOption(array('solcast_id' => (string)$this->getId()));

Coucou, et bien ça m’a l’air de marcher au poil ça !
Encore une bien grande idée, bien joué :clap:

1 « J'aime »

Ca doit marcher aussi avec uniquement:

$listener->setOption(array('solcast_id' => intval($this->getId())));

dans le premier post.

Merci David

En effet merci pour la remarque. J’ai pensé la même chose que toi du coup au moment de corriger avec les (string) mais comme à la base on voit des doubles quote quand on était en php7, je me suis dit qu’il fallait mieux conserver ce même principe.

1 « J'aime »

Je pense qu’a la base @Bison utilisait simplement

$listener->setOption(array('solcast_id' => $this->getId()));

Le mieux pour une bonne transition php7->php8, c’est d’utiliser le intval dans le byClassAndFunction et setOption.
Puis faire une fonction dans le plugin install pour transformer les listeners existants de type string.

function solcast_update() {
  log::add('solcast', 'debug', '┌──:fg-success: Typing of listeners :/fg:──');
  $listeners = listener::searchClassFunctionOption('solcast', 'solcast_event');
  foreach ($listeners as $listener) {
    $solcast_id = $listener->getOption('solcast_id');
    if (gettype($solcast_id) === 'string') {
      log::add('solcast', 'debug', '| force intval for listener ' . $listener->getId());
      $listener->setOption(array('solcast_id' => intval($solcast_id)));
      $listener->save();
    }
  }
  log::add('solcast', 'debug', '└────────────────────');
}

Hello,

Yes en effet.

Mais là du coup faudrait que l’équipe de dev donne sont avis sur le sujet histoire de savoir s’il restera à terme de l’int ou du string.

Peut-être @Loic ?

1 « J'aime »

Bonjour,
L’ID est un int(11) dans la bdd…

Bonjour
Le soucis n’est pas jeedom mais plutôt php8 et le typage le mieux c’est de faire un intval partout comme ça plus de soucis