From 436f3fc91155ea5bc3e3f90b4bfa36303fb88ce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Besson?= Date: Sat, 9 May 2026 22:42:39 +0200 Subject: [PATCH] feat(capabilities): add optional position capability for mowers Adds Capabilities.position as an optional CapabilityEvent[PositionsEvent] so devices that don't expose the full map capability (e.g. mowers like the Ecovacs GOAT family) can still report their position to consumers. Wired into the GOAT A1600 RTK (xmp9ds) using GetPos. Other devices stay unaffected (position defaults to None; vacuums keep using CapabilityMap.position). --- deebot_client/capabilities.py | 1 + deebot_client/hardware/xmp9ds.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/deebot_client/capabilities.py b/deebot_client/capabilities.py index 34d47dcbf..bfd40654e 100644 --- a/deebot_client/capabilities.py +++ b/deebot_client/capabilities.py @@ -276,6 +276,7 @@ class Capabilities(ABC): map: CapabilityMap | None = None network: CapabilityEvent[NetworkInfoEvent] play_sound: CapabilityExecute[[]] + position: CapabilityEvent[PositionsEvent] | None = None settings: CapabilitySettings state: CapabilityEvent[StateEvent] station: CapabilityStation | None = None diff --git a/deebot_client/hardware/xmp9ds.py b/deebot_client/hardware/xmp9ds.py index 7bfd87c73..b2f6fcd85 100644 --- a/deebot_client/hardware/xmp9ds.py +++ b/deebot_client/hardware/xmp9ds.py @@ -40,6 +40,7 @@ from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan from deebot_client.commands.json.network import GetNetInfo from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos from deebot_client.commands.json.stats import GetStats, GetTotalStats from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect from deebot_client.commands.json.volume import GetVolume, SetVolume @@ -58,6 +59,7 @@ LifeSpanEvent, MoveUpWarningEvent, NetworkInfoEvent, + PositionsEvent, ReportStatsEvent, SafeProtectEvent, StateEvent, @@ -102,6 +104,7 @@ def get_device_info() -> StaticDeviceInfo: ), network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), play_sound=CapabilityExecute(PlaySound), + position=CapabilityEvent(PositionsEvent, [GetPos()]), settings=CapabilitySettings( advanced_mode=CapabilitySetEnable( AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode