Fill in holes in the logs when the clock is changed forward
parent
881e7c074c
commit
e2f0b50fa8
|
|
@ -186,7 +186,7 @@ PowerBalanceLogEntry EnergyLogger::latestLogEntry(SampleRate sampleRate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
QSqlQuery query(m_db);
|
QSqlQuery query(m_db);
|
||||||
QString queryString = "SELECT MAX(timestamp), consumption, production, acquisition, storage, totalConsumption, totalProduction, totalAcquisition, totalReturn FROM powerBalance";
|
QString queryString = "SELECT MAX(timestamp) as timestamp, consumption, production, acquisition, storage, totalConsumption, totalProduction, totalAcquisition, totalReturn FROM powerBalance";
|
||||||
QVariantList bindValues;
|
QVariantList bindValues;
|
||||||
if (sampleRate != SampleRateAny) {
|
if (sampleRate != SampleRateAny) {
|
||||||
queryString += " WHERE sampleRate = ?";
|
queryString += " WHERE sampleRate = ?";
|
||||||
|
|
@ -218,7 +218,7 @@ ThingPowerLogEntry EnergyLogger::latestLogEntry(SampleRate sampleRate, const Thi
|
||||||
}
|
}
|
||||||
|
|
||||||
QSqlQuery query(m_db);
|
QSqlQuery query(m_db);
|
||||||
query.prepare("SELECT MAX(timestamp), currentPower, totalConsumption, totalProduction from thingPower WHERE sampleRate = ? AND thingId = ?;");
|
query.prepare("SELECT MAX(timestamp) as timestamp, currentPower, totalConsumption, totalProduction from thingPower WHERE sampleRate = ? AND thingId = ?;");
|
||||||
query.addBindValue(sampleRate);
|
query.addBindValue(sampleRate);
|
||||||
query.addBindValue(thingId);
|
query.addBindValue(thingId);
|
||||||
if (!query.exec()) {
|
if (!query.exec()) {
|
||||||
|
|
@ -301,7 +301,30 @@ void EnergyLogger::sample()
|
||||||
QDateTime sampleEnd = m_nextSamples.value(SampleRate1Min);
|
QDateTime sampleEnd = m_nextSamples.value(SampleRate1Min);
|
||||||
QDateTime sampleStart = sampleEnd.addMSecs(-60 * 1000);
|
QDateTime sampleStart = sampleEnd.addMSecs(-60 * 1000);
|
||||||
|
|
||||||
qCDebug(dcEnergyExperience()) << "Sampling power balance for 1 min" << sampleEnd.toString();
|
PowerBalanceLogEntry newestInDB = latestLogEntry(SampleRate1Min);
|
||||||
|
|
||||||
|
qCDebug(dcEnergyExperience()) << "Sampling power balance for 1 min from" << sampleStart.toString() << sampleEnd.toString() << "newest in DB:" << newestInDB.timestamp().toString();
|
||||||
|
|
||||||
|
if (newestInDB.timestamp().isValid() && newestInDB.timestamp() < sampleStart) {
|
||||||
|
QDateTime oldestTimestamp = sampleStart.addMSecs(-(qint64)m_maxMinuteSamples * 60 * 1000);
|
||||||
|
QDateTime timestamp = newestInDB.timestamp();
|
||||||
|
if (oldestTimestamp > newestInDB.timestamp()) {
|
||||||
|
// In this case we'd be adding m_maxMinuteSamples of 0 values but trim anything before
|
||||||
|
// Spare the time by just adding the latest one to keep the totals
|
||||||
|
timestamp = sampleStart.addMSecs(-60000);
|
||||||
|
}
|
||||||
|
qCWarning(dcEnergyExperience()).nospace() << "Clock skew detected. Adding missing samples.";
|
||||||
|
QDateTime now = QDateTime::currentDateTime();
|
||||||
|
int i = 0;
|
||||||
|
m_db.transaction();
|
||||||
|
while (timestamp < sampleStart) {
|
||||||
|
timestamp = timestamp.addMSecs(60000);
|
||||||
|
insertPowerBalance(timestamp, SampleRate1Min, 0, 0, 0, 0, newestInDB.totalConsumption(), newestInDB.totalProduction(), newestInDB.totalAcquisition(), newestInDB.totalReturn());
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
m_db.commit();
|
||||||
|
qCDebug(dcEnergyExperience()) << "Added missing" << i << "minute-samples in" << now.msecsTo(QDateTime::currentDateTime()) << "ms";
|
||||||
|
}
|
||||||
|
|
||||||
double medianConsumption = 0;
|
double medianConsumption = 0;
|
||||||
double medianProduction = 0;
|
double medianProduction = 0;
|
||||||
|
|
@ -337,8 +360,27 @@ void EnergyLogger::sample()
|
||||||
insertPowerBalance(sampleEnd, SampleRate1Min, medianConsumption, medianProduction, medianAcquisition, medianStorage, totalConsumption, totalProduction, totalAcquisition, totalReturn);
|
insertPowerBalance(sampleEnd, SampleRate1Min, medianConsumption, medianProduction, medianAcquisition, medianStorage, totalConsumption, totalProduction, totalAcquisition, totalReturn);
|
||||||
|
|
||||||
foreach (const ThingId &thingId, m_thingsPowerLiveLogs.keys()) {
|
foreach (const ThingId &thingId, m_thingsPowerLiveLogs.keys()) {
|
||||||
|
|
||||||
|
ThingPowerLogEntry newestInDB = latestLogEntry(SampleRate1Min, thingId);
|
||||||
|
qCDebug(dcEnergyExperience()) << "Sampling thing power for" << thingId.toString() << SampleRate1Min << "from" << sampleStart.toString() << "to" << sampleEnd.toString() << "newest in DB" << newestInDB.timestamp().toString();
|
||||||
|
|
||||||
|
if (newestInDB.timestamp().isValid() && newestInDB.timestamp() < sampleStart) {
|
||||||
|
QDateTime oldestTimestamp = sampleStart.addMSecs(-(qint64)m_maxMinuteSamples * 60 * 1000);
|
||||||
|
QDateTime timestamp = qMax(newestInDB.timestamp(), oldestTimestamp);
|
||||||
|
qCWarning(dcEnergyExperience()).nospace() << "Clock skew detected. Adding missing samples.";
|
||||||
|
QDateTime now = QDateTime::currentDateTime();
|
||||||
|
int i = 0;
|
||||||
|
m_db.transaction();
|
||||||
|
while (timestamp < sampleStart) {
|
||||||
|
timestamp = timestamp.addMSecs(60000);
|
||||||
|
insertThingPower(timestamp, SampleRate1Min, thingId, 0, newestInDB.totalConsumption(), newestInDB.totalProduction());
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
m_db.commit();
|
||||||
|
qCDebug(dcEnergyExperience()) << "Added missing" << i << "minute-samples in" << now.msecsTo(QDateTime::currentDateTime()) << "ms";
|
||||||
|
}
|
||||||
|
|
||||||
double medianPower = 0;
|
double medianPower = 0;
|
||||||
qCDebug(dcEnergyExperience()) << "Sampling thing power for" << thingId.toString() << SampleRate1Min << sampleEnd.toString();
|
|
||||||
ThingPowerLogEntries entries = m_thingsPowerLiveLogs.value(thingId);
|
ThingPowerLogEntries entries = m_thingsPowerLiveLogs.value(thingId);
|
||||||
for (int i = 0; i < entries.count(); i++) {
|
for (int i = 0; i < entries.count(); i++) {
|
||||||
const ThingPowerLogEntry &entry = entries.at(i);
|
const ThingPowerLogEntry &entry = entries.at(i);
|
||||||
|
|
@ -367,6 +409,14 @@ void EnergyLogger::sample()
|
||||||
if (now >= m_nextSamples.value(sampleRate)) {
|
if (now >= m_nextSamples.value(sampleRate)) {
|
||||||
QDateTime sampleTime = m_nextSamples.value(sampleRate);
|
QDateTime sampleTime = m_nextSamples.value(sampleRate);
|
||||||
SampleRate baseSampleRate = m_configs.value(sampleRate).baseSampleRate;
|
SampleRate baseSampleRate = m_configs.value(sampleRate).baseSampleRate;
|
||||||
|
QDateTime sampleStart = calculateSampleStart(sampleTime, sampleRate);
|
||||||
|
QDateTime newestInDB = getNewestPowerBalanceSampleTimestamp(sampleRate);
|
||||||
|
|
||||||
|
if (newestInDB < sampleStart) {
|
||||||
|
qCWarning(dcEnergyExperience()) << "Clock skew detected. Recovering samples...";
|
||||||
|
rectifySamples(sampleRate, baseSampleRate);
|
||||||
|
}
|
||||||
|
|
||||||
samplePowerBalance(sampleRate, baseSampleRate, sampleTime);
|
samplePowerBalance(sampleRate, baseSampleRate, sampleTime);
|
||||||
sampleThingsPower(sampleRate, baseSampleRate, sampleTime);
|
sampleThingsPower(sampleRate, baseSampleRate, sampleTime);
|
||||||
}
|
}
|
||||||
|
|
@ -816,7 +866,6 @@ bool EnergyLogger::sampleThingsPower(SampleRate sampleRate, SampleRate baseSampl
|
||||||
bool EnergyLogger::sampleThingPower(const ThingId &thingId, SampleRate sampleRate, SampleRate baseSampleRate, const QDateTime &sampleEnd)
|
bool EnergyLogger::sampleThingPower(const ThingId &thingId, SampleRate sampleRate, SampleRate baseSampleRate, const QDateTime &sampleEnd)
|
||||||
{
|
{
|
||||||
QDateTime sampleStart = calculateSampleStart(sampleEnd, sampleRate);
|
QDateTime sampleStart = calculateSampleStart(sampleEnd, sampleRate);
|
||||||
|
|
||||||
qCDebug(dcEnergyExperience()) << "Sampling thing power for" << thingId.toString() << sampleRate << "from" << sampleStart.toString() << "to" << sampleEnd.toString();
|
qCDebug(dcEnergyExperience()) << "Sampling thing power for" << thingId.toString() << sampleRate << "from" << sampleStart.toString() << "to" << sampleEnd.toString();
|
||||||
|
|
||||||
double medianCurrentPower = 0;
|
double medianCurrentPower = 0;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue