Skip to content

feat: Allow heating of the boiler in standby#615

Open
jniebuhr wants to merge 2 commits into
masterfrom
feature/standby-heating
Open

feat: Allow heating of the boiler in standby#615
jniebuhr wants to merge 2 commits into
masterfrom
feature/standby-heating

Conversation

@jniebuhr

@jniebuhr jniebuhr commented Feb 25, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Added configurable standby temperature. When your device enters standby mode, it will now maintain a specific target temperature of your choice instead of powering down completely.
  • Style

    • Updated heating indicator color from blue to red for improved visual distinction and clarity.

@cla-bot cla-bot Bot added the cla-signed label Feb 25, 2026
@coderabbitai

coderabbitai Bot commented Feb 25, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a configurable standby heating temperature: a new standbyTemperature field is declared in Settings, persisted under key "sbtmp", returned by Controller::getTargetTemp() in MODE_STANDBY, and exposed for read/write through the WebUI settings API. Separately, the Heating theme color is changed from blue to red in both the SquareLine source and the generated LVGL constant.

Changes

Standby Temperature Feature

Layer / File(s) Summary
Settings data model and persistence
src/display/core/Settings.h, src/display/core/Settings.cpp
Adds getStandbyTemperature() getter, setStandbyTemperature(int) setter, and private int standbyTemperature = 0 member. Constructor loads from preferences key "sbtmp" (default 0); doSave() writes it back; setter calls save() immediately.
Controller MODE_STANDBY target temp
src/display/core/Controller.cpp
getTargetTemp() switch adds an explicit MODE_STANDBY case returning settings.getStandbyTemperature() instead of the default value of 0.
WebUI API read/write
src/display/plugins/WebUIPlugin.cpp
POST handler reads the standbyTemperature argument and calls setStandbyTemperature; the /api/settings JSON response now includes standbyTemperature from getStandbyTemperature().

Heating Theme Color Change

Layer / File(s) Summary
Heating color update
ui/Themes.slt, src/display/ui/default/lvgl/ui_themes.cpp
Changes the Heating color from blue (0x0069AD / [0,105,173,255]) to red (0xF62C2C / [246,44,44,255]) in both the SquareLine source (Default and Light themes) and the generated LVGL constant.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐇 Hopping through the code tonight,
Standby warmth now glows just right,
Blue has faded, red ignites,
"sbtmp" saved by morning light,
The boiler rests but never chills—
A cozy rabbit checks the fills! ☕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.89% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main feature being added: allowing the boiler to be heated while in standby mode. The changes implement standby temperature settings across the controller, settings, and UI layers.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/standby-heating

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@sonarqubecloud

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
web/src/pages/OTA/index.jsx (1)

67-83: Consider moving related useState declarations above this useEffect.

setRebuildProgress, setRebuilding, and setRebuilt are used in this effect's callback but their corresponding useState calls are declared further down at lines 111–113. While this is safe at runtime (the closure fires after the component function completes, past the const TDZ), it's non-idiomatic and makes the dependency between these hooks harder to follow at a glance.

♻️ Suggested reordering
+  const [rebuilding, setRebuilding] = useState(false);
+  const [rebuilt, setRebuilt] = useState(false);
+  const [rebuildProgress, setRebuildProgress] = useState({ total: 0, current: 0, status: '' });
+
   useEffect(() => {
     const listenerId = apiService.on('evt:history-rebuild-progress', msg => {
       setRebuildProgress({ ... });
       ...
     });
     ...
   }, [apiService]);

   // ... (remove the duplicate declarations at lines 111-113)
-  const [rebuilding, setRebuilding] = useState(false);
-  const [rebuilt, setRebuilt] = useState(false);
-  const [rebuildProgress, setRebuildProgress] = useState({ total: 0, current: 0, status: '' });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/src/pages/OTA/index.jsx` around lines 67 - 83, Move the related useState
declarations so they appear before the useEffect that references them: locate
the useState hooks that create setRebuildProgress, setRebuilding, and setRebuilt
and place them above the useEffect block (the one registering
'evt:history-rebuild-progress') so hook declaration order is consistent and
easier to read; ensure you only reorder those useState calls (not change their
names) and keep the effect implementation and apiService dependency unchanged.
web/src/pages/ShotAnalyzer/docs/PhaseEndStop_Algorithm_English.md (1)

15-15: Nit: Simplify redundant "points in time" phrasing (×2).

LanguageTool flags both occurrences of "points in time" as redundant — "points" alone conveys the same meaning.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/src/pages/ShotAnalyzer/docs/PhaseEndStop_Algorithm_English.md` at line
15, Simplify redundant phrasing by replacing both occurrences of "points in
time" with "points" in the sentence that begins "At the three points in time at
which we examine the data..." inside PhaseEndStop_Algorithm_English.md so it
reads "At the three points at which we examine the data..." (and similarly
change the later "these three points in time" to "these three points") to remove
repetition while preserving meaning.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/display/core/Settings.cpp`:
- Around line 427-430: The setter Settings::setStandbyTemperature should
validate and clamp incoming values before persisting; update it to clamp
standby_temperature to a safe range (use std::clamp with named constants like
MIN_STANDBY_TEMPERATURE and MAX_STANDBY_TEMPERATURE declared in the Settings
class or file) and then assign to standbyTemperature and call save(); if those
constants don’t exist, add them with appropriate bounds and use them in the
setter to ensure out-of-range (negative or excessively high) values are
normalized at the source of truth.

In `@web/src/pages/ShotAnalyzer/docs/PhaseEndStop_Algorithm_English.md`:
- Line 3: Remove or replace the empty "##" heading in
PhaseEndStop_Algorithm_English.md: either delete the bare "##" line if no
section is needed, or replace it with a meaningful heading title (e.g., "##
Phase End Stop Algorithm") or with a visual separator "---" if the intent was
solely visual; update the single "##" token in the file accordingly.

In `@web/src/pages/Statistics/utils/statisticsSearchDsl.js`:
- Around line 320-327: The free-text token list for __free currently returns
shotMeta fields including profile but omits profileName, causing __free queries
to miss matches that explicit profile: filters would catch; update the array
returned in the __free construction (the code that returns [shotMeta?.name,
shotMeta?.label, shotMeta?.title, shotMeta?.profile, shotMeta?.id,
shotMeta?.source]) to also include shotMeta?.profileName so free-text searches
cover the same profile data as field-specific matching.

---

Nitpick comments:
In `@web/src/pages/OTA/index.jsx`:
- Around line 67-83: Move the related useState declarations so they appear
before the useEffect that references them: locate the useState hooks that create
setRebuildProgress, setRebuilding, and setRebuilt and place them above the
useEffect block (the one registering 'evt:history-rebuild-progress') so hook
declaration order is consistent and easier to read; ensure you only reorder
those useState calls (not change their names) and keep the effect implementation
and apiService dependency unchanged.

In `@web/src/pages/ShotAnalyzer/docs/PhaseEndStop_Algorithm_English.md`:
- Line 15: Simplify redundant phrasing by replacing both occurrences of "points
in time" with "points" in the sentence that begins "At the three points in time
at which we examine the data..." inside PhaseEndStop_Algorithm_English.md so it
reads "At the three points at which we examine the data..." (and similarly
change the later "these three points in time" to "these three points") to remove
repetition while preserving meaning.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 14b7903 and e9d2f5f.

📒 Files selected for processing (37)
  • src/display/core/Controller.cpp
  • src/display/core/Settings.cpp
  • src/display/core/Settings.h
  • src/display/plugins/WebUIPlugin.cpp
  • src/display/ui/default/DefaultUI.cpp
  • src/display/ui/default/lvgl/screens/ui_StandbyScreen.c
  • src/display/ui/default/lvgl/screens/ui_StandbyScreen.h
  • src/display/ui/default/lvgl/ui_themes.cpp
  • ui/GaggiMate.sll
  • ui/GaggiMate.spj
  • ui/Themes.slt
  • ui/project.info
  • web/src/index.jsx
  • web/src/pages/OTA/index.jsx
  • web/src/pages/Settings/index.jsx
  • web/src/pages/ShotAnalyzer/components/AnalysisTable.jsx
  • web/src/pages/ShotAnalyzer/components/LibraryPanel.jsx
  • web/src/pages/ShotAnalyzer/components/NotesBar.jsx
  • web/src/pages/ShotAnalyzer/components/NotesBarExpanded.jsx
  • web/src/pages/ShotAnalyzer/components/ShotChart.jsx
  • web/src/pages/ShotAnalyzer/components/StatusBar.jsx
  • web/src/pages/ShotAnalyzer/docs/PhaseEndStop_Algorithm_English.md
  • web/src/pages/ShotAnalyzer/index.jsx
  • web/src/pages/ShotAnalyzer/services/AnalyzerService.js
  • web/src/pages/ShotAnalyzer/utils/analyzerUtils.js
  • web/src/pages/Statistics/components/MetricsTable.jsx
  • web/src/pages/Statistics/components/PhaseStatistics.jsx
  • web/src/pages/Statistics/components/StatisticsMultiSelectDropdown.jsx
  • web/src/pages/Statistics/components/StatisticsSearchHelp.jsx
  • web/src/pages/Statistics/components/StatisticsToolbar.jsx
  • web/src/pages/Statistics/components/StatisticsView.jsx
  • web/src/pages/Statistics/components/SummaryCards.jsx
  • web/src/pages/Statistics/components/TrendChart.jsx
  • web/src/pages/Statistics/utils/statisticsRoute.js
  • web/src/pages/Statistics/utils/statisticsSearchDsl.js
  • web/src/pages/Statistics/utils/trendBuckets.js
  • web/src/style.css

Comment on lines +427 to +430
void Settings::setStandbyTemperature(int standby_temperature) {
standbyTemperature = standby_temperature;
save();
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Clamp standby temperature in the backend setter.

Line 427 currently persists any integer (including negative or very high values). Since this value drives standby boiler targeting, add range validation at the source-of-truth setter.

🔧 Proposed fix
 void Settings::setStandbyTemperature(int standby_temperature) {
-    standbyTemperature = standby_temperature;
+    constexpr int kMinStandbyTemperature = 0;
+    constexpr int kMaxStandbyTemperature = 160; // keep aligned with controller/boiler safety limits
+    standbyTemperature = std::clamp(standby_temperature, kMinStandbyTemperature, kMaxStandbyTemperature);
     save();
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
void Settings::setStandbyTemperature(int standby_temperature) {
standbyTemperature = standby_temperature;
save();
}
void Settings::setStandbyTemperature(int standby_temperature) {
constexpr int kMinStandbyTemperature = 0;
constexpr int kMaxStandbyTemperature = 160; // keep aligned with controller/boiler safety limits
standbyTemperature = std::clamp(standby_temperature, kMinStandbyTemperature, kMaxStandbyTemperature);
save();
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/display/core/Settings.cpp` around lines 427 - 430, The setter
Settings::setStandbyTemperature should validate and clamp incoming values before
persisting; update it to clamp standby_temperature to a safe range (use
std::clamp with named constants like MIN_STANDBY_TEMPERATURE and
MAX_STANDBY_TEMPERATURE declared in the Settings class or file) and then assign
to standbyTemperature and call save(); if those constants don’t exist, add them
with appropriate bounds and use them in the setter to ensure out-of-range
(negative or excessively high) values are normalized at the source of truth.

