Aller au contenu
Kriek

Gestion D'actions Quotidiennes Via Calendrier Google

Recommended Posts

Hello DjoulZ,

 

Je salut également ton travail, mais je suis du même avis que Steven concernant la diffusion de mes passwords et informations, et cette contrainte sera forcément un frein au partage de ton travail.

 

Cedric heberge un certain nombre de script pour ceux qui choisissent de faire confiance, et qui n'ont pas leur propre serveur. A ma connaissance, ces scripts sont également dispo en téléchargement, permettant ainsi leur utilisation aux utilisateurs soucieux de la sécurité.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@Steven

 

Salut, j'ai fait les modif pour la Zibase si tu veux :60:

 

Julien,

 

Il me demande toujours Username et password :( Même pas drôle, je veux tester moi :)

Partager ce message


Lien à poster
Partager sur d’autres sites

@Steven

Ce qu'il y a d'intéressant dans mon API, c'est que si tu as 2 box, le résultat des lights (par ex) sera agrégé.

Partager ce message


Lien à poster
Partager sur d’autres sites

Aaaaargh !

On vous laisse seuls 15 jours et voilàque le sujet est parti sur plein de nouvelles choses !

Bon Ben il me reste àlire tout ça !

Ça m'apprendra m'absenter aussi longtemps du forum !

Partager ce message


Lien à poster
Partager sur d’autres sites

@Kriek Tu fais bien de revenir, toi ...j'ai des questions  :)

 

En effet, en t'attendant on a un peu dérivé mais c'est pour la bonne cause. ;)  

 

En revenant à  ton script ...je l'ai testé et il marche sur la fonction de base mais depuis quelques jours je reçois des messages d'erreurs (par mail venant de Google). Je t'avoue que comme je suis en train de faire plein d'autres choses, j'avais mis un peu son utilisation en stand-bye pour réfléchir d'une manière plus globale à  mon installation  (les fonctions, la supervision, ...)

 

Je pense que les erreurs viennent du fait que l'agenda est vide ou contient des Evènements périodiques ?? ou bizarrement d'un problème de time-out???  je ne sais pas bien et flemmard je n'ai pas encore regardé  -_-

 

Comme, je suis sur que tu vas traiter la robustesse (traitement des erreurs) et ajouter qqles fonctions (traitement des Evénements simples/périodiques mais aussi des périodes)...je patientais  :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour à  tous,

 

Voici la V2 de mon HC2googlecal...

Bon alors depuis la dernière fois j'ai changé un peu la technique d'approche... Je passe maintenant par une scène et non plus un module virtuel.

 

Cette version est plus stable/fiable que la V1.

Les nouveautés :

- on travaille sur 24h flottantes la HC2 connait à  tout instant le programme pour les 24 prochaines heures, donc en cas de défaut de google, pas de souci. C'est mieux que la V1 qui s'updatait uniquement à  minuit ou en cas de changement de planning.

- gestion de périodes : lors de la définition d'un évènement sous google cal, on peut inscrire une action à  effectuer en fin de période (la V3 permettra de revenir à  l'état d'avant, mais ce sera la V3...  :) )

- la possibilité de mettre une valeur dans une variable globale existante de la HC2

 

Pour ceux qui veulent tester il faut :

Sur la HC2 :

- copier/coller le script code HC2googlecal googlescript.txt dans une scène

- initialiser dans cette scène le selId (qui est l4ID de la scène, mais getselfId ne semble pas fonctionner sur une scène...)

- initialiser le IDphone pour recevoir des notifications par push de vos actions.

- creer une variable globale appelée "calendrier". Pas besoin de mettre de valeur dedans.

 

Sous Google script :

-copier le script HC2Googlecal HC2scenarioscript.txt 

- initialiser les IP de la HC2, vos mots de passe et logon, et votre adresse de calendrier google (qui doit être dédié aux ordres pour la HC2)

- il est possible aussi de rentrer des ordres prédéfinis dans la table "ordres" et y associer les actions codées dans la table "actions" 

- faites un trigger toutes les minutes de "mytriggeroncalendareventcreation"

 

 

Notice d'utilisation :

Sous votre calendrier Google, choisissez le créneau que vous voulez.

Si vous souhaitez une action simple, la durée de l'action devra être nulle (heure de fin du rdv=heure de début du rdv)

L'action est alors écrite (soit ordre prédéfini du tableau "ordres" sous le script google, soit un ordre selon la syntaxe suivante (les espaces et les majuscules sont à  respecter) :

MV XX BOUTON YY --> On agira sur le bouton YY du module XX à  l'heure choisie

GV SET XXX TO YY --> On mettra la variable globale XXX à  la valeur YY à  l’heure choisie

 

Si vous définissez une période :

