http web事物实现
webthing的Python项目详细描述
安装
webthing可以通过pip安装,例如:
$ pip install webthing
运行样本
$ wget https://raw.githubusercontent.com/mozilla-iot/webthing-python/master/example/single-thing.py $ python3 single-thing.py
这将启动一个服务器,并允许您通过MDN从网关搜索它。若要将其添加到网关,请导航到网关用户界面中的“物品”页,然后单击右下角的+图标如果两者都在同一个网络上,则会自动出现示例。
示例实现
在本代码演练中,我们将设置一个可调光灯和一个湿度传感器(当然,这两个都使用假数据)。这两个工作示例都可以在here中找到。
可调光
假设您有一个可调光,您希望通过webofthingsapi公开它。灯可以打开/关闭,亮度可以设置为0%到100%除了名称、描述和类型之外,还需要一个^{tt3}$来公开两个属性:
- on:灯光的状态,无论它是打开还是关闭
- 通过对rest api的PUT {"on": true/false}调用设置此属性可以切换灯光。
- brightness:0-100%
- 通过对rest api的put调用设置此属性将设置此灯光的亮度级别。
首先,我们创造一个新事物:
light=Thing('urn:dev:ops:my-lamp-1234','My Lamp',['OnOffSwitch','Light'],'A web connected lamp')
现在我们可以添加所需的属性
on属性报告并设置灯光的开/关状态为此,我们需要一个Value对象来保存实际状态,还需要一个方法来打开/关闭灯光。出于我们的目的,我们只想在灯打开/关闭时记录新状态
light.add_property(Property(light,'on',Value(True,lambdav:print('On-State is now',v)),metadata={'@type':'OnOffProperty','title':'On/Off','type':'boolean','description':'Whether the lamp is turned on',}))
brightness属性报告灯光的亮度级别并设置该级别和以前一样,我们只是记录光的水平,而不是实际设置光的水平
light.add_property(Property(light,'brightness',Value(50,lambdav:print('Brightness is now',v)),metadata={'@type':'BrightnessProperty','title':'Brightness','type':'number','description':'The level of light from 0-100','minimum':0,'maximum':100,'unit':'percent',}))
现在我们可以将新创建的内容添加到服务器并启动它:
# If adding more than one thing, use MultipleThings() with a name.# In the single thing case, the thing's name will be broadcast.server=WebThingServer(SingleThing(light),port=8888)try:server.start()exceptKeyboardInterrupt:server.stop()
这将启动服务器,通过wot rest api使灯光可用,并通过mdns将其作为本地网络上的可发现资源宣布。
传感器
现在我们还要将湿度传感器连接到为灯光设置的服务器上
一个^{tt10}$(返回一个级别而不是仅仅打开/关闭的传感器)有一个必需的属性(除了名称、类型和可选描述之外):level。我们希望监视此属性,并在值更改时获得通知。
首先,我们创造一个新事物:
sensor=Thing('urn:dev:ops:my-humidity-sensor-1234','My Humidity Sensor',['MultiLevelSensor'],'A web connected humidity sensor')
然后我们创建并添加适当的属性:
level:告诉我们传感器实际读数
与之相反,不能通过API调用设置该值,因为设置传感器读取的内容没有多大意义因此,我们正在创建一个readOnly属性
level=Value(0.0);sensor.add_property(Property(sensor,'level',level,metadata={'@type':'LevelProperty','title':'Humidity','type':'number','description':'The current humidity in %','minimum':0,'maximum':100,'unit':'percent','readOnly':True,}))
现在我们有一个传感器不断报告0%为了使它可用,当传感器有新的读数时,我们需要一个线程或某种输入。为此,我们启动一个线程,每隔几秒钟查询一次物理传感器为了我们的目的,它只是调用一个假方法。
self.sensor_update_task= \ get_event_loop().create_task(self.update_level())asyncdefupdate_level(self):try:whileTrue:awaitsleep(3)new_level=self.read_from_gpio()logging.debug('setting new humidity level: %s',new_level)self.level.notify_of_external_update(new_level)exceptCancelledError:pass
这将通过self.level.notify_of_external_update(read_from_gpio())调用使用传感器读数更新Value对象。对象Value现在通知属性和值已更改的内容,这反过来通知所有websocket侦听器