Aller au contenu
Gazous

Eco-Devices Live & Day Reporter (Hp/hc)

Recommended Posts

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 :

 

Vue_Detail.jpg

 

 

Vue_Liste.jpg

 

La liste des icones de jauges :

post-1466-0-35479800-1431343592_thumb.pngpost-1466-0-00844600-1431343593_thumb.pngpost-1466-0-59122100-1431343593_thumb.pngpost-1466-0-20941200-1431343594_thumb.pngpost-1466-0-74878800-1431343594_thumb.pngpost-1466-0-00627100-1431343597_thumb.pngpost-1466-0-92004000-1431343598_thumb.pngpost-1466-0-18041800-1431343600_thumb.pngpost-1466-0-48699100-1431343600_thumb.pngpost-1466-0-01110900-1431343601_thumb.pngpost-1466-0-93895000-1431343636_thumb.pngpost-1466-0-12309900-1431343638_thumb.pngpost-1466-0-64153000-1431343639_thumb.pngpost-1466-0-27574400-1431343641_thumb.pngpost-1466-0-55595300-1431343642_thumb.pngpost-1466-0-01113400-1431343644_thumb.pngpost-1466-0-63726500-1431343645_thumb.pngpost-1466-0-25031500-1431343647_thumb.pngpost-1466-0-37029600-1431343649_thumb.png

 

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 : post-1466-0-37029600-1431343649_thumb.png 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 teleInfoNBbaseIconIduserIdsToNotifyuseSceneToRefresh 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

post-1466-0-78989300-1431337473_thumb.jpg

post-1466-0-02527300-1431337491_thumb.jpg

  • Upvote 6

Partager ce message


Lien à poster
Partager sur d’autres sites

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: :60: :60:

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Superbe travail qui correspond pil-poil à  ce que je cherchais.

 

Félicitations :60:

 

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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è ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Merci pour ce partage, mais étant novice comment on récupère l'ID pour la 1er image

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok j'ai trouver c'était juste l'ID du module qui faut renseigné :60:

Partager ce message


Lien à poster
Partager sur d’autres sites

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 !

Partager ce message


Lien à poster
Partager sur d’autres sites

 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

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci ! Cela veut dire que en Tempo tubas 6 indexes ???

Partager ce message


Lien à poster
Partager sur d’autres sites

 Oui, c'est ça. Voilà  ce que mes stats dans l'éco-devices:

 

post-43-0-91045900-1432110718_thumb.jpg

Partager ce message


Lien à poster
Partager sur d’autres sites

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 !

Partager ce message


Lien à poster
Partager sur d’autres sites

 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}

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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...

Partager ce message


Lien à poster
Partager sur d’autres sites

 Pour le tempo, je suis là  et il y a aussi @fredo mais je ne sais pas s'il est dispo.

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :)

Partager ce message


Lien à poster
Partager sur d’autres sites

 @ctve,

Tu n'as jamais été harceler pour en changer?

Partager ce message


Lien à poster
Partager sur d’autres sites

×