un ordre prédéfini ou un ordre codé doit (pas encore mis en place le repli s'il n'y a rien) être entré dans le champ "description" pour agir en fin de période.

 

Voilà , les scripts sont dispos ici avec le mot de passe "domotique-fibaro.fr"

http://dl.free.fr/gee5OHQJt

 

Pour la V3 je prévois :

- action sur un slider d'un module vituel

- si l'action change une variable globale en début de période, retour à  l'état d'avant la période de cette variable en fin de période

- superposition d'un calendrier défini selon un type de jour (week end ou semaine par exemple) et le calendrier des évènements 

 

Pour le futur, intégration de GEA, ordres multiples... plein d'idées quoi !!! Faut juste que je trouve le moment de jouer avec les scripts.

 

Enjoy ! 

 

N'hésitez pas à  me faire vos retours de ce qui ne marche pas, ce que vous voudriez voir pour les versions à  venir etc...

Je suis loin d'être un développeur de folie mais ça m'amuse beaucoup, alors si ça peut en plus servir !!! :60:

  • Upvote 3

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour à  tous,

 

Un petit update sur mes progrès sur ce sujet :

 

Premièrement je m'amuse comme un petit fou !

 

Il est maintenant possible :

 

- d'agir sur un slider d'un module virtuel avec la commande

MV XX SLIDER YYY TO ZZ

qui met le slider YYY (pas de limits nb caractères) du module XX (max 3 digits) à  la valeur ZZ (max 3 digits)

 

- de copier la valeur d'une variable globale dans une autre variable globale avec la commande

GV COPY XXX TO YYY

qui copie/sauvegarde la valeur de la variable globale XXX (pas de limits nb caractères) dans la variable globale YYY (pas de limits nb caractères) mais attention : LA VARIABLE GLOBALE YYY DOIT DEJA EXISTER !!!

cette commande peut être utile pour copier une VG vers une autre en début de période et la remettre à  l'état initial en fin de période.

 

- de donner des ordres multiples en les séparant par le caractère & :

Que ce soit avec les ordres préprogrammés sous google, ou les ordres codés 

exemple : GV COPY XXX TO YYY & Désactiver alarme

va copier la variable XXX dans la variable YYY et désactivera l'alarme à  l'heure choisie (dans cet ordre)

 

- de superposer un planning journalier qui définit plusieurs actions à  mener dasn la journée en fonction d'un type de jour défini dans un calendrier spécifique (exple lever des volets à  7h15 les jours de travail et à  8h15 les jours de repos)

 

- d'attacher des actions au lever et au coucher du soleil dans le calendrier des actions quotidiennes selon un type de jour défini.

Pour cela utiliser la fonction HLSXXX pour définir l'heure par rapport au Lever du soleil (HLS = Heure Lever Soleil), XXX est définit sur 3 caractères et est positif ou négatif (le signe fait partie des 3 caractères).

HCS idem HLS pour Heure Coucher Soleil

 

Voilà , tout cela commençant à  devenir un peu compliqué je vais préparer un mode d'emploi.

 

Par rapport à  mes besoins il me reste à  prévoir de mettre des conditions à  l'exécution des commandes en fonction de l'état dune variable globale.

 

En ce qui concerne l'intégration de GEA, le plus simple est finalement d'utiliser les variables globales en interface aux deux systèmes : HC2googleCal met la variable XX à  1 à  telle heure et la remet à  0 à  telle heure, GEA n'appliquant ses tâches que si la variable globale XXX est à  1.

 

Voilà , je prépare la version finale (en l'état de mes besoins) avec l'ajout de conditions à  l'exécution des actions, je prépare un petit mode d'emploi, je nettoie les scripts et ensuite je vous partage tout ça !

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir à  tous !

 

Voici la V4 ! avec un mode d'emploi (un peu dur à  digérer je l'avoue) et tout et tout !

 

Bon le code mériterai un peu plus de ménage encore mais bon ça fonctionne plutôt bien.

 

Pour l'instant ce code associé à  GEA et Imperihome mon install domotique commence à  ressembler à  quelquechose d'intéressant... me manque juste plein de petits modules à  piloter  ;)

 

Amusez vous bien et n'hésitez pas à  me faire part de vos commentaires !

 

 

hc2googlecal.zip

  • Upvote 3

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah et aussi une petite icône faite un peu rapidement... Pour l'instant l'aspect cosmétique n'est pas vraiment ma priorité...

Mais si quelqu'un intéressé par mon projet veut se lâcher sur une icône, je l'en remercie d'avance !  :P

 

 

 

post-926-0-85890900-1414092460_thumb.png

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir à  tous,

 

Pour ceux qui ont essayé et se sont cassé le nez, lors de la création des variables sur la HC2, il faut effacer la valeur 0 et faire en sorte que ces variables soient vides ou affichent "NaN".

 

Bon avec le changement d'heure de ce week end, j'ai repéré un petit bug aussi au niveau de la mise à  jour du calendrier des actions quotidiennes. Je corrige ça rapidement.

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

Je suis un grand adepte de ta solution, surtout couplée avec GEA.

Je suis content que tu fasse avancer ton projet mais, par ce qu'il y a un mais, la complexité commence àme rebuter.

Je ne comprends pas trop le but de faire 2 calendriers et de vouloir faire des actions qui sont déjàbien gérer par le GEA et surtout en local.

Ta notice est compliquée mais difficile de faire autrement devant toutes ces fonctions.

J'aimerais bien avoir des exemples ou le but des nouvelles fonctions afin de savoir si cette mise àjour vaut la chandelle.

Merci pour tout ton travail et ne voit pas ça comme une critique mais une clarification de tes objectifs pour qu'on puisse tous en profiter.

Axel

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut Axel,

 

Aucun problème, toute critique positive ou négative est positive.. surtout quand elle rejoint mes propres observations  ;)

 

Je suis d'accord avec toi, il y a beaucoup de chose que je fais avec GEA en ce qui concerne la partie Calendrier des actions journalières.

Pour moi le gros problème de GEA (désolé Steven celle là  elle est pour toi :P ) est de nous obliger à  passer par le programme pour exécuter une action. Les possibilités sont énormes mais il faut rentrer dans le script...

Mon but était de rendre plus visuel la gestion des actions quotidiennes, mais pas facile... Si difficile que pour l'instant je n'ai pas vraiment réussi... 

Au final les actions à  gérer en fonction d'un type de jour se font très bien par GEA, et on les change relativement peu souvent... Du coup ce calendrier va disparaitre je pense (d'ailleurs il te suffit de ne pas l'utiliser en laissant la variable globale correspondante vide normalement).

 

En revanche j'utilise pas mal le calendrier via Google Calendar, il me permet depuis n'importe où avec l'iphone de commander facilement tout ce que je veux puisque c'est pris en compte dans les 2 minutes qui suivent. Et le calendrier google est beaucoup plus facile d'accès que l'appli fibaro.

Je l'utilise par exemple pour :

- changer en fonction des prévisions de bison futé mon heure de retour de week end pour que le chauffage soit en mode confort à  mon arrivée,

- gérer la désactivation de l'alarme et sa réactivation pour le passage de la femme de ménage aux horaires que je reçois en début de mois, puis je n'y penses plus.

 

