Occurrence d'event dans calendar à la date de Demain

(NB: sujet déplacé dans le Salon Développeurs)

Bonjour, j’ai comme beaucoup d’autres le besoin de savoir si un Event d’un Calendar aura lieu Demain (cas classique, allumer le chauffage la veille si demain on sera là, sous-entendu on arrivera tard dans la soirée de la veille)

j’ai vu plusieurs sujets sur le forum qui n’ont pas abouti.

Après avoir longuement parcouru le code plugin-calendar/core/class/calendar.class.php at beta · jeedom/plugin-calendar · GitHub je viens à l’idée que un bout de code comme celui qui suit pourrait faire l’affaire:

L’idée est de rechercher les occurrences de l’event sur une page de temps qui correspond à demain, et chance, le plugin fournit déjà une fonction qui fait cela (

public static function isTomorrow($_id) {
  $event = calendar_event::byId($_id);
  $startDate = (new DateTime('tomorrow'))->format('Y-m-d H:i:s');
  $endDate = (new DateTime('tomorrow +1 day - 1 second'))->format('Y-m-d H:i:s');
  $results = $event->calculOccurrence($startDate, $endDate);
  return count($results)
}

$_id étant l’id d’un event de calendar (id, pas eqLogic_id sinon il faudrait utiliser byEqLogicId()

Bon attention, calculOccurence() est une grosse fonction récursive donc il ne s’agit pas de faire tourner ça en boucle.

Est-ce que les « expérimentés » en jeedom et Php peuvent donner un avis sur cette proposition ?

NB: je suis débutant en php…

un bloc code de scénario qui teste le principe:

$event = calendar_event::byId(69);
if (!is_object($event)) {
	$scenario->setLog("unkown event");
	return;
}

$startDate = (new DateTime('tomorrow'))->format('Y-m-d H:i:s');
$endDate = (new DateTime('tomorrow +1 day - 1 second'))->format('Y-m-d H:i:s');
$scenario->setLog($startDate);
$scenario->setLog($endDate);

$results = $event->calculOccurrence($startDate, $endDate);
$scenario->setLog($results);

if (count($results) == 0) {
  $scenario->setLog("pas d'occurence");
} else {
  $scenario->setLog( count($results) . " occurence(s)");
  for ($i = 0; $i < count($results); $i++) {
    $scenario->setLog($results[$i]['start']);
    $scenario->setLog($results[$i]['end']);
  }
}

Bonjour,

Alors si c’est pour une proposition de PR :

Je ne pense pas que se soit au plugin d’intégrer cette nouvelle fonction car elle ne lui sera pas utile, et comme de toute façon il faudra monter un scénario pour atteindre cette nouvelle fonction, autant que celle-ci reste dans le bloc code de l’user.
Car si on va dans ce sens, on pourrait tout aussi bien faire une fonction isMonday…

Si c’est pour du partage :

Pas grand chose a ajouter, sauf que c’est déja pas mal pour un « débutant » :wink:

Peut-être remplacé $scenario->setLog($results); par
$scenario->setLog(json_encode($results));

Et aussi ajouter un tag (ex: isTomorrow) qui permettrait de savoir si la recherche est positive hors du bloc code par l’user.

1 « J'aime »

Merci @Phpvarious , en effet je m’interroge sur la « meilleure » façon de mettre cela à disposition du plus grand nombre d’utilisateurs.

Il faudrait en effet que des « non développeurs » puisse l’utiliser facilement dans une clause « SI » d’un scénario.

c’est pour cela que j’avais d’abord imaginé une commande action sur l’objet Calendar genre [MonCalendrier][isTommorow] en le nom de l’event en paramètre.
Par exemple, moi j’utilise régulièrement la commande EnCours dans mes scénarios:

J’ai vu aussi que je pourrai mettre ma fonction dans /data/user.function.class.php. et du coup ce serait plus facile de l’utiliser dans un scénario comme dans cet exemple de @kiboost

Pour mon usage personnel ce serait ok, mais pour le rendre disponible à d’autres utilisateurs c’est moyen.

Est-ce qu’il y aurait d’autres moyens plus malins de mettre à disposition des non devs ?

Sinon, en effet je ne vais pas me lancer dans une PR avant d’en parler avec les mainteneurs du repo GitHub - jeedom/plugin-calendar , je ne connais pas du tout assez le plugin pour juger si c’est une bonne idée.

Pour information, quand des utilisateurs m’ont demandé d’ajouter cette fonction dans les calendriers importés d’un format ics pour mon plugin plugin-import2calendar, j’avais testé cette fonction intégrée au plugin agenda, mais sur certains événements aucune remontée n’était faite.

J’ai donc procédé différemment et créé une nouvelle fonction dans mon plugin.

Jusqu’à présent, je ne le faisais que pour les agendas créés par mon plugin, j’ai ajouté une option pour que ce soit fait sur tous les agendas existants.


Ensuite tu as juste a utiliser les commandes dans ton scénario.

1 « J'aime »

Oh! excellent! @sagitaz je me demande pourquoi mes recherches dans le forum (eg si on recherche « demain calendar ») n’ont rien trouvé (je trouve maintenant en mettant explicitement le tag:plugin-import2calendar).

j’ai regardé rapidement ton GitHub - sagitaz/import2calendar: to convert ical to calendar jeedom et je comprend que tu mets à jour sur cron chaque jour les commandes info des calendriers avec une donnée comparable à celle de EnCours, ie la liste des events concernés ; et que donc ça permet de faire un test « matches » dans le bloc SI d’un scénario, trop bien!

Evidemment ce serait mieux si c’était dans Calendar lui même, mais vu que tu as testé et qu’on dirait qu’il y avait des effets de bords, pour avoir lu le code qui est quand même assez costaud je comprend les précautions sur un plugin qui est TRES utilisé

Peut-être on pourrait quand même faire une PR que tu suggères ici parce que c’est pas cool que calendar efface tes commandes info

UPDATE: j’ai installé la beta de plugin-import2calendar, ça marche parfaitement!

1 « J'aime »

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