Page 2 sur 16
Re: Eco compteur Legrand
Publié : 18 mars 2017, 18:59
par bobf
bonjour,
j'ai pas mal joué avec l'EcoCompteur et me suis arraché quelques cheveux.
Voici ce que j'ai trouvé d'intéressant :
le fichier log2.html semblait sympa, mais il n'a qu'une profondeur d'environ 30 heures.
c'est bien mais si on ne l'interroge pas une fois par jour, il y a des trous.
En se connectant sur l'EcoCompteur par ftp, on trouve des fichiers binaires qui contiennent tout l'historique sur l'année (ou sur les 12 derniers mois, je saurait peut-être le 1er janvier prochain).
Ces fichiers s'appellent H1.BIN à H12.BIN
comme vous l'aurez deviné, il y en a un par mois. Je pense que H1.BIN est pour le mois de janvier etc. (mais il se pourrait que c'est pour le premier mois d'utilisation, vu que je l'installé en janvier ! mais j'en doute, car toute la structure de ces fichiers est très rigide)
les donnés sont stockées en virgule flottante sur 32 bits little endian (équivalent au format single dans VBA)
chaque fichier est constitué de 31 blocks (un par jour)
chacun de ces blocs contient 12 blocks (un par canal)
chacun de ces blocs contient 24 flottants (un par heure) qui représentent l'énergie consommée en Watt.heure
Je n'ai pas encore de box domotique, donc pour exploiter ces données, j'utilise bêtement Excel en vba. Mon script se connecte par ftp, télécharge les 12 fichiers binaires, puis les décortique et afficher cela avec des graphiques comme je les aime.
concernant les connexion ftp, j'ai trouvé ailleurs sur le web que le login et mot de passe sont admin et password.
Il me semble que les fichiers sont réinitialisés lors d'une coupure secteur, mais je préfère ne pas essayer pour le moment.
si quelqu'un a un EcoCompteur depuis plus longtemps, j'aimerais savoir comment est géré le passage de décembre à janvier (est-ce que les fichiers sont réinitialisés, ou est-ce qu'ils sont gérés comme un buffer tournant).
Re: Eco compteur Legrand
Publié : 21 mars 2017, 15:43
par Be-Live
Bonjour,
J'ai un ecocompteur Legrand depuis janvier 2016.
Je serai intéressé par ton script vba pour récupérer ces données.
Je pourrais ainsi t'indiquer comment est gérer le changement d'année.
Be-Live
Re: Eco compteur Legrand
Publié : 22 mars 2017, 19:08
par bobf
bonjour,
le script vba commence par lancer un script .bat, qui va rapatrier les données par ftp.
voici le script vba qui lance le fichier bat. Note bien les commentaires qui décrivent le contenu des deux fichiers ftp_eco.bat et ftp_Eco.txt
prochaine étape: je vais faire en sorte que le script vb génère lui-même ces fichiers. Ce serait plus propre.
Code : Tout sélectionner
Public Sub ftRetrieve()
' the file ftp_eco.bat must be in the same folder as the excel file, and contains this:
' ftp -s:"ftp_Eco.txt"
'
' the file ftp_Eco.txt must be in the same folder as the excel file, and contains this:
' open 192.168.0.9
' admin
' Password
' get H1.BIN
' get H2.BIN
' get H3.BIN
' get H4.BIN
' get H5.BIN
' get H6.BIN
' get H7.BIN
' get H8.BIN
' get H9.BIN
' get H10.BIN
' get H11.BIN
' get H12.BIN
' bye
'
strFile = "ftp_eco.bat"
strWndStyle = vbNormalFocus
Shell "cmd /k cd D:\Documents\EcoCompteur && " & strFile, strWndStyle
End Sub
et maintenant, voici le bout de code qui interprètes les données
Note que dans mon cas, je n'ai pas le téléinfo.
Normalement, l'EcoCompteur reçois ces données du compteur général, et connaît ainsi la conso totale, et le tarif.
pour palier à cela, j'utilise la première voie sur l'arrivée au tableau électrique. Et pour les tarifs, j'utilise une feuille excel dans laquelle je note les tarif jour par jour.
Code : Tout sélectionner
Sub CopyCsv()
Set shtProcessed = ThisWorkbook.Worksheets("ProcessedLog2")
'refresh the Query to the EcoCompteur
'Set shtRaw = ThisWorkbook.Worksheets("RawLog2")
' Sheets("RawLog2").Select
' Range("A1").Select
' Selection.ListObject.TableObject.Refresh
NbRowProcessed = shtProcessed.UsedRange.Rows.Count
'------------------------------
' File structure :
' Day 1..31
' Channel 0..11
' Hour 0..23
' data = energy in kWh (As floating point, on 32 bits, little endian, i.e. "Single" in VBA)
Dim intFileNum, bytTemp As Byte, intCellRow
Dim fltTemp As Single
Dim fltOther(24) As Single
Dim prix(24) As Single
' Call the .bat that reads the BIN files from EcoCompteur
'--------------------------------------------------------
Call ftRetrieve
intFileNum = FreeFile
intCellRow = 2
ThisWorkbook.Worksheets("ProcessedLog2").Activate
' shtProcessed.Activate
iCurrentYear = Year(Date)
For iMonth = 1 To 12 'loop through all the months available
iHour = 0
iDay = 1
iChannel = 0
strFileName = Application.ActiveWorkbook.Path + "\H" & iMonth & ".BIN"
Open strFileName For Binary Access Read As intFileNum Len = 4
Do While Not (EOF(intFileNum))
' test the date : if it's after today, I assume it's from last year (the data files are probably fifo buffer)
'-------------------------------
mystr = iDay & "/" & iMonth & "/" & iCurrentYear
If Not IsDate(mystr) Then
Exit Do
End If
ddate = DateValue(mystr)
If ddate > Date Then
iYear = iCurrentYear - 1
ddate = DateValue(iDay & "/" & iMonth & "/" & iYear)
Else
iYear = iCurrentYear
End If
' Read One float from the file
'-------------------------------
Get intFileNum, , fltTemp
fltTemp = fltTemp / 1000 ' use KWH rather than Wh
' Process the data
'-------------------------------
If iChannel = 0 Then ' this channel is used for the total
' Channel 0 is the EDF channel (I don't use)
' let's initialize the row when dealing with this channel
myDateTime = CDate(iDay & "/" & iMonth & "/" & iYear & " " & iHour & ":01:00")
Cells(intCellRow + iHour, 1) = ddate 'iDay
Cells(intCellRow + iHour, 2) = iMonth
Cells(intCellRow + iHour, 3) = iYear
Cells(intCellRow + iHour, 4) = iHour
Cells(intCellRow + iHour, 5) = myDateTime 'Minutes -- actually the whole date
'fltOther(iHour) = fltTemp ' initialize the 'other' vaue with the total
' I coomment it out because my total comes from chhannel 1 instead of EDF
' rechercher dans la feuille Tempo le jour de cette ligne ==> Couleur
With Worksheets("Tempo").Range("a3:a1000")
Set c = .Find(ddate, LookIn:=xlValues)
If Not c Is Nothing Then
couleurJour = c.Offset(0, 1)
couleurVeille = c.Offset(-1, 1)
If iHour < 6 Then
combine = couleurVeille & "_HC"
Else
If iHour >= 22 Then
combine = couleurJour & "_HC"
Else
combine = couleurJour & "_HP"
End If
End If
Else
combine = "Non renseigné"
If fltTemp = 0 Then
Else
MsgBox ("la couleur du jour " & ddate & " n'est pas renseignée dans la feuille Tempo. Mise à jour arrêtée")
Exit Sub
End If
End If
End With
' rechercher dans la feuille Tempo la combinaison Couleur et HC/HP de cette ligne ==> Prix
With Worksheets("Tempo").Range("g3:g10")
Set c = .Find(combine, LookIn:=xlValues)
If Not c Is Nothing Then
prix(iHour) = c.Offset(0, 1)
End If
End With
'mettre dans la colonne T le tarif
Cells(intCellRow + iHour, 20) = combine
Else
If iChannel = 11 Then ' if the last channel is reached
Cells(intCellRow + iHour, 6) = fltOther(iHour)
Cells(intCellRow + iHour, 7) = fltOther(iHour) * prix(iHour)
Else
If iChannel < 6 Then ' ignore the channels 6 and above (I don't use)
If iChannel = 1 Then
fltOther(iHour) = fltTemp ' initialize the 'other' value with the total
Else
fltOther(iHour) = fltOther(iHour) - fltTemp 'substract the channel's energy from the remianing (other)
End If
Cells(intCellRow + iHour, 6 + 2 * iChannel) = fltTemp 'Energy of the channel
Cells(intCellRow + iHour, 6 + 2 * iChannel + 1) = fltTemp * prix(iHour) 'price of the channel
End If
End If
End If
'------------------------------------------------
iHour = iHour + 1 ' next hour for same channel
If iHour > 23 Then ' next channel for same day
iHour = 0
iChannel = iChannel + 1
If iChannel > 11 Then ' next day
iChannel = 0
iDay = iDay + 1
intCellRow = intCellRow + 24
End If
End If
Loop
Close intFileNum
Next iMonth 'end of loop through all months
' update all pivot tables
'-------------------------------------------------
Sheets("TCD_prix").PivotTables("Tableau croisé dynamique2").PivotCache.Refresh
Sheets("TCD_KWh").PivotTables("Tableau croisé dynamique1").PivotCache.Refresh
Sheets("TCD_PrixTarif").PivotTables("Tableau croisé dynamique1").PivotCache.Refresh
Sheets("Graphiques").Select
End Sub
bon courage
Re: Eco compteur Legrand
Publié : 25 mars 2017, 07:01
par bobf
voici les fichiers
comme il y des appels en dur, je te recommande de dézipper dans le répertoire D:\Documents\EcoCompteur
ou bien d'adapter le contenu.
n'oublie pas de modifier l'adresse IP de l'EcoCompteur dans le fichier .txt
Re: Eco compteur Legrand
Publié : 25 mars 2017, 14:49
par Be-Live
Merci, je vais regarder cela dès que j'ai une minute
Re: Eco compteur Legrand
Publié : 23 juin 2017, 17:13
par zycker
bobf a écrit :voici les fichiers
comme il y des appels en dur, je te recommande de dézipper dans le répertoire D:\Documents\EcoCompteur
ou bien d'adapter le contenu.
n'oublie pas de modifier l'adresse IP de l'EcoCompteur dans le fichier .txt
Salut,
Je viens de m'acheter un ecocompteur aussi, est-ce que tu peux détailler un peu comment utiliser tes scripts, j'ai pas compris.
Re: Eco compteur Legrand
Publié : 11 janv. 2018, 20:21
par clecointre
Bonsoir,
Je viens d'acquérir un ecocompteur et aurais souhaité avoir plus de renseignements sur la mise en oeuvre du script de Pierryck.
Je n'arrive pas a le faire fonctionner chez moi et même pire lorsque j'utilise ce script l'application Domoticz devient vierge.
Quels sont les compteurs à utiliser pour la visualisation?
Merci d'avance.
Re: Eco compteur Legrand
Publié : 15 janv. 2018, 20:58
par clecointre
Bonsoir,
En m'inspirant de différents scripts dont celui de Pierryck (merci), voici ce que j'utilise chez moi.
Code : Tout sélectionner
-- Ce script permet de récupérer les postes de dépenses EcoCompteur
----------------------------------------------
------ Configuration ------
----------------------------------------------
local url = 'http://192.168.XXX.XXX/inst.json'
local C1 = 'Chauffe eau'
local C2 = 'Chauffage phase 1'
local C3 = 'Chauffage phase 2'
local C4 = 'Chauffage phase 3'
local C5 = 'Lave linge'
local RAZ = 'RAZ'
----------------------------------------------
-- Fin de la partie configuration --
----------------------------------------------
commandArray={}
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
local config=assert(io.popen("curl '"..url.."'"))
local location = config:read('*all')
config:close()
local jsonLocation = json:decode(location)
local data1=jsonLocation.data1 -- Chauffe eau
local data2=jsonLocation.data2 -- Chauffage phase 1
local data3=jsonLocation.data3 -- Chauffage phase 2
local data4=jsonLocation.data4 -- Chauffage phase 3
local data5=jsonLocation.data5 -- Lave linge
local heure=jsonLocation.heure -- Heure de la mesure instantanée
local minute=jsonLocation.minute -- Minute de la mesure instantanée
p1, totalP1 = string.match(otherdevices_svalues[C1], "(%d+%.*%d*);(%d+%.*%d*)")
p1 = tonumber(data1)
if (otherdevices[RAZ] == 'On') then
totalP1 = 0
else
totalP1 = tonumber(totalP1 + (p1 / 60))
end
commandArray[1]={ ['UpdateDevice']= 1266 .. "|0|" .. p1 .. ';' .. totalP1 }
p2, totalP2 = string.match(otherdevices_svalues[C2], "(%d+%.*%d*);(%d+%.*%d*)")
p2 = tonumber(data2)
if (otherdevices[RAZ] == 'On') then
totalP2 = 0
else
totalP2 = tonumber(totalP2 + (p2 / 60))
end
commandArray[2]={ ['UpdateDevice']= 1267 .. "|0|" .. p2 .. ';' .. totalP2 }
p3, totalP3 = string.match(otherdevices_svalues[C3], "(%d+%.*%d*);(%d+%.*%d*)")
p3 = tonumber(data3)
if (otherdevices[RAZ] == 'On') then
totalP3 = 0
else
totalP3 = tonumber(totalP3 + (p3 / 60))
end
commandArray[3]={ ['UpdateDevice']= 1268 .. "|0|" .. p3 .. ';' .. totalP3 }
p4, totalP4 = string.match(otherdevices_svalues[C4], "(%d+%.*%d*);(%d+%.*%d*)")
p4 = tonumber(data4)
if (otherdevices[RAZ] == 'On') then
totalP4 = 0
else
totalP4 = tonumber(totalP4 + (p4 / 60))
end
commandArray[4]={ ['UpdateDevice']= 1269 .. "|0|" .. p4 .. ';' .. totalP4 }
p5, totalP5 = string.match(otherdevices_svalues[C5], "(%d+%.*%d*);(%d+%.*%d*)")
p5 = tonumber(data5)
if (otherdevices[RAZ] == 'On') then
totalP5 = 0
else
totalP5 = tonumber(totalP5 + (p5 / 60))
end
commandArray[5]={ ['UpdateDevice']= 1270 .. "|0|" .. p5 .. ';' .. totalP5 }
print('**************** Ecocompteur ************')
print(data1)
print(data2)
print(data3)
print(data4)
print(data5)
print(heure)
print(minute)
print('****************')
return commandArray
Re: Eco compteur Legrand
Publié : 05 févr. 2018, 21:24
par DenisMartin
Bonsoir,
Pour info, j'ai poussé un plugin EcoCompteur dans la dernière version (beta) de Domoticz.
Il est encore tout frais, mais il permet déjà de surveiller les 5 canaux en Watt instantané et en kWh heure par heure.
C'est moins flexible que le Python, mais c'est pratique pour ceux qui ne veulent pas écrire de code
Denis
Re: Eco compteur Legrand
Publié : 06 mars 2018, 10:06
par neuvidor
Merci DenisMartin !
Je confirme que le plugin fonctionne parfaitement.
As-tu prévu d'intégrer les index compteur EDF (HC + HP) ainsi que les deux compteurs C1 et C2 ?
Personnellement j'utilise les 2 compteurs pour C1="Eau froide" et C2="Eau chaude" en m3.