OpenHAB家庭自动化控制系统中“ Master Kit”模块的工作。第3部分:实时时钟

OpenHAB家庭自动化控制系统中Master Kit模块的工作继续(此处此处开始)。
这篇简短的文章首先问自己一个问题:如果我的乡间别墅中没有永久连接的Internet,那么OpenHAB将从何处获取其时间和日期信息?



我立刻想到了实时时钟(RTC)类设备,其中我选择了鲜为人知的带有USB连接的MK8900模块对我来说,最吸引人的是将其简单地插入USB端口的能力,这与明智地使用Arduino的需求不同。

USB连接的便利性与在OpenHAB中掌握串行绑定的计划相吻合。该模块具有温度传感器,恒温器和抽动微控制器(GPIO)几根支脚的能力,但是今天这并不是主要的事情。我对通过COM端口连接设备的能力的发展大加赞赏。

我会先说,在掌握过程中,我了解到:

-控制设备并从中接收响应;
-只需从响应线中提取时间,日期和温度就足够了;
-在适当的字段中显示这些值

因此,要记住的第一件事是将org.openhab.binding.serial-1.7.1.jar文件放在C:\ OpenHab \ addons文件夹中,这将节省您几个小时的时间来弄清为什么什么都不起作用(一个恶作剧)。接下来,将模块连接到计算机,然后在Windows控制面板的“设备管理器”中查看同时形成的端口号。我得到了一个幸运的数字COM5。如果您的计算机看不到该设备,则需要为您的操作系统安装Silicon Labs CP210x USB至UART驱动程序。

在.sitemap中,在.cfg配置中我也什么也没做。添加仅出现在testdrive.items和testdrive.rules文件中

,测试配置屏幕开始如下所示:



如果您输入“实时时钟”部分,则图片为此类



文件可以在“下载”选项卡上进行测试配置

详细信息:
在.items中,我在界面中添加了几行创建了一个新的时钟组以及几个元素:

组RTC(全部)//为MK8900实时时钟

DateTime Date_RTC 创建一个页面:[%1 $ tA,%1 $ td。%1 $ tm。%1 $ tY]”(RTC)
DateTime Time_RTC“时间:[%tR]”(RTC)
编号MK8900_T“当前温度:[%.1f° C]“(RTC)
开关Get_Time“请求时间”(RTC)
字符串Serial_string“命令/响应模块:[%s]”((RTC){serial =“ COM5”}

这是一个复杂的字符串:“日期:[%1 $ tA,%1 $ td。%1 $ tm。%1 $ tY]”只是设置日期输出格式:星期几,day.month.year。这就是:“时间:[%tR]”显示时间。最细心的人会注意到,通过Internet接收的时间以不同的方式显示“莫斯科时间:[%tT]”。我特别用表达式[%tR]中的格式用R替换了字母T 因为“ T”显示秒,而“ R”生成的输出没有秒。这就是我需要的,因为MK8900模块不会提供有关秒的信息。
其余都是普通元素,但请注意Serial_string具有绑定设置
{serial =“ COM5”}。事实证明,这足以通过USB进行交换。正是此线路元素将命令发送到模块并从模块接收响应。您无法在界面中显示它,但是为了清楚起见,我放弃了与时钟交换信息的过程。规则的结果将填充(更新)所有其他字段的值。

第一个规则很简单-您需要从模块中请求信息。最简单的方法是使用命令! 项目Get_Time收到命令时, GetA

规则“ Get_Time ON”
然后 if(receivedCommand == ON)Serial_string.sendCommand(“!GetA \ r”) 结尾





在此示例中,我使用Switch Get_Time元素“手动”请求信息,并获得以下格式的响应:!14:5608.10.15 + 2718可以看到该行具有时间,日期,当前温度甚至是恒温器设置(18),但是我们现在不使用它。
第二条规则将分析响应并在相应的字段中显示信息,如下所示:

规则“ MK8900发送到Openhab”,

项Serial_string更改
后,
msg = Serial_string.state.toString.trim
var String time_rtc =“”

if(msg.contains( “:”)){
time_rtc =“ 20” +(msg.mid(12,2))+“-” +(msg.mid(9,2))+“-” +(msg.mid(6,2) ))+“ T” + msg.mid(1,5)+“:00”
println(“ time_rtc --->»+ Time_rtc)
postUpdate(Time_RTC,time_rtc)
postUpdate(Date_RTC,time_rtc)
postUpdate(MK8900_T,msg.mid(14.3))
}
结束


警告!确保将msg变量声明为全局变量。这是通过在导入块与第一个规则规则之间的.rules文件的开头放置字符串Var String msg =“”来完成的。记住要这样做。
现在最有趣的是,此行截取了模块的响应:
msg = Serial_string.state.toString.trim解密为字符串类型中Serial_string元素的状态,并删除前面的无关紧要的空格。条件if(msg.contains(“:”))(如果答案包含冒号,则)我用来确保只有模块的响应才能到达处理过程,而不是命令本身。
在模块的第一个答案之后,我们得到msg =!14:5608.10.15 + 2718我们无法立即使用此行进行处理,因为DateTime类型的字段可以理解以下格式:2015-10-08T16:41:00。我在OpenHAB监视器中监视了它通过网络更新日期和时间的记录。



我想,如果您将行转换为14:5608.10.15 + 2718到格式为2015-10-08T16:41:00的行,那么我将很有可能在实时时钟字段中显示信息。为此,仅对此规则采用另一个已经为本地的空变量:var String time_rtc =“”。然后,我开始以这种方式收集所需的日期格式:

time_rtc =“ 20” +(msg.mid(12,2))+“-” +(msg.mid(9,2))+“-” +(msg.mid (6,2))+“ T” +消息中(1,5)+“:00”

构造此表达式的逻辑是这样的:我需要以“ 2015”的形式表示的一年,所以我将20加上引号,这意味着恰好20将落入最终值。然后我已经从模块的答案中获取了信息(msg.mid(12,2)),这意味着从第12位开始将2个字符组成一个段。倒数从零开始,在我们的地方,我们有“!”。这是15,总共是2015年。然后我从第9位(这是月份)开始添加破折号和2位数字,再加上破折号,2位数字,依此类推。直到您得到我需要的电话。
顺便说一下,事实证明,使用规则代码中的以下行进行调试非常方便:println(“ time_rtc --->” + time_rtc)然后,在监视器中,您将看到获得的结果。看到这一行--->?



它仅用于更新我需要的字段中的信息:

postUpdate(Time_RTC,time_rtc)
postUpdate(Date_RTC,time_rtc)
postUpdate(MK8900_T,msg.mid(14.3))


我更新“输入”温度,立即拔出所需的字符。的确,加号的显示存在问题。但这是您的挑战。第二项任务可能是对给定时间段内的小时进行自动调查,考虑到所涵盖的材料,我认为这不是最困难的规则。
祝好运!

Source: https://habr.com/ru/post/zh-CN385053/


All Articles