本文档将描述构建一个 Google 表格,该表格从 Particle Photon 接收家庭电流数据。在每 24 小时结束时,数据将被复制到一张新表中,该表将由一个脚本进行分析,该脚本将样本之间的电流幅度变化与已知设备签名进行比较,以确定给定设备消耗了多少电量。然后将当天的总用电量以及每个设备消耗的电量复制到“DailyLog”表中,该表跟踪每天的总电量。本指南假定您使用的是 Particle Photon 并已按照其有关初始设置等的说明进行操作。您还需要访问 Google Drive 并对电子表格有一些基本的了解。
首先转到您的云端硬盘并创建一个新的 Google 表格,它将从您的 Particle Photon 收集数据。给你的电子表格一个名字,任何你喜欢的名字。第一列标题必须称为“时间戳”(区分大小写)。可以为后续列指定任何名称,但出于本项目的目的,我们将它们填写为:
第 1 行必须与本文档稍后描述的 JSON 键完全匹配。第 2 行是信息性的,因此用户可以看到每列中代表的频率。这是可由用户配置的,将在本文档的 Photon 代码部分进行描述。
第 3 行将包含一些有助于跟踪总功耗的公式。单元格 A3 应包含以下公式:
=sum(-1*A4,INDEX(A4:A, COUNT(A4:A)))*24
此公式从最后一个时间戳中减去第一个时间戳,然后乘以 24,得到从第一个样本到最后一个样本的总时间量(以小时为单位)。单元格 B3 和 M3 应分别包含公式:
=average(B4:B)*A3*120/1000
=average(M4:M)*A3*120/1000
这些公式计算出平均电流,乘以小时数 (A3),乘以 120V,然后除以 1000,得到当天每个相位消耗的千瓦时总数。
突出显示 A 列并单击格式>数字>日期时间以显示时间戳上的日期和时间。然后,突出显示单元格 A3 并将其格式更改为“数字”>“数字”,因为它是小时数而不是时间戳。
你应该得到这样的结果:
记下文档中特定工作表的名称(默认情况下为“Sheet1”),因为稍后您将需要它用于脚本。Photon将向此电子表格发送数据,每次添加一个新行。在此电子表格中添加一个附加表并将此函数插入第一个单元格 (A1):
=SORT(QUERY(Sheet1!A:Z,"order by A desc limit 90"),1,1)
这将从 Sheet1 复制最后 90 个条目并不断更新它们,这将使我们能够创建动态更新的图表。您可以创建额外的工作表,将 90 更改为您想要的任何值,从而允许您创建不同时间段的图表。
像这样:
Google 表格 注意:有时,当您更改表格中的一个单元格时,它似乎不会生效,直到您在另一个单元格中执行某些操作。如果添加此“排序”功能时没有任何反应,请在随机单元格中键入一个随机字符,然后按回车键。(不要忘记稍后将其删除。)或者,继续执行此操作方法并相信它会弹出。
为了设置电子表格以接收来自 Photon 的数据,我们将创建此处描述的脚本。在 Google 表格中单击工具>脚本编辑器。这将在新选项卡中打开脚本编辑器。给你的项目任何你喜欢的名字。然后将 Code.gs 中的默认文本替换为 Google 表格 JavaScript(附在下面)。
你应该得到这样的结果:
请注意,在第二行中,变量 SHEET_NAME 必须与电子表格中接收数据的特定工作表的名称一致。因此,如果您更改它的默认值“Sheet1”,请务必在此处也进行更改。
单击保存图标,然后通过单击“运行”>“运行功能”>“设置”来运行设置功能。您将获得一个弹出窗口来查看权限。单击“审查权限”,然后在下一个窗口中单击您的 Google 帐户。之后,您可能会收到一条提示,提示“此应用未经验证,”如果是,请单击“高级”,然后单击“转到 GenericScriptName(unsafe)”。然后您可以单击“允许”以授予脚本编辑电子表格的权限。
仍在脚本编辑器中时,单击文件>管理版本以创建脚本的初始版本。给它一个描述,例如“InitialVersion”,然后单击“保存新版本”,然后“确定”。
接下来我们需要为这些脚本设置触发器。为此,请单击“编辑”>“当前项目的触发器”,这将在新选项卡中打开 G Suite 开发人员中心。单击右下角的“+ 添加触发器”按钮,在弹出的窗口中,从下拉列表中选择“doPost”、“Head”、“From Spreadsheet”和“On form submit”,然后单击保存. 失败通知设置可以根据您希望在脚本失败时收到通知的频率的偏好来设置。可能会有另一个弹出窗口让您再次选择您的 Google 帐户,然后请求允许脚本编辑工作表的权限,单击“允许”。
您还需要创建一个触发器来每天运行 copy_delete 函数,该函数复制 Sheet1,用当天的日期重命名复制的工作表,然后删除 Sheet1 上的所有行以开始新的一天的数据。再次单击“+ 添加触发器”,然后从下拉选项中选择“复制_删除”、“头部”、“时间驱动”、“日间计时器”和“晚上 10 点至晚上 11 点”(或任何您喜欢的时间)。请注意,该脚本将使用当天的日期重命名工作表,因此您希望时间在午夜之前。再次,失败通知可以设置为您的偏好。
同样,为 appliance_id 和 getDailyTotal 函数添加触发器。这些脚本应该在 copy_delete 函数运行后运行,因此如果您选择“晚上 10 点到晚上 11 点”,您可以为 appliance_id 选择“午夜到凌晨 1 点”,为 getDailyTotal 选择“凌晨 1 点到凌晨 2 点”,这必须最后运行。
你应该得到这样的结果:
返回到您的脚本(脚本编辑器选项卡)并单击发布>部署为 Web 应用程序。从下拉列表中选择相关的项目版本(可能是 1),以“我”的身份执行应用程序,以及谁有权访问“任何人,甚至是匿名的”。单击“部署”,您将获得一个 url,您将需要它来使用您的 webhook。复制它并单击“确定”。(您可以将链接保存在记事本或类似的东西中。)
对于webhook,我们将详细说明本教程中描述的方法。在Particle Console 中,转到 Integrations 页面,然后单击“+ NEW INTEGRATION”框,然后单击“Webhook”。为 webhook 指定一个事件名称,这将是启动 webhook 的Particle.publish事件。出于我们的目的,它将被称为“GenericWebhookName”(区分大小写)。对于 url,粘贴您将脚本发布为 Web 应用程序时获得的地址。请求类型是“POST”,请求格式是“Web Form”,Device 可以保留为“Any”。底部的小下拉菜单是“高级设置”——
单击底部的“高级设置”菜单并切换“自定义”单选按钮。开始填写表单字段。行的顺序在这里不是特别重要。值得注意的是,左列与电子表格中的列标题相关,右列是您将要发送的 JSON 键/值对中的键。为简单起见,我给它们起了相同的名字。下图中未显示所有行,但请继续填写,直到电子表格中除“时间戳”之外的每一列都有一行。
其他一切都可以保留为默认设置。单击“创建 Webhook”。完整的 webhook 应如下所示:
首先将您的光子更新到最新版本的固件。单击设备的build.particle.io网页左下角的十字准线(设备) 。单击要使用的设备的下拉菜单,然后选择最新的系统固件。推荐使用 0.8.0-rc.14 或更新版本,尽管旧版本的 rc 也可以。所选固件目标将在下次刷新时下载到您的设备。
对于我们的项目,您可以使用此代码上传到您的 Photon。然而,对于一般情况,使用此 webhook 将数据发布到电子表格的格式如下所示:
Particle.publish("GenericWebhookName","{\"IrmsA\":\"" + tIrmsA + "\",\"A1\":\"" + A_1 + "\",\"A2\":\"" + A_2 + "\",\"A3\":\"" + A_3 + "\",\"A4\":\"" + A_4 + "\",\"A5\":\"" + A_5 + "\",\"A6\":\"" + A_6 + "\",\"A7\":\"" + A_7 + "\",\"A8\":\"" + A_8 + "\",\"A9\":\"" + A_9 + "\",\"A10\":\"" + A_10 + "\",\"IrmsB\":\"" + tIrmsB + "\",\"B1\":\"" + B_1 + "\",\"B2\":\"" + B_2 + "\",\"B3\":\"" + B_3 + "\",\"B4\":\"" + B_4 + "\",\"B5\":\"" + B_5 + "\",\"B6\":\"" + B_6 + "\",\"B7\":\"" + B_7 + "\",\"B8\":\"" + B_8 + "\",\"B9\":\"" + B_9 + "\",\"B10\":\"" + B_10 + "\"}",5,PRIVATE);
关于下面的 Photon 固件中定义的常量,有几点需要牢记。样本数必须是2的幂,采样频率必须是样本数的整数倍。我们发现 4096 似乎是 Photon 可以可靠达到的最大采样率。常量“harm”是每相捕获的谐波数,“base_harm”是最低的。例如,我们将“base_harm”定义为 20,并且每相有 10 个谐波(20-200 是 20 的倍数)。我们的测试表明,这大致是我们项目有用信息的范围。
验证并刷新您的固件(将代码下载到您的设备)。此命令发布一个名为“GenericWebhookName”的事件,并生成一串 JSON 格式的文本,发送到我们之前创建的脚本。附加到上面字符串的变量是字符串类型。如果一切顺利,在您的Particle 控制台中,您应该会看到如下内容:
现在返回您的电子表格,您应该开始看到添加了数据的行。在您设置为显示 Sheet1 的最后 X 个条目的 Sheet2 上,您可以通过选择列来创建图表,并且图表将随着您的数据不断更新。
现在您的工作表正在接收数据,您需要设置一个工作表来保存您将要测试的各个设备签名。创建一个新工作表并将其命名为“Appliances”(appliance_id 脚本需要这个确切的名称才能工作)。第 1 行应该是用于标识列的标题。
要获取设备签名,请打开设备并在 Sheet1 上记下电流变化的位置。您可能需要多次打开和关闭同一设备,记下时间,以便找到它的签名。单相电器(如您的微波炉)只会出现在“A”相或“B”相下。像你的空调这样的电器会在整排发生变化。一旦您在观看 Sheet1 时“看到”您的设备打开:
突出显示并复制您注意到的更改前后的行:
接下来,返回 Appliances 工作表并将数据粘贴到一些空白单元格中:
在此数据下方插入一个计算差异的函数:
并将该公式复制到每一列下。完成整行后,突出显示并将其粘贴到列表中的下一个空行中。使用“Ctrl+shift+V”粘贴以便仅粘贴值而不是公式。这种差异是您设备的特征。
将签名数据复制到适当的行后,您可以删除多余的数据并填写设备名称。您还可以在每个空白列中放置 0。appliance_id 脚本无论如何都会忽略幅度变化小于 1 的频率(因为信号被噪声淹没),因此为了整洁起见,您可以用 0 替换任何小于 1 的数字。完成后,它应该看起来像这样:
接下来,您需要一张表来记录每日用电量。创建一个名为“DailyLog”的新工作表。对于第 1 行,AE 列应标记为“日期”、“A 阶段”、“B 阶段”、“总功率”和“总成本”,后续列与您的各个设备名称匹配,顺序与它们列出的顺序相同在您的设备表上。它看起来像这样:
您现在应该有一个 Google Sheet 文档,它正在从您的 Particle Photon 接收实时数据到 Sheet1。每天一次,在您指定的时间,应该首先运行 copy_delete 脚本,然后是 appliance_id 脚本,最后是 getDailyTotal 脚本。开始项目时,因为我们保留了 7 天的数据(如果您完全按照本教程进行操作),getDailyTotal 脚本将删除左侧的第七个工作表(或选项卡)。因为您不希望脚本意外删除您的“DailyLog”或“Appliances”工作表,所以您需要向文档中添加七个空白工作表。该脚本从左侧开始计算表格并按位置删除第七张表格,因此将您要保留的表格一直移到右侧。有点像这样:
copy_delete 触发器,该工作表将被复制并重命名为当天的日期,Sheet1 将被清除以开始新的一天。
然后 appliance_id 脚本将梳理当天的数据,并将每行中的幅度变化与 Appliances 表上的每个设备签名进行比较。它将为每个设备创建一个新列。该脚本基本上是从仅比较当前更改开始的。如果电流变化在电器签名电流变化的 2 安培范围内,则它会继续比较该电器签名上幅度变化大于 1 的每个频率。如果它们在彼此指定的公差范围内(这可以在 appliance_id 脚本(Google 脚本中的第 104 行)的变量“公差”中更改),则脚本将插入该特定的消耗功率(以 kWh 为单位)该设备列下该行中的示例。一旦它被指定为“开”,它只是根据设备签名中的数量来查找电流,以确定它是否“关闭”。每个设备消耗的总功率被累加并放置在该设备列的第 3 行。脚本运行后,当天的数据将如下所示:
查看第 3 行,我们在 A 列中有总小时数,在 B 和 M 列中有 A 相和 B 相消耗的功率(以千瓦时为单位),以及从 X 列开始的每个设备消耗的功率。
最后,getDailyTotal 脚本将运行并将这些总数复制到我们的 DailyLog 页面。它应该看起来像这样:
您需要考虑 getDailyTotal 脚本中的几个变量。第一个是成本变量,您需要将其定义为供应商的成本/千瓦时电力。第二个是 days2keep 变量,它是您要保留数据的天数。Google 表格允许文档中最多有 500 万个单元格(Google 云端硬盘支持),因此您无法无限期地存储它们。在上面的代码中,它被赋值为 7 以存储 7 天。
当您想出新的和创造性的方法来进行计算、更有效地移动数据或创建图表和图形来打动您的朋友时,请分享您的想法!(不要忘记将这些新床单移到右边!)
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !