0

我正在尝试让 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_CHANGEDnotificationType 传递到类 ZWaveNetwork 对象中。

FIBARO 按钮和电源插座之间的一个主要区别是 FIBA​​RO 进入睡眠状态,但按下时它会唤醒并向控制器发送消息,这在上述日志中可见。

因此,负责处理消息的 PyManager 似乎没有处理唤醒并发送消息的节点。
PyManager 在初始化期间确实处理了 FIBA​​RO,例如处理了以下通知类型:

  • 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

4

0 回答 0