Code php pour récupérer un evenement agenda Jeedom

Arnaud76480 Messages postés 3 Date d'inscription vendredi 29 décembre 2023 Statut Membre Dernière intervention 30 décembre 2023 - Modifié le 29 déc. 2023 à 22:13
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 31 déc. 2023 à 13:27

Bonjour,

J'ai utilisé ce code php pour récupérer la date et heure du prochain evenement dans le plugin Agenda de Google (Application domotique)

Ce code fonctionne très bien mais il me récupère l'evenement seulement si son nom est TEST2. Or, c'est une contrainte pour moi je souhaiterai qu'il récupère le prochain evenement quelque soit son nom.

Il s'agit de la ligne : 

$event_names= ["TEST2"];

Comment dois-je écrire la ligne de code pour qu'il me prenne tout type de nom?  J’ai essayé beaucoup de variantes mais sans succès

Par exemple : $event_names= [" **** "]; ou avec des % pour lui dire n'importe quel caractère...

Voici mon code : 

$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 ;
}
}
}
}

Merci,

4 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
30 déc. 2023 à 08:13

Bonjour

Tout d'abord merci à @Karamel d'avoir mis la coloration syntaxique, cela rend ton code plus lisible et donc augmente tes chances qu'un bénévole ne le lise.

Voir https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code pour tes prochains post.

Ensuite, et toujours pour la lisibilité, pense à indenter ton code, ça permet de repérer facilement les blocs.

Enfin, je ne code pas en PHP, mais comme personne ne t'as répondu depuis hier après midi, je me permets une analyse à défaut d'une solution.

Ton code est entièrement tourné vers la recherche d'événements qui ont un nom prédéfini, ce n'est pas juste la ligne 2 qui entre en ligne de compte,

Déjà le commentaire donne une piste, les noms à chercher sont séparés pas des virgules. Donc on peut chercher plusieurs événements.

A la ligne 13, on voit un foreach sur la liste de noms, comme il y a un foreach juste au dessus sur la liste d'événements, on s'attend à ce qu'il y ait une comparaison entre les 2.

Ce qui est fait à la ligne 14, où l'on cherche l'événement dont le nom est exactement celui de la liste à rechercher.

Si tu veux chercher n'importe quel événement, il faut enlever

  • la liste des noms à rechercher,
  • le foreach sur cette liste
  • le if qui compare le nom des événements aux noms de la liste à rechercher 

0
Arnaud76480 Messages postés 3 Date d'inscription vendredi 29 décembre 2023 Statut Membre Dernière intervention 30 décembre 2023
30 déc. 2023 à 10:16

Bonjour, 

Merci beaucoup en tout cas d'avoir répondu !! C'est une bonne analyse, je vais regarder

Merci encore, 

Arnaud

0
Arnaud76480 Messages postés 3 Date d'inscription vendredi 29 décembre 2023 Statut Membre Dernière intervention 30 décembre 2023
Modifié le 30 déc. 2023 à 19:54

Je viens de tester, le code fonctionne mais au lieu de me récupérer le prochain évènement à partir de maintenant, il me récupère le premier évènement de mon agenda. Suivant vos préconisation, le code est devenu le suivant : 

$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 ;
            }
        }

Donc, au final, si je lui spécifie le nom de l'évènement (premier code), il me récupère bien le prochain à partir de maintenant. Si je ne précise pas le nom de l'évènement (deuxième code suivant vos préconisations), il me récupère le premier évènement de mon agenda.

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 (vos préconisations) 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.

Merci à vous pour votre aide, 

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
30 déc. 2023 à 16:53

Je t'ai demandé d'utiliser la coloration syntaxique pour poster ton code.

Et comme, je te l'ai dit, je ne code pas en PHP. Mais dans le code d'origine, il ne semble rien qui spécifie une date ultérieure.

Par contre, il me semble (sans l'indentation pas certain) que le break (qui stoppe le foreach) était dans le if qui testait les noms.

Je pense qu'il faut l'enlever 


0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 déc. 2023 à 08:14

A la réflexion, il faudrait remplacer le if qui cherche un nom, par un if qui cherche une date ultérieure

  • Si les événements sont triés par date, on sort du foreach grace au break dès la première occurrence 
  • Sinon, il faut que le if cherche une date ultérieure moins éloignée que celle précédemment trouvée et donc il faut aller au bout du foreach dans ce cas pas de break et il faut une date fictive au début pour commencer 
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344 > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
31 déc. 2023 à 13:27

Bonjour

l'API Google calendar permet de filtrer les recherches par rapport à une date min.

https://developers.google.com/calendar/api/v3/reference/events/list?hl=fr

0
Rejoignez-nous