jagalindo / edistribucion

API para e-distribución (Endesa distribución)
GNU General Public License v3.0
37 stars 11 forks source link

Integración en Home Assistant #1

Closed jjprz closed 3 years ago

jjprz commented 3 years ago

¿Cómo se puede integrar en Home Assistant? ¿Alguna documentación para esto?

bepece1 commented 3 years ago

¿Cómo se puede integrar en Home Assistant? ¿Alguna documentación para esto?

Estaría genial, llevo muchísimo tiempo detrás de esta integración 😉

bepece1 commented 3 years ago

Gracias a @jagalindo por actualizar el código e integrarlo en HA Lo he revisado y todo está correctamente funcionando

PD: para la próxima realease hemos de añadir más atributos a este sensor ('totalizador','estadoICP','potenciaContratada','percent',etc...) :D

jjprz commented 3 years ago

Funciona! Por mi parte he añadido los demás atributos y he modificado la unidad de medida de la potencia actual que era errónea.

jagalindo commented 3 years ago

¡Gracias a los dos! @jjprz, podrías compartir el código para añadir los demás atributos. He estado mirando como se haría con un multisensor, pero aun no me he puesto a implementarlo.

Idealmente lo suyo es que con una petición se traiga todos los atributos en vez de tener un sensor por atributo. No me da mucha confianza que edistribución hacer una petición por cada sensor por si acaso acaban baneando el uso de su "API"

jagalindo commented 3 years ago

He localizado una solución para implementarlo como multisensor https://github.com/drogfild/hass-multiscrape/blob/dd32b0eaa6bd1a53181b48c2a4b66db033f25ce8/sensor.py

jjprz commented 3 years ago

Simplemente los he añadido como atributos, tampoco quería que hiciera más de una llamada. Lo pego aquí porque me da error el fork que hice.


import logging
from homeassistant.const import POWER_KILO_WATT
from homeassistant.helpers.entity import Entity
from .backend.EdistribucionAPI import Edistribucion
from datetime import timedelta

_LOGGER = logging.getLogger(__name__)
SCAN_INTERVAL = timedelta(minutes=10)

def setup_platform(hass, config, add_entities, discovery_info=None):

    """Set up the sensor platform."""
    ha_entities = []
    ha_entities.append(EDSSensor(config['username'],config['password']))
    add_entities(ha_entities)

class EDSSensor(Entity):
    """Representation of a Sensor."""

    def __init__(self,usr,pw):
        """Initialize the sensor."""
        self._state = None
        self._attributes = {}
        self._usr=usr
        self._pw=pw

    @property
    def name(self):
        """Return the name of the sensor."""
        return 'EDS Power Consumption'

    @property
    def state(self):
        """Return the state of the sensor."""
        return self._state

    @property
    def unit_of_measurement(self):
        """Return the unit of measurement."""
        return POWER_KILO_WATT

    @property
    def device_state_attributes(self):
        """Return the state attributes."""
        return self._attributes

    def update(self):
        """Fetch new state data for the sensor."""
        edis = Edistribucion(self._usr,self._pw)
        edis.login()
        r = edis.get_cups()
        cups = r['data']['lstCups'][0]['Id']
        meter = edis.get_meter(cups)
        _LOGGER.debug(meter)
        _LOGGER.debug(meter['data']['potenciaActual'])
        attributes = {}
        attributes['Estado ICP'] = meter['data']['estadoICP']
        attributes['Totalizador'] = str(meter['data']['totalizador']) + ' kWh'
        attributes['Porcentaje actual'] = meter['data']['percent']
        attributes['Potencia Contratada'] = str(meter['data']['potenciaContratada']) + ' kW'
        self._state = meter['data']['potenciaActual']
        self._attributes = attributes
jjprz commented 3 years ago

¿Se pueden crear sensores con los atributos? Me suena que sí se puede pero nunca lo he hecho. Si es así, nos ahorraríamos lo de multisensor.

bepece1 commented 3 years ago

¿Se pueden crear sensores con los atributos? Me suena que sí se puede pero nunca lo he hecho. Si es así, nos ahorraríamos lo de multisensor.

Sí, se pueden crear de esta forma:

bepece1 commented 3 years ago

Por cierto, lleva varios días sin funcionar la integración, ¿os pasa también a vosotros? La cosa es que la he probado el script python de trocotronic y si funciona pero parece ser que tarda muchísimo en actualizar los datos por lo que me temo que es un problema de "time-out", ¿Cómo se puede configurar eso en la integración? Ya me comentáis @jagalindo @jjprz

jjprz commented 3 years ago

