homeassistant-edata
Esta integración para Home Assistant te permite seguir de un vistazo tus consumos y máximas potencias alcanzadas, obteniendo sus datos desde plataformas como Datadis o REData (precios PVPC), y ofreciendo técnicas para su representación gráfica en lovelace mediante el componente apexcharts-card. Además, integra estos datos con el panel de energÃa de Home Assistant.
Algunas aclaraciones:
- Los datos mostrados jamás serán en tiempo real, ya que se saca de la información que registra/factura tu distribuidora y expone a través de la plataforma Datadis. Normalmente cada dÃa registran el dÃa anterior.
- La tarificación de la integración está en pruebas y sólo funciona a dÃa de hoy con tarifas 2.0TD si tu tarifa es precio fijo (se permite distinción entre tramos) o PVPC. A dÃa de hoy, NO se incluye tope de gas.
Instalación
Para instalar esta integración en Home Assistant necesitarás:
- una cuenta funcional (y validada) en la web de Datadis
- no hay que marcar la casilla de la API al registrar, usaremos la privada que está habilitada por defecto),
- una instalación reciente y funcional de Home Assistant (a partir de ahora HA),
- tener o instalar HACS en tu entorno de HA, y
- (opcional/recomendado) tener o instalar el componente apexchart-card usando HACS.
Una vez satisfecho lo anterior, los pasos a seguir para la instalación son:
- Instalar HACS en tu entorno de Home Assistant (ver https://hacs.xyz/),
- Añadir este repositorio (https://github.com/uvejota/homeassistant-edata) a los repositorios personalizados de HACS,
- Instalar la integración mediante HACS, y
- Buscar "edata" en
Configuración > Dispositivos y servicios > Añadir integración
)
- Configurar sus credenciales de Datadis, indicando el NIF autorizado únicamente si no es el titular del suministro indicado). Copie y pegue el CUPS directamente desde la web de Datadis, en mayúscula. Algunas distribuidoras adhieren algunos caracteres adicionales.
- Esperar unos minutos, le aparecerá un nuevo sensor llamado
sensor.edata_xxxx
dondexxxx
dependerá de los últimos cuatro caracteres de su CUPS. En un futuro se podrá elegir el número de dÃgitos a mostrar, para evitar colisiones si se han configurado muchos suministros.
Atributos de la integración
La integración soporta de momento los siguientes atributos:
Parámetro | Tipo | Unidad | Significado |
---|---|---|---|
cups |
string |
- | Identificador de su CUPS |
contract_p1_kW |
float |
kW |
Potencia contratada en P1 en el contrato vigente |
contract_p2_kW |
float |
kW |
Potencia contratada en P2 en el contrato vigente |
yesterday_kWh |
float |
kWh |
Consumo total registrado durante el dÃa de ayer |
yesterday_p1_kWh |
float |
kWh |
Consumo en P1 registrado durante el dÃa de ayer |
yesterday_p2_kWh |
float |
kWh |
Consumo en P2 registrado durante el dÃa de ayer |
yesterday_p3_kWh |
float |
kWh |
Consumo en P3 registrado durante el dÃa de ayer |
last_day_date |
date |
%Y-%m-%d %H:%S |
Último dÃa registrado |
last_day_kWh |
float |
kWh |
Consumo total registrado durante el último dÃa registrado |
last_day_p1_kWh |
float |
kWh |
Consumo en P1 registrado durante el último dÃa registrado |
last_day_p2_kWh |
float |
kWh |
Consumo en P2 registrado durante el último dÃa registrado |
last_day_p3_kWh |
float |
kWh |
Consumo en P3 registrado durante el último dÃa registrado |
month_kWh |
float |
kWh |
Consumo total registrado durante el mes en curso (natural) |
month_days |
float |
d |
DÃas computados en el mes en curso |
month_daily_kWh |
float |
kWh |
Consumo medio diario registrado durante el mes en curso |
month_p1_kWh |
float |
kWh |
Consumo en P1 registrado durante el mes en curso |
month_p2_kWh |
float |
kWh |
Consumo en P2 registrado durante el mes en curso |
month_p3_kWh |
float |
kWh |
Consumo en P3 registrado durante el mes en curso |
last_month_kWh |
float |
kWh |
Consumo total registrado durante el mes pasado (natural) |
last_month_days |
float |
d |
DÃas computados en el mes pasado |
last_month_daily_kWh |
float |
kWh |
Consumo diario registrado durante el mes pasado |
last_month_p1_kWh |
float |
kWh |
Consumo en P1 registrado durante el mes pasado |
last_month_p2_kWh |
float |
kWh |
Consumo en P2 registrado durante el mes pasado |
last_month_p3_kWh |
float |
kWh |
Consumo en P3 registrado durante el mes pasado |
max_power_kW |
float |
kW |
Máxima potencia registrada en los últimos 12 meses |
max_power_date |
date |
%Y-%m-%d %H:%S |
Fecha correspondiente a la máxima potencia registrada en los últimos 12 meses |
max_power_mean_kW |
float |
kW |
Media de las potencias máximas registradas en los últimos 12 meses |
max_power_90perc_kW |
float |
kW |
Percentil 90 de las potencias máximas registradas en los últimos 12 meses |
Integración con panel EnergÃa (Long Term Statistics)
A partir de la versión 2022.01.0
de edata, ésta es compatible con las estadÃsticas de HA, lo cual habilita su uso en el panel de energÃa. Por defecto, las estadÃsticas generadas serán:
statistic_id | Tipo | Unidad | Significado |
---|---|---|---|
edata:xxxx_consumption |
sum |
kWh |
Consumo total |
edata:xxxx_p1_consumption |
sum |
kWh |
Consumo en P1 |
edata:xxxx_p2_consumption |
sum |
kWh |
Consumo en P2 |
edata:xxxx_p3_consumption |
sum |
kWh |
Consumo en P3 |
edata:xxxx_maximeter |
max |
kW |
MaxÃmetro (>= 2022.09.0 ) |
edata:xxxx_p1_maximeter |
max |
kW |
MaxÃmetro en P1 (>= 2022.09.0 ) |
edata:xxxx_p2_maximeter |
max |
kW |
MaxÃmetro en P2 (>= 2022.09.0 ) |
edata:xxxx_cost * |
float |
€ |
Coste total (>= 2022.09.0 ) |
edata:xxxx_p1_cost * |
float |
€ |
Coste total en P1 (>= 2022.12.4 ) |
edata:xxxx_p2_cost * |
float |
€ |
Coste total en P2 (>= 2022.12.4 ) |
edata:xxxx_p3_cost * |
float |
€ |
Coste total en P3 (>= 2022.12.4 ) |
edata:xxxx_power_cost * |
float |
€ |
Coste (potencia) (>= 2022.09.0 ) |
edata:xxxx_energy_cost * |
float |
€ |
Coste (energÃa) (>= 2022.09.0 ) |
edata:xxxx_p1_energy_cost * |
float |
€ |
Coste (energÃa) en P1 (>= 2022.12.4 ) |
edata:xxxx_p2_energy_cost * |
float |
€ |
Coste (energÃa) en P2 (>= 2022.12.4 ) |
edata:xxxx_p3_energy_cost * |
float |
€ |
Coste (energÃa) en P3 (>= 2022.12.4 ) |
* Los campos marcados con asterisco no están habilitados por defecto, y se habilitan en Ajustes > Dispositivos y Servicios > XXXX (edata) - Configurar
. Primero deberá seleccionar si desea activar o no las funciones de facturación, y en caso de utilizar PVPC seleccionará también dicha casilla.
A continuación, tendrá que configurar los costes asociados a cada término (según su contrato). No se da soporte al coste asociado a la excepción ibérica (tope del gas), aunque sà está incluido en PVPC.
Una vez configuradas y calculadas (tendrá que esperar un poco), las estadÃsticas pueden configurarse en el panel de energÃa en Ajustes > Paneles de control > EnergÃa > Añadir consumo (Red Eléctrica)
:
Representación gráfica de los datos (requiere apexcharts-card)
Informe textual
Puede visualizarlos a modo de informe mediante la siguiente tarjeta, sustituyendo xxxx
, en minúscula, cuando sea necesario (dos veces):
He leÃdo las instrucciones y quiero ver el contenido (hacer click para mostrar)
type: markdown
content: >
{% for attr in states.sensor.edata_xxxx.attributes %} {%- if not
attr=="friendly_name" and not attr=="unit_of_measurement" and not
attr=="icon" -%} **{{attr}}**: {{state_attr("sensor.edata_xxxx", attr)}} {{-
'\n' -}} {%- endif %} {%- endfor -%}
title: Informe
Definición de nuevos sensores a partir de los atributos
También puedes extraer uno de los atributos como un sensor aparte siguiendo el siguiente ejemplo (por @thekimera):
He leÃdo las instrucciones y quiero ver el contenido
sensor:
- platform: template
sensors:
last_month_consumption:
friendly_name: "Consumo mes anterior"
value_template: >-
{{ state_attr('sensor.edata_xxxx', 'last_month_kWh') | float }}
unit_of_measurement: kWh
A continuación se ofrecen una serie de tarjetas (en yaml) que permiten visualizar los datos obtenidos mediante gráficas interactivas generadas con un componente llamado apexcharts-card, que también debe instalarse manualmente o mediante HACS. Siga las instrucciones de https://github.com/RomRider/apexcharts-card y recuerde tener el repositorio a mano para personalizar las gráficas a continuación.
NOTA: en las siguientes tarjetas deberá reemplazar TODAS las ocurrencias de xxxx
por sus últimos cuatro caracteres de su CUPS.
Consumo diario
He leÃdo las instrucciones y quiero ver el contenido
type: custom:apexcharts-card
graph_span: 30d
stacked: true
span:
offset: '-1d'
experimental:
brush: true
header:
show: true
title: Consumo diario
show_states: false
colorize_states: false
brush:
selection_span: 10d
all_series_config:
type: column
unit: kWh
show:
legend_value: false
series:
- entity: sensor.edata_xxxx
name: Total
type: column
data_generator: |
return hass.connection.sendMessagePromise({
type: 'edata/consumptions/daily',
scups: 'xxxx'}).then(
(resp) => {
return resp.map((data, index) => {
return [new Date(data['datetime']).getTime(), data['value_kWh']];
});
}
);
show:
in_chart: false
in_brush: true
- entity: sensor.edata_xxxx
name: Punta
data_generator: |
return hass.connection.sendMessagePromise({
type: 'edata/consumptions/daily',
scups: 'xxxx'}).then(
(resp) => {
return resp.map((data, index) => {
return [new Date(data['datetime']).getTime(), data['value_p1_kWh']];
});
}
);
- entity: sensor.edata_xxxx
name: Llano
data_generator: |
return hass.connection.sendMessagePromise({
type: 'edata/consumptions/daily',
scups: 'xxxx'}).then(
(resp) => {
return resp.map((data, index) => {
return [new Date(data['datetime']).getTime(), data['value_p2_kWh']];
});
}
);
- entity: sensor.edata_xxxx
name: Valle
data_generator: |
return hass.connection.sendMessagePromise({
type: 'edata/consumptions/daily',
scups: 'xxxx'}).then(
(resp) => {
return resp.map((data, index) => {
return [new Date(data['datetime']).getTime(), data['value_p3_kWh']];
});
}
);
Consumo mensual
He leÃdo las instrucciones y quiero ver el contenido
type: custom:apexcharts-card
graph_span: 395d
stacked: true
yaxis:
- id: eje
opposite: false
max: '|+20|'
min: ~0
apex_config:
forceNiceScale: true
header:
show: true
title: Consumo mensual
show_states: false
colorize_states: false
all_series_config:
type: column
unit: kWh
yaxis_id: eje
extend_to: false
show:
legend_value: false
series:
- entity: sensor.edata_xxxx
type: line
name: Total
data_generator: |
return hass.connection.sendMessagePromise({
type: 'edata/consumptions/monthly',
scups: 'xxxx'}).then(
(resp) => {
return resp.map((data, index) => {
return [new Date(data['datetime']).getTime(), data['value_kWh']];
});
}
);
show:
in_chart: true
- entity: sensor.edata_xxxx
name: Punta
data_generator: |
return hass.connection.sendMessagePromise({
type: 'edata/consumptions/monthly',
scups: 'xxxx'}).then(
(resp) => {
return resp.map((data, index) => {
return [new Date(data['datetime']).getTime(), data['value_p1_kWh']];
});
}
);
- entity: sensor.edata_xxxx
name: Llano
data_generator: |
return hass.connection.sendMessagePromise({
type: 'edata/consumptions/monthly',
scups: 'xxxx'}).then(
(resp) => {
return resp.map((data, index) => {
return [new Date(data['datetime']).getTime(), data['value_p2_kWh']];
});
}
);
- entity: sensor.edata_xxxx
name: Valle
data_generator: |
return hass.connection.sendMessagePromise({
type: 'edata/consumptions/monthly',
scups: 'xxxx'}).then(
(resp) => {
return resp.map((data, index) => {
return [new Date(data['datetime']).getTime(), data['value_p3_kWh']];
});
}
);
MaxÃmetro
He leÃdo las instrucciones y quiero ver el contenido
type: custom:apexcharts-card
graph_span: 1y
span:
offset: '-30d'
header:
show: true
title: MaxÃmetro
show_states: false
colorize_states: false
chart_type: scatter
series:
- entity: sensor.edata_xxxx
name: Potencia máxima
type: column
extend_to: false
unit: kW
show:
extremas: true
datalabels: false
data_generator: |
return hass.connection.sendMessagePromise({
type: 'edata/maximeter',
scups: 'xxxx'}).then(
(resp) => {
return resp.map((data, index) => {
return [new Date(data['datetime']).getTime(), data['value_kW']];
});
}
);
Detalle: ayer
He leÃdo las instrucciones y quiero ver el contenido
type: custom:apexcharts-card
chart_type: pie
header:
show: true
title: Ayer
show_states: true
colorize_states: true
floating: true
all_series_config:
unit: kWh
show:
legend_value: true
in_header: false
apex_config:
chart:
height: 250px
series:
- entity: sensor.edata_xxxx
attribute: yesterday_kWh
show:
in_chart: false
in_header: true
name: Total
- entity: sensor.edata_xxxx
attribute: yesterday_p1_kWh
name: Punta
- entity: sensor.edata_xxxx
attribute: yesterday_p2_kWh
name: Llano
- entity: sensor.edata_xxxx
attribute: yesterday_p3_kWh
name: Valle
Detalle: mes en curso
He leÃdo las instrucciones y quiero ver el contenido
type: custom:apexcharts-card
chart_type: pie
header:
show: true
title: Mes en curso
show_states: true
colorize_states: true
floating: true
all_series_config:
show:
legend_value: true
in_header: false
unit: kWh
apex_config:
chart:
height: 250px
series:
- entity: sensor.edata_xxxx
attribute: month_kWh
show:
in_chart: false
in_header: true
name: Total
- entity: sensor.edata_xxxx
attribute: month_p1_kWh
name: Punta
- entity: sensor.edata_xxxx
attribute: month_p2_kWh
name: Llano
- entity: sensor.edata_xxxx
attribute: month_p3_kWh
name: Valle
- entity: sensor.edata_xxxx
attribute: month_€
unit: €
show:
in_chart: false
in_header: true
name: Factura
Detalle: mes anterior
He leÃdo las instrucciones y quiero ver el contenido
type: custom:apexcharts-card
chart_type: pie
header:
show: true
title: Mes pasado
show_states: true
colorize_states: true
floating: true
all_series_config:
show:
legend_value: true
in_header: false
unit: kWh
apex_config:
chart:
height: 250px
series:
- entity: sensor.edata_xxxx
attribute: last_month_kWh
show:
in_chart: false
in_header: true
name: Total
- entity: sensor.edata_xxxx
attribute: last_month_p1_kWh
name: Punta
- entity: sensor.edata_xxxx
attribute: last_month_p2_kWh
name: Llano
- entity: sensor.edata_xxxx
attribute: last_month_p3_kWh
name: Valle
- entity: sensor.edata_xxxx
attribute: last_month_€
unit: €
show:
in_chart: false
in_header: true
name: Factura
FAQ
¿Por qué no me funciona?
Hermosa pregunta:
- Si no ve los datos en datadis.es, no los verá aquÃ, trate de solucionar primero lo anterior. Si no ha leÃdo o seguido las instrucciones, hágalo.
- Si no se ha creado el sensor
sensor.edata_xxxx
, algo ha fallado y posiblemente sea una mala configuración del sensor, revise el log y siga las instrucciones.- Si el sensor se ha creado, pero sólo el atributo CUPS está relleno, es posible que Datadis no esté operativo en ese instante, deje la integración funcionando y se recuperará sola.
- Si el sensor se ha creado, y el atributo CUPS no está relleno, ha debido introducir erróneamente (a) sus credenciales, (b) su CUPS. Copie y pegue todos los datos anteriores desde la web de Datadis.es. Insisto, copie y pegue, algunas distribuidoras ofrecen un número de CUPS con dos dÃgitos adicionales que no coinciden con el de Datadis.
- Si no tiene idea de qué ocurre, puede habilitar logs de mayor detalle añadiendo lo siguiente al fichero
configuration.yaml
:sensor: - platform: edata debug: trueSi nada de lo anterior funciona, cree una issue en https://github.com/uvejota/homeassistant-edata/issues, indicando versión, sintomatologÃa y aportando los logs del paciente, y trataré de ayudarle lo antes posible.
¿Por qué hay huecos en mis datos?
Respuesta corta: porque la API de datadis no te ha dado esos datos.
Respuesta larga: porque la API de datadis es impredecible y a veces responde datos vacÃos
[]
, o códigos50X
.Lo mejor que puedes hacer es esperar, sé que quieres ver tus datos ya, pero confÃa en mÃ, recargar la integración o reiniciar HA sólo va a conseguir que saturemos la API de Datadis. La integración está preparada para consultar cada hora (lo cual me parece más que razonable) los datos que le faltan completando los huecos. Cuanto más datos te faltan (e.g., primera ejecución), más tarda.
El panel de energÃa me muestra huecos o consumos duplicados, pero las tarjetas de apexcharts no
Desde la versión
2022.09.0
, puedes regenerar las estadÃsticas manualmente mediante un servicio (Herramientas para desarrolladores > Servicios > edata.recreate_statistics
).