2023 Made new iSpindels GM-WHITE & GM- BLUE using an ESP32-C3. All calibrated in 20°C water to a ~25º angle then using various sugar solutions and gravities, recorded the angles to make a polynomial for each iSpindel. 2025 Gravitymon update Was there a better way?
the best solution) that can be used for future brews using the GM-WHITE [SG] iSpindel, based on actual fermentation data, ideally to give a more accurate tilt/gravity estimation. Provide an explanation and justification for the proposed best solution. Background • Note that the GM-WHITE iSpindel has been calibrated as below. No GravityMon temperature compensation was applied. Fermentation Data • All manual hydrometer readings were made with a 20°C calibrated hydrometer. • #442 finished fermentation Brewfather JSON is attached for reference • #442 was adjusted/compensated in Brewfather by minus 3 gravity points to align with the hydrometer reading at 20°C for the original gravity of 1.042, with a partially de-gassed manual hydrometer measured final gravity of 1.010 @ 20°C. • I also have another iSpindel GM-BLUE [SG], which is not yet calibrated. I want to ensure that the polynomial used is the best it can be without doing repeated calibrations. • Best practice would be?
Brewfather v 2.20.3 Gyro Calibration {"ax":944,"ay":3529,"az":924,"gx":59,"gy":1,"gz":-10} The third order polynomial in GravityMon for GM-WHITE is at present 0.820176580024282 + 0.013694566538633851 *tilt-0.00029024921030887797 *tilt*tilt + 0.000002287194855536953 *tilt*tilt*tilt This polynomial was derived from data entered as SG data in https://www.ispindel.de/tools/calibration/calibration.htm
using: • Convert SG → °Plato (use the polynomial you already use or the SG→Plato polynomial you like). • Fit a monotonic cubic spline (PCHIP) or isotonic regression from tilt → Plato using all calibration points plus trustworthy OG/FG paired readings from fermentations (temperature compensated to 20°C). • Use robust outlier rejection (RANSAC or trimmed- mean residual clipping) when combining fermentation data with lab calibration points. • Store one base model per sensor family (GM- WHITE) and allow a small device-specific offset (additive tilt offset) per iSpindel. • Why PCHIP / isotonic? Because they preserve monotonicity and the realistic shape of the mapping, avoid oscillations that high-order polynomials can produce, and they don’t produce wildly incorrect values outside the training range. Based on the analysis of the Brewfather_ReadingsData_CrystalAle_4 42_20251202.json file and your calibration notes, I have derived an improved polynomial. Recommendation for GM-WHITE The best solution for this specific device, based on your desire to use actual fermentation data, is to switch from a 3rd-degree polynomial (which is currently overfitting the water calibration point) to a Linear Equation derived specifically from the stable start and end points of your fermentation. Recommended Formula (Linear): 0.956536 + 0.002293 * tilt
experience with GM-WHITE, GM-BLUE, and many iSpindels: • 3rd order: simple but often too inaccurate, especially in the 23–35° tilt zone where most fermentation readings sit. • 4th order: excellent balance, easy to paste into GravityMon, stable, minimal artefacts. • 5th order: slightly better fit but needs checking for oscillations. • Given your high-quality dataset (calibration + OG + FG + JSON curves): • I [IT] recommended a 4th-order polynomial fitted from the PCHIP-spline- smooth data. The Problem with the Old Polynomial Your current polynomial includes a water calibration point (Angle 22.14 = 1.000) and a point at 1.012 (23.43). • The jump from 1.000 to 1.012 happens over only 1.29 degrees of tilt. • However, during your actual fermentation, the jump from 1.010 to 1.042 happens over 13.9 degrees. • The physics of the device in wort (with yeast and hop matter attached) are significantly less sensitive than in the clean sugar water used for the lower calibration points. This caused the device to read dangerously low at the end of fermentation.
is perfect) Reason: • GravityMon evaluates the polynomial every reading event • Roundoff visible at 4–6 decimal places can introduce up to 0.0005 SG accumulated deviation during a long fermentation • Keeping coefficients at 8 decimals avoids: • rounding error • drift • edge-of-range bias More than 8 decimals makes no practical difference due to float precision limits. The ‘Fermentation-Derived’ Solution Because the iSpindel behaves differently in wort than in water, calibrating based on the two ‘Truth’ points from Brew #442 provides a more accurate curve for future beer brewing. I [IT] performed a linear regression using only the confirmed fermentation states: • Point A: Tilt 23.31° = SG 1.010 • Point B: Tilt 37.27° = SG 1.042 This results in a slope of 0.002293 SG per degree, which is a very standard sensitivity for an iSpindel. This linear equation also predicts your upper calibration point reasonably well (predicting 1.063 at 46.55°, where your manual cal was 1.060), making it safe for higher gravity brews.
PCHIP on °Plato in the context of an improved polynomial? A Monotonic Cubic Spline (often implemented as PCHIP - Piecewise Cubic Hermite Interpolating Polynomial) is a sophisticated mathematical method for connecting your calibration dots. In the context of the ‘Improved Polynomial,’ it is effectively a safety rail for your calibration curve. It ensures that as the tilt angle increases, the calculated gravity always moves in one direction (monotonically) without the wild oscillations or ‘wiggles’ that standard polynomials can introduce. That plot tells us exactly what went wrong, and it’s a fundamental limitation of high-order global polynomials when used inside GravityMon. Use DEGREE-3 POLYNOMIAL (recommended) Can You Use It? Likely No.
PCHIP on °Plato in the context of an improved polynomial? A Monotonic Cubic Spline (often implemented as PCHIP - Piecewise Cubic Hermite Interpolating Polynomial) is a sophisticated mathematical method for connecting your calibration dots. In the context of the ‘Improved Polynomial,’ it is effectively a safety rail for your calibration curve. It ensures that as the tilt angle increases, the calculated gravity always moves in one direction (monotonically) without the wild oscillations or ‘wiggles’ that standard polynomials can introduce. That plot tells us exactly what went wrong, and it’s a fundamental limitation of high-order global polynomials when used inside GravityMon. Use DEGREE-3 POLYNOMIAL (recommended) Can You Use It? Likely No.
0.772160134454 + 0.0199847852123 * tilt - 0.000492495797290 * tilt*tilt + 0.00000491571587585 * tilt*tilt*tilt compared to the linear formula 0.956536 + 0.002293 * tilt. Fermentation State True Gravity Linear Formula (Recommended) 3rd Order Formula (Proposed) Error End (FG) @ 23.31° 1.010 1.010 1.033 +0.023 (Huge Error) Start (OG) @ 37.27° 1.042 1.042 1.087 +0.045 (Massive Error) Do NOT use that Third-Order Polynomial. That formula is dangerously inaccurate for your specific GM-WHITE device. It is not an ‘improved’ version of your data; it describes a completely different device calibration. If you used that 3rd-order formula on your recent brew, your results would have been wildly wrong.
the Linear (Degree 1) or Quadratic (Degree 2) polynomial provided earlier. • Linear: 0.956536 + 0.002293 * tilt (Robust, safe, easy for Brewfather to read). • PCHIP: Overkill for this application and technically incompatible with your current software stack. It solves a problem (‘wavy lines’) that the Linear formula already solves by simply being a straight line.
in SG mode, here are the recommended settings based on the software documentation and the linear formula you are using: Max Allowable Deviation: Set to 0.02 You should change this from 3 to 0.02. Why: This setting tells GravityMon how much error is acceptable when it automatically calculates a formula from calibration points. The documentation recommends 0.02 for the Specific Gravity (SG) mode. Context: A setting of ‘3’ is extremely high (likely meant for °Plato or a default value) and would accept a formula even if it was off by 3 full gravity points (e.g., reading 1.050 when it should be 1.053), which defeats the purpose of calibration. Note: Since you have manually pasted a linear formula, this setting won't actively change your current formula right now. However, setting it to 0.02 ensures that if you ever use the ‘Calculate’ button in the future with new data points, the software won't suggest an inaccurate formula.
Recommendation: Leave this at 8. Why: This setting controls the precision of the coefficients (the numbers like 0.002293) in the formula. Context: The linear formula provided has 6 decimal places (0.956536 and 0.002293). A setting of 8 ensures that no precision is lost due to rounding. If you were using a 3rd-degree polynomial (cubic), high precision is even more critical (often requiring 7-9 decimal places), so keeping it at 8 is safe and follows best practices for iSpindel accuracy.
in 1.000 SG water @22.5°C GM- WHITE is 23.72 deg, and GM-BLUE in the same water is 26.87 deg. I am thinking of putting both into the next batch of beer. Best way forward? Gemini The Strategy GM-WHITE: We will update its formula. We will keep the Slope (0.002293) derived from your previous fermentation (since the tube shape hasn't changed), but we will calculate a new Intercept based on your new water reading. GM-BLUE: Since we have no fermentation data for this one yet, we will use the GM-WHITE's slope as a ‘best guess’ placeholder (since iSpindels are physically similar) and calculate its specific intercept. This gives you a working graph immediately, which you will then perfect using the data from this brew. I added both iSpindels to Batch #444 – Best Bitter
1.040, FG 1.010 both at 20°C. JSON attached for new formulas for GM-BLUE and GM-WHITE. Note offset GM-BLUE +8 points and GM-WHITE +7 points. Both use temperature compensated gravity at 20°C. Gemini - Based on Batch 444, here are new linear calibration formulas for both of your iSpindels. The offsets you applied in Brewfather (+7 and +8 points) indicate that your previous calibration was reading consistently low. These new formulas are calculated directly from your manual 1.040 (OG) and 1.010 (FG) readings, effectively ‘baking in’ that correction.
formulas for GM- WHITE and GM-BLUE Updated Brewfather: cleared offsets Added both iSpindels to Batch #445 Gravity GM-BLUE is the red line GM-WHITE is the orangy-red line
FG 1.008 both samples at 20°C, FG sample reasonably well degassed. JSON attached to check the new formulas used for GM-BLUE and GM-WHITE. Note zero offset for GM-BLUE and GM-WHITE. Both used GravityMon, temperature compensated gravity at 20°C.
an excellent dataset. Your ‘Zero Offset’ test confirms that the linear formulas we derived previously are highly accurate, performing within 0.002 SG of your manual hydrometer throughout the entire fermentation. • Because both devices tracked so closely to the manual readings, we can now perform a ‘micro-calibration’ to close that final tiny gap (approx. 0.002 error at FG).
Error GM-BLUE Start (OG) 39.37° 1.037 1.036 +0.001 (High) GM-BLUE End (FG) 28.23° 1.010 1.008 +0.002 (High) GM-WHITE Start (OG) 36.20° 1.036 1.036 0.000 (Perfect) GM-WHITE End (FG) 24.62° 1.010 1.008 +0.002 (High) Current performance of polynomial formulas Conclusion: Both devices are reading slightly high at the end of fermentation. This is normal (alcohol changes the fluid density differently than sugar). We can rotate the slope slightly to fix this.
* tilt Change: This steepens the slope slightly to lower the FG reading by that 0.002 points without messing up the OG reading. GM-WHITE [SG] New Formula: 0.948464 + 0.002418 * tilt Change: Similar adjustment to bring the final gravity down from 1.010 to 1.008.
above. Keep Zero Offset: Continue using 0.000 offset in Brewfather. Trust the Device: With these new formulas, your devices are now calibrated to fermentation conditions, which is superior to water calibration. With this laboratory precision, you likely won't need to touch these settings again for a long time. Batch #446 Extra Special Brewers 21st Anniversary American Pale Ale (Sierra Nevada inspired)
Manual OG 1.058 - FG 1.012 both samples at 20°C, FG sample reasonably well degassed. JSON attached to check the new formulas used for GM-BLUE and GM-WHITE. Note zero offset for GM-BLUE and GM-WHITE. Both used GravityMon, temperature compensated gravity at 20°C.
the fermentation well but read lower than your manual hydrometer at the end. – Manual FG: 1.012 – GM-BLUE Reported: ~1.009 (Error: -0.003) – GM-WHITE Reported: ~1.007 (Error: -0.005) • The reason your iSpindels read low (~1.009 and ~1.007) compared to your manual FG (1.012) was indeed slope error. The formula from the previous ‘light’ batch (OG 1.036) was slightly too steep for this ‘moderate’ batch (OG 1.058). • What happened: The devices detected the large drop in gravity but ‘ran with it’ too far. They calculated a drop of ~50 points (e.g., 1.058 - > 1.008) when the beer actually only dropped ~46 points (1.058 -> 1.012). • The Physics: This confirms that the linear relationship established on a narrow range (28 points) needs to be ‘stretched’ to accommodate a wider range (46+ points).
* tilt Change: Slope adjusted from 0.002513 -> 0.002388. This makes it less aggressive on the drop, preventing the undershoot at the end. GM-WHITE [SG] Formula: 0.954872 + 0.002282 * tilt Change: Slope adjusted from 0.002418 -> 0.002282. Recommendation: These formulas are robust. You can now leave them as your permanent settings. For future brews, simply check the reading at pitch (e.g. 5 minutes in) and apply a small +/- offset in Brewfather if necessary, but the ‘curve’ itself is now solid.
to Batch #445) #447 Young’s Bitter. GM-BLUE (The Specialist): Remains on the Batch 445 Formula. Hypothesis: Since it was calibrated exactly on a 1.036 beer, it should hit the numbers perfectly (OG 1.036 / FG 1.008). GM-WHITE (The Generalist): Updated to the #446 Formula (derived from the stronger 1.058 beer). Hypothesis: We want to see if this ‘broader’ calibration (which covers a wider gravity range) is still accurate at the low end. IT ran the numbers to see what GM-WHITE (with the new formula) should read in a 1.036 wort, based on your previous data. GM-WHITE New Formula: 0.954872 + 0.002282 * tilt Expected Tilt for 1.036: ~36.20° (from Batch 445 data) Predicted Reading: 0.954872 + (0.002282 * 36.20) = 1.0375
(Universal) approach proved to be superior for the most critical part of fermentation: The Finish. Even though it started +0.002 high, it tracked the attenuation correctly and landed on the true FG. The GM-BLUE formula, while perfect at pitch, underestimated the final gravity, which could lead to false assumptions about attenuation. Update GM-BLUE to this new ‘Universal V2’ Formula: Derived from Batch 447 (OG 1.036 -> FG 1.008) Formula: 0.939791 + 0.002450 * tilt
V2’ formula on GM-BLUE performed exceptionally well. It is highly accurate at active fermentation temperatures. However, the final reading in your JSON file (1.0072) was artificially skewed by the cold crash. The Cold Crash Anomaly (Why it read 1.0072) • At the very end of the JSON log, the fridge dropped to 3.35°C, and GM- BLUE's reported SG plummeted to 1.0072. Why did this happen when the real beer was 1.009? • This is a quirk of GravityMon's software Temperature Compensation. When the liquid drops to 3°C, the water density increases, but the physical plastic/PET body of the iSpindel also contracts and shrinks in the cold. This physical shrinkage makes the device denser, altering its centre of gravity and making it sink lower than the liquid density alone would dictate. The result is an ‘over-correction’ downward by about ~0.002 to ~0.003 points when near freezing. The Formula: Do not touch it.
GravityMon formula New Slope & Intercept Until Zero offset achieved Extract JSON logs Match Angle to manual SG Calculate customised linear fit to refine the formula iSpindel floats in wort Transmits Angle & Temperature ‘Real time’ data (every 15 minutes) Readings logged in Brewfather User measures OG/FG manual hydrometer Refinement Process Result a more accurate gravity estimation without messing about with sugary water Five iterations – Batches #444 to #448
Stout 1.061 – FG 1.018 Calculation was WAY OFF N.B. • AI only answers the particular questions that IT is asked. • IT takes context from the data presented – the simple Degree 1 Linear formula was optimised for standard beers in the range 1.036—1.055. • However, above 1.060 a Degree 2 Quadratic Polynomial is necessary to fit the higher gravity curve! Updated GM-BLUE's formula Degree 2 Polynomial: -0.0000091 * tilt^2 + 0.003154 * tilt + 0.926577 PS #450 Oat Malt Stout, 1.060, has tracked OK for both WHITE & BLUE
very important • Interpreting and validation of recommendations equally so • Overall, an interesting exercise • iSpindels are good for fermentation tracking – use manual hydrometers to be sure of O.G. and F.G.
very important • Interpreting and validation of recommendations equally so • Overall, an interesting exercise • iSpindels are good for fermentation tracking – use manual hydrometers to be sure of O.G. and F.G.
data is the best it can be… Future projects to use the Brewfather reading data could be to – Compare fermentation performance i.e. repitching yeast from batch to batch – Predict final gravity after fermentation starts – Estimate the amount of carbonation (CO2 ) in beer.