免费并不总是意味着“不如付费",OpenHAB也不例外。开源的家庭自动化软件远远超过了市场上任何其他家庭自动化系统的功能,但是安装起来并不容易。实际上,这可能会令人沮丧。
在指南的第1部分中,我向您介绍了如何在Raspberry Pi上安装OpenHAB,介绍了OpenHAB的核心概念,并向您展示了如何添加第一个项目。进入系统。今天我们将走得更远:
Z-Wave简介
Z-Wave是多年以来一直是主导的家庭自动化协议:它可靠,经过广泛开发,并且比任何其他智能家居产品的工作范围都更长。您可以使用数百种Z-Wave传感器来执行各种任务。 OpenHAB 可以与Z-Wave一起使用,但是设置起来很麻烦,并且不能保证可靠性。
如果您正在考虑购买装满Z-Wave的房屋专门用于OpenHAB的波浪传感器,我恳请您重新考虑。它可能对您很有用,或者可能会遇到一些小的但持续存在的问题。至少在有机会尝试一些传感器之前,不要买满传感器的房子。选择Z-Wave的唯一原因是,如果您不是100%选择OpenHAB,并希望将来保留您的选择:例如Z-Wave可与Samsung SmartThings集线器以及Z-Wave特定的集线器一起使用例如Homeseer,以及其他一系列软件选项,例如Domoticz。
Though OpenHAB includes a Z-Wave binding, you still need to configure the Z-Wave network first, before OpenHAB can start querying it for data. If you’ve got a Rasberry controller board, you have some software supplied for configuring the network, so we won’t be covering that here. If you bought an Aeotec USB Z-Stick controller or similar, you likely don’t have any software included, so read on.
如果您已经有了Z-Wave网络设置,则只需将控制器插入Pi并开始配置绑定和项目。如果这是您首次尝试Z-Wave,则要复杂一些。
首先,在硬件方面:每个控制器都有自己与设备配对的方式(技术上称为“包含模式")。分配了节点ID)。对于Aotec Z-Stick,这意味着将其从USB端口拔出,然后按一下按钮将其置于包含模式。然后将其靠近要配对的设备,然后也按上的“ include"按钮(这也会有所不同:我的Everspring插槽需要快速连续按3次该按钮,因此这里的课程是阅读
Z-Stick短暂闪烁以指示成功。当分配新端口时,将其重新插入Pi时会出现问题。如果您发现它已经被动态地重新分配了一个新的树莓派,请重新启动它以将其重置回标准端口。更好的是:在首先完成所有硬件配对之前,请勿将其插入Pi。
安装HABmin和Z-Wave绑定
因为OpenHAB实际上不是Z-Wave的配置实用程序,我们将安装另一个Web管理工具,它称为HABmin。转到HABmin Github存储库,下载当前版本。解压缩后,您将在addons目录中找到2个 .jar 文件–这些文件应放在OpenHAB Home共享中的相应addons目录中(如果您还使用了Aotec gen5 Z-Stick,请确保至少具有1.8版的Z-Wave绑定。。
接下来,在webapps目录中创建一个新文件夹,并将其命名为“ habmin"(小写很重要)。将其余下载的文件复制到此处。
注意:正在积极开发中的还有HABmin 2。安装过程几乎相同,但有一个附加的.jar插件。可能两者都值得尝试,只是看看您喜欢哪个。
如果还没有,请将控制器插入Pi。键入以下内容以找到正确的端口。
ls /dev/tty*
您正在寻找名称中带有USB的任何东西,或者在我的特殊情况下,Z形棍表示为 / dev / ttyACM0 (调制解调器)。在插入之前和之后一次执行该命令可能会更容易,因此,如果不确定,可以看到有哪些更改。
打开OpenHAB配置文件并修改以下部分Z-Wave,取消注释这两行,并输入您的实际设备地址。对我来说,最后一步是允许OpenHAB用户访问调制解调器。
sudo usermod -a -G dialout openhab
现在,要使所有功能生效,请重新启动OpenHAB
sudo service openhab restart
希望,如果您正在检查调试日志,您将看到类似这样的内容。恭喜,您正在谈论Z-Wave。您可能还会发现调试日志中充斥着来自各个Z-Wave节点的消息。让我们首先检查HABMIN以查看发现的内容:http://openhab.local:8080 / habmin / index.html(用您的Raspberry Pi主机名或IP地址替换openhab.local)。
在HABMIN中可以看到很多东西,但是我们只关心 Configuration-> Bindings-> Z-Wave-> Devices 标签,如下所示。展开节点以编辑位置和名称标签,以方便参考。
配置Z-Wave项
每个Z-Wave设备将具有针对OpenHAB的特定配置。值得庆幸的是,大多数设备已经被研究过,并且已经有一些示例可供您使用。配置无法识别的自定义设备已经超出了本指南的范围,但让我们假设它现在受支持。
首先,在节点3上有一个基本的Everspring AN158电源开关和仪表。快速的Google搜寻使我转到Wetwa.re上的博客文章,其中包含示例项目配置。我对此进行了如下修改:
Switch Dehumidifier_Switch "Dehumidifier" {zwave="3:command=switch_binary"} Number Dehumidifier_Watts "Dehumidifier power consumption [%.1f W]" { zwave="3:command=meter" }
完美。
下一个是Aeotec Gen5多传感器。
为此,我在以下位置找到了一个示例配置iwasdot.com,我的多传感器位于节点2上。
Number Hallway_Temperature "Hallway Temperature [%.1f °C]" (Hallway, Temperature) {zwave="2:0:command=sensor_multilevel,sensor_type=1,sensor_scale=0"}Number Hallway_Humidity "Hallway Humidity [%.0f %%]" (Hallway, Humidity) {zwave="2:0:command=sensor_multilevel,sensor_type=5"}Number Hallway_Luminance "Hallway Luminance [%.0f Lux]" (Hallway) {zwave="2:0:command=sensor_multilevel,sensor_type=3"}Contact Hallway_Motion "Hallway Motion [%s]" (Hallway, Motion) {zwave="2:0:command=sensor_binary,respond_to_basic=true"}Number sensor_1_battery "Battery [%s %%]" (Motion) {zwave="2:0:command=battery"}
如果这种格式对您来说很奇怪,请回到第一本入门指南,特别是Hue绑定部分,在此我将解释如何项目已添加。您可能只需要复制这样的粘贴示例,但是如果您有新设备,则绑定文档会详细说明所有命令。
Logitech Harmony Binding
跳入规则,我想添加一个关于使用Harmony绑定的简短说明。我是Harmony系列终极遥控器的简化版,旨在简化家庭媒体中心的体验,但它们通常是智能家居中的独立系统。借助OpenHAB,Logitech Harmony活动和全面的设备控制现在可以成为集中式系统的一部分,甚至包括在自动化规则中。
首先通过安装使用apt-cache找到的三个绑定文件搜索“ harmony":
完成后不要忘记再次 chown :
sudo apt-get install openhab-addon-action-harmonyhubsudo apt-get install openhab-addon-binding-harmonyhubsudo apt-get install openhab-addon-io-harmonyhubsudo chown -hR openhab:openhab /usr/share/openhab
To configure the binding, open up the openhab.cfg file and add a new section as follows:
########## HARMONY REMOTE CONTROLS ##########harmonyhub:host=192.168.1.181 or your ipharmonyhub:username=your-harmony-email-loginharmonyhub:password=your-password
IP地址是您的和谐中心。使用网络扫描仪找出来。您还需要输入登录详细信息,即在启动标准Harmony配置实用程序时输入的登录详细信息。而已。重新启动Hue后,绑定中的调试日志应该会突然输出。
这是所有活动,设备和可发送命令的JSON格式列表。最好将其复制出来以备将来参考。您可以粘贴到这样的在线JSON格式化程序中,从而更容易阅读可折叠节点。
以及默认的标准PowerOff活动,您将发现自己定义的活动按名称列出。现在,让我们创建一个简单的一键控件来开始活动。首先,在您的项目文件中,添加以下行。
/* Harmony Hub */String Harmony_Activity "Harmony [%s]" <television> (Living_Room) {harmonyhub="*[currentActivity]" }
这是双向字符串绑定,它既可以获取当前活动,又可以命令将当前活动设置为其他的东西。现在,我们可以在站点地图文件中为其创建一个按钮。
Switch item=Harmony_Activity mappings=[PowerOff='Off',Exercise='Exercise',13858434='TV',Karaoke='Karaoke']
在方括号中,您将看到每个活动以及标签。通常,您可以直接在遥控器上命名活动,但我发现的例外是活动名称中带有空格的任何内容,例如“观看电视"。在这种情况下,您需要使用活动ID。同样,您可以在JSON调试输出中找到ID。保存并刷新界面,您应该会看到类似以下内容:
您还可以在规则中引用活动,如下所示。阅读Wiki页面以获取更多关于Harmony绑定的信息。
规则概述
大多数智能家居集线器都包含某种规则创建功能,因此您可以自动对传感器数据和家里发生的事件。实际上,我认为,真正的智能家居不是您需要花费时间与移动应用程序进行交互的,它是最终用户看不到的,完全自动化的。为此,OpenHAB还包含一种可以编程的强大规则脚本语言,远远超过了大多数智能家居集线器的复杂性。
编程规则听起来比实际情况差。让我们从一对根据存在感应器打开或关闭灯的规则开始吧。
首先,我们将规则命名为–具有描述性,因此您知道发生了什么事件。接下来,我们通过说当x为真时定义y 来定义我们的简单规则。 End表示该特定规则的结束。您可以在规则中使用许多特殊的词,但是目前,我们只处理两个简单的语法– Item ,它使您可以查询事物的状态。和 sendCommand ,它们完全可以实现您的预期。我告诉过你这很容易。
使用一对规则也许是不必要的,但是随着我的逻辑变得越来越复杂,将它们分开是有益的,无论我是进入还是离开该区域–在等式中的某个位置添加光传感器可能是个好主意,这样我们就不必不必要地打开灯光。
让我们看看另一个示例来创建计划规则。
rule "Exercise every morning"when Time cron "0 0 8 1/1 * ? *"then harmonyStartActivity("Exercise")end
我们再次命名该规则,说明触发条件以及采取的措施。但是在这种情况下,我们要定义一个时间模式。您在引号中看到的有趣代码是Quartz Scheduler的CRON表达式(格式与常规CRONtab略有不同)。我使用cronmaker.com来帮助创建表达式,但是您也可以阅读格式指南[不再可用]以获取详细说明和更多示例。
我的规则说只需“每周的每天早上8点,告诉我的Harmony Ultimate系统开始运动",这又将激活电视,Xbox,放大器,并在一分钟后按A按钮启动磁盘。
不幸的是,OpenHAB尚无法为我做练习。
我想向您展示的另一条规则是我用来管理湿度的方法我的家。我只有一个除湿机,需要在任何地方移动,所以我决定查看所有湿度传感器,找出哪个湿度传感器最高,并将其存储在变量中。目前每分钟都会触发一次,但可以轻松将其降低。首先看一下:
import org.openhab.core.library.types.*import org.openhab.model.script.actions.*import java.lang.Stringrule "Humidity Monitor"when Time cron "0 * * * * ?"then var prevHigh = 0 var highHum = "" Humidity?.members.forEach[hum| logDebug("humidity.rules", hum.name); if(hum.state as DecimalType > prevHigh){ prevHigh = hum.state highHum = hum.name + ": " + hum.state + "%" } ] logDebug("humidity.rules", highHum); postUpdate(Dehumidifier_Needed,highHum);end
规则的核心是在 Humidity?.members.foreach 行中。湿度是我的湿度传感器的组名。 。成员抓取该组中的所有项目; foreach 对其进行迭代(使用您可能不熟悉的方括号格式)。规则的语法是Xtend的派生形式,因此,如果找不到适合的示例,则可以阅读Xtend文档。
您可能不需要,尽管-数百个示例规则
MQTT中用于OpenHAB和物联网的高级示例
MQTT是用于机器对机器通信的轻量级消息传递系统–一种用于Arduino或Raspberry的Twitter Pi互相交谈(当然,它不仅可以与其他人聊天)。它迅速普及并找到了物联网设备的家,物联网设备通常是资源不足的微控制器,需要可靠的方式将传感器数据传输回集线器或接收远程命令。
但是为什么要重新发明轮子呢?
MQ遥测运输技术是1999年发明的,它通过慢速卫星连接来连接石油管道。 ,专门设计用于最大程度地减少电池使用量和带宽,同时仍提供可靠的数据传输。多年来,设计原理保持不变,但用例已从专用的嵌入式系统转变为通用的物联网设备。该协议于2010年免费发布,任何人均可使用和实施。我们喜欢免费。
您可能想知道为什么我们还要烦恼另一个协议-毕竟我们已经有了HTTP-可用于在各种Web连接的系统之间发送快速消息(例如OpenHAB和IFTTT,特别是在新制造商频道)。而且你会是对的。但是,HTTP服务器的处理开销非常大–如此之大,以至于您无法轻松地在像Arduino这样的嵌入式微控制器上运行它(至少可以,但是您将没有太多的内存可用于其他用途) )。另一方面,MQTT是轻量级的,因此在您的网络上发送消息不会阻塞管道,它可以轻松放入我们小的Arduino内存空间。
MQTT需要两个服务器(称为“经纪人")和一个或多个客户。服务器充当中间人,接收消息并将其重新广播给任何感兴趣的客户端。
让我们继续使用 Twitter-for-machines 类推。正如Twitter用户可以鸣叫自己无意义的140个字符一样,用户可以``关注''其他用户以查看精选的帖子流,MQTT客户端可以订阅特定的频道以从那里接收所有消息,以及发布自己的消息到那个频道。与HTTP的传统客户端/服务器模型相反,此发布和订阅模式称为 pub / sub 。
HTTP要求您向您要与之通信的计算机伸出援手,说“你好",然后在获取或放置数据时不断来回确认对方。使用pub / sub,发布的客户端不需要知道订阅了哪些客户端:它只会抽出邮件,然后由代理将其重新分发给任何订阅的客户端。任何客户都可以像Twitter用户一样发布和订阅主题。
尽管与Twitter不同,MQTT并不限于140个字符。它与数据无关,因此您可以发送小数目或大文本块,JSON格式的数据报,甚至图像和二进制文件。
在所有方面,MQTT都不比HTTP更好–但它<如果我们要在家里到处都有很多传感器并不断报告,em>更为合适。
同样重要的是要知道OpenHAB不会充当您的MQTT经纪人–我们稍后再解决。但是,OpenHAB将充当客户端:它既可以发布您的OpenHAB活动日志,也可以将特定的频道绑定到设备,因此您可以例如在特定频道上拥有由MQTT消息控制的开关。
尽管OpenHAB包含MQTT客户端,因此您可以订阅主题并发布消息,但它不会充当服务器。
为此,您需要使用基于Web的MQTT代理(收费或免费),或在Pi上安装免费软件。我想将其全部保留在内部,因此我已经在Pi上安装了Mosquitto。
不幸的是,通常的apt-get提供的版本已经过时了。相反,让我们添加最新的资源。
wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.keysudo apt-key add mosquitto-repo.gpg.keycd /etc/apt/sources.list.d/sudo wget http://repo.mosquitto.org/debian/mosquitto-wheezy.listsudo apt-get install mosquitto
这是在本地网络上启动并运行MQTT服务器所需要做的全部工作。您的代理默认情况下在端口1883上运行。
使用免费的MQTT.fx(跨平台)检查MQTT服务器是否正在运行。单击设置图标以创建新的配置文件,然后输入Raspberry Pi的IP地址或名称。保存,然后点击连接。如果右上角的小交通灯变成绿色,那就很好了。
要进行快速测试,请点击“订阅"标签,然后在主题/类型中输入 >进入文本框,然后点击订阅按钮。现在,您已订阅接收名为inTopic的主题的消息,尽管该主题将显示0条消息。返回“发布"选项卡,在小框中键入inTopic,在下面的大文本框中键入一条短信。点击几次发布,然后在“订阅"标签上回头。您应该看到该主题中出现了一些消息。
在向网络中添加一些实际的传感器之前,我们需要了解主题级别,这使我们能够构建和过滤MQTT网络。主题名称区分大小写,不能以$开头,也不应该包含空格或非ASCII字符-确实是变量名称的标准编程实践。
/分隔符表示主题级别,是分层的,例如以下所有有效主题级别。
inTopic/smallSubdivision/evenSmallerSubdivisionmyHome/livingRoom/temperaturemyHome/livingRoom/humiditymyHome/kitchen/temperaturemyHome/kitchen/humidity
已经,您应该已经看到这种树结构对于充满传感器和设备的智能家居是多么完美。在单个房间中与多个传感器一起使用的最佳实践是将每个传感器变量发布为自己的主题级别–分支到更具体的内容(如上述示例中所示)–而不是尝试将多个类型的传感器发布到同一通道
然后,客户可以发布或订阅任意数量的单个主题级别,或者使用一些特殊的通配符从树中的更高位置过滤。
+通配符替代任何一个主题级别。例如:
myHome/+/temperature
将让客户端同时订阅这两个
myHome/livingRoom/temperaturemyHome/kitchen/temperature
…但不是湿度级别。
#是一个多级通配符,因此您可以通过以下方式从livingRoom传感器阵列中获取任何信息:
myHome/livingRoom/#
从技术上讲,您还可以订阅根级别#,这绝对会使您通过经纪人的所有事情都变得如此,但这就像粘贴消防水带一样在你的脸上:有点压倒性的。尝试从HiveMQ连接到公共MQTT代理并订阅#。在客户端崩溃之前,我在几秒钟内收到了约300条消息。
MQTT入门提示:“ / myHome /" 与“ myHome /" –在开头添加一个斜杠会创建一个空白的主题级别,尽管在技术上有效,但不建议使用该主题级别,因为它可能会造成混淆。
现在我们已经了解了理论,下面我们来看看Arduino,Ethernet Shield和DHT11温湿度传感器–您的入门套件中可能有一个,但是如果
如果不是这样,只需将环境传感器换成运动传感器(甚至是按钮)即可。
如果您具有内置了Wi-Fi或以太网的混合Arduino兼容设备,那也应该可以。最终,我们将需要一种更好/更便宜的通信方式,即必须在每个房间中使用网络连接,但这可以用来学习基础知识。
首先从Github下载pubsubclient库。如果您使用了“下载为ZIP"按钮,则结构有点错误。解压缩,将文件夹重命名为 pubsubclient ,然后将两个文件从 src 文件夹中取出,并将其向上移动一层到下载文件夹的根目录中。然后将整个文件夹移到您的 Arduino / libraries 目录。
这是我可以修改的示例代码:DHT11信号输出在引脚7上。更改服务器IP。您的Pi在以下行上:
client.setServer("192.168.1.99", 1883);
不幸的是,我们不能使用它的友好名称(在我的情况下为OpenHAB.local),因为Arduino上的TCP / IP堆栈是非常简单,为Bonjour命名添加代码会占用很多内存,我们不想浪费。要更改正在广播传感器数据的主题,请向下滚动到以下几行:
char buffer[10];dtostrf(t,0, 0, buffer);client.publish("openhab/himitsu/temperature",buffer);dtostrf(h,0, 0, buffer);client.publish("openhab/himitsu/humidity",buffer);
该代码还包括对命令通道的订阅。找到并调整以下行:
client.subscribe("openhab/himitsu/command");
检查附近的代码,您会发现可以轻松控制LED或继电器,例如,通过向特定通道发送命令。在示例代码中,它仅发送回一条消息,确认已收到命令。
上传代码,将Arduino插入网络,并使用MQTT.fx订阅#或 openhab / himitsu /#(或将房间名称更改为任何名称,但不要忘了在末尾添加#)。很快您就会看到消息进入;如果您将ON或OFF发送给命令主题,也会收到确认信息。
方程式的最后一步是将其挂接到OpenHAB中。为此,我们当然需要绑定。
sudo apt-get install openhab-addon-binding-mqttsudo chown -hR openhab:openhab /usr/share/openhab
并编辑配置文件以启用绑定。
mqtt:broker.url=tcp://localhost:1883mqtt:broker.clientId=openhab
重新启动OpenHAB
sudo service openhab restart
然后我们添加一个一两个:
/* MQTT Sensors */Number Himitsu_Temp "Himitsu Temperature [%.1f °C]" <temperature> (Himitsu,Temperature) {mqtt="<[broker:openhab/himitsu/temperature:state:default]"}Number Himitsu_Humidity "Himitsu Humidity [%.1f %%]" <water> (Himitsu,Humidity) {mqtt="<[broker:openhab/himitsu/humidity:state:default]"}
现在您应该了解格式了;从MQTT绑定中获取有关指定主题的数字项。这是一个简单的示例,您可能希望参考它变得更加复杂的Wiki页面。
恭喜,您现在有了便宜的基于Arduino的传感器阵列的基础。将来,我们将再次讨论这一点,并将Arduino放置在他们自己的完全独立的RF网络中。如果您碰巧有其中一个,我还为Wizwiki 7500开发板创建了相同版本。
持久性和图形数据
现在,您可能已经设置了一堆传感器,无论是从Z-Wave还是运行MQTT的自定义Arduino,都可以随时查看这些传感器的当前状态,还应该对规则中的传感器值做出反应。但是,传感器值的有趣之处在于它们通常会随着时间而变化:这就是持久性和绘图功能的体现。OpenHAB中的 Persistence 意味着随着时间的推移保存数据。让我们继续设置RRD4J(Java循环数据库),之所以这么称呼是因为数据以循环方式保存-丢弃旧数据以压缩数据库的大小。
使用rrd4j软件包安装
sudo apt-get install openhab-addon-persistence-rrd4jsudo chown -hR openhab:openhab /usr/share/openhab
然后在 configurations / persistence 文件夹中创建一个名为 rrd4j.persist 的新文件。粘贴以下内容:
Strategies { everyMinute : "0 * * * * ?" everyHour : "0 0 * * * ?" everyDay : "0 0 0 * * ?" default = everyChange}Items { // persist everything when the value is updated, just a default, and restore them from database on startup * : strategy = everyChange, restoreOnStartup // next we define specific strategies of everyHour for anything in the Temperature group, and and every minute for Humidity Temperature* : strategy = everyHour Humidity* : strategy = everyMinute // alternatively you can add specific items here, such as //Bedroom_Humidity,JamesInOffice : strategy = everyMinute}
在此文件的第一部分中,我们正在定义策略,这仅意味着为CRON表达式命名。这与我们对My.OpenHAB所做的相同,但是这次我们创建了一些新的策略,可以使用EveryDay,everyHour和EveryMinute。我还没有用完它们,但是将来可能会用到。
在文件的后半部分,我们告诉rr4dj要保存哪些数据值。默认情况下,每次更新时我们都会保存所有内容,但我还为特定传感器指定了一些基于时间的策略。我不太在意温度,因此我将其设置为仅保存每一小时,但是湿度对我来说是一个大问题,所以我想看看它每分钟的变化情况。如果您还希望在设定的时间保存其他数据,请立即在此处添加或根据需要进行调整。
注意:如果还要绘制数据图形,则必须至少存储一次一分钟。传感器数据的更新速度是否如此快都没关系,您只需要告诉rr4dj每分钟存储一次即可。
定义好之后,您应该开始看到一些调试输出,告诉您正在存储值。
接下来,让我们为所有这些做一些漂亮的图形数据。真的很简单要制作单个传感器的图表,请在站点地图中添加以下内容:
Chart item=Bedroom_Humidity period=h
这实际上就是您所需要的。有效期限为 h,4h,8h,12h,D,3D,W,2W,M,2M,4M,Y ;这些含义很明显。如果未指定,则默认为D,表示一整天的数据。
要创建包含多个项目的图形,只需绘制组名称即可:
Chart item=Humidity period=h
您可能也有兴趣知道您可以在其他地方使用此图;它使用以下URL生成图像: http:// YOUROPENHABURL:8080 / chart?groups = Humidity&period = h
您的 OpenHAB系统怎么样?
这是本指南的该部分,但是不要指望这是您最后一次从我们这里获得有关OpenHAB的信息。希望本指南和初学者指南为您开发自己的完整OpenHAB系统打下坚实的基础-但这是一个从未真正完成的过程。
幸运的是,OpenHAB可以很好地从几台设备扩展到数百台,从简单的规则复杂性到最终的家庭自动化,那么您的系统进展如何?您选择了哪些设备?您要处理的下一个大型项目是什么?
在评论中进行讨论–如果您觉得本指南有用,请单击这些共享按钮,告诉您的朋友他们也可以设置自己的OpenHAB系统。
标签: Arduino 家庭自动化 Longform指南