Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
7140b48
Isolates the returning function in tasks
runeharlyk Oct 21, 2024
f44de68
Merge pull request #62 from theelims/task-isolation-restart-sleep
theelims Dec 20, 2024
8f3a5c9
Update latest espressif platform (last IDF4 based)
theelims Aug 3, 2024
861bb49
Added C6 compatibility
theelims Aug 13, 2024
e1dc49d
Improvements
theelims Dec 20, 2024
0723735
retrieve connection status
theelims Jan 13, 2025
c5beffa
battery history graph
theelims Jan 13, 2025
2779121
refactor lightstate example
theelims Jan 18, 2025
4617372
Update package.json
theelims Jan 19, 2025
ae621e6
MQTT lib update
theelims Jan 19, 2025
3ce2588
Fixes Issue 71
theelims Jan 22, 2025
0cc27ba
Update changelog
theelims Jan 22, 2025
096d66e
Add file.close in fileHandler handleRequest
ewowi Jan 29, 2025
e844ba6
Added STA offline mode + fixes
theelims Jan 29, 2025
c16ac4c
Merge pull request #73 from ewowi/phttp-close
theelims Jan 29, 2025
4c529d9
Heap optimizations
theelims Feb 1, 2025
d75c9e4
Fixed bug in WiFiSettingsService
theelims Feb 4, 2025
70c7987
fixed compiler errors
theelims Feb 5, 2025
80d52ee
Update PsychicHttp 1.2.1
theelims Feb 18, 2025
6e86a3d
Patches fir PsychicHttp
theelims Feb 18, 2025
cc0248c
update changelog
theelims Feb 19, 2025
e427c9c
Upgrade Sveltekit 2 and vite 5
theelims Feb 20, 2025
0e74aa9
changed focus trap package
theelims Feb 20, 2025
edfe953
Revert "changed focus trap package"
theelims Feb 20, 2025
b334a26
prepare Svelte5
theelims Feb 24, 2025
5bb2962
latest daisyui
theelims Feb 24, 2025
7cd9f02
update changelog
theelims Feb 24, 2025
40b5d3c
migration to Svelte 5
theelims Feb 24, 2025
488aaae
svelte-modals legacy
theelims Feb 24, 2025
9abe0d3
upgrade svelte-modals
theelims Feb 24, 2025
07b5754
Expands menu on selected subitem
ewowi Feb 25, 2025
c31b3ac
Svelte 5 migration
theelims Feb 25, 2025
c179d1f
Merge pull request #77 from ewowi/autoexpandmenu
theelims Feb 25, 2025
ee66525
Changelog PR77
theelims Feb 25, 2025
171ab58
pioarduino
theelims Feb 25, 2025
b6f6cb3
platform update
theelims Mar 3, 2025
19a284f
fix menu not closing
theelims Mar 3, 2025
7819801
fixed task.h compile error
theelims Mar 5, 2025
7862278
Refactor System Status and Metrics
ewowi Mar 16, 2025
783f3d7
Fix pull-up/down SleepService
theelims Mar 18, 2025
9815f11
merged bin build script
theelims Mar 19, 2025
82dfc9f
Wifi: Multiple edits bug resolved
ewowi Mar 21, 2025
fcd2bce
SystemMetrics: use max total value, init PSRAM chart always
ewowi Mar 29, 2025
430364c
ESPD_LOGx: replace first argument with TAG and define TAG as 🐼
ewowi Apr 3, 2025
18b0267
Replace rtc_get_reset_reason(0) with esp_reset_reason()
stamp Apr 10, 2025
b86622d
Add /rest/coreDump endpoint
stamp Apr 10, 2025
cf87694
getIP89 function
theelims Jun 5, 2025
8af3680
PIO Arduino
theelims Jun 5, 2025
b368761
Check for build_targets
theelims Jun 5, 2025
aa73a36
Merge pull request #78 from MoonModules/system-status-metrics
theelims Jun 5, 2025
f3d7c49
Merge pull request #81 from MoonModules/bug-metadata-parent-wifi
theelims Jun 5, 2025
606f1ad
Merge pull request #86 from stamp/main
theelims Jun 5, 2025
11ecd5d
Merge pull request #87 from stamp/crashDump
theelims Jun 5, 2025
c333eba
Merge pull request #85 from MoonModules/esp_log-tag
theelims Jun 5, 2025
b57558d
Cleanup after PRs
theelims Jun 5, 2025
88daaac
fix compiler bugs
theelims Jun 7, 2025
32ee6f2
Save merged binary under build
theelims Jun 7, 2025
a9e8cd6
fixed merge_bin.py
theelims Jun 8, 2025
107e41e
prepare Tailwind Upgrade
theelims Jun 12, 2025
49bab72
DaisyUI 5 and Tailwind 4 upgrade
theelims Jun 12, 2025
bedf5f5
Update changelog
theelims Jun 15, 2025
71d7c6f
Update MQTT dep
theelims Jun 17, 2025
085b7ec
Restore lost PRs
theelims Jun 23, 2025
7eaeddf
MQTT LWT
theelims Jul 1, 2025
1564a82
Added Gemini CLI
theelims Jul 8, 2025
c3a3f39
UI for Core Dump service
theelims Jul 8, 2025
29e12b9
Fixes around graceful sleeping
theelims Jul 8, 2025
57b779a
Cleanup Svelte5
theelims Jul 9, 2025
29a01e3
version bump
theelims Jul 9, 2025
5e50365
Added ai-distiller MCP
theelims Jul 12, 2025
cf2d8b3
Removed async workers in PsychicHttp
theelims Jul 16, 2025
c0a78ca
Merge branch 'main' of https://github.com/theelims/ESP32-sveltekit
theelims Jul 16, 2025
7b9a704
MQTT rate limiting
theelims Jul 16, 2025
29801a1
MqttEndpoint QoS = 1
theelims Jul 17, 2025
50ecd36
MqttEndpoint realtime
theelims Jul 17, 2025
38c7115
MqttEndpoint QoS
theelims Jul 17, 2025
0c84c2d
Robust deep sleep handling
theelims Jul 21, 2025
3478594
updates
theelims Jul 21, 2025
fe64070
fix broken adafruit link
theelims Oct 7, 2025
7fc905f
added discord to menu
theelims Oct 8, 2025
428e088
Fixing JSON representation of WifiSettings (#91)
hmbacher Oct 8, 2025
b5ea1da
Added missing page.ts for Core Dump (#94)
hmbacher Oct 8, 2025
a2414e7
Making System Metric's PSRAM chart creation conditional (#95)
hmbacher Oct 8, 2025
622bdd0
prepare PR
theelims Oct 17, 2025
616f186
Replaced D'n'D component, rework of network settings, enhanced a coup…
hmbacher Oct 17, 2025
04991f5
post-PR cleanup
theelims Oct 17, 2025
5c29c3b
Merge branch 'main' of https://github.com/theelims/ESP32-sveltekit
theelims Oct 17, 2025
669ed21
WiFi Station Responsive
theelims Oct 29, 2025
094bf8c
fix OTA _socket crash
theelims Oct 30, 2025
5246f20
Download OTA workaround
theelims Nov 2, 2025
ce9f761
Fixing dnd list (#105)
hmbacher Nov 3, 2025
dafdf20
Brush up PR105
theelims Nov 3, 2025
986a65b
Preparing v0.6.0 release
theelims Nov 3, 2025
6ffca7f
Update Changelog
theelims Nov 3, 2025
2ffc8c6
Update wwwdata
theelims Nov 3, 2025
1a35638
Update docs
theelims Nov 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .gemini/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"mcpServers": {
"context7": {
"command": "npx",
"args": ["-y", "@upstash/context7-mcp"]
},
"ai-distiller": {
"command": "npx",
"args": ["-y", "@janreges/ai-distiller-mcp"]
}
}
}
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ node_modules
/releases
/src/certs
/temp
/build/firmware
/build
/lib/framework/WWWData.h
*WWWData.h
lib/framework/WWWData.h
ssl_certs/cacert.pem
/logs
.aid
/scripts/__pycache__
111 changes: 110 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,120 @@

All notable changes to this project will be documented in this file.

## WIP
## [0.6.0] - 2025-11-03

> [!CAUTION]
> This update has breaking changes!

### Added

- Added `GEMINI.md` to store notes about the repository for the Gemini CLI. We are now using the Gemini CLI for development.
- Added a build script to create a merged firmware file to use with [ESP Web Tools](https://esphome.github.io/esp-web-tools/)
- Added compatibility with ESP32-C6
- Added getIP() function to WiFiSettingsService.
- Added Arduino Log Colors
- Possibility to add a loop callback to ESP32-Sveltekit to leverage its loop threat. Meant to include custom services so no separate task is needed for them.
- Change wake-up pin in SleepService during runtime. It is also possible to use the internal pull-up or pull-down resistors now.
- Get current connection status from ESP32-SvelteKit. Useful for status LED or displays.
- Battery history graph to gauge battery consumption and device life.
- Add a status topic (`online` or `offline`) to the MQTT client. It retains its message and sends `offline` as last will and testament, signalling all subscribers when it goes missing.
- FeatureService sends updates through the event system.
- WiFiSettingsService can set the WiFi station mode to offline, without deleting the list of networks.
- Expands menu on selected subitem [#77](https://github.com/theelims/ESP32-sveltekit/pull/77)
- Refactor System Status and Metrics, added PSRAM [#79](https://github.com/theelims/ESP32-sveltekit/pull/79)
- Add /rest/coreDump endpoint [#87](https://github.com/theelims/ESP32-sveltekit/pull/87) & [#94](https://github.com/theelims/ESP32-sveltekit/pull/94)
- Rate limiting for MQTT publish messages. Can be configured as factory setting or at runtime. `0` will disable the rate limiting.
- Added [discord](https://discord.gg/MTn9mVUG5n) invite to readme.md and docs.
- Created DraggableList component based on svelte-dnd-action (used in WiFi Settings) [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)
- Extended Collapsible and SettingsCard components to support a dirty status [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)
- Enhanced ConfirmDialog, InfoDialog and Toast components to support HTML content [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)
- Added connection check to WebSocket store (socket.ts) and allow secure WebSocket connections [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)
- Added a delayed reconnect function to WifiSettingsService.cpp to allow the last POST request from frontend (providing new network settings) to be properly responded to. In the previous implementation, the POST request was never responded to by the backend, as the connection was closed immediately upon receiving the request in the backend. This resulted in the user receiving no feedback about whether the settings update was successful, only a timeout that suggested something had gone wrong. [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)
- Added scripts/prebuild_utils.py that allows other build scripts to be executed depending on the type of the executed task (e.g. I don't want to have the interface built or the certificate bundle created on clean tasks) [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)
- Added build flag `-D TELEPLOT_TASKS` to plot task heap high water mark with teleplot. You can include this in your tasks as well:

```cpp
#ifdef TELEPLOT_TASKS
static int lastTime = 0;
if (millis() - lastTime > 1000)
{
lastTime = millis();
Serial.printf(">ESP32SveltekitTask:%i:%i\n", millis(), uxTaskGetStackHighWaterMark(NULL));
}
#endif
```

### Changed

- Lightstate example uses simpler, less explicit constructor
- MQTT library updated
- Analytics task was refactored into a loop() function which is called by the ESP32-sveltekit main task.
- Updated PsychicHttp to v1.2.1 incl. patches.
- Updated to DaisyUI 5 and Tailwind CSS 4
- Updated Svelte 5 --> see [Svelte 5 Migration Guide](https://svelte.dev/docs/svelte/v5-migration-guide)
- Changed platform to [PIO Arduino](https://github.com/pioarduino/platform-espressif32) using Arduino 3 Core. Also upgrades ESP-IDF to v5.
- ESPD_LOGx: replace first argument with TAG and define TAG as 🐼 [#85](https://github.com/theelims/ESP32-sveltekit/pull/85)
- Replace rtc_get_reset_reason(0) with esp_reset_reason() [#86](https://github.com/theelims/ESP32-sveltekit/pull/86)
- Default build_interface.py script to npm, if no lock file is found.
- Replaced `svelte-dnd-list` with `svelte-dnd-action` as `svelte-dnd-list` creates build warnings and appears to no longer be maintained, while svelte-dnd-action is under active community development. [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)
- Made Spinner component more flexible (to allow other texts than "Loading..." or no text at all) [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)
- Reworked WiFi Settings (Station) dialog: added edit dialog for networks, rearranged UI components, used new DraggableList component [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)

### Fixed

- Ensure thread safety for client subscriptions [#58](https://github.com/theelims/ESP32-sveltekit/pull/58)
- Deferred websocket event connection to after user validation & login [#72](https://github.com/theelims/ESP32-sveltekit/pull/72)
- Wrong return type battery service
- Wrong return types in various getService functions.
- Add file.close in fileHandler handleRequest [#73](https://github.com/theelims/ESP32-sveltekit/pull/73)
- Fixed bug in WiFiSettingsService preventing discovery of networks other than the first
- Fixed mixup pull up and pull down when configuring wake up pin in SleepService.cpp
- Wifi: Multiple edits bug resolved [#79](https://github.com/theelims/ESP32-sveltekit/pull/79)
- Fixed broken link to Adafruit SSL Cert Store [#93](https://github.com/theelims/ESP32-sveltekit/issues/93)
- Fixed JSON creation in WiFiSettingsService.h [#91](https://github.com/theelims/ESP32-sveltekit/pull/91)
- Fixed preprocessor warning: usage of #ifdef with OR operator [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)
- Fixed preprocessor warning: redefinition of ESP_PLATFORM [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)
- Fixed deprecated usage of merge-bin and its parameters in scripts/merge_bin.py [#100](https://github.com/theelims/ESP32-sveltekit/pull/100)
- Fixed Download OTA. Issues with certificate validation might remain, but build flag `-D DOWNLOAD_OTA_SKIP_CERT_VERIFY` allows to circumvent issue by sacrificing certificate validation.

### Removed

- Removed async workers in PsychicHttp, as these were not used, but caused linker errors.

### Depreciate

- Support for ESP Arduino 2 and ESP-IDF v4 will depreciate some time in the future. Try to migrate to the current Arduino 3 / ESP-IDF v5 based branch.

### Migration Guide

#### PIO Arduino & ESP-IDF 5

The firmware is based on the community maintained fork [PIO Arduino](https://github.com/pioarduino/platform-espressif32) of Arduino 3 for ESP32. Which is based on ESP-IDF 5. Please make sure all your dependencies and application code is compatible with ESP-IDF 5.

#### Frontend

SvelteKit was updated to v2 and Svelte to v5. Please check the migration guides for [SvelteKit 2](https://svelte.dev/docs/kit/migrating-to-sveltekit-2) and the [Svelte 5 Migration Guide](https://svelte.dev/docs/svelte/v5-migration-guide) for the changes required on your frontend code.

To migrate your frontend run

```
npm install --force
npx sv migrate svelte-5
```

Also DaisyUI and Tailwind CSS have been updated to their last major versions. Run the official Tailwind upgrade tool:

```
npx @tailwindcss/upgrade
```

This will migrate some of your svelte files to the new naming convention of Tailwind. For DaisyUI follow this [guide](https://daisyui.com/docs/upgrade/#changes-from-v4). Likely you'll need to redo all forms, as the components behave differently. Forms will need the `fieldset` class. Inputs will need an additional `w-full` to have the same behavior as before. And [labels](https://daisyui.com/components/label/) have a different syntax, too.

The themes are to be found in `app.css` now. Add them back if they had been changed from the default.

### Acknowledgment

Many thanks to @runeharlyk, @ewowi, @hmbacher, and @stamp who contributed significantly to this new release.

## [0.5.0] - 2024-05-06

Expand Down
87 changes: 87 additions & 0 deletions GEMINI.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# Gemini Notes: ESP32-sveltekit

This file contains notes generated by Gemini to understand the repository and assist with development.

## Project Overview

This is a framework for building IoT projects using the ESP32 microcontroller. It aims to simplify the development of ESP32-based devices by offering:

- **Hardware:** ESP32 (supports multiple variants like S3 and C3).
- **Backend:** C++ based on the Arduino framework, built with PlatformIO. The backend provides services for WiFi management, user authentication, MQTT, RESTful API, and more.
- **Frontend:** A modern web interface built with SvelteKit, styled with TailwindCSS and DaisyUI. The frontend is served directly from the ESP32.
- **Build System:** PlatformIO is used to build the backend C++ code. The build process also includes steps to build the SvelteKit frontend and package it for deployment to the ESP32's flash memory.
- **Documentation:** The project uses `mkdocs` for documentation.
- **A feature-rich backend:** Handling common IoT functionalities like WiFi connectivity, MQTT communication, user authentication, and device management.
- **A modern and responsive web interface:** Allowing users to control and monitor their ESP32 devices through a user-friendly web application accessible from various devices (desktop, mobile).
- **Extensibility:** Designed to be easily adaptable and expandable for various IoT applications.

## Project Structure

The project is structured into three main parts:

- **`src/`**: Contains the core C++ application code for the ESP32. This includes services for MQTT, light state management, and the main application entry point (`main.cpp`).
- **`lib/`**: Houses the C++ libraries and dependencies. This is further divided into:
- **`framework/`**: A comprehensive set of services and utilities for ESP32 development, including WiFi management (AP, STA, Scanner, Status), MQTT (Settings, Status), NTP (Settings, Status), Security (Authentication, JWT), Firmware Update (Upload, Download), System Status, Sleep, Battery, Analytics, and Core Dump. It also contains core components like `StatefulService`, `HttpEndpoint`, `EventSocket`, `FSPersistence`, and `WebSocketServer`.
- **`PsychicHttp/`**: A custom HTTP server library for ESP32, providing functionalities for handling HTTP requests, responses, web sockets, and file serving.
- **`interface/`**: This directory holds the SvelteKit frontend application. It's a modern web UI built with SvelteKit, TailwindCSS, and DaisyUI. Key subdirectories include:
- **`src/`**: Contains the Svelte components, stores (for state management), and routes for the different pages of the web interface.
- **`static/`**: Static assets like `favicon.png`.
- Configuration files like `package.json`, `svelte.config.js`, `vite.config.ts`, and `tsconfig.json` define the frontend build process, dependencies, and development setup.

## Key Files and Their Purposes

- **`src/main.cpp`**: The entry point of the ESP32 firmware, responsible for initializing and orchestrating various services.
- **`src/LightMqttSettingsService.h`/`.cpp` and `src/LightStateService.h`/`.cpp`**: Example services demonstrating how to integrate custom device logic (controlling an LED) with MQTT and the web interface.
- **`lib/framework/*.h`/`.cpp`**: These files define the core functionalities and services of the ESP32 backend, covering a wide range of IoT needs.
- **`lib/PsychicHttp/src/*.h`/`.cpp`**: This custom library provides the HTTP server capabilities, enabling the ESP32 to serve the web interface and handle REST API calls and WebSockets.
- **`interface/package.json`**: Defines frontend dependencies (SvelteKit, TailwindCSS, DaisyUI, etc.) and build scripts.
- **`interface/svelte.config.js`**: SvelteKit configuration, including the static adapter for serving the frontend from the ESP32.
- **`interface/vite.config.ts`**: Vite (frontend build tool) configuration, including proxy settings for development and a custom plugin for LittleFS compatibility.
- **`interface/src/routes/`**: Contains the Svelte components for each page of the web application (e.g., `login.svelte`, `menu.svelte`, `wifi/sta/Wifi.svelte`).
- **`interface/src/lib/stores/`**: Svelte stores for managing global application state (e.g., user authentication, telemetry data).
- **`interface/src/lib/components/`**: Reusable Svelte components used across the application.
- **`interface/src/lib/types/models.ts`**: TypeScript type definitions for data models used in the frontend, ensuring type safety when interacting with the backend API.

## Important Dependencies

- **Backend (C++)**:
- **ArduinoJson**: For JSON serialization and deserialization.
- Context7 ID: `/bblanchon/arduinojson`
- **PsychicHttp**: Custom HTTP server library.
- **PsychicMqttClient**: MQTT client library.
- **LittleFS**: Filesystem for ESP32.
- Context7 ID: `/jilio/sqlitefs` (Note: This is the closest match found for a filesystem library, but it's for Go and SQLite. The actual LittleFS library for ESP32 might not have a direct Context7 ID.)
- **WiFi, ESPmDNS, time.h, lwip/apps/sntp.h**: Standard ESP-IDF and Arduino libraries for networking and time.
- **Frontend (SvelteKit)**:
- **SvelteKit**: The web framework.
- **TailwindCSS**: CSS framework for styling.
- **DaisyUI**: TailwindCSS component library for UI elements.
- **unplugin-icons**: For using icon sets.
- **jwt-decode**: For decoding JWT tokens.
- **msgpack-lite**: For MessagePack serialization/deserialization (used for WebSocket communication).
- **chart.js, chartjs-adapter-luxon, luxon**: For charting and date/time handling in analytics.
- **svelte-dnd-list, svelte-modals**: UI components.

## Important Configuration Files

- **`platformio.ini`**: PlatformIO project configuration for the ESP32 backend, defining build environments, libraries, and upload settings. This file is crucial for the integrated build process.
- **`factory_settings.ini`**: Likely contains default or factory-set values for various ESP32 parameters.
- **`features.ini`**: Probably defines which features (e.g., MQTT, Security, Sleep) are enabled or disabled in the firmware, allowing for modular builds.
- **`mkdocs.yml`**: Configuration for the project's documentation site.
- **`interface/vite.config.ts`**: Contains proxy settings for development, allowing the frontend to communicate with a running ESP32 backend during development. This is important for local development workflow.

## Development Workflow

1. **Backend Development:** Modify the C++ files in the `src/` and `lib/` directories. Build and upload to the ESP32 using PlatformIO.
2. **Frontend Development:** Work within the `interface/` directory. Use `npm` to manage dependencies and run the SvelteKit development server.
3. **Building for Production:** The PlatformIO build process (`platformio run`) will automatically build the frontend and embed it into the firmware or a separate flash partition.

## Notes for Gemini

- When asked to modify the frontend, I will work in the `interface/` directory.
- When asked to modify the backend, I will work in the `src/` and `lib/` directories.
- I should be aware of the build process and how the frontend and backend are integrated.
- I will use the existing libraries and frameworks when adding new features.
- Do use `fetch` to retrieve data from the backend.
- Use the context7 MCP to access documentations of libraries and frameworks.
- Assume that the vite dev server (`npm run dev`) is already running.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ The code runs on many variants of the ESP32 chip family. From the plain old ESP3

[https://theelims.github.io/ESP32-sveltekit/](https://theelims.github.io/ESP32-sveltekit/)

## Join our [Discord](https://discord.gg/MTn9mVUG5n)

## Libraries Used

- [SvelteKit](https://kit.svelte.dev/)
Expand All @@ -57,7 +59,7 @@ The code runs on many variants of the ESP32 chip family. From the plain old ESP3
- [tabler ICONS](https://tabler-icons.io/)
- [unplugin-icons](https://github.com/antfu/unplugin-icons)
- [svelte-modals](https://svelte-modals.mattjennings.io/)
- [svelte-dnd-list](https://github.com/tarb/svelte-dnd-list)
- [svelte-dnd-action](https://github.com/isaacHagoel/svelte-dnd-action)
- [ArduinoJson](https://github.com/bblanchon/ArduinoJson)
- [PsychicHttp](https://github.com/hoeken/PsychicHttp)
- [PsychicMqttClient](https://github.com/theelims/PsychicMqttClient)
Expand Down
Loading