

HIVIS2
Self-hosted indoor air quality and acoustic monitoring system built on ESP32. Designed for schools, offices, and research environments where privacy and data ownership matter.
- Size
- 65 × 50 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 15
- Nets
- 34
- Pads
- 75
- Tracks, vias
- 88, 5
- Pours
- 1
- Routed
- Yes
- KiCad
- KiCad 9.0 (file 20241229)
- Created
- 27 Apr 2026
- Updated
- 4 May 2026
Overview
HIVIS2 is an open-source printed circuit board by ranieriv, from the ranieriv/HIVIS2 repository on GitHub. It is a 2-layer board of 65 × 50 mm with 15 parts on 34 nets, routed with 88 tracks and 5 vias.
It is built around the INMP441. Its parts include 5 resistors, 5 connectors, 2 capacitors, 1 IC and 1 switch.
Main components
1README
README.mdHIVIS Monitor 2.0
Self-hosted indoor air quality and acoustic monitoring system built on ESP32. Designed for schools, offices, and research environments where privacy and data ownership matter.
Live dashboard: https://hvht.net
What it measures
| Metric | Sensor | Notes |
|---|---|---|
| IAQ (Air Quality Index) | BME688 + BSEC2 | 0–500 scale, accuracy 0–3 |
| CO₂ equivalent | BME688 + BSEC2 | ppm |
| VOC (breath VOC) | BME688 + BSEC2 | ppm |
| Temperature | BME688 | °C |
| Humidity | BME688 | % RH |
| Noise level | INMP441 | dB SPL |
| Battery voltage | ADC (GPIO 36) | % + volts |
Architecture
┌─────────────────────────────────────────────────────┐
│ ESP32 Device (battery-powered) │
│ BME688 · INMP441 · OLED · Button · Buzzer │
└──────────────────┬──────────────────────────────────┘
│ MQTT TLS :8883 · HTTP :8090 (OTA)
▼
┌─────────────────────────────────────────────────────┐
│ Server (Docker) │
│ Mosquitto → Node-RED → InfluxDB → Grafana │
│ Nginx (https://hvht.net) · OTA server (:8090) │
└─────────────────────────────────────────────────────┘Hardware
| Component | Part |
|---|---|
| MCU | ESP32 DOIT DevKit V1 |
| Air quality | Bosch BME688 breakout |
| Microphone | INMP441 I2S breakout |
| Display | 0.96" OLED SSD1306 (I2C) |
| Button | Tactile switch (GPIO 4) |
| Buzzer | Passive piezo (GPIO 25) |
| Power | 1S LiPo + USB-C charging module |
KiCad schematic, PCB layout, Gerber files, and BOM are in hardware/.
GPIO Map
| GPIO | Function |
|---|---|
| 21 | I2C SDA (BME688 + OLED) |
| 22 | I2C SCL (BME688 + OLED) |
| 12 | I2S WS — microphone |
| 13 | I2S LR — microphone channel select |
| 14 | I2S SCK — microphone |
| 26 | I2S SD — microphone data |
| 4 | Button (INPUT_PULLUP, active LOW) |
| 25 | Buzzer (LEDC PWM) |
| 36 | Battery ADC (voltage divider ×2.2) |
Firmware
Built with PlatformIO (Arduino framework).
Dependencies (auto-installed via platformio.ini):
boschsensortec/bsec2— IAQ/CO₂/VOColikraus/U8g2— OLED displaybblanchon/ArduinoJsonknolleary/PubSubClient— MQTTtzapu/WiFiManager— captive portal provisioning
Build and flash:
# Install PlatformIO CLI or use the VS Code extension
pio run --target upload
# Upload LittleFS (config.json, bsec_state.bin)
pio run --target uploadfsFirst boot: the device launches a captive portal (HIVIS-Setup-XXXX). Connect and enter your WiFi credentials and MQTT server address.
Device configuration lives in data/config.json. All pin assignments and thresholds are overridable there without reflashing.
Server
The full server stack runs on Docker. A single Linux machine is enough (tested on a Lenovo ThinkPad X200 with Ubuntu).
Services:
| Container | Purpose | Port |
|---|---|---|
hivis-mosquitto | MQTT broker (TLS) | 8883 |
hivis-nodered | Data routing + device provisioning | 1880 |
hivis-influxdb | Time-series storage | 8086 |
hivis-grafana | Dashboards | 3000 |
hivis-ota | Firmware update server | 8090 |
hivis-nginx | Public HTTPS dashboard | 80, 443 |
hivis-certbot | Let's Encrypt auto-renewal | — |
Deploy:
cd server
cp mosquitto/config/passwd.example mosquitto/config/passwd # create credentials
docker compose up -dSee docs/system-overview.md for the full setup and docs/operations-manual.md for day-to-day operations.
Button functions
| Press | Duration | Action |
|---|---|---|
| Short | < 400 ms | Next display page |
| Double | 2× within 400 ms | Stop alert buzzer |
| Long | 2–5 s | Launch reconfigure portal |
| Factory reset | > 5 s | Wipe NVS credentials and reboot |
Documentation
| File | Contents |
|---|---|
docs/system-overview.md | Architecture, pin map, boot sequence, MQTT topics, server stack |
docs/operations-manual.md | Quick checks, troubleshooting, deploying firmware, adding devices |
spec/01_device_firmware.md | Firmware module details |
spec/02_provisioning.md | First-boot captive portal and MQTT registration flow |
spec/03_ota.md | OTA update system |
spec/04_mqtt_data.md | MQTT topics and JSON payload schema |
spec/05_server_infrastructure.md | Docker stack and Mosquitto ACL |
spec/06_grafana_dashboards.md | Dashboard definitions |
Project structure
hivis2/
├── src/ # ESP32 firmware (C++/Arduino)
├── data/ # LittleFS filesystem (config.json)
├── hardware/ # KiCad schematic, PCB, Gerbers, BOM
├── server/ # Docker stack, Mosquitto, Node-RED, Grafana, Nginx
├── docs/ # Operations manual + system overview
├── spec/ # Detailed technical specifications
├── partitions.csv # ESP32 flash partition table
└── platformio.ini # Build configurationParts
15| Qty | Value | Footprint | References |
|---|---|---|---|
| 2 | 100K | Resistor_SMD:R_0402_1005Metric | R3, R4 |
| 2 | 100nF | Capacitor_SMD:C_0402_1005Metric | C1, C2 |
| 2 | 4.7K | Resistor_SMD:R_0402_1005Metric | R1, R2 |
| 1 | 220 | Resistor_SMD:R_0402_1005Metric | R5 |
| 1 | BATT JST | Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J5 |
| 1 | BME_688_Module | Library:BME688_Breakout_7pin | J1 |
| 1 | Buzzer | Buzzer_Beeper:Buzzer_TDK_PS1240P02BT_D12.2mm_H6.5mm | BZ1 |
| 1 | INMP_441 | Library:INMP441_Breakout_8mm | J2 |
| 1 | J5019_Module | Library:J5019_Module | J4 |
| 1 | OLED Display | Library:OLED_SSD1306_27x27 | J3 |
| 1 | SW_Push | Button_Switch_THT:SW_PUSH_6mm | SW1 |
| 1 | ~ | ESP32_Footprints:ESP32_30pin | U1 |
Similar boards
- 2 layers56.4 × 78.4 mm

- 2 layers135 × 135 mm

Va5pcb
iollama/Voice-Assistant-5
ESP32-S3 push-to-talk voice assistant using OpenAI Realtime API
16 parts21GPL-3.0 - 2 layers70 × 100 mm

Iot badge-433
galopago/iot-badge-legacy
Electronic conference badge for programming conventions, hacking events, etc.
77 parts4 - 2 layers39.1 × 39.9 mm

Nebula
Thecactusman0/Nebula-openwatch
Nebula is a ESP32 based smartwatch that features a rotating bezel encoder
85 parts4 - 2 layers74.9 × 100.3 mm

Spectrum analyzer
JadenS180/spectrum-analyzer
ESP32-based real-time audio spectrum analyzer with custom PCB design. Features INMP441 I2S microphone, SSD1306 OLED display, FFT processing, and real-time WiFi streaming to a browser-based visualizer via WebSockets.
11 parts2MIT - 2 layers33 × 77.5 mm

- 2 layers52 × 43 mm

- 2 layers80 × 50 mm

Ledhub c6
AskAlice/home-automation-pcbs
Daily Kimi-generated home automation PCB designs with KiCad sources, 3D models, and rendered documentation
59 parts1MIT
Questions
How big is the HIVIS2 PCB?
It measures 65 × 50 mm and has 2 copper layers, 1.6 mm thick.
What parts does the HIVIS2 use?
15 parts, built around the INMP441. 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.
Where can I download the HIVIS2 KiCad files?
From the ranieriv/HIVIS2 repository on GitHub, at the commit this page was made from: the board is hardware/hivis2.kicad_pcb and its schematic hardware/hivis2.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the HIVIS2 design in my own project?
Its repository states no licence, so its author keeps all rights: ask ranieriv before reusing the design.