From 24f8a58a630d77d9afcf04a465ee36c038d120f9 Mon Sep 17 00:00:00 2001 From: William Pietri Date: Sun, 5 Nov 2017 11:09:14 -0800 Subject: [PATCH] Track battery level, handle wackier parameters. --- sucks.py | 19 +++++++++++++++---- test_sucks.py | 8 +++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/sucks.py b/sucks.py index 7b74306..ceef129 100644 --- a/sucks.py +++ b/sucks.py @@ -26,6 +26,7 @@ class VacBot(ClientXMPP): self.ready_flag = Event() self.clean_status = None self.charge_status = None + self.battery_status = None def wait_until_ready(self): self.ready_flag.wait() @@ -40,11 +41,21 @@ class VacBot(ClientXMPP): self.register_handler(Callback('clean report', MatchXPath('{jabber:client}iq/{com:ctl}query/{com:ctl}ctl[@td="ChargeState"]'), self.handle_charge_report)) + self.register_handler(Callback('clean report', + MatchXPath('{jabber:client}iq/{com:ctl}query/{com:ctl}ctl[@td="BatteryInfo"]'), + self.handle_battery_report)) def handle_clean_report(self, iq): self.clean_status = iq.find('{com:ctl}query/{com:ctl}ctl/{com:ctl}clean').get('type') logging.debug("*** clean_status =" + self.clean_status) + def handle_battery_report(self, iq): + try: + self.battery_status = float(iq.find('{com:ctl}query/{com:ctl}ctl/{com:ctl}battery').get('power')) / 100 + except ValueError: + logging.warning("couldn't parse battery status " + ET.tostring(iq)) + logging.debug("*** battery_status = {:.0%}".format(self.battery_status)) + def handle_charge_report(self, iq): report = iq.find('{com:ctl}query/{com:ctl}ctl/{com:ctl}charge').get('type') if report.lower() == 'going': @@ -140,7 +151,7 @@ class Stop(VacBotCommand): class FrequencyParamType(click.ParamType): name = 'frequency' - RATIONAL_PATTERN = re.compile(r'([.0-9])/([.0-9])') + RATIONAL_PATTERN = re.compile(r'([.0-9]+)/([.0-9]+)') def convert(self, value, param, ctx): result = None @@ -153,7 +164,7 @@ class FrequencyParamType(click.ParamType): result = float(value) except ValueError: pass - except ValueError: + except (ValueError, ArithmeticError): pass if result is None: @@ -176,10 +187,10 @@ def read_config(filename): def should_run(frequency): if frequency is None: - return + return True n = random.random() result = n <= frequency - logging.debug("tossing coin: {:0.3f} <= {:0.3f}: {}".format( n, frequency, result)) + logging.debug("tossing coin: {:0.3f} <= {:0.3f}: {}".format(n, frequency, result)) return result diff --git a/test_sucks.py b/test_sucks.py index 3b645d0..2c8a1ad 100644 --- a/test_sucks.py +++ b/test_sucks.py @@ -46,12 +46,19 @@ def test_frequency_param_type(): assert_equals(t.convert('1', None, None), 1.0) assert_equals(t.convert('1/2', None, None), 0.5) assert_equals(t.convert('1/7', None, None), 1.0 / 7.0) + assert_equals(t.convert('1/14', None, None), 1.0 / 14.0) + assert_equals(t.convert('1/1000', None, None), 1.0 / 1000.0) + assert_equals(t.convert('1.5/2', None, None), 1.5 / 2.0) + assert_equals(t.convert('0/2', None, None), 0) with assert_raises(click.exceptions.BadParameter): t.convert('bob', None, None) with assert_raises(click.exceptions.BadParameter): t.convert('2', None, None) with assert_raises(click.exceptions.BadParameter): t.convert('7/5', None, None) + with assert_raises(click.exceptions.BadParameter): + t.convert('1/0', None, None) + def test_should_run(): count = 0 @@ -65,4 +72,3 @@ def test_should_run(): if should_run(0.9): count += 1 assert_almost_equal(count, 9000, delta=200) -