feat: add usage, activation to line, persistent alias, auto-updating data based on time
This commit is contained in:
@@ -23,9 +23,12 @@ class Application(QtWidgets.QMainWindow, MainWindow):
|
||||
self.data_source.setAcceptDrops(True)
|
||||
self.data_source.dropEvent = self.dropEvent
|
||||
self.data_source.dragEnterEvent = self.dragEnterEvent
|
||||
self.start_date.dateChanged.connect(self.load_data_clicked)
|
||||
self.end_Date.dateChanged.connect(self.load_data_clicked)
|
||||
self.widgetCount = 2
|
||||
if self.widgetCount == 2:
|
||||
self.removeLastGraph.setEnabled(False)
|
||||
self.sensor_data = None # activations and usage data for legend of graph
|
||||
|
||||
def dragEnterEvent(self, event):
|
||||
if event.mimeData().hasUrls():
|
||||
@@ -61,7 +64,7 @@ class Application(QtWidgets.QMainWindow, MainWindow):
|
||||
else:
|
||||
print("Data source:", source)
|
||||
if self.useSensorTimeData.isChecked():
|
||||
data = (
|
||||
data, sensor_data = (
|
||||
Transform(source)
|
||||
.load_data()
|
||||
.transform_data(addMissing=self.addMissingDays.isChecked())
|
||||
@@ -69,8 +72,7 @@ class Application(QtWidgets.QMainWindow, MainWindow):
|
||||
else:
|
||||
start_date = self.start_date.text().replace(".", "-")
|
||||
end_date = self.end_Date.text().replace(".", "-")
|
||||
print("Start date:", start_date, type(start_date))
|
||||
data = (
|
||||
data,sensor_data = (
|
||||
Transform(source)
|
||||
.load_data()
|
||||
.transform_data(
|
||||
@@ -80,13 +82,21 @@ class Application(QtWidgets.QMainWindow, MainWindow):
|
||||
split=True,
|
||||
)
|
||||
)
|
||||
print("Data:", data)
|
||||
# add data to table
|
||||
self.dataTable.setRowCount(0)
|
||||
self.sensor_data = sensor_data
|
||||
self.insertIntoTable(data)
|
||||
|
||||
def insertIntoTable(self, data):
|
||||
#check if rows have set aliases
|
||||
sensor_alias = {}
|
||||
for row in range(self.dataTable.rowCount()):
|
||||
if self.dataTable.item(row, 1):
|
||||
sensor_alias[self.dataTable.item(row, 0).text()] = self.dataTable.item(
|
||||
row, 1
|
||||
).text()
|
||||
self.dataTable.setRowCount(0)
|
||||
for sensor in data:
|
||||
|
||||
self.dataTable.insertRow(self.dataTable.rowCount())
|
||||
self.dataTable.setItem(
|
||||
self.dataTable.rowCount() - 1, 0, QtWidgets.QTableWidgetItem(sensor)
|
||||
@@ -96,9 +106,16 @@ class Application(QtWidgets.QMainWindow, MainWindow):
|
||||
2,
|
||||
QtWidgets.QTableWidgetItem(str((data[sensor]))),
|
||||
)
|
||||
if sensor in sensor_alias:
|
||||
self.dataTable.setItem(
|
||||
self.dataTable.rowCount() - 1,
|
||||
1,
|
||||
QtWidgets.QTableWidgetItem(sensor_alias[sensor]),
|
||||
)
|
||||
|
||||
def create_diagram(self):
|
||||
selectedRowCount = len(self.dataTable.selectionModel().selectedRows())
|
||||
labels = {}
|
||||
if selectedRowCount == 0:
|
||||
# Show error message in dialog
|
||||
msg = QtWidgets.QMessageBox()
|
||||
@@ -117,6 +134,7 @@ class Application(QtWidgets.QMainWindow, MainWindow):
|
||||
data = self.dataTable.item(self.dataTable.currentRow(), 2).text()
|
||||
# convert data to dict
|
||||
data = ast.literal_eval(data)
|
||||
labels[sensor] = alias
|
||||
graph_data = {
|
||||
alias if alias else sensor: {"x": data["x"], "y": data["y"]}
|
||||
}
|
||||
@@ -140,8 +158,14 @@ class Application(QtWidgets.QMainWindow, MainWindow):
|
||||
row_data = {
|
||||
alias if alias else sensor: {"x": data["x"], "y": data["y"]}
|
||||
}
|
||||
labels[sensor] = alias
|
||||
graph_data.append(row_data)
|
||||
graph = Graph(graph_data)
|
||||
#replace the keys from self.sensor_data with the alias from labels
|
||||
print(labels)
|
||||
for key in labels:
|
||||
if key in self.sensor_data:
|
||||
self.sensor_data[labels[key]] = self.sensor_data.pop(key)
|
||||
graph = Graph(graph_data, labels,self.sensor_data, )
|
||||
self.centralWidget().layout().addWidget(graph.graph)
|
||||
self.widgetCount += 1
|
||||
self.check_widget_count()
|
||||
|
||||
@@ -47,21 +47,25 @@ class Transform:
|
||||
for key, value in self.data.items():
|
||||
sensors.append({"id": key, "value": value})
|
||||
temp = {}
|
||||
s_data = {}
|
||||
|
||||
start_date = start_date
|
||||
end_date = end_date
|
||||
# create a list of all dates between the start and end date
|
||||
all_dates = createDateList(start_date, end_date)
|
||||
|
||||
for sensor in sensors:
|
||||
tmp = {}
|
||||
sensor_values = {}
|
||||
name = sensor["id"]
|
||||
sensor_values[name] = sensor["value"]
|
||||
tmp[name] = {"x": [], "y": []}
|
||||
sensor_data = sensor["value"]
|
||||
sensor_dates = list(sensor_data.keys())
|
||||
print(len(all_dates))
|
||||
sum_activations = 0
|
||||
|
||||
|
||||
for date in all_dates:
|
||||
# print(date)
|
||||
if date not in sensor_dates:
|
||||
# print("Date not in sensor data", name, date)
|
||||
if addMissing:
|
||||
@@ -71,6 +75,11 @@ class Transform:
|
||||
on_state = len(sensor_data[date]["on"])
|
||||
off_state = len(sensor_data[date]["off"])
|
||||
activations = (on_state + off_state) / 2
|
||||
if activations == 1:
|
||||
activations = 0
|
||||
else:
|
||||
activations = on_state
|
||||
sum_activations += activations
|
||||
# add the date to the tmp dictionary as x and the number of activations as y
|
||||
tmp[name]["x"].append(date)
|
||||
tmp[name]["y"].append(activations)
|
||||
@@ -83,8 +92,10 @@ class Transform:
|
||||
# tmp[name]["y"].append(activations if activations > 1 else 0)
|
||||
|
||||
temp.update(tmp)
|
||||
#create new entry in s_data for sensor, add key "total_activations" and the sum of all activations, as well as the usage, which is activation divided by the number of days
|
||||
s_data[name] = {"total_activations": sum_activations, "usage": round(sum_activations / 2)}
|
||||
|
||||
return temp
|
||||
return temp, s_data
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -3,7 +3,9 @@ from PyQt6 import QtWidgets
|
||||
|
||||
|
||||
class Graph:
|
||||
def __init__(self, data: list):
|
||||
def __init__(self, data: list,label_data, legend_data):
|
||||
self.label_data = label_data
|
||||
self.legend_data = legend_data
|
||||
self.xlist = []
|
||||
if isinstance(data, dict):
|
||||
self.xlist += data[list(data.keys())[0]]["x"]
|
||||
@@ -14,8 +16,6 @@ class Graph:
|
||||
xlist = list(set(self.xlist))
|
||||
xlist.sort()
|
||||
xdict = dict(enumerate(xlist))
|
||||
print("xlist:", xlist)
|
||||
print(xdict)
|
||||
self.xdict = xdict
|
||||
stringaxis_x = pg.AxisItem(orientation="bottom")
|
||||
stringaxis_x.setTicks([xdict.items()])
|
||||
@@ -30,11 +30,15 @@ class Graph:
|
||||
self.plot_lines(data)
|
||||
else:
|
||||
self.plot_line(data)
|
||||
|
||||
self.add_information()
|
||||
self.graph.showGrid(x=True, y=True)
|
||||
|
||||
def add_information(self, ):
|
||||
pass
|
||||
def plot_line(self, data, color="r"):
|
||||
line_label = list(data.keys())[0]
|
||||
line_data = self.legend_data[line_label]
|
||||
line_addon = f" ({line_data['total_activations']}|{line_data['usage']})"
|
||||
x_data = data[line_label]["x"]
|
||||
self.xlist += x_data
|
||||
x_data = [date.split("2024-")[1] for date in x_data]
|
||||
@@ -45,13 +49,12 @@ class Graph:
|
||||
global_xdict = {
|
||||
key: global_xdict[key] for key in xdict.keys() if key in global_xdict.keys()
|
||||
}
|
||||
print(line_label, global_xdict)
|
||||
|
||||
y_data = data[line_label]["y"]
|
||||
self.graph.plot(
|
||||
list(xdict.keys()),
|
||||
y_data,
|
||||
name=line_label,
|
||||
name=f"{line_label}{line_addon}",
|
||||
pen=pg.mkPen(color=color, width=2),
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user