与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更新,包括dualoptiboot和mybootloader引导加载程序。
- 所有网关实例(串行、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。