---
title: "Pure Internet: office---space"
section: posts
description: "A Pi Zero 2 W and Waveshare Environment HAT record my office conditions every 60 seconds."
tags: ["raspberry-pi", "sensors", "open-source", "monitoring", "hardware", "mint", "data-collection"]
created: 2025-01-10T11:22:00Z
updated: 2026-07-16T14:56:30Z
cid: bafkreia4wcdlpcgvsrnu7pnines3h4r2qmwhjdslz7xjvzlbeaebbcgzti
html: https://iammatthias.com/posts/1736536967495-pure-internet-office-space
---

# Pure Internet: office---space

![](https://blobs.farfield.systems/blobs/bafkreihc33qgv2u5thb3skmoutcdmtaoxr5mptiu3tg5f5awmlhexsfpai)

I had a spare Raspberry Pi Zero 2 W and a Waveshare Environment HAT sitting in a drawer. The Zero 2 W is overkill for reading sensors and writing to a database, but the 64-bit processor makes library support easier.

The Environment HAT carries the sensors:

- TSL25911 Digital Ambient Light Sensor

  - I2C address: 0x29
  - Effective range: 0~88000 Lux

- BME280 Temperature, Humidity, and Air Pressure Sensor

  - I2C address: 0x76
  - Temperature: -40~85°C (0.01°C resolution, ±1°C accuracy)
  - Humidity: 0~100%RH (0.008%RH resolution, ±3%RH accuracy, 1s response time, ≤2%RH delay)
  - Air Pressure: 300~1100hPa (0.18Pa resolution, ±1hPa accuracy)

- ICM20948 9-DOF Motion Sensor

  - I2C address: 0x68
  - Accelerometer:
    - Resolution: 16-bit
    - Range: ±2, ±4, ±8, ±16g (configurable)
  - Gyroscope:
    - Resolution: 16-bit
    - Range: ±250, ±500, ±1000, ±2000°/sec (configurable)
  - Magnetometer:
    - Resolution: 16-bit
    - Range: ±4900µT

- LTR390-UV-1 UV Sensor

  - I2C address: 0x53
  - Response wavelength: 280nm - 430nm

- SGP40 VOC Sensor
  - I2C address: 0x60
  - Measuring range: 0 ~ 1,000 ppm ethanol equivalent
  - Limit condition: <0.05 ppm ethanol equivalent OR < 10% preset concentration point
  - Response time: <10s (tau 63%)
  - Start time: < 60s

A new entry every 60 seconds, give or take. The sensors occasionally stall, but the database aggregation absorbs most of it, and some error handling tries to reinitialize before rebooting.

The code is open source, split across [office-space](https://github.com/iammatthias/office-space) (a Vite + React frontend reading from Supabase) and [office-space-db](https://github.com/iammatthias/office-space-db) (the Python and systemd service running on the Pi).

![](https://blobs.farfield.systems/blobs/bafkreicr46gd3qto5xrdhwsmbchtb5efzjkwvcl3z3d2txy64xo3ecbxxa)

---

## Related

- [Now Playing](https://iammatthias.com/posts/1784736733544-now-playing.md): Putting my Apple Music "Now Playing" on display with a Raspberry Pi and a 64x64 LED matrix.
- [Intern](https://iammatthias.com/posts/1781835006151-intern.md): The Autonomous Intern ships as a Raspberry Pi 5 in a desk-toy case running a stack I didn't pick. I flashed it to Debian Trixie, swapped the whole thing for the Hermes agent with its own built-in memory, and folded it all into one setup script.
- [Adventures in Machine Vision](https://iammatthias.com/posts/1780360240000-adventures-in-machine-vision.md): A Nat Friedman anecdote about an AI watching him drink water sent me digging for a spare Raspberry Pi. Now a camera and a sensor HAT watch my desk, a self-inflicted panopticon that logs who walks by and what the room is doing.
- [Single-origin deployment with bhvr](https://iammatthias.com/posts/1747182886660-single-origin-deployment-with-bhvr.md): Fried my Pi using a 10V solar panel without a buck converter.
- [Pure Internet](https://iammatthias.com/posts/1731955749292-pure-internet.md): Pure Internet is a running collection of small experiments in publishing with fewer layers.
