Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Operation Coverage

This page lists every ONVIF operation onvif-server routes, how each is backed, and what it does out of the box with an empty trait implementation. It is the authoritative answer to “will my client work against this device?”

onvif-server targets the Profile S streaming core — enough for a client to discover the device, enumerate a media profile, pull a stream/snapshot URI, drive PTZ, and run a pull-point event subscription. It is not a full ONVIF device: most management and configuration operations are absent.

Legend

BackingMeaning
FrameworkResponse built internally by onvif-server from builder config (e.g. advertised host, registered services). No trait method; nothing to implement.
Trait (default OK)Dispatched to a service-trait method that ships a working default. Usable without overriding; override to customise.
Trait (override)Dispatched to a service-trait method whose default returns a not_implemented SOAP fault. You must override it for the operation to work.
StaticReturns fixed, canned XML. Not overridable and not driven by your trait data.
AbsentNot routed. Returns a ter:ActionNotSupported SOAP fault.

“Default behaviour” = what happens when the service is registered but the trait method is not overridden. ✅ = a usable response; ⚠️ = a response that may not match your device; ❌ = a SOAP fault.

Device — tds, route /onvif/device_service

Namespace http://www.onvif.org/ver10/device/wsdl. Always mounted (required).

OperationBackingDefault behaviourNotes
GetSystemDateAndTimeTrait (default OK)Utc::now()Auth-exempt (clock-sync before authenticating). Always reports TimeZone=UTC, DateTimeType=Manual.
GetCapabilitiesFrameworkLists only the services you registered, with their XAddrs.
GetServicesFrameworkSame set; version hardcoded to 2.42.
GetScopesTrait (default OK)✅ two fixed scopesDefaults to video_encoder + Profile/Streaming. Note: these are not the scopes advertised over WS-Discovery (see below).
GetHostnameTrait (default OK)"onvif-device"FromDHCP=false.
GetDeviceInformationTrait (override)❌ faultOverride to return manufacturer/model/firmware/serial/hardware-id.
GetNetworkInterfacesTrait (override)❌ faultOverride to advertise NICs.
all other Device opsAbsent❌ faultSetHostname, SetScopes, GetUsers, SystemReboot, network/discovery config, etc. (~40 operations) are not routed.

Media — trt, route /onvif/media_service

Namespace http://www.onvif.org/ver10/media/wsdl (Media1). Optional. Media2 (ver20) is not implemented.

OperationBackingDefault behaviourNotes
GetProfilesTrait (default OK)✅ one static profileDefault is a single 1920×1080 H264 MainProfile. Override profiles() to expose real/multiple profiles.
GetStreamUriTrait (override)❌ faultOverride this — it is how clients learn the RTSP URL.
GetSnapshotUriTrait (override)❌ faultOverride for JPEG snapshot support.
GetVideoSourcesStatic⚠️ fixed 1920×1080@30Canned; ignores your profile data.
GetVideoSourceConfigurationsStatic⚠️ fixedCanned.
GetVideoEncoderConfigurationsStatic⚠️ fixed H264 1080pCanned. May disagree with the profiles you advertise.
all other Media opsAbsent❌ faultNo Set*, GetAudio*, GetOSDs, CreateProfile, options, etc.

PTZ — tptz, route /onvif/ptz_service

Namespace http://www.onvif.org/ver20/ptz/wsdl (the ver10 namespace is also accepted on requests). Optional.

OperationBackingDefault behaviourNotes
GetNodesStatic✅ one nodeFoV relative pan/tilt space, range −1..1, max 10 presets.
GetNodeStatic✅ / faultFaults on unknown node token.
GetConfigurationsStaticSingle PTZConfig.
GetConfigurationStatic✅ / faultFaults on unknown config token.
GetConfigurationOptionsStatic
GetServiceCapabilitiesStaticMoveStatus=true (attribute form, required by Frigate).
GetPresetsTrait (default OK)✅ empty listOverride to list saved presets.
GetStatusTrait (override)❌ faultUtcTime filled from the server clock.
RelativeMoveTrait (override)❌ faultCoordinates parsed (absent → 0.0; malformed → fault).
AbsoluteMoveTrait (override)❌ faultAs above.
ContinuousMoveTrait (override)❌ faultAs above.
StopTrait (override)❌ faultPanTilt/Zoom absent → both true.
GotoPresetTrait (override)❌ fault
SetPresetTrait (override)❌ faultReturns the preset token.
RemovePresetTrait (override)❌ fault
all other PTZ opsAbsent❌ faultNo GotoHomePosition/SetHomePosition, geo-move, presets-tours, etc.

Imaging — timg, route /onvif/imaging_service

Namespace http://www.onvif.org/ver20/imaging/wsdl. Optional.

OperationBackingDefault behaviourNotes
GetImagingSettingsTrait (override)❌ faultOnly the fields you set are emitted; white balance is reported as a single MANUAL element.
all other Imaging opsAbsent❌ faultNo SetImagingSettings, GetOptions, GetMoveOptions, focus Move/Stop/GetStatus.

Events — tev + WS-BaseNotification, route /onvif/events_service

Namespace http://www.onvif.org/ver10/events/wsdl. Optional. Implements the pull-point subscription lifecycle only.

OperationBackingDefault behaviourNotes
GetEventPropertiesStatic✅ minimalFixed topic set with an empty TopicSet. The get_event_properties trait method is not consulted.
CreatePullPointSubscriptionFrameworkCreates an in-memory subscription (UUID id, default 60 s lifetime; honours InitialTerminationTime).
PullMessagesFrameworkemptyValidates the subscription and returns current/termination time but no NotificationMessages — there is no actual event delivery.
UnsubscribeFrameworkRemoves the subscription.
all other Events opsAbsent❌ faultNo Subscribe (basic notify), renew, seek, etc.

WS-Discovery (UDP multicast 239.255.255.250:3702)

Not an HTTP/SOAP service. Gated behind the non-default discovery Cargo feature. When enabled, the server answers a Probe with ProbeMatches. It does not send an unsolicited Hello on start.

BehaviourBackingNotes
ProbeProbeMatchesFrameworkReplies to multicast Probe with the device-service XAddr and a fixed Types/Scopes set (dn:NetworkVideoTransmitter). These scopes are hardcoded in discovery and independent of DeviceService::get_scopes. See WS-Discovery.

What this is not

  • Profile S core only. No Profile T/G/A/M/D/C operations.
  • Media1 only (no Media2 / ver20 media).
  • No configuration writes. The only Set* operation implemented is PTZ SetPreset. Hostname, scopes, encoder config, imaging settings, users, network — none are settable.
  • No real event delivery. The pull-point lifecycle works, but PullMessages never returns notifications.
  • Several responses are static. Video source/encoder configs and the PTZ node/config tree are canned and can disagree with the profiles your trait advertises — keep them consistent in your implementation if a strict client cross-checks them.