Skip to content

Commit 60df8d5

Browse files
committed
fix peaks caused by inverter sending 0
1 parent 414810a commit 60df8d5

File tree

4 files changed

+105
-23
lines changed

4 files changed

+105
-23
lines changed

packages/control/chargelog/chargelog.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ def calculate_charge_cost(cp, create_log_entry: bool = False):
306306
reference_time = get_reference_time(cp, reference)
307307
reference_entry = _get_reference_entry(content["entries"], reference_time)
308308
energy_entry = process_entry(reference_entry,
309-
create_entry(LogType.DAILY, LegacySmartHomeLogData()),
309+
create_entry(LogType.DAILY, LegacySmartHomeLogData(), reference_entry),
310310
CalculationType.ENERGY)
311311
energy_source_entry = analyse_percentage(energy_entry)
312312
log.debug(f"reference {reference}, reference_time {reference_time}, "

packages/helpermodules/measurement_logging/process_log.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
from typing import Dict, List, Tuple
77

88
from helpermodules import timecheck
9-
from helpermodules.measurement_logging.write_log import LegacySmartHomeLogData, LogType, create_entry
9+
from helpermodules.measurement_logging.write_log import (LegacySmartHomeLogData, LogType, create_entry,
10+
get_prevoius_entry)
1011

1112
log = logging.getLogger(__name__)
1213

@@ -145,16 +146,18 @@ def get_daily_log(date: str):
145146

146147
def _collect_daily_log_data(date: str):
147148
try:
148-
with open(str(Path(__file__).resolve().parents[3] / "data"/"daily_log"/(date+".json")), "r") as json_file:
149+
parent_file = Path(__file__).resolve().parents[3] / "data"/"daily_log"
150+
with open(str(parent_file / (date+".json")), "r") as json_file:
149151
log_data = json.load(json_file)
150152
if date == timecheck.create_timestamp_YYYYMMDD():
151153
# beim aktuellen Tag den aktuellen Datensatz ergänzen
152-
log_data["entries"].append(create_entry(LogType.DAILY, LegacySmartHomeLogData()))
154+
log_data["entries"].append(create_entry(
155+
LogType.DAILY, LegacySmartHomeLogData(), get_prevoius_entry(parent_file, log_data)))
153156
else:
154157
# bei älteren als letzten Datensatz den des nächsten Tags
155158
try:
156159
next_date = timecheck.get_relative_date_string(date, day_offset=1)
157-
with open(str(Path(__file__).resolve().parents[3] / "data"/"daily_log"/(next_date+".json")),
160+
with open(str(parent_file / (next_date+".json")),
158161
"r") as next_json_file:
159162
next_log_data = json.load(next_json_file)
160163
log_data["entries"].append(next_log_data["entries"][0])

packages/helpermodules/measurement_logging/write_log.py

+47-18
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from enum import Enum
22
import json
33
import logging
4-
import pathlib
54
from pathlib import Path
65
import re
76
import string
@@ -128,22 +127,15 @@ def save_log(log_type: LogType):
128127
folder: str
129128
gibt an, ob ein Tages-oder Monats-Log-Eintrag erstellt werden soll.
130129
"""
131-
sh_log_data = LegacySmartHomeLogData()
132-
new_entry = create_entry(log_type, sh_log_data)
133-
134-
# json-Objekt in Datei einfügen
130+
parent_file = Path(__file__).resolve().parents[3] / "data" / \
131+
("daily_log" if log_type == LogType.DAILY else "monthly_log")
132+
parent_file.mkdir(mode=0o755, parents=True, exist_ok=True)
135133
if log_type == LogType.DAILY:
136-
(pathlib.Path(__file__).resolve().parents[3] / "data"/"daily_log").mkdir(mode=0o755,
137-
parents=True, exist_ok=True)
138-
filepath = str(
139-
Path(__file__).resolve().parents[3] / "data" / "daily_log" /
140-
(timecheck.create_timestamp_YYYYMMDD() + ".json"))
134+
file_name = timecheck.create_timestamp_YYYYMMDD()
141135
else:
142-
(pathlib.Path(__file__).resolve().parents[3] / "data"/"monthly_log").mkdir(mode=0o755,
143-
parents=True, exist_ok=True)
144-
filepath = str(
145-
Path(__file__).resolve().parents[3] / "data" / "monthly_log" /
146-
(timecheck.create_timestamp_YYYYMM() + ".json"))
136+
file_name = timecheck.create_timestamp_YYYYMM()
137+
filepath = str(parent_file / f"{file_name}.json")
138+
147139
try:
148140
with open(filepath, "r") as jsonFile:
149141
content = json.load(jsonFile)
@@ -152,6 +144,14 @@ def save_log(log_type: LogType):
152144
json.dump({"entries": [], "names": {}}, jsonFile)
153145
with open(filepath, "r") as jsonFile:
154146
content = json.load(jsonFile)
147+
148+
previous_entry = get_prevoius_entry(parent_file, content)
149+
150+
sh_log_data = LegacySmartHomeLogData()
151+
new_entry = create_entry(log_type, sh_log_data, previous_entry)
152+
153+
# json-Objekt in Datei einfügen
154+
155155
entries = content["entries"]
156156
entries.append(new_entry)
157157
content["names"] = get_names(content["entries"][-1], sh_log_data.sh_names)
@@ -160,7 +160,21 @@ def save_log(log_type: LogType):
160160
return content["entries"]
161161

162162

163-
def create_entry(log_type: LogType, sh_log_data: LegacySmartHomeLogData) -> Dict:
163+
def get_prevoius_entry(parent_file: Path, content: Dict):
164+
try:
165+
previous_entry = content["entries"][-1]
166+
except IndexError:
167+
# get all files in Folder
168+
path_list = parent_file.glob('*.json')
169+
# sort path list by name
170+
path_list = sorted(path_list, key=lambda x: x.name)
171+
with open(path_list[-2], "r") as jsonFile:
172+
content = json.load(jsonFile)
173+
previous_entry = content["entries"][-1]
174+
return previous_entry
175+
176+
177+
def create_entry(log_type: LogType, sh_log_data: LegacySmartHomeLogData, previous_entry: Dict) -> Dict:
164178
if log_type == LogType.DAILY:
165179
date = timecheck.create_timestamp_HH_MM()
166180
else:
@@ -224,8 +238,7 @@ def create_entry(log_type: LogType, sh_log_data: LegacySmartHomeLogData) -> Dict
224238
log.exception("Fehler im Werte-Logging-Modul für Speicher "+str(bat))
225239

226240
hc_dict = {"all": {"imported": data.data.counter_all_data.data.set.imported_home_consumption}}
227-
228-
return {
241+
new_entry = {
229242
"timestamp": current_timestamp,
230243
"date": date,
231244
"cp": cp_dict,
@@ -237,6 +250,22 @@ def create_entry(log_type: LogType, sh_log_data: LegacySmartHomeLogData) -> Dict
237250
"hc": hc_dict
238251
}
239252

253+
return fix_values(new_entry, previous_entry)
254+
255+
256+
def fix_values(new_entry: Dict, previous_entry: Dict) -> Dict:
257+
def find_and_fix_value(value_name):
258+
if value.get(value_name) is not None:
259+
if value[value_name] == 0:
260+
value[value_name] = previous_entry[group][component][value_name]
261+
for group, value in new_entry.items():
262+
if group not in ("bat", "counter", "cp", "pv", "hc"):
263+
continue
264+
for component, value in value.items():
265+
find_and_fix_value("exported")
266+
find_and_fix_value("imported")
267+
return new_entry
268+
240269

241270
def get_names(totals: Dict, sh_names: Dict) -> Dict:
242271
names = sh_names

packages/helpermodules/measurement_logging/write_log_test.py

+50
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,53 @@ def test_get_names(daily_log_totals, monkeypatch):
2020
'cp6': "Standard-Ladepunkt",
2121
'pv1': "Wechselrichter",
2222
"sh1": "Smarthome1"}
23+
24+
25+
def test_fix_values():
26+
# setup
27+
previous_entry = {'bat': {'all': {'exported': 0, 'imported': 2281.851, 'soc': 96},
28+
'bat2': {'exported': 0, 'imported': 2281.851, 'soc': 96}},
29+
'counter': {'counter0': {'exported': 21.382,
30+
'grid': True,
31+
'imported': 17.913}},
32+
'cp': {'all': {'exported': 0, 'imported': 0},
33+
'cp3': {'exported': 0, 'imported': 0},
34+
'cp4': {'exported': 0, 'imported': 0},
35+
'cp5': {'exported': 0, 'imported': 0}},
36+
'date': '09:25',
37+
'ev': {'ev0': {'soc': 0}},
38+
'hc': {'all': {'imported': 108647.2791628165}},
39+
'pv': {'all': {'exported': 3269}, 'pv1': {'exported': 3269}},
40+
'sh': {},
41+
'timestamp': 1709108702}
42+
new_entry = {'bat': {'all': {'exported': 0, 'imported': 2369.658, 'soc': 97},
43+
'bat2': {'exported': 0, 'imported': 2369.658, 'soc': 97}},
44+
'counter': {'counter0': {'exported': 22.167, 'grid': True, 'imported': 18.54}},
45+
'cp': {'all': {'exported': 0, 'imported': 0},
46+
'cp3': {'exported': 0, 'imported': 0},
47+
'cp4': {'exported': 0, 'imported': 0},
48+
'cp5': {'exported': 0, 'imported': 0}},
49+
'date': '09:30',
50+
'ev': {'ev0': {'soc': 0}},
51+
'hc': {'all': {'imported': 108683.21291147666}},
52+
'pv': {'all': {'exported': 0}, 'pv1': {'exported': 0}},
53+
'sh': {},
54+
'timestamp': 1709109001}
55+
56+
# execution
57+
fixed_values = write_log.fix_values(new_entry, previous_entry)
58+
59+
# evaluation
60+
assert fixed_values == {'bat': {'all': {'exported': 0, 'imported': 2369.658, 'soc': 97},
61+
'bat2': {'exported': 0, 'imported': 2369.658, 'soc': 97}},
62+
'counter': {'counter0': {'exported': 22.167, 'grid': True, 'imported': 18.54}},
63+
'cp': {'all': {'exported': 0, 'imported': 0},
64+
'cp3': {'exported': 0, 'imported': 0},
65+
'cp4': {'exported': 0, 'imported': 0},
66+
'cp5': {'exported': 0, 'imported': 0}},
67+
'date': '09:30',
68+
'ev': {'ev0': {'soc': 0}},
69+
'hc': {'all': {'imported': 108683.21291147666}},
70+
'pv': {'all': {'exported': 3269}, 'pv1': {'exported': 3269}},
71+
'sh': {},
72+
'timestamp': 1709109001}

0 commit comments

Comments
 (0)