Skip to the content
PCBKitNew board
2 layers36 × 96.5 mmTemper, the printed circuit board in 3D

The hardware and software to monitor temperature and humidity via 4 sensors.

Size
36 × 96.5 mm
Copper layers
2
Thickness
1.6 mm
Parts
60
Nets
52
Pads
199
Tracks, vias
558, 176
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
8 Apr 2026
Updated
19 Jun 2026

Overview

Temper is an open-source printed circuit board by pjaos, from the pjaos/temper repository on GitHub, published under the MIT licence. It is a 2-layer board of 36 × 96.5 mm with 60 parts on 52 nets, routed with 558 tracks and 176 vias.

It is built around the ESP32-WROOM-32, MCP9700-E/TT and AO3401A. Its parts include 22 resistors, 8 capacitors, 7 connectors, 5 diodes and 3 transistors. It belongs with the sensors and measurement boards and the ESP32 boards of this library.

Main components

3

README

README.md

Temper

A Python tool for discovering temperature and humidity sensor units on the local LAN, recording their readings to a SQLite database, and visualising the data through a web-based dashboard.


Overview

Temper consists of two programs that work together along with the ESP32 based hardware.

  • temper_db — a background collector that listens for sensor broadcasts on the LAN and saves every reading to a local SQLite database.
  • temper_gui — a browser-based dashboard (built with NiceGUI and Plotly) for plotting temperature and humidity data across any time range.

The two programs are independent. temper_db can run continuously as a background service while temper_gui is started on demand to view the data.


Hardware

Temper is designed to work with TEMPER-branded sensor units that broadcast JSON payloads over UDP on the local network. Each unit reports up to four independent temperature/humidity sensor channels, along with system telemetry (RAM, disk, uptime, RSSI, battery voltage, etc.).

alt text

alt text

Details of the hardware including kicad schematic, PCB and BOM can be found in the hardware folder.

This hardware runs a micropython program which can be found in software/mcu folder. It listens on UDP port 2934 and responds to Are You There broadcast messages with the status (temperature/humidity etc).


Requirements

  • Python 3.10 or later

Installation

The python wheel installer file can be found in the linux folder.

Using the bundled installer

bash
python3 install.py linux/temper-<version>-py3-none-any.whl

This creates a virtual environment, installs all dependencies, and adds the temper_db and temper_gui commands to your PATH. A temper_gui launch icon is also added to you desktop.


Usage

Collector — temper_db

Discovers TEMPER hardware units on the local LAN and writes every received reading to the database.

bash
python -m temper.temper_db [options]
OptionDescription
-d, --debugEnable debug logging (prints each received JSON payload).
-a ADDRESS, --address ADDRESSOnly record data from the unit at this IP address. If omitted, all units found are recorded.
-s SECONDS, --seconds SECONDSInterval between Are You There broadcasts (default: 10 s).
--enable_auto_startRegister the tool to start on system boot
--disable_auto_startUn-register the tool to start on system boot
--check_auto_startCheck the running status

Example — record all units, broadcast every 30 seconds:

bash
temper_db --seconds 30

Example — record only one unit:

bash
temper_db --address 192.168.0.99

Example Running as a service

Use the built-in boot manager to have the tool start automatically (Linux only):

bash
temper_db --seconds 30 --enable_auto_start

Press Ctrl-C to stop.

Dashboard — temper_gui

Starts a local web server and opens the dashboard in the default browser.

bash
temper_gui [options]
OptionDescription
-d, --debugEnable debug logging.
-p PORT, --port PORTTCP port for the NiceGUI web server (default: 8085).
-n, --no_web_launchStart the server without opening a browser tab automatically.
--enable_auto_startRegister the tool to start on system boot
--disable_auto_startUn-register the tool to start on system boot
--check_auto_startCheck the running status

Browser Example

alt text

Example — start on a non-default port:

bash
temper_gui --port 9090

Example — headless server (access from another device):

bash
temper_gui --no_web_launch

Then navigate to http://<host-ip>:8085 from any browser on the same network, including a mobile phone.

Example Running as a service

Use the built-in boot manager to have the tool start automatically (Linux only):

bash
temper_gui -n --enable_auto_start

Dashboard features

The dashboard is responsive and works on both desktop and mobile browsers.

Sidebar controls

  • Units — chips showing every known unit and its total reading count. Click to select a unit and load its data.
  • Time Range — preset buttons (1h, 6h, 24h, 7 days, 30 days, All) plus a Custom option with date pickers.
  • Plot — switch between Temperature and Humidity views.
  • Sensor Names — rename each of the four sensor channels (e.g. Living Room, Loft, Outside). Names are saved to sensor_names.json and persist across restarts. The chart legend and stat tiles update immediately on save.

Main area

  • Latest Reading — a tile grid showing the most recent temperature and humidity value for each active sensor on the selected unit.
  • Chart — an interactive Plotly time-series plot. Hover over any point to see values for all sensors at that timestamp. Zoom and pan with standard Plotly controls.

Data storage

The database and sensor name configuration are stored in:

PlatformPath
Linux / macOS (XDG)~/.config/temper/
Linux / macOS (fallback) / Windows~/.temper/

Files created:

FileContents
temper_sensor_data.dbSQLite database containing all sensor readings.
sensor_names.jsonUser-defined display names for the four sensor channels.

Database schema

Two tables are used:

units — one row per discovered device.

ColumnTypeDescription
idINTEGERPrimary key.
unit_nameTEXTUnique device identifier (e.g. TEMPER_DEV).
device_typeTEXTAlways SENSOR for TEMPER hardware.
product_idTEXTAlways TEMPER.
ip_addressTEXTLast seen IP address.
osTEXTFirmware OS (e.g. MicroPython).
group_nameTEXTOptional group label from the device.
service_listTEXTServices advertised by the device.
first_seenTIMESTAMPUTC timestamp of first contact.
last_seenTIMESTAMPUTC timestamp of most recent contact.

sensor_readings — one row per received broadcast.

ColumnTypeDescription
idINTEGERPrimary key.
unit_idINTEGERForeign key → units.id.
recorded_atTIMESTAMPUTC time the reading was received.
rx_time_secsREALUnix timestamp from the device itself.
uptime_secondsINTEGERDevice uptime in seconds.
sensor_1_temp … sensor_4_tempREALTemperature readings in °C.
sensor_1_humidity … sensor_4_humidityREALRelative humidity readings in %RH.
param_3v3REAL3.3 V rail voltage.
param_vbatREALBattery voltage.
param_rssiREALWi-Fi signal strength in dBm.
param_board_tempREALOn-board temperature sensor reading.
ram_*, disk_*INTEGERRAM and disk usage telemetry.

Maintenance

To delete readings older than 90 days from a Python session:

python
from temper.temper_db import TemperDB
from unittest.mock import MagicMock
db = TemperDB.__new__(TemperDB)
db._uio = MagicMock(); db._options = None
db._db_file = TemperDB.GetDBFile()
deleted = db.prune_readings_older_than(days=90)
print(f"Deleted {deleted} rows")

Running tests

Tests use pytest. From the client directory:

bash
./run_tests.sh

The test suite covers all database operations (TemperDB) including table creation, unit upsert, reading insertion, time-range filtering, latest-reading queries, and data pruning. No network access or real hardware is required.


Project structure

text
temper/software/client/
├── src/
│   └── temper/
│       ├── temper_db.py        # Collector + database layer
│       └── temper_gui.py       # NiceGUI web dashboard
└── tests/
    └── test_temper_db.py       # pytest test suite

Licence

See LICENSE in the repository root.

Author

Paul Austen — pjaos@gmail.com

Acknowledgements