Bon voilà , je suis en train de réfléchir à  une autre façon de présenter les choses, je vais aussi revoir les commandes, ne serait-ce que pour les uniformiser (il y a des commande en anglais, d'autres en français etc...) voire peut-être me coller aux commandes de GEA (plus ou moins) pour avoir les mêmes mots clefs pour les deux outils.

 

Il me faudrait aussi refaire un manuel illustré car comme tu l'as dit l'actuel est un peu indigeste.

 

Voilà .. Beaucoup d'idées, pas beaucoup de temps, et Madame et les enfants qui ne comprennent pas toujours mon engouement pour tout cela... :P

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut Kriek,

 

J'ai toujours la même erreur lors de l'execution du google script :

 

Échec de la requête pour http://xxxxxxxxxx/api/globalVariables. Code renvoyé : 400. Réponse tronquée du serveur : {"type":"ERROR","reason":"name","message":"No variable name in uri"} (Utilisez l'option muteHttpExceptions pour examiner la réponse entière.) (ligne 298, fichier "Code")

 

Je ne comprend pas, pour info je suis en 4.018

 

As-tu déjà  rencontrer le pb.

 

Merci d'avance

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut Tarentino,

 

Je ne pense pas que cela vienne de la version 4.018, puisque l'erreur est retournée par le script Google.

 

Ne développant que depuis peu, et n'ayant pas encore été confronté à  ce message, il me faut un peu de recherche pour trouver la raison de cette erreur.

 

Je vais essayer de trouver...

Partager ce message


Lien à poster
Partager sur d’autres sites

Je n'ai qu'une réponse, Merci.

Tu as fais déjàbeaucoup de boulot pour l'instant. Je vais continuer àutiliser la version précédente en attendant l'évolution de ton script.

Je partage totalement ton avis sur le GEA et sur l'appli figaro qui laisse sur sa fin en terme de réactivité !

J'attends avec impatience tes prochaines évolutions, mais ne te mets pas la pression plus que tes propres besoins.

A plus

Partager ce message


Lien à poster
Partager sur d’autres sites

Question, l'utilisation du second calendrier est obligatoire ? Car si j'ai bien compris, le second sert àgérer les actions journalières type GEA c'est ça ?

Partager ce message


Lien à poster
Partager sur d’autres sites

@ Nico, 

Le second calendrier n'est absolument pas obligatoire.. en revanche, il faut qu'il existe quand même et que la variable associée existe aussi... Jusqu'à  la prochaine version où il disparaitra car il est redondant avec GEA et pas plus amical en terme d'utilisation.

 

@ tous,

Je travaille toujours sur le projet dans une nouvelle version avec une fonctionnalité qui donne un peu de fil à  retordre pour un débutant en développement comme moi... Mais bon tout challenge est fait pour être relevé !!! Et puis je sais que je peux compter sur l'aide de nombreux gourous de ce forum pour m'aider...

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok, bah du coup j'attends la prochaine version pour installer chez moi. Tu penses la publier quand ?

Partager ce message


Lien à poster
Partager sur d’autres sites

@Kiek, as-tu trouver pourquoi le script google me renvoi une erreur.

 

J'ai tout essayer, rien n'y fait. Si tu as besoin de plus d'infos hésite pas.

 

Merci d'avance

Partager ce message


Lien à poster
Partager sur d’autres sites

slt Kriek, et pour commencer, bravo! super taff...

je découvre les scripts google (un peu galéré pour savoir ou aller le coller car il y a eu des updates récemment sur google drive)

 

Je rencontre une erreur de script à  la ligne 159 sur le JSON

var allvars = JSON.parse(envoi.getContentText());

 

mais là , je t'avoue, je sèche

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut Tarentino,

Non désolé pour l'instant je ne trouve pas... J'ai essayé plein de trucs sans réussir àretrouver la même erreur que toi...

Est-ce que tu accepterais de me retransmettre le script google tel que tu l'as initialisé en supprimant uniquement les adresses de tes calendriers et adresseIP/login de ta HC2, que j'essaie de voir si cela vient du script ou d'une de ces adresses ou d'une variable manquante sur la HC2 par exemple.

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut Nvince76,

 

Tu arrives à  lancer le script et tu as l'erreur de temps en temps c'est ça ?

 

J'ai moi aussi cette erreur dans le rapport quotidien de Google, mais ça arrive 3 à  4 fois par jours sur 1440 exécutions (si tu l'as laissé à  une requête par minute) donc c'est pas trop génant... mais je n'ai pas encore réussi à  faire en sorte que ça n'arrive plus.. et je me demande si ce n'est pas juste un problème d'accès à  la HC2 à  un mauvais moment. 

Il m'arrive aussi d'avoir le message d'erreur de non disponibilité du serveur google 2 à  3 fois par jour.

 

Pour moi il s'agissait d'erreur liée à  Google, pas au script... Cela dit je cherche toujours à  fiabiliser tout ça, donc il faudra bien que je trouve la raison primaire de ce message. Je fouille... quand j'ai le temps (ce qui n'est pas trop le cas en ce moment).

Partager ce message


Lien à poster
Partager sur d’autres sites

La plupart du temps il s'agit d'une lenteur réseau. Il n'y a aucune raison de s'alarmer. Perso, j'ai même désactivé les notifications pour ne plus recevoir ces messages.

Envoyé de mon portable grâce àmes petits doigts.

Partager ce message


Lien à poster
Partager sur d’autres sites

@Kiek,

 

Voici le contenu de mon fichier

