Summary

The SKAARHOJ Smart Tally is a PoE-powered Ethernet tally lamp for live production, featuring front and rear LED indicators (Red, Green, Amber, Off). It is controllable via the SKAARHOJ Raw Panel protocol over TCP (port 9923), TSL v3.1/v5.0 over UDP (port 7001), a simple HTTP REST API, and a USB-C serial console. This spec covers all four documented control interfaces plus the device's web-configuration command set.

Transport

protocols:
  - tcp
  - udp
  - http
  - serial
addressing:
  # Raw Panel TCP server (SKAARHOJ protocol), advertised via mDNS
  port: 9923
  # HTTP/REST base path prefix; full device base URL not fixed in source
  base_url: "http://<device_ip>"  # device IP set via DHCP or serial ip= command
  udp_port: 7001  # TSL v3.1 / v5.0 listener
serial:
  baud_rate: 115200
  data_bits: 8      # UNRESOLVED: data bits not explicitly stated in source
  parity: none      # UNRESOLVED: parity not explicitly stated in source
  stop_bits: 1      # UNRESOLVED: stop bits not explicitly stated in source
auth:
  # HTTP API uses HTTP Basic auth, credentials in cleartext (default admin/skaarhoj).
  # TCP Raw Panel: optional single-client-IP restriction (no token in source).
  # Serial console: no auth documented.
  type: basic
  scheme: http_basic  # cleartext; source warns: trusted local networks only
  default_username: admin
  default_password: skaarhoj

Traits

traits:
  - levelable   # inferred: front/rear intensity sliders 0-8 (source 5.2)
  - queryable   # inferred: getInfo / dumpIP / ip= / ping return values

Actions

# HTTP REST API (see 5.6). All return JSON device state.
- id: http_set_lamp_color
  label: Set Lamp Color (HTTP)
  kind: action
  command: "GET /tally/{lamp}/{color}"
  params:
    - name: lamp
      type: string
      description: "front or rear"
    - name: color
      type: string
      description: "red, green, or amber"

- id: http_lamp_off
  label: Turn Lamp Off (HTTP)
  kind: action
  command: "GET /tally/{lamp}/off"
  params:
    - name: lamp
      type: string
      description: "front or rear"

- id: http_toggle_lamp
  label: Toggle Lamp Color (HTTP)
  kind: action
  command: "GET /tally/{lamp}/toggle/{color}"
  params:
    - name: lamp
      type: string
      description: "front or rear"
    - name: color
      type: string
      description: "red, green, or amber"

- id: http_reset_simulated_state
  label: Reset Simulated Button/GPI State
  kind: action
  command: "GET /reset_simulated_state"
  params: []

# USB Serial Monitor commands (see 4.6). Plain text, newline-terminated.
- id: serial_help
  label: Show Serial Help
  kind: query
  command: "help"
  params: []

- id: serial_set_ip_static
  label: Set Static IP
  kind: action
  command: "ip={a.b.c.d}"
  params:
    - name: a.b.c.d
      type: string
      description: "Static IPv4 address"

- id: serial_set_ip_dhcp
  label: Enable DHCP
  kind: action
  command: "ip=0.0.0.0"
  params: []

- id: serial_query_ip
  label: Query Current IP
  kind: query
  command: "ip=?"
  params: []

- id: serial_set_subnet
  label: Set Subnet Mask
  kind: action
  command: "subnet={a.b.c.d}"
  params:
    - name: a.b.c.d
      type: string
      description: "Subnet mask"

- id: serial_set_gateway
  label: Set Gateway
  kind: action
  command: "gateway={a.b.c.d}"
  params:
    - name: a.b.c.d
      type: string
      description: "Gateway IPv4 address"

- id: serial_set_dns
  label: Set DNS Server
  kind: action
  command: "dns={a.b.c.d}"
  params:
    - name: a.b.c.d
      type: string
      description: "DNS server IPv4 address"

- id: serial_reset
  label: Soft Reset
  kind: action
  command: "reset"
  params: []

