Interactive environmental monitoring dashboard for the Architecture for Resilient Communities (ARC) Cool Buildings Programme. Tracks temperature and humidity inside ARC buildings in two regions: the Al-Mizan Children's Ecovillage (CEV) near Mkuranga, Tanzania, and the UK.
The dashboard is a self-contained HTML page that updates automatically and works offline once loaded.
Live dashboard: actionresearchprojects.net/graphs/arc-temp-humid
This project collects temperature and humidity data from sensors placed inside and around ARC buildings. 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 |
The building selector offers each building on its own, plus a combined view per region:
ARC Tanzania <- both Tanzanian buildings on one chart
House 5
Schoolteacher's House
ARC UK <- both UK buildings on one chart
Grove Cottage
Holywell Barn
Region rows are selectable in their own right. In a region view the sidebar groups loggers under a heading per building, because names repeat across buildings (both House 5 and the Schoolteacher's House have a "Bedroom 1").
Each region carries its own timezone and season names:
| Region | Timezone | Seasons |
|---|---|---|
| ARC Tanzania | Africa/Dar_es_Salaam (EAT, no DST) | Kiangazi, Masika, Kiangazi, Vuli |
| ARC UK | Europe/London (GMT/BST, observes DST) | Winter, Spring, Summer, Autumn |
Timestamps always display as wall-clock time at the site, whatever timezone the viewer's browser is in.
The UK buildings have no Open-Meteo feed yet -- each carries its own external
ambient sensor, which is what its adaptive comfort running mean uses. To add
one, see the commented LOCATIONS["uk"] entry in fetch_openmeteo.py.
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 rebuildingMethod is applicable only for occupant-controlled naturally conditioned spaces that meet all of the following criteria: (a) There is no mechanical cooling system installed. No heating system is in operation; (b) Metabolic rates ranging from 1.0 to 1.5 met; and (c) Occupants are free to adapt their clothing to the indoor and/or outdoor thermal conditions within a range at least as wide as 0.5-1.0 clo.
This applies to the adaptive comfort scatter plot, its comfort band, and the running mean on its x-axis. The dashboard shows the same note beside the comfort band selector and in every info tooltip that explains the method.
arc_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, Tanzania (tracked)
| |-- omnisense/ IoT sensor data files, Tanzania (tracked)
| |-- omnisense_uk/ IoT sensor data files, UK (tracked)
| |-- cycles/ Climate index data (tracked)
| |-- hist_proj/ Long-term climate projection data (tracked)
| |-- house5/ TinyTag Excel files for House 5 (local only)
| |-- schoolteacher/ TinyTag Excel files for Schoolteacher's House (local only)
| (Grove Cottage and Holywell Barn are Omnisense-only -- no Excel files)
|
|-- .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.