Interactive environmental monitoring dashboard for the Architecture for Resilient Communities (ARC) Cool Buildings Programme. Tracks temperature and humidity inside buildings at the Al-Mizan Children's Ecovillage (CEV) near Mkuranga, Tanzania.
The dashboard is a self-contained HTML page that updates automatically and works offline once loaded.
Live dashboard: actionresearchprojects.net/graphs/arc-tz-temp-humid
This project collects temperature and humidity data from sensors placed inside and around two buildings at the ecovillage. It combines that data with external weather information and climate patterns, then builds an interactive dashboard where you can explore it all visually.
The main goals are:
The dashboard pulls data from four different sources:
| Source | What It Measures | How It Gets Updated |
|---|---|---|
| TinyTag loggers | Indoor temperature and humidity at 24+ locations (rooms, ceilings, exterior walls) | Manually downloaded as Excel files from physical sensors |
| Omnisense sensors | Indoor temperature and humidity from 10 wireless IoT sensors | Automatically fetched twice daily by GitHub Actions |
| Open-Meteo API | Outdoor temperature and humidity (historical + 7-day forecast) | Automatically fetched twice daily by GitHub Actions |
| Climate indices | ENSO (El Nino/La Nina), IOD (Indian Ocean Dipole), MJO (Madden-Julian Oscillation) | Automatically fetched weekly by GitHub Actions |
A Python script (build.py) does all the heavy lifting:
index.html file with embedded data and interactive Plotly.js chartsThe output is a completely self-contained HTML file. No database, no backend, no API calls at runtime (except loading a small config file for custom logger names).
Three GitHub Actions workflows keep the dashboard current without any manual work:
config.html) for renaming loggers and changing categories without rebuildingarc_tz_temp_humid/
|
|-- build.py Core build script (generates index.html)
|-- fetch_openmeteo.py Downloads weather data from Open-Meteo API
|-- fetch_omnisense.py Scrapes sensor data from Omnisense platform
|-- fetch_cycles.py Fetches climate cycle indices (ENSO, IOD, MJO)
|-- index.html Generated dashboard (do not edit directly)
|-- config.html Admin page for editing logger names
|
|-- data/
| |-- config.json User overrides for logger names (tracked)
| |-- loggers.json Logger manifest (generated, tracked)
| |-- sensor_snapshot.json Pre-processed TinyTag data for fast rebuilds
| |-- openmeteo/ Weather API data files (tracked)
| |-- omnisense/ IoT sensor data files (tracked)
| |-- cycles/ Climate index data (tracked)
| |-- hist_proj/ Long-term climate projection data (tracked)
| |-- house5/ TinyTag Excel files for House 5 (local only)
| |-- dauda/ TinyTag Excel files for Schoolteacher's House (local only)
|
|-- .github/workflows/ GitHub Actions automation
|-- UPDATE.md Instructions for data updates and git workflow
|-- CHANGELOG.md Record of all changes
|-- runningmean.md Technical explanation of the adaptive comfort algorithm
The primary building being monitored. Has 24 sensor locations covering:
A second building with 3 TinyTag sensors for comparison. Uses a nearby TinyTag outdoor sensor as its reference for adaptive comfort calculations.
TinyTag Excel files -----+
(added manually) |
v
Omnisense sensors ----> build.py ----> index.html ----> actionresearchprojects.net
(auto-fetched) ^ (live dashboard)
|
Open-Meteo API ----------+
(auto-fetched) |
|
Climate indices ---------+
(auto-fetched weekly)
Automated path: GitHub Actions runs the fetch scripts on a schedule, then runs build.py --auto (which uses cached TinyTag data from sensor_snapshot.json plus fresh online data), and pushes the updated index.html.
Manual path: When new TinyTag Excel files are available, place them in the appropriate data/ subfolder and run python build.py for a full rebuild.
The dashboard uses the EN16798-1 standard to assess thermal comfort in naturally ventilated buildings. This works by calculating an "exponential running mean" of outdoor temperature, which represents what occupants have been experiencing recently and have adapted to.
The formula is:
running_mean(today) = 0.2 * yesterday's_mean_temp + 0.8 * running_mean(yesterday)
This gives more weight to recent days while still accounting for the past week or two. The dashboard then plots indoor temperature against this running mean, with comfort bands showing acceptable ranges.
The default comfort model is the Vellei model for high humidity (RH > 60%), which is appropriate for the tropical climate near Mkuranga.
For full technical details, see runningmean.md.
index.html is generated by build.py and should never be edited directly--auto flag lets build.py skip reading Excel files and use the cached sensor_snapshot.json instead, making automated rebuilds much fasterconfig.json stores user-customized logger names and is fetched by the dashboard at load time, so name changes show up without needing a rebuild| Category | Tools |
|---|---|
| Languages | Python, JavaScript, HTML, CSS |
| Data processing | pandas, openpyxl |
| Visualization | Plotly.js |
| Hosting | GitHub Pages, actionresearchprojects.net |
| Automation | GitHub Actions |
| Data sources | Open-Meteo API, Omnisense platform, TinyTag loggers, NOAA/BoM climate data |
| File | What It Covers |
|---|---|
UPDATE.md |
Full data update workflow including git commands |
CHANGELOG.md |
History of all changes made to the project |
runningmean.md |
Technical explanation of the adaptive comfort algorithm |
This project is part of the Architecture for Resilient Communities Cool Buildings Programme, a research initiative focused on sustainable building design in tropical climates.