11from enum import Enum
22import json
33import logging
4- import pathlib
54from pathlib import Path
65import re
76import 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
241270def get_names (totals : Dict , sh_names : Dict ) -> Dict :
242271 names = sh_names
0 commit comments