java - 对于 OpenHab Zwave Bundle,MultiLevelSensor 显示读数的底层代码在哪里?

标签 java sensors openhab z-wave

这是一个奇怪的问题,因为通常您可以获得日志信息,更不用说 Openhab 的内部结构已经完成,但我已经简单地提取了 OpenHab Z-wave Bundle 和所有必需的库,以运行多传感器的模拟 Aeon Labs MultiSensor Model:DSB05-ZWUS

我使用的 Controller 是 AEOTEC Z-Stick S2 ,我将通过在本地计算机上使用 Maven 设置的 OSGI 系统启动 OpenHab bundle 。我测试了一个二进制开关来关闭和打开灯,这通过发送“关闭”或“打开”消息(即 00 或 FF)相当简单,但对于多级传感器,您必须向其发送消息来检索信息。

我似乎找不到工作流程,因为没有 GUI 示例说明如何获取所有传感器读数。我深入研究了代码,据我了解,多级传感器具有保存数字和相应传感器类型的枚举类型。

我能够 getMessage(sensorType) 并且它返回给我类似这样的内容,例如:SendData (0x13) , type = Request (0x00 ), playload = 0D 02 31 04 01 。我怀疑播放负载是用于确定传感器读数的信息,但我找不到任何资源来解码它。

但是我找到了一个 Converter 类:ZWaveMultiLevelSensorConverter.java有一个名为 public void handleEvent(ZWaveCommandClassValueEvent event, Item item, Map<String,String> arguments) 的方法它对温度读数进行了一次转换,但我不确定参数中会包含什么内容。

所以我的具体问题是为每种传感器类型(例如:温度)提供读数的具体方法是什么,如果可能的话代码的工作流程是什么?

资源:https://github.com/openhab/openhab/tree/master/bundles/binding/org.openhab.binding.zwave

最佳答案

配置

首先,您需要配置您的设备以发送您想要的信息。添加“Habmin”(HABmin)作为插件来配置传感器。需要设置的关键事项:

  1. 插入电池后唤醒 10 分钟 - 开启此功能很有帮助
  2. 启用运动传感器 - 如果您需要运动检测,请开启
  3. 准时 - 当检测到运动时,设备将发送“开启”信号 通知。经过一定的秒数(此设置)后, 将发送“关闭”通知(参见下面的#7)。
  4. 第 1 组报告:将其设置为 225(十进制),即 11100001。一位中的 1 表示发送该读数。位 0 是电池电量,5 是温度,6 是相对湿度,7 是亮度。
  5. 第 1 组间隔:发送报告的频率。
  6. 确保您为组 1 和节点 1(您的 Zstick)设置了关联 Controller 。
  7. 命令选项 - 我将其设置为“基本”,并添加另一个设备(开/关灯 Controller )作为组 1 的关联。当检测到运动时,基本报告会导致灯 Controller 打开,当运动周期到期时,它会发送另一个基本报告以关闭。这种情况发生在没有任何后台运行软件的设备中。您的 ZStick 还会获取触发事件通知的基本报告(见下文)。

轮询

由于该设备是电池供电的,因此您无法随时轮询其读数。它将按照您在配置中指定的时间间隔向组 1(您的 ZStick)发送一份报告,其中包含传感器读数。不然就 sleep 了。但是,如果运动检测开启,它将立即响应运动。

编码

OpenHAB 使用 OpenZWave 库(请参阅 Z-Wave Binding)。一切都通过一个 Manager 类进行。基本上,您监听诸如添加或删除节点或更新值之类的事件。下载 OpenZWave 控制面板 ( OpenZWave Control Panel ) 并查看“ozwcp.cpp”以了解您需要执行的操作。我已经用 C++ 完成了所有工作——我不确定 Java。

当多传感器发送带有读数的报告时,您会收到Notification::Type_ValueChanged。例如:

// this is the node number that triggered the event
uint8 const nid = notification->GetNodeId();

// this is the internal value that identifies what was changed
ValueID const vid = notification->GetValueID();

// this is the English version of what was changed
string vLabel = Manager::Get()->GetValueLabel(vid);

vLabel 将为运动周期开/关的“温度”、“相对湿度”、“亮度”、“电池电量”或“传感器”。

检测到运动时的基本报告会触发 Notification::Type_NodeEvent

关于java - 对于 OpenHab Zwave Bundle,MultiLevelSensor 显示读数的底层代码在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28286082/

相关文章:

java - Android getAltitude 基于大气压和传感器压力

eclipse - OSGI Unresolved 要求 : Import-Package: com. pi4j.io.gpio

java - 用于将 MediaPlayer 音量设置为最大声音的按钮作为静音按钮将音量设置为最小吗?

Android:从压力传感器获取高度

c++ - 修改 Arduino 代码以使用 NodeMCU ESP-12e

docker - 将 docker 容器连接到本地站点

java - 如何比较 android SD 卡上本地文件夹的内容与 dropbox 上文件夹的内容?

java - 如何从外部 api 类创建 hibernate 实体?

java - 选择继承策略 - Hibernate