Thingsee PRESENCE Configuration
Overview
This page helps you configure Thingsee PRESENCE for your specific deployment scenario. Find your use case below, apply the configuration, and you’re done.
Configuration is done through the Service API (GraphQL) using two commands:
SetDeviceConfiguration— sets mode, sensitivity, LED, and idle reportingSetReportInterval— sets how often the sensor reports during active periods
For raw CBOR/Wirepas commands (self-hosted gateway operators), see Configuration Commands.
Quick Use Case Selector
| Use Case | Mode | Key Setting | Jump To |
|---|---|---|---|
| Meeting room occupancy | Mode 1 | threshold: 150 | Meeting Room |
| Desk/workspace monitoring | Mode 1 | threshold: 800 | Desk Occupancy |
| Doorway people counting | Mode 2 | reportInterval: 60 | Doorway Counting |
| Corridor/lobby traffic | Mode 2 | reportInterval: 120 | Corridor Traffic |
| Restroom occupancy | Mode 1 | passiveReportInterval: 1800 | Restroom |
| Installation & testing | Either | enableLed: 1 | Testing |
Meeting Room Occupancy
Goal: Know whether a meeting room is occupied or vacant. Integrate with booking systems.
Recommended: Mode 1 (Occupancy) — binary status, low network traffic, event-driven.
Configuration
mutation {
setDeviceConfiguration(
input: {
vendorSerial: "TSPR04-xxxxxxxx"
mode: 1
threshold: 150
enableLed: 0
passiveReportInterval: 3600
}
) { success }
}
What You’ll Receive
| Event | Measurement | Payload |
|---|---|---|
| Room becomes occupied | occupancyStatus | {"isOccupied": true} |
| Room becomes vacant | occupancyStatus | {"isOccupied": false} |
| Hourly heartbeat | occupancyStatus | Current state (true or false) |
MQTT topic: haltian-iot/events/{integration-id}/{api-key-id}/measurements/occupancyStatus/{device-uuid}
Mounting
- No dome required (standard detection cone)
- Ceiling mount, 2.4–3.0m height
- Central location with clear view of the room
- Avoid placing near air vents or direct sunlight
Tuning
- False triggers from hallway traffic? Increase threshold to 200–400
- Not detecting seated people? Decrease threshold to 100
- Want faster vacancy detection? Keep threshold at 150 (lower = faster vacant detection)
Expected Results
- Accuracy: ~90% for typical meeting room usage
- Battery life: 3–4 years (low network traffic)
- Network load: Minimal (only on state changes + hourly heartbeat)
Desk / Workspace Occupancy
Goal: Monitor individual desk usage for hot-desking or utilization analytics.
Recommended: Mode 1 (Occupancy) with high threshold and Occupancy Dome accessory.
Configuration
mutation {
setDeviceConfiguration(
input: {
vendorSerial: "TSPR04-xxxxxxxx"
mode: 1
threshold: 800
enableLed: 0
passiveReportInterval: 3600
}
) { success }
}
What You’ll Receive
| Event | Measurement | Payload |
|---|---|---|
| Person sits at desk | occupancyStatus | {"isOccupied": true} |
| Person leaves desk | occupancyStatus | {"isOccupied": false} |
| Hourly heartbeat | occupancyStatus | Current state |
Mounting
- Requires Occupancy Dome (focuses detection downward)
- Mount under desk center
- Height: 60–70cm from floor
- Clearance: 50mm from table legs
- Aim detection zone at chair/seated area
Tuning
- Detecting people walking past? Increase threshold to 900–1060
- Not detecting seated person? Decrease threshold to 600
- Short absences triggering vacant? This is expected — the sensor reports truthfully
Expected Results
- Accuracy: ~95% for typical desk usage
- Battery life: 3–4 years
- Network load: Very low
Doorway People Counting
Goal: Count visitors passing through a doorway or entrance point.
Recommended: Mode 2 (Visitor counter) with short report interval and Visitor Counter Dome.
Configuration
mutation {
setDeviceConfiguration(
input: {
vendorSerial: "TSPR04-xxxxxxxx"
mode: 2
threshold: 150
enableLed: 0
passiveReportInterval: 3600
}
) { success }
}
mutation {
setReportInterval(
input: {
vendorSerial: "TSPR04-xxxxxxxx"
reportInterval: 60
}
) { success }
}
What You’ll Receive
| Situation | Measurement | Payload |
|---|---|---|
| People passing (every 60s) | movementDetections | {"movementDetections": 7} |
| No movement (every 1h) | movementDetections | {"movementDetections": 0} |
MQTT topic: haltian-iot/events/{integration-id}/{api-key-id}/measurements/movementDetections/{device-uuid}
Mounting
- Use Visitor Counter Dome (narrows detection to doorway width)
- Ceiling mount directly above doorway center
- Height: 2.4–2.7m
- Position: 5–10cm from wall (toward room interior)
Tuning
- Undercounting? Decrease threshold to 100 (more sensitive)
- Overcounting (false triggers)? Increase threshold to 200
- Need more granularity? Decrease reportInterval to 30s
- Battery priority? Increase reportInterval to 300s
Expected Results
- Accuracy: ~85–95% in single-file traffic
- Maximum detection: ~34 movements per minute
- Battery life: 2–3 years (at 60s interval)
Corridor / Lobby Traffic
Goal: Monitor traffic patterns in busy common areas while conserving battery.
Recommended: Mode 2 (Visitor counter) with longer report interval.
Configuration
mutation {
setDeviceConfiguration(
input: {
vendorSerial: "TSPR04-xxxxxxxx"
mode: 2
threshold: 100
enableLed: 0
passiveReportInterval: 7200
}
) { success }
}
mutation {
setReportInterval(
input: {
vendorSerial: "TSPR04-xxxxxxxx"
reportInterval: 120
}
) { success }
}
What You’ll Receive
| Situation | Measurement | Payload |
|---|---|---|
| Active period (every 2 min) | movementDetections | {"movementDetections": 23} |
| Quiet period (every 2 hours) | movementDetections | {"movementDetections": 0} |
Mounting
- Consider Visitor Counter Dome to focus detection zone
- Ceiling mount, 2.5–3.0m height
- Center of corridor width
- For wide corridors (>3m), consider multiple sensors
Tuning
- Missing distant movement? Decrease threshold to 100
- Too much noise? Increase threshold to 150–200
- Need hourly totals for analytics? Keep reportInterval at 120s, aggregate in cloud
- Battery critical? Increase reportInterval to 300s and passiveReportInterval to 21600
Expected Results
- Accuracy: Variable based on corridor width and traffic density
- Battery life: 3–4 years (balanced intervals)
- Network load: Moderate during active, very low during quiet
Restroom Occupancy
Goal: Show restroom availability status (occupied/available).
Recommended: Mode 1 (Occupancy) with shorter passive interval for quick status updates.
Configuration
mutation {
setDeviceConfiguration(
input: {
vendorSerial: "TSPR04-xxxxxxxx"
mode: 1
threshold: 150
enableLed: 0
passiveReportInterval: 1800
}
) { success }
}
What You’ll Receive
| Event | Measurement | Payload |
|---|---|---|
| Restroom becomes occupied | occupancyStatus | {"isOccupied": true} |
| Restroom becomes vacant | occupancyStatus | {"isOccupied": false} |
| 30-min heartbeat | occupancyStatus | Current state |
Mounting
- Ceiling mount inside restroom
- Height: 2.4–3.0m
- Position: Coverage of main area (near sink/entry)
- Avoid direct aim at hand dryers or heating vents
Tuning
- Hand dryer triggers false occupied? Increase threshold to 200–300
- Want faster confirmation of vacancy? Lower threshold to 100
- Multiple stalls? Use one sensor per stall with Occupancy Dome
Expected Results
- Accuracy: ~90% for single-occupant restrooms
- Battery life: 3–4 years
- 30-min heartbeat ensures status display stays current
Installation & Testing
Goal: Verify sensor placement, detection coverage, and sensitivity before production deployment.
Recommended: Any mode with LED enabled and fast reporting.
Configuration
mutation {
setDeviceConfiguration(
input: {
vendorSerial: "TSPR04-xxxxxxxx"
mode: 2
threshold: 150
enableLed: 1
passiveReportInterval: 3600
}
) { success }
}
mutation {
setReportInterval(
input: {
vendorSerial: "TSPR04-xxxxxxxx"
reportInterval: 10
}
) { success }
}
Testing Procedure
- Apply configuration above
- Wait ~30 seconds for sensor to update
- Walk slowly through detection area
- Observe LED flash (red blink on each detection)
- Check cloud data — reports arrive every 10 seconds
- Adjust position or sensitivity as needed
- Test edge cases: seated person, person walking past, door opening
After Testing — Apply Production Configuration
Always disable LED and increase intervals after testing. Short intervals drain battery rapidly.
Apply your chosen use case configuration from above, or at minimum:
mutation {
setDeviceConfiguration(
input: {
vendorSerial: "TSPR04-xxxxxxxx"
enableLed: 0
}
) { success }
}
Configuration Quick Reference
Available Commands
| Command | Parameters | Description |
|---|---|---|
SetDeviceConfiguration | mode, threshold, enableLed, passiveReportInterval | Configure PIR behavior |
GetDeviceConfiguration | — | Query current configuration |
SetReportInterval | reportInterval (10–86400s) | Set active reporting frequency |
GetReportInterval | — | Query current report interval |
Parameter Reference
| Parameter | Type | Range | Default | Description |
|---|---|---|---|---|
mode | Integer | 1–2 | 2 | 1 = Occupancy (binary), 2 = Visitor counter (counts) |
threshold | Integer | 100–1060 | 150 | PIR sensitivity (lower = more sensitive) |
enableLed | Integer | 0–1 | 0 | LED flash on detection (1 = on) |
passiveReportInterval | Integer | 300–86400 | 3600 | Idle reporting interval (seconds) |
reportInterval | Integer | 10–86400 | 60 | Active reporting interval (seconds, Mode 2 only) |
Threshold Quick Guide
| Value | Sensitivity | Typical Use |
|---|---|---|
| 100 | Very high | Large open areas, distant detection |
| 150 | Default | Doorways, general use |
| 200–400 | Medium | Medium rooms, moderate traffic |
| 500–800 | Low | Under-desk with dome |
| 900–1060 | Very low | Small zones, reducing false triggers |
Query Current Configuration
query {
getDeviceConfiguration(
vendorSerial: "TSPR04-xxxxxxxx"
) {
mode
threshold
enableLed
passiveReportInterval
}
}
query {
getReportInterval(
vendorSerial: "TSPR04-xxxxxxxx"
) {
reportInterval
}
}
Sensitivity Tuning Guide
Step-by-Step Process
- Start with default (150) — Deploy and monitor for 24 hours
- Identify issues — Too many false triggers? Missing detections?
- Adjust incrementally — Change by 50–100 units at a time
- Test for several hours between each change
- Consider environment — temperature, air vents, traffic patterns
Environmental Factors
- High ambient temperature → May need lower threshold (smaller ΔT between person and background)
- Air conditioning vents → May cause false triggers, increase threshold or reposition
- Direct sunlight → Avoid sensor placement in sun path
- Seasonal changes → Summer may need lower threshold, winter higher; review quarterly
Battery Life & Network Optimization
| Configuration | Expected Battery Life |
|---|---|
| Mode 1, passiveReportInterval 3600s, LED off | 3–4 years |
| Mode 2, reportInterval 60s, LED off | 2–3 years |
| Mode 2, reportInterval 300s, passiveReportInterval 7200s | 4+ years |
| Any mode, LED on | −5 to −10% |
To maximize battery life:
- Use Mode 1 where binary occupancy is sufficient
- Increase passiveReportInterval (7200s or higher)
- Increase reportInterval for Mode 2 (300s+)
- Disable LED (
enableLed: 0) - Optimize gateway placement to reduce mesh network hops
Network capacity: Typical limit is ~100 sensors per gateway at 60s intervals. For dense deployments, use longer intervals or Mode 1.
Troubleshooting
Configuration Not Applied
- Verify sensor is reporting to cloud (check last measurement timestamp)
- Wait up to 5 minutes — configuration travels through Wirepas mesh
- Query configuration to confirm: use
GetDeviceConfiguration - Check that vendorSerial matches exactly (case-sensitive)
Wrong Measurement Type Received
- Mode change takes effect at next reporting cycle
- If still receiving
movementDetectionsafter setting Mode 1: wait 5–10 minutes - Query current configuration to verify mode was accepted
Unexpected Battery Drain
- Check reportInterval — values below 60s cause rapid drain
- Verify LED is disabled for production
- High-traffic areas generate more transmissions regardless of interval
- Consider switching to Mode 1 (fewer messages)
Parameter Value Clamped
If your response shows a different value than requested (e.g., threshold 50 → returned as 80), the sensor clamped to the nearest valid value. Review Parameter Reference for valid ranges.
Advanced: Raw CBOR Configuration
Direct CBOR messages are for self-hosted Wirepas gateway operators who bypass the Service API. Most users should use the GraphQL commands above.
For raw CBOR message formats (tsmId 13200, 13210, 13211, 1500, 1501), see Configuration Commands.
Related Documentation
- Thingsee PRESENCE - Device overview and installation guide
- CBOR to JSON Conversion - Message encoding/decoding details
- Service API (GraphQL) - Cloud API for device configuration
- Binary Passthrough API - Direct CBOR message access
- Presence and Occupancy Profile - Complete message profile specification
- Common Profile (1000-1999) - System configuration messages