Importação de Dados da E-Redes para o Home Assistant (Sem Hardware Adicional)

Boas pessoal!

Para quem quiser importar os dados de consumo elétrico da E-Redes para o Home Assistant , sem necessidade de instalar dispositivos adicionais ligados à box/contador, podem seguir este método.

Passo 1 – Download dos dados

Acedam ao Balcão Digital da E-Redes e façam o download das estatísticas mensais de consumo :
:point_right: https://balcaodigital.e-redes.pt/login

Passo 2 – Instalar a integração

Instalem a integração Import statistics no Home Assistant:
:point_right: https://github.com/klausj1/homeassistant-statistics

Passo 3 – Preparar o ficheiro para importação

Utilizem este pedaço de código em Python para criar o ficheiro no formato correto, que depois será importado através da ferramenta referida acima.

import sys
import math
import datetime
import pandas as pd
from datetime import timezone

# ---------------- CONFIG (from TemplateDataPrepare.py) ----------------

inputFileDateColumnName = "Data"
inputFileTimeColumnName = "Hora"
inputFileDateTimeColumnFormat = "%Y/%m/%d %H:%M"
inputFileNumHeaderRows = 8
inputFileExcelSheetName = 0

valueColumnName = "Consumo registado (kW)"

# ---------------------------------------------------------------------


def load_excel(file_path: str) -> pd.DataFrame:
    print(f"Loading Excel file: {file_path}")

    df = pd.read_excel(
        file_path,
        sheet_name=inputFileExcelSheetName,
        skiprows=inputFileNumHeaderRows,
    )

    return df


def prepare_datetime(df: pd.DataFrame) -> pd.DataFrame:
    df["_DateTime"] = pd.to_datetime(
        df[inputFileDateColumnName].astype(str)
        + " "
        + df[inputFileTimeColumnName].astype(str),
        format=inputFileDateTimeColumnFormat,
        utc=True,
    )

    # Remove timezone
    df["_DateTime"] = df["_DateTime"].dt.tz_localize(None)

    # Sort
    df.sort_values(by="_DateTime", inplace=True)

    # Convert to UNIX timestamp
    df["_Timestamp"] = (df["_DateTime"].astype("int64") / 1_000_000_000).astype("int64")

    return df


def recalculate_energy(df: pd.DataFrame) -> pd.DataFrame:
    previous_index = None

    for index in df.index:
        value = df.at[index, valueColumnName]

        if math.isnan(value):
            value = 0.0

        # Convert kW 15-min interval → kWh
        value = value / 4

        if previous_index is not None:
            value += df.at[previous_index, valueColumnName]

        df.at[index, valueColumnName] = round(value, 3)
        previous_index = index

    return df


def extract_month_year(df: pd.DataFrame):
    first_date = df["_DateTime"].iloc[0]
    return f"{first_date.month:02d}", f"{first_date.year}"


def generate_homeassistant_tsv(
    df: pd.DataFrame,
    previous_total: float,
    output_file: str,
):
    print(f"Creating Home Assistant file: {output_file}")

    with open(output_file, "w") as f:
        f.write("statistic_id\tunit\tstart\tstate\tsum\n")

        for _, row in df.iterrows():
            dt_obj = datetime.datetime.fromtimestamp(
                row["_Timestamp"], tz=timezone.utc
            )

            # Keep only full hours
            if dt_obj.minute != 0:
                continue

            dt_str = dt_obj.strftime("%d.%m.%Y %H:%M")

            value = row[valueColumnName] + previous_total
            value = f"{value:.3f}"

            f.write(
                f"sensor:not_existing_total_energy_consumption\t"
                f"kWh\t{dt_str}\t{value}\t{value}\n"
            )


def main():
    if len(sys.argv) != 3:
        print("Usage:")
        print("  python eredes_to_homeassistant.py <xlsx_file> <previous_month_total>")
        sys.exit(1)

    xlsx_file = sys.argv[1]
    previous_total = float(sys.argv[2])

    df = load_excel(xlsx_file)
    df = prepare_datetime(df)
    df = recalculate_energy(df)

    month, year = extract_month_year(df)
    output_file = f"{month}_{year}.tsv"

    generate_homeassistant_tsv(df, previous_total, output_file)

    print("Done ✔")


if __name__ == "__main__":
    main()

Antes de executar o script

Antes de correr o script, certifiquem-se de que têm todas as bibliotecas Python necessárias instaladas.

Utilização

1 - python eredes_to_homeassistant.py <ficheiro_xlsx> <total_do_mes_anterior>
2 -

Espero que isto seja útil para alguém!

3 Curtiram

Boa malha, vou tentar

Obrigado, mas uma dúvida de novato: Isto tem forma de ir buscar regularmente os dados ao site automaticamente? Ou é “semi-manual”?

Obrigado!

Boas, É semi manual, tens de ir buscar os dado. Podia tornar automatico mas é trabalhoso

Obrigado, ainda assim!

Bom domingo!

Boa noite,

Estou a tentar correr o scritp, mas logo no primeiro dá-me o seguinte erro:

The above exception was the direct cause of the following exception:

Traceback (most recent call last):

File “D:\Temp\eredes\TemplateDataPreparare.py”, line 333, in

generateImportDataFiles(sys.argv[1])

[floatl] ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^[/floatl]
File “D:\Temp\eredes\TemplateDataPreparare.py”, line 296, in generateImportDataFiles

dataFrame = prepareData(dataFrame)

File “D:\Temp\eredes\TemplateDataPreparare.py”, line 115, in prepareData

dataFrame[inputFileDateColumnName].astype(str)

[floatl] ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^[/floatl]
File “C:\Users\ricar\AppData\Local\Python\pythoncore-3.14-64\Lib\site-packages\pandas\core\frame.py”, line 4113, in getitem

indexer = self.columns.get_loc(key)

File “C:\Users\ricar\AppData\Local\Python\pythoncore-3.14-64\Lib\site-packages\pandas\core\indexes\base.py”, line 3819, in get_loc

raise KeyError(key) from err

KeyError: ‘Data’

Será que é alguma alteração formato do ficheiro xlxs da Eredes ?

Obrigado desde já.

Boa Noite Ricardo.

Eu acho que isso se deve a provavelmente teres usado o download de dados da EREDES de uma data expecifica a uma outra data expecifica.

Eu tenho usado os mensais e nunca testei com esses de datas especificas uso os mensais depois do mes ter passado.

A não ser que seja outra cena que é se calhar falta-te alguma libraria do python.

De qualquer maneira eu atualizei o script para ser mais facil e adicionei um passo que me faltava no anterior para as visualizacoes ficarem perfeitas.

Boa Sorte.


Copyright © 2017-. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade