Récupérer les différents calendriers cochés + les événements des x prochaines semaines

Bonjour, j’ai configuré avec succès le plugin Google Agenda !
J’ai alors coché les 2 calendriers à surveiller.

J’aimerais récupérer dans un bloc code les calendriers cochés + les événements correspondants des 4 prochaines semaines (comme je l’ai fait pour le plugin « Agenda » non Google)
Mais ce plugin :

  • Cumul tous les événements de tous les calendriers cochés
  • Permet de lister les événements du jour et du lendemain, sans détail (date de début, date de fin …)

[EDIT]Une bonne soirée de dev et j’ai réussi à faire ce que je voulais
Je mets donc le code, ça peut servir à quelqu’un.
Il me reste plus qu’à trouver le nom du calendrier, parce que l’ID sur 50 caractères c’est moyen :slight_smile:

Voici mon code :

$tags = $scenario->getTags();
$current_month = date('m');

$gcalendar = eqLogic::byId($tags['#calid#']); // Récupération de l'ID de l'agenda Google en paramètre
$calindex = 0;

if(isset($gcalendar)) {
  
  // Liste des calendriers sélectionnés
  $calendarList = $gcalendar->getConfiguration('calendars');
  
  foreach ($calendarList as $calendarId => $value){
	if ($value == 0) {
		continue;
	}
    
    // Variable test pour chaque calendrier
    $calindex += 1;
    $var = "read_calendar_test_" . $calindex;
    $calendarStr = "";
    
	try {
      	$eventsG = getEvents4weeks($gcalendar, $calendarId); 
      	$events = array();
      
      	// Lecture des occurences ... et regroupement par événement du même nom
		foreach ($eventsG as $eventG) {
          	$event = array();
          	$event['start'] = (isset($eventG['start']['date'])) ? $eventG['start']['date'] : date('Y-m-d', strtotime($eventG['start']['dateTime']));
          	$event['end'] = (isset($eventG['end']['date'])) ? $eventG['end']['date'] : date('Y-m-d', strtotime($eventG['end']['dateTime']));
          	$events[$eventG['summary']][] = $event;
		}
      
      	// Lecture des événements
      	foreach ($events as $evenement => $occurences) {
          
     		if(count($occurences) > 0){
     			if($calendarStr != "") $calendarStr .= '||';
     			$calendarStr .= $evenement.'|'.count($occurences);
     		}
          
          	// Tri des occurences par date
          	asort($occurences);
          
          	// Lecture des occurences de chaque événement + mise en forme
     		foreach ($occurences as $occurence){
				$start = date_create($occurence['start']);
       			$startStr = date_format($start, 'd/m');
       			$startMonth = substr($startStr, -2);
       
        		$end = date_create($occurence['end']);
       			$endStr = date_format($end, 'd/m');
        		$endMonth = substr($endStr, -2);
 
 				if($current_month == $startMonth && $startMonth == $endMonth){
        			$startStr = substr($startStr,0,2);
            		$endStr = substr($endStr,0,2);
        		}
 
       			$calendarStr .= '|'.$startStr;
       			if($endStr != $startStr)
       				$calendarStr .= '-'.$endStr;
     		}
          
        }
      
      	// Variable test pour chaque calendrier
      	$scenario->setData($var, $calendarStr);
      
	} catch (Exception $e) {
		log::add('gCalendar', 'error', __('Erreur sur : ', __FILE__) . $calendarId . ' => ' . $e->getMessage());
	}
    
  }  

}
else {
  $calendarStr = "Non trouvé";
}

// Commande info cible
if($tags['#calinfo#'] == 'test'){
	$scenario->setData("read_calendar_test", $calendarStr);
}
else{
	$cmd = cmd::byId($tags['#calinfo#']);
	$cmd->event($calendarStr);
}

// Lectures des événements pour les 4 prochaines semaines
function getEvents4weeks($gcalendar, $_calendarId) {
	$result = $gcalendar->request('GET', '/calendars/' . $_calendarId . '/events?singleEvents=true&timeMin=' . urlencode(date(DATE_RFC3339)) . '&timeMax=' . urlencode(date(DATE_RFC3339, strtotime('+4 weeks'))));
	return (isset($result['items'])) ? $result['items'] : array();
}

Voici le rendu dans un design :

1 « J'aime »

Bonjour sACLe,
Intéressant :slight_smile:
Tu l’insères dans un bloc « code » ?
Si oui peux tu me dire comment tu l’utilises pour pouvoir le mettre dans ton désign et comment interagir avec pour lancer une action ?
D’avance merci

Bonjour,

Oui dans un bloc code. Maintenant j’en ai même 3.

  • Un scénario en bloc code qui sert de fonction pour lire un agenda dans le plugin officiel et stocke le résultat dans une info virtuelle (tag d’entrée : id du calendrier et id du virtuel)

  • Un scénario en bloc code qui sert de fonction pour lire un agenda Google et stocke le résultat dans des variables au nom gcal_[id_objet_calendrier_google]_[Nom du calendrier google] (tag d’entrée : id du calendrier)

  • Et mon 3ième scénario : appelle les fonctions citées plus haut, et récupère les variables gcal_* vers un virtuel


    → Ce scénario est déclenché chaque nuit à 00h15

Le résultat est un virtuel avec 1 info pour chaque calendrier à afficher


J’ai stocké les informations de cette manière :
[Evénément] | [Nombre d’occurences] | Dates …
Exemple : Poubelles|4|20|27|04/10|11/10
Chaque info a un paramètre widget « cal_icon » pour définir l’icone qui sera affiché dans le widget

Ensuite les plugins découpent ces chaines pour l’affichage :
Capture3

Au niveau du widget, c’est transparent si la source est un calendrier du plugin officiel ou du plugin Google Calendar

… et le widget est inclut tel quel dans le design

Ca fait un peu usine à gaz mais ça marche bien :slight_smile:

Merci pour ta réponse, je vais regarder ça de plus près. C’est très intéressant. Merci

Bonjour @sACLe,

Merci pour ce tuto, il fonctionne vraiment parfaitement ! J’ai téléchargé le plugin, créé mon virtuel, collé le code et… tadaaam tout roule :slight_smile:

J’ai juste une petite question supplémentaire, comme tu as l’air de bien manipuler le code php, est ce que tu penses qu’il y a moyen de récupérer l’heure des évènements aussi ? J’aimerais les afficher à côté des dates.

Merci d’avance,

Thomas

Bonjour @ThomasRomPe

Désolé pour le temps de réponse, j’ai toujours du mal à voir les notifications Jeedom.

Oui je pense que tu peux récupérer l’heure. Tu utilises un calendrier Jeedom ou Google Calendar ?

Si Google, il faut que tu modifies le format :

date('Y-m-d', strtotime($eventG['start']['dateTime']))

En :

date('Y-m-d H:i:s', strtotime($eventG['start']['dateTime']))

par exemple

1 « J'aime »

Après quelques jours de bidouillages, c’est ce que j’avais fini par faire et ça avait fonctionné !

Pas de soucis pour le retard et merci pour ta réponse @sACLe :slight_smile:

1 « J'aime »

Salut @sACLe,

Merci beaucoup pour ton partage.
Je m’en suit fortement inspiré pour récupérer des infos en particulier dans mon Google Agenda.

J’ai juste un blocage pour transformer/découper ma valeur de retour (du même format que toi: [Evénément] | [Nombre d’occurences] | Dates …) vers ce type de résultat:
Capture3

Peut-être peux-tu m’expliquer succinctement comment tu as fait ? Ou un Screenshot me permettant de comprendre comment tu as fait ?

Merci d’avance :grin:

Effectivement il manque ici toute la mise en forme, qui est faite dans un widget.

Si tu as fait comme moi, le virtuels contients les différentes informations séparées par des " | "

Dans la partie script du widget, je découpe la valeur de l’équipement avec ces " | " et je pars du principe que je trouverai :
En première position, le nom de l’événement (ici « Poubelles »)
En seconde position, le nom d’occurrences
Puis chaque date, je dois en trouver aucun que le nombre d’occurrence

A noter aussi que je peux choisir l’icone affichée à gauche (ici une maison)
Le widget attend un paramètre #cal_icon# et va chercher l’image ici :
data/customTemplates/dashboard/cmd.info.string.V4_Design_Calendrier_Mois/#cal_icon#.png

Pour renseigner le paramètre, ça se passe dans le virtuel, section « Paramètres optionnels widget » :

<div class="cmd cmd-widget widget_design_cal" data-type="info" data-subtype="string" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#">
  <div class='cal_img_#id#'></div>
  <div class='cal_events_#id#'>CONTENT</div>
</div>
<style>
  .widget_design_cal{
    display:grid;
    grid-template-columns: 60px 250px;
    min-height:50px;
  }
  .cal_img_#id#{
    height:100%;
    background-image: url("data/customTemplates/dashboard/cmd.info.string.V4_Design_Calendrier_Mois/#cal_icon#.png");
    background-position:center;
    background-size: 50px 50px;
    background-repeat: no-repeat;
  }
  .cal_events_#id#{
  	align-items: flex-start;
  	display: flex;
    flex-direction: column;
  	justify-content: center;
    padding-left:10px;
  }
  .cal_event_#id#{
    border-radius: 30px;
    background-color:rgba(255, 255, 255, 0.5);
    color:black;
    margin:3px 0px;
    padding:0px 5px;
  }
  .cal_event_#id# .cal_event_name{
    font-style:bold;
    font-size:14px;
  }
  .cal_event_#id# .cal_occur{
    font-size:10px;
    background-color:rgba(0, 0, 255, 0.5);
    border-radius: 10px;
    padding:0px 5px;
    margin:0px 3px;
  }
</style>
<script>
jeedom.cmd.update['#id#'] = function(_options){
  	var tab_events = _options.value.split('||');
    
  	$('.cal_events_#id#').empty();
  
	tab_events.forEach((event) => {

      // Pour chaque événement, ajouter une ligne
      
      var tab_param = event.split('|');
      
      var event_name = tab_param[0];
      var event_nb = tab_param[1];
      
      var event_html = "<div class='cal_event_#id#'><span class='cal_event_name'>"+event_name+"</span><wbr>";
      for (let i = 0; i < event_nb; i++) {
      	event_html += "<span class='cal_occur'>"+tab_param[2+i]+"</span>";
      }
      event_html += "</div>";
      
      $('.cal_events_#id#').append(event_html);
      
	});
  
}
jeedom.cmd.update['#id#']({value:'#state#'});
</script>
  1. Sur ton virtuel
1 « J'aime »

Merci pour ton retour rapide !

Je vais tester cela de ce pas :slightly_smiling_face:

1 « J'aime »