与mysensors网关对话的python api

pymysensors的Python项目详细描述


pymysensors构建状态

与mysensors网关对话的python api(http://www.mysensors.org/" rel="nofollow">http://www.mysensors.org/)。目前支持串行协议v1.4、v1.5、v2.0-v2.2。还没有实现v2.x的所有功能。

  • 支持带有串行API v2.x的SmartSleep。
  • 支持带有串行API v2.x的MQTT客户机网关。
  • 支持OTA更新,包括dualoptibootmybootloader引导加载程序。
  • 所有网关实例(串行、TCP(以太网)或MQTT)将在单独的线程中运行。
  • 作为在自己的线程中运行网关的替代方案,所有网关都有使用异步的实验性实现。

用法

目前,api最好通过实现回调处理程序来使用

importmysensors.mysensorsasmysensorsdefevent(message):"""Callback for mysensors updates."""print('sensor_update '+str(message.node_id))GATEWAY=mysensors.SerialGateway('/dev/ttyACM0',event)GATEWAY.start()

在上面的例子中,每当mysensors网络中的一个节点被更新时,pymysensors就会调用"event"。传递给回调处理程序的消息包含以下数据:

Message
    gateway - the gateway instance
    node_id - the sensor node identifier
    child_id - the child sensor id
    type - the message type (int)
    ack - True is message was an ACK, false otherwise
    sub_type - the message sub_type (int)
    payload - the payload of the message (string)

消息类型和子类型的符号名在特定于协议版本的const x.py文件中定义。

网关及其网络的数据结构如下所述。

SerialGateway/TCPGateway/MQTTGateway
    sensors - a dict containing all nodes for the gateway; node is of type Sensor

Sensor - a sensor node
    children - a dict containing all child sensors for the node
    sensor_id - node id on the MySensors network
    type - 17 for node or 18 for repeater
    sketch_name
    sketch_version
    battery_level
    protocol_version - the mysensors protocol version used by the node

ChildSensor - a child sensor
    id - child id on the parent node
    type - data type, S_HUM, S_TEMP etc.
    description - the child description sent when presenting the child
    values - a dictionary of values (V_HUM, V_TEMP, etc.)

获取节点23的类型和值,子传感器4将执行如下操作:

s_type=GATEWAY.sensors[23].children[4].typevalues=GATEWAY.sensors[23].children[4].values

要更新节点子传感器值并将其发送到节点,请使用网关类中的set_child_value方法:

# To set sensor 1, child 1, sub-type V_LIGHT (= 2), with value 1.GATEWAY.set_child_value(1,1,2,1)

持久性

打开持久性模式后,您可以在没有 必须重新启动传感器网络中的每个节点。要启用持久性模式,关键字参数persistence 在构造函数中应为true。配置文件的路径 可以指定为关键字参数persistence_file。文件类型(.pickle或.json)将设置要使用的持久性协议pickle或json。可以使用普通文本编辑器读取json文件。如果自上次保存后进行了更新,则将每隔10秒按计划保存到持久性文件。在启动网关之前,请确保已启动持久性保存。

GATEWAY.start_persistence()

协议版本

设置关键字参数protocol_version以设置要使用的mysensors串行api的版本。默认值为'1.4'

串行网关

串行网关还支持设置波特率、读取超时和重新连接超时。

importmysensors.mysensorsasmysensorsdefevent(message):"""Callback for mysensors updates."""print("sensor_update "+str(message.node_id))GATEWAY=mysensors.SerialGateway('/dev/ttyACM0',baud=115200,timeout=1.0,reconnect_timeout=10.0,event_callback=event,persistence=True,persistence_file='somefolder/mysensors.pickle',protocol_version='1.4')GATEWAY.start()

除了串行网关外,还支持其他两种网关类型:TCP以太网网关和MQTT网关。

TCP以太网网关

以太网网关的初始化与串行网关类似。以太网网关除了支持常用设置和主机IP地址外,还支持设置TCP主机端口、接收超时和重新连接超时。

GATEWAY=mysensors.TCPGateway('127.0.0.1',port=5003,timeout=1.0,reconnect_timeout=10.0,event_callback=event,persistence=True,persistence_file='somefolder/mysensors.pickle',protocol_version='1.4')

MQTT网关

mqtt网关需要mysensors串行api v2.0或更高版本,并在网关设备中加载mqtt客户端网关示例草图。网关还需要MQTT代理和代理的PythonMQTT客户机接口。有关如何实现并初始化mqtt网关的示例,请参见mqtt.py

空中传送(OTA)固件更新

调用网关方法更新fw为ota设置一个或多个节点 固件更新。该方法接受三个位置参数和一个 关键字参数。第一个参数应该是到的节点的节点ID 更新。这也可以是许多节点id的列表。接下来的两个论点应该 是表示firwmare类型和版本的整数。关键字参数是 可选,应该是新固件的十六进制文件的路径。

GATEWAY.update_fw([1,2],1,2,fw_path='/path/to/firmware.hex')

调用update\u fw方法后,将请求节点 当pymysensors网关收到下一个set消息时重新启动。后 重新启动mysensorsbegin方法期间,节点将发送固件 配置请求。pymysensors库将响应配置请求。如果 节点接收到一个正确的固件配置响应,它将发送一个固件 请求固件块。pymysensors库会处理这个 发送固件响应消息。后一个请求-响应对话将 继续,直到发送所有固件块。如果发送的CRC 固件匹配固件配置响应的crc,节点将重新启动 并加载新固件。

网关ID

gateway方法get_gateway_id将尝试为 网关。这将是串行网关的USB设备的序列号, TCP网关的已连接网关的MAC地址或发布主题 MQTT网关的前缀(in_prefix)。

异步网关

串行、TCP和MQTT网关现在也有支持异步的版本。使用 AsyncSerialGateway类,AsyncTcpGateway类或AsyncMqttGateway类来生成 使用异步。以下公共方法是异步网关中的协同路由:

  • 获取网关ID
  • 开始持续性
  • 开始
  • 停止
  • 更新固件

有关如何使用此网关的示例,请参见async_main.py

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

推荐PyPI第三方库


热门话题
java如何从InputStream中准确读取4个字节?   Java错误:找不到符号(使用add调用arrayList时)   JavaFX表格视图分组行   java Akka PoolRouter添加withBroadcastPredicate正在冻结应用程序   java在何处以及如何解码@PathVariable   java扩展类后如何扩展类数组/调用类数组属性?   Java:如何让对象引用它在其中实例化的对象   从POSTMAN接收到的数据与JAVA rest api调用不匹配   jar中的java文件加载   java不能使用Scanner。下一步()和扫描仪。nextInt()在一起   java如何加载日志。Jboss中项目的resources文件夹中的xml文件   io如何在Java中压缩文件和文件夹?   java如何在JDesktopPane中锁定内部框架   EclipseJDK9不允许我使用字符串:“java.lang.String不明确”?   java会话。delete()不工作   java循环用户输入,直到满足条件   图形Java Delta时间会导致不平稳的移动   java在HQL中使用瞬态字段