Development of this project was assisted by Claude (Anthropic's AI assistant), which contributed to code review, bug identification, test generation, and this documentation.

Parts

60
QtyValueFootprintReferences
6100kResistor_SMD:R_0402_1005Metric_Pad0.72x0.64mm_HandSolderR5, R10, R13, R14, R17, R22
50.1ufCapacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolderC1, C3, C4, C5, C6
4470RResistor_SMD:R_0402_1005Metric_Pad0.72x0.64mm_HandSolderR7, R8, R12, R16
44k7Resistor_SMD:R_0402_1005Metric_Pad0.72x0.64mm_HandSolderR18, R19, R20, R21
4MountingHole_3.2mm_M3MountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
4conn_01x03Connector_JST:JST_EH_B3B-EH-A_1x03_P2.50mm_VerticalJ1, J2, J3, J4
32N7002Package_TO_SOT_SMD:SOT-23-3Q1, Q2, Q3
3DNFResistor_SMD:R_0402_1005Metric_Pad0.72x0.64mm_HandSolderR1, R2, R9
3tactswButton_Switch_SMD:SW_SPST_SKQG_WithoutStemSW1, SW2, SW3
210kResistor_SMD:R_0402_1005Metric_Pad0.72x0.64mm_HandSolderR4, R6
2GreenLEDLED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolderD2, D4
10RResistor_SMD:R_0402_1005Metric_Pad0.72x0.64mm_HandSolderR3
1100uf 16vCapacitor_THT:CP_Radial_D5.0mm_P2.50mmC8
118650 LION BatteryPJA_Connectors:18650_26700_battery_holderBT1
11N5819Diode_SMD:D_SMA_HandsolderingD5
1220uf 25vCapacitor_THT:CP_Radial_D6.3mm_P2.50mmC2
122kResistor_SMD:R_0402_1005Metric_Pad0.72x0.64mm_HandSolderR11
122ufCapacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC7
13APJA_Fuses:PTC_23mm_3mm_10.2mm_wire_spacingF1
147kResistor_SMD:R_0402_1005Metric_Pad0.72x0.64mm_HandSolderR15
1AO3401APackage_TO_SOT_SMD:SOT-23-3M1
1Blue Bluetooth LEDLED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolderD1
1Charge ConnectorConnector_JST:JST_EH_B2B-EH-A_1x02_P2.50mm_VerticalJ5
1Conn_01x10Connector_PinHeader_2.54mm:PinHeader_1x10_P2.54mm_VerticalJ7
1DNFPJA_Fuses:Scherter_OMT125F2
1ESP32-WROOM-32PJA_ESP32-footprints-Lib:ESP32-WROOM-32U2
1Jumper_2_BridgedJumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mmJP2
1Jumper_2_OpenConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJP1
1MCP9700Package_TO_SOT_SMD:SOT-23-3U1
1MCU Serial I/FConnector_JST:JST_EH_B3B-EH-A_1x03_P2.50mm_VerticalJ6
1Red Charging LEDLED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolderD3

Questions

How big is the Temper PCB?

It measures 36 × 96.5 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Temper use?

60 parts, built around the ESP32-WROOM-32, MCP9700-E/TT and AO3401A. 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 Temper KiCad files?

From the pjaos/temper repository on GitHub, at the commit this page was made from: the board is hardware/schematic_pcb/temper.kicad_pcb and its schematic hardware/schematic_pcb/temper.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Temper design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers87 × 33 mmBatmon, the printed circuit board in 3D

    Batmon

    pjaos/batmon

    A device to assist in extending the life of EBike batteries.

    58 parts1MIT
  • 2 layers65 × 56 mmRadioberry preamp, the printed circuit board in 3D

    Radioberry preamp

    OE9SAU/SAUBerry9

    SDR TRX from Radioberry

    142 parts4
  • 2 layers100 × 50 mmEsp12e devboard, the printed circuit board in 3D

    Esp12e devboard

    EspIt/Hardware

    The EspIt PCB and Schematic

    117 parts
  • 4 layers192.5 × 80 mmPlugInDC Load, the printed circuit board in 3D

    PlugInDC Load

    janni0609/DC-Load

    A programmable DC electronic load built on the Raspberry Pi Pico 2 (RP2350). It sinks a user-defined current from a DC source under test and measures voltage, current, power, capacity, and energy in real time on a…

    525 parts
  • 2 layers76.2 × 31.8 mmFanctl, the printed circuit board in 3D

    Fanctl

    JeremyGrosser/fanctl

    PID controlled PC fan

    28 partsBSD-3-Clause
  • 2 layers85 × 56 mmHB RF ETH, the printed circuit board in 3D

    HB RF ETH

    alexreinert/PCB

    Some of my PCBs

    96 parts104
  • 2 layers70 × 65 mmFluepdot, the printed circuit board in 3D

    Fluepdot

    Fluepke/Fluepdot

    Project for controlling Annax flipdot panels used by the Berliner Verkehrsbetriebe

    116 parts17AGPL-3.0