Esempio n. 1
0
 def test_max_value(self):
     validator = validators.IntegerValidator(name='max_delay', max_value=2)
     self.assertEqual(validator(2), Decimal('2'))
     with self.assertRaises(ValidationError) as ctx:
         validator(3)
     self.assertEqual(ctx.exception.message,
                      'Ensure max_delay is less than or equal to 2.000000')
Esempio n. 2
0
 def test_min_value(self):
     validator = validators.IntegerValidator(name='max_delay', min_value=2)
     self.assertEqual(validator(2), 2)
     with self.assertRaises(ValidationError) as ctx:
         validator(1)
     self.assertEqual(
         ctx.exception.message,
         'Ensure max_delay is greater than or equal to 2.000000')
Esempio n. 3
0
class Button(Device):
    hardware_list = DIGITAL_INPUT
    debounce_validator = validators.IntegerValidator(name='debounce',
                                                     min_value=0)

    def __init__(self,
                 debounce=50,
                 long_click=None,
                 on_press=[],
                 on_release=[],
                 on_single_click=[],
                 on_long_click=[],
                 **kwargs):
        self.debounce = self.debounce_validator(debounce)
        self.hardware_config_extra = dict(delay=self.debounce)
        super().__init__(**kwargs)
        self.delay = self.debounce / 1000
        self.on_single_click = on_single_click
        self.on_long_click = on_long_click
        self.message_lists = dict(
            begin=self.clean_message_list(on_press),
            end=self.clean_message_list(on_release),
            single=self.clean_message_list(on_single_click),
            long=self.clean_message_list(on_long_click),
        )
        if long_click:
            self.handler = LongClickHandler(long_click=int(long_click))
        else:
            self.handler = SingleClickHandler()

    def clean_message_list(self, message_list):
        if message_list:
            if not isinstance(message_list[0], list):
                message_list = [message_list]
        return message_list

    async def setup(self):
        await self.hardware.setup()

    async def loop(self):
        # If pressed on start wait until release
        while await self.hardware.is_pressed():
            await asyncio.sleep(self.delay)
        while True:
            for event in self.handler.get_events(await
                                                 self.hardware.is_pressed()):
                self.event_handler(event)
            await asyncio.sleep(self.delay)

    def event_handler(self, event):
        self.log.debug('click {}'.format(event))
        message_list = self.message_lists[event]
        if message_list:
            for component, topic, payload in message_list:
                self.broker.send(component, topic, payload)
        self.broker.publish(topic='click', payload=event)
        self.broker.publish(topic='click', payload='none')
Esempio n. 4
0
class NumericSensor(Sensor):
    scale_validator = validators.DecimalValidator(name='scale')
    precision_validator = validators.IntegerValidator(name='precision')

    def __init__(self,
                 scale=1,
                 precision=0,
                 change_margin=0,
                 unit_of_measurement='',
                 **kwargs):
        super().__init__(**kwargs)
        self.scale = self.scale_validator(scale)
        self.precision = self.precision_validator(precision)
        self.change_margin_validator = validators.DecimalValidator(
            name='change_margin', precision=self.precision)
        self.change_margin = self.change_margin_validator(change_margin)
        self.unit_of_measurement = unit_of_measurement
        self.value_validator = validators.DecimalValidator(
            name='value', precision=self.precision)

    async def setup(self):
        await super().setup()
        self.set_state('scale', self.scale)
        self.set_state('precision', self.precision)
        self.set_state('change_margin', self.change_margin)
        self.set_state('unit_of_measurement', self.unit_of_measurement)

    def clean_value(self, value):
        return self.value_validator(Decimal(value) * self.scale)

    def is_changed(self, value, previous_value):
        if previous_value is None:
            return True
        if self.change_margin == 0:
            return not (value == previous_value)
        return bool(abs(value - previous_value) >= self.change_margin)

    async def message_received(self, sender=None, topic=None, payload=None):
        await super().message_received(sender=sender,
                                       topic=topic,
                                       payload=payload)
        if self.config_mode and bool(payload):
            if topic == 'scale':
                self.scale = self.scale_validator(payload)
                self.set_state('scale', self.scale)
            if topic == 'precision':
                self.precision = self.precision_validator(payload)
                self.set_state('precision', self.precision)
            if topic == 'change_margin':
                self.change_margin = self.change_margin_validator(payload)
                self.set_state('change_margin', self.change_margin)
Esempio n. 5
0
 def test_simple(self):
     validator = validators.IntegerValidator(name='max_delay')
     self.assertEqual(validator(0), 0)
     self.assertEqual(validator(-0), 0)
     self.assertEqual(validator(123), 123)
     self.assertEqual(validator(-45), -45)
     self.assertEqual(validator(1.1), 1)
     self.assertEqual(validator('0'), 0)
     self.assertEqual(validator('-0'), 0)
     self.assertEqual(validator('123'), 123)
     self.assertEqual(validator('-45'), -45)
     with self.assertRaises(ValidationError) as ctx:
         validator('1.1')
     self.assertEqual(ctx.exception.message,
                      'Ensure max_delay is an integer number.')
     with self.assertRaises(ValidationError) as ctx:
         validator('text')
     self.assertEqual(ctx.exception.message,
                      'Ensure max_delay is an integer number.')
Esempio n. 6
0
class Relay(Device):
    hardware_list = DIGITAL_OUTPUT
    debounce_validator = validators.IntegerValidator(name='debounce',
                                                     min_value=0)
    initial_validator = validators.OnOffValidator(name='initial', null=True)

    def __init__(self, initial=None, **kwargs):
        super().__init__(**kwargs)
        self.initial = self.initial_validator(initial)

    async def setup(self):
        await self.hardware.setup()
        if self.initial is None:
            await self.get_power()
        else:
            await self.set_power(self.initial)

    async def get_power(self):
        value = await self.hardware.get_state()
        self.set_state('power', value)

    async def set_power(self, value):
        if value == 'on':
            await self.hardware.set_state(value)
            self.set_state('power', value)
            self.log.debug(value)
        elif value == 'off':
            await self.hardware.set_state(value)
            self.set_state('power', value)
            self.log.debug(value)
        elif value == 'toggle':
            power = self.get_state('power')
            if power == 'on':
                await self.set_power('off')
            if power == 'off':
                await self.set_power('on')

    async def message_received(self, sender=None, topic=None, payload=None):
        if topic == 'power':
            await self.set_power(payload)
Esempio n. 7
0
import gpiozero
from brick import validators
from brick.hardware.base import DigitalInput, DigitalOutput

pin_validator = validators.IntegerValidator('pin', min_value=0)


class GPIOInput(DigitalInput):
    def __init__(self, pin=None, **kwargs):
        super().__init__(**kwargs)
        self.pin = pin_validator(pin)

    async def setup(self):
        self.input = gpiozero.Button(self.pin)

    async def is_pressed(self):
        return self.input.is_pressed

    async def get_state(self):
        return 'on' if self.input.is_pressed else 'off'


class GPIOOutput(DigitalOutput):
    def __init__(self, pin=None, **kwargs):
        super().__init__(**kwargs)
        self.pin = pin_validator(pin)

    async def setup(self):
        self.output = gpiozero.LED(self.pin)

    async def get_state(self):