Collecter la date/heure du prochain evenement dans un google agenda (ou plugin agenda)

Bonjour,

Je suis en train de paramétrer Jeedom dans une salle des fêtes. Les réservations se font via le plugin Agenda (ou pourraient se faire via un agenda google classique)
Lors de la présence d’un évènement en cours détecté avec un scénario je bascule automatiquement en mode présence qui ajuste en température de confort la consigne du thermostat. Mais je dois anticiper le chauffage afin d’avoir atteint la température de consigne en début d’évènement.
J’ai tenté d’utiliser la fonction smart-start du plugin thermostat mais je ne parviens pas à l’utiliser probablement suite à un mauvais paramétrage, il me semble complexe. Je gère donc le chauffage via un thermostat « Do It Yourself » à l’aide de scénarios qui fonctionne parfaitement.

Mon objectif à présent est de collecter la date et heure du prochain évènement dans le plugin Agenda à partir de maintenant.

1°) J’ai commencé par tester ce code php dans un scénario :

$id=42; // référence de mon calendrier
$calendar=eqLogic::byId($id);
$scenario->setLog("Calendrier :".$id);
if(isset($calendar))
{
$events=$calendar->getEvents();
} foreach ($events as $event)
{
$scenario->setLog("Evenement ".$event->getName());
}
$scenario->setLog($event->nextOccurrence('start'));
$scenario->setData('VAR_TEST', $event->nextOccurrence('start'));

Qui a pour résultat :

[2023-12-18 22:06:08][SCENARIO] -- Start : Scenario lance manuellement.
[2023-12-18 22:06:08][SCENARIO] - Exécution du sous-élément de type [action] : code
[2023-12-18 22:06:08][SCENARIO] Exécution d'un bloc code
[2023-12-18 22:06:08][SCENARIO] Calendrier :42
[2023-12-18 22:06:08][SCENARIO] Evenement Créneau1
[2023-12-18 22:06:08][SCENARIO] Evenement Créneau2
[2023-12-18 22:06:08][SCENARIO] Evenement Créneau3
[2023-12-18 22:06:08][SCENARIO] 2023-12-21 06:30:00
[2023-12-18 22:06:08][SCENARIO] Fin correcte du scénario

Je n’obtiens pas la date et heure pour le prochain evenement de l’agenda mais pour le dernier.

2°) J’ai rajouté la ligne break pour récupérer la première saisie

$id=42; // référence de mon calendrier
$calendar=eqLogic::byId($id);
$scenario->setLog("Calendrier :".$id);
if(isset($calendar))
{
$events=$calendar->getEvents();
} foreach ($events as $event)
{
$scenario->setLog("Evenement ".$event->getName());
Break;
}
$scenario->setLog($event->nextOccurrence('start'));
$scenario->setData('VAR_TEST', $event->nextOccurrence('start'));

j’ai obtenu la date et heure du prochain scénario

[2023-12-18 22:10:04][SCENARIO] -- Start : Scenario lance manuellement.
[2023-12-18 22:10:04][SCENARIO] - Exécution du sous-élément de type [action] : code
[2023-12-18 22:10:04][SCENARIO] Exécution d'un bloc code
[2023-12-18 22:10:04][SCENARIO] Calendrier :42
[2023-12-18 22:10:04][SCENARIO] Evenement Créneau1
[2023-12-18 22:10:04][SCENARIO] 2023-12-19 06:30:00
[2023-12-18 22:10:04][SCENARIO] Fin correcte du scénario

3°) En testant avec un évènement dans le passé, le code ci-dessus donne plus satisfaction car je constate que le système prend en compte le premier évènement du calendrier mais pas le prochain évènement à partir de maintenant
Il me collecte le premier évènement du calendrier que j’ai positionné dans le passé pour ce dernier test avec l’impossibilité pour le système de récupérer la date et heure de cet evenement.

[2023-12-18 22:12:51][SCENARIO] -- Start : Scenario lance manuellement.
[2023-12-18 22:12:51][SCENARIO] - Exécution du sous-élément de type [action] : code
[2023-12-18 22:12:51][SCENARIO] Exécution d'un bloc code
[2023-12-18 22:12:51][SCENARIO] Calendrier :42
[2023-12-18 22:12:51][SCENARIO] Evenement Créneau1
[2023-12-18 22:12:51][SCENARIO]
[2023-12-18 22:12:51][SCENARIO] Fin correcte du scénario

Pourriez-vous me guider svp pour la mise à jour du code afin de récupérer la date et heure du prochain évènement à partir de maintenant ?

Merciiiiii

Bonjour,
regarde ce vieux post, il devrait répondre à ton besoin:
https://community.jeedom.com/t/recuperer-date-debut-et-fin-dun-evenement/14743

J’ai un besoin complémentaire, je voudrais modifier l’heure de début d’un événement (en fait, je souhaite l’avancer d’une certaine valeur heures-minutes stockée dans un virtuel). Mes compétences en php étant nulles, j’aimerais de l’aide.

Bonjour,

Merci beaucoup j’ai presque réussi en copiant le code du vieux post qui fonctionne très bien.
Par contre, il faut je lui mentionne un nom d’évènement.
Quelle modification de code je devrais apporter pour qu’il ne soit pas contraint avec le nom du prochain évènement ? (TEST2 dans mon code)
Autrement dit, qu’il récupère le prochain événement à venir QUELQUE SOIT LE NOM DE L’EVENEMENT
J’ai essayé beaucoup de variante mais sans succès

$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,

Bonjour,
Le problème est résolu, je vous partage le code qui fonctionne :

$id=62; //ID du calendrier
$events=[];//sert à déclarer que events est un tableau
$calendar=eqLogic::byId($id);
$scenario->setLog(« id du calendrier : ».$id); // Affichage dans les logs de l’id du calendrier

if(isset($calendar)) {
$events=$calendar->getEvents(); // remplissage de la liste des évènements présents dans l’agenda

}

if(isset($events) && is_array($events) && count($events)>0) {
foreach ($events as $event) { // au premier passage dans le foreach, charge le 1er evenement de la liste events dans event

			$nextstart2=$event->getStartDate(); //récupère la date/heure de début pour un évènement donné
			$nextend2=$event->getEndDate(); //récupère la date/heure de fin pour un évènement donné
 
            if ($nextend2 > date('Y-m-d H:i:s')) { // Si la date/heure de fin > date/heure actuelle
              $scenario->setLog("Nom du prochain evenement : ".$EvtName);
              $scenario->setLog("Date et Heure début : ".$nextstart2);
              $scenario->setLog("Date et Heure fin : ".$nextend2);
              break; 
              }
		}
        }

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