function mytriggeroncalendareventcreation() {

//****************************************************************
//VARAIABLES A INITIALISER
//****************************************************************

  var HC2_IP = "xxxx.xxxx.net"; // adresse de la HC2 accessible depuis l'extàˆrieur (soit IP de votre freebox avec port dàˆdiàˆ pour HC2, ou adresse de connection externe)
  var LOGIN = "admin";
  var PWD = "xxxxxxxx"
  var name = "HC2GoogleCal"
  var daycalname ="HC2Cal_Dayroutine"
  var scene = "8"; // ID de la scà‹ne "HC2Googlecal"
  var periode = 24 // pàˆriode d'analyse en heure
  
  var CAL_ID = "phpdot.net_8b9ijavit4vv9m7t32ojqmt8d8@group.calendar.google.com";
  var DAY_CAL_ID = "phpdot.net_bsbaq5dsr5oifs54cemk5udimc@group.calendar.google.com";
  
  // heures recup calendrier relatif au type de journàˆe (2 envois au cas o˘ problà‹me du serveur google)
  var heuredaycal1=0 // soit minuit
  var heuredaycal2=1 // soit 1h du mat
  
  // forcer mise ‡ jour calendrier relatif au type de journàˆe ‡ l'exàˆcution du script
  var forcedaycalupdate=0 // mettre ‡ 1 si on veut forcer (premià‹re mise en service)
  
  var ordres =[]
 
  var actions =[]
               
  var daytypes =["Travail","Repos","Absence"]
  
  var dayactions =[]
 
 // ---------------------------------------------------------
 // TABLE ACTIONS ET TABLES ORDRES
 //----------------------------------------------------------
 //
 // la table actions doit donner les instructions dasn le màme ordre que celui de la table ordres.
 // les actions se dàˆfinissent selon les codages suivants :
 //
 // action sur une Variable Globale :
 // VSXX@YYY met la valeur XX (pas de limite nb caractà‹res) dasn la VG YYY (pas de limite nb caractà‹res)
 // VCXX@YY copie la valeur de la variable XX (pas de limite nb caractà‹res) dans la variable YY (pas de limite nb caractà‹res)
 // 
 // s'il s'agit d'une action sur module virtuel:
 // MBXXXYY agit sur le bouton YY (max 2 digits) du module XXX (max 3 digits)
 // MSXXXYY@ZZ met le slider YY (pas de limite nb caractà‹res) du module XXX (max 3 digits) ‡ la valeur ZZ (max 3 digits)
 //
 // s'il s'agit d'une action sur scà‹ne :
 // S+XXX dàˆmarre la scà‹ne XXX (max 3 digits)
 // S-XXX stoppe la scà‹ne XXX (max 3 digits)
 //
 // s'il s'agit d'une action conditionelle :
 // ICCYYY@VVV|AAAAAAAA signifie IF la variable globale YYY (pas de limite de caractà‹res) suit la condition CC( ==, !=, >>, <<, >= ou <=) par raport ‡ la valeur YYY 
 //                              ALORS l'action AAAAA sera exàˆcutàˆe, AAAA est une action codàˆe dàˆfinie pour un module, une scà‹ne, une variable globale ou un message
 //
 //-----------------------------------------------------------------------
 // Dans le calendrier des actions quotidiennes selon le type de jour, 
 //------------------------------------------------------------------------
 // Dàˆfinir les actions ‡ mener aux diffàˆrentes heures de la journàˆe (entre minuit et minuit)
 // il est d'attacher des actions au lever et au coucher du soleil dans le calendrier des actions quotidiennes selon un type de jour dàˆfini.
 // Pour cela utiliser la fonction HLSXXX pour dàˆfinir l'heure par rapport au Lever du soleil (HLS = Heure Lever Soleil), XXX est dàˆfinit sur 3 caractà‹res et est positif ou nàˆgatif (le signe fait partie des 3 caractà‹res).
 // HCS idem HLS pour Heure Coucher Soleil
 //
 //-----------------------------------------------------------------
 // Ordres depuis GoogleCal
 //------------------------------------------------------------------
 //
 // Utilisation des ordres pràˆprogrammàˆs dasn la table ordres
 //
 // ou utilisation des ordres codàˆs selon la logique suivante :
 //
 // MV XX BOUTON YY --> agit sur le bouton YY (max 2 digits) du module XX (max 3 digits)
 // MV XX SLIDER YYY TO ZZ --> met le slider YYY (pas de limits nb caractà‹res) du module XX (max 3 digits) ‡ la valeur ZZ (max 3 digits)
 //
 // GV SET XXX TO YY --> met la valeur YY (pas de limite digits) dasn la variable globale nommàˆe XXX (pas de limits nb caractà‹res)
 // GV COPY XXX TO YYY --> copie/sauvegarde la valeur de la variable globale XXX (pas de limits nb caractà‹res) dans la variable globale YYY (pas de limits nb caractà‹res)
 //                        ATTENTION LA VARIABLE GLOBALE YYY DOIT DEJA EXISTER !!!
 //
 // IF XXX == AA THEN YYY ->> ne fera l'action YYY (attention ordre simple, pas d'ordre multiple !) que si la condition relative ‡ la variable globale XXX est remplie
 //                           XXX pas de limite de carcatà‹res
 //                           AA pas de limite de caractà‹res
 //                           YYY toute action sauf IF
 //                           YYY doit àtre un ordre CODE, les ordres pràˆprogrammàˆs ne sont pas (encore..) reconnus
 //
 // S+ XXX --> Dàˆmarre la scà‹ne XXX (3 digits)
 // S- XXX --> Stoppe la scà‹ne XXX (3 digits)
 //
 // PUSH XXX TO YY --> envoie un push XXX sur le tàˆlàˆphone identifiàˆ sous la HC2 en device# YYY (3 digits max) pour faire un rappel par exemple
 //                    
 //
 //-----------------------------------------------------------------
 // Ordres multiples depuis GoogleCal
 //------------------------------------------------------------------
 //
 // Si on souhaite gàˆnàˆrer plusieurs actions au màme moment, lier les actions par &.
 // Par exemple "MV XX SLIDER YYY TO ZZ & MV XX BOUTON YY"
 // NB : Les actions seront ràˆalisàˆes dans l'ordre d'apparition
 // 
 // Les ordres multiples fonctionnent avec les ordres pràˆprogrammàˆs ou les ordres codàˆs ou un màˆlange des deux
 //
 // ---------------------------------------------------------
 // TABLE DAYTYPES ET TABLES DAYACTIONS
 //----------------------------------------------------------
 // DAYTYPES table dàˆfinissant les types de jours qui pourront àtre trouvàˆs dasn le calendrier
 // DAYACTIONS table dàˆfinissant les actions ‡ mener et les heures de ces actions au long de la journàˆe (de 0:00 ‡ 23:59)
 //
 
 
//****************************************************************
//NE PAS EDITER PLUS BAS
//****************************************************************
  
  var now = new Date(); 

// en cas de changement de planning par rapport ‡ celui enregistràˆ dans la HC2, on envoie le nouveau planning
      var schedulebefore= getpreviousschedule(name,HC2_IP,LOGIN,PWD)
      var scheduleafter = recupplanning(now,ordres,actions,CAL_ID,periode)
      
      if (scheduleafter!=schedulebefore) {
      Logger.log("triggerfct : envoi nouveau planning");
      envoiplanning(HC2_IP,LOGIN,PWD,scheduleafter,scene,name)}
      else {Logger.log("triggerfct : pas de changement de planning : pas d'envoi nouveau planning")}

 // en cas de changement de type de jour ET si on forcer la mise ‡ jour du planning, on envoie le nouveau planning
      var daytypebefore=getpreviousschedule(daycalname,HC2_IP,LOGIN,PWD)
      var daytypenow=traitementdaytype(DAY_CAL_ID,daytypes,dayactions)
      
      if (daytypenow!=daytypebefore && forcedaycalupdate==1) {
      Logger.log("triggerfct : envoi nouveau planning daytype");
      envoiplanning(HC2_IP,LOGIN,PWD,daytypenow,scene,daycalname)}
      else {Logger.log("triggerfct : pas d'envoi nouveau planning daytype")}

// envoi forcàˆ du calendrier relatif au type de jour ‡ minuit et ‡ 1:00 du mat (2 envois au cas o˘ problà‹me du serveur google)
      var nowminutes=now.getMinutes()
      
      if (now.getMinutes()==0 && (now.getHours()==0 || now.getHours()==1)) 
        {envoiplanning(HC2_IP,LOGIN,PWD,daytypenow,scene,daycalname)}

}

