将从智能电表中获取的电力使用量进行图表化(使用Elasticsearch + Kibana)
首先
受到rukihenaさん的以下文章的启发,我尝试将家庭使用的电力数据从智能电表中提取并绘制成图表。
http://qiita.com/rukihena/items/82266ed3a43e4b652adb
你可以每隔一分钟确认一次瞬时电力使用量,类似这样的。
当图像被绘制成图形后,有什么好处?
節約意識正在提升
可能通过实时监控电力使用量来增强节能意识。即使我们积极努力想要节约电力,很难知道我们是否真正节约了。
由于能够了解常常使用电力的时间段/星期几,这对于选择按时间段分别较为便宜的电力计划时提供了参考。
你可能已经通过亲身体验意识到了使用电力的趋势,但通过将其图形化,我们可以更加准确地理解。
如果在不在的时间段内电力使用量急剧增加,可以推断有可能发生了入室盗窃的情况。
虽然应该没有人在,却使用了很多电…?这可能意味着可能被闯入了。然而,如果电力使用量突然增加,那可能是因为空手道者使用了高功率的电器,如吹风机或电水壶,但空手道者不太可能做这样的事情。即使知道了情况也无法怎么办。我们需要采用不同的方法来保护住宅。
有一种难以言喻的喜悦
当图形以令人满意的方式绘制出来时,总感觉有些开心。
准备好
首先,让我们准备以下三个事项。
申请加入电力计量器信息发布服务(B路由服务)。
要从智能电表获取数据,您需要订阅以上提到的服务。(免费)
大约三个星期后,将会发送用于认证的ID/密码。 ※ 适用于东京电力的情况
2. 可以使用Wi-SUN协议进行通信的设备
智能电表是通过Wi-SUN协议进行通信的。要使用Wi-SUN,需要准备专用设备。最简单的方法是准备USB设备WSR35A1-00。(尽管定价稍高,为15000日元)
3. 服务器 qí fú)
需要一个用于显示B路由通信和图表的服务器。在我们家里,我们使用树莓派2作为B路由通信服务器,并且使用云服务AWS的EC2(计划:t2.micro)作为图表显示服务器。使用这个计划,可以免费使用一年。
处理程序如下:在家中的B路由通信服务器通过Wi-SUN协议从智能电表中获取电力使用量,将其存储在云端的用于图形显示的服务器上,并且可以通过个人电脑、智能手机等网络浏览器访问,并查看图形。
建立服务器环境
B路由通信服务器(树莓派2)
这个文章与rukihena的文章有同样的结构。
如果有pyserial来进行串行通信,有Python环境来获取电力使用量的程序就可以了。
如果是在树莓派2上,这两个都已经默认安装了。
图表展示服务器(AWS EC2)
我們使用Elasticsearch和Kibana來進行圖形化。Elasticsearch是一個全文搜索引擎,但是與Kibana結合在一起,可以輕鬆地將數據圖形化。由於它們都是開源軟件,所以可以輕鬆使用。
若要运行Elasticsearch,需要安装JDK,如果没有安装,则需要安装。
$ sudo yum install java-1.8.0-openjdk-devel.x86_64
一旦准备好了JDK,就可以安装Elasticsearch和Kibana。
$ sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
$ sudo vi /etc/yum.repos.d/elastic.repo
---------------------------------------
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
[kibana-4.4]
name=Kibana repository for 4.4.x packages
baseurl=http://packages.elastic.co/kibana/4.4/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
---------------------------------------
$ sudo yum install elasticsearch -y
$ sudo yum install kibana -y
$ sudo service elasticsearch start
$ sudo service kibana start
首先,我们创建一个定义映射模式的文件,以确保数据以适合Elasticsearch的格式(可在Kibana中绘制图形)进行存储。
{
"mappings": {
"elec": {
"properties": {
"inst": {
"type": "integer",
"index": "not_analyzed"
},
"timestamp": {
"type": "date",
"format": "YYYY/MM/dd'T'HH:mm:ssZ"
}
}
}
}
}
请指定已创建的文件,并将其投入Elasticsearch中。
$ curl -XPOST 'http://localhost:9200/home' -d @elasticsearch_mapping.json | jq
另外,根据AWS的默认安全设置,除了22端口外,其他端口是无法从外部访问的,因此需要打开5601号端口(Kibana的端口)和9200号端口(Elasticsearch的端口)。
但是,如果要长期运营的话,最好采取适当的安全增强措施,例如限制访问源IP等。
实施
B路由通信服务器(树莓派2)
我在rukihena的样本程序中添加了将瞬时电力使用量每分钟写入Elasticsearch的处理。
# Elasticsearch接続用の設定を追加
> from elasticsearch import Elasticsearch
> es = Elasticsearch(host='<AWSのグローバルIP>', port=9200)
> from datetime import datetime
:
:
# 元のプログラムでは瞬時電力使用量を標準出力に表示している箇所を、Elasitcsearchに書き込むように変更
< print(u"Data:{0}[W]".format(intPower))
---
## 瞬時電力使用量と現在時刻を格納
> elec_inst = {
> 'inst': intPower,
> 'timestamp': datetime.now().strftime('%Y/%m/%d'+"T"+'%H:%M:%S'+"+0900")
> }
## RDBだと「home」データベースの「elec」テーブルに「elec_inst」のデータを格納するイメージ
> res = es.index(index="home", doc_type='elec', body=elec_inst)
>
## 1分sleep
> time.sleep(60.0)
只要没有错误并且可以正常运行就可以了。
$ python smartmeter_to_elasticsearch_aws.py
为了持续运作,请使用像supervisord这样的程序使其成为后台进程。
我在Kibana上查看一下
初始设定
使用网络浏览器访问Kibana。
http://<AWSのグローバルIP>:5601/
如果Kibana正常运行,将显示如下界面。
首先,指定存储有电力使用量数据的Elasticsearch索引名称。在”索引名称或模式”表单中,输入”home*”。
如果数据成功存储,点击”创建”按钮即可激活。
如果画面切换并显示一个看起来存储了数据的图表,那就可以了。
导入配置文件
要显示类似开头的图表,需要调整可视化设置,但在不熟悉Kibana的情况下可能会难以理解。
为了迅速显示与开头相同的图表,我已准备好配置文件。
将”设置”->”对象”中,并通过”导入”按钮导入配置文件。
请将以下两个配置保存在适当的文件名下,并导入。
[
{
"_id": "家",
"_type": "dashboard",
"_source": {
"title": "家",
"hits": 0,
"description": "",
"panelsJSON": "[{\"col\":1,\"id\":\"瞬時電力量(W)\",\"panelIndex\":1,\"row\":1,\"size_x\":12,\"size_y\":3,\"type\":\"visualization\"}]",
"optionsJSON": "{\"darkTheme\":false}",
"uiStateJSON": "{\"P-1\":{\"vis\":{\"legendOpen\":false}}}",
"version": 1,
"timeRestore": false,
"kibanaSavedObjectMeta": {
"searchSourceJSON": "{\"filter\":[{\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}}}]}"
}
}
}
]
[
{
"_id": "瞬時電力量(W)",
"_type": "visualization",
"_source": {
"title": "瞬時電力量(W)",
"visState": "{\"title\":\"New Visualization\",\"type\":\"line\",\"params\":{\"shareYAxis\":true,\"addTooltip\":true,\"addLegend\":true,\"showCircles\":true,\"smoothLines\":false,\"interpolate\":\"linear\",\"scale\":\"linear\",\"drawLinesBetweenPoints\":true,\"radiusRatio\":9,\"times\":[],\"addTimeMarker\":false,\"defaultYExtents\":false,\"setYExtents\":false,\"yAxis\":{}},\"aggs\":[{\"id\":\"1\",\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"inst\"}},{\"id\":\"2\",\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"timestamp\",\"interval\":\"auto\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{}}}],\"listeners\":{}}",
"uiStateJSON": "{}",
"description": "",
"version": 1,
"kibanaSavedObjectMeta": {
"searchSourceJSON": "{\"index\":\"home*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
}
}
}
]
图表显示
如果成功导入,你就可以看到图表了。转到”Dashboard”,然后点击右上方的文件夹图标(当鼠标指针悬停在上面时,会显示”Load Saved Dashboard”)。
点击显示出现了一个名为“家”的菜单项。
终于,电力使用量被图形化了!
请点击屏幕右上角的时钟图标进行更改展示时间和自动更新设置等操作,随便尝试一下。
最后
花了一些初始投资,但已经实现了电力使用量的图形化。只要将数据存储在Elasticsearch中,就可以使用Kibana进行图形化,这样一边显示温度、湿度等一边显示电力使用量,感觉很有趣吧。
如果使用家电制造商销售的HEMS系统,可以实现相同的功能,但由于制造商之间缺乏互操作性,可能会受到扩展性的限制。
除非将这方面开放为公开的规格,否则HEMS可能很难得到普及。