class GarageDoor(Thing): def __init__(self): super(GarageDoor, self).__init__( id_='urn:dev:ops:garage-door', title='Garage Door', type_=['DoorSensor'], description='The garage door', ) self.is_open = Value(False) self.add_property( Property( thing=self, name='is_open', value=self.is_open, metadata={ '@type': 'OpenProperty', 'title': 'Open/Close', 'type': 'boolean', 'description': 'Whether the garage door is open', }, ), ) self.add_available_action( name='toggle', metadata={ 'title': 'Open/Close', '@type': 'ToggleAction', 'description': 'Open/Close Garage Door', }, cls=ToggleAction, ) self.timer = PeriodicCallback( callback=self.update_level, callback_time=30000, ) self.timer.start() def update_level(self): data = get('http://garage.home.internal/').json() if data.get('is_open') != self.is_open.get(): self.is_open.notify_of_external_update( value=data.get('is_open'), )
class AnwingWebThing(Thing): # regarding capabilities refer https://iot.mozilla.org/schemas # there is also another schema registry http://iotschema.org/docs/full.html not used by webthing def __init__(self, description: str, awning: Awning): Thing.__init__(self, 'urn:dev:ops:anwing-TB6612FNG', 'Awning ' + awning.name + " Controller", ['MultiLevelSensor'], description) self.awning = awning self.awning.register_listener(WebThingAwningPropertyListener(self)) self.target_position = Value(0, self.__target_position) self.add_property( Property(self, 'target_position', self.target_position, metadata={ '@type': 'LevelProperty', 'title': 'Awning target position', "type": "integer", "minimum": 0, "maximum": 100, "unit": "percent", 'description': 'awning target position' })) self.current_position = Value(0) self.add_property( Property(self, 'current_position', self.current_position, metadata={ '@type': 'LevelProperty', 'title': 'Awning current position', "type": "integer", 'minimum': 0, 'maximum': 100, "unit": "percent", 'readOnly': True, 'description': 'awning current position' })) self.retracting = Value(0) self.add_property( Property(self, 'retracting', self.retracting, metadata={ '@type': 'BooleanProperty', 'title': 'Awning is retracting', "type": "boolean", 'readOnly': True, 'description': 'Awning is retracting' })) self.extending = Value(0) self.add_property( Property(self, 'extending', self.extending, metadata={ '@type': 'BooleanProperty', 'title': 'Awning is extending', "type": "boolean", 'readOnly': True, 'description': 'Awning is extending' })) self.ioloop = tornado.ioloop.IOLoop.current() def __target_position(self, new_postion): self.awning.set_target_position(new_postion) def set_current_position(self, value): self.current_position.notify_of_external_update(value) logging.debug(self.awning.name + " position " + str(value) + " reached (target=" + str(self.target_position.get()) + ")") def set_retracting(self, value): self.retracting.notify_of_external_update(value) def set_extending(self, value): self.extending.notify_of_external_update(value)