Avant même de parler du code, je pense que ce serait bien qu’on se mette d’accord sur ce qu’on veut au niveau de la feature, car pour moi il y a plein de façon de faire ça, et c’est pas une feature simple:
Typiquement, le trigger “évènement démarre” est utile, mais souvent ce qu’on veut c’est “evènement démarre dans 5/15/30 minutes” (si tu veux recevoir un reminder 15 minutes avant de partir à un rendez-vous pas exemple). Sachant que c’est un paradigme très différent, ça va changer énormément l’implémentation (vu qu’il faut programmer chaque trigger et pas chaque event), donc il faut y penser avant.
Au niveau de la sélection de l’évènement, ça marche comment ? Il y a une liste et tu sélectionne un évènement dans la liste ? Tu prend tous les évènements qui contiennent cette string ? A mon avis il y a une vrai réflexion à avoir là-dessus, ça peut-être utile d’avoir un trigger qui se déclenche sur un évènement précis, ou sur un match d’un texte précis, dans tous les cas il faut que ce soit clair dans l’UI.
Désolé si je pose beaucoup de questions, c’est une feature vraiment sympa et si on veut répondre au besoin de tout le monde il faut se poser les questions avant !
Merci en tout cas d’avoir commencé le développement @Romuald_Pochet, c’est du beau boulot en tout cas
En effet, la feature est bien sur incomplete! J’ai juste démarrer les développements de quoi également rentré dans le coeur de Gladys (et surtout la partie UI) N’est-ce pas une bonne manière de travailler?
Le reminder est géré via le reminder donné par CalDav. Mais il faudrait mettre à jour le modèle de donnée “calendar_event” pour inclure la valeur; On pourrait aussi spécifier le reminder lors de la création de la scène et donc on crée le déclencheur lors de la création de la scène. Mais dans ce cas, on perd le déclenchement hors scene par ex. une notification sur l’UI ou Telegram.
“Savoir récupérer des info pour des conditions d’événements”: a faire
La condition actuelle ‘user’ + ‘calendrier’ + ‘evenement’, où ‘évènement’ est une expression régulière (ex. condition Papa/maman marche pour Papa, Maman Papa/maman, j’avoue c’est assez spécifique à mon besoin)
Les droits ne sont pas gérés et ca me semble en effet assez complexe.
Aucun problèmes il n’y avait rien de négatif dans mon message !!
ça justement ça se débat, à mon avis c’est plus un truc qu’on voudrait gérer dans la scène plutôt que dans le calendrier, car typiquement on pourrait vouloir plusieurs scènes qui se déclenche sur le même event, exemple:
30 minutes avant le rendez-vous, m’envoyer une notif Telegram
15 minutes avant, si je n’ai pas quitté la maison, diffuser un son dans la maison
5 minutes avant, faire flasher toutes les lumières du salon !
A mon avis, la programmation doit être spécifiée dans le trigger plus que dans le calendrier, c’est d’ailleurs plus simple à comprendre en terme d’UX je pense.
Là dessus, il faut peut-être proposer plusieurs cas:
Sélection d’un évènement précis (est-ce que c’est utile?)
Evènement dont le titre contient ce texte (et là dessus, il faut être clair dans l’UI, le mot « regex » n’est pas une évidence pour tout le monde )
Je pense qu’il faut que la discussion avec @bertrandda continue avec ce développement en tête pour qu’on puisse justement faire un truc qui soit cohérent dans l’ensemble
C’est le but
En tout cas bravo pour le premier développement, c’est top ! Mes remarques ne sont qu’à but positif, l’objectif c’est surtout d’avancer!
Cette fonctionnalité étant assez demandée, et comme je viens de merger une PR qui débloque ce comportement, j’ai travaillé sur une petite spécification fonctionnelle pour qu’on puisse au moins être d’accord sur le fonctionnement souhaité (c’est le plus dur ).
Spécification fonctionnelle pour le déclencheur de scène
Je propose un déclencheur dans les scènes qui pourrait se configurer de la façon suivante :
Possibilité de déclencher une scène si un évènement quelconque d’un calendrier arrive dans XX minutes/heures/jours. Possibilité de sélectionner un ou plusieurs calendrier. Le calendrier doit être un calendrier partagé, car les scènes sont partagées au sein d’une instance.
Possibilité d’ajouter une condition sur le titre de l’évènement. Ex: est exactement “cours de musique”, contient “piscine”, contient “travail”, contient “école”, commence par “Cours”, fini par “volley”.
Le déclencheur s’exécute à l’avance par rapport à la date de début ou de fin de l’évènement : 10 minutes avant, 1 heure avant, 1 jour avant. La granularité la plus fine est la minute. Il est possible de mettre 0 minutes pour être prévenu à l’heure de début/fin de l’évènement
Spécification fonctionne pour la condition dans les scènes
Pour la partie conditionnelle dans les scènes, l’idée est de pouvoir continuer ou interrompre une scène si un évènement dans un/plusieurs calendrier donné répond à une condition et est en cours.
Exemple:
Si un mouvement est détecté
Qu’il y a un évènement dans le calendrier qui est en cours qui dit que je suis au travail
Pour info, j’ai commencé les développements, pour l’instant uniquement sur le déclencheur de scène.
La partie backend est quasiment finie, je bosse sur le frontend là.
@bertrandda J’ai du changer un peu la requête de GET /calendar, en gros il me fallait une option pour aller chercher uniquement les calendriers partagées (et pas les miens privées), du coup j’ai rajouté 3 cas :
Pas de paramètres fournie → tous les calendriers que je peux voir (privée à moi + partagés)
shared = true → Que les calendriers partagés
shared = false → Que mes calendriers privées
J’ai pensé à aller mettre à jour le code frontend.
C’était nécessaire parce que du coup dans les scènes seules les calendriers partagés sont accessible.
Le but de cette fonctionnalité, c’est de laisser à l’utilisateur la possibilité de déclencher des scènes basées sur les évènements à venir / qui vont se terminer dans ses calendriers, après c’est à l’utilisateur de connecter ses calendriers à lui.
Le contenu du calendrier est propre à chacun, moi je fournis juste les outils pour faire les scènes
Si tu veux connecter un calendrier avec des vacances, des jours fériés, le jour ou tu vas à la piscine, l’école des enfants, tout est possible !
On est d’accord qu’il n’y a pas de calendrier intégré dans Gladys, c’est ‘juste’ une synchronisation avec un service tiers?
Je l’utiliserais bien pour les périodes de chauffe dans un calendrier dédié…
Ah ouai ok je vois.
C’est pas bête ça t’évite de te charger de récupérer une lib qui calcul les jours férié en fonction d’un pays donné.
C’est une autre façon de voir les choses, genre ça évite les erreurs de lib
Exactement, on considère qu’on est pas là pour coder un client calendrier complet (ce serait énormément de travail, et c’est pas vraiment notre métier)
L’idée c’est que les utilisateurs gardent leur client calendrier classique, continue de remplir les évènements sur leur téléphone/ordinateur comme ils font déjà, et ensuite nous on se synchronise juste avec.
Tu peux très bien créer un calendrier n’importe où spécifique pour tes périodes de chauffe et ça fera le boulot
Exactement
Pour les jours fériés par exemple, moi par défaut mon calendrier a un calendrier « jours fériés » je crois, et Gladys le synchronise. Il suffit de se plugger sur ce calendrier, de pas mettre de filtre sur le nom pour catcher tous les évènements, et hop tu gères les jours féries dans Gladys.
J’ai bien avancé aujourd’hui, et j’ai mergé sur master la première partie de ce développement : déclencher une scène en fonction d’un évènement qui arrive/qui va bientôt se terminer.
Concrètement, ce qu’il est possible de faire
“Envoie moi un message 15 minutes avant d’aller au sport”
“Réveille moi 1h avant un évènement travail”
“Si l’évènement “Disneyland” commence dans 1h ET que la maison n’est pas vide” => Clignoter dans le salon pour nous prévenir qu’il faut partir !
"Lance le chauffage quand il y a un évènement qui commence et qui s’appelle “chauffage”, et stoppe le chauffage quand il y a un évènement qui s’arrête et qui s’appelle “chauffage” "
Ce n’est que quelques exemples, mais bien-sûr les possibilités sont infinies !
Je vois déjà @lmilcent qui me dit : “mais attend ? on va pouvoir utiliser les valeurs de capteurs des déclencheurs là dedans ??” Pourquoi pas à l’avenir oui !!
Démonstration en vidéo
J’ai enregistré une vidéo qui montre un exemple
Comment tester ?
J’ai fais un build Docker sur le tag :dev comme d’habitude.
L’image Docker est la suivante:
gladysassistant/gladys:dev
Je suis preneur de tout retour, si vous avez le temps de tester ce week-end ce serait top
Pour la deuxième partie du développement, ce sera plus tard je vous tiendrais au courant de l’avancement !