Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 113 additions & 0 deletions packages/helpermodules/measurement_logging/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,3 +198,116 @@ def daily_log_entry_kw():
'power_average': 0.12,
'power_exported': 0.0,
'power_imported': 0.12}}}


@pytest.fixture()
def daily_log_entry_kw_percentage():
return {
'bat': {'all': {'energy_exported': 0.275,
'energy_imported': 0.0,
'exported': 1742.135,
'imported': 2.42,
'power_average': -3.316,
'power_exported': 3.316,
'power_imported': 0.0,
'soc': 15},
'bat2': {'energy_exported': 0.275,
'energy_imported': 0.0,
'exported': 1742.135,
'imported': 2.42,
'power_average': -3.316,
'power_exported': 3.316,
'power_imported': 0.0,
'soc': 15}},
'counter': {'counter0': {'energy_exported': 0.0,
'energy_imported': 0.746,
'exported': 2.396,
'grid': True,
'imported': 4686.054,
'power_average': 8.983,
'power_exported': 0.0,
'power_imported': 8.983}},
'cp': {'all': {'energy_exported': 0.0,
'energy_imported': 0.96,
'energy_imported_bat': 0.23,
'energy_imported_cp': 0.0,
'energy_imported_grid': 0.624,
'energy_imported_pv': 0.105,
'exported': 0,
'imported': 6028.183,
'power_average': 11.556,
'power_exported': 0.0,
'power_imported': 11.556},
'cp3': {'energy_exported': 0.0,
'energy_imported': 0.576,
'energy_imported_bat': 0.138,
'energy_imported_cp': 0.0,
'energy_imported_grid': 0.375,
'energy_imported_pv': 0.063,
'exported': 0,
'imported': 3620.971,
'power_average': 6.932,
'power_exported': 0.0,
'power_imported': 6.932},
'cp4': {'energy_exported': 0.0,
'energy_imported': 0.192,
'energy_imported_bat': 0.046,
'energy_imported_cp': 0.0,
'energy_imported_grid': 0.125,
'energy_imported_pv': 0.021,
'exported': 0,
'imported': 1198.566,
'power_average': 2.313,
'power_exported': 0.0,
'power_imported': 2.313},
'cp5': {'energy_exported': 0.0,
'energy_imported': 0.192,
'energy_imported_bat': 0.046,
'energy_imported_cp': 0.0,
'energy_imported_grid': 0.125,
'energy_imported_pv': 0.021,
'exported': 0,
'imported': 1208.646,
'power_average': 2.311,
'power_exported': 0.0,
'power_imported': 2.311}},
'date': '09:35',
'energy_source': {'bat': 0.2398,
'cp': 0.0,
'grid': 0.6504,
'pv': 0.1098},
'ev': {'ev0': {'soc': 0}},
'hc': {'all': {'energy_exported': 0.0,
'energy_imported': 0.01,
'energy_imported_bat': 0.002,
'energy_imported_cp': 0.0,
'energy_imported_grid': 0.007,
'energy_imported_pv': 0.001,
'imported': 100,
'power_average': 0.12,
'power_exported': 0.0,
'power_imported': 0.12}},
'pv': {'all': {'energy_exported': 0.126,
'energy_imported': 0.0,
'exported': 804,
'power_average': -1.517,
'power_exported': 1.517,
'power_imported': 0.0},
'pv1': {'energy_exported': 0.126,
'energy_imported': 0.0,
'exported': 804,
'power_average': -1.517,
'power_exported': 1.517,
'power_imported': 0.0}},
'sh': {'sh1': {'energy_exported': 0.0,
'energy_imported': 0.0,
'exported': 0,
'imported': 0.1,
'power_average': 0.001,
'power_exported': 0.0,
'power_imported': 0.001,
'temp0': 300,
'temp1': 300,
'temp2': 300}},
'timestamp': 1690529761,
}
51 changes: 34 additions & 17 deletions packages/helpermodules/measurement_logging/process_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from helpermodules import timecheck
from helpermodules.measurement_logging.write_log import (LegacySmartHomeLogData, LogType, create_entry,
get_previous_entry)
from helpermodules.messaging import MessageType, pub_system_message

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -374,9 +375,12 @@ def add_daily_log(day: str) -> None:

def _analyse_energy_source(data) -> Dict:
if data and len(data["entries"]) > 0:
for i in range(0, len(data["entries"])):
data["entries"][i] = analyse_percentage(data["entries"][i])
data["totals"] = analyse_percentage_totals(data["entries"], data["totals"])
try:
for i in range(0, len(data["entries"])):
data["entries"][i] = analyse_percentage(data["entries"][i])
data["totals"] = analyse_percentage_totals(data["entries"], data["totals"])
except Exception:
pub_system_message({}, "Fehler beim Berechnen des Strom-Mix", MessageType.ERROR)
return data


Expand All @@ -390,6 +394,13 @@ def get_grid_from(entry) -> Tuple[float, float]:
raise KeyError(f"Kein Zähler für das Netz gefunden in Eintrag '{entry['timestamp']}'.")
return sum(grid["energy_imported"] for grid in grids), sum(grid["energy_exported"] for grid in grids)

def calc_energy_imported_by_source(energy_imported, energy_source):
value = (Decimal(str(energy_imported)) *
Decimal(str(energy_source))).quantize(Decimal('0.001')) # limit precision
value = f'{value: f}'
value = string_to_float(value) if "." in value else string_to_int(value)
return value

try:
bat_imported = entry["bat"]["all"]["energy_imported"] if "all" in entry["bat"].keys() else 0
bat_exported = entry["bat"]["all"]["energy_exported"] if "all" in entry["bat"].keys() else 0
Expand Down Expand Up @@ -417,17 +428,16 @@ def get_grid_from(entry) -> Tuple[float, float]:
entry["energy_source"] = {"grid": 0, "pv": 0, "bat": 0, "cp": 0}
for source in ("grid", "pv", "bat", "cp"):
if "all" in entry["hc"].keys():
value = (Decimal(str(entry["hc"]["all"]["energy_imported"])) *
Decimal(str(entry["energy_source"][source]))).quantize(Decimal('0.001')) # limit precision
value = f'{value: f}'
value = string_to_float(value) if "." in value else string_to_int(value)
entry["hc"]["all"][f"energy_imported_{source}"] = value
if "all" in entry["cp"].keys():
value = (Decimal(str(entry["cp"]["all"]["energy_imported"])) *
Decimal(str(entry["energy_source"][source]))).quantize(Decimal('0.001')) # limit precision
value = f'{value: f}'
value = string_to_float(value) if "." in value else string_to_int(value)
entry["cp"]["all"][f"energy_imported_{source}"] = value
entry["hc"]["all"][f"energy_imported_{source}"] = calc_energy_imported_by_source(
entry["hc"]["all"]["energy_imported"], entry["energy_source"][source])
for key in entry["cp"].keys():
entry["cp"][key][f"energy_imported_{source}"] = calc_energy_imported_by_source(
entry["cp"][key]["energy_imported"], entry["energy_source"][source])
for counter in entry["counter"].values():
if counter["exported"] == 0:
counter[f"energy_imported_{source}"] = calc_energy_imported_by_source(
counter["energy_imported"], entry["energy_source"][source])

except Exception:
log.exception(f"Fehler beim Berechnen des Strom-Mix von {entry['timestamp']}")
finally:
Expand All @@ -440,13 +450,20 @@ def analyse_percentage_totals(entries, totals):
totals[section]["all"] = {}
for source in ("grid", "pv", "bat", "cp"):
totals["hc"]["all"].update({f"energy_imported_{source}": 0})
totals["cp"]["all"].update({f"energy_imported_{source}": 0})
for entry in entries:
if "hc" in entry.keys() and "all" in entry["hc"].keys():
totals["hc"]["all"][f"energy_imported_{source}"] += entry["hc"]["all"].get(
f"energy_imported_{source}", 0)*1000
if "all" in entry["cp"].keys() and f"energy_imported_{source}" in entry["cp"]["all"].keys():
totals["cp"]["all"][f"energy_imported_{source}"] += entry["cp"]["all"][f"energy_imported_{source}"]*1000
for key in entry["cp"].keys():
if f"energy_imported_{source}" in entry["cp"][key].keys():
if totals["cp"][key].get(f"energy_imported_{source}") is None:
totals["cp"][key].update({f"energy_imported_{source}": 0})
totals["cp"][key][f"energy_imported_{source}"] += entry["cp"][key][f"energy_imported_{source}"]*1000
for key, counter in entry["counter"].items():
if counter["exported"] == 0:
if totals["counter"][key].get(f"energy_imported_{source}") is None:
totals["counter"][key].update({f"energy_imported_{source}": 0})
totals["counter"][key][f"energy_imported_{source}"] += counter[f"energy_imported_{source}"]*1000
return totals


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ def test_get_totals(daily_log_sample, daily_log_totals):
assert totals == daily_log_totals


def test_analyse_percentage(daily_log_entry_kw):
def test_analyse_percentage(daily_log_entry_kw_percentage):
# setup
expected = deepcopy(daily_log_entry_kw)
expected = deepcopy(daily_log_entry_kw_percentage)
expected.update({"energy_source": {'bat': 0.2398, 'cp': 0.0, 'grid': 0.6504, 'pv': 0.1098}})
expected["cp"]["all"].update({
"energy_imported_bat": 0.23,
Expand All @@ -32,7 +32,7 @@ def test_analyse_percentage(daily_log_entry_kw):
"energy_imported_pv": 0.001})

# execution
entry = analyse_percentage(daily_log_entry_kw)
entry = analyse_percentage(daily_log_entry_kw_percentage)

# evaluation
assert entry == expected
Expand Down