State Observables Reference

Overview

This document provides a comprehensive reference of all state observables in the C Pro camera system. Observables are the core state management mechanism, providing reactive updates and persistent storage.

Observable System

Core Concepts

type
  Observable* = ref object
    key*: string                    # Unique identifier
    value: JsonNode                 # Current value
    default*: JsonNode              # Default value
    save*: bool                     # Persist to LocalStorage
    permissionRead*: StatePermissions   # Read permissions required
    permissionWrite*: StatePermissions  # Write permissions required
    isOnlyAskState*: bool          # Action-only (not persistent state)

Observable Categories

  • Device Control: Camera, motor, light settings
  • Media Management: Recording, streaming, tags
  • Network Configuration: IP, hostname, services
  • Storage: Paths, space monitoring
  • System: Info, time, updates
  • User Management: Users, roles, sessions

Device Observables

Camera Settings

activeCameraHead

  • Type: Integer (0 = Primary, 1 = Secondary)
  • Default: 0
  • Permissions: Read: Device_r, Device_rw | Write: Device_rw
  • Saved: No
  • Description: Currently active camera head (rc_DMG variant)

cameraHeadSettings

  • Type: Object
  • Default:
{
  "primary": {"device": "/dev/video0", "format": "NV12", "resolution": "1920x1080", "fps": 60},
  "secondary": {"device": "/dev/video1", "format": "NV12", "resolution": "1920x1080", "fps": 60}
}
  • Permissions: Read: Device_r, Device_rw | Write: Device_rw
  • Saved: Yes
  • Description: Configuration for each camera head

imageSettings

  • Type: Object
  • Default:
{
  "brightness": 50,
  "contrast": 50,
  "saturation": 50,
  "hue": 0,
  "sharpness": 50,
  "gamma": 100
}
  • Permissions: Read: Device_r, Device_rw | Write: Device_rw
  • Saved: Yes
  • Description: Image adjustment parameters

Motor Control

discRotation

  • Type: Object
  • Default:
{
  "enabled": false,
  "direction": "stopped",
  "speed": 0,
  "position": 0
}
  • Permissions: Read: Device_r, Device_rw | Write: Device_rw
  • Saved: No
  • Description: Rotation motor control (rc_DMG variant)

autoRotate

  • Type: Object
  • Default:
{
  "enabled": false,
  "sensitivity": 5,
  "threshold": 10
}
  • Permissions: Read: Device_r, Device_rw | Write: Device_rw
  • Saved: Yes
  • Description: Automatic rotation detection settings

Lighting

lightEnabled

  • Type: Boolean
  • Default: true
  • Permissions: Read: Device_r, Device_rw | Write: Device_rw
  • Saved: Yes
  • Description: Light power state

lightIntensity

  • Type: Integer (0-100)
  • Default: 100
  • Permissions: Read: Device_r, Device_rw | Write: Device_rw
  • Saved: Yes
  • Description: Light brightness percentage

lightTemperature

  • Type: Integer (Kelvin)
  • Default: 5500
  • Permissions: Read: Device_r, Device_rw | Write: Device_rw
  • Saved: Yes
  • Description: Color temperature in Kelvin

Media Observables

Recording

recordingState

  • Type: String ("stopped", "recording", "paused")
  • Default: "stopped"
  • Permissions: Read: Media_r, Media_rw | Write: Media_rw
  • Saved: No
  • Description: Current recording state

recordingMode

  • Type: String ("video", "timelapse", "slowmotion")
  • Default: "video"
  • Permissions: Read: Media_r, Media_rw | Write: Media_rw
  • Saved: Yes
  • Description: Recording mode selection

currentRecordingFile

  • Type: String
  • Default: ""
  • Permissions: Read: Media_r, Media_rw | Write: -
  • Saved: No
  • Description: Filename of active recording

Streaming

rtspEnabled

  • Type: Boolean
  • Default: true
  • Permissions: Read: Media_r, Media_rw | Write: Media_rw
  • Saved: Yes
  • Description: RTSP server enabled

rtspPort

  • Type: Integer
  • Default: 8554
  • Permissions: Read: Media_r, Media_rw | Write: Media_rw
  • Saved: Yes
  • Description: RTSP server port

streamResolution

  • Type: String
  • Default: "1920x1080"
  • Permissions: Read: Media_r, Media_rw | Write: Media_rw
  • Saved: Yes
  • Description: Stream resolution (WIDTHxHEIGHT)

streamFramerate

  • Type: Integer
  • Default: 60
  • Permissions: Read: Media_r, Media_rw | Write: Media_rw
  • Saved: Yes
  • Description: Stream frames per second

streamBitrate

  • Type: Integer
  • Default: 8000000
  • Permissions: Read: Media_r, Media_rw | Write: Media_rw
  • Saved: Yes
  • Description: Stream bitrate in bits/second

Tags and Categories

categories

  • Type: Object
  • Default: {}
  • Permissions: Read: Media_r, Media_rw | Write: -
  • Saved: Yes
  • Description: Tag category definitions (preserved across factory reset per #150)

categoryCounter

  • Type: Integer
  • Default: 1
  • Permissions: Read: - | Write: -
  • Saved: Yes
  • Description: Auto-increment counter for category IDs

changeTagCategory

  • Type: Object (action-only)
  • Default: {}
  • Permissions: Read: Media_r, Media_rw | Write: Media_rw
  • Saved: No
  • Description: Create/update/delete tag categories

Network Observables

Network Configuration

hostname

  • Type: String
  • Default: "rotoclear"
  • Permissions: Read: Network_r, Network_rw | Write: Network_rw
  • Saved: Yes
  • Description: System hostname

dhcpEnabled

  • Type: Boolean
  • Default: true
  • Permissions: Read: Network_r, Network_rw | Write: Network_rw
  • Saved: Yes
  • Description: Use DHCP for IP address

ipAddress

  • Type: String
  • Default: ""
  • Permissions: Read: Network_r, Network_rw | Write: Network_rw
  • Saved: Yes
  • Description: Static IP address (when DHCP disabled)

subnetMask

  • Type: String
  • Default: "255.255.255.0"
  • Permissions: Read: Network_r, Network_rw | Write: Network_rw
  • Saved: Yes
  • Description: Network subnet mask

gateway

  • Type: String
  • Default: ""
  • Permissions: Read: Network_r, Network_rw | Write: Network_rw
  • Saved: Yes
  • Description: Default gateway

dnsServers

  • Type: Array of Strings
  • Default: ["8.8.8.8", "8.8.4.4"]
  • Permissions: Read: Network_r, Network_rw | Write: Network_rw
  • Saved: Yes
  • Description: DNS server addresses

Storage Observables

Storage Management

recordingStorage

  • Type: Object
  • Default:
{
  "primary": "/media/data/recordings",
  "backup": "/media/backup/recordings",
  "network": ""
}
  • Permissions: Read: Storage_r, Storage_rw | Write: Storage_rw
  • Saved: Yes
  • Description: Recording storage locations

storageDevices

  • Type: Array
  • Default: []
  • Permissions: Read: Storage_r, Storage_rw | Write: -
  • Saved: No
  • Description: Available storage devices (dynamic)

storageSpace

  • Type: Object (dynamic)
  • Default: {}
  • Permissions: Read: Storage_r, Storage_rw | Write: -
  • Saved: No
  • Description: Storage space statistics

Network Storage

netStorageEnabled

  • Type: Boolean
  • Default: false
  • Permissions: Read: Storage_r, Storage_rw | Write: Storage_rw
  • Saved: Yes
  • Description: Enable network storage (NFS/SMB)

netStoragePath

  • Type: String
  • Default: ""
  • Permissions: Read: Storage_r, Storage_rw | Write: Storage_rw
  • Saved: Yes
  • Description: Network storage mount path

System Observables

System Information

systemInfo

  • Type: Object (read-only)
  • Default: {}
  • Permissions: Read: System_r, System_rw | Write: -
  • Saved: No
  • Description: System hardware and software info

cpuUsage

  • Type: Float
  • Default: 0.0
  • Permissions: Read: System_r, System_rw | Write: -
  • Saved: No
  • Description: Current CPU usage percentage

memoryUsage

  • Type: Object
  • Default: {"used": 0, "total": 0, "percent": 0}
  • Permissions: Read: System_r, System_rw | Write: -
  • Saved: No
  • Description: Memory usage statistics

fpgaTemperature

  • Type: Float
  • Default: 25.0
  • Permissions: Read: Device_r, Device_rw | Write: -
  • Saved: No
  • Description: FPGA temperature in Celsius (rc_DMG variant)

Time and Date

time

  • Type: String (ISO 8601)
  • Default: Current time
  • Permissions: Read: System_r, System_rw | Write: -
  • Saved: No
  • Description: Current system time

timezone

  • Type: String
  • Default: "UTC"
  • Permissions: Read: System_r, System_rw | Write: System_rw
  • Saved: Yes
  • Description: System timezone

ntpEnabled

  • Type: Boolean
  • Default: true
  • Permissions: Read: Network_r, Network_rw | Write: Network_rw
  • Saved: Yes
  • Description: Enable NTP time synchronization

ntpServers

  • Type: Array of Strings
  • Default: ["pool.ntp.org"]
  • Permissions: Read: Network_r, Network_rw | Write: Network_rw
  • Saved: Yes
  • Description: NTP server addresses

Firmware and Updates

swVersionNumber

  • Type: String
  • Default: Build version
  • Permissions: Read: System_r, System_rw, FirmwareUpdate_r, FirmwareUpdate_rw | Write: -
  • Saved: Yes
  • Description: Software version number

updateAvailable

  • Type: Boolean
  • Default: false
  • Permissions: Read: FirmwareUpdate_r, FirmwareUpdate_rw | Write: -
  • Saved: No
  • Description: Firmware update available flag

User Observables

User Management

users

  • Type: Object
  • Default: {}
  • Permissions: Read: User_r, User_rw | Write: User_rw
  • Saved: Yes
  • Description: User accounts and roles

userPasswords

  • Type: Object
  • Default: {}
  • Permissions: Read: - | Write: User_rw
  • Saved: Yes
  • Description: Hashed passwords (never readable)

currentUser

  • Type: String
  • Default: ""
  • Permissions: Read: All authenticated | Write: -
  • Saved: No
  • Description: Currently authenticated user

Action Observables

System Actions

restart

  • Type: Boolean (action-only)
  • Default: false
  • Permissions: Read: Reboot_rw | Write: Reboot_rw
  • Saved: No
  • Description: Trigger system restart

reset

  • Type: Boolean (action-only)
  • Default: false
  • Permissions: Read: FirmwareUpdate_rw | Write: FirmwareUpdate_rw
  • Saved: No
  • Description: Factory reset (preserves categories per #150)

systemReboot

  • Type: Boolean (action-only)
  • Default: false
  • Permissions: Read: Reboot_rw | Write: Reboot_rw
  • Saved: No
  • Description: Reboot system

Usage Examples

Reading Observable State

# Get observable
let recordingState = State.get("recordingState")

# Read current value
let isRecording = recordingState.value.getStr == "recording"

# Access with permissions check
if userPermissions.canRead(recordingState):
  echo "Recording state: ", recordingState.value

Writing Observable State

# Get observable
let streamBitrate = State.get("streamBitrate")

# Update value (triggers save if save=true)
streamBitrate.updateValue(%8000000)

# With permissions check
if userPermissions.canWrite(streamBitrate):
  streamBitrate.updateValue(%newBitrate)

Observing Changes

# Subscribe to changes
let recording = State.get("recordingState")
recording.onchange.subscribe proc(obs: Observable) =
  echo "Recording state changed to: ", obs.value

Copyright © 2025 Rotoclear