Overview
The /thermostat/{deviceId}/status endpoint returns the complete state of a thermostat, including current temperature, target temperature, HVAC mode, fan settings, schedule, and all other device properties.
Endpoint
GET https://nolongerevil.com/api/v1/thermostat/{deviceId}/status
Self-hosted? Use http://localhost:3000/api/v1/thermostat/{deviceId}/status instead.
Authentication
Required Scopes : read
Include your API key in the Authorization header:
Authorization: Bearer nle_your_api_key_here
Request
Path Parameters
Parameter Type Required Description deviceIdstring Yes Device ID (UUID) from the /devices endpoint
Header Value Required AuthorizationBearer nle_your_api_key_hereYes
Example Request
GET https://nolongerevil.com/api/v1/thermostat/dev_abc123xyz/status
Authorization: Bearer nle_your_api_key_here
Response
Success Response (200 OK)
{
"device" : {
"id" : "dev_abc123xyz" ,
"serial" : "02AA01AB01234567" ,
"name" : "Living Room"
},
"state" : {
"shared.02AA01AB01234567" : {
"object_revision" : 152 ,
"object_timestamp" : 1764026373459 ,
"value" : {
"target_temperature" : 21.5 ,
"target_temperature_type" : "heat" ,
"current_temperature" : 20.2 ,
"hvac_heater_state" : true ,
"hvac_ac_state" : false ,
"fan_mode" : "auto" ,
"auto_away" : 0 ,
"leaf" : false ,
"can_cool" : true ,
"can_heat" : true ,
"postal_code" : "85388" ,
"country_code" : "US"
}
},
"device.02AA01AB01234567" : {
"object_revision" : 89 ,
"object_timestamp" : 1764026373000 ,
"value" : {
"temperature_scale" : "C" ,
"fan_timer_timeout" : 0 ,
"compressor_lockout_enabled" : true ,
"eco_mode_enabled" : false ,
"temperature_lock_enabled" : false
}
},
"user.67032595" : {
"object_revision" : -23671 ,
"object_timestamp" : 1764024643855 ,
"value" : {
"away" : false ,
"name" : "Guest" ,
"email" : "[email protected] "
}
},
"structure.95d0a01f-1c25-447f-ba61-edb275e9ae25" : {
"object_revision" : -15172 ,
"object_timestamp" : 1764024645708 ,
"value" : {
"name" : "Home" ,
"away" : false ,
"postal_code" : "85388" ,
"country_code" : "US" ,
"time_zone" : "America/Chicago"
}
}
}
}
Response Fields
Field Type Description deviceobject Basic device information device.idstring Device UUID device.serialstring Device serial number device.namestring | null Custom device name stateobject Object containing all device state data state.shared.{serial}object Shared device state (temperature, mode, etc.) state.device.{serial}object Device-specific settings state.user.{userId}object User-specific settings state.structure.{structureId}object Structure/home settings
Key State Fields (shared..value)
Field Type Description current_temperaturenumber Current room temperature (°C) target_temperaturenumber Target temperature (°C) target_temperature_typestring "heat", "cool", or "range"target_temperature_lownumber Low temp for heat-cool mode (°C) target_temperature_highnumber High temp for heat-cool mode (°C) hvac_heater_stateboolean Heating currently active hvac_ac_stateboolean Cooling currently active hvac_fan_stateboolean Fan currently running fan_modestring "auto", "on", or "off"auto_awaynumber 0 = home, 2 = away can_coolboolean Device supports cooling can_heatboolean Device supports heating
Error Responses
401 Unauthorized
{
"error" : "Unauthorized"
}
Cause : Missing or invalid API key.
403 Forbidden
{
"error" : "Access denied to this device"
}
Cause : Your API key doesn’t have permission to access this device.
Solution : Check that the device ID is correct and your API key has access to it.
404 Not Found
{
"error" : "Device not found"
}
Cause : Device ID doesn’t exist or you don’t have access to it.
429 Too Many Requests
{
"error" : "Rate limit exceeded" ,
"retryAfter" : "2025-01-24T12:35:00.000Z"
}
Code Examples
cURL
JavaScript/Node.js
Python
curl https://nolongerevil.com/api/v1/thermostat/dev_abc123xyz/status \
-H "Authorization: Bearer nle_your_api_key_here"
Use Cases
Temperature Monitoring
Poll device status to monitor temperature changes:
async function monitorTemperature ( deviceId , callback ) {
setInterval ( async () => {
const status = await getDeviceStatus ( deviceId );
const shared = status . state [ `shared. ${ status . device . serial } ` ]?. value ;
callback ({
current: shared . current_temperature ,
target: shared . target_temperature ,
heating: shared . hvac_heater_state ,
cooling: shared . hvac_ac_state
});
}, 60000 ); // Every minute
}
monitorTemperature ( 'dev_abc123xyz' , ( temps ) => {
console . log ( `Room: ${ temps . current } °C → ${ temps . target } °C` );
});
Energy Usage Tracking
Track HVAC system activity:
async function logEnergyUsage ( deviceId ) {
const status = await getDeviceStatus ( deviceId );
const shared = status . state [ `shared. ${ status . device . serial } ` ]?. value ;
const timestamp = new Date (). toISOString ();
const usage = {
timestamp ,
heating: shared . hvac_heater_state ,
cooling: shared . hvac_ac_state ,
fan: shared . hvac_fan_state ,
currentTemp: shared . current_temperature ,
targetTemp: shared . target_temperature
};
// Save to database or analytics platform
await saveToDatabase ( usage );
}
Smart Automations
Build conditional logic based on device state:
async function smartAwayMode ( deviceId ) {
const status = await getDeviceStatus ( deviceId );
const shared = status . state [ `shared. ${ status . device . serial } ` ]?. value ;
// If home and temperature is comfortable, don't run HVAC
if ( shared . auto_away === 0 ) { // Home
const tempDiff = Math . abs (
shared . current_temperature - shared . target_temperature
);
if ( tempDiff < 0.5 && ! shared . hvac_heater_state && ! shared . hvac_ac_state ) {
console . log ( 'Temperature comfortable, HVAC idle' );
// Could adjust target temp to save energy
}
}
}
State Object Keys
The state object contains multiple sub-objects with different types of data:
shared.{serial} : Shared device state (temperature, mode, HVAC status)
device.{serial} : Device-specific settings (scale, timers, locks)
user.{userId} : User preferences and settings
structure.{structureId} : Home/structure-wide settings
schedule.{serial} : Device schedule (if configured)
Object revisions (object_revision) and timestamps (object_timestamp) are used for state synchronization and conflict resolution. You typically don’t need to use these values.
Next Steps