3. In Step 3, Step 2 is repeated with the second sample of the following phase. If the correct target value is found here, the parameter is set and it is indicated that a review may be necessary.
# PhaseEndStop_Algorithm_English

##

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Remove or replace the empty ## heading.

An ## with no title text renders as an empty heading element in markdown, which is semantically incorrect and can cause accessibility issues with screen readers. If the intent is a visual separator, use --- instead; otherwise, remove it.

📝 Proposed fix
-##
-
 ## Simplified Explanation:
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
##
## Simplified Explanation:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/src/pages/ShotAnalyzer/docs/PhaseEndStop_Algorithm_English.md` at line 3,
Remove or replace the empty "##" heading in PhaseEndStop_Algorithm_English.md:
either delete the bare "##" line if no section is needed, or replace it with a
meaningful heading title (e.g., "## Phase End Stop Algorithm") or with a visual
separator "---" if the intent was solely visual; update the single "##" token in
the file accordingly.

Comment on lines +320 to +327
return [
shotMeta?.name,
shotMeta?.label,
shotMeta?.title,
shotMeta?.profile,
shotMeta?.id,
shotMeta?.source,
];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Free-text search misses profileName, creating inconsistent query behavior.

At Line 320-327, __free includes profile but not profileName, while profile: matching checks both. This can cause free-text queries to miss results that field queries would return.

