Skip to content

Commit

Permalink
Merge pull request #214 from saniho/sensorEcoWatt
Browse files Browse the repository at this point in the history
Sensor eco watt
  • Loading branch information
saniho committed Dec 29, 2022
2 parents 948674e + 4de20da commit bb86a21
Show file tree
Hide file tree
Showing 13 changed files with 434 additions and 5 deletions.
4 changes: 3 additions & 1 deletion custom_components/apiEnedis/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,13 @@
HP_COST,
HEURESCREUSES_ON,
HEURES_CREUSES,
_ENEDIS_EnedisGateway,
_ENEDIS_MyElectricData,
)


_LOGGER = logging.getLogger(__name__)
all_repos_Gateway = ["enedisGateway", "myElectricalData"]
all_repos_Gateway = [_ENEDIS_EnedisGateway, _ENEDIS_MyElectricData]


class myEnedisFlowHandler( # type: ignore[call-arg]
Expand Down
7 changes: 7 additions & 0 deletions custom_components/apiEnedis/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ def __init__(self):
_consommation = "consommation"
_production = "production"

_ENEDIS_MyElectricData = "myElectricalData"
_ENEDIS_EnedisGateway = "enedisGateway"

PLATFORMS = ["sensor"]

_formatDateYmd = "%Y-%m-%d"
Expand Down Expand Up @@ -106,6 +109,10 @@ def __init__(self):
ENTITY_NAME: "energyDetailHoursCost",
ENTITY_DELAI: 60,
},
"ecowatt": {
ENTITY_NAME: "ecowatt",
ENTITY_DELAI: 60,
},
}


Expand Down
2 changes: 1 addition & 1 deletion custom_components/apiEnedis/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"issue_tracker": "https://github.com/saniho/apiEnedis/issues",
"iot_class": "cloud_polling",
"config_flow": true,
"version": "2.2.0",
"version": "2.3.0",
"requirements": [
"packaging>=20.8"
],
Expand Down
30 changes: 28 additions & 2 deletions custom_components/apiEnedis/myCall.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
try:
from .const import ( # isort:skip
__nameMyEnedis__,
_ENEDIS_MyElectricData,
_ENEDIS_EnedisGateway,
)

except ImportError:
Expand Down Expand Up @@ -86,10 +88,10 @@ def getServiceEnedis(self):
return self._serviceEnedis

def isMyElectricData(self, serviceEnedis):
return serviceEnedis == "myElectricalData"
return serviceEnedis == _ENEDIS_MyElectricData

def isEnedisGateway(self, serviceEnedis):
return serviceEnedis == "enedisGateway"
return serviceEnedis == _ENEDIS_EnedisGateway

def setLastAnswer(self, lastanswer):
self._lastAnswer = lastanswer
Expand Down Expand Up @@ -157,6 +159,10 @@ def getUrl(self, serviceEnedis, data):
url = url + "/" + data["type"] + "/" + data["usage_point_id"] + "/" + \
"start" + "/" + data["start"] + "/" + \
"end" + "/" + data["end"] + "/"
elif data["type"] == "rte/ecowatt":
url = url + "/" + data["type"] + "/" + \
data["start"] + "/" + \
data["end"] + "/"
return "get", url
# return "get", url + "cache"
elif self.isEnedisGateway(serviceEnedis):
Expand Down Expand Up @@ -342,6 +348,26 @@ def getDataProductionPeriod(self, deb, fin):
self.setLastAnswer(dataAnswer)
return dataAnswer, callDone

def getDataEcoWatt(self, deb, fin):
if fin is not None:
payload = {
"type": "rte/ecowatt",
"usage_point_id": self._PDL_ID,
"start": str(deb),
"end": str(fin),
}
headers = self.getDefaultHeader()
dataAnswer = self.post_and_get_json(
self.getServiceEnedis(), data=payload, headers=headers
)
callDone = True
else:
# pas de donnée
callDone = False
dataAnswer = ""
self.setLastAnswer(dataAnswer)
return dataAnswer, callDone