- id: serial_reboot
  label: Reboot (alias of reset)
  kind: action
  command: "reboot"
  params: []

- id: serial_notick
  label: Disable Dot/Loopcount Output
  kind: action
  command: "notick"
  params: []

- id: serial_ping
  label: Ping (returns ack)
  kind: query
  command: "ping"
  params: []

- id: serial_debug
  label: Enable Debug Mode Until Reboot
  kind: action
  command: "debug"
  params: []

- id: serial_sockets
  label: Show Socket Status
  kind: query
  command: "sockets"
  params: []

- id: serial_newmac
  label: Generate and Save New MAC Address
  kind: action
  command: "newmac"
  params: []

- id: serial_reset_all
  label: Clear User Settings and Reset
  kind: action
  command: "_resetAll"
  params: []

- id: serial_get_cid
  label: Get Device CID
  kind: query
  command: "getCID"
  params: []

- id: serial_get_info
  label: Display Detailed Device Status (JSON)
  kind: query
  command: "getInfo"
  params: []

- id: serial_dump_ip
  label: Display IP Configuration
  kind: query
  command: "dumpIP"
  params: []

- id: serial_set_ethautoneg
  label: Set Ethernet PHY Auto-Negotiation
  kind: action
  command: "ethautoneg={0|1}"
  params:
    - name: value
      type: integer
      description: "0=disable, 1=enable (reboot to apply)"
  notes: "Reboot required to apply. Also settable via web UI (4.4.1)."

- id: serial_enter_rawpanel_mode
  label: Enter Raw Panel Mode on USB
  kind: action
  command: "serialRawPanel"
  params: []
  notes: "Switches USB to Raw Panel protocol; disables all other serial comms. Exit only by power-cycling."

# Raw Panel over TCP (port 9923) - example command documented in source (4.7)
- id: rawpanel_list
  label: Raw Panel List
  kind: query
  command: "list"
  params: []
  notes: "Example Raw Panel command over USB/TCP. Source does not enumerate full Raw Panel command set."

Feedbacks

# HTTP endpoints return this JSON state object (5.6 Response Format)
- id: device_state
  type: object
  schema: |
    { "front": "<red|green|amber|off>", "rear": "<red|green|amber|off>",
      "relay": <bool>, "buttons": [<bool>, <bool>, <bool>, <bool>] }

# Serial console responses
- id: ack
  type: string
  values: ["ack"]
  notes: "Returned by the `ping` serial command."

- id: device_info_json
  type: json
  notes: "Returned by `getInfo`. Detailed field set not enumerated in source."

- id: ip_configuration
  type: text
  notes: "Returned by `dumpIP` and `ip=?`."

- id: cid
  type: string
  notes: "Returned by `getCID`."

# Live connection status reported in web Overview tab (5.3)
- id: rawpanel_clients
  type: list
  notes: "Connected Raw Panel client IP addresses."

Variables

# Lamp intensity per lamp (web UI sliders, 5.2). Payload path via HTTP/serial
# not explicitly documented - control is via the web Lamp tab.
- id: front_lamp_intensity
  type: integer
  range: [0, 8]
  description: "0=Off; 1-8 increasing brightness. Set via web Lamp tab."

- id: rear_lamp_intensity
  type: integer
  range: [0, 8]
  description: "0=Off; 1-8 increasing brightness. Set via web Lamp tab."

# TSL per-lamp mapping rows (4 rows per lamp, 5.5). Configured via web TSL tab;
# no direct command payload documented for programmatic set.
- id: tsl_mapping
  type: object
  per_lamp: [front, rear]
  rows: 4
  fields: [mode, address, bit, screen, index, led_position, color]
  notes: "Mode: off|tsl3.1|tsl5.0. Color palette index 1-16 (0=blank). Set via web UI."

# Direct-switcher rule tables per lamp (5.7). Configured via web Devices tab.
- id: device_rule
  type: object
  per_lamp: [front, rear]
  fields: [show_color, camera_or_source, bus]
  notes: "First-match-wins, top to bottom. Bus options differ per switcher type."

# Raw Panel optional client restriction (5.4)
- id: rawpanel_client_ip_restriction
  type: string
  description: "Optional single client IP allowed to connect to TCP 9923."

Events

# No unsolicited device-originated notifications are documented on the control
# interfaces. The device is a listener (TSL UDP) and server (Raw Panel TCP, HTTP).
# Live status appears only in the web UI, not as pushed events.
# UNRESOLVED: no push/event channel documented in source.

Macros

# No explicit multi-step sequences documented in source.
# UNRESOLVED: populate if a firmware revision adds macro support.

Safety

confirmation_required_for:
  - "_resetAll"          # clears all user settings
  - "newmac"             # changes device MAC, may affect network identity
  - "ip=..."             # changing IP may disconnect current session
interlocks:
  - description: >
      Service conflict (5.3): Raw Panel, TSL, and Devices direct-connection all
      compete for lamp control. Only one controlling service should be active at
      a time for predictable behavior. The web UI warns when multiple are enabled.
  - description: >
      Lamp ownership (5.7): when a lamp has any Devices rule configured, that lamp
      is driven by Devices and cannot be overridden from Lamp tab, Raw Panel, or TSL.
warnings:
  - >
      HTTP Basic auth credentials are transmitted in cleartext. Source explicitly
      warns: use only on trusted local networks; do not expose to the internet
      without VPN/firewall (Unencrypted Login Credentials section).

Notes

  • Device identity: PoE-powered Ethernet tally lamp, dual front/rear LEDs (Red/Green/Amber/Off). Powered via PoE (IEEE 802.3af/t) or USB-C 5V.
  • Raw Panel HWC mapping (Standard model): HWC 1 = Front Lamp (Display/color), HWC 2 = Rear Lamp (Display/color).
  • USB-C port serves dual purpose: 5V power AND serial communication with SKAARHOJ Discovery.
  • Raw Panel over USB requires opening the port at 115200 bps, sending serialRawPanel\n first, then Raw Panel commands. Power-cycle required to exit this mode.
  • HTTP credentials may be embedded in URL: http://admin:<password>@<device_ip>/tally/front/red (cleartext).
  • The full SKAARHOJ Raw Panel protocol command set (beyond list) is not documented in this source; consult the Raw Panel SDK for complete coverage.
  • Direct switcher follow mode supports ATEM, vMix, and NewTek TriCaster. TriCaster sources: Input 1-44, DDR 1-4, Buffer 1-15, V1-V8, GFX 1-2.

Provenance

source_domains:
  - pid.skaarhoj.com
  - skaarhoj.com
source_urls:
  - https://pid.skaarhoj.com/Manuals/SKAARHOJ_manual-SMART-TALLY-V1.pdf
  - https://www.skaarhoj.com/raw-panel
retrieved_at: 2026-06-29T20:33:36.443Z
last_checked_at: 2026-06-30T07:14:05.174Z

Verification Summary

verdict: verified
checked_at: 2026-06-30T07:14:05.174Z
matched_actions: 25
action_count: 25
confidence: medium
summary: "All 25 spec actions matched literally in source; transport parameters verified; 25/25 coverage (1.0) exceeds 0.9 floor. (11 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "HTTP/TCP base host addressing and device IP discovery (DHCP/static) is configuration-dependent; no fixed hostname in source. Firmware version compatibility not stated."
- "data bits not explicitly stated in source"
- "parity not explicitly stated in source"
- "stop bits not explicitly stated in source"
- "no push/event channel documented in source."
- "populate if a firmware revision adds macro support."
- "firmware version compatibility not stated."
- "serial data_bits / parity / stop_bits not explicitly stated (only baud 115200 stated for Raw Panel USB mode)."
- "full Raw Panel command catalogue beyond `list` not in this source."
- "getInfo JSON field schema not enumerated in source."
- "relay and physical buttons referenced in HTTP state JSON but not described as physical hardware on Smart Tally (likely simulated-only endpoints)."

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0