1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
| function calendrier() {
MONMAIL = "xxxx@fournisseur.fr"
DDNS = "http://xxxxx.ddns.net"; //adresse ip fixe de votre box ou ddns si ip changeante
PORT = ":3218"; // port j'ai inclu les : car le port sera toujours utilisé ainsi. Par défaut le 80 est utilisé je conseille de le changer
UTIL = "user=xxxxxxx"; // utilisateur de la centrale domotique
MDP = "+pass=xxxxxxxx"; // mot de passe (ne pas laisser celui par defaut.)
URL = DDNS + PORT + "/Set.cmd?" + UTIL + MDP; //URL complete de la centrale domotique sans les commandes
CAL = "Domotique"; //nom de votre calendrier dans google agenda
/** Les commandes domotiques **/
var entrees = "+CMD=Getio"; //complément de commande pour afficher les entrées
var sorties = "+CMD=GetPower"; //complément de commande pour afficher les sorties
/** AFFECTATION DES ENTREES/SORTIES ACTUELLES **/
// attention pour la suite entrees et ENTREES sont des variables différentes.entrees correspond à la commande de lecture en html et ENTREES est un résultat en binaire de l etat des entrées.
var ENTREES = UrlFetchApp.fetch(URL + entrees).getContentText().split(/,|<.[^>]*>|p[\d]+=/i).join("");//cette commande enlève les balises et le texte afin de ne garder que les chiffres au résultat de l'url :
//en effet si vous faites juste "ENTREES = UrlFetchApp.fetch(URL + entrees)", alors vous avez un résultat qui ressemble à ça "<html>P51=1,P52=0,P53=0,P54=0,P55=1,P56=0,P57=1,P58=0 <html>"
// la suite de la commande permet d'enlever les balises et le texte on a donc dans ce cas 10001010 dans ENTREES.
var b = 10000000;
for (var E=[],i = 1; i < 9; i++) //La commande for va permettre de séparer chaque entrées et de mettre la valeur binaire dans E[1], E[2],....E[8]
{
if (ENTREES < b) //à la première boucle on isole l'entrée 1 qui va dans E[1], cette fois suivant l'etat de l'entrée 1, on met 0 ou 1 dans E[1], explication : avec l'exemple ci dessus ENTREES est égal à 10001010
{ // 1er boucle : ce chiffre étant strictement supérieur à b et i etant égal à 1 on met 1 dans E[1], ensuite on retranche à ENTREES LA VALEUR E[1] * b. on a donc ENTREES egal à 1010 puis on divise b par 10,
E[i] = 0; // 2eme boucle : ENTREES étant strictement inférieur à b et i etant égal à 2 on met 1 dans E[2], ensuite on retranche à ENTREES LA VALEUR E[2] * b. on a donc ENTREES egal encore à 1010 puis on divise b par 10,
} // etc..... pour les 8 entrées.
else
{
E[i] =1;
}
ENTREES = ENTREES - E[i]*b;
b = b/10;
}
var SORTIES = UrlFetchApp.fetch(URL + sorties).getContentText().split(/,|<.[^>]*>|p[\d]+=/i).join("");//cette commande enlève les balises et le texte afin de ne garder que les chiffres
var b = 10000000;
for (var S=[],i = 1; i < 9; i++) //La commande for va permettre de séparer chaque sorties et de mettre la valeur binaire dans S[1], S[2],....S[8] , Même explication que ci-dessus
{
if (SORTIES < b)
{
S[i] = 0;
}
else
{
S[i] =1;
}
SORTIES = SORTIES - S[i]*b;
b = b/10;
}
// MailApp.sendEmail(MONMAIL ,"rapport ippower","LES ENTREES : " + E[1] + E[2] + E[3] +E[4] + E[5] + E[6] + E[7] + E[8] + ", LES SORTIES : " + S[1] + S[2] + S[3] +S[4] + S[5] + S[6] + S[7] + S[8] ); //cette ligne décommentée enverra un mail de l'etat des entrées sorties a chaque execution du script
/**
Pour le moment je ne traite pas de commande directe entree/sorties
Mais cette affectation permet par exemple si on a branché sur l'entrée 1 un bouton marche/arret alarme et sur l'entrée 2 un detecteur de porte ouverte
de déclencher une alarme branché sur la sortie 4. Pour celà il suffit d'ecrire :
if (E[1]==1 && E[2]==1)
{ alarme = UrlFetchApp.fetch( URL + "+cmd=SetPower+" + "P64=1" );
}
else{}
**/
/** declaration de variables **/
var Description = "0";
var now = new Date();
var now2 = new Date();
var resultat;
now.setTime(now2.getTime()- (1*60*1000)); / now = now2 - 1 minute /
var cal = CalendarApp.getCalendarsByName(CAL)[0]; / chargement du nom du calendrier /
var ordre = cal.getEvents(now, now2); /regarde si un ou plusieurs ordre doit être lancé DANS L'intervalle de 1 minutes/
/** affectation des sorties de votre IPPOWER pour info
vmc = P61
chauffe eau = P62
Radiateur Hors gel = P65
Radiateur-eco = P65+P67
**/
for (i in ordre) // tant qu'il y a un évènement on boucle.(cas de plusieurs actions à la même heure)
{
var Titre = ordre[i].getTitle(); // On récupère le titre de l'événement
var Description = ordre[i].getDescription(); // On récupère la description de l'événement
var Error = null; // On initialise le retour derreur à null
// MailApp.sendEmail(MONMAIL ,"rapport ippower", ordre + Titre + i + ordre[i] + cal) //pour tests
if (Description.indexOf(" Action réalisée le ") == -1) // Si la description de lévénement contient « Action réalisée le » alors aucune action et c'est la fin du script
{
switch(Titre) //exécute la case correspondant au titre trouvé dans l'agenda (évènement).
{
/** note IPPOWER lance la fonction IPPOWER dans chacune des "case"s ci dessous. cette fonction se trouve en fin de programme**/
case "vmc on" :
Error = Error || IPPOWER("P61" , "0" ); // allumer VMC. ne pas oublier que les 4 premieres sorties sur l'ippower 9212 sont inversé donc un 0 allume la sortie 1.
break;// sortie du switch
case "vmc off" :
Error = Error || IPPOWER("P61" , "1" ); // éteindre VMC. ne pas oublier que les 4 premieres sorties sur l'ippower 9212 sont inversé donc un 1 éteind la sortie 1.
break;// sortie du switch
case "radiateur eco" :
Error = Error || IPPOWER("P65" , "1" ); // pour eco les 2 sorties doivent etre à 1
Error = Error || IPPOWER("P67" , "1" ); // fil pilote branché sur 2 diodes tête bèche sur sortie 5 et 7
break;// sortie du switch
case "radiateur on" :
Error = Error || IPPOWER("P65" , "0" ); // pour marche normale le fil pilote ne doit pas être allimenté
Error = Error || IPPOWER("P67" , "0" ); // les 2 sorties sont donc à 0
break;// sortie du switch
case "radiateur off" :
Error = Error || IPPOWER("P65" , "1" ); // P65 seule à 1 : Hors gel
Error = Error || IPPOWER("P67" , "0" ); // P67 seule à 1 : arret, dans mon cas je laisse plutot sur hors gel que sur arret.
break;// sortie du switch
case "chauffe eau on" :
Error = Error || IPPOWER("P62" , "0" ); // mise en marche du chauffe eau, ne pas oublier que les 4 premieres sorties sur l'ippower 9212 sont inversé donc un 0 allume la sortie 2.
break;// sortie du switch
case "chauffe eau off" :
Error = Error || IPPOWER("P62" , "1" ); // arret du chauffe eau, ne pas oublier que les 4 premieres sorties sur l'ippower 9212 sont inversé donc un 1 éteind la sortie 2.
break; // sortie du switch
}
var Maintenant = new Date();// on prend la date de fin d'évènement
if (Error == false)
{
ordre[i].setDescription(" Action réalisée le " + Maintenant.toLocaleString()); // Inscrit " Action réalisée le " + date dans le descriptif de lévénement pour éviter quil ne se reproduise
}
else if (Error == true)
{
if (Description.indexOf(" Erreur lors de lappel de l'ippower ") < 0)
{
Events.setDescription(" Erreur lors de lappel de l'ippower le " + Maintenant.toLocaleString()); // Inscrit " Erreur lors de lappel dune API " + date dans le descriptif de lévénement pour éviter quil ne se reproduise
// envoi dun mail de rapport derreur
MailApp.sendEmail(MONMAIL , " Erreur du script domotique ", " Une erreur sest produite lors à la réalisation de lévénement [" + Titre + "]" );
}
}
}
}
}
function IPPOWER(Sortie, état)
{
var Reponse;
Reponse = UrlFetchApp.fetch( URL + "+cmd=SetPower+" + Sortie + "=" + état );
Reponse = Reponse.getContentText();
Logger.log (Reponse);
MailApp.sendEmail(MONMAIL ,"rapport ippower", Reponse);
return(Reponse.indexOf(" error_code ") >= 0);
} |
Partager