Sample Data
Explore real Haltian IoT data from our Oulu office - available for immediate experimentation
Live Sample Dataset
We provide a complete sample dataset from Haltian’s Oulu office that you can explore directly in your browser. This data includes real sensor readings from meeting rooms, demonstrating the full capabilities of the Parquet export format.
Try It Now
The sample data is hosted in our dev-demos GitHub repository and available via raw GitHub URLs at https://raw.githubusercontent.com/haltian/dev-demos/main/ for direct HTTP access.
Dataset Overview
| Property | Value |
|---|---|
| Location | Haltian Oulu Office |
| Time Period | January 2026 |
| Export Frequency | Hourly |
| Total Duration | 1 month (744 hours) |
| Primary Use Case | Meeting room occupancy |
Available Data Types
Entity Data
| Folder | Description | Records |
|---|---|---|
device/ | IoT sensors installed in meeting rooms | Presence sensors |
space/ | Office locations, buildings, floors | Hierarchical structure |
zone/ | Individual meeting rooms and areas | Named zones |
organization/ | Organization metadata | Demo organization |
deviceKeyword/ | Device tags and labels | Room assignments |
Measurement Data
| Folder | Description | Frequency |
|---|---|---|
measurementOccupancyStatus/ | Binary occupied/unoccupied state | Real-time events |
measurementOccupancySeconds/ | Duration of occupancy per period | Aggregated |
measurementOccupantsCount/ | Number of people detected | Real-time |
measurementAmbientTemperature/ | Room temperature | Periodic |
measurementBatteryPercentage/ | Sensor battery levels | Periodic |
measurementBatteryVoltage/ | Battery voltage readings | Periodic |
measurementCO2/ | Air quality (CO₂ ppm) | Periodic |
measurementTVOC/ | Volatile organic compounds | Periodic |
measurementPosition/ | Device location tracking | Event-driven |
measurementPositionZone/ | Zone-relative positions | Event-driven |
Data Access URLs
The sample data follows the standard folder structure and can be accessed via HTTPS:
https://raw.githubusercontent.com/haltian/dev-demos/main/haltiansalesdemo-parquet/
├── device/
│ └── 2026/
│ └── 01/
├── measurementOccupancyStatus/
│ └── 2026/
│ └── 01/
├── space/
│ └── 2026/
│ └── 01/
├── zone/
│ └── 2026/
│ └── 01/
└── ...
📦 GitHub Repository: haltian/dev-demos
Example URLs
# Single device file
https://raw.githubusercontent.com/haltian/dev-demos/main/haltiansalesdemo-parquet/device/2026/01/2026_01_15_08_device.parquet
# Occupancy measurement
https://raw.githubusercontent.com/haltian/dev-demos/main/haltiansalesdemo-parquet/measurementOccupancyStatus/2026/01/2026_01_15_10_measurementOccupancyStatus.parquet
# Zone definitions
https://raw.githubusercontent.com/haltian/dev-demos/main/haltiansalesdemo-parquet/zone/2026/01/2026_01_15_08_zone.parquet
Quick Start with Python
Load the sample data directly from our website:
import pandas as pd
# Read device inventory
devices_url = "https://raw.githubusercontent.com/haltian/dev-demos/main/haltiansalesdemo-parquet/device/2026/01/2026_01_15_08_device.parquet"
devices = pd.read_parquet(devices_url)
print(f"Found {len(devices)} devices")
# Read occupancy data
occupancy_url = "https://raw.githubusercontent.com/haltian/dev-demos/main/haltiansalesdemo-parquet/measurementOccupancyStatus/2026/01/2026_01_15_10_measurementOccupancyStatus.parquet"
occupancy = pd.read_parquet(occupancy_url)
print(f"Found {len(occupancy)} occupancy events")
# Read zone definitions
zones_url = "https://raw.githubusercontent.com/haltian/dev-demos/main/haltiansalesdemo-parquet/zone/2026/01/2026_01_15_08_zone.parquet"
zones = pd.read_parquet(zones_url)
print(f"Found {len(zones)} zones (meeting rooms)")
Quick Start with DuckDB
Query the sample data directly with SQL:
import duckdb
# Analyze occupancy patterns across all January 2026 data
result = duckdb.query("""
SELECT
DATE_TRUNC('day', ts) as date,
COUNT(*) as total_events,
SUM(status) as occupied_events,
ROUND(100.0 * SUM(status) / COUNT(*), 1) as occupancy_rate
FROM 'https://raw.githubusercontent.com/haltian/dev-demos/main/haltiansalesdemo-parquet/measurementOccupancyStatus/2026/01/*.parquet'
GROUP BY DATE_TRUNC('day', ts)
ORDER BY date
""").df()
print(result)
What to Explore
Meeting Room Usage
The primary use case demonstrated is meeting room occupancy monitoring:
- Zones represent individual meeting rooms
- Devices are presence sensors installed in each room
- Occupancy measurements show real usage patterns
Analysis Ideas
- Daily utilization - Which rooms are used most frequently?
- Peak hours - When are meeting rooms busiest?
- Booking efficiency - How often are booked rooms actually used?
- Capacity planning - Do you need more/fewer meeting rooms?
Next Steps
- Web Data Access - Load Parquet files in the browser with JavaScript
- Occupancy Dashboard Demo - See a complete analysis example
- Integration Examples - Platform-specific code samples