diff --git a/libnymea-app/energy/energylogs.cpp b/libnymea-app/energy/energylogs.cpp index 55d49879..47851536 100644 --- a/libnymea-app/energy/energylogs.cpp +++ b/libnymea-app/energy/energylogs.cpp @@ -190,10 +190,7 @@ EnergyLogEntry *EnergyLogs::find(const QDateTime ×tamp) return nullptr; } QDateTime first = m_list.first()->timestamp(); - if (timestamp < first || timestamp > m_list.last()->timestamp()) { - return nullptr; - } - int index = qRound(1.0 * first.secsTo(timestamp) / (m_sampleRate * 60)); + int index = 1.0 * first.secsTo(timestamp) / (m_sampleRate * 60); if (index < 0 || index >= m_list.count()) { return nullptr; } diff --git a/nymea-app/ui/mainviews/energy/ConsumerStats.qml b/nymea-app/ui/mainviews/energy/ConsumerStats.qml index 86e30745..41fcc6e8 100644 --- a/nymea-app/ui/mainviews/energy/ConsumerStats.qml +++ b/nymea-app/ui/mainviews/energy/ConsumerStats.qml @@ -430,7 +430,7 @@ StatsBase { backgroundItem: chartView backgroundRect: Qt.rect(chartView.plotArea.x + toolTip.x, chartView.plotArea.y + toolTip.y, toolTip.width, toolTip.height) - property int idx: Math.ceil(mouseArea.mouseX * d.config.count / mouseArea.width) - 1 + property int idx: Math.max(0, Math.min(d.config.count - 1, Math.ceil(mouseArea.mouseX * d.config.count / mouseArea.width) - 1)) property date timestamp: root.calculateTimestamp(d.config.startTime(), d.config.sampleRate, d.startOffset + idx) visible: (mouseArea.containsMouse || mouseArea.tooltipping) && !mouseArea.dragging diff --git a/nymea-app/ui/mainviews/energy/ConsumersHistory.qml b/nymea-app/ui/mainviews/energy/ConsumersHistory.qml index 44589f50..c5287a38 100644 --- a/nymea-app/ui/mainviews/energy/ConsumersHistory.qml +++ b/nymea-app/ui/mainviews/energy/ConsumersHistory.qml @@ -128,7 +128,20 @@ Item { Label { x: chartView.x + chartView.plotArea.x + (chartView.plotArea.width - width) / 2 y: chartView.y + chartView.plotArea.y + Style.smallMargins - text: d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + text: { + switch (d.sampleRate) { + case EnergyLogs.SampleRate1Min: + return d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + case EnergyLogs.SampleRate15Mins: + case EnergyLogs.SampleRate1Hour: + case EnergyLogs.SampleRate3Hours: + case EnergyLogs.SampleRate1Day: + case EnergyLogs.SampleRate1Week: + case EnergyLogs.SampleRate1Month: + case EnergyLogs.SampleRate1Year: + return d.startTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat) + " - " + d.endTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat) + } + } font: Style.smallFont opacity: ((new Date().getTime() - d.now.getTime()) / d.sampleRate / 60000) > d.visibleValues ? .5 : 0 Behavior on opacity { NumberAnimation {} } @@ -291,7 +304,7 @@ Item { Repeater { id: consumersRepeater - model: consumers + model: consumers.count onCountChanged: { if (count == consumers.count) { @@ -327,6 +340,28 @@ Item { series.upperSeries.insert(idx, entry.timestamp.getTime(), entry.currentPower + baseValue) } + function addEntries(index, entries) { + print("adding entries for", thing.name) + // Remove the leading 0-value entry + series.upperSeries.removePoints(0, 1); + + for (var i = 0; i < entries.length; i++) { + var entry = entries[i] +// print("got thing entry", thing.name, entry.timestamp, entry.currentPower, index + i) + + zeroSeries.ensureValue(entry.timestamp) + valueAxis.adjustMax(entry.currentPower) + + insertEntry(index + i, entry) + if (entry.timestamp > d.now && new Date().getTime() - d.now.getTime() < 120000) { + d.now = entry.timestamp + } + } + + // Add the leading 0-value entry back + series.upperSeries.insert(0, series.upperSeries.at(0).x, 0) + } + readonly property ThingPowerLogs logs: ThingPowerLogs { engine: _engine startTime: new Date(d.startTime.getTime() - d.range * 60000) @@ -341,26 +376,37 @@ Item { onEntriesAdded: { print("Thing entries added", consumerDelegate.thing.name, index, entries.length) - for (var i = 0; i < entries.length; i++) { - var entry = entries[i] -// print("got thing entry", thing.name, entry.timestamp, entry.currentPower, index + i) - - zeroSeries.ensureValue(entry.timestamp) - valueAxis.adjustMax(entry.currentPower) - - consumerDelegate.insertEntry(index + i, entry) - if (entry.timestamp > d.now && new Date().getTime() - d.now.getTime() < 120000) { - d.now = entry.timestamp - } - } + addTimer.addEntries(index, entries) } onEntriesRemoved: { + // Remove the leading 0-value entry + consumerDelegate.series.upperSeries.removePoints(0, 1); + consumerDelegate.series.upperSeries.removePoints(index, count) + + // Add the leading 0-value entry back + consumerDelegate.series.upperSeries.insert(0, consumerDelegate.series.upperSeries.at(0).x, 0) + zeroSeries.shrink() } } + // We'll have to make sure all the consumers have their data ready before adding + Timer { + id: addTimer + interval: 1000 + repeat: false + onTriggered: consumerDelegate.addEntries(index, entries) + property int index + property var entries + function addEntries(index, entries) { + addTimer.index = index + addTimer.entries = entries + start() + } + } + Component.onCompleted: { series = chartView.createSeries(ChartView.SeriesTypeArea, thing.name, dateTimeAxis, valueAxis) series.lowerSeries = index == 0 ? zeroSeries : consumersRepeater.itemAt(index - 1).series.upperSeries @@ -369,6 +415,8 @@ Item { series.borderWidth = 0; series.borderColor = series.color + // Add a first point at 0 value + series.upperSeries.insert(0, new Date().getTime(), 0) } } } @@ -435,7 +483,7 @@ Item { var idx = Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width) var timestamp = new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000)) selectionTabs.currentIndex-- - d.now = new Date(timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000) + d.now = new Date(Math.min(new Date().getTime(), timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000)) powerBalanceLogs.fetchLogs() logsLoader.fetchLogs() } @@ -501,7 +549,7 @@ Item { backgroundItem: chartView backgroundRect: Qt.rect(mouseArea.x + toolTip.x, mouseArea.y + toolTip.y, toolTip.width, toolTip.height) - property int idx: Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width) + property int idx: Math.min(d.visibleValues, Math.max(0, Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width))) property date timestamp: new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000)) property PowerBalanceLogEntry entry: powerBalanceLogs.find(timestamp) @@ -522,7 +570,7 @@ Item { margins: Style.smallMargins } Label { - text: toolTip.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat) + text: toolTip.entry.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat) font: Style.smallFont } RowLayout { @@ -566,6 +614,4 @@ Item { } } } - - } diff --git a/nymea-app/ui/mainviews/energy/PowerBalanceStats.qml b/nymea-app/ui/mainviews/energy/PowerBalanceStats.qml index d11f18f3..e61e9b24 100644 --- a/nymea-app/ui/mainviews/energy/PowerBalanceStats.qml +++ b/nymea-app/ui/mainviews/energy/PowerBalanceStats.qml @@ -450,7 +450,7 @@ StatsBase { backgroundItem: chartView backgroundRect: Qt.rect(chartView.plotArea.x + toolTip.x, chartView.plotArea.y + toolTip.y, toolTip.width, toolTip.height) - property int idx: Math.ceil(mouseArea.mouseX * d.config.count / mouseArea.width) - 1 + property int idx: Math.min(d.config.count -1, Math.max(0, Math.ceil(mouseArea.mouseX * d.config.count / mouseArea.width) - 1)) property date timestamp: root.calculateTimestamp(d.config.startTime(), d.config.sampleRate, d.startOffset + idx) visible: (mouseArea.containsMouse || mouseArea.tooltipping) && !mouseArea.dragging diff --git a/nymea-app/ui/mainviews/energy/PowerConsumptionBalanceHistory.qml b/nymea-app/ui/mainviews/energy/PowerConsumptionBalanceHistory.qml index 311e7f8d..bb0357e0 100644 --- a/nymea-app/ui/mainviews/energy/PowerConsumptionBalanceHistory.qml +++ b/nymea-app/ui/mainviews/energy/PowerConsumptionBalanceHistory.qml @@ -127,7 +127,20 @@ Item { Label { x: chartView.x + chartView.plotArea.x + (chartView.plotArea.width - width) / 2 y: chartView.y + chartView.plotArea.y + Style.smallMargins - text: d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + text: { + switch (d.sampleRate) { + case EnergyLogs.SampleRate1Min: + return d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + case EnergyLogs.SampleRate15Mins: + case EnergyLogs.SampleRate1Hour: + case EnergyLogs.SampleRate3Hours: + case EnergyLogs.SampleRate1Day: + case EnergyLogs.SampleRate1Week: + case EnergyLogs.SampleRate1Month: + case EnergyLogs.SampleRate1Year: + return d.startTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat) + " - " + d.endTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat) + } + } font: Style.smallFont opacity: ((new Date().getTime() - d.now.getTime()) / d.sampleRate / 60000) > d.visibleValues ? .5 : 0 Behavior on opacity { NumberAnimation {} } @@ -425,7 +438,7 @@ Item { var idx = Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width) var timestamp = new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000)) selectionTabs.currentIndex-- - d.now = new Date(timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000) + d.now = new Date(Math.min(new Date().getTime(), timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000)) powerBalanceLogs.fetchLogs() } @@ -477,7 +490,7 @@ Item { backgroundItem: chartView backgroundRect: Qt.rect(mouseArea.x + toolTip.x, mouseArea.y + toolTip.y, toolTip.width, toolTip.height) - property int idx: Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width) + property int idx: Math.min(d.visibleValues, Math.max(0, Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width))) property var timestamp: new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000)) property PowerBalanceLogEntry entry: powerBalanceLogs.find(timestamp) @@ -498,7 +511,7 @@ Item { margins: Style.smallMargins } Label { - text: toolTip.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat) + text: toolTip.entry.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat) font: Style.smallFont } diff --git a/nymea-app/ui/mainviews/energy/PowerProductionBalanceHistory.qml b/nymea-app/ui/mainviews/energy/PowerProductionBalanceHistory.qml index 459ee239..ee6907d2 100644 --- a/nymea-app/ui/mainviews/energy/PowerProductionBalanceHistory.qml +++ b/nymea-app/ui/mainviews/energy/PowerProductionBalanceHistory.qml @@ -125,7 +125,20 @@ Item { Label { x: chartView.x + chartView.plotArea.x + (chartView.plotArea.width - width) / 2 y: chartView.y + chartView.plotArea.y + Style.smallMargins - text: d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + text: { + switch (d.sampleRate) { + case EnergyLogs.SampleRate1Min: + return d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + case EnergyLogs.SampleRate15Mins: + case EnergyLogs.SampleRate1Hour: + case EnergyLogs.SampleRate3Hours: + case EnergyLogs.SampleRate1Day: + case EnergyLogs.SampleRate1Week: + case EnergyLogs.SampleRate1Month: + case EnergyLogs.SampleRate1Year: + return d.startTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat) + " - " + d.endTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat) + } + } font: Style.smallFont opacity: ((new Date().getTime() - d.now.getTime()) / d.sampleRate / 60000) > d.visibleValues ? .5 : 0 Behavior on opacity { NumberAnimation {} } @@ -415,7 +428,7 @@ Item { var idx = Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width) var timestamp = new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000)) selectionTabs.currentIndex-- - d.now = new Date(timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000) + d.now = new Date(Math.min(new Date().getTime(), timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000)) powerBalanceLogs.fetchLogs() } @@ -467,7 +480,7 @@ Item { backgroundItem: chartView backgroundRect: Qt.rect(mouseArea.x + toolTip.x, mouseArea.y + toolTip.y, toolTip.width, toolTip.height) - property int idx: Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width) + property int idx: Math.min(d.visibleValues, Math.max(0, Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width))) property var timestamp: new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000)) property PowerBalanceLogEntry entry: powerBalanceLogs.find(timestamp) @@ -488,7 +501,7 @@ Item { margins: Style.smallMargins } Label { - text: toolTip.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat) + text: toolTip.entry.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat) font: Style.smallFont }