Gazous Posté(e) le 11 mai 2015 Signaler Posté(e) le 11 mai 2015 Bonjour, Il existe déjà plusieurs Virtual Devices relatifs à l'Eco-Devices sur le forum mais n'ayant pas trouvé mon bonheur, j'ai entièrement écrit un module de zéro en fonction de mes besoins et en espérant qu'il puisse également servir à d'autres. Que fait ce Virtual Device ? 1) Suivi en temps réel des statistiques d'un compteur téléinfo (T1 ou T2) HC/HP 2) Affichage temps réel d'une icône de type "jauge" présentant le tarif actuel (HC/HP) ainsi que la valeur de consommation actuelle 3) Affichage temps des index en kWatts au 1000ième, index en cours (HC ou HP) toujours en premier 4) Affichage temps réel d'un compteur de consommation journalier en Watts pour les HP et les HC 5) Affichage temps réel du coà»t de consommation journalier 6) Génération d'un rapport Email de consommation journalière 7) Fonction de remise à zéro manuelle des compteurs journaliers 8) Gestion de l'authentification utilisateur Eco-Devices Evolutions prévues : 1) Ajout d'un compteur de cumul mensuel 2) Estimation de prochaine facture et publication d'index "Releve Confiance" chez EDF (fera certainement l'objet d'un second module "EDF & Moi") Voici un aperçu des vues graphiques du Virtual Device : La liste des icones de jauges : Deux méthodes sont proposées pour la récupération des statistiques de l'Eco-Devices : L'existence de ces 2 méthodes est liée à un bug connu de la HC2 lors de l'utilisation de requêtes HTTP dans la mainLoop d'un Virtual Device qui bloque au bout d'un certain temps. Le moyen de contourner cela est l'utilisation d'un bouton déclenché depuis la mainLoop qui a comme inconvénient de modifier l'icône pour la durée du traitement ce qui personnellement ne me convient pas. - Méthode 1 (recommandée) : C'est la méthode que j'ai choisi car elle se base sur une scène afin de rafraichir les données et évite ainsi le changement d'icône indésirable durant la récupération des données. -> Pour utiliser cette méthode, vous devez en plus créer et configurer la scène fournie puis dans la MainLoop, positionner la variable useSceneToRefresh à true - Méthode 2 (par défaut ) : C'est la méthode configurée par défaut qui évite l'utilisation d'une scène en parallèle mais avec l'inconvénient de l'icône qui sera modifiée à chaque récupération des données. J'ai toutefois crée une icône dédiée à configurer sur ce bouton : afin que ce ne soit pas trop moche. -> Pour utiliser cette méthode, vous devez simplement positionner la variable useSceneToRefresh à false dans la MainLoop Comment l'utiliser ? 1) Importer la dernière version du Virtual Device : Eco_Devices_Live_Day_Reporter_V0.1.vfib 2) Renseignez l'adresse IP ainsi que le port (80 par défaut) de votre Eco-Devices 3) Importer la série d'icônes de jauges fournies en respectant l'ogre dans lequel elles sont fournies, c'est très important, puis notez l'Id correspondant à la première 4) Dans la mainLoop, renseignez les valeurs des variables teleInfoNB, baseIconId, userIdsToNotify, useSceneToRefresh et si besoin reportTime 5) Si vous utilisez la Méthode 1 (useSceneToRefresh = true) vous devez créer la scène Eco-Devices Refresh (voir ci-dessous) 6) Dans le code du bouton "Raraîchir" pensez à saisir vos in formations d'authentification si vous l'avez activée sur l'Eco-Devices 7) Pas besoin de créer de variables globales, elles sont automatiquement crées au premier démarrage du Virtual Device 8) Sauvegarder la scène et tout devrait bien fonctionner Pour ceux qui utilisent la Méthode 1 : Voici le code de la scènes Eco-Devices Refresh Il est IMPORTANT de bien renseigner le deviceId correspondant à l'Id de votre Virtual device importé ci-dessus. Si vous avez activé l'authentification sur l'Eco-Devices, vous devez ici saisir vos informations d'authentification encodées en base64. Si vous ne l'avez pas déjà fait, il suffit d'aller sur https://www.base64encode.org, d'encoder en UTF8 la chaine correspondante à "<login>:<password>" et de récupérer le résultat. Par exemple "admin:password" donnera "YWRtaW46cGFzc3dvcmQ=" saut de --[[ %% autostart %% properties %% globals --]] -- Récurrence de rafraichissement des stats en secondes local checkEvery = 3 -- Id du Virtual Device local deviceId = 228 -- Authentification ("" si pas d'authentification sinon chaine "<login>:<password>" en base64 local base64BasicAuthentication = "" local sourceTrigger = fibaro:getSourceTrigger() local ecoDevicesIP = tostring(fibaro:get(deviceId,"IPAddress")) local ecoDevicesStats = nil --- Usefull Functions --- function debug(text, color) color = color or "white" fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, text, "span")) end function setDevicePropertyValue(id, label, value) fibaro:call(id, "setProperty", "ui."..label..".value", value) end function getDevicePropertyValue(vDeviceid, propertyName) return fibaro:getValue(vDeviceid, "ui."..propertyName..".value") end function refreshEcoDevicesStats() debug("Rafraichissement des statistiques de l'EcoDevices...") ecoDevicesStats = nil local http = net.HTTPClient() http:request("http://"..ecoDevicesIP.."/api/xdevices.json?cmd=10", { options = { method = 'GET', headers = {["Authorization"] = 'BASIC '..base64BasicAuthentication}, }, success = function(response) ecoDevicesStats = response.data refreshEcoDevicesStatsAsync() end, error = function(err) debug("Error: " ..err, "red") fibaro:sleep(1000) refreshEcoDevicesStats() end }) end function refreshEcoDevicesStatsAsync() fibaro:setGlobal("ecoDevicesStats", ecoDevicesStats) debug("OK ! "..ecoDevicesStats, "green") if (sourceTrigger["type"] == "autostart") then setTimeout(refreshEcoDevicesStats, checkEvery*1000) end end refreshEcoDevicesStats() lignesaut de ligne Enfin, voici le code de la MainLoop : saut de ligne -------------------------------------------------------- -- Eco-Devices Live & Day Reporter v0.1 -- -------------------------------------------------------- -- Auteur : Brice Cassagnabère -- -------------------------------------------------------- -- Changelog : -- -- -- -- v0.1 : Version initiale -- -------------------------------------------------------- -- Plus d'infos : http://is.gd/tMgWdy -- -------------------------------------------------------- -- Renseignez ici le numéro de téléinfo à prendre en compte, T1 ou T2 teleInfoNB = "T1" -- Renseignez ici le numéro de la première icône de jauge (HC_0.png) baseIconId = 1047 -- Renseignez ici les id Utilistaurs à qui transmettre le rapport userIdsToNotify = {2, 154} -- Si vous utilisez la scène associée pour la MAJ, passer cette variable à true useSceneToRefresh = false -- Heure à laquelle vous souhaitez générer le rapport journalier reportTime = "23:59" -- Tarifs des kWh 2015 hcCost = 0.0623 hpCost = 0.1019 deviceId = fibaro:getSelfId() --- Usefull Functions --- function debug(text, color) color = color or "white" fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, text, "span")) end function setDevicePropertyValue(id, label, value) fibaro:call(id, "setProperty", "ui."..label..".value", value) end function getDevicePropertyValue(vDeviceid, propertyName) return fibaro:getValue(vDeviceid, "ui."..propertyName..".value") end function createGlobalIfNotExists(varName, defaultValue) if fibaro:getGlobal(varName) == "" then debug("Création de la variable "..varName.." avec comme valeur par défaut "..defaultValue) newVar = {} newVar.name = varName newVar.value = defaultValue HC2 = Net.FHttp("127.0.0.1", 11111) HC2:POST("/api/globalVariables", json.encode(newVar)) end end function refreshEcoDevicesStats() if not useSceneToRefresh then fibaro:call(deviceId, "pressButton", 5) fibaro:sleep(1000) end jsonStats = fibaro:getGlobalValue("ecoDevicesStats") if not string.find(jsonStats, '{"product":"Eco-') then debug("An error occured -> "..jsonStats, "red") debug("No stats found, please check documentation and configuration", "orange") return false end ecoDevicesStats = json.decode(jsonStats) tarif = string.format("%.2s", ecoDevicesStats[teleInfoNB.."_PTEC"]) conso = ecoDevicesStats[teleInfoNB.."_PAPP"] hcIndex = ecoDevicesStats[teleInfoNB.."_HCHC"] hpIndex = ecoDevicesStats[teleInfoNB.."_HCHP"] hcIndexStr = "HC : "..string.format("%.3f", hcIndex/1000) hpIndexStr = "HP : "..string.format("%.3f", hpIndex/1000) fibaro:log("Tarif : "..tarif.." - Conso : "..conso.." VA".." - "..hcIndexStr.." - "..hpIndexStr) iconId = baseIconId if tarif == "HP" then activeIndex = hpIndexStr inactiveIndex = hcIndexStr iconId = iconId + 9 else activeIndex = hcIndexStr inactiveIndex = hpIndexStr end -- Mise à jour des Labels setDevicePropertyValue(deviceId, "labelTarif", tarif) setDevicePropertyValue(deviceId, "labelConso", conso.." VA") setDevicePropertyValue(deviceId, "labelActiveIndex", activeIndex.." kW") setDevicePropertyValue(deviceId, "labelInactiveIndex", inactiveIndex.." kW") -- Mise à jour de l'icône conso = ecoDevicesStats[teleInfoNB.."_PAPP"] if conso >= 1000 then if conso < 9000 then iconId = iconId + tonumber(string.format("%.1s", conso)) else iconId = iconId + 8 end end fibaro:call(deviceId, "setProperty", "currentIcon", iconId) return true end function refreshDayStats() day_HC_Conso = hcIndex - day_HC_Index day_HP_Conso = hpIndex - day_HP_Index day_HC_ConsoStr = "HC : "..day_HC_Conso.." W" day_HP_ConsoStr = "HP : "..day_HP_Conso.." W" if tarif == "HP" then activeDayIndex = day_HP_ConsoStr inactiveDayIndex = day_HC_ConsoStr else activeDayIndex = day_HC_ConsoStr inactiveDayIndex = day_HP_ConsoStr end -- Calcul du coà»t en € dayCost = ((day_HP_Conso * hpCost) + (day_HC_Conso * hcCost)) / 1000 dayCost = dayCost + (dayCost * 0.2) dayCostStr = "Coà»t : "..string.format("%.2f", dayCost).." €" setDevicePropertyValue(deviceId, "labelActiveDayIndex", activeDayIndex) setDevicePropertyValue(deviceId, "labelInactiveDayIndex", inactiveDayIndex) setDevicePropertyValue(deviceId, "labelToday", dayCostStr) end function reportDayStats() message = "HC : "..day_HC_Conso.." Watts\nHP : "..day_HP_Conso.." Watts\n"..dayCostStr for k,v in pairs(userIdsToNotify) do fibaro:call(v, "sendEmail", "Consommation électrique du "..os.date("%d/%m/%Y"), message) end end function checkCptRaz() -- Tous les jours à minuit, je stockera valeur de l'index en cours if tostring(os.date("%H:%M")) == reportTime or day_HC_Index == 0 or ecoDevicesStats.raz then debug("Initialisation du compteur journalier", "green") if tostring(os.date("%H:%M")) == reportTime then reportDayStats() end day_HC_Index = hcIndex day_HP_Index = hpIndex fibaro:setGlobal("day_HC_Index", day_HC_Index) fibaro:setGlobal("day_HP_Index", day_HP_Index) while tostring(os.date("%H:%M")) == reportTime do fibaro:sleep(1000) end end end -- Création automatique des variable globales createGlobalIfNotExists("ecoDevicesStats", "0") createGlobalIfNotExists("day_HC_Index", "0") createGlobalIfNotExists("day_HP_Index", "0") -- Je rafraichis les stats une première fois pour initialiser mes variables locales if not refreshEcoDevicesStats() then return end day_HC_Index = tonumber(fibaro:getGlobalValue("day_HC_Index")) day_HP_Index = tonumber(fibaro:getGlobalValue("day_HP_Index")) -- Boucle principale while true do -- ## Pensez à bien choisir votre méthode de mise à jour des stats -- ## Méthode 1 (useSceneToRefresh = true) ## : Vous utilisez la Scene de Mise à jour des stats qui évite -- le changement d'icône indésirable -- ## Méthode 2 (useSceneToRefresh = false) ## : Pas besoin de créer la scene mais entrainera un court changement -- de l'icône durant le reresh contrairement à la précédente if not refreshEcoDevicesStats() then return end refreshDayStats() checkCptRaz() fibaro:sleep(2000) end saut de ligne Historique des versions : - V0.1 du 11/05/2015 : Eco_Devices_Live_Day_Reporter_V0.1.vfib 6
pepite Posté(e) le 11 mai 2015 Signaler Posté(e) le 11 mai 2015 Juste enooorme et excellentissime..vivement que j'ai l'eco-device, avec tous ceux qui existent le pied ;-) Pour éviter le bug du Main Loop tu pourrais le mettre dans des boutons de VD non ? En tout cas, juste merciiiiiiiiiiii :60:
Gazous Posté(e) le 11 mai 2015 Auteur Signaler Posté(e) le 11 mai 2015 Salut pepite, c'est justement ce que je propose dans la Méthode 2 mais elle présente l'inconvénient de modifier l'icône du Virtual Device durant l'actualisation des données.
ctve Posté(e) le 12 mai 2015 Signaler Posté(e) le 12 mai 2015 Superbe travail qui correspond pil-poil à ce que je cherchais. Félicitations Sauf que ... Et oui hélas il y a toujours un sauf : je ne suis pas en HP/HC mais en EJP (effacement jour de pointe). Je n'ai pas encore regardé ton code mais je pense qu'en remplaçant HC par EJPHN (les jours "normaux de l'EJP qui correspondent au tarif heures creuses) et HP par EJPHPM (les jours dits "de pointes mobiles" qui correspondent au tarif HP) ça devrait pouvoir aller. Qu'en penses-tu ?
Gazous Posté(e) le 12 mai 2015 Auteur Signaler Posté(e) le 12 mai 2015 Hello, merci. Je ne connais pas le fonctionnement des EJPHN lais on doit pouvoir l'adapter sans aucun souci. Il y a aussi 2 index ?
ctve Posté(e) le 12 mai 2015 Signaler Posté(e) le 12 mai 2015 Oui c'est le même principe sauf que l'EcoDevices au lieu de te renvoyer les index HC et HP renvoie les index EJPHN (équivalent de HC) et EJPHPM (équivalent de HP). Voici un exemple de la réponse de mon EcoDevices EJP : {"product":"Eco-devices","T1_PTEC":"HN..","T1_PAPP":3700,"T1_EJPHN":36584876,"T1_EJPHPM":921234,"T2_PTEC":"HN..","T2_PAPP":110,"T2_EJPHN":48539667,"T2_EJPHPM":914374,"INDEX_C1":3500,"INDEX_C2":3500} Il y a T1 et T2 car j'utilise T1 pour la consommation totale et T2 pour ma pompe à chaleur mais c'est surtout T1 qu'il m'intéresse d'adapter à ton virtual device. Je pense qu'il suffit de modifier l'endroit où tu récupères les index HC et HP pour récupérer à la place les index EJPHN et EJPHPM. Tout le reste de ton programme peut ensuite être identique et il n'y a qu'a changer les quelques chaines de caractères HP et HC en JN (jours normaux) et PM (jours de pointes mobiles), et de corriger les prix des kWh bien sà»r Si tu peux juste me mettre sur la voie ce serait sympa car je programme en C ou en langage machine sans problème mais j'avoue que le LUA n'est pas ma tasse de thè
Gazous Posté(e) le 12 mai 2015 Auteur Signaler Posté(e) le 12 mai 2015 Moi aussi je faisait que du C/C++ mais j'ai appris LUA par la force des choses Je vais regarder pour ton cas et je publierais une version "générique". Je vais tout simplement déterminer le type d'abonnement en fonction de la trame JSON. Est-ce que quelqu'un aurait la trame JSON d'un abonnement classique ? Je te promets pas de pouvoir m'en occuper cette semaine car j'ai pas mal de boulot et peu de temps à consacrer à ça. Mais dès que j'ai un moment je m'en occupe.
ctve Posté(e) le 13 mai 2015 Signaler Posté(e) le 13 mai 2015 Voici la trame JSON d'un abonnement classique c'est à dire sans EJP ni HP/HC {"product":"Eco-devices","T1_PTEC":"TH..","T1_PAPP":500,"T1_BASE":4783050,"T2_PTEC":"----","T2_PAPP":0,"T2_BASE":0,"INDEX_C1":3600,"INDEX_C2":3600} Prends ton temps ; rien ne presse. C'est déjà très sympa de ta part de bien vouloir t'en occuper. En attendant, je vais éplucher ton code pour me mettre un peu au LUA
iman Posté(e) le 14 mai 2015 Signaler Posté(e) le 14 mai 2015 Bonjour, Merci pour ce partage, mais étant novice comment on récupère l'ID pour la 1er image
Gazous Posté(e) le 14 mai 2015 Auteur Signaler Posté(e) le 14 mai 2015 Très simple, tu vas dans l'éditeur où tu as ajouté tes icônes, ensuite tu fais clic droit sur l'icones "Inspecter l'élément" ou l'équivalent de ton navigateur. Tu vas arriver dans le code source de la page qui décrit l'élément et là, l'id est facilement repérable.
iman Posté(e) le 14 mai 2015 Signaler Posté(e) le 14 mai 2015 Tu entend quoi par l'éditeur, la chose que j'ai fait je les importés 1 par 1 en me servant de l'import image dans le device (je suis sur mac avec safari) merci d'avance pour tes lumieres
iman Posté(e) le 14 mai 2015 Signaler Posté(e) le 14 mai 2015 Ok j'ai trouver c'était juste l'ID du module qui faut renseigné
Gazous Posté(e) le 19 mai 2015 Auteur Signaler Posté(e) le 19 mai 2015 Bonsoir, j'ai commencé àregardé pour implémenter les différents types d'abonnements. EJP ça correspond àquel type d'abonnement en fait ? C'est Tempo ou rien àvoir ? Quels sont les tarifs du Kwh de cet abonnement ? Merci !
Did Posté(e) le 19 mai 2015 Signaler Posté(e) le 19 mai 2015 Salut Brice, EJP est un ancien contrat (que EdF aimerait voir disparaître complètement) qui comporte juste 21 jours rouges (qui sont en fait des heures pleines) et 343 jours bleus (des heures creuses) mais je ne connais pas le tarif. Tempo est le remplaçant de l'EJP (je crois qu'on ne peut plus y souscrire non plus), là c'est plus compliqué: 22 jours rouges avec des heures creuses et pleines 43 jours blancs avec des heures creuses et pleines 300 jours bleus avec des heures creuses et pleines donc six tarifs ici: https://particuliers.edf.com/gestion-de-mon-contrat/options-tarifaires/option-tempo/details-de-l-option-52429.html Il y a aussi l'abonnement qui varie suivant la puissance souscrite. Edit: J'ai trouvé ceci sur le site d'EdF Tarif EJP: https://particuliers.edf.com/gestion-de-mon-contrat/options-tarifaires/option-ejp/details-de-l-option-52420.html
Gazous Posté(e) le 20 mai 2015 Auteur Signaler Posté(e) le 20 mai 2015 Merci ! Cela veut dire que en Tempo tubas 6 indexes ???
Did Posté(e) le 20 mai 2015 Signaler Posté(e) le 20 mai 2015 Oui, c'est ça. Voilà ce que mes stats dans l'éco-devices:
Gazous Posté(e) le 20 mai 2015 Auteur Signaler Posté(e) le 20 mai 2015 Holala c'est fou ça ! Et pourrais tu me donner la trame JSON que renvois l'eco-devices stp ? Pour l'obtenir tu ouvres un navigateur et tu saisis http://<ip de ton ED>/api/xdevices.json?cmd=10 Merci d'avance !
Did Posté(e) le 20 mai 2015 Signaler Posté(e) le 20 mai 2015 La trame me donne ça: {"product":"Eco-devices","T1_PTEC":"HPJB","T1_PAPP":920,"T1_BBRHCJB":54371802,"T1_BBRHPJB":71804524,"T1_BBRHCJW":8403677,"T1_BBRHPJW":12212285,"T1_BBRHCJR":3996408,"T1_BBRHPJR":3756732,"T1_DEMAIN":"----","T2_PTEC":"----","T2_PAPP":0,"T2_BBRHCJB":0,"T2_BBRHPJB":0,"T2_BBRHCJW":0,"T2_BBRHPJW":0,"T2_BBRHCJR":0,"T2_BBRHPJR":0,"T2_DEMAIN":"----","INDEX_C1":0,"INDEX_C2":0}
ctve Posté(e) le 20 mai 2015 Signaler Posté(e) le 20 mai 2015 C'est sur que tu vas avoir plus de mal avec le tarif Tempo et ses six variantes qu'avec ma modeste demande initiale relative à l'EJP
Gazous Posté(e) le 20 mai 2015 Auteur Signaler Posté(e) le 20 mai 2015 Merci Didier ! Est-ce que cela intéresse quelqu'un que je fasse évoluer mon Virtual Device afin qu'il prenne en compte les 4 types d'abonnements BASE, HPHC, EJP et TEMPO ? Si oui il me faudra des beta testeurs pour valider tout ça avant publication, surtout pour le TEMPO... Pour ce dernier, il faudra éventuellement générer une série de jauges dédiées prenant en compte les couleurs mais ça fait beaucoup d'icônes àgénérer...
Did Posté(e) le 20 mai 2015 Signaler Posté(e) le 20 mai 2015 Pour le tempo, je suis là et il y a aussi @fredo mais je ne sais pas s'il est dispo.
Gazous Posté(e) le 20 mai 2015 Auteur Signaler Posté(e) le 20 mai 2015 Bon OK, je vais essayer de faire ça bien. Il y aura je pense au moins 2 versions du VD, une avec 2 index et l'autre avec 6 index... Je pense néanmoins pouvoir faire un code générique optimisé pour la MainLoop.
ctve Posté(e) le 20 mai 2015 Signaler Posté(e) le 20 mai 2015 Pour l'EJP je suis OK pour les tests bien sûr puisque j'ai été le 1er àle demander, et le seul pour l'instant, mais c'est vrai que c'est un abonnement qu'EDF ne commercialise plus car il lui revenait trop cher ! Par contre tous ceux qui sont en EJP peuvent le garder tant qu'ils ne sont pas forcés de changer, suite àun déménagement par exemple
Did Posté(e) le 20 mai 2015 Signaler Posté(e) le 20 mai 2015 @ctve, Tu n'as jamais été harceler pour en changer?
Messages recommandés