http web事物实现

webthing的Python项目详细描述


网络事物

https://travis-ci.org/mozilla-iot/webthing-python.svg?branch=masterhttps://img.shields.io/pypi/v/webthing.svghttps://img.shields.io/badge/license-MPL--2.0-blue.svg

http Web Thing的实现。此库与Python2.7和3.4+兼容

安装

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侦听器

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用哪个地图/集合?   bluej Java:计算税   由于性能问题,java双精度字符串替代方案   java Eclipse CDT生成设置因重新启动而丢失   如何在java控制台中显示字节流值   java获取url地址,其中是包含我的页面的iframe   java 403禁止的spring启动API调用错误?   如果一个方法返回true,java将停止计时器   使用JavaNIO获取文件创建日期   在Java中从整数转换为二进制时保留整个字节的字符串   java AspectJ&Maven警告:“未应用……中定义的建议?”   java为什么我得到3,我不应该得到+7   java当一个方法包含多个返回的if语句时,如何从该方法中获取返回值?   在运行时循环java(scan.nextLine()!="$")   java配置休眠。cfg。春天的xml   java使用HtmlUnit模拟用户,错误   java CLI如何持续检查更改   java最大素因子(返回)