Track battery level, handle wackier parameters.
This commit is contained in:
@@ -26,6 +26,7 @@ class VacBot(ClientXMPP):
|
|||||||
self.ready_flag = Event()
|
self.ready_flag = Event()
|
||||||
self.clean_status = None
|
self.clean_status = None
|
||||||
self.charge_status = None
|
self.charge_status = None
|
||||||
|
self.battery_status = None
|
||||||
|
|
||||||
def wait_until_ready(self):
|
def wait_until_ready(self):
|
||||||
self.ready_flag.wait()
|
self.ready_flag.wait()
|
||||||
@@ -40,11 +41,21 @@ class VacBot(ClientXMPP):
|
|||||||
self.register_handler(Callback('clean report',
|
self.register_handler(Callback('clean report',
|
||||||
MatchXPath('{jabber:client}iq/{com:ctl}query/{com:ctl}ctl[@td="ChargeState"]'),
|
MatchXPath('{jabber:client}iq/{com:ctl}query/{com:ctl}ctl[@td="ChargeState"]'),
|
||||||
self.handle_charge_report))
|
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):
|
def handle_clean_report(self, iq):
|
||||||
self.clean_status = iq.find('{com:ctl}query/{com:ctl}ctl/{com:ctl}clean').get('type')
|
self.clean_status = iq.find('{com:ctl}query/{com:ctl}ctl/{com:ctl}clean').get('type')
|
||||||
logging.debug("*** clean_status =" + self.clean_status)
|
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):
|
def handle_charge_report(self, iq):
|
||||||
report = iq.find('{com:ctl}query/{com:ctl}ctl/{com:ctl}charge').get('type')
|
report = iq.find('{com:ctl}query/{com:ctl}ctl/{com:ctl}charge').get('type')
|
||||||
if report.lower() == 'going':
|
if report.lower() == 'going':
|
||||||
@@ -140,7 +151,7 @@ class Stop(VacBotCommand):
|
|||||||
|
|
||||||
class FrequencyParamType(click.ParamType):
|
class FrequencyParamType(click.ParamType):
|
||||||
name = 'frequency'
|
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):
|
def convert(self, value, param, ctx):
|
||||||
result = None
|
result = None
|
||||||
@@ -153,7 +164,7 @@ class FrequencyParamType(click.ParamType):
|
|||||||
result = float(value)
|
result = float(value)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
except ValueError:
|
except (ValueError, ArithmeticError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if result is None:
|
if result is None:
|
||||||
@@ -176,10 +187,10 @@ def read_config(filename):
|
|||||||
|
|
||||||
def should_run(frequency):
|
def should_run(frequency):
|
||||||
if frequency is None:
|
if frequency is None:
|
||||||
return
|
return True
|
||||||
n = random.random()
|
n = random.random()
|
||||||
result = n <= frequency
|
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
|
return 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', None, None), 1.0)
|
||||||
assert_equals(t.convert('1/2', None, None), 0.5)
|
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/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):
|
with assert_raises(click.exceptions.BadParameter):
|
||||||
t.convert('bob', None, None)
|
t.convert('bob', None, None)
|
||||||
with assert_raises(click.exceptions.BadParameter):
|
with assert_raises(click.exceptions.BadParameter):
|
||||||
t.convert('2', None, None)
|
t.convert('2', None, None)
|
||||||
with assert_raises(click.exceptions.BadParameter):
|
with assert_raises(click.exceptions.BadParameter):
|
||||||
t.convert('7/5', None, None)
|
t.convert('7/5', None, None)
|
||||||
|
with assert_raises(click.exceptions.BadParameter):
|
||||||
|
t.convert('1/0', None, None)
|
||||||
|
|
||||||
|
|
||||||
def test_should_run():
|
def test_should_run():
|
||||||
count = 0
|
count = 0
|
||||||
@@ -65,4 +72,3 @@ def test_should_run():
|
|||||||
if should_run(0.9):
|
if should_run(0.9):
|
||||||
count += 1
|
count += 1
|
||||||
assert_almost_equal(count, 9000, delta=200)
|
assert_almost_equal(count, 9000, delta=200)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user