//*****************************************************************************

function getpreviousschedule(globvarname,HC2_IP,LOGIN,PWD) {

  var urlglobal = "http://" + HC2_IP + "/api/globalVariables";
  var optionsglobalget = {"headers": {"Authorization": "Basic " + Utilities.base64Encode(LOGIN + ":" + PWD)}, 
               "method":"get" };
   
envoi = UrlFetchApp.fetch(urlglobal, optionsglobalget) 

var allvars = JSON.parse(envoi.getContentText());

var schedulebefore =""

 for (var i = 0; i < allvars.length; i++) {
      if (allvars[i].name == globvarname) {
         var schedulebefore = allvars[i].value;
      }}
      
return schedulebefore

}


//*******************************************************************************

function recupplanning(now,ordres,actions,CAL_ID,periode) {
 
var cal = CalendarApp.getCalendarById(CAL_ID);
 
var oldTimeZone = cal.getTimeZone();
 // Google Script semble fonctionner en GMT, il faut donc lui imposer la bonne timezone.
cal.setTimeZone("Europe/Paris"); // on peut utiliser "Etc/GMT-2" mais attention ! -2 en àˆtàˆ et -1 en hiver... "Europe/Paris" tient compte de l'heure d'àˆtàˆ
 
// on travaille en flottant => events pour les 24h ‡ venir
// var now = new Date();
 var endperiode = new Date(now.getTime() + (periode * 60 * 60 * 1000));
 var events = cal.getEvents(now, endperiode);
  
var schedule = ""
var description=""


    for (var i in events) {
       var ordredonne = events[i].getTitle()
       var heureordre = events[i].getStartTime().getHours()
       var minordre = events[i].getStartTime().getMinutes()
       var minfin=events[i].getEndTime().getMinutes()
       var heurefin = events[i].getEndTime().getHours()
       var delta = heurefin*60+minfin-heureordre*60-minordre
       if (delta!=0) {description = events[i].getDescription()}
         
     // mise en forme des donnàˆes
       heureordre=miseenforme(heureordre,2);
       minordre=miseenforme(minordre,2);
       heurefin=miseenforme(heurefin,2);
       minfin=miseenforme(minfin,2);
       
    // pràˆparation de la variable d'interface HC2
       if (events[i].getStartTime()>now) {
           var ordresassocies=analyseordre(ordredonnàˆ,ordres,actions)
                 
           if (schedule.length!=0) {schedule=schedule+"#"}
           schedule= schedule + heureordre+""+minordre+""+ordresassocies;
       }
       
       if (description!="") {
         var ordresassocies=analyseordre(description,ordres,actions)
         
         if (ordresassocies!="" && schedule.length!=0) {schedule=schedule+"#"}
           schedule=schedule+heurefin+""+minfin+""+ordresassocies; 
        }
    }
 
 
Logger.log('recupfct : schedule '+schedule) // Vàˆrif de la variable combinant toutes les actions et heures associàˆes.

cal.setTimeZone(oldTimeZone);

return schedule

}

