Live video holds up on a lossy link or a busy host, a HomeBase 2 hands over its event recordings, camera power is right on the HomeBase 3 and indoor cams, and Security push registration now actually delivers events.
npm install @mega-yfue/eufy-sdk@0.4.0Live video
- The SDK asks for a 4 MiB UDP receive buffer, so the kernel no longer drops a keyframe burst. On a small Linux host this took live view from 9–30 s with freezes to about 4 s and smooth.
- Late video datagrams are recovered and the stream resyncs after loss. The sequence counter no longer wraps at 255, and a frame header split across two datagrams is reassembled.
- Liveness is measured on the peer path actually in use, and a cached live source is rebuilt when its session is replaced.
- Closing the live view of a standalone camera stops its stream, so a floodlight's lamp turns off with it.
Recordings
- New:
camera().downloadRecording({ recording, cipherId })fetches an event recording a HomeBase 2 holds, over the station's P2P session, without waking the camera. It returns H.264 and AAC (ADTS) plus frame counts and duration, and throwsRecordingDownloadErroron failure.
Push
- Push registration completes on both the Mega and Security backends, so events raised by the app reach the SDK (#262).
- A thumbnail stored only on the station is attached to the push, and one the media host hasn't published yet is retried.
- Each received push and what it decoded to is logged at debug level.
Camera power
- T8410 on a HomeBase 3: power state and readback are correct.
- Indoor cams (incl. T8400 C120): the power switch uses the polarity the camera reports.
- T8423 floodlight is mains-powered.
- New:
cameraPowerTieris exported, so a host reads the same power tier the SDK uses.
Devices and realtime
- A station's face roster is read over P2P, so a recognised person shows up by name instead of "Person 1".
- The HomeBase 3 siren works over the station alarm wire it advertises.
- The classic Wi-Fi lock's result code is read correctly.
- When the MQTT broker refuses one subscription, the device keeps its other granted ones.
Breaking changes
| Change | What to do |
|---|---|
CapabilityDescriptor.accessor is optional: absent on a capability whose whole surface is inbound events (#276)
| Accept it missing, both in types and in any runtime validation of the manifest. |
No export removed. Added: cameraPowerTier, RecordingDownloadError, VIDEO_GCM_AAD.
Thanks to everyone who contributed to this release: @sapireli, @PatrioteQc, @max246, @martijnpoppen, @ohetzendorfer, @Tursko, @tturnerdev, @sstangle73, @shaarkys, @genomez, @danymexi, @danielmigueltejedor and @lenoxys.
What's Changed
- feat(p2p): read the zero-padded result code the classic Wi-Fi lock answers with by @tturnerdev in #233
- fix(p2p): carry a frame header cut by the datagram boundary into the next datagram by @PatrioteQc in #259
- fix(push): admit a station-only thumbnail under the push's device serial by @PatrioteQc in #258
- Keep a device's granted MQTT legs when the broker refuses one of them by @martijnpoppen in #256
- fix(p2p): ask for a 4 MiB receive buffer so keyframe bursts are not dropped by @ohetzendorfer in #255
- fix(p2p): validate shared-live timer durations by @sapireli in #213
- test(display): check unexposed through the binder, not the table by @max246 in #267
- fix(camera): classify T8423 as mains powered by @sapireli in #225
- test(http): keep gtoken header fixtures offline by @genomez in #286
- refactor(http): share the passport login and signing steps between the eufy and Solix clients by @max246 in #268
- fix(p2p): keep counting the level-2 sequence past 255 by @ohetzendorfer in #278
- fix(siren): admit the HomeBase 3 to the station alarm wire it already advertises by @danymexi in #242
- fix(camera): retry a push thumbnail the media host has not published yet by @PatrioteQc in #290
- fix(p2p): stop logging the device's 0xf143 address record as UNHANDLED by @sstangle73 in #289
- feat(p2p): download a recording stored on a HomeBase 2 by @PatrioteQc in #260
- feat(client): read a station's own face roster over P2P by @martijnpoppen in #277
- docs(model): define the provenance tiers once, on PropertySource by @max246 in #266
- fix(p2p): measure liveness on the selected peer path by @sapireli in #282
- fix(model)!: describe a capability that binds no surface, and claim the identified-person ids by @martijnpoppen in #276
- fix(p2p): take a recording's finish frame on channel 0 by @PatrioteQc in #298
- fix(p2p): name the input a connect's cloud lookup was missing by @lenoxys in #296
- feat(push): log each received push and what it decoded to by @lenoxys in #297
- fix(p2p): keep a recording's audio as the ADTS frames the camera sends by @PatrioteQc in #299
- fix(p2p): rebuild a cached live source after session replacement by @sapireli in #279
- feat(model): expose camera power tier by @sapireli in #308
- docs(agents): the SDK's job is the vendor protocol, and an option defaults to today's behaviour by @lenoxys in #275
- chore(deps): bump ip-address from 10.5.0 to 10.7.2 by @dependabot[bot] in #288
- chore(deps): bump markdown-it from 14.3.0 to 14.3.2 in /docs by @dependabot[bot] in #309
- fix(p2p): recover late video datagrams by @sapireli in #318
- fix(push): complete Security push registration by @danielmigueltejedor in #306
- fix(camera): correct T8410 HomeBase 3 power handling by @shaarkys in #304
- fix(p2p): stop an own-session camera's live stream with the direct 1004 by @lenoxys in #315
- fix(camera): use disable-bit power polarity for T8400 (C120) indoor cam by @Tursko in #319
- release: 0.4.0 by @lenoxys in #331
New Contributors
- @tturnerdev made their first contribution in #233
- @PatrioteQc made their first contribution in #259
- @ohetzendorfer made their first contribution in #255
- @genomez made their first contribution in #286
- @danymexi made their first contribution in #242
- @sstangle73 made their first contribution in #289
- @danielmigueltejedor made their first contribution in #306
- @shaarkys made their first contribution in #304
- @Tursko made their first contribution in #319
Full Changelog: v0.3.0...v0.4.0