
Fan control
Adipa-G/HomeIOT
A comprehensive IoT platform for managing embedded devices (ESP32/Pico)

A comprehensive IoT platform for managing embedded devices (ESP32/Pico)
Tap timer is an open-source printed circuit board by Adipa-G, from the Adipa-G/HomeIOT repository on GitHub, published under the AGPL-3.0 licence. It is a 2-layer board of 120 × 75 mm with 39 parts on 77 nets, routed with 205 tracks and 0 vias.
Its parts include 15 resistors, 13 diodes, 5 connectors, 1 capacitor and 1 IC. It belongs with the home automation and IoT boards and the RP2040 boards of this library.
A comprehensive IoT platform for managing embedded devices (ESP32/Pico). This platform supports creating modules in the serverside, assigning to devices so that these can be executed on the edge devices so that result is visible on the server.
main.py, then monitor and control them across platforms (ESP32, Raspberry Pi Pico)Option 1: Direct .NET Execution (for development)
# Clone and navigate to project
git clone <repo-url>
cd HomeIOT
# Run the API server
dotnet run --project api/src/api.csprojServer starts at: http://localhost:5228
Option 2: Docker Compose (for easy setup)
docker-compose up -dServer accessible at: http://localhost:5228 (or your configured hostname)
http://localhost:5228 in your browserAdmin123HomeIOT/
├── api/ # .NET 10 Backend API
│ ├── src/ # API source code (controllers, services, data)
│ └── tests/ # xUnit tests
├── edge/ # MicroPython edge runtime
│ ├── platforms/ # Platform-specific code (ESP32, Pico)
│ ├── shared/ # Common app logic and HAL
│ ├── bootstrap/ # First-boot installer embedded in the generated main.py
│ └── tools/ # Firmware release build and dev command scripts
├── web-ui/ # React + TypeScript Web Dashboard
├── data/ # SQLite database (auto-created)
└── docs/ # Detailed guides and referencesgraph TB
subgraph "Cloud/Server"
API["API Server<br/>(C# .NET 10)"]
DB["Database<br/>(SQLite)"]
WEB["Web UI<br/>(React)"]
end
subgraph "Edge Devices"
ESP32["ESP32<br/>(MicroPython)"]
PICO["Pico<br/>(MicroPython)"]
end
subgraph "Admin Tools"
TOOLS["Python Tools<br/>(build release)"]
end
WEB -->|Admin API| API
API -->|Store/Query| DB
ESP32 -->|Device API + OTA| API
PICO -->|Device API + OTA| API
TOOLS -->|Release| API
style API fill:#0078d4
style WEB fill:#61dafb| Layer | Technology | Role |
|---|---|---|
| Web UI | React + TypeScript + Vite | Admin dashboard for managing devices, modules, users, and monitoring |
| API | C# .NET 10 + Entity Framework Core | REST API for device communication and admin operations |
| Edge Runtime | MicroPython | Firmware running on ESP32/Pico; polls for modules, executes commands |
| Database | SQLite | Stores devices, modules, logs, heartbeats, users, and execution results |
| Guide | Purpose |
|---|---|
| 📖 Server Setup | Install and configure the API server (direct .NET & Docker) |
| 📖 Edge Device Setup | Add ESP32/Pico devices and install firmware with the generated main.py |
| Guide | Purpose |
|---|---|
| 📖 Dashboard | Understand real-time metrics and system status |
| 📖 Device Management | Add, re-provision, monitor, filter, and control devices |
| 📖 Module System | Create, upload, assign, and execute modules |
| 📖 Data Visualizations | Configure and use gauges, charts, and threshold colors |
| 📖 User Management | Manage admin users and authentication |
| 📖 Dev Commands | Execute remote code for debugging |
main.py onto a device (pip install mpremote), or use Thonny# Clone the repository
git clone <repo-url>
cd HomeIOT
# Setup Python environment for edge tools
python -m venv .venv
.venv\Scripts\activate # Windows
# or: source .venv/bin/activate # macOS/Linux
pip install -r edge/requirements.txt
# Setup Node dependencies for Web UI (optional for dev)
cd web-ui
npm install
cd ..http://localhost:5228Admin / 123All code changes require corresponding tests. Run the full test suite:
# API tests (.NET)
dotnet test api/tests/homeiot.api.tests.csproj
# Edge tests (Python)
python -m pytest edge
# Web UI tests (optional)
cd web-ui && npm testStart API server (background)
dotnet run --project api/src/api.csprojStart Web UI dev server (in new terminal)
cd web-ui && npm run devAccess Web UI at http://localhost:5173 (Vite dev server)
Make changes to code and tests
Run tests to verify changes
# Terminal 1: dotnet test api/tests/homeiot.api.tests.csproj
# Terminal 2: python -m pytest edge
# Terminal 3: npm test (in web-ui)To load the demo device, module, variables, and visualizations, set DevelopmentSeed:Enabled to true in api/src/appsettings.Development.json before starting the API. The seed runs at API startup in the Development environment and only creates missing records.
The root simulator-config.json is configured for the seeded device (simulator-device-1). After starting the API, run the simulator from the repository root:
python -m edge.simulator.worker --config simulator-config.jsonThe demo-sensor readings cycle through the configured threshold bands, including the default color below the first threshold. Let the simulator run for a few cycles to see the visualization colors and build chart history. The seed does not generate the simulator config; see Server Setup for the seed credentials and setup details.
PascalCase file names, records for DTOs, snake_case JSON propertiesedge/shared/tests/src/components/, pages in src/pages/See .github/copilot-instructions.md for detailed conventions.
Publish a firmware release for the platform (once per version)
python edge/tools/build_artifact.py --platform esp32 --version 1.0.0When the API runs elsewhere (e.g. Docker), upload the release zip on the OTA page instead.
Add the device under Devices > Add device. Enter the device ID, platform, API URL (an IP or a hostname the device can resolve) and WiFi credentials. The browser downloads main.py.
Install on the board. Flash MicroPython, then copy the file and reset:
mpremote cp main.py :main.py
mpremote resetThe installer writes config.json, connects to WiFi, and installs the latest release through OTA. Delete the downloaded main.py afterwards, because it contains the device key and WiFi password.
Verify in Dashboard — Device should appear online within 60 seconds
👉 Full guide: Edge Device Setup
exec()-compatible code👉 Full guide: Module System
print(device_info))👉 Full guide: Dev Commands
Edit api/src/appsettings.json:
{
"RuntimeControl": {
"NextHeartbeatMs": 60000, // Device heartbeat interval
"DevPollIntervalMs": 2000, // Dev command polling
"ModuleAssignmentPollIntervalMs": 60000 // Module assignment polling
},
"Admin": {
"MasterUsername": "Admin",
"MasterPassword": "YOUR_SECURE_PASSWORD" // Change in production!
}
}For production, also change:
Jwt.SecretKey — Use a cryptographically secure random keyConnectionStrings.DefaultConnection — Use production databaseappsettings.jsonDevice config.json is written on the device by the main.py installer from Add device / Re-provision, and includes:
homesvr often don't resolve on the device; use an IP)[bootstrap] output with mpremote repl during first installGET /api/devices/{id}/logs in dashboardappsettings.json includes your originFor more, see the detailed guides linked above.
GNU AFFERO GENERAL PUBLIC LICENSE Version 3
For issues, questions, or feature requests, please open an issue in the repository.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 13 | LED | LED_THT:LED_D3.0mm | D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15 |
| 13 | R220 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15 |
| 2 | 100K | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R1, R2 |
| 1 | 100uF | Capacitor_THT:CP_Radial_D10.0mm_P7.50mm | C1 |
| 1 | BAT | Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J5 |
| 1 | Conn_01x09 | Connector_PinHeader_2.54mm:PinHeader_1x09_P2.54mm_Vertical | J3 |
| 1 | Conn_02x09_Odd_Even | Connector_PinHeader_2.54mm:PinHeader_2x09_P2.54mm_Vertical | J4 |
| 1 | Ext PWR | Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J2 |
| 1 | Pico | MCU_RaspberryPi_and_Boards:RPi_Pico_SMD_TH | U1 |
| 1 | Valve | Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J1 |
| 1 | ~ | Custom_Modules:BAT_CHG_1 | BAT_CHG1 |
| 1 | ~ | Custom_Modules:BOOST_1 | BOOST1 |
| 1 | ~ | Custom_Modules:OPTO_1 | OPTO1 |
| 1 | ~ | Custom_Modules:BUCK_1 | BUCK1 |

Adipa-G/HomeIOT
A comprehensive IoT platform for managing embedded devices (ESP32/Pico)

joeycastillo/Sensor-Watch
A board replacement for the classic Casio F-91W wristwatch

rusefi/rusefi
rusefi - GPL internal combustion engine control unit

hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

ataradov/usb-sniffer-lite
A simple USB sniffer based on Raspberry Pi RP2040

windowsair/wireless-esp8266-dap
CMSIS-DAP compatible wireless debugger for ESP8266/ESP32/ESP32C3/ESP32S3. Optional 40MHz SPI acceleration, etc. 适配多种ESP芯片的无线调试器


lachlanA/eagle-to-kicad
Eagle SCH/LIB to KiCad SCH/LIB ULP conversion script

It measures 120 × 75 mm and has 2 copper layers, 1.6 mm thick.
39 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the Adipa-G/HomeIOT repository on GitHub, at the commit this page was made from: the board is hardware/tap_timer/kicad-pcb-design/tap_timer.kicad_pcb and its schematic hardware/tap_timer/kicad-pcb-design/tap_timer.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the AGPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).