Skip to content

Conversation

@hmbacher
Copy link
Contributor

@hmbacher hmbacher commented Dec 15, 2025

Hello!

The firmware upload user experience was quite basic, so I've significantly enhanced it with better validation, progress tracking, and error handling.

Unified Firmware Update Dialog

  • Shared dialog for both firmware downloads (from GitHub) and firmware uploads (via browser)
  • Real-time progress indicator now available for file uploads
  • Server-side error display with descriptive messages
  • Success confirmation with automatic browser reload countdown
updating-progress updating_error updating_error_size updating-success

WebSocket Event Enhancements

  • Unified WebSocket event (EVENT_OTA_UPDATE) for both upload and download flows
  • Extended event message to include bytes_written and total_bytes for accurate progress tracking

Client-Side Validation

  • File type validation: Only .bin and .md5 files accepted
  • MD5 upload confirmation: Visual feedback when valid MD5 hash is uploaded
upload-filetype-not-supported upload-md5-invalid upload-md5-ok

Server-Side Validation

  • File type verification via file extension
  • MD5 hash length validation (must be exactly 32 bytes)
  • Firmware file size validation: Prevents uploading firmware files exceeding the partition size. The partition size is determined automatically during runtime.
  • Firmware magic byte detection to verify firmware format
  • Platform compatibility check via chip type validation

Enhanced Error Handling

  • Comprehensive error handling in both backend and frontend
  • Clear error messages displayed to users

Some Refactoring

  • Using instance member variables instead of static variables in UploadFirmwareService (thread-safe implementation)
  • Fixed memory leak around request->_tempObject
  • Fixed some typos
  • Added documentation

