Track battery level, handle wackier parameters.
This commit is contained in:
@@ -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,7 +187,7 @@ 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))
|
||||
|
||||
+7
-1
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user