我正在尝试让 Z-Wave 按钮(Fibaro Button FGPB101 id: 0x1000 type: 0x010f)在我的 python 应用程序中工作。
我的 python 代码中的重要部分是为了理解我的问题:
class application():
def check_entry_button(self):
node, val_id = self.get_node_id('button')
level = self.network.nodes[node].get_dimmer_level(val_id)
if not self.keep_blinking and self.last_level != level:
print(f'Button level is: {level}')
self.last_level = level
return level > 0
def init_zwave(self):
#Create a network object
device = '/dev/ttyUSB20'
log = 'Debug'
options = ZWaveOption(device, config_path= '../open-zwave/config')
options.set_log_file("OZW_Log.log")
options.set_append_log_file(False)
options.set_console_output(True)
options.set_save_log_level(log)
#options.set_save_log_level('Info')
options.set_logging(False)
options.lock()
self.network = ZWaveNetwork(options, log=None)
for i in range(0,self.zwave_wait):
if self.network.state >= self.network.STATE_AWAKED:
break
else:
time.sleep(self.zwave_sleep)
if self.network.state < self.network.STATE_AWAKED:
print('Network not awake !! Continue and check what happens')
for i in range(0,self.zwave_wait):
if self.network.state >= self.network.STATE_READY:
break
else:
time.sleep(self.zwave_sleep)
if not self.network.is_ready:
print('Network not ready !! Continue and check what happens')
else:
print('Network started')
# Store ids for FIBARO button and Teldus switch for quick acces into the nodes array
self.zwave = {}
for node in self.network.nodes:
if self.network.nodes[node].product_id == '0x1000':
for val in self.network.nodes[node].get_dimmers():
self.zwave['button'] = {'node': node, 'val_id': val}
elif self.network.nodes[node].product_id == '0x0003':
for val in self.network.nodes[node].get_switches():
self.zwave['outlet'] = {'node': node, 'val_id': val}
# Assert we have both button and outlet connected
assert 'button' in self.zwave, 'External Fibaro button did not connect'
assert 'outlet' in self.zwave, 'Teldus pwer outlet did not connect'
def main():
print('Starting app')
app = application()
app.init_zwave()
print('Waiting for key presses')
run_application = True
while run_application:
if app.keep_blinking:
app.toggle_lamp()
# Check if it can be turned off
app.check_lamp_off()
if app.check_entry_button():
# Activate blinkning lamp
app.start_blinking()
run_application = not app.stop
在我的 Pi3 上运行应用程序会启动 ZWaveNetwork,我会看到我的 3 个节点。但是,当我按下按钮时,消息被控制器捕获,但我尝试获取值 ( get_dimmer_level(val_id)
) 始终返回 0 下面是运行应用程序的剪切(第一行与 main() 中的第四行匹配:
等待按键
按钮级别为:0
2021-08-10 11:43:21.293 详细信息,Node002,已接收:0x01、0x0d、0x00、0x04、0x00、0x02、0x05、0x5b、0x03、0x18、0x80、0x01、0x7e , 0x00, 0x4e
2021-08-10 11:43:21.294 详细信息,
2021-08-10 11:43:21.294 信息,Node002,从节点 2 接收到中央场景集:场景 id=1 在 7680 秒内。发送事件通知。
2021-08-10 11:43:21.294 警告,Node002,没有为场景 1 创建 ValueID
2021-08-10 11:43:36.433 详细信息,Node002,已接收:0x01、0x0d、0x00、0x04、0x00、0x02、0x05, 0x5b、0x03、0x19、0x80、0x01、0x7e、
0x00、0x4f 2021-08-10 11:43:36.434 详细信息,
2021-08-10 11:43:36.434 信息,Node002,从节点 2 接收到的中央场景集:场景id=1 在 7680 秒内。发送事件通知。
2021-08-10 11:43:36.434 警告,Node002,没有为场景 1 创建 ValueID
所以我的主要问题是如何在按下时获取按钮值,例如控制器有网络流量,但是在读取值时我没有得到任何不同于 0 的值get_dimmer_value
我在 network.pydef zwcallback(self, args):
函数中做了更多的检测,我可以观察到只有 Node003(可控电源插座)将SIGNAL_VALUE_CHANGED
notificationType 传递到类 ZWaveNetwork 对象中。
FIBARO 按钮和电源插座之间的一个主要区别是 FIBARO 进入睡眠状态,但按下时它会唤醒并向控制器发送消息,这在上述日志中可见。
因此,负责处理消息的 PyManager 似乎没有处理唤醒并发送消息的节点。
PyManager 在初始化期间确实处理了 FIBARO,例如处理了以下通知类型:
- SIGNAL_NODE_ADDED
- SIGNAL_NODE_PROTOCOL_INFO
- SIGNAL_ESSENTIAL_NODE_QUERIES_COMPLETE
- SIGNAL_VALUE_ADDED
- SIGNAL_GROUP
- SIGNAL_NODE_NAMING
这与似乎可以工作的电源插座相同(我还没有尝试控制它)
做更多的挖掘我认为我的问题与 python-openzwave repo 使用基于 1.4 版的旧 openzwave 库有关:
2021-08-11 15:02:43.470 Always, OpenZwave Version 1.4.3428 Starting Up
而如果它是我构建和安装的最新 openzwave 库:
2021-08-11 15:02:43.470 Always, OpenZwave Version 1.6-1930-ga8aa6341 Starting Up
我们知道我必须使用 1.6 版本才能处理 COMMAND_CLASS_CENTRAL_SCENE