Summary
The AT-OCS-900N is a networked occupancy, light, and temperature sensor. This spec covers the JSON-over-WebSocket (ws/wss) and JSON-over-TCP/UDP API (port 9000), including all get, set, and method commands for sensor data retrieval, LED control, and device configuration. MQTT is also supported on port 1883 but the MQTT command structure is not documented in the source.
Transport
protocols:
- tcp
- udp
- http # WebSocket (ws/wss) - HTTP Upgrade
addressing:
port: 9000 # TCP and UDP JSON API port
base_url: "ws://[device-ip]/ws" # TLS disabled; use wss://[device-ip]/ws when TLS enabled
# WebSocket plain: port 80; WebSocket TLS (default): port 443
# MQTT: port 1883 (protocol structure not documented in source)
auth:
type: credentials # username/password passed as JSON fields in each request
# Example: {"get":"info","username":"admin","password":"<password>"}
# Credentials configurable via set:user command
Traits
- queryable # inferred from extensive get: command set returning sensor/device state
- levelable # inferred from set:light sensitivity, set:temperature threshold, set:motion delay
Actions
- id: set_led
label: Set LED
kind: action
params:
- name: rgb
type: string
description: "Hex RGB color string (e.g. '98f542'). Optional."
- name: center
type: boolean
description: Enable center LED ring
- name: outer
type: boolean
description: Enable outer LED ring
- name: auto
type: boolean
description: Auto LED mode (LED reflects motion state)
- name: motionTrue
type: string
description: "Hex RGB color when motion detected (e.g. 'FF0000')"
- name: motionFalse
type: string
description: "Hex RGB color when no motion (e.g. '000000')"
command: '{ "set": { "name": "led", "config": { "outer": true, "auto": false, "motionTrue": "98f542", "motionFalse": "000000" } } }'
- id: set_motion
label: Set Motion Sensor Config
kind: action
params:
- name: delay
type: integer
description: Motion occupancy delay in seconds
command: '{ "set": { "name": "motion", "config": { "delay": 5 } } }'
- id: set_light
label: Set Light Sensor Config
kind: action
params:
- name: sensitivity
type: integer
description: Light sensor sensitivity (1-10 scale implied)
- name: threshold
type: integer
description: Light event threshold in ADC units
- name: unit
type: string
description: "Threshold unit - always 'ADC' in source"
command: '{ "set": { "name": "light", "config": { "sensitivity": 5, "events": { "threshold": 500 } } } }'
- id: set_temperature
label: Set Temperature Sensor Config
kind: action
params:
- name: unit
type: string
description: "Temperature event unit: 'F' or 'C'"
- name: threshold
type: number
description: Temperature change threshold that triggers an event
command: '{ "set": { "name": "temperature", "config": { "events": { "unit": "C", "threshold": 5 } } } }'
- id: set_sensors
label: Set All Sensors Config
kind: action
params:
- name: config
type: object
description: "JSON object with 'motion', 'light', and/or 'temperature' sub-objects"
command: '{ "set": { "name": "sensors", "config": { "motion": { "delay": 5 }, "light": { "sensitivity": 5, "events": { "threshold": 500 } }, "temperature": { "events": { "unit": "C", "threshold": 5 } } } } }'
- id: set_network
label: Set Network Settings
kind: action
params:
- name: hostname
type: string
description: Device hostname
- name: tls
type: boolean
description: Enable TLS (uses wss:// on port 443 when true)
- name: dhcp
type: boolean
description: Use DHCP
- name: ip
type: string
description: Static IP address
- name: netmask
type: string
description: "Subnet mask (CIDR notation also accepted, e.g. '/24')"
- name: gateway
type: string
description: Default gateway IP
- name: primary_dns
type: string
description: Primary DNS server IP
- name: secondary_dns
type: string
description: Secondary DNS server IP
command: '{ "set": { "name": "network", "config": { "hostname": "sensor1", "tls": false, "ipSettings": { "dhcp": false, "ip": "192.168.1.254", "netmask": "/24", "gateway": "192.168.1.1", "dns": { "primary": "192.168.1.1", "secondary": "10.1.1.1" } } } } }'
- id: set_systemInfo
label: Set System Info
kind: action
params:
- name: name
type: string
description: Friendly device name
- name: location
type: string
description: Device location label
command: '{ "set": { "name": "systemInfo", "config": { "name": "sensor1", "location": "Executive Conference Room" } } }'
- id: set_user
label: Set User Credentials
kind: action
params:
- name: username
type: string
description: Username for API authentication
- name: password
type: string
description: Password for API authentication
command: '{ "set": { "name": "user", "config": { "username": "admin", "password": "Atlona" } } }'
- id: set_protocols
label: Set Protocol Config
kind: action
params:
- name: config
type: object
description: "Protocol configuration object (tcp, udp with subscriber list, ws)"
command: '{ "set": { "name": "protocols", "config": { "udp": { "subscribers": { "1": { "enabled": true, "ip": "192.168.1.50", "port": 9000, "motion": true, "light": true, "temperature": true } } } } } }'
- id: set_info
label: Set Aggregate Device Info
kind: action
params:
- name: config
type: object
description: "Composite info object containing networkInfo and/or protocolInfo sub-objects"
command: '{ "set": { "name": "info", "config": { "networkInfo": { "hostname": "sensor1", "tls": false, "ipSettings": { "dhcp": true } }, "protocolInfo": { "tcp": false } } } }'
- id: set_networkInfo
label: Set Network Info
kind: action
params:
- name: hostname
type: string
description: Device hostname
- name: tls
type: boolean
description: Enable TLS (uses wss:// on port 443 when true)
- name: dhcp
type: boolean
description: Use DHCP
- name: ip
type: string
description: Static IP address
- name: netmask
type: string
description: "Subnet mask (CIDR notation also accepted, e.g. '/24')"
- name: gateway
type: string
description: Default gateway IP
- name: primary_dns
type: string
description: Primary DNS server IP
- name: secondary_dns
type: string
description: Secondary DNS server IP
command: '{ "set": { "name": "networkInfo", "config": { "hostname": "sensor1", "tls": false, "ipSettings": { "dhcp": false, "ip": "192.168.1.254", "netmask": "/24", "gateway": "192.168.1.1", "dns": { "primary": "192.168.1.1", "secondary": "10.1.1.1" } } } } }'
- id: set_protocolInfo
label: Set Protocol Info
kind: action
params:
- name: tcp
type: boolean
description: Enable or disable TCP protocol support
- name: udp
type: boolean
description: Enable or disable UDP protocol support
- name: ws
type: boolean
description: Enable or disable WebSocket protocol support
- name: mqtt
type: boolean
description: Enable or disable MQTT protocol support
command: '{ "set": { "name": "protocolInfo", "config": { "tcp": false } } }'
- id: method_reboot
label: Reboot
kind: action
params: []
command: '{"method":"reboot"}'
feedback: '{ "error": false, "reply": "Rebooting…" }'
- id: method_factory_default
label: Factory Reset
kind: action
params: []
command: '{"method":"factory_default"}'
feedback: '{ "error": false, "reply": "Resetting to Factory Default and Rebooting…" }'
- id: method_identify
label: Identify (Blink / Light Sensor Readout)
kind: action
params: []
command: '{"method":"identify"}'
- id: method_help
label: List Available Nodes
kind: action
params: []
command: '{"method":"help"}'
Feedbacks
- id: device_info
label: Device Info
type: object
query_command: '{"get":"deviceInfo"}'
fields:
- name: model
type: string
- name: hardwareRevision
type: string
- name: serialNumber
type: string
- name: firmwareVersion
type: string
- name: uptime
type: string
description: "Format: D:HH:MM:SS"
- id: hardware_info
label: Hardware Info
type: object
query_command: '{"get":"hardwareInfo"}'
fields:
- name: sensors.motion.detected
type: boolean
- name: sensors.motion.lastDetection
type: string
description: "Time since last motion detection, format D:HH:MM:SS"
- name: sensors.light.values.white
type: integer
- name: sensors.light.values.red
type: integer
- name: sensors.light.values.green
type: integer
- name: sensors.light.values.blue
type: integer
- name: sensors.temperature.values.ADC
type: integer
- name: sensors.temperature.values.F
type: number
- name: sensors.temperature.values.C
type: number
- name: led.rgb
type: string
- name: led.center
type: boolean
- name: led.outer
type: boolean
- name: led.auto
type: boolean
- id: info_state
label: Aggregate Info
type: object
query_command: '{"get":"info"}'
fields:
- name: deviceInfo
type: object
description: Aggregate device info object including model, hardwareRevision, serialNumber, firmwareVersion, and uptime
- name: systemInfo
type: object
description: Aggregate system info object including name and location
- name: networkInfo
type: object
description: Aggregate network info object including MAC address, hostname, TLS, and IP settings
- name: protocolInfo
type: object
description: Aggregate protocol state object including tcp, udp, ws, and mqtt flags
- id: motion_state
label: Motion Sensor State
type: object
query_command: '{"get":"motion"}'
fields:
- name: detected
type: boolean
description: True if motion is currently detected
- name: lastDetection
type: string
description: "Time since last detection, format D:HH:MM:SS"
- name: activeDelay
type: integer
description: Active occupancy delay in seconds
- name: noDelay
type: integer
description: No-occupancy delay in seconds
- id: light_state
label: Light Sensor State
type: object
query_command: '{"get":"light"}'
fields:
- name: values.white
type: integer
description: White channel ADC value
- name: values.red
type: integer
- name: values.green
type: integer
- name: values.blue
type: integer
- name: sensitivity
type: integer
- name: events.unit
type: string
- name: events.threshold
type: integer
- id: temperature_state
label: Temperature Sensor State
type: object
query_command: '{"get":"temperature"}'
fields:
- name: values.ADC
type: integer
description: Raw ADC reading (or string "Stabilizing" on startup)
- name: values.F
type: number
description: Temperature in Fahrenheit
- name: values.C
type: number
description: Temperature in Celsius
- name: events.unit
type: string
description: "Event threshold unit: 'F' or 'C'"
- name: events.threshold
type: number
- id: led_state
label: LED State
type: object
query_command: '{"get":"led"}'
fields:
- name: rgb
type: string
description: Current LED hex RGB color
- name: center
type: boolean
- name: outer
type: boolean
- name: auto
type: boolean
- name: motionTrue
type: string
- name: motionFalse
type: string
- id: network_state
label: Network Settings
type: object
query_command: '{"get":"network"}'
fields:
- name: macAddress
type: string
- name: hostname
type: string
- name: tls
type: boolean
- name: ipSettings.dhcp
type: boolean
- name: ipSettings.ip
type: string
- name: ipSettings.netmask
type: string
- name: ipSettings.gateway
type: string
- id: network_info_state
label: Network Info
type: object
query_command: '{"get":"networkInfo"}'
fields:
- name: macAddress
type: string
- name: hostname
type: string
- name: tls
type: boolean
- name: ipSettings.dhcp
type: boolean
- name: ipSettings.ip
type: string
- name: ipSettings.netmask
type: string
- name: ipSettings.gateway
type: string
- name: ipSettings.dns.primary
type: string
- name: ipSettings.dns.secondary
type: string
- id: protocol_info
label: Active Protocol State
type: object
query_command: '{"get":"protocolInfo"}'
fields:
- name: tcp
type: boolean
- name: udp
type: boolean
- name: ws
type: boolean
- name: mqtt
type: boolean
- id: protocols_state
label: Protocol Configuration
type: object
query_command: '{"get":"protocols"}'
fields:
- name: tcp.enabled
type: boolean
- name: tcp.port
type: integer
- name: udp.enabled
type: boolean
- name: udp.port
type: integer
- name: udp.subscribers
type: object
description: Subscriber map keyed by slot number, each with enabled/ip/port and motion/light/temperature flags
- name: ws.enabled
type: boolean
- name: ws.port
type: integer
- id: sensors_state
label: All Sensors State
type: object
query_command: '{"get":"sensors"}'
fields:
- name: motion.detected
type: boolean
- name: motion.lastDetection
type: string
description: "Time since last motion detection, format D:HH:MM:SS"
- name: motion.activeDelay
type: integer
- name: motion.noDelay
type: integer
- name: light.values.white
type: integer
- name: light.values.red
type: integer
- name: light.values.green
type: integer
- name: light.values.blue
type: integer
- name: light.sensitivity
type: integer
- name: light.events.unit
type: string
- name: light.events.threshold
type: integer
- name: temperature.values.ADC
type: integer
description: Raw ADC reading (or string "Stabilizing" on startup)
- name: temperature.values.F
type: number
- name: temperature.values.C
type: number
- name: temperature.events.unit
type: string
- name: temperature.events.threshold
type: number
- id: system_info
label: System Info
type: object
query_command: '{"get":"systemInfo"}'
fields:
- name: name
type: string
- name: location
type: string
- id: user_info
label: User Account Info
type: object
query_command: '{"get":"user"}'
fields:
- name: username
type: string
- name: passwordHash
type: string
description: "Always 'N/A' in source examples"
- id: error_flag
label: Command Error Flag
type: boolean
description: >
Every reply includes an "error" field. If true, the request failed.
If the command is malformed or fails, the device replies with "Invalid command".
Variables
- id: motion_delay
label: Motion Occupancy Delay
type: integer
description: Seconds before occupied→unoccupied transition is declared
set_command_template: '{ "set": { "name": "motion", "config": { "delay": {value} } } }'
- id: light_sensitivity
label: Light Sensor Sensitivity
type: integer
description: Sensitivity level for light sensor
set_command_template: '{ "set": { "name": "light", "config": { "sensitivity": {value} } } }'
- id: light_threshold
label: Light Event Threshold (ADC)
type: integer
set_command_template: '{ "set": { "name": "light", "config": { "events": { "threshold": {value} } } } }'
- id: temperature_threshold
label: Temperature Event Threshold
type: number
set_command_template: '{ "set": { "name": "temperature", "config": { "events": { "threshold": {value} } } } }'
- id: temperature_unit
label: Temperature Event Unit
type: enum
values: [F, C]
set_command_template: '{ "set": { "name": "temperature", "config": { "events": { "unit": "{value}" } } } }'
Events
# The device supports UDP push subscriptions for unsolicited sensor events.
# Up to 2 UDP subscribers can be registered (subscriber keys "1" and "2").
# Each subscriber can independently subscribe to motion, light, and/or temperature events.
# Configure via set:protocols - example:
# { "set": { "name": "protocols", "config": { "udp": { "subscribers": {
# "1": { "enabled": true, "ip": "192.168.1.50", "port": 9000,
# "motion": true, "light": true, "temperature": true } } } } } }
# UNRESOLVED: exact JSON payload structure of unsolicited UDP event messages not shown in source
Macros
# UNRESOLVED: no multi-step sequences documented in source
Safety
confirmation_required_for:
- method_factory_default # irreversible - resets all config and reboots
- method_reboot # causes device downtime
interlocks: []
# UNRESOLVED: no additional safety warnings or interlock procedures stated in source
Notes
- All commands are JSON objects, terminated with a carriage return. Commands are case-sensitive.
- Every response from the device includes an
"error"boolean field.true= request failed. - Requests may include an optional
"id"field (arbitrary string) for async correlation; the device echoes it in the reply unchanged. - Asynchronous use is not supported for
method:requests. - TLS is enabled by default. When TLS is enabled, WebSocket connects on port 443 (
wss://); when disabled, port 80 (ws://). TCP/UDP JSON API is always on port 9000. - MQTT is supported on port 1883 (default disabled per
get:protocolInfoexample). The MQTT topic/payload structure is not documented in the source. - The
idfield in async requests can be any value; uniqueness across concurrent requests is the client's responsibility. - On startup, temperature sensor may report
"ADC": "Stabilizing"/"F": "Stabilizing"/"C": "Stabilizing"before the sensor is ready. - The
set:networkInfoandset:networknodes appear to be aliases for the same operation based on source examples. method:identifyreturns a stream of light sensor readings (the reply stream is truncated in source).
Provenance
source_domains:
- atlona.com
source_urls:
- https://atlona.com/pdf/AT-OCS-900N_API.pdf
retrieved_at: 2026-04-30T04:26:20.426Z
last_checked_at: 2026-06-02T21:40:03.401Z
Verification Summary
verdict: verified
checked_at: 2026-06-02T21:40:03.401Z
matched_actions: 30
action_count: 30
confidence: medium
summary: "All 30 spec action units (16 actions + 14 feedbacks with query_command) match verbatim source commands; transport parameters confirmed; source catalogue is exactly 30 commands. (9 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "MQTT command/topic structure not covered in source document"
- "firmware version compatibility range not stated"
- "exact JSON payload structure of unsolicited UDP event messages not shown in source"
- "no multi-step sequences documented in source"
- "no additional safety warnings or interlock procedures stated in source"
- "MQTT topic/payload schema not in source"
- "Maximum number of concurrent WebSocket connections not stated"
- "Rate limiting or command throttling behavior not stated"
- "export_config / import_config / upgrade methods listed in method:help reply but not individually documented in source"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0