Este es el error que me sale a mí:`

Logger: homeassistant.helpers.entity Source: custom_components/edistribucion/backend/EdistribucionAPI.py:132 First occurred: 0:39:56 (57 occurrences) Last logged: 9:59:55

Update for sensor.eds_power_consumption fails Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 278, in async_update_ha_state await self.async_device_update() File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 474, in async_device_update raise exc File "/usr/local/lib/python3.8/concurrent/futures/thread.py", line 57, in run result = self.fn(*self.args, self.kwargs) File "/config/custom_components/edistribucion/sensor.py", line 51, in update r = edis.get_cups() File "/config/custom_components/edistribucion/backend/EdistribucionAPI.py", line 235, in get_cups r = self.__command('other.WP_ContadorICP_CTRL.getCUPSReconectarICP=1', post=data) File "/config/custom_components/edistribucion/backend/EdistribucionAPI.py", line 132, in __command jr = r.json() File "/usr/local/lib/python3.8/site-packages/requests/models.py", line 900, in json return complexjson.loads(self.text, kwargs) File "/usr/local/lib/python3.8/site-packages/simplejson/init.py", line 525, in loads return _default_decoder.decode(s) File "/usr/local/lib/python3.8/site-packages/simplejson/decoder.py", line 370, in decode obj, end = self.raw_decode(s) File "/usr/local/lib/python3.8/site-packages/simplejson/decoder.py", line 400, in raw_decode return self.scan_once(s, idx=_w(s, idx).end()) simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

bepece1 commented 3 years ago

Este es el error que me sale a mí:`

Logger: homeassistant.helpers.entity Source: custom_components/edistribucion/backend/EdistribucionAPI.py:132 First occurred: 0:39:56 (57 occurrences) Last logged: 9:59:55

Update for sensor.eds_power_consumption fails Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 278, in async_update_ha_state await self.async_device_update() File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 474, in async_device_update raise exc File "/usr/local/lib/python3.8/concurrent/futures/thread.py", line 57, in run result = self.fn(*self.args, self.kwargs) File "/config/custom_components/edistribucion/sensor.py", line 51, in update r = edis.get_cups() File "/config/custom_components/edistribucion/backend/EdistribucionAPI.py", line 235, in get_cups r = self.__command('other.WP_ContadorICP_CTRL.getCUPSReconectarICP=1', post=data) File "/config/custom_components/edistribucion/backend/EdistribucionAPI.py", line 132, in __command jr = r.json() File "/usr/local/lib/python3.8/site-packages/requests/models.py", line 900, in json return complexjson.loads(self.text, kwargs) File "/usr/local/lib/python3.8/site-packages/simplejson/init.py", line 525, in loads return _default_decoder.decode(s) File "/usr/local/lib/python3.8/site-packages/simplejson/decoder.py", line 370, in decode obj, end = self.raw_decode(s) File "/usr/local/lib/python3.8/site-packages/simplejson/decoder.py", line 400, in raw_decode return self.scan_once(s, idx=_w(s, idx).end()) simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

a ver si @jagalindo nos puede echar un cable...

jagalindo commented 3 years ago

Parece que efectivamente el backend está fallando. A mi personalmente no me está funcionando el script de @trocotronic

jagalindo commented 3 years ago

Por cierto, lleva varios días sin funcionar la integración, ¿os pasa también a vosotros? La cosa es que la he probado el script python de trocotronic y si funciona pero parece ser que tarda muchísimo en actualizar los datos por lo que me temo que es un problema de "time-out", ¿Cómo se puede configurar eso en la integración? Ya me comentáis @jagalindo @jjprz

Acabo de revisar y parece que han hecho algún cambio en la API de eds. He conseguido que todo vuelva a la normalidad eliminando los ficheros de sesión y tokens. En un rato subo una versión del backend que no almacena esos ficheros e integra las mejoras que menciona @jjprz. Si los teneis en vuestra carpeta de la extensión borradlos.

bepece1 commented 3 years ago

Hola @jagalindo Vuelve a funcionar correctamente y además con la sorpresa que lo has integrado en HACS

Eres un crack ;-)

Muchísimas gracias.

jjprz commented 3 years ago

Fantástico. Vuelve a funcionar. Por cierto... Lo tengo puesto cada 10 minutos pero aún así parece que sufro baneos y no puedo loguearme al contador, ni siquiera desde la página web, ¿os pasa lo mismo? ¿sabéis cuál es el límite de logins que se pueden hacer al día?

Muchas gracias a todos.

bepece1 commented 3 years ago

Fantástico. Vuelve a funcionar. Por cierto... Lo tengo puesto cada 10 minutos pero aún así parece que sufro baneos y no puedo loguearme al contador, ni siquiera desde la página web, ¿os pasa lo mismo? ¿sabéis cuál es el límite de logins que se pueden hacer al día?

Muchas gracias a todos.

No, yo también lo tengo por defecto en 10m y no tengo baneos. Por cierto, después de tener todo esto funcionando de maravilla me veo obligado (tema económico) a pasarme al PVPC y ahorrar unos eurillos. Os animo a ello. Me paso a Energía XXI. ¿Sabéis si existe algo para esta distribuidora regulada?

jjprz commented 3 years ago

Yo ya tengo PVPC y Energía XXI. Te funcionará igual ya que tu distribuidora seguirá siendo eDistribucion sea cual sea la comercializadora a la que te pases.