1
1
from enum import Enum
2
2
import json
3
3
import logging
4
- import pathlib
5
4
from pathlib import Path
6
5
import re
7
6
import string
@@ -128,22 +127,15 @@ def save_log(log_type: LogType):
128
127
folder: str
129
128
gibt an, ob ein Tages-oder Monats-Log-Eintrag erstellt werden soll.
130
129
"""
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 )
135
133
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 ()
141
135
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
+
147
139
try :
148
140
with open (filepath , "r" ) as jsonFile :
149
141
content = json .load (jsonFile )
@@ -152,6 +144,14 @@ def save_log(log_type: LogType):
152
144
json .dump ({"entries" : [], "names" : {}}, jsonFile )
153
145
with open (filepath , "r" ) as jsonFile :
154
146
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
+
155
155
entries = content ["entries" ]
156
156
entries .append (new_entry )
157
157
content ["names" ] = get_names (content ["entries" ][- 1 ], sh_log_data .sh_names )
@@ -160,7 +160,21 @@ def save_log(log_type: LogType):
160
160
return content ["entries" ]
161
161
162
162
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 :
164
178
if log_type == LogType .DAILY :
165
179
date = timecheck .create_timestamp_HH_MM ()
166
180
else :
@@ -224,8 +238,7 @@ def create_entry(log_type: LogType, sh_log_data: LegacySmartHomeLogData) -> Dict
224
238
log .exception ("Fehler im Werte-Logging-Modul für Speicher " + str (bat ))
225
239
226
240
hc_dict = {"all" : {"imported" : data .data .counter_all_data .data .set .imported_home_consumption }}
227
-
228
- return {
241
+ new_entry = {
229
242
"timestamp" : current_timestamp ,
230
243
"date" : date ,
231
244
"cp" : cp_dict ,
@@ -237,6 +250,22 @@ def create_entry(log_type: LogType, sh_log_data: LegacySmartHomeLogData) -> Dict
237
250
"hc" : hc_dict
238
251
}
239
252
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
+
240
269
241
270
def get_names (totals : Dict , sh_names : Dict ) -> Dict :
242
271
names = sh_names
0 commit comments