Comment copier les évenements du calendrier ICS dans le plugin agenda de Jeedom pour bénificier du smart start du plugin thermsostat

Bonjour

Daens le plugin ICS on peut faire des actions sur évenements pour lancer des actions avant, apres ou à la fin de l’évenement. Par exemple lancer un chauffage lors d’un évenement. Seul hic on ne bénéficie pas de la fonction ‹ smart start › du plugin « Thermostat » puisque celui ci est relié au plugin « Agenda » qui permet d’anticiper le changement de consigne pour que la température soit atteinte à l’heure programmée. Alros que dans le cadre de l’action différée du plugin ICS on a quelque chose de fixe.

Donc l’idée serait de créer un évenement dans le plugin de l’AGENDA de JEEDOM à partir des données du calendrier externe ICS.

Avez vous une idée de comment procéder ?

Personnellement j’utilise un scénario pour copier mes évènement ICS dans l’agenda.
Mais bon c’est un scénario un peu costaud en PHP…

oui je me doute, tu peux partager ton bloc code ?

Ca fait des années que j’ai pondu ce scénario, il n’est pas beaucoup documenté.
Il faudrait que je me replonge dedans pour le commenté mais pas eu le temps là, désolé.

En gros c’est un calendrier de garde partagée géré sur Google Agenda, donc récupéré au format ICS.
A partir de là, je fais passer cette moulinette pour que çà s’importe dans l’agenda du plugin Jeedom.

foreach (eqLogic::byString("#[Agenda][Mathys]#")->getEvents() as $event) {
  if ($event->getName() == "Papa") $event_Father = $event;
  if ($event->getName() == "Maman") $event_Mother = $event;
}
$includeDate_Father = explode(",", $event_Father->getRepeat('includeDate'));
$includeDate_Mother = explode(",", $event_Mother->getRepeat('includeDate'));

$add = function($date, &$includeDate) use (&$changed) {
  if (($key = array_search($date, $includeDate)) === false) {
    array_push($includeDate, $date);
    rsort($includeDate);
    $changed = true;
  }
};

$remove = function($date, &$includeDate) use (&$changed) {
  if (($key = array_search($date, $includeDate)) !== false) {
    unset($includeDate[$key]);
    $changed = true;
  }
};

$today = cmd::byString("#[Agenda][Garde : Papa][Today]#")->execCmd();
$tomorrow = cmd::byString("#[Agenda][Garde : Papa][Tomorrow]#")->execCmd();
$afternoon = (date("H") >= 12);

// Récupération de Mathys le lendemain
if (!$today && $tomorrow && $afternoon) $today = true;
// Départ de Mathys le lendemain
if ($today && !$tomorrow && $afternoon) $today = false;

$array = [
  date("Y-m-d") 						=> $today,
  date("Y-m-d", strtotime("tomorrow")) 	=> $tomorrow
];

foreach ($array as $date => $status) {
  if (boolval($status)) {
    $add($date, $includeDate_Father);
    $remove($date, $includeDate_Mother);
  }
  else {
    $add($date, $includeDate_Mother);
    $remove($date, $includeDate_Father);
  }
}

if (isset($changed)) {
  $scenario->setLog("[INFO] Mise à jour de l'agenda");
  
  $includeDate_Father = array_slice($includeDate_Father, 0, 30);
  $includeDate_Father = trim(implode(",", array_unique($includeDate_Father)), ",");
  $event_Father->setRepeat("includeDate", $includeDate_Father);
  $event_Father->save();

  $includeDate_Mother = array_slice($includeDate_Mother, 0, 30);
  $includeDate_Mother = trim(implode(",", array_unique($includeDate_Mother)), ",");
  $event_Mother->setRepeat("includeDate", $includeDate_Mother);
  $event_Mother->save();
}

MErci pour le scénario je l’ai adapté à mon besoin sur mon agenda.

En revanche des que je le fait tourner j’ai ce message dans les logs :

[2023-12-02 10:15:25][SCENARIO] -- Start : Scenario lance manuellement.
[2023-12-02 10:15:25][SCENARIO] - Exécution du sous-élément de type [action] : code
[2023-12-02 10:15:25][SCENARIO] Exécution d'un bloc code 
[2023-12-02 10:15:25][SCENARIO] Call to undefined method ics::getEvents()

Je suis sur Jeedom Core 4.3.20 sur LUNA debian 11.8 je pense que cela doit venir de là dès la premiere ligne.

Je ne pense pas que ce soit la cause, quelque soit le hardware que tu utilises un plugin est sensé avoir le même comportement.

Je pense que c’est parce que tu pointe pas sur la bonne ressource.
Dans mon scénario :
#[Agenda][Mathys]# est un équipement de type plugin Agenda.
#[Agenda][Garde : Papa][Today]# est un équipe de type ICS, un sous type évènement plus précisément.