Repository navigation
Releases: Zwer2k/ardumower-mowmate
Release list
v1.9.0
Release Notes v1.9.0
This release makes mower firmware uploads work again, stops the modem from mixing up answers between CaSSAndRA and its own status polls, and makes map management safe: no more lost or half-written maps, and every failed operation is reported. It also warns before uploading a map too large for the mower, calculates waypoints faster, draws the mowing map on the live map and redesigns the status dashboard.
Firmware Upload
- Mower firmware uploads work again. They failed with "Upload request failed" and the modem restarted (last reset:
task-wdt). The modem wrote every piece of the upload to its flash storage while receiving it, and the storage sometimes blocked for seconds while it cleaned up. The modem now keeps the firmware in PSRAM and flashes the mower directly from there, as it already did for its own firmware. Modems without PSRAM (classic ESP32) still use the flash storage. - New mower capability Mower firmware upload. When off, the firmware dialog offers only the modem firmware and the modem rejects mower firmware uploads. Useful for mowers without the STM32 boot lines, such as the ArduMower PCB 1.3 / 1.4.
Mower Communication
- CaSSAndRA and other clients connected through the modem no longer get answers meant for the modem's own status polls. The modem sent its polls without waiting for the answer, so a client's next command received the wrong line. CaSSAndRA then repeated its command every second, and Sunray printed
absolutePosSource=0 lon=0.00000000 lat=0.00000000over and over. - Commands sent while the connection to the mower is busy are queued instead of dropped. A Stop, Start or Dock from the web interface could get lost silently before.
Map Upload to the Mower
- Before an upload, the modem estimates from the mower's free memory whether the map fits. The map status shows the points next to the estimated limit, in red when the map is too large, and both upload buttons ask before uploading it. Sunray otherwise stops such an upload with "setPoint: OUT OF MEMORY" and switches to an error. On a MOW800 board with about 19.6 KB free memory the limit is roughly 1800 points.
- When the mower stops accepting map points during an upload (usually out of memory), the modem cancels right away instead of retrying, and the browser shows the reason with the point where it stopped. Sunray itself refused every further upload after an out-of-memory error until it was restarted; that is fixed in Sunray (branch
fix/map-upload-oom-recovery). - The "not synced — upload" button in the map editor starts the upload reliably. It resent the whole map first and waited for the modem's confirmation; when that got lost, nothing happened. It now uploads directly when the editor has nothing left to sync, and reports an error instead of retrying forever.
- Saving, calculating and uploading report when the modem does not respond, instead of hiding the progress indicator silently after 30 seconds.
Map Management
- A scheduled start no longer replaces the current map with a "Map N" copy. The modem took its own upload to the mower for a map uploaded by another program.
- A broken map transfer from another program no longer leaves a half map behind that Save, Upload and Export would then use.
- Saving, renaming and deleting leave the map list intact when the storage is full or a write fails. Before, maps that could not be loaded appeared in the list, or a map vanished after a restart.
- Every map operation reports when it fails: create, copy, load, save, rename, delete, discard, default map and import. Before, failures were silent, and a failed save could even clear the unsaved mark.
- New, Copy, Discard and Import work while a map is being transferred to the browser. "Discard, then New map" always failed silently.
- Import creates its own map with a unique name. It reused the current map's name, was rejected, and still put the imported map and mow settings on the current map.
- Map names are compared without regard to upper and lower case, as on the modem.
- Renaming only updates the map index instead of rewriting the whole map file.
- Deleting the current map switches to the default map, with its saved changes.
- Scheduled mowing follows a renamed map. Entries of a deleted map are disabled, and the delete dialog lists them.
- The map list is sorted by name, marks the map that is on the mower and shows the date a map was last saved. Maps saved with earlier versions show a date after their next save.
- The default-map star is disabled for unsaved maps.
- Switching a mow area toggle no longer transfers the whole map to the browser again. The toggle only changes the mow settings, but the modem marked the map as changed and resent all waypoints with the loading overlay.
- Map transfers between modem and browser send larger batches, and editing a large map no longer resends all waypoints with every change.
Waypoint Calculation
- Waypoints are calculated faster. The check whether a connection between two mowing lines stays free of exclusions ran tens of thousands of times per calculation, allocated memory each time and tested every edge of the area with double-precision math, which the ESP32-S3 can only emulate in software. It now reuses its memory and skips edges far away from the connection with a quick single-precision check. On a PC this saves about a third of the time with the same routes; the gain on the modem is expected to be larger. The calculated routes are unchanged.
Live Map
- The live map draws the mowing map on the OpenStreetMap background: perimeter, exclusions, docking path and, optionally, the route. Map and Route in the toolbar switch them on and off.
- New buttons Mower position and Map position center the view on the mower or show the whole mowing map. On opening, the live map shows the mowing map.
- The live map can zoom in further (up to level 22), so a small garden fills the screen.
- The map is placed with the reference longitude/latitude from the Position settings (mode Absolute). In mode Relative, the live map derives the reference from the mower's GPS position with an RTK fix and its map position, and shows "Map ref: GPS".
- Without a GPS position, the mower marker is placed via the map reference again. The live map read the reference from a setting that did not exist, so the marker never appeared that way, and its heading was off.
User Interface
- The status dashboard has the style of the main dashboard: a summary strip with colored status tags and cards for mower, battery, position & GPS, mowing statistics, faults & recoveries, mower controller, modem and sensors. Durations show as hours and minutes, a bar shows how much of the mowing time had a GPS fix, and the new modem card shows firmware, uptime, last reset, WiFi signal, channel, IP, transmit power and memory use.
Documentation
- New wiring page for the ArduMower PCB 1.3 / 1.4 (
docs/pinout-pcb.md) with the ESP32-S3 wiring plan, connections and jumper settings. The MOW800 page is nowdocs/pinout-mow800.md.
Upgrade Notes
- To get mower firmware uploads working, the modem itself needs this release first. If its web upload fails too, install it over USB.
- Maps saved with earlier versions keep working; the map list shows their date after the next save.
- Sunray should run the
fix/map-upload-oom-recoverychange so that uploads work again after an out-of-memory error without restarting the mower.
v1.8.0
Release Notes v1.8.0
This release fixes firmware uploads that crawled, failed or turned red although they succeeded, gets modems with a weak on-board antenna onto WiFi, and makes WiFi faster while Bluetooth is on. Saving a map now shows its progress, all progress appears in one overlay, and the settings show how much storage and memory is in use.
Firmware Upload
- An aborted upload no longer leaks memory. Each aborted modem upload kept its 3 MB buffer, so after two aborts no further upload got one (measured: 1.8 of 8 MB PSRAM free). Aborted uploads now release the buffer, and mower upload sessions, which were never released, are released too.
- The progress no longer turns red while the modem flashes. On the ESP32-S3 the firmware is flashed after the upload, and flashing plus restart often take longer than the 30 seconds the browser waited. It now waits up to 5 minutes and turns green as soon as the modem is back.
WiFi
- Modems that loop on
Reason: 2 - AUTH_EXPIREand get no IP address connect within seconds. Some ESP32-S3 boards transmit distorted at full power although the signal is good. After three failed logins at a good signal the modem lowers its transmit power step by step (19.5, 15, 11, 8.5 dBm) and remembers the level that worked. Before, such a modem needed a minute or more, or did not connect at all. - Failed logins at a weak signal, for example when the mower is far from the access point, no longer lower the power. If even 8.5 dBm keeps failing, the modem goes back to full power instead of staying low.
- The modem retries on its own when a login attempt fails and no new attempt follows within 5 seconds. Before, it could wait 30 seconds for the WiFi health check.
- New setting Transmit power for WiFi client mode: Automatic (default) or a fixed 19.5, 15, 11 or 8.5 dBm. A board with a poorly matched on-board antenna can transmit cleaner with less power: one test board reached the router at only 5.5 Mbps with 44.8 % retries from 3 m away. Lower power also shortens the range, so boards with an external antenna should stay on Automatic.
- The log shows the transmit power and the signal strength of failed logins.
Bluetooth
- Bluetooth leaves WiFi much more airtime. It advertised every 3.75 to 11.25 ms and kept connections at 2.5 to 12.5 ms, both below what the Bluetooth standard allows, and occupied the shared radio almost all the time, even without a connected app. It now advertises every 500 to 1000 ms and connects at 30 to 60 ms. The app needs 1 to 2 seconds to find the modem.
- The Bluetooth settings explain that Bluetooth slows down WiFi: while Bluetooth is on, the modem has to keep WiFi in power-save mode. Measured with Bluetooth on before this release: about 190 ms response time and 6 to 9 KB/s, compared with 30 ms and 300 to 570 KB/s with Bluetooth off.
Map
- Saving a map shows its progress in percent, from preparing the data to writing the file. Before, saving gave no feedback.
- Saving and calculating show a progress indicator right after the click. Before, it only appeared once the modem started, after the edited map had been transferred to it.
- Each status message to the browser copied the whole map, thousands of waypoints, only to read the dock position. It now reads just the dock points, which speeds up status updates and progress reports.
User Interface
- All progress uses one overlay. The green bar under the header is gone: calculating, saving, clearing and uploading to the mower show the same panel as loading a map.
- The dashboard mini map shows the map loading progress, like the editor.
- A new Storage group in the settings shows the use of the flash storage for maps and settings, of internal RAM (including the lowest free value since start) and of PSRAM, refreshed on demand.
- Toggle and selection settings show their help texts. The mower settings already had texts that were never displayed.
- The heartbeat log line is no longer cut off. It shows only the reset reason; the details stay in the lines logged at boot.
Upgrade Notes
- If a modem loses large packets or stalls during uploads although the signal is good, set Transmit power to 11 or 8.5 dBm, or use a board with an external antenna. The router's receive rate for the modem shows which setting works best.
- If an upload from the web interface keeps failing on a modem with a poor connection, install this release over USB.
- Saving the settings restarts the modem, as before.
v1.7.0
Release Notes v1.7.0
This release makes routes on maps with many exclusions safe: connection lines no longer cut through exclusions or leave the perimeter. It also stops the modem from restarting after a waypoint calculation, shows the calculation progress in percent, imports CaSSAndRA maps that were exported without a reference position, and makes WiFi much faster when Bluetooth is not used.
Route Planning
- Connection lines stay inside the perimeter and outside every exclusion. On maps with many exclusions they cut straight through exclusions and across bays outside the perimeter. This affected the connections inside the mowing pattern, the transitions between border laps, and the connection from the border laps to the pattern.
- Connections now follow the shortest free path around exclusions and perimeter corners and keep 3 cm away from exclusion edges. Inside the mowing pattern they stay within the mowing area first, so the configured distance to border is kept.
- The final route check covers exclusions too. Before, it only checked the perimeter.
- Route simplification no longer removes the corner points of a detour, which turned a correct detour back into a straight line through an exclusion.
- The calculation shows its progress in percent, followed by "Sending route" at 96 %. Before, the progress bar stayed at 0 % until the calculation finished.
Stability
- The modem no longer restarts after calculating waypoints. Its internal RAM ran out (as little as 528 bytes free) because the framework only placed blocks of 4 KB and larger in PSRAM, while the 8 MB PSRAM stayed almost unused. Blocks of 512 bytes and larger now go to PSRAM, and during the calculation almost everything does.
- Messages to the browser are no longer dropped for lack of memory when they fit in PSRAM. Large messages are checked against PSRAM instead of internal RAM.
- The restart on a fragmented heap waits until the condition has lasted 10 seconds. Short drops, for example while a large map is sent to the browser, no longer restart the modem.
- After a restart, the log shows why it happened: the reset reason (power-on, software, crash, watchdog, brownout), the cause of a deliberate restart with heap values, the operation that was running, and the last waypoint calculation. The heartbeat repeats the reset reason and now includes free PSRAM.
WiFi
- With Bluetooth disabled, WiFi power save is turned off in client (STA) mode. Measured on an ESP32-S3: ping dropped from 191 ms to 32 ms on average, and downloads went from 6–9 KB/s to 290–570 KB/s. Firmware uploads and map transfers are correspondingly faster.
- After connecting, the log shows signal strength, channel and power save state.
Map Import
- CaSSAndRA GeoJSON files exported without a configured reference position can be imported. CaSSAndRA then writes small degree offsets around 0,0 instead of real coordinates, and the import rejected them against the modem's reference position.
- In Relative position mode, GeoJSON import and export ignore the hidden reference longitude/latitude and use 0,0. A file with real WGS84 coordinates shows a hint to switch to Absolute mode.
- The import dialog has a file picker and detects whether a file is CaSSAndRA GeoJSON or Grauonline JSON.
Map Editor
- The point counts start with Total, followed by area, perimeter, dock, way and sync state. The exclusions come last.
- From 10 exclusions on, the exclusion list scrolls and keeps the selected exclusion in view.
Upgrade Notes
- Disable Bluetooth in the modem settings if you do not use it, then restart the modem. ESP-IDF requires WiFi power save while Bluetooth is enabled, so the WiFi speedup only applies without Bluetooth.
- Recalculate the waypoints of maps with exclusions and upload them to the mower. Routes calculated with earlier versions may still contain lines through exclusions.
- The waypoint calculation takes slightly longer than before because every connection is checked against the exclusions.
v1.6.4
Release Notes v1.6.4
This patch release makes the WiFi access point visible on boards where phones and laptops could not find it.
WiFi
- The access point now sends at 8.5 dBm instead of 20 dBm. On some ESP32-S3 boards the access point started without errors, but no device listed it: at full power these boards send beacons that phones and laptops cannot decode.
- Client (STA) mode is unchanged and still uses full transmit power.
Upgrade Notes
- The access point has a shorter range than before. Set up the modem from close by.
v1.6.3
Release Notes v1.6.3
This patch release fixes the WiFi access point disappearing shortly after it started.
WiFi
- The access point stays up in AP mode. The WiFi health check, meant to restore a lost connection to your home network, also ran in AP mode, where there is no such connection. Every 30 seconds it started a recovery that switched the radio back to client mode whenever home network credentials were stored, so the access point vanished before a phone or laptop could find it.
- The connection recovery now runs only in client (STA) mode. The restart on a fragmented heap still works in every mode.
- The access point log shows the default password as
"ArduMower Modem" (default)when it is in use. It showed(configured)before, because the settings are pre-filled with the default values.
Upgrade Notes
- Without a configured home network, or when the modem cannot reach it, the access point is still opened for 5 minutes only. Set the WiFi mode to AP to keep it on permanently.
v1.6.2
Release Notes v1.6.2
This release changes only the build pipeline. The firmware is identical to v1.6.1.
Web Installer
- The web installer no longer loses its stable channel after a release. Pushing a release tag together with
mainstarted two builds; the one formainpicked the new release before its files were uploaded and published an installer that reported "No firmware has been published for this channel yet". - The stable channel now uses the newest release whose installer files are all uploaded, and falls back to the previous release while a new one is still being published.
- A commit that carries a release tag is published by the tag's own build, after its release is complete.
v1.6.1
Release Notes v1.6.1
This patch release makes the WiFi access point log tell you how to connect to the modem.
WiFi
- When the access point starts, the log shows SSID, password, IP address, MAC address and channel as one block, one value per line. Previously it showed only the IP address, so a freshly flashed modem gave no hint which network to join.
- The built-in default password is printed in plain text, since it is public anyway. A password you configured yourself appears as
(configured), because the log is also visible in the web UI. - A failed access point start, for example because the configured password is shorter than 8 characters, is now logged as an error instead of being ignored.
v1.6.0
Release Notes v1.6.0
This release adds cutter speed control and live motor data, makes the mower settings survive a mower reboot, and introduces a browser-based installer that flashes a board without a local toolchain. It also fixes a defect that could overwrite the wrong map when the modem restarted during editing, and makes stored data survive a power loss during a save.
Map Editor
- A modem restart while editing no longer overwrites the wrong map. Unsaved edits live only in the modem's RAM; after a restart it loads its default map, and the editor kept sending its edits under whatever map the modem reported, so saving wrote them into the default map.
- The editor now pins the map it is editing. Edits and saves always go to that map, and the save request carries the map id, so the modem refuses to save a request meant for another map.
- After a reconnect the editor restores the map it was editing and re-sends its changes, retrying while the modem is still busy. A message confirms the restore; save to keep the changes.
- The Save button stays enabled after a restore. The modem reports the reloaded map as clean until the changes arrive, and that report used to clear the unsaved state; a stale reactive value could also leave the button disabled until the page was reloaded.
- If the edited map cannot be restored (a new map that was never saved, or five failed attempts), editing stops with a message and the current map is reloaded. Nothing is written to another map.
- After a reconnect the map is transferred once instead of twice, and loading a map no longer fails while a transfer to the browser is still running.
- The goto target controls appeared both in the toolbar and on the map. The toolbar copy is gone; the controls on the map remain.
Data Safety
- Settings, the mowing schedule, the map index and map files are written atomically. A power loss during a save, for example when the battery runs empty, used to leave a truncated file: a broken map index made every map disappear, a broken settings file fell back to defaults including the WiFi credentials. Now either the old or the new content survives.
- A full flash filesystem is reported as a failed save. Previously a truncated file counted as saved.
- Renaming a map whose file could not be read replaced the whole map with nothing but its name and metadata. The file is now left untouched.
AT+Wwaypoint commands with a negative index or a jump of more than 1000 points are rejected. A negative index wrote outside the waypoint buffer, and a huge one exhausted the heap.
Remote Control
- Added a cutter speed slider (10–100 %). It sets Sunray's mow motor PWM limit (
AT+Cfield 9); the conversion from percent stays in the UI. - Fixed the mow height slider, which had no effect: it sent
AT+S2, which Sunray treats as an obstacle list request and ignores. It now uses the actual setter,AT+Cfield 10. - The Sonar checkbox shows the last state that was sent. It always showed "off" because the popover is rebuilt on every open and the state was never tracked. Note that this switch also controls the bumper's near-obstacle detection in Sunray.
- The waypoint position is set with five decimals instead of two. Two decimals moved the target in steps of 1 % of the route, which is 50 waypoints on a 5000-point map.
- Clicking the waypoint percentage opens a field for the exact waypoint number, and the +/- buttons move exactly one waypoint. The value follows the mower's progress only while it is mowing, so it no longer overwrites a target you picked, and it survives closing the popover.
- Clicks on controls that remove themselves no longer close the popover.
Mower Settings
- Speed, fix timeout, finish & restart, cutter speed and mow height are re-sent once after the modem has connected to the mower. Sunray keeps them only in its SD state file, which most boards never restore (the MOW800 has no SD slot), so they were lost on every mower reboot.
- Cutter speed and mow height are stored with the other mower settings, and "Set as Default" saves the values that were actually commanded.
- New "Mower capabilities" settings — cutter speed, cutter height, sonar — hide the controls for hardware the mower does not have. Sunray does not report its capabilities, so they are declared here. All are enabled by default; existing installations are unchanged. "Reset to Defaults" keeps them.
Dashboard
- Added live motor data: RPM of both wheels and the mow motor, mow motor PWM and motor currents, polled every 5 seconds (
AT+S5). - A history chart on the main dashboard covers a whole mowing run. The buffer holds 240 samples and halves its resolution when full, so it never allocates during a run.
- The data is also available at
GET /api/robot/motor_rpm.
Firmware Updates
- The firmware dialog no longer switches to the GitHub source while a file upload is running. A release list arriving mid-upload used to flip the view and hide the upload progress.
Web Installer
- Boards can now be flashed from a desktop Chrome, Edge or Opera over Web Serial, without installing a toolchain. The installer is published on GitHub Pages and detects whether an ESP32 or ESP32-S3 is connected.
- A switch selects the stable release or the nightly build.
- Every release now includes
boot_app0.bin, which the installer needs. - See
docs/web-flasher.mdfor flash offsets and browser requirements.
Build
- Removed the unused Concourse CI pipeline inherited from the original import. CI runs on GitHub Actions only.
Upgrade Notes
- The web installer asks "Erase device?" on every flash. Leave the checkbox unticked to keep maps, schedules and settings; ticking it wipes them together with the WiFi credentials.
- If your mower has no sonar, no cutter height adjustment or no cutter speed control, disable the matching entry under "Mower capabilities" to hide the control.
- Overwriting a map now briefly needs space for the old and the new file at once. On an almost full filesystem a large map can fail to save; the previous version stays intact and the log reports the error.
- Cutter speed and mow height are applied to the mower after every modem restart. Check the stored defaults if the mower suddenly mows with a different height or speed.
v1.5.0
Release Notes v1.5.0
This release moves the firmware update check onto the modem, adds a route quality check after waypoint calculation, and brings undo/redo and keyboard editing to the map editor. It also fixes several map storage and scheduling defects that could silently lose edits.
Firmware Updates
- The modem now checks GitHub for new releases itself, in the background: once 60 seconds after it becomes operational and every 6 hours after that. The browser no longer contacts GitHub at all.
- A new info icon appears in the header next to the remote control as soon as a newer stable release exists, and opens the firmware dialog.
- The version list in the dialog comes from the modem and keeps the 10 newest installable releases — stable
vX.Y.Ztags that carry a firmware asset for the connected board. - GitHub is offered as an update source only after the modem has confirmed it reached GitHub. Before that the dialog reports that a check is running instead of claiming GitHub is unreachable.
- Blocked checks name their reason — no WiFi, unsynchronized clock, or a running update — instead of reporting a generic failure, and are retried every 60 seconds.
- Fixed the release list arriving empty:
HTTPClient::getStream()hands out the raw socket, so a chunked response carries its chunk lengths inside the JSON. The parser read the first length as a number, discarded it against the filter and reported an empty document without an error. Chunked responses are now decoded before parsing. - Firmware status travels over the existing UI WebSocket (
requestFirmwareStatus/firmwareStatus) instead of a separate REST endpoint and polling loop. - Added debug logging for the whole check: scheduling, DNS, HTTP response, transfer encoding, one line per examined release with the reason it was accepted or skipped, and the resulting selection.
Route Check
- After every waypoint calculation the modem runs a quality check over the finished route and reports length, waypoint count, rotations on the spot, steered corners and estimated mowing time.
- Findings cover corners the line tracker cannot follow cleanly, adjacent overlapping corners and zero-length segments. The thresholds mirror Sunray's line tracker, so the report matches what the mower will actually do.
- The check never modifies the route and never blocks an upload.
- Findings in the report are clickable: selecting one marks the waypoint on the map and, with the editor open, selects it for correction right away.
- Two new per-map settings drive it: a route simplification threshold that removes nearly collinear waypoints, and a minimum turn radius used only for the report.
Map Editor
- Added undo/redo with a 50-step history. A snapshot is taken once per finished gesture, so dragging a point across the canvas is a single undo step.
- Added keyboard editing: Del removes the selected point, Escape cancels draw mode or clears the selection, Ctrl+Z and Ctrl+Y undo and redo. Text inputs are excluded.
- Incoming map transfers no longer overwrite the editor state. Previously every debounced edit made the backend broadcast the map back, reverting edits made in the meantime.
- Editing waypoints now works on the full list instead of the list filtered by the mow-area toggles, which previously dropped hidden points on a drag and misapplied filtered indices.
- Hit areas follow the pointer actually in use rather than the device's touch capability, so mouse users on touch-capable laptops no longer select points from far away. Touch targets are a constant size on screen at every zoom level.
- On overlapping elements the nearest one is selected instead of the one drawn last, which previously made short edges unselectable under endpoint hit circles.
- The compass reacts to pointer events, so the map can be rotated on touch devices.
- Dragging a point keeps its metadata (delta, sol, timestamp, and for waypoints the planner tag and connector flag the mow-area toggles depend on).
- The "unsaved changes" dialog has a Cancel button; closing it with Escape or X no longer discards the changes.
- Maps with unsaved changes are marked in the dropdown, and the sync indicator in the overlay triggers the upload.
- Rejected map syncs are retried instead of being lost when the backend was streaming to clients.
Map Storage and Scheduling
- Saving a new map no longer writes into an existing map with the same geometry hash. "Copy" followed by "Save" created a rename instead of a second map.
- Deleting the default map falls back to the first remaining map immediately, instead of leaving no active map until the next reboot.
- Deleting the loaded map picks up the replacement's CRC and mow settings and clears the deleted map's draft state.
- Scheduled runs use the stored map instead of the RAM draft, so a scheduled run can no longer mow with unsaved edits, and no longer switch the map underneath an open editor.
- Queueing an upload resets the transfer phase, so the scheduler can no longer start mowing on the previous upload's success report.
- Border settings (
distanceToBorder,borderLaps,mowBorderCcw) are serialized to SPIFFS. They were never written and fell back to defaults on load. distanceToBordercounts track widths, not metres. The dialog is labelled accordingly, steps in whole numbers and defaults to 1; the previous default of 0.3 was truncated to 0 and disabled the offset it was meant to enable.- A schedule entry can no longer be created for a map that was never saved.
- The map hash is computed when it is needed instead of on every edit, which previously ran an MD5 over the serialized geometry several times per second while dragging.
Logging
- Every log line reaches the browser. The modem streamed only the last six lines per update and at most once per 100 ms, so anything above 60 lines/s was dropped silently.
- Missing ranges are marked in the log view where they actually occur. The previous marker followed the scroll position rather than the data.
- Locally trimmed lines are reported above the list.
Connection Stability
- Upgraded ESPAsyncWebServer to 3.12.1 with AsyncTCP 3.5.0. Version 3.11.1 tore WebSocket frames when the payload did not fit the TCP send window, which made browsers report a UTF-8 or frame header error and drop the connection, typically right after connect.
sanitizeUtf8InPlace()returns without allocating when the string is plain ASCII, which is the case for all serialized JSON.
Dashboard
- The mowing time is shown in the unit it is labelled with. The mower reports seconds; the tile divided by 60 and labelled the result "h", showing minutes under an hours label. Below an hour it now shows whole minutes, above it hours with one decimal.
Build
- Reduced the classic ESP32 image by 34 KB by disabling Arduino core logging on that target. Free flash grows from 65 KB to 100 KB. Panic backtraces and the modem's own log are unaffected; the ESP32-S3 keeps core logging at INFO.
- Removed the unused
AUnitandArduinoWebsocketsdependencies and a redundant-Ogoverride from the classic ESP32 environment. The hardware test build usesarduino-cliwith its own library list and is unaffected. - Path planner tests build into
test_pathplanner/build/and are no longer tracked; four test binaries of about 300 KB each had slipped into the repository.
Upgrade Notes
- Maps saved before this release lost their border settings. They come back as one track width and one lap and need to be set once more.
- The firmware check requires internet access and a synchronized system clock on the ESP, because the GitHub certificate cannot be validated otherwise. Until the clock is set, the dialog reports this instead of offering GitHub.
- Whether an update exists is now decided by the modem alone. A browser without internet access no longer affects the update indicator or the version list.
- Debug logging for the firmware check is available at the DBG modem log level and costs nothing at INFO.
v1.4.0
Release Notes v1.4.0
This release adds integrated modem firmware updates from GitHub, improves connection recovery and diagnostics, and fixes release packaging for both supported ESP targets.
Firmware Updates
- Added firmware updates to the main header overflow menu and highlights the entry when a newer stable modem firmware release is available.
- The ESP downloads target-specific modem firmware directly from GitHub, avoiding browser CORS restrictions.
- ESP32-S3 devices buffer the complete download in PSRAM before flashing, while classic ESP32 devices stream directly into the OTA partition.
- Selects the latest compatible release by default while allowing installation of older compatible versions.
- Filters release assets by the connected modem target to prevent cross-flashing ESP32 and ESP32-S3 firmware.
- Validates release versions and constructs the fixed GitHub download URL on the ESP to prevent arbitrary download targets.
- Shows separate download and flash progress for PSRAM-buffered ESP32-S3 updates and combined progress for streaming ESP32 updates.
- Uses the GitHub OTA status endpoint as the single source of progress and success, avoiding a second WebSocket and unnecessary API polling while TLS is active.
- Reports success only after the ESP confirms the completed flash and the modem subsequently restarts.
- Reports HTTP, transport, TLS, stream, and flash errors directly in the update dialog.
- Includes the USERTrust ECC root certificate required by GitHub's current Sectigo TLS chain.
- Keeps local file uploads available for modem firmware and Sunray mower firmware.
- Shows GitHub as an update source only for modem firmware; Sunray mower firmware still requires a local BIN file.
- Retries update discovery after the modem connection becomes available.
- Hides the local file size field for server-side GitHub downloads.
Connection Status
- Added a persistent warning when the ESP modem or its WebSocket connection is unavailable.
- Delays the initial warning briefly to avoid showing it during normal page startup.
- Removes the warning automatically after the connection is restored.
- Continues WebSocket reconnect attempts indefinitely, with the retry delay capped at 30 seconds.
Diagnostics
- Added detailed GitHub OTA logging for DNS resolution, HTTP responses, native TLS errors, response size, stream interruptions, and flash failures.
- Added RTC/NTP logging for configured servers, DNS resolution, UDP requests, response metadata,
settimeofday, epoch, and formatted local time. - Keeps errors visible at every modem log setting except communication-only mode.
- Applies cumulative severity filtering so debug and info modes include warnings, errors, and critical messages.
Header Actions
- Moved firmware updates and device restart actions into the main header overflow menu.
- Added a Restart submenu for restarting the modem, mower, or GPS receiver.
Release Packaging
- Fixed GitHub releases missing classic ESP32 firmware artifacts.
- Builds and packages the reduced UI for classic ESP32 and the complete Map, Live Map, and GPS UI for ESP32-S3.
- Fails the CI release job when expected firmware artifacts are missing instead of publishing an incomplete release.
- Updated GitHub Actions to Node.js 24 compatible versions.
ESP32 OTA Support
- Changed the classic ESP32 partition layout to provide two OTA application slots.
- Existing ESP32-S3 OTA behavior remains unchanged.
Upgrade Notes
- The GitHub updater installs modem firmware only. Sunray mower firmware must still be selected as a local BIN file.
- The integrated updater becomes available after v1.4.0 has been installed once using the existing manual update process.
- The ESP requires internet access and a synchronized system clock to validate GitHub TLS certificates.
- Firmware assets are selected using the modem target reported by the device; no manual ESP32 or ESP32-S3 selection is required.