我想提醒您注意有关KernelChip的 Laurent控制模块的系列文章。在本系列中,我将向您介绍如何将这些模块集成到智能家居中,如何从流行的MajorDoMo家庭自动化系统,Arduino草图,Arduino Mega Server系统中学习如何管理这些模块,以及如何将这些模块用于完全出乎意料的目的-教您的孩子进行处理编程。
通常,如果您具有一定的想象力和创造力,那么对家庭本身非常有趣的模块可能会意外地在家庭中非常有用。为什么选择洛朗?
因为这些模块已经在我的智能家居系统中成功运行了很长时间(超过三年),并且我在使用它们方面积累了一些经验,所以我有一些要讲述的地方。我也有一些经验和现成的,经过测试的代码可以管理这些模块,我想与您分享。您将能够基于此代码开发软件解决方案,这将非常简单,因为我已经完成了大部分工作。此外,还将对代码进行详细说明,这无疑有助于您理解其工作原理,学习编程并构建智能家居系统。模块本身
当我为自己选择一些现成的解决方案来管理通过网络的电力负荷时,Laurent凭借解决方案的完整性和简便性向我行贿。为了开始控制设备的开和关以及照明的网络,几乎不需要什么。不必学习编程语言,也不需要焊接任何东西,将模块连接到本地网络,将负载连接到中继端子就足够了(而且不要忘记给模块本身加电),仅此而已。之后,可以直接从计算机(从终端程序)发送命令。模块立即开始按照我的命令乖乖地打开和关闭灯。当时,我不需要更多。我可以说说模块本身,在整个操作过程中,没有崩溃和死机,一切都像时钟一样工作和工作,实际上,这是这些模块正常工作所必需的。设计和建造质量
仅查看模块就足以表明它是出于“仅”的原因而开发的,但试图做一件真正有价值的事情就足够了。我也没有抱怨建造质量,一切都做得井井有条,应该做到:没有弯曲的零件,焊锡之类的东西或类似的东西,一切都干净整洁。总的来说,构建质量与“品牌”计算机组件和“工厂” Arduino没有区别。如果我自己发布这些模块,我唯一要做的就是安装多色端子而不是单色端子来连接电线,至少要突出显示电源连接端子,但这是小巧的选择(当然,所有东西都经过整齐地签名)。该系列的第一篇文章是关于什么的?
所有信息均分为三篇逻辑上已完成的文章。第一篇文章将重点介绍将Laurent模块与MajorDoMo(流行的开源家庭自动化平台)集成。将给出具体示例和PHP代码。第二篇文章是关于与Arduino生态系统的集成。您可以根据程序从各个草图管理模块,或将Laurent与Arduino Mega Server(也基于Arduino代码)集成,并通过方便的界面或自动管理Laurents。还将提供现成的解决方案和经过测试的代码。第三点-关于通过Processing上的草图管理Laurent模块。也就是说,直接从家用计算机的桌面即可。同一篇文章将描述如何提高儿童对学习编程的兴趣,以及这些模块在此过程中可以发挥什么作用。该系列致力于将Laurent模块与家庭自动化系统集成,并且不考虑模块本身的体系结构和操作。这在使用它可以阅读其他文章中描述1,2,3,将在后面讨论。在这里,我们仅关注集成。在撰写本文的过程中,使用了带有La01固件和LW1.0 Web界面版本的Laurent模块,即,已经使用了三年的“战斗”模块。在新版本的模块中,实现细节可能略有不同,但是保留了与控制团队的兼容性,因此此处所说的内容也适用于较新的修改。模块管理的工作方式
与模块的所有信息交换都是通过网络进行的,要开始使用它们,您需要在端口2424上建立TCP / IP连接。建立连接后,您可以发送控制模块的文本命令(所谓的KE命令)。该KernelChip网站有详细的文档,包括KE命令的访问描述。KernelChip照顾用户,并为其模块提供了方便的Web界面,但这是“手动控制”,如果我们从智能家居中学习如何管理模块,该解决方案的便利性,价值和实用性将得到提高。
Web界面默认受密码保护,要查看网页内容,您需要输入用户名“ admin”和密码“ Laurent”。管家
MajorDoMo
系统非常受欢迎,在这里我将不对其进行详细介绍。假定您已经安装了该系统并使用了一段时间。对于那些根本不了解最新信息的人,我将解释说这是一个开放的家庭自动化平台,该平台可在Windows和Linux上运行,并基于Web服务器,是一种功能广泛的专业CMS(内容管理系统),对于家庭自动化。MajorDoMo的可能性确实是无止境的,管理Laurent模块只是该系统的才能之一。技术细节
MajorDoMo包含laurent.class.php文件,该文件位于目录中\htdocs\lib\
完整代码laurent.class.php<?
function laurent_command($host, $command, $password='Laurent') {
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo «socket_create() failed: reason: ». socket_strerror(socket_last_error()). "\n";
return 0;
}
$result = socket_connect($socket, $host, 2424);
if ($result === false) {
echo «socket_connect( $socket, $host, 2424) failed.\nReason: ($result) ». socket_strerror(socket_last_error($socket)). "\n";
return 0;
}
$in='$KE'."\r\n";
socket_write($socket, $in, strlen($in));
$res='';
while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
$res.=$out;
if (is_integer(strpos($out, "\n"))) {
break;
}
}
$in='$KE,PSW,SET,'.$password."\r\n";
socket_write($socket, $in, strlen($in));
$res='';
while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
$res.=$out;
if (is_integer(strpos($out, "\n"))) {
break;
}
}
$in=$command."\r\n";
socket_write($socket, $in, strlen($in));
$res='';
while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
$res.=$out;
if (is_integer(strpos($out, "\n"))) {
break;
}
}
socket_close($socket);
return trim($res);
}
function laurent_getStat($host, $password='Laurent') {
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo «socket_create() failed: reason: ». socket_strerror(socket_last_error()). "\n";
return 0;
}
$result = socket_connect($socket, $host, 2424);
if ($result === false) {
echo «socket_connect( $socket, $host, 2424) failed.\nReason: ($result) ». socket_strerror(socket_last_error($socket)). "\n";
return 0;
}
$in='$KE'."\r\n";
socket_write($socket, $in, strlen($in));
$res='';
while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
$res.=$out;
if (is_integer(strpos($out, "\n"))) {
break;
}
}
$in='$KE,PSW,SET,'.$password."\r\n";
socket_write($socket, $in, strlen($in));
$res='';
while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
$res.=$out;
if (is_integer(strpos($out, "\n"))) {
break;
}
}
$command='$KE,DAT,ON';
$in=$command."\r\n";
socket_write($socket, $in, strlen($in));
$res='';
$started=0;
while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
$res.=$out;
if (is_integer(strpos($out, "#TIME,"))) {
if (!$started) {
$started=1;
} else {
break;
}
}
}
$command='$KE,DAT,OFF';
$in=$command."\r\n";
socket_write($socket, $in, strlen($in));
sleep(1);
socket_write($socket, $in, strlen($in));
socket_write($socket, $in, strlen($in));
socket_close($socket);
return trim($res);
}
?>
并包含使用Laurent模块所需的一切。该文件包含PHP编程语言中的函数,并且可能以最终形式或进行了最小的修改后可以使用该编程语言传输到任何系统。因此,如果您在其他平台上有一个Smart Home项目,则可以尝试使用此文件将Laurent与您的系统集成。用于控制模块的主要功能是laurent_command('< >', '<>', '< >');
例如,$result = laurent_command('192.168.2.19', '$KE,INF', 'Laurent');
,其中“ 192.168.2.19”是模块的IP地址,“ $ KE,INF”是命令本身,“ Laurent”是密码(默认值)。函数的工作结果将进入变量$ result,即模块的响应,您可以使用标准PHP语言工具来分析和解释该结果。默认指定密码。如果您更改了用于访问模块的密码,则需要在功能调用中将其替换为新密码。团队应该清楚一切,您可以从目录中获取任何命令并根据需要管理模块。 IP地址也不应该引起任何问题。只需指定Laurent模块真正具有的IP地址即可。您可以以此结束理论,现在我将通过一个实际示例向您展示如何直接从MajorDoMo菜单进行灯光(或设备)控制。实际例子
作为一个实际示例,让我们看一下MajorDoMo系统主菜单中两个按钮“打开”和“关闭”的创建。使用这些按钮,您可以打开或关闭灯或任何电器(在这里,您只需要记住安装在模块上的继电器就不能直接控制电炉或热水器等强大的负载)。因此,我们创建了“启用”按钮,为此,我们转到MajorDoMo管理面板,输入用户名和密码(默认情况下为admin / admin),然后单击“对象/控制菜单”,然后单击绿色大按钮“添加新部分”。
接下来,我们找到“类型”下拉列表,然后从显示的所有类型中选择“按钮”,然后单击“保存”。
接下来,选择“父菜单项”是我们的按钮“钩”的地方。我有Laurent,您可以有任何方便的菜单项。默认情况下,存在“ ROOT”(根),这意味着该按钮将立即可见,而无需单击任何菜单项。在输入字段“标题”中,将要写入的内容写在按钮上。最后,在“代码”字段中,编写我们已经熟悉的laurent_command函数代码:laurent_command('192.168.2.19', '$KE,REL,2,1', 'Laurent');
此处与理论示例相同,只是缺少$结果变量(我们不需要),并且该命令由'$ KE,REL,2,1'代替,这意味着启用2号继电器。我们对“关闭”按钮执行相同的操作,只是不要忘记更改按钮的名称,而不是“ $ KE,REL,2.1”而不是“ $ KE,REL,2.0”,这意味着要关闭继电器2:laurent_command('192.168.2.19', '$KE,REL,2,0', 'Laurent');
就这样。我们使用MajorDoMo界面重新加载页面,出现了两个新按钮,可以直接从MajorDoMo界面精美地打开和关闭灯(或设备),几乎没有延迟。我们想要实现的目标。自动控制
现在,让我们尝试自动控制模块,而无需人工干预。现在您将看到,比使用按钮来控制模块还要容易。
我们在MajorDoMo管理面板的主菜单中找到“对象”项,单击它,然后找到对象“ ClockChime”及其方法“ onNewMinute”。我们需要他。对于那些不知道的人,这是MajorDoMo的“中央”方法,每分钟都会调用一次,非常流行。通过这种方法,有许多功能和脚本调用可提供系统的用户功能。
我们要做的就是将代码添加到该方法中。例如对于考虑这种情况。您的Laurent模块可控制家庭庭院中的夜间照明。例如,您希望灯光在21.00点打开,并在早上7.30点关闭。没有什么比这更简单了,这是您应该添加到onNewMinute方法中的代码:if (timeIs('21:00')) {
laurent_command('192.168.2.19', '$KE,REL,2,1', 'Laurent');
}
if (timeIs('7:30')) {
laurent_command('192.168.2.19', '$KE,REL,2,0', 'Laurent');
}
就是这样!您必须承认这一点都不困难。这只是一个例子,工作的逻辑可以是任何逻辑,而且非常复杂。Laurent模块的才华并没有随着负载的打开和关闭而结束,它们的功能更加广泛,但这不是本文的主题,这里我们仅通过简单的示例来考虑集成问题。接收和输出模块数据
最后一个示例将是如何在MajorDoMo网页上获取和显示从Laurent模块接收的信息。MajorDoMo是一个面向对象的系统,其所有工作都通过创建对象以及使用其数据(变量)和方法(程序代码)来进行。有点困难?其实没关系,现在您会自己看到。
因此,作为示例,我们将使用现有对象“ ThisComputer”,并将新属性“ test”添加到该对象中。为此,请在MajorDoMo管理区域中单击我们已经熟悉的“对象”菜单项,找到“ ThisComputer”对象,然后单击“属性”项,滚动到底部并找到“添加新属性”输入字段,输入“测试”并单击“刷新”(将值保留为空)。
在此基础上,准备操作可以视为已完成,我们在对象“ ThisComputer”中添加了一个新属性“ test”,我们将在实验中使用该属性。现在,我们的任务是从Laurent模块请求必要的信息,并将其放入对象“ ThisComputer”的“ test”的属性(变量)中。这个怎么做?很简单。将此代码添加到我们已经知道的onNewMinute方法中:$result = laurent_command('192.168.2.19', '$KE,INF', 'Laurent');
setGlobal('ThisComputer.test', $result);
MajorDoMo每分钟都会向模块询问必要的信息,并更新“ test”变量,我们可以根据需要使用该变量。例如,显示在网页上。为此,我们将以下代码放置在所需页面上的任何位置:%ThisComputer.test%
这就是所谓的。一个宏,在加载页面时,该宏将替代变量值而不是变量本身,该宏存储在“ ThisComputer”对象的“ test”属性中。结果,您会在网页上看到Laurent模块发送的信息,以响应您的请求。如何在页面上添加宏?我们进入管理菜单,选择“主页”项,然后选择所需的任何页面,或使用绿色的大按钮“新建页面”创建一个新页面。并将宏添加到页面上任何所需的位置。小计
这就是全部。有了本文中的信息,您就可以真正理解Laurents,并将这些模块集成到Smart Home系统中。在本系列的下一篇文章中,您将学习如何在Arduino和Arduino Mega Server系统上通过草图管理模块。