* Add new cli command 'command' to execute arbitrary commands
This deprecates 'raw-command', which requires positional argument for module,
in favor of new 'command' that accepts '--module' option for IOT devices.
* Pull block list to the module level
* Avoid linear search for emeter realtime and emeter_today
Most of the time the data we want is at the end of the
list so we now search backwards to avoid having to
scale all the data and throw most of it away
* more tweaks
* coverage
* coverage
* preen
* coverage
* branch cover
Several KASA devices seem to have pretty strict buffer size limitations on incoming/outgoing data transfers.
Testing on KL125-US and HL103 has shown that sending a request size larger than about ~768 bytes will immediately crash the device. Additionally, a query that generates a response larger than ~4096 bytes will crash the KL125-US. I was unable to generate such a large response to test the HL103.
The KL125-US will only return such large queries when its monthly usage stats have been populated. This means that a new bulb would work fine, but after a month of data collection the bulb would break the 4K limit and start to crash.
To work around this issue, an estimated worst-case response size is calculated before sending a request by summing up all modules estimated response size. If the estimated size is greater than the device's max_response_payload_size then the query will be split into multiple queries.
This PR implements splitting queries expected to have large responses and also removes the module 'skip list' which was a previous workaround to the crash (which worked by simply reducing the number of modules queried, which prevented the overflow) since it is no longer necessary.
This PR does not attempt to address the "input buffer size limit." Thus far this limit has not been an issue.
* Basic fix for issue: https://github.com/python-kasa/python-kasa/issues/373
Change usage module get_daystat and get_monthat to return dictionaries of date index: time values as spec'd instead of raw usage data. Output matches emeter module get_daystat and get_monthstat
* Fixed some formatting and lint warnings to comply with black/flake8
Use the new _convert function in emeter for all conversions rather than the one in smartdevice.py
Removed unused function _emeter_convert_emeter_data from smartdevice.py
* Added a first pass test module for testing the new usage conversion function
* Changes based on PR feedback
Tidied up some doc string comments
Added a check for explicit values from conversion function
* Rebase on top of current master, fix docstrings
---------
Co-authored-by: Teemu Rytilahti <tpr@iki.fi>
* Add module support & modularize existing query
This creates a base to expose more features on the supported devices.
At the moment, the most visible change is that each update cycle gets information from all available modules:
* Basic system info
* Cloud (new)
* Countdown (new)
* Antitheft (new)
* Schedule (new)
* Time (existing, implements the time/timezone handling)
* Emeter (existing, partially separated from smartdevice)
* Fix imports
* Fix linting
* Use device host instead of alias in module repr
* Add property to list available modules, print them in cli state report
* usage: fix the get_realtime query
* separate usage from schedule to avoid multi-inheritance
* Fix module querying
* Add is_supported property to modules