//*******************************************************************************
function analyseordre(ordredonnàˆ,ordres,actions){

var ordresassocies=""

var ordresmult=chkmultipleorders(ordredonnàˆ)
              
  for (var i in ordresmult) {
      var ordre=rechercheordre(ordresmult[i],ordres,actions);
      if (ordre==ordresmult[i]) {// on n'a pas trouvàˆ l'ordre dans les ordres pràˆenregistràˆs
           ordre=traitementdescription(ordresmult[i])};
      ordresassocies=ordresassocies+ordre+"&"
  }
       
ordresassocies=ordresassocies.substring(0,ordresassocies.length -1)
       
return ordresassocies
}

//*******************************************************************************

function miseenforme(heure,nbdigit) {

var heuretxt=heure+""
var long = heuretxt.length

while (long!=nbdigit) {
  heuretxt="0"+heuretxt
  long=heuretxt.length}
  
return heuretxt
}

//*******************************************************************************

function rechercheordre(ordredonnàˆ,ordres,actions) {
  var action=ordredonnàˆ
  
      for (var j in ordres) {

         if (ordres[j]==ordredonnàˆ){
         action=actions[j]
         } 
      }
      
  Logger.log("action trouvàˆe sur ordredonnàˆ="+action)

  return action
}

//*******************************************************************************

function envoiplanning(HC2_IP,LOGIN,PWD,schedule,scene,name) {

  var urlscene = "http://"+HC2_IP + "/api/sceneControl?id="+scene+"&action="
  var optionscene = {"headers": {
    "Authorization": "Basic " + Utilities.base64Encode(LOGIN + ":" + PWD)
  }}
  
  envoi = UrlFetchApp.fetch(urlscene+"stop", optionscene);  
  
  var urlglobal = "http://" + HC2_IP + "/api/globalVariables";
  var dataglobal = "{\"name\" : \"" + name + "\", \"value\" : \"" + schedule + "\"}"
  var optionsglobalput = {"headers": {"Authorization": "Basic " + Utilities.base64Encode(LOGIN + ":" + PWD)}, 
               "method":"PUT",
               "payload": dataglobal };
 
  envoi = UrlFetchApp.fetch(urlglobal, optionsglobalput) 

  envoi = UrlFetchApp.fetch(urlscene+"start", optionscene); 
 
}
//*******************************************************************************

// Dàˆtermination si ordre multiples 
function chkmultipleorders(description) {

Logger.log("fct chkmultorders : description ="+description)

  var ordresmultiples = new Array();
  var idx = description.indexOf(" & ");
  
  while (idx != -1) {
    ordresmultiples.push(description.substring(0,idx));
    description=description.substring(idx+3)
    idx = description.indexOf(" & ");
  }
  
ordresmultiples.push(description)

Logger.log("fct chkmultiorders : ordresmultiples ="+ordresmultiples)
  
return ordresmultiples
}

//*******************************************************************************

function traitementdescription(description) {
  Logger.log("fct traitdesc : desc = "+description)
  
  var suiteschedule=""
  if (description!="") {
  
  Logger.log("fct desctab commence !")
  var stop=0
  var prochain_espace=description.indexOf(" ",0);
  var descriptiontab=new Array()
  var descriptiontemp=description
  while (prochain_espace>=0) {
    descriptiontab.push(description.substring(0,prochain_espace))
    description=description.substring(prochain_espace+1)
    prochain_espace=description.indexOf(" ",0)
  }
  descriptiontab.push(description)
   
   Logger.log("desctab = "+descriptiontab)
   
suiteschedule=quelleaction(descriptiontab,"all")

 }

return suiteschedule
}

//*******************************************************************************
function quelleaction(descriptionaction,bornes){

var suiteschedule=""

     if (descriptionaction[0]=="GV"){
           var actionGVdesc=actionGV(descriptionaction)
           suiteschedule=suiteschedule+"V"+actionGVdesc}
        
      if (descriptionaction[0]=="MV"){
           var actionMVdesc=actionMV(descriptionaction)
           suiteschedule=suiteschedule+"M"+actionMVdesc}
           
       if (descriptionaction[0]=="S+" || descriptionaction[0]=="S-"){
           suiteschedule=suiteschedule+descriptionaction[0]+descriptionaction[1]}
           
       if (descriptionaction[0]=="PUSH"){
          suiteschedule=suiteschedule+"P"+descriptionaction[1]+"@"+descriptionaction[3]}

       if (bornes!="!IF" && descriptionaction[0]=="IF"){
           var actionIFdesc=actionIF(descriptionaction)
           suiteschedule=suiteschedule+"I"+actionIFdesc}

return suiteschedule

}

//*******************************************************************************

function actionIF(descriptionIF) {

var actionIF=""
Logger.log("fct action IF = c'est du IF !")

  var variableGVcond=descriptionIF[1]
  Logger.log("fct action IF :variableGVcond="+variableGVcond)
  var iffonction=descriptionIF[2]
  Logger.log("fct action IF :iffonction="+iffonction)
  var condvalue=descriptionIF[3]
  Logger.log("fct action IF :condvalue="+condvalue)
  var thenaction=descriptionIF
  thenaction.splice(0,5)
  Logger.log("fct action IF :thenaction="+thenaction)
  
  if (iffonction==">" || iffonction=="<") {iffonction=iffonction+iffonction}
  
  Logger.log("IF "+variableGVcond+iffonction+condvalue+" THEN DO "+thenaction)
  actionIF=iffonction+condvalue+"@"+variableGVcond+"|"
  
  var suiteIF=quelleaction(thenaction,"!IF")
  
  actionIF=actionIF+suiteIF
  
    Logger.log("IF action compilàˆe ="+actionIF)
    
return actionIF
}

//*******************************************************************************

function actionMV(descriptionMV) {

  Logger.log("fct action MV = c'est du MV !")
  
  var IDmodule=descriptionMV[1]
  IDmodule=miseenforme(IDmodule,3)

  if (descriptionMV[2]=="BOUTON") {
    var IDbouton=descriptionMV[3]
    IDbouton=miseenforme(IDbouton,2)//mettre en forme sur 3 digits le IDmodule et 2 digits le IDbouton
    var actionMV="B"+IDmodule+IDbouton;}
    
  if (descriptionMV[2]=="SLIDER") {
    var IDslider=descriptionMV[3]
    var valueslider=descriptionMV[5]
    var actionMV="S"+IDmodule+IDslider+"@"+valueslider}
 
 Logger.log("fct actionMV : actionMV="+actionMV)
 
  return actionMV
}

//*******************************************************************************

function actionGV(descriptionGV) {
 Logger.log("fct action GV : desctab ="+descriptionGV)
 
  var variableGV=descriptionGV[2]
  
  if (descriptionGV[1]=="SET") {
    var setvalueGV=descriptionGV[4]
    var actionGV="S"+setvalueGV+"@"+variableGV}
  
   if (descriptionGV[1]=="COPY") {
     var varcopyGV=descriptionGV[4]
     var actionGV="C"+variableGV+"@"+varcopyGV}
 
Logger.log("fct actionGV : actionGV = "+actionGV)

  return actionGV
}

//************************************************************************************
function traitementdaytype(DAY_CAL_ID,daytypes,dayactions) {

var cal = CalendarApp.getCalendarById(DAY_CAL_ID);
 
var oldTimeZone = cal.getTimeZone();
 // Google Script semble fonctionner en GMT, il faut donc lui imposer la bonne timezone.
cal.setTimeZone("Europe/Paris"); // on peut utiliser "Etc/GMT-2" mais attention ! -2 en àˆtàˆ et -1 en hiver... "Europe/Paris" tient compte de l'heure d'àˆtàˆ

var dayaction=""

var now = new Date();
var endperiode = new Date(now.getTime() + (1 * 60 * 60 * 1000));
var events = cal.getEvents(now, endperiode);
 for (var i in events) {
   if (events[i].isAllDayEvent()) {
     var daytype = events[0].getTitle()
     Logger.log("fct trtdaytype : daytype = "+daytype)
       for (var j in daytypes) {
         // on recherche si le daytype dans la liste des dauytypes possibles et le cas àˆchàˆant le code dayaction associàˆ est enregistràˆ.
         if (daytype== daytypes[j]) {
           dayaction=dayactions[j]} 
       }
    }
  }
cal.setTimeZone(oldTimeZone);

return dayaction
}

// Script written by Kriek (F.Lambert) - October 2014 //

Voilà  mon ficher, juste l'adresse et le mot de passe cachés.

 

J'ai environ 1500 erreurs dans le rapport google journalier.

 

@+

Partager ce message


Lien à poster
Partager sur d’autres sites

×