-
-
Notifications
You must be signed in to change notification settings - Fork 150
adding Deebot N30 Omni support (zwkcqc) #622
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
WalkthroughThe pull request introduces a new file, Changes
Possibly related PRs
Suggested labels
Suggested reviewers
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## dev #622 +/- ##
=======================================
Coverage 86.42% 86.42%
=======================================
Files 88 88
Lines 3301 3301
Branches 298 298
=======================================
Hits 2853 2853
Misses 394 394
Partials 54 54 ☔ View full report in Codecov by Sentry. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Outside diff range and nitpick comments (3)
deebot_client/hardware/deebot/zwkcqc.py (1)
Line range hint
137-146: Remove unsupported 'water' capabilityAccording to the PR description, the water flow rate feature does not work with the Deebot N30 Omni. Including the
watercapability may lead to functionality issues or user confusion. It would be best to remove this capability to accurately reflect the device's supported features.Apply this diff to remove the
watercapability:- water=CapabilitySetTypes( - event=WaterInfoEvent, - get=[GetWaterInfo()], - set=SetWaterInfo, - types=( - WaterAmount.LOW, - WaterAmount.MEDIUM, - WaterAmount.HIGH, - WaterAmount.ULTRAHIGH, - ), - ),tests/hardware/test_init.py (2)
Line range hint
70-133: Add test coverage for the new device 'zwkcqc'The new device
'zwkcqc'is not included in thetest_capabilities_event_extractiontest cases. To ensure that all capabilities of this device are correctly tested, please add an entry for'zwkcqc'in the parameterized test. This will validate that the capabilities defined inzwkcqc.pyare properly loaded and functioning as expected.Apply this diff to add the new device to the test cases:
@pytest.mark.parametrize( ("class_", "expected"), [ ( "5xu9h3", { AdvancedModeEvent: [GetAdvancedMode()], AvailabilityEvent: [GetBattery(is_available_check=True)], BatteryEvent: [GetBattery()], BorderSwitchEvent: [GetBorderSwitch()], CutDirectionEvent: [GetCutDirection()], ChildLockEvent: [GetChildLock()], CrossMapBorderWarningEvent: [GetCrossMapBorderWarning()], CustomCommandEvent: [], ErrorEvent: [GetError()], LifeSpanEvent: [GetLifeSpan([LifeSpan.BLADE, LifeSpan.LENS_BRUSH])], MoveUpWarningEvent: [GetMoveUpWarning()], NetworkInfoEvent: [GetNetInfo()], ReportStatsEvent: [], SafeProtectEvent: [GetSafeProtect()], StateEvent: [GetChargeState(), GetCleanInfoV2()], StatsEvent: [GetStats()], TotalStatsEvent: [GetTotalStats()], TrueDetectEvent: [GetTrueDetect()], VolumeEvent: [GetVolume()], }, ), ( "itk04l", { AdvancedModeEvent: [GetAdvancedMode()], AvailabilityEvent: [GetBattery(is_available_check=True)], BatteryEvent: [GetBattery()], BorderSwitchEvent: [GetBorderSwitch()], CutDirectionEvent: [GetCutDirection()], ChildLockEvent: [GetChildLock()], CrossMapBorderWarningEvent: [GetCrossMapBorderWarning()], CustomCommandEvent: [], ErrorEvent: [GetError()], LifeSpanEvent: [GetLifeSpan([LifeSpan.BLADE, LifeSpan.LENS_BRUSH])], MoveUpWarningEvent: [GetMoveUpWarning()], NetworkInfoEvent: [GetNetInfo()], ReportStatsEvent: [], SafeProtectEvent: [GetSafeProtect()], StateEvent: [GetChargeState(), GetCleanInfoV2()], StatsEvent: [GetStats()], TotalStatsEvent: [GetTotalStats()], TrueDetectEvent: [GetTrueDetect()], VolumeEvent: [GetVolume()], }, ), ( "yna5xi", { AdvancedModeEvent: [GetAdvancedMode()], AvailabilityEvent: [GetBattery(is_available_check=True)], BatteryEvent: [GetBattery()], CachedMapInfoEvent: [GetCachedMapInfo()], CarpetAutoFanBoostEvent: [GetCarpetAutoFanBoost()], CleanLogEvent: [GetCleanLogs()], ContinuousCleaningEvent: [GetContinuousCleaning()], CustomCommandEvent: [], ErrorEvent: [GetError()], FanSpeedEvent: [GetFanSpeed()], LifeSpanEvent: [ GetLifeSpan([LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH]) ], MapChangedEvent: [], MajorMapEvent: [GetMajorMap()], MapTraceEvent: [GetMapTrace()], MultimapStateEvent: [GetMultimapState()], NetworkInfoEvent: [GetNetInfo()], OtaEvent: [GetOta()], PositionsEvent: [GetPos()], ReportStatsEvent: [], RoomsEvent: [GetCachedMapInfo()], StateEvent: [GetChargeState(), GetCleanInfo()], StatsEvent: [GetStats()], TotalStatsEvent: [GetTotalStats()], VolumeEvent: [GetVolume()], WaterInfoEvent: [GetWaterInfo()], }, ), ( "p95mgv", { AdvancedModeEvent: [GetAdvancedMode()], AvailabilityEvent: [GetBattery(is_available_check=True)], BatteryEvent: [GetBattery()], CachedMapInfoEvent: [GetCachedMapInfo()], CarpetAutoFanBoostEvent: [GetCarpetAutoFanBoost()], CleanCountEvent: [GetCleanCount()], CleanPreferenceEvent: [GetCleanPreference()], ContinuousCleaningEvent: [GetContinuousCleaning()], CustomCommandEvent: [], EfficiencyModeEvent: [GetEfficiencyMode()], ErrorEvent: [GetError()], FanSpeedEvent: [GetFanSpeed()], LifeSpanEvent: [ GetLifeSpan( [ LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH, LifeSpan.UNIT_CARE, ] ) ], MajorMapEvent: [GetMajorMap()], MapChangedEvent: [], MapTraceEvent: [GetMapTrace()], MultimapStateEvent: [GetMultimapState()], NetworkInfoEvent: [GetNetInfo()], OtaEvent: [GetOta()], PositionsEvent: [GetPos()], ReportStatsEvent: [], RoomsEvent: [GetCachedMapInfo()], StateEvent: [GetChargeState(), GetCleanInfo()], StatsEvent: [GetStats()], TotalStatsEvent: [GetTotalStats()], TrueDetectEvent: [GetTrueDetect()], VoiceAssistantStateEvent: [GetVoiceAssistantState()], VolumeEvent: [GetVolume()], WaterInfoEvent: [GetWaterInfo()], }, ), + ( + "zwkcqc", + { + AdvancedModeEvent: [GetAdvancedMode()], + AvailabilityEvent: [GetBattery(is_available_check=True)], + BatteryEvent: [GetBattery()], + CachedMapInfoEvent: [GetCachedMapInfo()], + CarpetAutoFanBoostEvent: [GetCarpetAutoFanBoost()], + CleanCountEvent: [GetCleanCount()], + CleanLogEvent: [GetCleanLogs()], + CleanPreferenceEvent: [GetCleanPreference()], + ContinuousCleaningEvent: [GetContinuousCleaning()], + CustomCommandEvent: [], + ErrorEvent: [GetError()], + FanSpeedEvent: [GetFanSpeed()], + LifeSpanEvent: [ + GetLifeSpan([LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH]) + ], + MapChangedEvent: [], + MajorMapEvent: [GetMajorMap()], + MapTraceEvent: [GetMapTrace()], + MultimapStateEvent: [GetMultimapState()], + NetworkInfoEvent: [GetNetInfo()], + PositionsEvent: [GetPos()], + ReportStatsEvent: [], + RoomsEvent: [GetCachedMapInfo()], + StateEvent: [GetChargeState(), GetCleanInfo()], + StatsEvent: [GetStats()], + TotalStatsEvent: [GetTotalStats()], + TrueDetectEvent: [GetTrueDetect()], + VolumeEvent: [GetVolume()], + }, + ), ], - ids=["5xu9h3", "itk04l", "yna5xi", "p95mgv"], + ids=["5xu9h3", "itk04l", "yna5xi", "p95mgv", "zwkcqc"], ) async def test_capabilities_event_extraction( class_: str, expected: dict[type[Event], list[Command]] ) -> None: info = await get_static_device_info(class_) assert info is not None capabilities = info.capabilities assert capabilities._events.keys() == expected.keys() for event, expected_commands in expected.items(): assert ( capabilities.get_refresh_commands(event) == expected_commands ), f"Refresh commands doesn't match for {event}"
Line range hint
38-47: Include 'zwkcqc' in 'test_get_static_device_info' test casesTo ensure that
get_static_device_infocorrectly retrieves information for the new device'zwkcqc', consider adding a test case for it. This will help validate that the device information is properly loaded and can be accessed as expected.Apply this diff to add the new test case:
@pytest.mark.parametrize( ("class_", "expected"), [ ("not_specified", lambda: None), ("yna5xi", lambda: DEVICES["yna5xi"]), + ("zwkcqc", lambda: DEVICES["zwkcqc"]), ], ) async def test_get_static_device_info( class_: str, expected: Callable[[], StaticDeviceInfo] ) -> None: """Test get_static_device_info.""" static_device_info = await get_static_device_info(class_) assert static_device_info == expected()
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (2)
deebot_client/hardware/deebot/zwkcqc.py(1 hunks)tests/hardware/test_init.py(1 hunks)
🔇 Additional comments (2)
deebot_client/hardware/deebot/zwkcqc.py (2)
Line range hint 61-83: Capabilities for 'work_mode' and 'clean count' are correctly configured
The work_mode and count capabilities are properly implemented, aligning with the enhanced functionality for the Deebot N30 Omni as described in the PR. This ensures that the device can utilize the work mode settings and track the clean count effectively.
1-1:
Remove unintended filename declaration at the top of the file
Line 1 contains p1jij8.py, which appears to be an accidental inclusion from another file. This line is unnecessary and should be removed to avoid confusion.
Apply this diff to remove the unintended line:
- p1jij8.py
Likely invalid or redundant comment.
That's the actual reason, why I removed the fallback so models get add with all supported features instead of only some |
edenhaus
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @r1cht3r 👍
This is a relatively new model, this provides more features than I was previously getting with the fallback vacuum, including functioning work mode & clean count. Water flow rate was the only one that didn't work.
Summary by CodeRabbit
New Features
Bug Fixes