Adaptation code php pour Jeedom Domotique plugin Agenda

Bonjour,

Je souhaite récupérer, via un code php, le prochain evenement à venir donc à partir de maintenant dans un agenda (plugin Agenda de Jeedom appli domotique) pour piloter le chauffage…

J’ai récupéré le code ci-après, il fonctionne mais il me contraint à préciser le nom de l’évènement dans le code (TEST2). Si j’enlève les lignes de codes pour ne plus préciser le nom de l’evenement recherché, il me récupère le premier evenement chrono de mon agenda.

Voici le premier code initial :

$id=42; //ID du calendrier
$event_names= ["TEST2"];//Noms des événements séparés par des virgules
$events=[];
$calendar=eqLogic::byId($id);
$scenario->setLog(« id : ».$id);

if(isset($calendar)) {
$events=$calendar->getEvents();
}

if(isset($events) && is_array($events) && count($events)>0) {
foreach ($events as $event) {
foreach ($event_names as $event_name) {
if($event->getName() == $event_name)
{
$EvtName=str_replace(" « , »_« ,$event->getName());
$nextstart=$event->nextOccurrence(‹ start ›);
$nextend=$event->nextOccurrence(‹ end ›);
$scenario->setLog(« Check ID= ».$event->getID(). » : « .$EvtName);
$scenario->setData($EvtName. »_start", «  »);
$scenario->setData($EvtName.« _stop », «  »);
if(isset($nextend))
{
$nextstart=(isset($nextstart)) ? $nextstart : « En cours »;
$scenario->setData($EvtName.« _start », $nextstart);
$scenario->setData($EvtName.« _stop », $nextend);
$scenario->setLog("Next : « .$EvtName. » « .$nextstart. » to ".$nextend);
unset($event_names[array_search($event_name,$event_names)]);
}
break ;
}
}
}
}

Si je lui spécifie le nom de l’évènement (premier code ci-dessus), il me récupère bien le prochain à partir de maintenant moyennant le nom de l’evenement qui est une contrainte car il ne sera pas fixe à l’usage. Si je ne précise pas le nom de l’évènement (deuxième code ci-après), il me récupère le premier évènement de mon agenda.

VOici le deuxième code :

$id=42; //ID du calendrier
$events=[];
$calendar=eqLogic::byId($id);
$scenario->setLog("id :".$id);

if(isset($calendar)) {
    $events=$calendar->getEvents();
}

if(isset($events) && is_array($events) && count($events)>0) {
    foreach ($events as $event) {

                  $EvtName=str_replace(" ","_",$event->getName());
                $nextstart=$event->nextOccurrence('start');
                $nextend=$event->nextOccurrence('end');
                $scenario->setLog("Check ID=".$event->getID()." : ".$EvtName);
                $scenario->setData($EvtName."_start", "");
                $scenario->setData($EvtName."_stop", "");
                if(isset($nextend))
                {
                    $nextstart=(isset($nextstart)) ? $nextstart : "En cours";
                    $scenario->setData($EvtName."_start", $nextstart);
                    $scenario->setData($EvtName."_stop", $nextend);
                    $scenario->setLog("Next : ".$EvtName." ".$nextstart." to ".$nextend);
                    unset($event_names[array_search($event_name,$event_names)]);
                }
                break ;
            }
        }

Le résultat pour mon premier code est :

[2023-12-30 10:27:19][SCENARIO] -- Start : Scenario lance manuellement.
[2023-12-30 10:27:19][SCENARIO] - Exécution du sous-élément de type [action] : code
[2023-12-30 10:27:19][SCENARIO] Exécution d'un bloc code
[2023-12-30 10:27:19][SCENARIO] id :42
[2023-12-30 10:27:19][SCENARIO] Check ID=28 : TEST3
[2023-12-30 10:27:19][SCENARIO] Check ID=32 : TEST3
[2023-12-30 10:27:19][SCENARIO] Next : TEST3 2023-12-31 09:30:00 to 2023-12-31 10:30:00
[2023-12-30 10:27:19][SCENARIO] Fin correcte du scénario

il me détecte bien tous les évènements de mon agenda intitulés « TEST3 » mais sur la ligne Next en résultat, il me ressort bien uniquement le prochain à partir de maintenant (ID évènement 32)

Le résultat pour le deuxième code est :

[2023-12-30 10:27:44][SCENARIO] -- Start : Scenario lance manuellement.
[2023-12-30 10:27:44][SCENARIO] - Exécution du sous-élément de type [action] : code
[2023-12-30 10:27:44][SCENARIO] Exécution d'un bloc code
[2023-12-30 10:27:45][SCENARIO] id :42
[2023-12-30 10:27:45][SCENARIO] Check ID=28 : TEST3
[2023-12-30 10:27:45][SCENARIO] Fin correcte du scénario

Il me récupère le premier évènement de mon agenda intitulé « TEST3 » (Evenement ID28) alors que le prochain evenement à partir de maintenant est l’evenement « TEST3 » également mais avec l’ID32. De plus, je n’ai plus la ligne Next en résultat.

Je ne comprend pas pourquoi il me sort plus la ligne Next ?

Il faudrait que je précise en code la notion de recherche « à partir de maintenant » mais mes compétences et connaissance en PHP sont bien insuffisantes malheureusement, j’ai tenté de nombreux tests depuis des semaines sans succès.

Je ne suis pas sûr que ce soit le meilleur endroit pour obtenir de l’aide sur PHP mais sait-on jamais.

Sinon, les forums Jeedom sont généralement très actifs et y a pas mal de développeurs PHP.

1 Like

Bonjour,

s’il n’est pas trop tard, voici ce que je propose pour corriger ton code.

Dans la version 2, après la ligne commençant par « foreach », ajoute la ligne :

if ($event->nextOccurrence('start') < date("Y-m-d H:i:s")) continue;

Sans garantie bien sûr, je ne peux pas tester sans disposer du même environnement que toi.

Quelques explications…

Dans la première version, après une première boucle foreach qui parcourt tous les événements de l’agenda, une seconde boucle foreach compare tous les noms sélectionnés avec le nom de l’événement courant. Si ça correspond, on traite l’événement en question puis on sort de cette seconde boucle par un break (inutile d’examiner les autres noms) et on poursuit la première boucle pour examiner les événements suivants.

On voit ainsi dans ton premier résultat tous les événements qui ont pour nom TEST3 :

  • d’abord l’ID=28, avec une ligne Check mais pas de ligne Next, probablement parce que cet événement n’a pas d’attribut nextend (il y a un test : if(isset($nextend)) )

  • puis l’ID=32, avec son Check et son Next.

Dans la deuxième version, tu as supprimé la deuxième boucle qui teste les noms, mais tu as laissé le break final : celui-ci s’applique donc maintenant à la première boucle, celle qui énumère les événements. Tu vois donc s’afficher le premier événement ID=28 (avec, comme précédemment, un Check mais pas de Next), puis la boucle se termine avec le break sans examiner d’autres événements.

La correction que je te propose consiste à vérifier si la date de début de l’événement est avant ou après la date actuelle. Si elle est avant, on passe directement à l’événement suivant sans traiter celui-ci. Dès qu’on rencontre un événement dont la date de début est dans le futur, on le traite normalement puis on s’arrête (le break est toujours là). Je pense que ça correspond bien à ce que tu veux faire.

Si ça ne marche pas ou si ce n’est pas exactement ce que tu voulais, dis-le et je tenterai de faire mieux :slight_smile:

Coopérativement,
Nic