💡 Suggested fix
     case '__free':
       return [
         shotMeta?.name,
         shotMeta?.label,
         shotMeta?.title,
+        shotMeta?.fileName,
+        shotMeta?.exportName,
         shotMeta?.profile,
+        shotMeta?.profileName,
         shotMeta?.id,
         shotMeta?.source,
       ];
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
return [
shotMeta?.name,
shotMeta?.label,
shotMeta?.title,
shotMeta?.profile,
shotMeta?.id,
shotMeta?.source,
];
return [
shotMeta?.name,
shotMeta?.label,
shotMeta?.title,
shotMeta?.fileName,
shotMeta?.exportName,
shotMeta?.profile,
shotMeta?.profileName,
shotMeta?.id,
shotMeta?.source,
];
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/src/pages/Statistics/utils/statisticsSearchDsl.js` around lines 320 -
327, The free-text token list for __free currently returns shotMeta fields
including profile but omits profileName, causing __free queries to miss matches
that explicit profile: filters would catch; update the array returned in the
__free construction (the code that returns [shotMeta?.name, shotMeta?.label,
shotMeta?.title, shotMeta?.profile, shotMeta?.id, shotMeta?.source]) to also
include shotMeta?.profileName so free-text searches cover the same profile data
as field-specific matching.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/display/core/Settings.cpp (1)

427-430: ⚠️ Potential issue | 🟠 Major

Clamp standby_temperature at the setter.

The setter persists any integer, including negative values or values exceeding the boiler's safe operating range. Since this value directly drives the boiler target in standby via Controller::getTargetTemp(), validate here (e.g., std::clamp with MIN_TEMP/MAX_TEMP or dedicated bounds) rather than relying on callers.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/display/core/Settings.cpp` around lines 427 - 430, Clamp the incoming
value in Settings::setStandbyTemperature before assigning and saving: validate
the standby_temperature parameter against the allowed min/max (e.g., use
std::clamp with MIN_TEMP and MAX_TEMP or explicit bounds) and assign the clamped
result to the standbyTemperature member, then call save(); this ensures
Controller::getTargetTemp() will only ever see a safe persisted standby
temperature.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/display/core/Controller.cpp`:
- Around line 411-412: getTargetTemp returns the standby temperature for
MODE_STANDBY but setTargetTemp lacks a MODE_STANDBY branch, so
raiseTemp()/lowerTemp() calls are ignored in standby; update
Controller::setTargetTemp to handle MODE_STANDBY by routing changes to
settings.setStandbyTemperature(...) (or otherwise persist the standby temp via
the settings API) and ensure the WebUI plugin (the handler that forwards remote
raise/lower requests) checks current mode (MODE_STANDBY) and either blocks
requests or routes them to the new standby-temperature path to prevent silent
drops.

---

Duplicate comments:
In `@src/display/core/Settings.cpp`:
- Around line 427-430: Clamp the incoming value in
Settings::setStandbyTemperature before assigning and saving: validate the
standby_temperature parameter against the allowed min/max (e.g., use std::clamp
with MIN_TEMP and MAX_TEMP or explicit bounds) and assign the clamped result to
the standbyTemperature member, then call save(); this ensures
Controller::getTargetTemp() will only ever see a safe persisted standby
temperature.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 46d90642-882a-4d96-9bd4-d11b1bd56a91

📥 Commits

Reviewing files that changed from the base of the PR and between e9d2f5f and 23bcdba.

📒 Files selected for processing (5)
  • src/display/core/Controller.cpp
  • src/display/core/Settings.cpp
  • src/display/core/Settings.h
  • src/display/plugins/WebUIPlugin.cpp
  • src/display/ui/default/DefaultUI.cpp
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/display/plugins/WebUIPlugin.cpp
  • src/display/core/Settings.h
  • src/display/ui/default/DefaultUI.cpp

Comment on lines +411 to +412
case MODE_STANDBY:
return settings.getStandbyTemperature();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
rg -nP -C3 '\b(raiseTemp|lowerTemp)\s*\('

Repository: jniebuhr/gaggimate

Length of output: 3661


🏁 Script executed:

cat -n src/display/core/Controller.cpp | sed -n '410,440p'

Repository: jniebuhr/gaggimate

Length of output: 1144


🏁 Script executed:

rg -n "MODE_STANDBY" src/display/core/Controller.cpp -A 2 -B 2

Repository: jniebuhr/gaggimate

Length of output: 1802


🏁 Script executed:

fd -e cpp -e h | xargs rg -l "standby.*[Ss]creen|Standby.*[Ss]creen" | head -10

Repository: jniebuhr/gaggimate

Length of output: 221


🏁 Script executed:

cat -n src/display/ui/default/lvgl/screens/ui_StandbyScreen.h

Repository: jniebuhr/gaggimate

Length of output: 1179


🏁 Script executed:

rg -n "StandbyScreen|standby" src/display/ui/default/DefaultUI.cpp | head -20

Repository: jniebuhr/gaggimate

Length of output: 1816


🏁 Script executed:

rg -n "onBrewTempRaise\|onBrewTempLower\|onSteamTempRaise\|onSteamTempLower" src/display/ui/default/lvgl/ui_events.cpp -B 5 -A 2

Repository: jniebuhr/gaggimate

Length of output: 44


🏁 Script executed:

rg -n "onBrewTempRaise|onSteamTempRaise|onBrewTempLower|onSteamTempLower" src/display/ui/default/lvgl/ui_events.cpp -B 10 -A 2 | head -60

Repository: jniebuhr/gaggimate

Length of output: 1038


🏁 Script executed:

rg -n "lv_obj_add_event_cb.*Temp" src/display/ui/default/lvgl/ -r 'match'

Repository: jniebuhr/gaggimate

Length of output: 455


🏁 Script executed:

fd -e cpp -o -e h | xargs rg "ui_StandbyScreen.*event\|StandbyScreen.*raiseTemp\|StandbyScreen.*lowerTemp"

Repository: jniebuhr/gaggimate

Length of output: 180


🏁 Script executed:

rg -n "req:raise-temp|req:lower-temp" src/display/plugins/WebUIPlugin.cpp -B 5 -A 3

Repository: jniebuhr/gaggimate

Length of output: 719


🏁 Script executed:

rg -n "MODE_STANDBY.*raise|MODE_STANDBY.*lower|getMode\(\).*STANDBY" src/display/plugins/WebUIPlugin.cpp

Repository: jniebuhr/gaggimate

Length of output: 44


raiseTemp()/lowerTemp() won't persist when in standby.

getTargetTemp() returns the standby temperature for MODE_STANDBY, but setTargetTemp() (lines 418-434) has no MODE_STANDBY case, so adjustments via raiseTemp()/lowerTemp() while in standby are silently dropped. The regular UI mitigates this by not exposing temperature controls on the standby screen. However, the WebUI plugin (lines 316-319) lacks a guard against temperature adjustment requests in standby mode—if the WebUI exposes such controls, consider either routing to settings.setStandbyTemperature(...) or adding a mode check.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/display/core/Controller.cpp` around lines 411 - 412, getTargetTemp
returns the standby temperature for MODE_STANDBY but setTargetTemp lacks a
MODE_STANDBY branch, so raiseTemp()/lowerTemp() calls are ignored in standby;
update Controller::setTargetTemp to handle MODE_STANDBY by routing changes to
settings.setStandbyTemperature(...) (or otherwise persist the standby temp via
the settings API) and ensure the WebUI plugin (the handler that forwards remote
raise/lower requests) checks current mode (MODE_STANDBY) and either blocks
requests or routes them to the new standby-temperature path to prevent silent
drops.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@lib/GaggiMateController/src/ControllerConfig.h`:
- Around line 222-223: The trailing comment next to the ControllerConfig
GM_STANDARD_REV_3X constant is stale after changing autodetectValue to 6; update
or remove it and add a brief note explaining why 6 was chosen (and why 5 is
skipped) so future readers understand the detection mapping in detectBoard(),
and ensure no other entries like GM_STANDARD_REV_2X still clash with this value;
also add a short sentence to the PR description noting that hardware-detection
behavior was changed (autodetectValue change) for traceability.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b137ba42-e187-4be3-be18-63a8ca0a09c6

📥 Commits

Reviewing files that changed from the base of the PR and between 23bcdba and 73664a1.

📒 Files selected for processing (1)
  • lib/GaggiMateController/src/ControllerConfig.h

Comment thread lib/GaggiMateController/src/ControllerConfig.h Outdated
@sonarqubecloud

Copy link
Copy Markdown

# Conflicts:
#	src/display/core/Settings.cpp
#	src/display/core/Settings.h
#	src/display/ui/default/DefaultUI.cpp
#	src/display/ui/default/lvgl/screens/ui_StandbyScreen.c
#	src/display/ui/default/lvgl/screens/ui_StandbyScreen.h
#	ui/GaggiMate.sll
#	ui/GaggiMate.spj
#	ui/project.info
#	web/src/index.jsx
#	web/src/pages/Settings/index.jsx
#	web/src/pages/ShotAnalyzer/components/AnalysisTable.jsx
#	web/src/pages/ShotAnalyzer/components/LibraryPanel.jsx
#	web/src/pages/ShotAnalyzer/components/NotesBar.jsx
#	web/src/pages/ShotAnalyzer/components/NotesBarExpanded.jsx
#	web/src/pages/ShotAnalyzer/components/ShotChart.jsx
#	web/src/pages/ShotAnalyzer/components/StatusBar.jsx
#	web/src/pages/ShotAnalyzer/index.jsx
#	web/src/pages/ShotAnalyzer/services/AnalyzerService.js
#	web/src/pages/Statistics/components/MetricsTable.jsx
#	web/src/pages/Statistics/components/StatisticsMultiSelectDropdown.jsx
#	web/src/pages/Statistics/components/StatisticsSearchHelp.jsx
#	web/src/pages/Statistics/components/StatisticsToolbar.jsx
#	web/src/pages/Statistics/components/StatisticsView.jsx
#	web/src/pages/Statistics/components/SummaryCards.jsx
#	web/src/pages/Statistics/components/TrendChart.jsx
#	web/src/pages/Statistics/utils/statisticsSearchDsl.js
@jniebuhr jniebuhr force-pushed the feature/standby-heating branch from 06807e9 to 70b3127 Compare June 15, 2026 11:51
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant