Sat, 22 Jun 2024 11:28:14 +0200
The iSpindel monitor, detail and chart screens try to use the polynomial calibration data to show the SG. Fallback to already logged data if this fails.
--- a/src/ChartiSpindel.cpp Fri Jun 14 08:45:35 2024 +0200 +++ b/src/ChartiSpindel.cpp Sat Jun 22 11:28:14 2024 +0200 @@ -23,10 +23,11 @@ ChartiSpindel::ChartiSpindel(QString code, QString name, QWidget *parent) : QDialog(parent) { QSqlQuery query; - double timestamp; + double timestamp, poly[4], plato, angle; double sg_min = 1.2, sg_max = 0.8, mg, sg; double temp_min = 100, temp_max = 0, temp; double batt_min = 4.5, batt_max = 3.0, batt; + bool polyvalid = false; qDebug() << "ChartiSpindel:" << code << name; @@ -48,6 +49,33 @@ buttonBox->setStandardButtons(QDialogButtonBox::Ok); buttonBox->addButton(saveButton,QDialogButtonBox::ActionRole); + /* + * Try to load the polynomial calibration data. + * This only succeeds for the current brew. + * For historical brews we need another way to load the correct record. + */ + query.prepare("SELECT calibrate FROM mon_ispindels WHERE beercode=:beercode AND beername=:beername"); + query.bindValue(":beercode", code); + query.bindValue(":beername", name); + query.exec(); + if (query.next()) { + QJsonParseError parseError; + const auto& json = query.value("calibrate").toString(); + if (!json.trimmed().isEmpty()) { + const auto& formattedJson = QString("%1").arg(json); + QJsonDocument jsonResponse = QJsonDocument::fromJson(formattedJson.toUtf8(), &parseError); + QJsonObject jsonObj = jsonResponse.object(); + QJsonArray polyData = jsonObj.value("polyData").toArray(); + if (polyData.size() == 4) { + for (int i = 0; i < polyData.size(); i++) { + poly[i] = polyData.at(i).toDouble(); + } + polyvalid = true; + } + } + } +// qDebug() << "polyvalid" << polyvalid; + temperature = new QLineSeries(); density = new QLineSeries(); battery = new QLineSeries(); @@ -57,8 +85,14 @@ query.exec(); while (query.next()) { timestamp = query.value("datetime").toDateTime().toSecsSinceEpoch() * 1000; - - mg = query.value("sg").toDouble(); + if (polyvalid) { + angle = query.value("angle").toDouble(); + plato = (poly[0] * pow(angle, 3)) + (poly[1] * pow(angle, 2)) + (poly[2] * angle) + poly[3]; + mg = Utils::plato_to_sg(plato); +// qDebug() << "sg" << query.value("sg").toDouble() << "mg" << mg; + } else { + mg = query.value("sg").toDouble(); + } temp = query.value("temperature").toDouble(); if (ceil(temp) > temp_max) temp_max = ceil(temp);
--- a/src/DetailiSpindel.cpp Fri Jun 14 08:45:35 2024 +0200 +++ b/src/DetailiSpindel.cpp Sat Jun 22 11:28:14 2024 +0200 @@ -64,6 +64,7 @@ void DetailiSpindel::refreshTable() { QSqlQuery query; + double angle, plato, sg, poly[4]; query.prepare("SELECT * FROM mon_ispindels WHERE record = :recno"); query.bindValue(":recno", this->recno); @@ -87,30 +88,50 @@ ui->systemEdit->setText(_node+"/"+_alias); ui->codePick->setItemText(0, _alias.toUpper()+" - "+_alias); ui->alarmLED->setChecked(alarm); + ui->lastEdit->setText(query.value("lastseen").toDateTime().toString("dd MMM HH:mm:ss")); + ui->codeEdit->setText(_beercode+" - "+_beername); + ui->powerLED->setChecked(mode); + ui->modeEdit->show(); + ui->modeEdit->setCurrentIndex(mode ? 1:0); if (online) { ui->statusEdit->setText(tr("Online")); ui->statusEdit->setStyleSheet(""); - ui->codeEdit->setText(_beercode+" - "+_beername); ui->thermoMeter->setNominal(query.value("yeast_lo").toDouble()); ui->thermoMeter->setCritical(query.value("yeast_hi").toDouble()); - - ui->powerLED->setChecked(mode); - ui->modeEdit->show(); + ui->modeEdit->setEnabled(true); if (mode) { - ui->modeEdit->setCurrentIndex(1); ui->codePick->hide(); } else { - ui->modeEdit->setCurrentIndex(0); ui->codePick->show(); } + plato = query.value("gravity").toDouble(); + angle = query.value("angle").toDouble(); + /* + * Try to use the calibrate poly to recalcultate the density. + */ + QJsonParseError parseError; + const auto& json = query.value("calibrate").toString(); + if (!json.trimmed().isEmpty()) { + const auto& formattedJson = QString("%1").arg(json); + QJsonDocument jsonResponse = QJsonDocument::fromJson(formattedJson.toUtf8(), &parseError); + QJsonObject jsonObj = jsonResponse.object(); + QJsonArray polyData = jsonObj.value("polyData").toArray(); + if (polyData.size() == 4) { + for (int i = 0; i < polyData.size(); i++) { + poly[i] = polyData.at(i).toDouble(); + } + /* New plato from current polynomial */ + plato = (poly[0] * pow(angle, 3)) + (poly[1] * pow(angle, 2)) + (poly[2] * angle) + poly[3]; + } + } + sg = Utils::plato_to_sg(plato); + ui->voltEdit->setText(QString("%1").arg(query.value("battery").toDouble(), 4, 'f', 3, '0')); - ui->tiltEdit->setText(QString("%1").arg(query.value("angle").toDouble(), 6, 'f', 5, '0')); - ui->platoEdit->setText(QString("%1").arg(query.value("gravity").toDouble(), 4, 'f', 3, '0')); - double sg = Utils::plato_to_sg(query.value("gravity").toDouble()); + ui->tiltEdit->setText(QString("%1").arg(angle, 6, 'f', 5, '0')); + ui->platoEdit->setText(QString("%1").arg(plato, 4, 'f', 3, '0')); ui->sgEdit->setText(QString("%1").arg(sg, 5, 'f', 4, '0')); - ui->lastEdit->setText(query.value("lastseen").toDateTime().toString("dd MMM HH:mm:ss")); if (query.value("gravity").toDouble()) { double o_plato = query.value("og_gravity").toDouble(); @@ -158,10 +179,9 @@ /* Offline */ ui->statusEdit->setText(tr("Offline")); ui->statusEdit->setStyleSheet("background-color: red"); - ui->powerLED->setChecked(false); ui->alarmLED->setChecked(true); ui->codePick->hide(); - ui->modeEdit->hide(); + ui->modeEdit->setEnabled(false); ui->thermoBox->hide(); ui->logButton->hide(); }
--- a/src/MoniSpindels.cpp Fri Jun 14 08:45:35 2024 +0200 +++ b/src/MoniSpindels.cpp Sat Jun 22 11:28:14 2024 +0200 @@ -74,8 +74,9 @@ void MoniSpindels::refreshTable() { QTableWidgetItem *item; + double plato, poly[4]; - QSqlQuery query("SELECT record,alias,node,online,mode,temperature,gravity,beercode,beername FROM mon_ispindels ORDER BY alias"); + QSqlQuery query("SELECT record,alias,node,online,mode,temperature,gravity,angle,calibrate,beercode,beername FROM mon_ispindels ORDER BY alias"); const QStringList labels({tr("Unit"), tr("Node"), tr("Status"), tr("Beer"), tr("Temperature"), tr("SG"), tr("Cal"), tr("Details")}); this->tableiSpindels->setColumnCount(8); @@ -114,10 +115,31 @@ } if (query.value("online").toInt()) { + /* + * Try to use the calibrate poly to recalcultate the SG. + */ + plato = query.value("gravity").toDouble(); + QJsonParseError parseError; + const auto& json = query.value("calibrate").toString(); + if (!json.trimmed().isEmpty()) { + const auto& formattedJson = QString("%1").arg(json); + QJsonDocument jsonResponse = QJsonDocument::fromJson(formattedJson.toUtf8(), &parseError); + QJsonObject jsonObj = jsonResponse.object(); + QJsonArray polyData = jsonObj.value("polyData").toArray(); + if (polyData.size() == 4) { + for (int i = 0; i < polyData.size(); i++) { + poly[i] = polyData.at(i).toDouble(); + } + double angle = query.value("angle").toDouble(); + /* New plato from current polynomial */ + plato = (poly[0] * pow(angle, 3)) + (poly[1] * pow(angle, 2)) + (poly[2] * angle) + poly[3]; + } + } + item = new QTableWidgetItem(QString("%1°C").arg(query.value("temperature").toDouble(), 4, 'f', 3, '0')); item->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter); this->tableiSpindels->setItem(i, 4, item); - double sg = Utils::plato_to_sg(query.value("gravity").toDouble()); + double sg = Utils::plato_to_sg(plato); item = new QTableWidgetItem(QString("%1").arg(sg, 5, 'f', 4, '0')); item->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter); this->tableiSpindels->setItem(i, 5, item);
--- a/translations/bmsapp_en.ts Fri Jun 14 08:45:35 2024 +0200 +++ b/translations/bmsapp_en.ts Sat Jun 22 11:28:14 2024 +0200 @@ -299,79 +299,79 @@ <context> <name>ChartiSpindel</name> <message> - <location filename="../src/ChartiSpindel.cpp" line="34"/> + <location filename="../src/ChartiSpindel.cpp" line="35"/> <source>BMSapp - iSpindel </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="39"/> + <location filename="../src/ChartiSpindel.cpp" line="40"/> <source>Save</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="88"/> + <location filename="../src/ChartiSpindel.cpp" line="122"/> <source>Temperature</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="90"/> + <location filename="../src/ChartiSpindel.cpp" line="124"/> <source>SG</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="94"/> + <location filename="../src/ChartiSpindel.cpp" line="128"/> <source>Battery</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="106"/> + <location filename="../src/ChartiSpindel.cpp" line="140"/> <source>Date</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="117"/> + <location filename="../src/ChartiSpindel.cpp" line="151"/> <source>Temperature °C</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="135"/> + <location filename="../src/ChartiSpindel.cpp" line="169"/> <source>Battery volt</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="177"/> - <source>Save Image</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/ChartiSpindel.cpp" line="177"/> - <source>Image (*.png)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/ChartiSpindel.cpp" line="179"/> - <source>Save File</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/ChartiSpindel.cpp" line="179"/> - <source>No image file selected.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/ChartiSpindel.cpp" line="209"/> - <source>%1 -Temperature %2°C</source> - <translation type="unfinished"></translation> - </message> - <message> <location filename="../src/ChartiSpindel.cpp" line="211"/> + <source>Save Image</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ChartiSpindel.cpp" line="211"/> + <source>Image (*.png)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ChartiSpindel.cpp" line="213"/> + <source>Save File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ChartiSpindel.cpp" line="213"/> + <source>No image file selected.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ChartiSpindel.cpp" line="243"/> + <source>%1 +Temperature %2°C</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ChartiSpindel.cpp" line="245"/> <source>%1 Density %2 SG</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="220"/> + <location filename="../src/ChartiSpindel.cpp" line="254"/> <source>%1 Battery %2 volt Capacity %3%</source> @@ -1143,12 +1143,12 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../src/DetailiSpindel.cpp" line="92"/> + <location filename="../src/DetailiSpindel.cpp" line="98"/> <source>Online</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/DetailiSpindel.cpp" line="159"/> + <location filename="../src/DetailiSpindel.cpp" line="180"/> <source>Offline</source> <translation type="unfinished"></translation> </message> @@ -10359,49 +10359,49 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>Unit</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>Node</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>Status</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>Beer</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>Temperature</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>SG</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> - <location filename="../src/MoniSpindels.cpp" line="145"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> + <location filename="../src/MoniSpindels.cpp" line="167"/> <source>Details</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> - <location filename="../src/MoniSpindels.cpp" line="133"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> + <location filename="../src/MoniSpindels.cpp" line="155"/> <source>Cal</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="154"/> + <location filename="../src/MoniSpindels.cpp" line="176"/> <source>Total items: %1</source> <translation type="unfinished"></translation> </message>
--- a/translations/bmsapp_nl.ts Fri Jun 14 08:45:35 2024 +0200 +++ b/translations/bmsapp_nl.ts Sat Jun 22 11:28:14 2024 +0200 @@ -359,7 +359,7 @@ <context> <name>ChartiSpindel</name> <message> - <location filename="../src/ChartiSpindel.cpp" line="34"/> + <location filename="../src/ChartiSpindel.cpp" line="35"/> <source>BMSapp - iSpindel </source> <translation>BMSapp - iSpindel </translation> </message> @@ -368,76 +368,76 @@ <translation type="vanished">Temp °C</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="39"/> + <location filename="../src/ChartiSpindel.cpp" line="40"/> <source>Save</source> <translation>Bewaar</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="88"/> + <location filename="../src/ChartiSpindel.cpp" line="122"/> <source>Temperature</source> <translation>Temperatuur</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="90"/> + <location filename="../src/ChartiSpindel.cpp" line="124"/> <source>SG</source> <translation>SG</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="94"/> + <location filename="../src/ChartiSpindel.cpp" line="128"/> <source>Battery</source> <translation>Batterij</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="106"/> + <location filename="../src/ChartiSpindel.cpp" line="140"/> <source>Date</source> <translation>Datum</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="117"/> + <location filename="../src/ChartiSpindel.cpp" line="151"/> <source>Temperature °C</source> <translation>Temperatuur °C</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="135"/> + <location filename="../src/ChartiSpindel.cpp" line="169"/> <source>Battery volt</source> <translation>Batterij volt</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="177"/> + <location filename="../src/ChartiSpindel.cpp" line="211"/> <source>Save Image</source> <translation>Opslaan plaatje</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="177"/> + <location filename="../src/ChartiSpindel.cpp" line="211"/> <source>Image (*.png)</source> <translation>Plaatje (*.png)</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="179"/> + <location filename="../src/ChartiSpindel.cpp" line="213"/> <source>Save File</source> <translation>Bestand opslaan</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="179"/> + <location filename="../src/ChartiSpindel.cpp" line="213"/> <source>No image file selected.</source> <translation>Geen plaatjes bestand gekozen.</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="209"/> + <location filename="../src/ChartiSpindel.cpp" line="243"/> <source>%1 Temperature %2°C</source> <translation>%1 Temperatuur %2°C</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="211"/> + <location filename="../src/ChartiSpindel.cpp" line="245"/> <source>%1 Density %2 SG</source> <translation>%1 Dichtheid %2 SG</translation> </message> <message> - <location filename="../src/ChartiSpindel.cpp" line="220"/> + <location filename="../src/ChartiSpindel.cpp" line="254"/> <source>%1 Battery %2 volt Capacity %3%</source> @@ -1257,12 +1257,12 @@ <translation>BMSapp - Detail iSpindel</translation> </message> <message> - <location filename="../src/DetailiSpindel.cpp" line="92"/> + <location filename="../src/DetailiSpindel.cpp" line="98"/> <source>Online</source> <translation>Online</translation> </message> <message> - <location filename="../src/DetailiSpindel.cpp" line="159"/> + <location filename="../src/DetailiSpindel.cpp" line="180"/> <source>Offline</source> <translation>Offline</translation> </message> @@ -11559,49 +11559,49 @@ <translation>Terug</translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>Unit</source> <translation>Eenheid</translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>Node</source> <translation>Systeem</translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>Status</source> <translation>Status</translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>Beer</source> <translation>Bier</translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>Temperature</source> <translation>Temperatuur</translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> <source>SG</source> <translation>SG</translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> - <location filename="../src/MoniSpindels.cpp" line="145"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> + <location filename="../src/MoniSpindels.cpp" line="167"/> <source>Details</source> <translation>Details</translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="79"/> - <location filename="../src/MoniSpindels.cpp" line="133"/> + <location filename="../src/MoniSpindels.cpp" line="80"/> + <location filename="../src/MoniSpindels.cpp" line="155"/> <source>Cal</source> <translation>Cal</translation> </message> <message> - <location filename="../src/MoniSpindels.cpp" line="154"/> + <location filename="../src/MoniSpindels.cpp" line="176"/> <source>Total items: %1</source> <translation>Totaal items: %1</translation> </message>