Summary
IP-controlled outdoor TV series supporting TCP over HTTP on port 3000. Compatible models are SHD2 and UB4 series displays. Control is performed via JSON POST requests over HTTP; the device returns state information in the response body.
Transport
protocols:
- tcp
addressing:
port: 3000
base_url: http://{ip_address}
auth:
type: none # inferred: no auth procedure in source
Traits
powerable: true # inferred: power commands PWD:1, PWD:0, PWD:3 present
routable: true # inferred: input selection commands INP:N present
queryable: true # inferred: query commands PWD:?, CHA:?, INP:?, VOL:?, MUT:? present
levelable: true # inferred: volume commands VOL:+, VOL:-, VOL:XX present
Actions
# Power
- id: power_on
label: Power On
kind: action
command: "PWD:1"
params: []
- id: power_off
label: Power Off
kind: action
command: "PWD:0"
params: []
- id: power_toggle
label: Power Toggle
kind: action
command: "PWD:3"
params: []
- id: power_status_query
label: Power Status Query
kind: query
command: "PWD:?"
params: []
# Channel
- id: channel_up
label: Increase Channel
kind: action
command: "CHA:+"
params: []
- id: channel_down
label: Decrease Channel
kind: action
command: "CHA:-"
params: []
- id: channel_set
label: Set Channel
kind: action
command: "CHA:{channel}"
params:
- name: channel
type: string
description: Channel as XX.Y (X and Y are numbers 0-9; primary.secondary for digital channel)
- id: channel_status_query
label: Channel Status Query
kind: query
command: "CHA:?"
params: []
# Inputs
- id: input_select
label: Select Input
kind: action
command: "INP:{input}"
params:
- name: input
type: integer
description: |
Input number (source-documented mapping):
0=TV, 1=HDMI 1, 2=HDMI 2, 3=HDMI 3, 4=Component, 5=AV, 7=USB Media
- id: input_query
label: Input Query
kind: query
command: "INP:?"
params: []
# Volume
- id: volume_up
label: Volume Up
kind: action
command: "VOL:+"
params: []
- id: volume_down
label: Volume Down
kind: action
command: "VOL:-"
params: []
- id: volume_set
label: Set Volume
kind: action
command: "VOL:{level}"
params:
- name: level
type: integer
description: Volume level (VOL:XX, X is number 0-9); response reports 0-100
- id: volume_status_query
label: Volume Status Query
kind: query
command: "VOL:?"
params: []
# Mute
- id: mute_on
label: Mute On
kind: action
command: "MUT:1"
params: []
- id: mute_off
label: Mute Off
kind: action
command: "MUT:0"
params: []
- id: mute_toggle
label: Mute Toggle
kind: action
command: "MUT:3"
params: []
- id: mute_status_query
label: Mute Status Query
kind: query
command: "MUT:?"
params: []
Feedbacks
- id: power_state
label: Power State
type: enum
values:
- 0 # off
- 1 # on
- id: current_input
label: Current Input
type: integer
description: Current input number (0=TV,1=HDMI1,2=HDMI2,3=HDMI3,4=Component,5=AV,7=USB Media)
- id: current_channel
label: Current Channel
type: string
description: Current tuner channel as primary.secondary (e.g. "24.2")
- id: volume_level
label: Volume Level
type: integer
range: [0, 100]
- id: mute_state
label: Mute State
type: enum
values:
- 0 # unmute
- 1 # muted
Variables
# State is queried via the same command with "?" suffix, response is embedded
# in the HTTP response body under "state" key.
# No standalone settable parameters beyond actions.
Events
# UNRESOLVED: no unsolicited event notifications described in source
Macros
# UNRESOLVED: no multi-step sequences described in source
Safety
confirmation_required_for:
- power_off # recommended before adjusting network settings
interlocks:
- type: power_cycle_after_static_ip
description: "For static IP installations, power cycle the display after entering new IP address information to ensure proper control system operation."
Notes
Command format: All commands are POSTed as JSON to http://{ip}:3000/ with body {"command": "<cmd>", "id": <optional-int>}.
Response format: Response contains result ("SUCCESS", "INVALID VALUE", "INVALID JSON", or "UPDATE"), optional state object with current values, and optional info object with device metadata.
State query: No separate state query command exists; client sends any command and reads state block from response. A bare query command like PWD:? can be used to retrieve full state.
Model/serial info: Model (SHD2-55A) and serial are set at production; firmware version readable via info.firmware in response.
Channel format: Digital channels use primary.secondary notation (e.g., "24.2"). Analog channels use single number.
Runtime tracking: Device reports cumulative runtime in hours via info.runtime in response.
Changes vs on-disk:
- Added verbatim `command:` to all 13 existing actions (was payload-less → now implementable)
- Added 5 query actions documented as separate source rows: `power_status_query` (PWD:?), `channel_status_query` (CHA:?), `input_query` (INP:?), `volume_status_query` (VOL:?), `mute_status_query` (MUT:?)
- Resolved input-table UNRESOLVED — source confirms full mapping incl. `4=Component`
- Deduped accidental double `confirmation_required_for` key in Safety
- Preserved all IDs, shapes, transport, models, dates
## Provenance
```yaml
source_domains:
- storage.googleapis.com
source_urls:
- https://storage.googleapis.com/wp-stateless/2021/09/IPControl-SHD290.pdf
retrieved_at: 2026-07-16T08:34:33.466Z
last_checked_at: 2026-07-22T00:46:47.437Z
```
## Verification Summary
```yaml
verdict: verified
checked_at: 2026-07-22T00:46:47.437Z
matched_actions: 18
action_count: 18
confidence: medium
summary: "All 18 spec actions matched verbatim source command tokens; transport (TCP/HTTP port 3000) verified; coverage complete. (3 unresolved item(s) noted in Known Gaps.)"
```
## Known Gaps
```yaml
- "whether HDMI inputs support 4K/60Hz querying not stated in source"
- "no unsolicited event notifications described in source"
- "no multi-step sequences described in source"
```
---
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0