# HG changeset patch # User Michiel Broek # Date 1717854870 -7200 # Node ID 84091b9cb800c03fc17a7271718b4d3eb57b817a # Parent 3b9abdae181e98d603d88186e0fa1d405e1479e9 Version 0.4.6a1. Added HLT equipment volume and deadspace settings. In EditProduct the target water selection is now sticky. Changed the water treatment tab. Added a row wich displays the salt adjustments. This can be selected between actual and target values. The treated water show can select between mash or sparge water. The total line will become the final water in the boil kettle. Database update function is expanded with the new settings. Added a popup message warning that the database is upgraded and user action is required for the equipment profiles. diff -r 3b9abdae181e -r 84091b9cb800 CMakeLists.txt --- a/CMakeLists.txt Sat Jun 01 21:10:54 2024 +0200 +++ b/CMakeLists.txt Sat Jun 08 15:54:30 2024 +0200 @@ -9,7 +9,7 @@ SET( bmsapp_VERSION_MAJOR 0 ) SET( bmsapp_VERSION_MINOR 4 ) -SET( bmsapp_VERSION_PATCH 5 ) +SET( bmsapp_VERSION_PATCH 6a1 ) # Compile flags diff -r 3b9abdae181e -r 84091b9cb800 src/EditEquipment.cpp --- a/src/EditEquipment.cpp Sat Jun 01 21:10:54 2024 +0200 +++ b/src/EditEquipment.cpp Sat Jun 08 15:54:30 2024 +0200 @@ -67,6 +67,8 @@ ui->chiller_lossEdit->setValue(query.value("chiller_loss").toDouble()); ui->chiller_volumeEdit->setValue(query.value("chiller_volume").toDouble()); ui->chiller_lpmEdit->setValue(query.value("chiller_lpm").toDouble()); + ui->HLT_volumeEdit->setValue(query.value("HLT_volume").toDouble()); + ui->HLT_deadspaceEdit->setValue(query.value("HLT_deadspace").toDouble()); /* * Now we have loaded this record, check if this equipment is * being used by a product. If so, make the name field read-only. @@ -101,6 +103,8 @@ ui->chiller_lossEdit->setValue(0); ui->chiller_volumeEdit->setValue(0.5); ui->chiller_lpmEdit->setValue(0); + ui->HLT_volumeEdit->setValue(20); + ui->HLT_deadspaceEdit->setValue(2); inuse = 0; } /* Block select no chiller used */ @@ -131,6 +135,8 @@ connect(ui->chiller_volumeEdit, &QDoubleSpinBox::textChanged, this, &EditEquipment::is_changed); connect(ui->chiller_lpmEdit, &QDoubleSpinBox::textChanged, this, &EditEquipment::is_changed); connect(ui->chiller_lossEdit, &QDoubleSpinBox::textChanged, this, &EditEquipment::is_changed); + connect(ui->HLT_volumeEdit, &QDoubleSpinBox::textChanged, this, &EditEquipment::is_changed); + connect(ui->HLT_deadspaceEdit, &QDoubleSpinBox::textChanged, this, &EditEquipment::is_changed); calcBatchVolume(); ui->saveButton->setEnabled(false); @@ -190,7 +196,8 @@ "notes=:notes, lauter_deadspace=:lauter_deadspace, kettle_volume=:kettle_volume, " "kettle_height=:kettle_height, mash_volume=:mash_volume, mash_max=:mash_max, " "efficiency=:efficiency, chiller_type=:chiller_type, chiller_to79=:chiller_to79, " - "chiller_volume=:chiller_volume, chiller_lpm=:chiller_lpm, chiller_loss=:chiller_loss"); + "chiller_volume=:chiller_volume, chiller_lpm=:chiller_lpm, chiller_loss=:chiller_loss, " + "HLT_volume=:HLT_volume, HLT_deadspace=:HLT_deadspace"); if (this->recno == -1) { sql.append(", uuid=:uuid"); } else { @@ -222,6 +229,8 @@ query.bindValue(":chiller_volume", QString("%1").arg(ui->chiller_volumeEdit->value(), 3, 'f', 2, '0')); query.bindValue(":chiller_lpm", QString("%1").arg(ui->chiller_lpmEdit->value(), 3, 'f', 2, '0')); query.bindValue(":chiller_loss", QString("%1").arg(ui->chiller_lossEdit->value(), 3, 'f', 2, '0')); + query.bindValue(":HLT_volume", QString("%1").arg(ui->HLT_volumeEdit->value(), 2, 'f', 1, '0')); + query.bindValue(":HLT_deadspace", QString("%1").arg(ui->HLT_deadspaceEdit->value(), 2, 'f', 1, '0')); if (this->recno == -1) { query.bindValue(":uuid", QUuid::createUuid().toString().mid(1, 36)); @@ -259,7 +268,8 @@ "notes=:notes, lauter_deadspace=:lauter_deadspace, kettle_volume=:kettle_volume, " "kettle_height=:kettle_height, mash_volume=:mash_volume, mash_max=:mash_max, " "efficiency=:efficiency, chiller_type=:chiller_type, chiller_to79=:chiller_to79, " - "chiller_volume=:chiller_volume, chiller_lpm=:chiller_lpm, chiller_loss=:chiller_loss, uuid=:uuid"); + "chiller_volume=:chiller_volume, chiller_lpm=:chiller_lpm, chiller_loss=:chiller_loss, " + "HLT_volume=:HLT_volume, HLT_deadspace=:HLT_deadspace, uuid=:uuid"); query.bindValue(":name", ui->nameEdit->text() + " [copy]"); query.bindValue(":boil_size", QString("%1").arg(ui->boil_sizeEdit->value(), 2, 'f', 1, '0')); @@ -287,6 +297,8 @@ query.bindValue(":chiller_volume", QString("%1").arg(ui->chiller_volumeEdit->value(), 3, 'f', 2, '0')); query.bindValue(":chiller_lpm", QString("%1").arg(ui->chiller_lpmEdit->value(), 3, 'f', 2, '0')); query.bindValue(":chiller_loss", QString("%1").arg(ui->chiller_lossEdit->value(), 3, 'f', 2, '0')); + query.bindValue(":HLT_volume", QString("%1").arg(ui->HLT_volumeEdit->value(), 2, 'f', 1, '0')); + query.bindValue(":HLT_deadspace", QString("%1").arg(ui->HLT_deadspaceEdit->value(), 2, 'f', 1, '0')); query.exec(); if (query.lastError().isValid()) { qWarning() << "EditEquipment" << query.lastError(); diff -r 3b9abdae181e -r 84091b9cb800 src/EditProduct.cpp --- a/src/EditProduct.cpp Sat Jun 01 21:10:54 2024 +0200 +++ b/src/EditProduct.cpp Sat Jun 08 15:54:30 2024 +0200 @@ -70,9 +70,9 @@ query.prepare("SELECT name FROM profile_water ORDER BY name"); query.exec(); - ui->wt_sourceEdit->addItem(""); + ui->tw_nameEdit->addItem(""); while (query.next()) { - ui->wt_sourceEdit->addItem(query.value(0).toString()); + ui->tw_nameEdit->addItem(query.value(0).toString()); } query.prepare("SELECT name FROM profile_mash ORDER BY name"); @@ -466,6 +466,41 @@ ui->w2_clEdit->setValue(product->w2_chloride); ui->w2_so4Edit->setValue(product->w2_sulfate); ui->w2_phEdit->setValue(product->w2_ph); + + qDebug() << "water target" << product->tw_name; + if (product->tw_name != "") { + query.prepare("SELECT * FROM profile_water WHERE name=:water"); + query.bindValue(":water", product->tw_name); + query.exec(); + if (query.first()) { + ui->tw_nameEdit->setPlaceholderText(QString("["+product->tw_name+"]")); + product->tw_calcium = query.value("calcium").toDouble(); + product->tw_magnesium = query.value("magnesium").toDouble(); + product->tw_total_alkalinity = query.value("total_alkalinity").toDouble(); + product->tw_sodium = query.value("sodium").toDouble(); + product->tw_chloride = query.value("chloride").toDouble(); + product->tw_sulfate = query.value("sulfate").toDouble(); + product->tw_ph = query.value("ph").toDouble(); + ui->tw_hco3Edit->setValue(Utils::Bicarbonate(product->tw_total_alkalinity, product->tw_ph)); + ui->tw_hardnessEdit->setValue(Utils::Hardness(product->tw_calcium, product->tw_magnesium)); + ui->tw_raEdit->setValue(Utils::ResidualAlkalinity(product->tw_total_alkalinity, product->tw_calcium, product->tw_magnesium)); + } else { + product->tw_calcium = product->tw_magnesium = product->tw_total_alkalinity = 0; + product->tw_sodium = product->tw_chloride = product->tw_sulfate = 0; + product->tw_ph = 7; + ui->tw_hco3Edit->setValue(0); + ui->tw_hardnessEdit->setValue(0); + ui->tw_raEdit->setValue(0); + } + } + ui->tw_caEdit->setValue(product->tw_calcium); + ui->tw_mgEdit->setValue(product->tw_magnesium); + ui->tw_caco3Edit->setValue(product->tw_total_alkalinity); + ui->tw_naEdit->setValue(product->tw_sodium); + ui->tw_clEdit->setValue(product->tw_chloride); + ui->tw_so4Edit->setValue(product->tw_sulfate); + ui->tw_phEdit->setValue(product->tw_ph); + ui->mw_autoEdit->setChecked(product->calc_acid); ui->mw_phEdit->setReadOnly(! product->calc_acid); ui->mw_phEdit->setButtonSymbols(product->calc_acid ? QAbstractSpinBox::UpDownArrows : QAbstractSpinBox::NoButtons); @@ -481,6 +516,80 @@ ui->sp_acidpercEdit->setValue(product->sparge_acid_perc); check_waters(); + /* + * At this point, see if we must upgrade the whole water part. + * Old is separated brew and sparge water. + * New is total water and divide into brew/sparge/spare water. + * Calculate brewing salts on the total. + */ + if (product->sparge_source != 2) { + qDebug() << "== Water settings upgrade =="; + qDebug() << " w1" << product->w1_amount << "w2" << product->w2_amount << "wg" << product->wg_amount << "sp" << product->sparge_volume << "se" << product->brew_sparge_est; + qDebug() << " HLT " << product->eq_HLT_volume << " deadspace" << product->eq_HLT_deadspace; + double infused = 0; + for (int i = 0; i < product->mashs.size(); i++) { + if (product->mashs.at(i).step_type == 0) { // Infusion + infused += product->mashs.at(i).step_infuse_amount; + } + } + qDebug() << " mash infusion" << infused; +/* + double bs_cacl2 = 0, ss_cacl2 = 0; + double bs_caso4 = 0, ss_caso4 = 0; + double bs_mgso4 = 0, ss_mgso4 = 0; + double bs_nacl = 0, ss_nacl = 0; + double bs_mgcl2 = 0, ss_mgcl2 = 0; + double bs_nahco3 = 0; + double bs_caco3 = 0; + + for (int i = 0; i < product->miscs.size(); i++) { + if (product->miscs.at(i).type == MISC_TYPES_WATER_AGENT && product->miscs.at(i).use_use == MISC_USES_MASH) { + if (product->miscs.at(i).name == "CaCl2") { + bs_cacl2 = product->miscs.at(i).amount; + } else if (product->miscs.at(i).name == "CaSO4") { + bs_caso4 = product->miscs.at(i).amount; + } else if (product->miscs.at(i).name == "MgSO4") { + bs_mgso4 = product->miscs.at(i).amount; + } else if (product->miscs.at(i).name == "NaCl") { + bs_nacl = product->miscs.at(i).amount; + } else if (product->miscs.at(i).name == "MgCl2") { + bs_mgcl2 = product->miscs.at(i).amount; + } else if (product->miscs.at(i).name == "NaHCO3") { + bs_nahco3 = product->miscs.at(i).amount; + } else if (product->miscs.at(i).name == "CaCO3") { + bs_caco3 = product->miscs.at(i).amount; + } + } else if (product->miscs.at(i).type == MISC_TYPES_WATER_AGENT && product->miscs.at(i).use_use == MISC_USES_SPARGE) { + if (product->miscs.at(i).name == "CaCl2") { + ss_cacl2 = product->miscs.at(i).amount; + } else if (product->miscs.at(i).name == "CaSO4") { + ss_caso4 = product->miscs.at(i).amount; + } else if (product->miscs.at(i).name == "MgSO4") { + ss_mgso4 = product->miscs.at(i).amount; + } else if (product->miscs.at(i).name == "NaCl") { + ss_nacl = product->miscs.at(i).amount; + } else if (product->miscs.at(i).name == "MgCl2") { + ss_mgcl2 = product->miscs.at(i).amount; + } + } + } + if ((bs_cacl2 + ss_cacl2) > 0) + qDebug() << " CaCl2" << bs_cacl2 << ss_cacl2; + if ((bs_caso4 + ss_caso4) > 0) + qDebug() << " CaSO4" << bs_caso4 << ss_caso4; + if ((bs_mgso4 + ss_mgso4) > 0) + qDebug() << " MgSO4" << bs_mgso4 << ss_mgso4; + if ((bs_nacl + ss_nacl) > 0) + qDebug() << " NaCl" << bs_nacl << ss_nacl; + if ((bs_mgcl2 + ss_mgcl2) > 0) + qDebug() << " MgCl2" << bs_mgcl2 << ss_mgcl2; + if (bs_nahco3 > 0) + qDebug() << " NaHCO3" << bs_nahco3; + if (bs_caco3 > 0) + qDebug() << " CaCO3" << bs_caco3; +*/ + } + // Tab brewday. updateBrewday(); ui->brew_mashphEdit->setValue(product->brew_mash_ph); @@ -655,7 +764,7 @@ connect(ui->mw_phEdit, QOverload::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::mw_ph_changed); connect(ui->mw_acidvolEdit, QOverload::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::mw_acid_changed); connect(ui->mw_acidPick, QOverload::of(&QComboBox::currentIndexChanged), this, &EditProduct::mw_type_changed); - connect(ui->wt_sourceEdit, QOverload::of(&QComboBox::currentIndexChanged), this, &EditProduct::wt_target_changed); + connect(ui->tw_nameEdit, QOverload::of(&QComboBox::currentIndexChanged), this, &EditProduct::wt_target_changed); connect(ui->w1_nameEdit, QOverload::of(&QComboBox::currentIndexChanged), this, &EditProduct::w1_name_changed); connect(ui->w2_nameEdit, QOverload::of(&QComboBox::currentIndexChanged), this, &EditProduct::w2_name_changed); connect(ui->w2_volEdit, QOverload::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::w2_volume_changed); @@ -664,6 +773,8 @@ connect(ui->sp_acidtypeEdit, QOverload::of(&QComboBox::currentIndexChanged), this, &EditProduct::sp_type_changed); connect(ui->sp_phEdit, QOverload::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::sp_ph_changed); connect(ui->sp_acidvolEdit, QOverload::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::sp_acid_changed); + connect(ui->waterAdjust, &QPushButton::toggled, this, &EditProduct::waterAdjust_Show); + connect(ui->wx_Select, &QPushButton::toggled, this, &EditProduct::waterTreated_Show); /* All signals from tab Brewday */ calcEfficiencyBeforeBoil(); diff -r 3b9abdae181e -r 84091b9cb800 src/EditProduct.h --- a/src/EditProduct.h Sat Jun 01 21:10:54 2024 +0200 +++ b/src/EditProduct.h Sat Jun 08 15:54:30 2024 +0200 @@ -157,6 +157,8 @@ void sp_type_changed(int val); void sp_ph_changed(double val); void sp_acid_changed(double val); + void waterAdjust_Show(bool val); + void waterTreated_Show(bool val); void step_name_changed(QString val); void step_type_changed(int val); void step_temp_changed(double val); diff -r 3b9abdae181e -r 84091b9cb800 src/EditProductTab1.cpp --- a/src/EditProductTab1.cpp Sat Jun 01 21:10:54 2024 +0200 +++ b/src/EditProductTab1.cpp Sat Jun 08 15:54:30 2024 +0200 @@ -324,7 +324,7 @@ ui->mash_pickEdit->setDisabled(stage > PROD_STAGE_BREW); /* Tab 8, water */ - ui->wt_sourceEdit->setDisabled(stage > PROD_STAGE_BREW); + ui->tw_nameEdit->setDisabled(stage > PROD_STAGE_BREW); ui->w1_nameEdit->setDisabled(stage > PROD_STAGE_BREW); ui->w2_nameEdit->setDisabled(stage > PROD_STAGE_BREW); ui->mw_acidPick->setDisabled(stage > PROD_STAGE_BREW); diff -r 3b9abdae181e -r 84091b9cb800 src/EditProductTab2.cpp --- a/src/EditProductTab2.cpp Sat Jun 01 21:10:54 2024 +0200 +++ b/src/EditProductTab2.cpp Sat Jun 08 15:54:30 2024 +0200 @@ -28,10 +28,9 @@ ui->tun_materialEdit->setText(QCoreApplication::translate("TunMaterial", g_tun_materials[product->eq_tun_material])); ui->mash_volumeEdit->setValue(product->eq_mash_volume); ui->mash_maxEdit->setValue(product->eq_mash_max); - - /* Lautering */ ui->lauter_deadspaceEdit->setValue(product->eq_lauter_deadspace); - ui->eq_efficiencyEdit->setValue(product->eq_efficiency); + ui->HLT_volumeEdit->setValue(product->eq_HLT_volume); + ui->HLT_deadspaceEdit->setValue(product->eq_HLT_deadspace); /* Boiling */ ui->kettle_volumeEdit->setValue(product->eq_kettle_volume); @@ -53,6 +52,7 @@ /* Transfer */ ui->topup_waterEdit->setValue(product->eq_top_up_water); ui->vol_fermenterEdit->setValue((product->eq_batch_size / 1.04) - product->eq_trub_loss - product->eq_chiller_loss); + ui->eq_efficiencyEdit->setValue(product->eq_efficiency); } @@ -114,6 +114,8 @@ product->eq_chiller_volume = query.value("chiller_volume").toDouble(); product->eq_chiller_lpm = query.value("chiller_lpm").toDouble(); product->eq_chiller_loss = query.value("chiller_loss").toDouble(); + product->eq_HLT_volume = query.value("HLT_volume").toDouble(); + product->eq_HLT_deadspace = query.value("HLT_deadspace").toDouble(); showEquipment(); /* diff -r 3b9abdae181e -r 84091b9cb800 src/EditProductTab8.cpp --- a/src/EditProductTab8.cpp Sat Jun 01 21:10:54 2024 +0200 +++ b/src/EditProductTab8.cpp Sat Jun 08 15:54:30 2024 +0200 @@ -146,13 +146,13 @@ void EditProduct::setButtons(bool locked) { if (locked) { - /* - * If the brew is done, disable the buttons and that's it. - */ - ui->w1_spButton->setDisabled(true); - ui->w2_spButton->setDisabled(true); - ui->wg_spButton->setDisabled(true); - return; + /* + * If the brew is done, disable the buttons and that's it. + */ + ui->w1_spButton->setDisabled(true); + ui->w2_spButton->setDisabled(true); + ui->wg_spButton->setDisabled(true); + return; } ui->w1_spButton->setDisabled(false); @@ -161,13 +161,13 @@ const QSignalBlocker blocker3(ui->wg_spButton); if (product->w2_name != "") { - ui->w2_spButton->setDisabled(false); - if (product->w2_amount > 0.1 && product->w2_ph > 5) { + ui->w2_spButton->setDisabled(false); + if (product->w2_amount > 0.1 && product->w2_ph > 5) { /* * Water 2 is valid and used for mash, mixed is available. */ ui->wg_spButton->setDisabled(false); - } else { + } else { /* * No mixed water for mash. We can still sparge with source 2. */ @@ -179,16 +179,17 @@ product->sparge_source = 1; ui->w2_spButton->setChecked(true); } - } + } } else { ui->w2_spButton->setDisabled(true); ui->wg_spButton->setDisabled(true); product->sparge_source = 0; // Fallback to source 1 - ui->w1_spButton->setChecked(true); + ui->w1_spButton->setChecked(true); } } + void EditProduct::calcBU() { if (product->stage < PROD_STAGE_WAIT) @@ -303,6 +304,7 @@ /* Save mixed water ions for later */ double wg_calcium = calcium; + double wg_magnesium = magnesium; double wg_sodium = sodium; double wg_total_alkalinity = total_alkalinity; double wg_chloride = chloride; @@ -494,6 +496,31 @@ ui->wb_hco3Edit->setStyleSheet((bicarbonate > 250) ? "background-color: red":"background-color: green"); ui->wb_caco3Edit->setStyleSheet((bicarbonate > 250) ? "background-color: red":"background-color: green"); + /* Calculate Actual Adjustments */ + product->aa_calcium = calcium - product->wg_calcium; + product->aa_magnesium = magnesium - product->wg_magnesium; + product->aa_bicarbonate = bicarbonate - wg_bicarbonate; + product->aa_sodium = sodium - product->wg_sodium; + product->aa_chloride = chloride - product->wg_chloride; + product->aa_sulfate = sulfate - product->wg_sulfate; + product->aa_hardness = Utils::Hardness(calcium, magnesium) - Utils::Hardness(wg_calcium, wg_magnesium); + + if (product->tw_name != "") { + /* Calculate Target Adjustments */ + product->ta_calcium = product->tw_calcium - product->wg_calcium; + product->ta_magnesium = product->tw_magnesium - product->wg_magnesium; + product->ta_bicarbonate = Utils::Bicarbonate(product->tw_total_alkalinity, product->tw_ph) - wg_bicarbonate; + product->ta_sodium = product->tw_sodium - product->wg_sodium; + product->ta_chloride = product->tw_chloride - product->wg_chloride; + product->ta_sulfate = product->tw_sulfate - product->wg_sulfate; + product->ta_hardness = Utils::Hardness(product->tw_calcium, product->tw_magnesium) - Utils::Hardness(product->wg_calcium, product->wg_magnesium); + } else { + product->ta_calcium = product->ta_magnesium = product->ta_bicarbonate = product->ta_sodium = 0; + product->ta_chloride = product->ta_sulfate = product->ta_hardness = 0; + } + + waterTreated_Show(ui->wx_Select->isChecked()); + waterAdjust_Show(false); calcSparge(); } @@ -545,17 +572,7 @@ ui->ss_mgcl2Edit->value() * MMCl / MMMgCl2 * 1000) / product->sparge_volume; } - /* Show the spargewater with salt additions. */ - ui->sp_caEdit->setValue(product->ws_calcium); - ui->sp_mgEdit->setValue(product->ws_magnesium); - ui->sp_hco3Edit->setValue(Utils::Bicarbonate(product->ws_total_alkalinity, Source_pH)); - ui->sp_caco3Edit->setValue(product->ws_total_alkalinity); - ui->sp_naEdit->setValue(product->ws_sodium); - ui->sp_clEdit->setValue(product->ws_chloride); - ui->sp_so4Edit->setValue(product->ws_sulfate); - ui->sp_phShow->setValue(product->sparge_ph); - ui->sp_hardnessEdit->setValue(Utils::Hardness(product->ws_calcium, product->ws_magnesium)); - ui->sp_raEdit->setValue(Utils::ResidualAlkalinity(product->ws_total_alkalinity, product->ws_calcium, product->ws_magnesium)); + waterTreated_Show(ui->wx_Select->isChecked()); int AT = product->sparge_acid_type; if (AT < 0 || AT >= my_acids.size()) { @@ -630,16 +647,110 @@ } + void EditProduct::sp_group_changed(int val) { if (val != product->sparge_source) { product->sparge_source = val; - calcSparge(); - is_changed(); + calcSparge(); + is_changed(); + } +} + + + +void EditProduct::waterAdjust_Show(bool val) +{ + if (val) { + ui->waterAdjust->setText(tr("Target Water Adjustment")); + ui->aa_caEdit->setValue(product->ta_calcium); + ui->aa_mgEdit->setValue(product->ta_magnesium); + ui->aa_hco3Edit->setValue(product->ta_bicarbonate); + ui->aa_naEdit->setValue(product->ta_sodium); + ui->aa_clEdit->setValue(product->ta_chloride); + ui->aa_so4Edit->setValue(product->ta_sulfate); + ui->aa_hardnessEdit->setValue(product->ta_hardness); + } else { + ui->waterAdjust->setText(tr("Actual Water Adjustment")); + ui->aa_caEdit->setValue(product->aa_calcium); + ui->aa_mgEdit->setValue(product->aa_magnesium); + ui->aa_hco3Edit->setValue(product->aa_bicarbonate); + ui->aa_naEdit->setValue(product->aa_sodium); + ui->aa_clEdit->setValue(product->aa_chloride); + ui->aa_so4Edit->setValue(product->aa_sulfate); + ui->aa_hardnessEdit->setValue(product->aa_hardness); } } + +void EditProduct::waterTreated_Show(bool val) +{ + double calcium, magnesium, total_alkalinity, sodium; + double chloride, sulfate, ph, volume, bicarbonate; + + qDebug() << " wx_Select->isChecked()" << ui->wx_Select->isChecked(); + + if (val) { + ui->wx_Select->setText(tr("Treated Sparge Water")); + calcium = product->ws_calcium; + magnesium = product->ws_magnesium; + total_alkalinity = product->ws_total_alkalinity; + sodium = product->ws_sodium; + chloride = product->ws_chloride; + sulfate = product->ws_sulfate; + ph = product->sparge_ph; + volume = product->sparge_volume; + } else { + ui->wx_Select->setText(tr("Treated Mash Water")); + calcium = product->wb_calcium; + magnesium = product->wb_magnesium; + total_alkalinity = product->wb_total_alkalinity; + sodium = product->wb_sodium; + chloride = product->wb_chloride; + sulfate = product->wb_sulfate; + ph = product->wb_ph; + volume = product->wg_amount; + } + + bicarbonate = Utils::Bicarbonate(total_alkalinity, ph); + ui->wx_caEdit->setValue(calcium); + ui->wx_mgEdit->setValue(magnesium); + ui->wx_hco3Edit->setValue(bicarbonate); + ui->wx_caco3Edit->setValue(total_alkalinity); + ui->wx_naEdit->setValue(sodium); + ui->wx_clEdit->setValue(chloride); + ui->wx_so4Edit->setValue(sulfate); + ui->wx_hardnessEdit->setValue(Utils::Hardness(calcium, magnesium)); + ui->wx_raEdit->setValue(Utils::ResidualAlkalinity(total_alkalinity, calcium, magnesium)); + ui->wx_phEdit->setValue(ph); + ui->wx_volEdit->setValue(volume); + + ui->wx_caEdit->setStyleSheet((calcium < 40 || calcium > 150) ? "background-color: red":"background-color: green"); + ui->wx_mgEdit->setStyleSheet((magnesium < 5 || magnesium > 40) ? "background-color: red":"background-color: green"); + ui->wx_naEdit->setStyleSheet((sodium > 150) ? "background-color: red":"background-color: green"); + + /* + * Both chloride and sulfate should be above 50 according to + * John Palmer. So the Cl/SO4 ratio calculation will work. + */ + ui->wx_clEdit->setStyleSheet((chloride <= 50 || chloride > 150) ? "background-color: red":"background-color: green"); + ui->wx_so4Edit->setStyleSheet((sulfate <= 50 || sulfate > 400) ? "background-color: red":"background-color: green"); + + /* + * (cloride + sulfate) > 500 is too high + */ + if ((chloride + sulfate) > 500) { + ui->wx_clEdit->setStyleSheet("background-color: red"); + ui->wx_so4Edit->setStyleSheet("background-color: red"); + } + ui->wx_phEdit->setStyleSheet((ph < 5.2 || ph > 5.6) ? "background-color: red":"background-color: green"); + ui->wx_hco3Edit->setStyleSheet((bicarbonate > 250) ? "background-color: red":"background-color: green"); + ui->wx_caco3Edit->setStyleSheet((bicarbonate > 250) ? "background-color: red":"background-color: green"); +} + + + void EditProduct::sp_volume_changed(double val) { if (! product->calc_acid) { @@ -798,7 +909,7 @@ const QSignalBlocker blocker1(ui->sp_phEdit); product->sparge_ph = round(TargetpH * 100) / 100; ui->sp_phEdit->setValue(product->sparge_ph); - ui->sp_phShow->setValue(product->sparge_ph); +// ui->sp_phShow->setValue(product->sparge_ph); QString w = my_acids[AT].name_en + ' ' + my_acids[AT].name_nl; set_brewing_salt(w, val, MISC_USES_SPARGE); @@ -825,9 +936,9 @@ double EditProduct::GetOptSO4Clratio() { - if (ui->wt_so4Edit->value() > 0 && ui->wt_clEdit->value()) { + if (ui->tw_so4Edit->value() > 0 && ui->tw_clEdit->value()) { /* If target water is selected .. */ - return (ui->wt_so4Edit->value() / ui->wt_clEdit->value()); + return (ui->tw_so4Edit->value() / ui->tw_clEdit->value()); } double BUGU = GetBUGU(); return (-1.2 * BUGU + 1.4); @@ -956,7 +1067,7 @@ qDebug() << "w2_amount too low"; } ui->w2_spButton->setEnabled(true); - ui->wg_spButton->setEnabled(true); + ui->wg_spButton->setEnabled(true); } } else { /* @@ -1081,15 +1192,17 @@ if (val == 0) { /* Clear values */ - ui->wt_caEdit->setValue(0); - ui->wt_mgEdit->setValue(0); - ui->wt_hco3Edit->setValue(0); - ui->wt_caco3Edit->setValue(0); - ui->wt_naEdit->setValue(0); - ui->wt_clEdit->setValue(0); - ui->wt_so4Edit->setValue(0); - ui->wt_hardnessEdit->setValue(0); - ui->wt_raEdit->setValue(0); + product->tw_name = ""; + product->tw_calcium = 0; + product->tw_sulfate = 0; + product->tw_chloride = 0; + product->tw_sodium = 0; + product->tw_magnesium = 0; + product->tw_total_alkalinity = 0; + product->tw_ph = 7; + ui->tw_hco3Edit->setValue(0); + ui->tw_hardnessEdit->setValue(0); + ui->tw_raEdit->setValue(0); } else { query.prepare("SELECT * FROM profile_water ORDER BY name"); query.exec(); @@ -1097,16 +1210,28 @@ for (int i = 0; i < (val - 1); i++) { query.next(); } - ui->wt_caEdit->setValue(query.value("calcium").toDouble()); - ui->wt_mgEdit->setValue(query.value("magnesium").toDouble()); - ui->wt_hco3Edit->setValue(query.value("bicarbonate").toDouble()); - ui->wt_caco3Edit->setValue(query.value("total_alkalinity").toDouble()); - ui->wt_naEdit->setValue(query.value("sodium").toDouble()); - ui->wt_clEdit->setValue(query.value("chloride").toDouble()); - ui->wt_so4Edit->setValue(query.value("sulfate").toDouble()); - ui->wt_hardnessEdit->setValue(Utils::Hardness(query.value("calcium").toDouble(), query.value("magnesium").toDouble())); - ui->wt_raEdit->setValue(Utils::ResidualAlkalinity(query.value("total_alkalinity").toDouble(), query.value("calcium").toDouble(), query.value("magnesium").toDouble())); + product->tw_name = query.value("name").toString(); + product->tw_calcium = query.value("calcium").toDouble(); + product->tw_sulfate = query.value("sulfate").toDouble(); + product->tw_chloride = query.value("chloride").toDouble(); + product->tw_sodium = query.value("sodium").toDouble(); + product->tw_magnesium = query.value("magnesium").toDouble(); + product->tw_total_alkalinity = query.value("total_alkalinity").toDouble(); + product->tw_ph = query.value("ph").toDouble(); + ui->tw_hco3Edit->setValue(query.value("bicarbonate").toDouble()); + ui->tw_hardnessEdit->setValue(Utils::Hardness(query.value("calcium").toDouble(), query.value("magnesium").toDouble())); + ui->tw_raEdit->setValue(Utils::ResidualAlkalinity(query.value("total_alkalinity").toDouble(), query.value("calcium").toDouble(), query.value("magnesium").toDouble())); } + + ui->tw_caEdit->setValue(product->tw_calcium); + ui->tw_mgEdit->setValue(product->tw_magnesium); + ui->tw_caco3Edit->setValue(product->tw_total_alkalinity); + ui->tw_naEdit->setValue(product->tw_sodium); + ui->tw_clEdit->setValue(product->tw_chloride); + ui->tw_so4Edit->setValue(product->tw_sulfate); + ui->tw_phEdit->setValue(product->tw_ph); + + is_changed(); calcWater(); } diff -r 3b9abdae181e -r 84091b9cb800 src/MainWindow.cpp --- a/src/MainWindow.cpp Sat Jun 01 21:10:54 2024 +0200 +++ b/src/MainWindow.cpp Sat Jun 08 15:54:30 2024 +0200 @@ -164,7 +164,8 @@ */ void MainWindow::updateDataBase() { - QSqlQuery query1, query2, query4; + QSqlQuery query, query2, query4; + QString sql; int count = 0; bool added_packs = false; @@ -174,7 +175,7 @@ * Version 0.4.0. * Make sure we have the inventory_yeastpack with initial records. */ - query1.exec("CREATE TABLE IF NOT EXISTS `inventory_yeastpack` (" + query.exec("CREATE TABLE IF NOT EXISTS `inventory_yeastpack` (" "`record` int(11) NOT NULL AUTO_INCREMENT," "`uuid` varchar(36) NOT NULL," "`laboratory` varchar(128) NOT NULL," @@ -192,25 +193,25 @@ "UNIQUE KEY `package` (`laboratory`,`form`,`package`)," "KEY `lab_form` (`laboratory`,`form`) USING BTREE" ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Yeast packages data'"); - if (query1.lastError().isValid()) { - qWarning() << " create inventory_yeastpack" << query1.lastError(); + if (query.lastError().isValid()) { + qWarning() << " create inventory_yeastpack" << query.lastError(); } else { - query1.exec("SELECT DISTINCT laboratory,form FROM inventory_yeasts"); - while (query1.next()) { + query.exec("SELECT DISTINCT laboratory,form FROM inventory_yeasts"); + while (query.next()) { query2.prepare("SELECT record FROM inventory_yeastpack WHERE laboratory=:laboratory AND form=:form"); - query2.bindValue(":laboratory", query1.value("laboratory").toString()); - query2.bindValue(":form", query1.value("form").toInt()); + query2.bindValue(":laboratory", query.value("laboratory").toString()); + query2.bindValue(":form", query.value("form").toInt()); query2.exec(); if (! query2.first()) { - qDebug() << " add yeastpack" << query1.value("laboratory").toString() << query1.value("form").toInt(); + qDebug() << " add yeastpack" << query.value("laboratory").toString() << query.value("form").toInt(); query4.prepare("INSERT INTO inventory_yeastpack SET uuid=:uuid, laboratory=:laboratory, " "form=:form, package=:package, viability=:viability, max=:max"); query4.bindValue(":uuid", QUuid::createUuid().toString().mid(1, 36)); - query4.bindValue(":laboratory", query1.value("laboratory").toString()); - query4.bindValue(":form", query1.value("form").toInt()); - query4.bindValue(":package", g_yeast_forms[query1.value("form").toInt()]); - switch (query1.value("form").toInt()) { + query4.bindValue(":laboratory", query.value("laboratory").toString()); + query4.bindValue(":form", query.value("form").toInt()); + query4.bindValue(":package", g_yeast_forms[query.value("form").toInt()]); + switch (query.value("form").toInt()) { case YEAST_FORMS_LIQUID: query4.bindValue(":viability", 0.80); query4.bindValue(":max", 97); break; @@ -234,6 +235,52 @@ } } + /* + * Version 0.4.6 + * Upgrade database extra columns for target water. + */ + query.exec("SHOW COLUMNS FROM `products` LIKE 'tw_name'"); + if (! query.first()) { + qWarning() << "updateDataBase: products with target water"; + sql = "ALTER TABLE `products` ADD `tw_name` VARCHAR(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL AFTER `calc_acid`, "; + sql.append("ADD `tw_calcium` FLOAT NOT NULL DEFAULT '0' AFTER `tw_name`, "); + sql.append("ADD `tw_sulfate` FLOAT NOT NULL DEFAULT '0' AFTER `tw_calcium`, "); + sql.append("ADD `tw_chloride` FLOAT NOT NULL DEFAULT '0' AFTER `tw_sulfate`, "); + sql.append("ADD `tw_sodium` FLOAT NOT NULL DEFAULT '0' AFTER `tw_chloride`, "); + sql.append("ADD `tw_magnesium` FLOAT NOT NULL DEFAULT '0' AFTER `tw_sodium`, "); + sql.append("ADD `tw_total_alkalinity` FLOAT NOT NULL DEFAULT '0' AFTER `tw_magnesium`, "); + sql.append("ADD `tw_ph` FLOAT NOT NULL DEFAULT '7' AFTER `tw_total_alkalinity`, "); + sql.append("ADD `eq_HLT_volume` FLOAT NOT NULL DEFAULT '20' AFTER `eq_chiller_loss`, "); + sql.append("ADD `eq_HLT_deadspace` FLOAT NOT NULL DEFAULT '2' AFTER `eq_HLT_volume`;"); +// qDebug() << sql; + query.exec(sql); + if (query.lastError().isValid()) { + qWarning() << " ALTER products" << query.lastError(); + } else { + count++; + } + } + + /* + * Version 0.4.6 + * Add HLT fields to equipments + */ + query.exec("SHOW COLUMNS FROM `inventory_equipments` LIKE 'HLT_volume'"); + if (! query.first()) { + qWarning() << "updateDataBase: inventory_equipments with HLT"; + sql = "ALTER TABLE `inventory_equipments` ADD `HLT_volume` FLOAT NOT NULL DEFAULT '20' AFTER `chiller_lpm`, "; + sql.append("ADD `HLT_deadspace` FLOAT NOT NULL DEFAULT '2' AFTER `HLT_volume`;"); +// qDebug() << sql; + query.exec(sql); + if (query.lastError().isValid()) { + qWarning() << " ALTER inventory_equipments" << query.lastError(); + } else { + count++; + QMessageBox::information(this, tr("Equipments upgrade"), + tr("The Equipents database has two new HLT fields.\nPlease check the Inventory->Equipents records")); + } + } + qDebug() << "updateDatabase()" << count << "updates"; } diff -r 3b9abdae181e -r 84091b9cb800 src/database/db_product.cpp --- a/src/database/db_product.cpp Sat Jun 01 21:10:54 2024 +0200 +++ b/src/database/db_product.cpp Sat Jun 08 15:54:30 2024 +0200 @@ -23,31 +23,6 @@ { QSqlQuery query, yquery; - /* - * Upgrade database extra columns for target water. - */ - query.exec("SHOW COLUMNS FROM `products` LIKE 'tw_name'"); - if (! query.first()) { - qWarning() << "loadProduct upgrade for target water"; - QString sql = "ALTER TABLE `products` ADD `tw_name` VARCHAR(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL AFTER `calc_acid`, "; - sql.append("ADD `tw_calcium` FLOAT NOT NULL DEFAULT '0' AFTER `tw_name`, "); - sql.append("ADD `tw_sulfate` FLOAT NOT NULL DEFAULT '0' AFTER `tw_calcium`, "); - sql.append("ADD `tw_chloride` FLOAT NOT NULL DEFAULT '0' AFTER `tw_sulfate`, "); - sql.append("ADD `tw_sodium` FLOAT NOT NULL DEFAULT '0' AFTER `tw_chloride`, "); - sql.append("ADD `tw_magnesium` FLOAT NOT NULL DEFAULT '0' AFTER `tw_sodium`, "); - sql.append("ADD `tw_total_alkalinity` FLOAT NOT NULL DEFAULT '0' AFTER `tw_magnesium`;"); -// qDebug() << sql; - query.exec(sql); - if (query.lastError().isValid()) { - qWarning() << "loadProduct upgrade" << query.lastError(); - QMessageBox::warning(dialog, QObject::tr("Database error"), - QObject::tr("MySQL error: %1\n%2\n%3") - .arg(query.lastError().nativeErrorCode()) - .arg(query.lastError().driverText()) - .arg(query.lastError().databaseText())); - } - } - query.prepare("SELECT * FROM products WHERE record = :recno"); query.bindValue(":recno", recno); query.exec(); @@ -101,6 +76,8 @@ prod->eq_chiller_volume = query.value("eq_chiller_volume").toDouble(); prod->eq_chiller_lpm = query.value("eq_chiller_lpm").toDouble(); prod->eq_chiller_loss = query.value("eq_chiller_loss").toDouble(); + prod->eq_HLT_volume = query.value("eq_HLT_volume").toDouble(); + prod->eq_HLT_deadspace = query.value("eq_HLT_deadspace").toDouble(); prod->brew_date_start = query.value("brew_date_start").toDateTime(); prod->brew_mash_ph = query.value("brew_mash_ph").toDouble(); @@ -263,6 +240,14 @@ prod->wb_magnesium = query.value("wb_magnesium").toDouble(); prod->wb_total_alkalinity = query.value("wb_total_alkalinity").toDouble(); prod->wb_ph = query.value("wb_ph").toDouble(); + prod->tw_name = query.value("tw_name").toString(); + prod->tw_calcium = query.value("tw_calcium").toDouble(); + prod->tw_sulfate = query.value("tw_sulfate").toDouble(); + prod->tw_chloride = query.value("tw_chloride").toDouble(); + prod->tw_sodium = query.value("tw_sodium").toDouble(); + prod->tw_magnesium = query.value("tw_magnesium").toDouble(); + prod->tw_total_alkalinity = query.value("tw_total_alkalinity").toDouble(); + prod->tw_ph = query.value("tw_ph").toDouble(); prod->wa_acid_name = query.value("wa_acid_name").toInt(); prod->wa_acid_perc = query.value("wa_acid_perc").toDouble(); prod->wa_base_name = query.value("wa_base_name").toInt(); @@ -615,6 +600,7 @@ "eq_kettle_height=:eq_kettle_height, eq_mash_volume=:eq_mash_volume, eq_mash_max=:eq_mash_max, " "eq_chiller_type=:eq_chiller_type, eq_chiller_to79=:eq_chiller_to79, eq_chiller_volume=:eq_chiller_volume, " "eq_chiller_lpm=:eq_chiller_lpm, eq_chiller_loss=:eq_chiller_loss, " + "eq_HLT_volume=:eq_HLT_volume, eq_HLT_deadspace=:eq_HLT_deadspace, " "brew_date_start=:brew_date_start, brew_mash_ph=:brew_mash_ph, brew_mash_sg=:brew_mash_sg, " "brew_mash_efficiency=:brew_mash_efficiency, brew_sparge_temperature=:brew_sparge_temperature, " "brew_sparge_volume=:brew_sparge_volume, brew_sparge_est=:brew_sparge_est, brew_sparge_ph=:brew_sparge_ph, " @@ -665,6 +651,8 @@ "wg_total_alkalinity=:wg_total_alkalinity, wg_ph=:wg_ph, " "wb_calcium=:wb_calcium, wb_sulfate=:wb_sulfate, wb_chloride=:wb_chloride, wb_sodium=:wb_sodium, " "wb_magnesium=:wb_magnesium, wb_total_alkalinity=:wb_total_alkalinity, wb_ph=:wb_ph, " + "tw_name=:tw_name, tw_calcium=:tw_calcium, tw_sulfate=:tw_sulfate, tw_chloride=:tw_chloride, " + "tw_sodium=:tw_sodium, tw_magnesium=:tw_magnesium, tw_total_alkalinity=:tw_total_alkalinity, tw_ph=:tw_ph, " "wa_acid_name=:wa_acid_name, wa_acid_perc=:wa_acid_perc, wa_base_name=:wa_base_name, " "starter_enable=:starter_enable, starter_type=:starter_type, starter_sg=:starter_sg, " "starter_viability=:starter_viability, yeast_prod_date=:yeast_prod_date, yeast_pitchrate=:yeast_pitchrate, " @@ -718,6 +706,8 @@ query.bindValue(":eq_chiller_volume", round(prod->eq_chiller_volume * 100) / 100); query.bindValue(":eq_chiller_lpm", round(prod->eq_chiller_lpm * 100) / 100); query.bindValue(":eq_chiller_loss", round(prod->eq_chiller_loss * 100) / 100); + query.bindValue(":eq_HLT_volume", round(prod->eq_HLT_volume * 10) / 10); + query.bindValue(":eq_HLT_deadspace", round(prod->eq_HLT_deadspace * 10) / 10); query.bindValue(":brew_date_start", prod->brew_date_start); query.bindValue(":brew_mash_ph", round(prod->brew_mash_ph * 100) / 100); query.bindValue(":brew_mash_sg", round(prod->brew_mash_sg * 1000) / 1000); @@ -870,6 +860,14 @@ query.bindValue(":wb_magnesium", round(prod->wb_magnesium * 100000) / 100000); query.bindValue(":wb_total_alkalinity", round(prod->wb_total_alkalinity * 100000) / 100000); query.bindValue(":wb_ph", round(prod->wb_ph * 100) / 100); + query.bindValue(":tw_name", prod->tw_name); + query.bindValue(":tw_calcium", round(prod->tw_calcium * 100000) / 100000); + query.bindValue(":tw_sulfate", round(prod->tw_sulfate * 100000) / 100000); + query.bindValue(":tw_chloride", round(prod->tw_chloride * 100000) / 100000); + query.bindValue(":tw_sodium", round(prod->tw_sodium * 100000) / 100000); + query.bindValue(":tw_magnesium", round(prod->tw_magnesium * 100000) / 100000); + query.bindValue(":tw_total_alkalinity", round(prod->tw_total_alkalinity * 100000) / 100000); + query.bindValue(":tw_ph", round(prod->tw_ph * 100) / 100); query.bindValue(":wa_acid_name", prod->wa_acid_name); query.bindValue(":wa_acid_perc", round(prod->wa_acid_perc * 10) / 10); query.bindValue(":wa_base_name", prod->wa_base_name); diff -r 3b9abdae181e -r 84091b9cb800 src/global.h --- a/src/global.h Sat Jun 01 21:10:54 2024 +0200 +++ b/src/global.h Sat Jun 08 15:54:30 2024 +0200 @@ -283,6 +283,8 @@ double mash_max; double efficiency; QString uuid; + double HLT_volume; + double HLT_deadspace; }; @@ -485,6 +487,8 @@ double eq_chiller_volume; double eq_chiller_lpm; double eq_chiller_loss; + double eq_HLT_volume; + double eq_HLT_deadspace; QDateTime brew_date_start; double brew_mash_ph; @@ -617,6 +621,7 @@ double tw_sodium; double tw_magnesium; double tw_total_alkalinity; + double tw_ph; QString w1_name; ///< Water source 1 double w1_amount; @@ -709,16 +714,30 @@ double keg_abv; double keg_bar; QList splits; ///< Used during building a split batch - double ws_calcium; ///< Sparge water calculated. - double ws_sulfate; - double ws_chloride; - double ws_sodium; - double ws_magnesium; - double ws_total_alkalinity; + double ws_calcium; ///< Sparge water calculated. + double ws_sulfate; + double ws_chloride; + double ws_sodium; + double ws_magnesium; + double ws_total_alkalinity; + double aa_calcium; ///< Actual adjustments + double aa_magnesium; + double aa_bicarbonate; + double aa_sodium; + double aa_chloride; + double aa_sulfate; + double aa_hardness; + double ta_calcium; ///< Target water adjustments + double ta_magnesium; + double ta_bicarbonate; + double ta_sodium; + double ta_chloride; + double ta_sulfate; + double ta_hardness; QList images_list; ///< List of loaded images. - int images_count; ///< -1 if not yet loaded. - int images_current; ///< -1 or image in focus. - bool images_dirty; + int images_count; ///< -1 if not yet loaded. + int images_current; ///< -1 or image in focus. + bool images_dirty; }; diff -r 3b9abdae181e -r 84091b9cb800 translations/bmsapp_en.ts --- a/translations/bmsapp_en.ts Sat Jun 01 21:10:54 2024 +0200 +++ b/translations/bmsapp_en.ts Sat Jun 08 15:54:30 2024 +0200 @@ -1198,16 +1198,18 @@ - - - - - - - - - - + + + + + + + + + + + + L @@ -1238,7 +1240,7 @@ - + cm @@ -1249,98 +1251,108 @@ - + Lauter deadspace: - + + HLT Volume: + + + + + HLT deadspace: + + + + Brewhouse efficiency: - + % - + Kettle volume: - + Kettle height: - + Boil size at 100 °C: - + Evaporation Liter/hour: - + Boil time: - + Top up kettle: - + Batch size at 100 °C: - - L/h - - - - + L/h + + + + + min - + Added extra water during boil - + Kettle trub loss: - + Extra water in fermenter: - + Volume in fermenter: - + Extra water to add to the fermenter - + Transfer loss: - + Immersion chiller: @@ -1360,135 +1372,130 @@ - - Lautering - - - - + Boiling - + Measured inside the kettle - + Trub loss to leave behind in the kettle - + Transfer - + Clone - + Chilling - + Wort chiller type: - + Minutes elapsed to cool to 79 °C - + Minutes to cool to 79 °C: - + Volume lost in hoses, pump ... - + Temporary extra volume of the immersion chiller in the kettle. Used to correct the after boil volume. - + Liters per minute to pump trough the chiller. Used to calculate the time needed to transfer the wort. - + L/m - + Transfer liters/minute: - + BMSapp - Add new equipment - + BMSapp - Edit equipment %1 - + Edit Equipment - + Name empty or too short. - - - + + + Database error - - - + + + MySQL error: %1 %2 %3 - + Delete equipment - + Delete %1 - + Equipment changed - + This equipment has been modified. Save changes? @@ -2483,14 +2490,14 @@ - + Save - + @@ -2535,26 +2542,26 @@ - - + + Efficiency: - + Boil time: - + Batch size: - + Boil size: @@ -2563,39 +2570,39 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + % - - - - - - - - + + + + + + + + min @@ -2604,40 +2611,44 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L @@ -2650,20 +2661,20 @@ - + Estimated ABV: - + Estimated FG: - - + + Estimated OG: @@ -2694,7 +2705,7 @@ - + Estimated IBU: @@ -2834,1462 +2845,1521 @@ - - Lautering - - - - + Lauter deadspace: - + Chilling - + Transfer loss: - + Immersion chiller: - + Transfer - + Volume in fermenter: - + Retry starter steps: - + Dry yeast calculation. - - - Total brew and sparge water supply - - - - - Total needed mixed water - - - - - Top up water: - - - - - Boiling - - - - - Brewhouse efficiency: - - - - - Liters per minute to pump trough the chiller. -Used to calculate the time needed to transfer the wort. - - - - - Transfer liters/minute: - - - - - Minutes elapsed to cool to 79 °C - - - - - Volume lost in hoses, pump ... - - - - - Wort chiller type: - - - - - Minutes to cool to 79 °C: - - - - - Temporary extra volume of the immersion chiller in the kettle. -Used to correct the after boil volume. - - - - - Kettle volume: - - - - - Evaporation / hour: - - - - - Top up kettle: - - - - - - Kettle trub loss: - - - - - Extra water in fermenter: - - - - - Fermentables - - - - - Color EBC: - - - - - Mash tun %: - - - - - Sugars %: - - - - - Cara/crystal %: - - - - - Lintner: - - - - - %v lintner - - - - - - - - - %v% - - - - - - - - - - - Add - - - - - kg - - - - - Mash weight: - - - - - Hops - - - - - Hop taste: - - - - - Hop aroma: - - - - - Boil absorb: - - - - - Loss by hop absorption in the boil kettle - - - - - Fermenter absorb: - - - - - Loss in the fermenter caused by dry-hopping - - - - - Miscs - - - - - Yeasts - - - - - Apparent Attenuation: - - - - - Pitchrate billion cells/ml/°P: - - - - - Starter method: - - - - - Starter SG: - - - - - - - - - - Set or clear date - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ... - - - - - Need billion cells: - - - - - Yeast starter calculation. - - - - - Low grams/hl: - - - - - High grams/hl: - - - - - - at - - - - - This recipe pitch grams/hl: - - - - - Pitchrate grams/hectoliter: - - - - - Yeast grams needed: - - - - - Production date: - - - - - Yeast condition: - - - - - - Set the date to today. - - - - - Edit the production date. - - - - - - - - - - - dd-MM-yyyy - - - - - Clear the date - - - - - - - Mash - - - - - Mash name: - - - - - Mash schedule: - - - - - Mash time: - - - - - Mash total volume: - - - - - Water - - - - - Water agents - - - - - Calcium Chloride - - - - - CaCl2: - - - - - Gypsym - - - - - CaSO4: - - - - - Epsom - - - - - MgSO4: - - - - - Table salt - - - - - NaCl: - - - - - - - Magnesium Chloride - - - - - MgCl2: - - - - - - Baking soda - - - - - NaHCO3: - - - - - - Chalk undissolved - - - - - CaCO3: - - - - - - To change the water profile. This adds Calcium and Chloride. -To improve sweet style beers. - - - - - - - - - - - - - - - - - - gr - - - - - - Gypsum to change the water profile. This adds Calcium and Sulfate. -To improve bitter beers. - - - - - - Epsom salt to change the water profile. Use with caution! - - - - - - Table salt to change the water profile. This adds Sodium and Chloride. -Improves the sweetness of the beer. The beer will become salty at high doses. - - - - - Acid Additions - - - - - Desired mash pH: - - - - - Auto calculate: - - - - - Acid to use: - - - - - - Mash pH should be between 5.2 and 5.6. Use 5.2 for light and 5.5 for dark beers. - - - - - - % - - - - - - ml - - - - - Desired sparge pH: - - - - - Acid type: - - - - - - Acid amount: - - - - - Bitterness index: - - - - - - N/A - - - - - Preffered SO4:Cl ratio: - - - - - Current SO4:Cl ratio: - - - - - Estimate pre boil pH: - - - - - The total prepared amount of sparge water - - - - - If needed, choose a target water profile. - - - - - Choose example water - - - - - 0 to 50 for light beers, 50 to 150 for amber beers, 150 to 250 for dark beers. + + + + + + Calcium in mg/L + + + + + + + + + Magnesium in mg/L. + + + + + + The ideal amount of Calcium is between 40 and 150 mg/L. - Treated mash water - - - - - The ideal amount of Natrium should be below 150. - - - - - The ideal Chloride amount is between 50 and 150. -Together with Sulfate it must be below 500. - - - - - The ideal amount of Calcium is between 40 and 150. + + The ideal amount of Magnesium is between 5 and 40 mg/L. + + + + + Total brew and sparge water supply - The ideal amount of Magnesium is between 5 and 40. - - - - + + + Total brew and sparge water supply. +In the mash tab set the infusion volumes. +The sparge volume is automatic calculated. + + + + + The division between the main and dilution water. +The total volume does not change. + + + + + Calcium content should typically fall in the range of 40 to 100 ppm. +Lower calcium content may not provide for the desirable +precipitation of trub and oxalates from wort. High oxalates may lead +to beerstone formation. +Calcium also aids in yeast floculation and beer clarification. + +Calcium should not typically exceed 100 ppm unless it has to be +added to provide a desirable anion like sulfate to the water. + + + + + Top up water: + + + + + Boiling + + + + + Brewhouse efficiency: + + + + + Liters per minute to pump trough the chiller. +Used to calculate the time needed to transfer the wort. + + + + + HLT Volume: + + + + + HLT deadspace: + + + + + Transfer liters/minute: + + + + + Minutes elapsed to cool to 79 °C + + + + + Volume lost in hoses, pump ... + + + + + Wort chiller type: + + + + + Minutes to cool to 79 °C: + + + + + Temporary extra volume of the immersion chiller in the kettle. +Used to correct the after boil volume. + + + + + Kettle volume: + + + + + Evaporation / hour: + + + + + Top up kettle: + + + + + + Kettle trub loss: + + + + + Extra water in fermenter: + + + + + Fermentables + + + + + Color EBC: + + + + + Mash tun %: + + + + + Sugars %: + + + + + Cara/crystal %: + + + + + Lintner: + + + + + %v lintner + + + + + + + + + %v% + + + + + + + + + + + Add + + + + + kg + + + + + Mash weight: + + + + + Hops + + + + + Hop taste: + + + + + Hop aroma: + + + + + Boil absorb: + + + + + Loss by hop absorption in the boil kettle + + + + + Fermenter absorb: + + + + + Loss in the fermenter caused by dry-hopping + + + + + Miscs + + + + + Yeasts + + + + + Apparent Attenuation: + + + + + Pitchrate billion cells/ml/°P: + + + + + Starter method: + + + + + Starter SG: + + + + + + + + + + Set or clear date + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... + + + + + Need billion cells: + + + + + Yeast starter calculation. + + + + + Low grams/hl: + + + + + High grams/hl: + + + + + + at + + + + + This recipe pitch grams/hl: + + + + + Pitchrate grams/hectoliter: + + + + + Yeast grams needed: + + + + + Production date: + + + + + Yeast condition: + + + + + + Set the date to today. + + + + + Edit the production date. + + + + + + + + + + + dd-MM-yyyy + + + + + Clear the date + + + + + + + Mash + + + + + Mash name: + + + + + Mash schedule: + + + + + Mash time: + + + + + Mash total volume: + + + + + Water + + + + + Water agents + + + + + Calcium Chloride + + + + + CaCl2: + + + + + Gypsym + + + + + CaSO4: + + + + + Epsom + + + + + MgSO4: + + + + + Table salt + + + + + NaCl: + + + + + + + Magnesium Chloride + + + + + MgCl2: + + + + + + Baking soda + + + + + NaHCO3: + + + + + + Chalk undissolved + + + + + CaCO3: + + + + + + To change the water profile. This adds Calcium and Chloride. +To improve sweet style beers. + + + + + + + + + + + + + + + + + + gr + + + + + + Gypsum to change the water profile. This adds Calcium and Sulfate. +To improve bitter beers. + + + + + + Epsom salt to change the water profile. Use with caution! + + + + + + Table salt to change the water profile. This adds Sodium and Chloride. +Improves the sweetness of the beer. The beer will become salty at high doses. + + + + + Acid Additions + + + + + Desired mash pH: + + + + + Auto calculate: + + + + + Acid to use: + + + + + Mash pH should be between 5.2 and 5.6. Use 5.2 for light and 5.5 for dark beers. + + + + + + % + + + + + + ml + + + + + Desired sparge pH: + + + + + Acid type: + + + + + + Acid amount: + + + + + Bitterness index: + + + + + + N/A + + + + + Preffered SO4:Cl ratio: + + + + + Current SO4:Cl ratio: + + + + + Estimate pre boil pH: + + + + + The total prepared amount of sparge water + + + + + If needed, choose a target water profile. + + + + + Choose example water + + + + + + 0 to 50 for light beers, 50 to 150 for amber beers, 150 to 250 for dark beers. + + + + + Treated total water + + + + + + The ideal amount of Natrium should be below 150. + + + + + + The ideal Chloride amount is between 50 and 150. +Together with Sulfate it must be below 500. + + + + + The ideal Sulfate amount should be between 50 and 400. Together with Chloride it must be below 500. - - The division between the main and dilution water. The total volume does not change. - - - - + Optional dilution water - + Choose dilution - + Hardness - + Mg - + pH - + RA - + Total brew and sparge water supply without optional dilution water - + CaCO3 - + The main brewing water - + Choose water - + Cl - + Na - + Ca - + SO4 - + Volume - + HCO3 - + Water profile - - Sparge water source 1 - - - - - Sparge water source 2 - - - - - Sparge water mixed - - - - + Sparge - - Treated sparge water - - - - + + + Actual Water Adjustment + + + + + Sparge volume: + + + + + + Switch between Actual and Target values + + + + + + Treated Mash Water + + + + + + + Sparge water source 1 + + + + Brewday - + Brewday plan: - + Brewday end: - + Mashing and Sparge - + Mash pH: - + Mash SG: - + Mash efficiency: - + Sparge water pH: - + Sparge supply: - + Sparge estimate: - + Sparge temp: - - - - - - - - - + + + + + + + + + °C - - Pre boil - - - - - - - Measured pH: - - - - - - - Measured SG: - - - - - - Volume @100°C: - - - - - Mash, sparge and lauter efficiency. - - - - - - - - Edit volume - - - - - Whirlpools - - - - - Whirlpool 72..79°C: - - - - - Whirlpool 60..66°C: - - - - - Whirlpool cold: - - - - - Whirlpool 85..100°C: - - - - - Transfer to fermenter - - - + Pre boil + + + + + + + Measured pH: + + + + + + + Measured SG: + + + + + + Volume @100°C: + + + + + Mash, sparge and lauter efficiency. + + + + + + + + Edit volume + + + + + Whirlpools + + + + + Whirlpool 72..79°C: + + + + + Whirlpool 60..66°C: + + + + + Whirlpool cold: + + + + + Whirlpool 85..100°C: + + + + + Transfer to fermenter + + + + Volume to fermenter: - + SG in fermenter: - + EBC color in fermenter: - + IBU in fermenter: - + Aeration time & speed: - + L/m - + Aeration with: - - - - + + + + Brew log chart - + Cooling - + Cooling method: - + Cooling to: - + Cooling time: - + After boil - + The overall efficiency. - + Edit the brewdate plan or start. - + Clear planned brewdate - + Edit the brewdate start time. - - + + hh:mm - + Edit the brewdate end. - + Edit the brewdate end time. - + Set the brewdate end date. - + End time: - + Start time: - + Show brewlog: - + Confirm brew done: - - - + + + Confirm the brew dates and times. - + Fermenting - + Primary fermentation - + Start density: - + Start temperature: - + Peak temperature: - - + + End temperature: - - + + End density: - - + + End date: - - - + + + Apparent attenuation: - - - + + + Edit SG in Plato, Brix or SG - - - Set the date to today - - - - - Edit the date the primary fermentation was done. - - - - - Secondary fermentation - - - - - Edit the date the secondary fermentation was done. - - - - - Tertiary fermentation - - - - - Average temperature: - - - - - Final density: - - - - - Expected end density: - - - + + Set the date to today + + + + + Edit the date the primary fermentation was done. + + + + + Secondary fermentation + + + + + Edit the date the secondary fermentation was done. + + + + + Tertiary fermentation + + + + + Average temperature: + + + + + Final density: + + + + + Expected end density: + + + + Alcohol volume: - + Show fermenter unit log: - + Show fermentation log: - + Package - + Package date: - + Carbonation range: - + Infusion or Dilution - + Package volume: - + Extra added volume: - + Extra remarks: - + Estimated final ABV %: - + Estimated final IBU: - + Estimated final EBC: - + Extra added ABV %: - + + Mixed source water + + + + pH from fermenter: - + Extra dilution or infusion added to this batch. - - + + The ABV including the infusion. - + If there is alcohol in the infusion, give the percentage. - + Could be the description of the infusion. - + Estimated package ABV %: - + Bottles - - + + Volume: - - + + Desired volume CO2: - - + + Priming sugar: - - + + Sugar amount: - - + + Priming: - - + + Water amount: - + Bottle fermentation: - - + + gr/L - + Expected pressure in bar: - + Bottles ABV %: - + Kegs - + Kegs ABV %: - + Kegs pressure in bar: - + Kegs temperature: - + Forced carbonation: - + Edit the package date. - + Show carbonation log: - + Tasting - + Taste date: - + Taste rate: - + Color: - + Transparency: - + Head: - + Aroma: - + Taste: - + Aftertaste: - + Mouthfeel: - + Notes: - + Edit the tasting date. - + Images - + Previous - + Next - + Filename: - + Comment: - + Type: - + Export - - + + Print @@ -4329,43 +4399,43 @@ - + BMSapp - Add new product - + BMSapp - Edit %1 - %2 - - + + Edit Product - + Name empty or too short. - + No beerstyle selected. - + Delete product - + Product changed - + The product has been modified. Save changes? @@ -4491,7 +4561,7 @@ - + Delete %1 @@ -5041,67 +5111,77 @@ - + Very malty and sweet - + Malty, sweet - - + + Balanced - + Hoppy, bitter - + Very hoppy, very bitter - - Too malty - - - - Very malty + Too malty + Very malty + + + + Malty - - Little bitter - - - - Bitter + Little bitter - Very bitter + Bitter + Very bitter + + + + Too bitter + + Target Water Adjustment + + + + + Treated Sparge Water + + + Confirm brew @@ -5430,7 +5510,7 @@ - + Image here @@ -5476,7 +5556,7 @@ - + Database error @@ -5486,7 +5566,7 @@ - + MySQL error: %1 %2 %3 @@ -10009,6 +10089,17 @@ Yeast Packages + + + Equipments upgrade + + + + + The Equipents database has two new HLT fields. +Please check the Inventory->Equipents records + + ManoMeter @@ -12494,25 +12585,23 @@ - - - - + + + Database error - + MySQL error: record %1 not found - - - + + MySQL error: %1 %2 %3 diff -r 3b9abdae181e -r 84091b9cb800 translations/bmsapp_nl.ts --- a/translations/bmsapp_nl.ts Sat Jun 01 21:10:54 2024 +0200 +++ b/translations/bmsapp_nl.ts Sat Jun 08 15:54:30 2024 +0200 @@ -1312,16 +1312,18 @@ - - - - - - - - - - + + + + + + + + + + + + L L @@ -1352,7 +1354,7 @@ - + cm cm @@ -1363,88 +1365,98 @@ Kg - + Lauter deadspace: Filterkuip dode ruimte: - + + HLT Volume: + + + + + HLT deadspace: + + + + Brewhouse efficiency: Brouwzaal rendement: - + % % - + Kettle volume: Kookketel volume: - + Kettle height: Kookketel hoogte: - + Boil size at 100 °C: Kook volume bij 100 °C: - + Evaporation Liter/hour: Verdamping Liter per uur: - + Boil time: Kooktijd: - + Top up kettle: Extra water bij koken: - + Batch size at 100 °C: Eind volume bij 100 °C: - - L/h - L/u - - - + L/h + L/u + + + + min min - + Added extra water during boil Toegevoegd extra water tijdens koken - + Kettle trub loss: Kookketel trub verlies: - + Trub loss to leave behind in the kettle Trub verlies wat achterblijft in de kookketel - + Transfer loss: Overbrengen verlies: - + Immersion chiller: Dompelkoeler: @@ -1492,16 +1504,15 @@ Maximum moutstort kg: - Lautering - Filteren + Filteren Kettle height cm: Kookketel hoogte cm: - + Measured inside the kettle Gemeten binnen in de ketel @@ -1518,42 +1529,42 @@ Kookketel trub verlies L: - + Transfer Overbrengen - + Extra water in fermenter: Extra water in gistvat: - + Volume in fermenter: Volume naar het gistvat: - + Extra water to add to the fermenter Extra water toevoegen in het gistvat - + Wort chiller type: Wort koeler type: - + Minutes elapsed to cool to 79 °C Nodige minuten om tot 79 °C te koelen - + Minutes to cool to 79 °C: Minuten koelen tot 79 °C: - + Volume lost in hoses, pump ... Verlies in slangen, pomp ... @@ -1566,26 +1577,26 @@ Dompelkoeler L: - + Temporary extra volume of the immersion chiller in the kettle. Used to correct the after boil volume. Tijdelijk extra volume in de kookketel. Wordt gebruikt als correctie voor na koken volume. - + Liters per minute to pump trough the chiller. Used to calculate the time needed to transfer the wort. Liters per minuut pompen door de koeler. Gebruikt om de tijd te berekenen om het wort weg te pompen. - + L/m L/m - + Transfer liters/minute: Overbrengen liters/minuut: @@ -1606,7 +1617,7 @@ Brouwzaal rendement %: - + Boiling Koken @@ -1647,7 +1658,7 @@ 100% voor kleine brouwerijen, hoger voor grote. - + Chilling Koelen @@ -1664,7 +1675,7 @@ Volume naar het gistvat L: - + Clone Kloon @@ -1685,36 +1696,36 @@ Koper - + BMSapp - Add new equipment BMSapp - Nieuwe apparatuur - + BMSapp - Edit equipment %1 BMSapp - Wijzig apparatuur %1 - + Edit Equipment Wijzig apparatuur - + Name empty or too short. De naam is leeg of te kort. - - - + + + Database error Database fout - - - + + + MySQL error: %1 %2 %3 @@ -1723,22 +1734,22 @@ %3 - + Delete equipment Verwijder apparatuur - + Delete %1 Verwijder %1 - + Equipment changed Apparatuur gewijzigd - + This equipment has been modified. Save changes? Deze installatie is gewijzigd. Wijzigingen opslaan? @@ -2820,14 +2831,14 @@ - + Save Bewaar - + @@ -2872,26 +2883,26 @@ - - + + Efficiency: Rendement: - + Boil time: Kooktijd: - + Batch size: Brouw volume: - + Boil size: Kook volume: @@ -2900,39 +2911,39 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + % % - - - - - - - - + + + + + + + + min min @@ -2941,40 +2952,44 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L @@ -2991,14 +3006,14 @@ - + Estimated FG: Verwacht eind SG: - - + + Estimated OG: Verwacht start SG: @@ -3012,7 +3027,7 @@ Koolzuur volumes: - + Color EBC: EBC kleur: @@ -3146,12 +3161,11 @@ Maischkuip materiaal: - Lautering - Filteren - - - + Filteren + + + Lauter deadspace: Filterkuip dode ruimte: @@ -3160,7 +3174,7 @@ Filterkuip volume: - + Chilling Koelen @@ -3169,27 +3183,27 @@ Trub koeler verlies: - + Top up water: Extra water in gistvat: - + Boiling Koken - + Kettle volume: Kookketel volume: - + Evaporation / hour: Verdamping per uur: - + Top up kettle: Extra water bij koken: @@ -3198,87 +3212,87 @@ Hop efficientie: - + Fermentables Vergistbaar - + Mash tun %: Percentage moutstort: - + Sugars %: Percentage suikers: - + Cara/crystal %: Percentage cara: - + Lintner: Lintner totaal: - + %v lintner %v lintner - - - - - + + + + + %v% %v% - - - - - - + + + + + + Add Nieuw - + kg - + Mash weight: Maisch gewicht: - + Hops Hoppen - + Hop taste: Hop smaak: - + Hop aroma: Hop aroma: - + Miscs Diversen - + Yeasts Gisten @@ -3287,63 +3301,63 @@ Schijnbare vergisting: - + Pitchrate billion cells/ml/°P: Ent miljard cellen/ml/°P: - + Starter method: Starter methode: - + Starter SG: Starter SG: - - - - - - + + + + + + Set or clear date Zet of wis datum - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ... ... - + Need billion cells: Nodig miljard cellen: @@ -3352,102 +3366,102 @@ Droge gist berekening. - + Low grams/hl: Laag grammen/hl: - + High grams/hl: Hoog grammen/hl: - - + + at bij - + This recipe pitch grams/hl: Dit recept ent gram/hl: - + Pitchrate grams/hectoliter: Ent gram/hectoliter: - + Yeast grams needed: Gist grammen nodig: - + Production date: Productie datum: - + Yeast condition: Gist conditie: - - + + Set the date to today. Zet de datum op vandaag. - + Edit the production date. Wijzig de productie datum. - - - - - - - + + + + + + + dd-MM-yyyy dd-MM-yyyy - + Clear the date Verwijder de datum - + Mash Maischen - + Mash name: Maisch schema: - + Mash schedule: Kies maisch schema: - + Mash time: Maisch tijd: - + Mash total volume: Maisch totaal volume: - + Water Water @@ -3456,125 +3470,125 @@ Water overzicht - + Ca Ca - + Mg Mg - + HCO3 HCO3 - + CaCO3 CaCO3 - + Na Na - + Cl Cl - + SO4 SO4 - + pH pH - + Volume Volume - The division between the main and dilution water. The total volume does not change. - De verdeling tussen het hoofd en verdunnings water. Het totale volume blijft gelijk. - - - - + De verdeling tussen het hoofd en verdunnings water. Het totale volume blijft gelijk. + + + Mash pH should be between 5.2 and 5.6. Use 5.2 for light and 5.5 for dark beers. De maisch pH moet tussen 5.2 en 5.6 zijn. Gebruik 5.2 voor lichte en 5.5 voor donkere bieren. - The ideal amount of Magnesium is between 5 and 40. - De ideale hoeveelheid magnesium is tussen 5 en 40. - - - + De ideale hoeveelheid magnesium is tussen 5 en 40. + + + + 0 to 50 for light beers, 50 to 150 for amber beers, 150 to 250 for dark beers. 0 tot 50 voor licht bier, 50 tot 150 voor amber bier, 150 tot 250 voor donker bier. - + + The ideal Sulfate amount should be between 50 and 400. Together with Chloride it must be below 500. De ideale sulfaat hoeveelheid is tussen 50 en 400. Samen met Chloride moet het minder dan 500 zijn. - The ideal amount of Calcium is between 40 and 150. - De ideale hoeveelheid Calcium is tussen 40 en 150. - - - + De ideale hoeveelheid Calcium is tussen 40 en 150. + + + + The ideal Chloride amount is between 50 and 150. Together with Sulfate it must be below 500. De ideale hoeveelheid Chloride is tussen 50 en 150. Samen met Sulfaat moet dit minder dan 500 zijn. - + + The ideal amount of Natrium should be below 150. De ideale hoeveelheid Zout moet minder dan 150 zijn. - + Water profile Water profiel - + The main brewing water Het hoofd brouwwater - + Choose water Kies water - + Optional dilution water Optioneel meng water - + Choose dilution Kies mengwater - + If needed, choose a target water profile. Indien nodig, kies een doel water profiel. @@ -3587,162 +3601,172 @@ Behandeld water - + RA - + Hardness Hardheid - + + HLT Volume: + + + + + HLT deadspace: + + + + Transfer loss: Overbrengen verlies: - + Immersion chiller: Dompelkoeler: - + Transfer Overbrengen - + Volume in fermenter: Volume naar het gistvat: - + Retry starter steps: Ververs starter stappen: - + Water agents Brouwzouten - + Calcium Chloride Calcium Chloride - + CaCl2: CaCl2: - + Gypsym Gips - + CaSO4: CaSO4: - + Epsom Magmesium sulfaat - + MgSO4: MgSO4: - + Table salt Keukenzout - + NaCl: NaCl: - - - + + + Magnesium Chloride Magnesium Chloride - + MgCl2: MgCl2: - - + + Baking soda Baksoda - + NaHCO3: NaHCO3: - - + + Chalk undissolved Ongebluste kalk - + CaCO3: CaCO3: - - + + To change the water profile. This adds Calcium and Chloride. To improve sweet style beers. Verbeterd het water profiel. Voegt Calcium en Chloride toe. Om de zoetheid van bier te verbeteren. - - - - - - + + + - - - - - - - + + + + + + + + + + gr gr - - + + Gypsum to change the water profile. This adds Calcium and Sulfate. To improve bitter beers. Gips om het waterprofiel te veranderen. Dit voegt Calcium en Sulfaat toe. Verbeterd de beleving van bittere bieren. - - + + Epsom salt to change the water profile. Use with caution! Epsom zout om water aan te passen. Gebruik spaarzaam! - - + + Table salt to change the water profile. This adds Sodium and Chloride. Improves the sweetness of the beer. The beer will become salty at high doses. Keukenzout om water aan te passen. Voegt Zout en Chloride toe. @@ -3757,24 +3781,24 @@ Gewenste pH: - + Auto calculate: Auto bereken: - + Acid to use: Aanzuren met: - - + + % % - - + + ml ml @@ -3795,7 +3819,7 @@ Water bron: - + Acid type: Aanzuren met: @@ -3808,118 +3832,150 @@ Benodigd: - + Bitterness index: Bitterheidsindex: - - + + N/A N.v.t - + Preffered SO4:Cl ratio: Gewenste SO4:Cl verh: - + Current SO4:Cl ratio: Huidige SO4:Cl verhouding: - + Estimate pre boil pH: Geschat voor kook pH: - + + + The ideal amount of Calcium is between 40 and 150 mg/L. + + + + + + The ideal amount of Magnesium is between 5 and 40 mg/L. + + + + + Mixed source water + + + + + + + Total brew and sparge water supply. +In the mash tab set the infusion volumes. +The sparge volume is automatic calculated. + + + + + The division between the main and dilution water. +The total volume does not change. + + + + Brewday Brouwdag - + Sparge supply: Spoelwater voorraad: - + Sparge estimate: Spoelwater geschat: - + Sparge temp: Spoelwater temp: - + Start density: Begin densiteit: - + Start temperature: Start temperatuur: - + Peak temperature: Piek temperatuur: - - + + End temperature: Eind temperatuur: - - + + End density: Eind densiteit: - - + + End date: Eind datum: - - - + + + Apparent attenuation: Schijnbare vergisting: - + Edit the date the secondary fermentation was done. Wijzig de datum dat de nagisting gereed was. - + Average temperature: Gemiddelde temperatuur: - + Final density: Finale densiteit: - + Expected end density: Verwachte eind densiteit: - + Extra added volume: Toevoeging volume: - + Extra remarks: Toevoeging opmerking: @@ -3929,45 +3985,45 @@ Finale ABV %: - + Extra added ABV %: Toevoeging extra ABV %: - + Estimated final IBU: Verwacht finale IBU: - + Estimated final EBC: Verwacht finale EBC: - - + + Volume: Volume: - - + + Priming: Carbonatie: - + Bottle fermentation: Flessen hergisting: - - + + gr/L gr/L - + Kegs temperature: Fusten temperatuur: @@ -3976,32 +4032,32 @@ Brouwdag start: - + Brewday end: Brouwdag eind: - + Mashing and Sparge Maischen en Spoelen - + Mash pH: Maisch pH: - + Mash SG: Maisch SG: - + Mash efficiency: Maisch rendement: - + Sparge water pH: Spoelwater pH: @@ -4034,94 +4090,124 @@ Voor koken rendement: - - - - + + + + Edit volume Wijzig volume - + Whirlpool cold: Whirlpool koud: - + Aeration time & speed: Beluchten tijd snelheid: - + Cooling method: Koelen methode: - + Cooling time: Koelen tijd: - + Transfer to fermenter Naar gistvat - + + + + + + Calcium in mg/L + + + + + + + + + Magnesium in mg/L. + + + + + Calcium content should typically fall in the range of 40 to 100 ppm. +Lower calcium content may not provide for the desirable +precipitation of trub and oxalates from wort. High oxalates may lead +to beerstone formation. +Calcium also aids in yeast floculation and beer clarification. + +Calcium should not typically exceed 100 ppm unless it has to be +added to provide a desirable anion like sulfate to the water. + + + + Brewday plan: Brouwdag plan: - - - - - - - - - + + + + + + + + + °C °C - - Pre boil - Begin koken - - - - - Volume @100°C: - Volume @100°C: - - - - Mash, sparge and lauter efficiency. - Maischen, spoelen en filteren rendement. - - - - Whirlpools - Whirlpoolen - - - - Whirlpool 72..79°C: - Whirlpool 72..79°C: - - - - Whirlpool 60..66°C: - Whirlpool 60..66°C: - - - - Whirlpool 85..100°C: - Whirlpool 85..100°C: - - + Pre boil + Begin koken + + + + + Volume @100°C: + Volume @100°C: + + + + Mash, sparge and lauter efficiency. + Maischen, spoelen en filteren rendement. + + + + Whirlpools + Whirlpoolen + + + + Whirlpool 72..79°C: + Whirlpool 72..79°C: + + + + Whirlpool 60..66°C: + Whirlpool 60..66°C: + + + + Whirlpool 85..100°C: + Whirlpool 85..100°C: + + + Volume to fermenter: Volume naar gistvat: @@ -4130,17 +4216,17 @@ Trub en koeler verlies: - + SG in fermenter: SG in gistvat: - + EBC color in fermenter: EBC kleur in gistvat: - + IBU in fermenter: IBU in het gistvat: @@ -4149,7 +4235,7 @@ Beluchten - + Aeration with: Beluchten met: @@ -4162,177 +4248,177 @@ Beluchten snelheid: - + L/m L/m - - - - + + + + Brew log chart Brouw log grafiek - + Cooling Koelen - + Cooling to: Koelen tot: - + After boil Einde koken - + The overall efficiency. Het totale brouwzaal rendement. - + Edit the brewdate plan or start. Wijzig de brouwdag plan of start datum. - + Clear planned brewdate Wis geplande brouwdag - + Edit the brewdate start time. Wijzig de brouwdag start tijd. - - + + hh:mm hh:mm - + Edit the brewdate end. Wijzig de brouwdag eind datum. - + Edit the brewdate end time. Wijzig de brouwdag eind tijd. - + Set the brewdate end date. Zet de brouwdag eind datum. - + End time: Eind tijd: - + Start time: Start tijd: - + Show brewlog: Toon brouwlog: - + Confirm brew done: Bevestig brouwdag: - - - + + + Confirm the brew dates and times. Bevestig de brouw datums en tijden. - + Fermenting Vergisten - + Primary fermentation Hoofdvergisting - - - + + + Edit SG in Plato, Brix or SG Wijzig SG in Plato, Brix of SG - - - Set the date to today - Zet de datum op vandaag - - - - Edit the date the primary fermentation was done. - Wijzig de datum dat de hoofdgisting gereed was. - - - - Secondary fermentation - Nagisting - - - - Tertiary fermentation - Lageren - - + + Set the date to today + Zet de datum op vandaag + + + + Edit the date the primary fermentation was done. + Wijzig de datum dat de hoofdgisting gereed was. + + + + Secondary fermentation + Nagisting + + + + Tertiary fermentation + Lageren + + + Alcohol volume: Alcohol vol%: - + Show fermenter unit log: Toon gistkast log: - + Show fermentation log: Toon vergisting log: - + Package Verpakken - + Package date: Verpakken datum: - + Carbonation range: Koolzuur volumes: - + Infusion or Dilution Infusie of verdunnen - + Package volume: Verpakken volume: @@ -4342,13 +4428,13 @@ Verpakken ABV %: - + pH from fermenter: pH vanuit gistvat: - + Estimated ABV: Verwacht ABV: @@ -4364,7 +4450,7 @@ - + Estimated IBU: Verwacht IBU: @@ -4394,29 +4480,29 @@ Fusten CO2: - + Brewhouse efficiency: Brouwzaal rendement: - + Liters per minute to pump trough the chiller. Used to calculate the time needed to transfer the wort. Liters per minuut pompen door de koeler. Gebruikt om de tijd te berekenen om het wort weg te pompen. - + Transfer liters/minute: Overbrengen liters/minuut: - + Minutes elapsed to cool to 79 °C Nodige minuten om tot 79 °C te koelen - + Volume lost in hoses, pump ... Verlies in slangen, pomp ... @@ -4429,30 +4515,30 @@ Dompelkoeler L: - + Wort chiller type: Wort koeler type: - + Minutes to cool to 79 °C: Minuten koelen tot 79 °C: - + Temporary extra volume of the immersion chiller in the kettle. Used to correct the after boil volume. Tijdelijk extra volume in de kookketel. Wordt gebruikt als correctie voor na koken volume. - - + + Kettle trub loss: Kookketel trub verlies: - + Extra water in fermenter: Extra water in gistvat: @@ -4461,316 +4547,336 @@ Volume naar het gistvat L: - + Boil absorb: Kook absorptie: - + Loss by hop absorption in the boil kettle Verlies door hop absorptie in de kook ketel - + Fermenter absorb: Gistvat absorptie: - + Loss in the fermenter caused by dry-hopping Verlies in het gistvat door het drooghoppen - + Apparent Attenuation: Schijnbare vergisting: - + Yeast starter calculation. Giststarter berekening. - + Dry yeast calculation. Droge gist berekening. - + Acid Additions Zuur toevoegingen - + Desired mash pH: Gewenst maisch pH: - + Desired sparge pH: Gewenst spoel pH: - - + + Acid amount: Zuur hoeveelheid: - + The total prepared amount of sparge water De totale voorraad spoelwater - + Choose example water Kies voorbeeld water - Treated mash water - Behandeld maisch water - - - - + Behandeld maisch water + + + Total brew and sparge water supply - - Total needed mixed water - - - - + Total brew and sparge water supply without optional dilution water - + + + Sparge water source 1 Spoelwater bron 1 - Sparge water source 2 - Spoelwater bron 2 - - - + Spoelwater bron 2 + + Sparge water mixed - Gemengd spoelwater - - - + Gemengd spoelwater + + + Sparge Spoel - Treated sparge water - Behandeld spoelwater - - - + Behandeld spoelwater + + + + + Actual Water Adjustment + + + + + Sparge volume: + + + + + Treated total water + + + + + + Switch between Actual and Target values + + + + + + Treated Mash Water + + + + Estimated final ABV %: Verwacht finale ABV %: - + Extra dilution or infusion added to this batch. Toegevoegde verdunning of infusie aan deze batch. - - + + The ABV including the infusion. Het ABV inclusief infusie. - + If there is alcohol in the infusion, give the percentage. Als er alcohol in de infusie zit, geef hier het percentage. - + Could be the description of the infusion. Hier kun je de toevoeging beschrijven. - + Estimated package ABV %: Verwacht verpakken ABV %: - + Bottles Flessen - - + + Desired volume CO2: Gewenst volume CO2: - - + + Priming sugar: Carbonatie suiker: - - + + Sugar amount: Suiker gewicht: - - + + Water amount: Water volume: - + Expected pressure in bar: Verwachte druk in bar: - + Bottles ABV %: Flessen ABV %: - + Kegs Fusten - + Kegs ABV %: Fusten ABV %: - + Kegs pressure in bar: Fusten druk in bar: - + Forced carbonation: Geforceerde carbonatie: - + Edit the package date. Wijzig de verpakkings datum. - + Show carbonation log: Toon carbonatie log: - + Tasting Proeven - + Taste date: Proeven datum: - + Taste rate: Beoordeling cijfer: - + Color: Kleur: - + Transparency: Helderheid: - + Head: Schuim: - + Aroma: Geur: - + Taste: Smaak: - + Aftertaste: Nasmaak: - + Mouthfeel: Mondgevoel: - + Notes: Opmerkingen: - + Edit the tasting date. Wijzig de datum van proeven. - + Images Plaatjes - + Previous Vorige - + Next Volgende - + Filename: Bestand: - + Comment: Bijschrift: - + Type: Soort: - + Export Exporteer - - + + Print Print @@ -4790,7 +4896,7 @@ Mout - + BMSapp - Edit %1 - %2 BMSapp - Wijzig %1 - %2 @@ -4843,7 +4949,7 @@ - + Database error Database fout @@ -4861,7 +4967,7 @@ Koken %1 minuten - + BMSapp - Add new product BMSapp - Nieuw product @@ -4870,18 +4976,18 @@ BMSapp - Wijzig product %1 - - + + Edit Product Wijzig Product - + Name empty or too short. De naam is leeg of te kort. - + No beerstyle selected. Geen bierstijl gekozen. @@ -4891,7 +4997,7 @@ - + MySQL error: %1 %2 %3 @@ -4900,17 +5006,17 @@ %3 - + Delete product Verwijder product - + Product changed Product gewijzigd - + The product has been modified. Save changes? Het product is gewijzigd. Wijzigingen opslaan? @@ -5048,7 +5154,7 @@ - + Delete %1 Verwijder %1 @@ -5602,8 +5708,8 @@ Verwarm tijd: - - + + Measured pH: Gemeten pH: @@ -5614,8 +5720,8 @@ Gemeten Brix: - - + + Measured SG: Gemeten SG: @@ -5631,67 +5737,77 @@ Infusie temperatuur: - + Very malty and sweet Zeer moutig en zoet - + Malty, sweet Moutig, zoet - - + + Balanced Gebalanceerd - + Hoppy, bitter Hoppig, bitter - + Very hoppy, very bitter Erg hoppig, erg bitter - - Too malty - Te moutig - - - Very malty - Erg moutig + Too malty + Te moutig + Very malty + Erg moutig + + + Malty Moutig - - Little bitter - Iets bitter - - - Bitter - Bitter + Little bitter + Iets bitter - Very bitter - Erg bitter + Bitter + Bitter + Very bitter + Erg bitter + + + Too bitter Veel te bitter + + Target Water Adjustment + + + + + Treated Sparge Water + + + @@ -6083,7 +6199,7 @@ Kan niet laden %1: %2 - + Image here Plaatje hier @@ -11159,6 +11275,17 @@ Yeast Packages Gist verpakkingen + + + Equipments upgrade + + + + + The Equipents database has two new HLT fields. +Please check the Inventory->Equipents records + + ManoMeter @@ -14190,25 +14317,23 @@ - - - - + + + Database error Database fout - + MySQL error: record %1 not found MySQL fout: record %1 niet gevonden - - - + + MySQL error: %1 %2 %3 diff -r 3b9abdae181e -r 84091b9cb800 ui/EditEquipment.ui --- a/ui/EditEquipment.ui Sat Jun 01 21:10:54 2024 +0200 +++ b/ui/EditEquipment.ui Sat Jun 08 15:54:30 2024 +0200 @@ -146,7 +146,7 @@ 10 110 321 - 241 + 331 @@ -472,27 +472,11 @@ - - - - - 10 - 380 - 321 - 91 - - - - Lautering - - - Qt::AlignCenter - 10 - 20 + 230 171 20 @@ -504,27 +488,11 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - 10 - 50 - 171 - 20 - - - - Brewhouse efficiency: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - 190 - 20 + 230 101 24 @@ -551,11 +519,43 @@ QAbstractSpinBox::DefaultStepType - + + + + 10 + 260 + 171 + 20 + + + + HLT Volume: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 290 + 171 + 20 + + + + HLT deadspace: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 190 - 50 + 260 101 24 @@ -567,13 +567,13 @@ true - % + L 1 - 100.000000000000000 + 100000.000000000000000 0.500000000000000 @@ -582,6 +582,37 @@ QAbstractSpinBox::DefaultStepType + + + + 190 + 290 + 101 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + L + + + 1 + + + 100000.000000000000000 + + + 0.100000000000000 + + + QAbstractSpinBox::DefaultStepType + + @@ -991,9 +1022,9 @@ 670 - 380 + 320 321 - 91 + 121 @@ -1105,6 +1136,53 @@ QAbstractSpinBox::DefaultStepType + + + + 190 + 80 + 101 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + % + + + 1 + + + 100.000000000000000 + + + 0.500000000000000 + + + QAbstractSpinBox::DefaultStepType + + + + + + 10 + 80 + 171 + 20 + + + + Brewhouse efficiency: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + diff -r 3b9abdae181e -r 84091b9cb800 ui/EditProduct.ui --- a/ui/EditProduct.ui Sat Jun 01 21:10:54 2024 +0200 +++ b/ui/EditProduct.ui Sat Jun 08 15:54:30 2024 +0200 @@ -1529,7 +1529,7 @@ 10 160 321 - 151 + 241 @@ -1714,24 +1714,11 @@ true - - - - - 10 - 320 - 321 - 91 - - - - Lautering - 190 - 20 + 140 87 24 @@ -1765,7 +1752,7 @@ 10 - 20 + 140 171 20 @@ -1777,11 +1764,27 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + + + + 10 + 170 + 171 + 20 + + + + HLT Volume: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 190 - 50 + 170 87 24 @@ -1796,10 +1799,10 @@ QAbstractSpinBox::NoButtons - false - - - % + true + + + L 1 @@ -1810,18 +1813,58 @@ 0.500000000000000 - - - - - 10 - 50 + + QAbstractSpinBox::DefaultStepType + + + + + + 190 + 200 + 87 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + true + + + L + + + 1 + + + 100000.000000000000000 + + + 0.100000000000000 + + + QAbstractSpinBox::DefaultStepType + + + + + + 10 + 200 171 20 - Brewhouse efficiency: + HLT deadspace: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -2468,7 +2511,7 @@ 820 350 321 - 91 + 121 @@ -2577,6 +2620,56 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + 190 + 80 + 87 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + false + + + % + + + 1 + + + 100000.000000000000000 + + + 0.500000000000000 + + + + + + 10 + 80 + 171 + 20 + + + + Brewhouse efficiency: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + @@ -4208,9 +4301,9 @@ 10 - 120 + 180 1131 - 381 + 321 @@ -4218,7 +4311,7 @@ 170 - 80 + 140 80 23 @@ -4250,9 +4343,9 @@ - 560 - 10 - 171 + 10 + 40 + 151 20 @@ -4266,8 +4359,8 @@ - 740 - 10 + 170 + 40 321 23 @@ -4289,9 +4382,9 @@ - 560 - 40 - 171 + 10 + 100 + 151 20 @@ -4305,9 +4398,9 @@ - 740 - 40 - 71 + 170 + 100 + 81 23 @@ -4319,7 +4412,7 @@ 10 - 40 + 70 151 20 @@ -4335,7 +4428,7 @@ 170 - 40 + 70 80 24 @@ -5467,214 +5560,11 @@ 1000.000000000000000 - - - - 750 - 220 - 71 - 24 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 1 - - - 1000.000000000000000 - - - - - - 670 - 220 - 71 - 24 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 1 - - - 1000.000000000000000 - - - - - - 590 - 220 - 71 - 24 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 1 - - - 1000.000000000000000 - - - - - - 1070 - 220 - 71 - 24 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 1 - - - -1000.000000000000000 - - - 1000.000000000000000 - - - - - - 910 - 220 - 71 - 24 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 2 - - - 1000.000000000000000 - - - - - - 830 - 220 - 71 - 24 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 1 - - - 1000.000000000000000 - - - - - - 430 - 220 - 71 - 24 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 1 - - - 1000.000000000000000 - - - - - - 510 - 220 - 71 - 24 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 1 - - - 1000.000000000000000 - - - 250 - 220 + 520 + 420 81 24 @@ -5701,57 +5591,7 @@ 0.500000000000000 - - - - 990 - 220 - 71 - 24 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 1 - - - 1000.000000000000000 - - - - - - 350 - 220 - 71 - 24 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 1 - - - 1000.000000000000000 - - - + 10 @@ -5767,10 +5607,10 @@ Choose example water - - - - 990 + + + + 760 40 71 24 @@ -5792,10 +5632,10 @@ 1000.000000000000000 - - - - 830 + + + + 680 40 71 24 @@ -5817,10 +5657,10 @@ 1000.000000000000000 - - - - 670 + + + + 520 40 71 24 @@ -5842,10 +5682,10 @@ 1000.000000000000000 - - - - 1070 + + + + 840 40 71 24 @@ -5870,35 +5710,10 @@ 1000.000000000000000 - - - - 590 - 40 - 71 - 24 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 1 - - - 1000.000000000000000 - - - - - - 350 + + + + 440 40 71 24 @@ -5920,10 +5735,38 @@ 1000.000000000000000 - - - - 750 + + + + 200 + 40 + 71 + 24 + + + + Calcium in mg/L + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + 1000.000000000000000 + + + + + + 600 40 71 24 @@ -5945,15 +5788,18 @@ 1000.000000000000000 - - - - 430 + + + + 280 40 71 24 + + Magnesium in mg/L. + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -5970,10 +5816,10 @@ 1000.000000000000000 - - - - 510 + + + + 360 40 71 24 @@ -5998,8 +5844,8 @@ - 510 - 190 + 360 + 220 71 24 @@ -6026,8 +5872,8 @@ - 990 - 190 + 760 + 220 71 24 @@ -6052,51 +5898,23 @@ 10 - 190 - 171 + 220 + 181 21 - Treated mash water + Treated total water Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - 910 - 190 - 71 - 24 - - - - Mash pH should be between 5.2 and 5.6. Use 5.2 for light and 5.5 for dark beers. - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - QAbstractSpinBox::NoButtons - - - 2 - - - 1000.000000000000000 - - - 670 - 190 + 520 + 220 71 24 @@ -6123,8 +5941,8 @@ - 590 - 190 + 440 + 220 71 24 @@ -6148,8 +5966,8 @@ - 750 - 190 + 600 + 220 71 24 @@ -6177,14 +5995,14 @@ - 350 - 190 + 200 + 220 71 24 - The ideal amount of Calcium is between 40 and 150. + The ideal amount of Calcium is between 40 and 150 mg/L. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -6205,8 +6023,8 @@ - 1070 - 190 + 840 + 220 71 24 @@ -6233,14 +6051,14 @@ - 430 - 190 + 280 + 220 71 24 - The ideal amount of Magnesium is between 5 and 40. + The ideal amount of Magnesium is between 5 and 40 mg/L. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -6261,8 +6079,8 @@ - 830 - 190 + 680 + 220 71 24 @@ -6290,7 +6108,7 @@ - 510 + 360 130 71 24 @@ -6315,7 +6133,7 @@ - 1070 + 840 130 71 24 @@ -6345,7 +6163,7 @@ 10 130 - 171 + 181 21 @@ -6353,7 +6171,7 @@ Total brew and sparge water supply - Total needed mixed water + Mixed source water Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter @@ -6362,12 +6180,15 @@ - 350 + 200 130 71 24 + + Calcium in mg/L + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -6387,7 +6208,7 @@ - 990 + 760 130 71 24 @@ -6412,14 +6233,16 @@ - 250 + 1060 130 71 24 - Total brew and sparge water supply + Total brew and sparge water supply. +In the mash tab set the infusion volumes. +The sparge volume is automatic calculated. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -6443,7 +6266,7 @@ - 670 + 520 130 71 24 @@ -6468,7 +6291,7 @@ - 750 + 600 130 71 24 @@ -6493,12 +6316,15 @@ - 430 + 280 130 71 24 + + Magnesium in mg/L. + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -6518,7 +6344,7 @@ - 830 + 680 130 71 24 @@ -6543,7 +6369,7 @@ - 590 + 440 130 71 24 @@ -6568,7 +6394,7 @@ - 910 + 920 130 71 24 @@ -6593,7 +6419,7 @@ - 1070 + 840 100 71 24 @@ -6621,12 +6447,15 @@ - 350 + 200 100 71 24 + + Calcium in mg/L + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -6646,7 +6475,7 @@ - 830 + 680 100 71 24 @@ -6671,12 +6500,15 @@ - 430 + 280 100 71 24 + + Magnesium in mg/L. + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -6696,7 +6528,7 @@ - 910 + 920 100 71 24 @@ -6721,7 +6553,7 @@ - 990 + 760 100 71 24 @@ -6746,14 +6578,15 @@ - 250 + 1060 100 85 24 - The division between the main and dilution water. The total volume does not change. + The division between the main and dilution water. +The total volume does not change. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -6783,7 +6616,7 @@ - 670 + 520 100 71 24 @@ -6808,7 +6641,7 @@ - 750 + 600 100 71 24 @@ -6849,7 +6682,7 @@ - 590 + 440 100 71 24 @@ -6874,7 +6707,7 @@ - 510 + 360 100 71 24 @@ -6899,12 +6732,15 @@ - 430 + 280 70 71 24 + + Magnesium in mg/L. + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -6924,7 +6760,7 @@ - 510 + 360 70 71 24 @@ -6949,7 +6785,7 @@ - 990 + 760 10 71 20 @@ -6965,7 +6801,7 @@ - 910 + 920 70 71 24 @@ -6990,7 +6826,7 @@ - 430 + 280 10 71 20 @@ -7006,7 +6842,7 @@ - 910 + 920 10 71 20 @@ -7022,7 +6858,7 @@ - 1070 + 840 10 71 20 @@ -7050,7 +6886,7 @@ - 990 + 760 70 71 24 @@ -7075,7 +6911,7 @@ - 250 + 1060 70 71 24 @@ -7109,7 +6945,7 @@ - 830 + 680 70 71 24 @@ -7134,7 +6970,7 @@ - 590 + 440 10 71 20 @@ -7150,7 +6986,7 @@ - 590 + 440 70 71 24 @@ -7175,7 +7011,7 @@ - 1070 + 840 70 71 24 @@ -7222,7 +7058,7 @@ - 750 + 600 10 71 20 @@ -7238,7 +7074,7 @@ - 670 + 520 10 71 20 @@ -7254,12 +7090,22 @@ - 350 + 200 10 71 20 + + Calcium content should typically fall in the range of 40 to 100 ppm. +Lower calcium content may not provide for the desirable +precipitation of trub and oxalates from wort. High oxalates may lead +to beerstone formation. +Calcium also aids in yeast floculation and beer clarification. + +Calcium should not typically exceed 100 ppm unless it has to be +added to provide a desirable anion like sulfate to the water. + Ca @@ -7270,7 +7116,7 @@ - 830 + 680 10 71 20 @@ -7286,7 +7132,7 @@ - 260 + 1070 10 61 20 @@ -7302,7 +7148,7 @@ - 510 + 360 10 71 20 @@ -7334,7 +7180,7 @@ - 750 + 600 70 71 24 @@ -7359,12 +7205,15 @@ - 350 + 200 70 71 24 + + Calcium in mg/L + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -7384,7 +7233,7 @@ - 670 + 520 70 71 24 @@ -7406,10 +7255,658 @@ 1000.000000000000000 + + + + 600 + 160 + 71 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + -1000.000000000000000 + + + 1000.000000000000000 + + + + + + 360 + 160 + 71 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + -1000.000000000000000 + + + 1000.000000000000000 + + + + + + 520 + 160 + 71 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + -1000.000000000000000 + + + 1000.000000000000000 + + + + + + 680 + 160 + 71 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + -1000.000000000000000 + + + 1000.000000000000000 + + + + + + 200 + 160 + 71 + 24 + + + + Calcium in mg/L + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + -1000.000000000000000 + + + 1000.000000000000000 + + + + + + 760 + 160 + 71 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + -1000.000000000000000 + + + 1000.000000000000000 + + + + + + 280 + 160 + 71 + 24 + + + + Magnesium in mg/L. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + -1000.000000000000000 + + + 1000.000000000000000 + + + + + + 330 + 420 + 181 + 20 + + + + Sparge volume: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 920 + 40 + 71 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 2 + + + 1000.000000000000000 + + + + + + 10 + 160 + 181 + 23 + + + + Switch between Actual and Target values + + + Actual Water Adjustment + + + true + + + + + + 1060 + 220 + 71 + 24 + + + + Total brew and sparge water supply. +In the mash tab set the infusion volumes. +The sparge volume is automatic calculated. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + L + + + 2 + + + 100000.000000000000000 + + + + + + 10 + 190 + 181 + 23 + + + + Switch between Actual and Target values + + + Treated Mash Water + + + true + + + + + + 440 + 190 + 71 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + 1000.000000000000000 + + + + + + 280 + 190 + 71 + 24 + + + + The ideal amount of Magnesium is between 5 and 40 mg/L. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + 1000.000000000000000 + + + + + + 200 + 190 + 71 + 24 + + + + The ideal amount of Calcium is between 40 and 150 mg/L. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + 1000.000000000000000 + + + + + + 680 + 190 + 71 + 24 + + + + The ideal Sulfate amount should be between 50 and 400. +Together with Chloride it must be below 500. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + 1000.000000000000000 + + + + + + 520 + 190 + 71 + 24 + + + + The ideal amount of Natrium should be below 150. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + 1000.000000000000000 + + + + + + 1060 + 190 + 71 + 24 + + + + Total brew and sparge water supply. +In the mash tab set the infusion volumes. +The sparge volume is automatic calculated. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + L + + + 2 + + + 100000.000000000000000 + + + + + + 760 + 190 + 71 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + 1000.000000000000000 + + + + + + 840 + 190 + 71 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + -1000.000000000000000 + + + 1000.000000000000000 + + + + + + 600 + 190 + 71 + 24 + + + + The ideal Chloride amount is between 50 and 150. +Together with Sulfate it must be below 500. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + 1000.000000000000000 + + + + + + 360 + 190 + 71 + 24 + + + + 0 to 50 for light beers, 50 to 150 for amber beers, 150 to 250 for dark beers. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 1 + + + 1000.000000000000000 + + + + + + 920 + 190 + 71 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 2 + + + 1000.000000000000000 + + + + + + 920 + 220 + 71 + 24 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + QAbstractSpinBox::NoButtons + + + 2 + + + 1000.000000000000000 + + - - - 210 + + false + + + + 1020 70 21 21 @@ -7418,6 +7915,9 @@ Sparge water source 1 + + + true @@ -7431,14 +7931,17 @@ - 210 + 1020 100 21 21 - Sparge water source 2 + Sparge water source 1 + + + false spargeGroup @@ -7450,25 +7953,28 @@ - 210 + 1020 130 21 21 - Sparge water mixed + Sparge water source 1 + + + false spargeGroup - - - - 190 + + + + 1010 10 - 61 + 41 20 @@ -7476,23 +7982,7 @@ Sparge - Qt::AlignCenter - - - - - - 10 - 220 - 171 - 21 - - - - Treated sparge water - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter