Framework changelog¶
Adapter-facing changes in Pq.Adapters.Framework between server releases.
Versions match the server tags. Newest on top.
Only what affects building an adapter is listed here: the framework's public API, the source generator, the YAML schemas, and the diagnostics. Server internals are out of scope.
Changes that need an edit to an existing adapter have a numbered record with exact steps under Framework breaking changes.
v1.17.4 — 2026-09-23¶
Added¶
FireControlOutputtest (revision) state. The function gains the statefire.testand the actionsFireControlTestStarted(→fire.test, emitspq.event.fire.test.started) andFireControlTestEnded(→control.off, emitspq.event.fire.test.completed), so an adapter can report an output under test.
v1.17.3 — 2026-09-22¶
No changes to the adapter surface.
v1.17.2 — 2026-09-21¶
No changes to the adapter surface.
v1.17.1 — 2026-09-21¶
No changes to the adapter surface.
v1.17.0 — 2026-09-21¶
⚠ Breaking changes¶
lpr_cameracategory renamed tovca_camerain theadapter-registrationschema. Breaks: anadapter.yamlthat declarescategory: lpr_camerano longer validates. Migration: change the category tovca_camera.- Unknown keys in adapter YAML are rejected. Breaks: a misspelled or obsolete property in
adapter-registration.yaml, the functions, access-model or commands YAML fails the build with PQA002 (error) instead of being silently ignored. Migration: remove or correct the key the diagnostic names. - TCP transport no longer takes a device address. Breaks:
ConnectChannel(address, host, port, …),Disconnect(address),GetChannel(address)and the parameterlessDisconnect()/GetChannel()onSingleTcpTransportBaseare gone, and a TCP transport withaddress_typealways generatesSingleTcpTransportBase. Migration: callConnectChannel(host, port, router, ct), keep the returned channel, and disconnect withawait channel.Disconnect(). FrameBase.IsUnsolicitedremoved. Breaks: an adapter frame that overrides it no longer compiles. Migration: returnMatchResult.OutOfBandfromMatchResponsefor frames the device pushes on its own.ProtocolChannel.TcpConnectionremoved. Breaks: code that wrote raw bytes throughchannel.TcpConnection.Write(…). Migration: usechannel.SendOutOfBand(frame, ct)(orSendOutOfBandinTcpProtocolBase).- A
customtransport is single-device; several devices per transport needmultiplex. Breaks: a custom transport that binds routers by address (Bind/Resolveper device) generates a single-device base, so every device shares one router and events land on the wrong device with no error. Migration: settransport: type: multiplexinadapter-registration.yaml; single-device custom transports need no change. See 0001. PlaybackRelayRegistry.AddandCleartake the owning device. Breaks:Add(transactionId, relay)andClear()no longer compile. Migration: callAdd(device.DeviceId, transactionId, relay)andClear(deviceId).
Added¶
multiplextransport type (schema enumtcp/custom/multiplex) with base classesMultiplexTransportBase<TAddress, TEvent>(routes several devices by address) andSingleDeviceTransportBase<TAddress, TEvent>(one device, no address bookkeeping).MatchResult.OutOfBand— return it for a frame the device may send at any time (poll, heartbeat, push). The channel hands it to the unmatched-frame handlers without a warning and keeps waiting for the reply.SendOutOfBand(frame, ct)onProtocolChannelandTcpProtocolBase— writes straight to the wire, bypassing the request queue; use it for teardown frames and replies to device-initiated frames.ProtocolChannel.Disconnect(), and an optionalparserargument onConnectChannelso an adapter can keep per-connection parser state (for example a session cipher).- Inline string length in YAML property types:
pin: string[4](exact) orpin: string[4, 6](range), in the access model and in function properties. The framework drops out-of-range values before upload and reports them asValueOutOfRange. - PQA033 (warning): an access-model
pin: stringproperty without a length warns. The warning does not fail a build with warnings-as-errors. - Diagnostic help pages on docs.protequ.com for PQA001–PQA010, PQA014, PQ0001, PQ0002 and TD001–TD003; every PQA, PQC, PQ and TD diagnostic links to its page.
QrCodecredentials reach access synchronization as the bare decoded text, likePinandLicensePlate; no image is uploaded.
Changed¶
MatchResult.Continueno longer drops the connection; the channel delivers the frame to the unmatched-frame handlers and keeps waiting.- Logs written inside a device tree carry
PanelIdandPanel(name plus short id), so one filter on the panel catches the whole tree.
Fixed¶
- One device disconnecting no longer tears down the playback relays of the adapter's other devices.
- Recorded-video playback no longer stays blank after the stream reconnects: a reopened session resumes from the last requested position, and a closing session no longer blocks its reconnecting viewer.
v1.16.0 — 2026-09-17¶
Added¶
FrameBase.IsUnsolicited— override it totrueon frames the device pushes on its own. The channel then does not match them to a pendingSend; it delivers them on the unmatched path so the adapter can decode them. Defaults tofalse, existing frames unchanged.lpr_cameracategory in theadapter-registrationschema — for a channel whose product is licence-plate recognition. An ordinary video channel stayscamera.
v1.15.6 — 2026-09-13¶
No changes to the adapter surface.
v1.15.5 — 2026-09-11¶
Fixed¶
- Events recovered from a device's history (offline backfill, history poll) now carry the time the event actually happened in the audit, instead of the moment they were read back. Live events were already correct.
v1.15.4 — 2026-09-10¶
Added¶
- New remote-operator event variants:
pq.event.intrusion.bypassed.remote,pq.event.intrusion.bypassed.cleared.remote,pq.event.intrusion.alarm.acknowledged.remote,pq.event.safety.emergency.evacuation.remote,…evacuation.cleared.remote,…lockdown.remote,…lockdown.cleared.remote. - New function actions for remote operator control across the intrusion and safety functions:
EvacuationRemote,EvacuationClearedRemote,LockdownRemote,LockdownClearedRemote,BypassedRemote,BypassCancelledRemote,AlarmAcknowledged,AlarmAcknowledgedRemote. - New public members on
RtspPlaybackSession:ServedVideoTrack(the track the session settled on) andIsOpen.
Changed¶
- Video preset events
pq.event.video.preset.activatedand…preset.storednow accept an optionalpersonId, so an operator-issued preset command can be attributed. Adapters that do not pass it are unaffected.
v1.15.3 — 2026-09-04¶
Added¶
- New
fire.disabledstate for fire panels — status only. The disabled address publishes its ownpq.event.fire.address.disabled, so the panel-level state does not duplicate it.
v1.15.2 — 2026-09-03¶
No changes to the adapter surface.
v1.15.1 — 2026-09-02¶
Added¶
- New
AuthenticatedProtocolfunction for devices with an authenticated application session, exposing statesprotocol.authenticated,protocol.authentication.failed,protocol.handshake.failed(plus matchingpq.state.protocol.*statuses). - New
access_sync_enabledproperty (bool, defaulttrue) on theAccessSynchronizationfunction. Turn it off and the adapter stops writing cardholders, credentials, holidays and antipassback to the panel; switch it back on and run Reset to discard what the panel gained meanwhile. - Property types may now be declared as whole-type arrays (e.g.
guid[],card_format[]) and resolve to a typed array. An array whose element type is unknown is now rejected at build time.
Fixed¶
- The
pq.event.device.unresolved(unknown/unconfigured device) event now accepts the optional attribution paramsunresolvedAddress,personId,credentialId,credentialInfo,rawData— so an unknown-card event can carry the person, credential and raw card data.
v1.15.0 — 2026-08-31¶
No changes to the adapter surface.