def getDataPeriodCLC(self, deb, fin):
if fin is not None:
payload = {
Expand Down
33 changes: 33 additions & 0 deletions custom_components/apiEnedis/myCheckData.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,18 @@ def analyseValue(self, data):
else:
return None

def analyseValueEcoWatt(self, data):
listeEcoWattDate = {}
if data is None: # pas de valeur
return None
else:
from datetime import datetime
for date in data.keys():
for detailDate in data[date]["detail"]:
detailDatekey = datetime.strptime(detailDate, "%Y-%m-%d %H:%M:%S")
listeEcoWattDate[detailDatekey] = data[date]["detail"][detailDate]
return listeEcoWattDate

def checkData(self, dataAnswer):
# new version de la réponse
# si erreur 500
Expand Down Expand Up @@ -108,3 +120,24 @@ def checkDataPeriod(self, dataAnswer):
if API.METER_READING not in dataAnswer.keys():
return False
return True

def checkDataEcoWatt(self, dataAnswer):
if dataAnswer.get(API.ERROR_CODE, 200) == 500:
return False
if API.ERROR_CODE in dataAnswer.keys():
if (
(dataAnswer[API.ERROR_CODE] == "ADAM-ERR0123")
or (dataAnswer[API.ERROR_CODE] == "no_data_found")
or (dataAnswer[API.ERROR_CODE] == "ADAM-ERR0069")
or (dataAnswer[API.ERROR_CODE] == "UNKERROR_002")
):
return False
# collecte horaire non activée
if dataAnswer[API.ERROR_CODE] == "ADAM-ERR0075":
return False
if dataAnswer[API.ERROR_CODE] == "Internal Server error":
# erreur interne enedis
raise Exception("call", "error", "UNKERROR_001")
else:
raise Exception("call", "error", dataAnswer[API.ERROR_CODE])
return True
42 changes: 42 additions & 0 deletions custom_components/apiEnedis/myClientEnedis.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from .const import ( # isort:skip
__nameMyEnedis__,
_formatDateYmd,
_ENEDIS_MyElectricData,
)
from . import messages

Expand All @@ -28,6 +29,7 @@
from .myDataEnedisByDayDetail import myDataEnedisByDayDetail
from .myDataEnedisMaxPower import myDataEnedisMaxPower
from .myDataEnedisProduction import myDataEnedisProduction
from .myDataEnedisEcoWatt import myDataEnedisEcoWatt

log = logging.getLogger(__nameMyEnedis__)

Expand Down Expand Up @@ -130,6 +132,11 @@ def __init__(
self._yesterdayConsumptionMaxPower = myDataEnedisMaxPower(
self._myCalli, self._token, self._version, self.contract
)

self._ecoWatt = myDataEnedisEcoWatt(
self._myCalli, self._token, self._version, self.contract
)

log.info("run myEnedis")
self._gitVersion: str | None = None
self._dataJsonDefault: dict[str, Any] = {}
Expand Down Expand Up @@ -749,6 +756,29 @@ def updateYesterdayProduction(self, data=None, withControl=True):
self.setDataRequestJson(clefFunction, self._productionYesterday)
self.setNbCall(self._productionYesterday.getNbCall())

def updateEcoWatt(self, data=None, withControl=True):
clefFunction = "updateEcoWatt"
self.lastMethodCall = clefFunction
requestJson = self.getDataRequestJson(clefFunction)
if data is None:
data = self.getDataJsonValue(clefFunction)
hier = (datetime.date.today() - datetime.timedelta(1)).strftime(_formatDateYmd)
demain = (datetime.date.today() + datetime.timedelta(1)).strftime(_formatDateYmd)
deb = self.contract.minCompareDateContract(hier)
fin = self.contract.maxCompareDateContract(demain)
data = self._ecoWatt.updateData(
clefFunction,
self.getHorairePossible(),
data,
deb,
fin,
withControl=withControl,
dataControl=requestJson,
)
self.setDataJsonValue(clefFunction, data)
self.setDataRequestJson(clefFunction, self._ecoWatt)
self.setNbCall(self._ecoWatt.getNbCall())

def updateYesterdayConsumptionMaxPower(self, data=None, withControl=True):
clefFunction = "updateYesterdayConsumptionMaxPower"
self.lastMethodCall = clefFunction
Expand Down Expand Up @@ -833,6 +863,9 @@ def getLastYear(self):
def getCurrentYear(self):
return self._currentYear

def getEcoWatt(self):
return self._ecoWatt

def getLastUpdate(self):
return self._lastUpdate

Expand Down Expand Up @@ -1121,6 +1154,14 @@ def callProduction(self):
self.updateStatusLastCall(True)
log.info("mise à jour effectuee production")

def callEcoWatt(self):
if ((self.getStatusLastCall() or self.lastMethodCallError == "updateEcoWatt")
and (self.getServiceEnedis() == _ENEDIS_MyElectricData)):
self.updateEcoWatt()
self.updateTimeLastCall()
self.updateStatusLastCall(True)
log.info("mise à jour effectuee EcoWatt")

def update(self): # noqa C901
log.info(f"myEnedis ...new update ?? {self._PDL_ID}")
if self.contract.isLoaded:
Expand Down Expand Up @@ -1149,6 +1190,7 @@ def update(self): # noqa C901
try:
self.callConsommation()
self.callProduction()
self.callEcoWatt()
if self._forceCallJson:
self._forceCallJson = False
self.setDataJsonDefault({})
Expand Down
102 changes: 102 additions & 0 deletions custom_components/apiEnedis/myDataEnedisEcoWatt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
try:
from .const import ( # isort:skip
__nameMyEnedis__,
)

except ImportError:
from const import ( # type: ignore[no-redef]
__nameMyEnedis__,
)

import logging

from .myCheckData import myCheckData
from .myDataControl import getInformationDataControl, okDataControl

log = logging.getLogger(__nameMyEnedis__)


class myDataEnedisEcoWatt:
def __init__(self, myCalli, token, version, contrat):
self.myCalli = myCalli
self._value = {}
self._date = None
self._contrat = contrat
self._token, self._version = token, version
self._dateDeb = None
self._dateFin = None
self._callOk = None
self._nbCall = 0
self._data = None

def CallgetData(self, dateDeb, dateFin):
val1, val2 = self.myCalli.getDataEcoWatt(dateDeb, dateFin)
return val1, val2

def getValue(self):
return self._value

def getDateFin(self):
return self._dateFin

def getDateDeb(self):
return self._dateDeb

def getCallOk(self):
return self._callOk

def getNbCall(self):
return self._nbCall

def updateData(
self,
clefFunction,
horairePossible=True,
data=None,
dateDeb=None,
dateFin=None,
withControl=False,
dataControl=None,
):
self._nbCall = 0
onLance = True
if withControl:
if okDataControl(clefFunction, dataControl, dateDeb, dateFin):
onLance = True
self._callOk = True
else:
if not horairePossible:
onLance = True
dateDeb, dateFin, self._callOk = getInformationDataControl(
dataControl
)
if self._callOk is None:
data = (
None # si on doit mettre à jour .... sauf si on est pas la
)
else:
self._callOk = None
data = None # si on doit mettre à jour .... sauf si on est pas la
if onLance:
self._dateDeb = dateDeb
self._dateFin = dateFin
log.info(f"--updateData {clefFunction} ( du {dateDeb} au {dateFin} )--")
self._data = data
if self._data is None:
self._data, callDone = self.CallgetData(dateDeb, dateFin)
self._nbCall = 1
else:
callDone = True
log.info("updateData : data %s", self._data)
if (callDone) and (myCheckData().checkDataEcoWatt(self._data)):
self._value = myCheckData().analyseValueEcoWatt(self._data)
self._callOk = True
else:
self._value = 0
self._callOk = callDone
log.info(f"with update !! {clefFunction} ( du {dateDeb} au {dateFin} )--")
log.info("updateData : data %s", (self._data))
else:
log.info(f"noupdate !! {clefFunction} ( du {dateDeb} au {dateFin} )--")
log.info("no updateData : data %s", (self._data))
return self._data
Loading

0 comments on commit bb86a21

Please sign in to comment.