hmbacher added 30 commits May 19, 2025 21:11
- Implemented a new page for managing sensors in the frontend.
- Created an EditSensor component for editing sensor details with validation.
- Developed ControllerSettingsService to manage controller settings via HTTP endpoints.
- Introduced FanController to handle fan control logic based on temperature readings.
- Added OneWireESP32 library for interfacing with DS18B20 temperature sensors.
- Implemented TempSensorsService to manage temperature sensors and their data acquisition.
- Established persistence for sensor settings and states using file storage.
- Enhanced error handling and logging throughout the services.
- Added FFCMqttConfig component for configuring MQTT settings.
- Removed GatewayMQTTConfig component to streamline MQTT configuration.
- Updated MQTT routing to use FFCMqttConfig.
- Introduced new alarms page for managing alarm events.
- Created backend services for alarm logging and MQTT settings.
- Integrated alarm notifications via MQTT.
- Enhanced temperature sensor service to publish alarms on sensor status changes.
- Added utility functions for ISO 8601 date conversion.
- Updated UI to include alarm log and relevant error handling.
… enhance temperature sensor discovery logging
- Changed to PCB v2.0 settings
- Updated version string
# Conflicts:
#	.gitignore
#	README.md
#	factory_settings.ini
#	features.ini
#	interface/package-lock.json
#	interface/package.json
#	interface/src/app.css
#	interface/src/lib/DaisyUiHelper.ts
#	interface/src/lib/assets/logo.png
#	interface/src/lib/components/Collapsible.svelte
#	interface/src/lib/components/ConfirmDialog.svelte
#	interface/src/lib/components/InputPassword.svelte
#	interface/src/lib/components/SettingsCard.svelte
#	interface/src/lib/components/Spinner.svelte
#	interface/src/lib/components/UpdateIndicator.svelte
#	interface/src/lib/components/toasts/Toast.svelte
#	interface/src/lib/stores/analytics.ts
#	interface/src/lib/stores/socket.ts
#	interface/src/lib/types/models.ts
#	interface/src/routes/+layout.svelte
#	interface/src/routes/+layout.ts
#	interface/src/routes/+page.svelte
#	interface/src/routes/connections/mqtt/+page.svelte
#	interface/src/routes/connections/mqtt/MQTT.svelte
#	interface/src/routes/connections/ntp/NTP.svelte
#	interface/src/routes/login.svelte
#	interface/src/routes/menu.svelte
#	interface/src/routes/statusbar.svelte
#	interface/src/routes/system/metrics/BatteryMetrics.svelte
#	interface/src/routes/system/metrics/SystemMetrics.svelte
#	interface/src/routes/system/status/SystemStatus.svelte
#	interface/src/routes/system/update/GithubFirmwareManager.svelte
#	interface/src/routes/system/update/UploadFirmware.svelte
#	interface/src/routes/user/+page.svelte
#	interface/src/routes/user/EditUser.svelte
#	interface/src/routes/wifi/ap/Accesspoint.svelte
#	interface/src/routes/wifi/sta/Scan.svelte
#	interface/src/routes/wifi/sta/Wifi.svelte
#	interface/static/favicon.png
#	interface/static/manifest.json
#	interface/vite.config.ts
#	lib/PsychicHttp/src/PsychicCore.h
#	lib/PsychicHttp/src/PsychicEndpoint.cpp
#	lib/PsychicHttp/src/PsychicEndpoint.h
#	lib/PsychicHttp/src/PsychicHttp.h
#	lib/PsychicHttp/src/PsychicHttpServer.cpp
#	lib/PsychicHttp/src/PsychicStaticFileHander.cpp
#	lib/PsychicHttp/src/PsychicUploadHandler.cpp
#	lib/framework/APSettingsService.cpp
#	lib/framework/APSettingsService.h
#	lib/framework/APStatus.cpp
#	lib/framework/APStatus.h
#	lib/framework/AnalyticsService.h
#	lib/framework/ArduinoJsonJWT.cpp
#	lib/framework/ArduinoJsonJWT.h
#	lib/framework/AuthenticationService.cpp
#	lib/framework/AuthenticationService.h
#	lib/framework/BatteryService.cpp
#	lib/framework/BatteryService.h
#	lib/framework/DownloadFirmwareService.cpp
#	lib/framework/DownloadFirmwareService.h
#	lib/framework/ESP32SvelteKit.cpp
#	lib/framework/ESP32SvelteKit.h
#	lib/framework/ESPFS.h
#	lib/framework/EventEndpoint.h
#	lib/framework/EventSocket.cpp
#	lib/framework/EventSocket.h
#	lib/framework/FSPersistence.h
#	lib/framework/FactoryResetService.cpp
#	lib/framework/FactoryResetService.h
#	lib/framework/Features.h
#	lib/framework/FeaturesService.cpp
#	lib/framework/FeaturesService.h
#	lib/framework/HttpEndpoint.h
#	lib/framework/IPUtils.h
#	lib/framework/JsonUtils.h
#	lib/framework/MqttEndpoint.h
#	lib/framework/MqttSettingsService.cpp
#	lib/framework/MqttSettingsService.h
#	lib/framework/MqttStatus.cpp
#	lib/framework/MqttStatus.h
#	lib/framework/NTPSettingsService.cpp
#	lib/framework/NTPSettingsService.h
#	lib/framework/NTPStatus.cpp
#	lib/framework/NTPStatus.h
#	lib/framework/NotificationService.h
#	lib/framework/RestartService.cpp
#	lib/framework/RestartService.h
#	lib/framework/SecurityManager.h
#	lib/framework/SecuritySettingsService.cpp
#	lib/framework/SecuritySettingsService.h
#	lib/framework/SettingValue.cpp
#	lib/framework/SettingValue.h
#	lib/framework/SleepService.cpp
#	lib/framework/SleepService.h
#	lib/framework/StatefulService.cpp
#	lib/framework/StatefulService.h
#	lib/framework/SystemStatus.cpp
#	lib/framework/SystemStatus.h
#	lib/framework/UploadFirmwareService.cpp
#	lib/framework/UploadFirmwareService.h
#	lib/framework/WebSocketClient.bak
#	lib/framework/WebSocketServer.h
#	lib/framework/WiFiScanner.cpp
#	lib/framework/WiFiScanner.h
#	lib/framework/WiFiSettingsService.cpp
#	lib/framework/WiFiSettingsService.h
#	lib/framework/WiFiStatus.cpp
#	lib/framework/WiFiStatus.h
#	platformio.ini
#	scripts/build_interface.py
#	scripts/rename_fw.py
#	src/main.cpp
hmbacher and others added 29 commits September 16, 2025 19:30
# Conflicts:
#	interface/src/routes/gateway/smoke-detectors/+page.svelte
#	platformio.ini
# Conflicts:
#	interface/src/routes/gateway/smoke-detectors/+page.svelte
# Conflicts:
#	interface/src/lib/components/DraggableList.svelte
# Conflicts:
#	interface/src/routes/gateway/smoke-detectors/+page.svelte
#	src/GatewayDevicesService.cpp
# Conflicts:
#	scripts/generate_enums.py
…s in scripts

# Conflicts:
#	scripts/generate_enums.py
# Conflicts:
#	interface/src/routes/wifi/sta/Wifi.svelte
- Removed GithubUpdateDialog component and replaced it with FirmwareUpdateDialog for consistency.
- Updated telemetry store to manage OTA status with additional fields: bytes_written and total_bytes.
- Modified UpdateIndicator and UploadFirmware components to utilize the new FirmwareUpdateDialog and updated telemetry structure.
- Enhanced UploadFirmwareService to emit detailed progress updates via WebSocket, including bytes written and total bytes.
- Introduced validation for firmware chip type in UploadFirmwareService to ensure compatibility.
- Improved error handling and user feedback during firmware upload processes.
- Added new FirmwareUpdateEvents header for standardized WebSocket event names and structures.
- Removed GithubUpdateDialog component and replaced it with FirmwareUpdateDialog for consistency.
- Updated telemetry store to manage OTA status with additional fields: bytes_written and total_bytes.
- Modified UpdateIndicator and UploadFirmware components to utilize the new FirmwareUpdateDialog and updated telemetry structure.
- Enhanced UploadFirmwareService to emit detailed progress updates via WebSocket, including bytes written and total bytes.
- Introduced validation for firmware chip type in UploadFirmwareService to ensure compatibility.
- Improved error handling and user feedback during firmware upload processes.
- Added new FirmwareUpdateEvents header for standardized WebSocket event names and structures.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants