Home AssistantとNature Remo E liteで電力使用量可視化
Home Assistantでやったことをアウトプットしたいけど、Qiitaだと何となく合わない気がしたので久々にこちらで投稿。
ホームオートメーションで使われるHome Asssitantには電力を管理するための画面があります。
そこで自宅電力を可視化したいと思い、n番煎じですが実装公開。
準備
Nature Remo E lite購入
Wi-SUNを使ってスマートメータからデータを取ってくる機能を備えたIoT機器。
もともと、Nature Remoという赤外線リモコンのIoT化ができる製品を販売しているメーカーが2020年頃に販売しています。
API関連が揃っていてとても使いやすく、簡単に最新の電力データが取得できます。
Nature Remo E
とNature Remo E lite
があり、違いはスマートメータ以外のHEMS機器も使えるかどうか。
スマートメータ以外管理する気がなかったので、Nature Remo E liteを購入しました。
Home Asssitantを導入しなくても、スマホから過去データ含めて電力使用量確認できるので電力可視化したい人にはおすすめです!
他にWi-SUNが使えてAPIも揃っているIoT機器を探しましたが現状これ一択でした。
Nature Remo E lite製品ページ nature.global
Nature Remo Cloud API developer.nature.global
Nature Remo E lite設定
公式サイトであったり、ほかの方が既に説明しているので割愛するが必要作業としては以下の通り。
- 自宅電力メータをスマートメータに交換依頼
- Bルート開通依頼を行い、BルートIDとパスワードをもらう
- 上記ID、パスワードでNature Remo E liteからスマートメータに接続
- Nature RemoのCloud API利用のためのユーザ作成、APIトークン発行
Home Assistant設定
こちらも詳細は割愛するが必要作業としては以下の通り。
- Home Assistantインストール(HAOS版、Docker版どちらでもOK)
- AppDamonインストール
AppDaemonについて
AppDaemonは、Home Assistant向けに開発されたコンテナ上のPythonサンドボックスを複数作ることができるアドオンです。
Home AssitantともAPIで連携でき、データの登録やイベントの受け取りができます。
起動時にPythonライブラリ含めてコンテナ環境のセッティングもしてくれるので、 Home Assistantのスクリプト機能で対応できない場合はこちらを利用するといいかもです。
設定
データ取得の流れ
データはNature RemoのAPIに登録されているのでデータ取得は以下の通り。
全てHome Assistantサーバ上のAppDaemonで行います。
- 定期的にNature RemoのAPIから電力データを取得
- 取得したデータをもとに瞬時値と積算値を計算
- Home Assistantにデータ登録
実装
AppDaemon(GUI)
APIへのアクセスのため、requests
モジュールを使います。
設定
> アドオン
> AppDaemon
> 設定
よりpythonパッケージにrequestsを追加します。
今回は、関係ないですがARM環境で利用できないライブラリは ARM用にビルドされたものを自力で探して、init commandsで無理やり定義することもできます。
AppDaemon(ソースコード)
apps.yaml
AppDaemonで使用するアプリケーションの定義ファイル。
シークレット情報は、Home Assistant側のsecrets.yamlに記載して参照しています。
natureremo_appliance_id
は、事前にAPIを確認して機器のIDを控えておく必要があります。
natureremo.py
run_every
で起動後30秒後から1分毎にデータを取得するようにスケジュールしている。
get_smartmeter_info
では、APIからデータ取得したものを積算値にするための計算を行っています。
詳細はBルート ガイドラインを参照。
Home Asssitant(GUI)
設定
> ダッシュボード
> エネルギー
> グリッド消費
に先ほどAppDaemonで登録したsensor.smartmeter_energy
を設定する。
設定すると、逐次データ蓄積されてHome Assistantのエネルギーダッシュボードでは以下の画像のように表示される。
使ってみた感想
Nature Remo連携することで簡単に電力データを取得できるのですごく簡単に実装できました。
3ヶ月ほど使っていますが暑くなってくるにつれ、クーラーや機器のファン上昇で電力消費が上がっているのが可視化でき、自己嫌悪することができます。
電力消費量が上がったときになにかアクションさせることもできるので何か面白そうなことを考えついたら試してみたいと思います。
取得間隔も、1分に1回なので電子レンジ使ったときのピークも確認することができるのでそちらもなにかに活用したいなと。
NATでの拠点間VPN
現状
- 拠点間を192.168.x.xを分割したIPsecサブネット方式で接続
- グローバルアドレスを持つルータを終点とせず、その配下のプライベートアドレスを持つルータ同士を終点としている
- グローバルアドレスは非固定なのでDDNSでのピア指定
変更点
interfaces {
vti vti0 {
address 172.31.x.x/30 ← OSPF用アドレス
}
}
protocols {
ospf {
area 0 {
network 192.168.x.0/24
network 172.31.x.0/30
}
}
}
vpn {
ipsec {
esp-group ESP {
mode tunnel
proposal 10 {
encryption aes128
hash sha1
}
}
ike-group IKE {
key-exchange ikev1
mode main
proposal 10 {
encryption aes128
hash sha1
}
}
ipsec-interfaces {
interface eth0 ← ゲートウェイ向きのインターフェイス
}
nat-networks {
allowed-network 192.168.y.0/24 { ← 対向ネットワーク
}
}
nat-traversal enable
site-to-site {
peer Y.Y.Y.Y { ← 対向のグローバルアドレス
authentication {
id vpnA ← 自局のID
mode rsa
remote-id vpnB ← 対向のID
rsa-key-name vpnA
}
connection-type initiate
default-esp-group ESP
ike-group IKE
local-address 192.168.x.1 ← 自局プライベートアドレス
vti {
bind vti0
}
}
}
}
rsa-keys {
rsa-key-name vpnA {
rsa-key ****************
}
}
}
NAT内部の終端なのでここで書いたとおり共通鍵認証は使えない
こうすることによって勝手にOSPFによってルーティングが更新される
今回、VTIを使った際にpeerをホスト名で指定しようとしたが設定できなかった。
今は、このままで接続できるがそのうち接続できなくなる可能性がある。
なんで、宿題でIPv6で接続できるようにしたい。
EdgeRouterでのVLAN間ルーティング
ハマった備忘
★事前知識
1. EdgeRouter(vyos)では複数のポートをあわせて一つのスイッチと見立てることができる★問題点
★解決
switch switch0 {
mtu 1500
address x.x.x.x/xx
description "LAN_A"
switch-port {
interface eth1 {
vlan {
vid 2
}
}
interface eth2 {
}
interface eth3 {
}
interface eth4 {
}
vlan-aware enable
}
vif 2 {
address y.y.y.y/yy
description "LAN_B"
}
}
switch switch0 {
mtu 1500
switch-port {
interface eth1 {
vlan {
pvid 1
vid 2
}
}
interface eth2 {
vlan {
pvid 1
}
}
interface eth3 {
vlan {
pvid 1
}
}
interface eth4 {
vlan {
pvid 1
}
}
vlan-aware enable
}
vif 1 {
address x.x.x.x/xx
description "LAN_A"
}
vif 2 {
address y.y.y.y/yy
description "LAN_B"
}
}
ま、もともとSwitch使うときはpvid使う癖持てってことで
あと気をつけるのは設定変更したあとは、今までswtich0だったのがswitch0.xxってなるから
DNSフォワーディングの設定などを再度見直す必要がある
DHCPも再リースができなくなっていたので
clear dhcp leases
する
MariaDBで弱いパスワードを使う方法
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
が出てパスワードが作れないときの対処法
これは、MariaDBで弱いパスワードが使えないようにデフォルトおせっかいをしてくれているため
以前であれば、https://ameblo.jp/kz999sg/entry-12172778472.html
が書かれているように
mysqlでポリシーを決めることができたのだが
MariaDB 10.1.2からパスワードチェックをすべてcracklibにまかせることになっている
そのcracklibのパスワードチェックが融通がきかない
パスワードが通るかは以下のコマンドで
echo "test" | cracklib-check
なので、cracklibにパスワードチェックしないようにする必要がある。
環境
現象
対処法
- /etc/my.cnf.d/mariadb-server.cnfにある[mysqld]セクションに
cracklib-password-check=OFF
を追加する - systemctl restart mariadb
でmariadbを再起動
参考
EdgeRouter XでNATしたLAN同士を拠点間VPNさせる
前提
- NATされたLAN同士をIPsec拠点間接続する
- どちらも固定アドレスではないのでDDNSを使う
- HGWで外部アドレスをNAT変換
- HGW配下のEdgeRouter同士をVPN接続
- GREはフレッツ光で借りているHGWがポート開放対応していないのでなしで
(PPTP用のポート開けば勝手にGREも開くらしいけどそれはセキュリティ的にどうなの?ってことでNG)
EdgeRouter
Version: v1.9.1
Build ID: 4939092
Build on: 12/14/16 07:02
Copyright: 2012-2016 Ubiquiti Networks, Inc.
HW model: EdgeRouter X 5-Port
HW S/N: xxxxxxxxxxxxx
Uptime: 21:22:22 up 11:43, 1 user, load average: 1.05, 1.06, 1.09
方法
設定
interfaces {
ethernet eth0 {
address 192.168.0.2/24
duplex auto
speed auto
}
protocols {
static {
route 192.168.128.0/17 {
next-hop 192.168.128.2 {
}
}
}
}
vpn {
ipsec {
auto-firewall-nat-exclude disable
esp-group ESP {
lifetime 3600
mode tunnel
proposal 10 {
encryption aes128
hash sha1
}
}
ike-group IKE {
key-exchange ikev1
lifetime 28800
mode main
proposal 10 {
dh-group 2
encryption aes128
hash sha1
}
}
ipsec-interfaces {
interface eth0
}
nat-networks {
allowed-network 192.168.128.0/17 {
}
}
nat-traversal enable
site-to-site {
peer "BネットワークFQDN" {
authentication {
id A
mode rsa
remote-id B
rsa-key-name B.pub
}
connection-type initiate
default-esp-group ESP
ike-group IKE
local-address any
tunnel 0 {
esp-group ESP
local {
prefix 192.168.128.0/17
}
remote {
prefix 192.168.0.0/17
}
}
}
}
}
とりあえずこれで最低限の拠点間接続ができる
もしダイナミックルーティングが必要ならVTIとか適用するばいいんだろうけど今のところはこれで...
というかもしかしたらVTIだとトンネルIPアドレスがIDになるならそれでもいいのかも
pythonでBLE
とりあえず今回はRaspberry Piに BLE環境を整えるまでを
PythonでBLE使うためには、Boost Pythonとglibが必要みたいでそれがややこしかった
apt installパッケージ
- python-pip
- bluez
- bluez-tools
- bluetooth
- libboost-python-dev
- libbluetooth-dev
- libglib2.0-dev
- libboost-thread-devy
- pybluez
- pybluez[ble]
[{'end': 7, 'start': 1, 'uuid': '00001800-0000-1000-8000-00805f9b34fb'},
{'end': 10, 'start': 8, 'uuid': '00001803-0000-1000-8000-00805f9b34fb'},
{'end': 13, 'start': 11, 'uuid': '00001802-0000-1000-8000-00805f9b34fb'},
{'end': 16, 'start': 14, 'uuid': '00001804-0000-1000-8000-00805f9b34fb'},
{'end': 65535, 'start': 17, 'uuid': '0000180f-0000-1000-8000-00805f9b34fb'}]
[{'handle': 2,
'properties': 2,
'uuid': '00002a00-0000-1000-8000-00805f9b34fb',
'value_handle': 3},
{'handle': 4,
'properties': 2,
'uuid': '00002a01-0000-1000-8000-00805f9b34fb',
'value_handle': 5},
{'handle': 6,
'properties': 2,
'uuid': '00002a04-0000-1000-8000-00805f9b34fb',
'value_handle': 7},
{'handle': 9,
'properties': 10,
'uuid': '00002a06-0000-1000-8000-00805f9b34fb',
'value_handle': 10},
{'handle': 12,
'properties': 4,
'uuid': '00002a06-0000-1000-8000-00805f9b34fb',
'value_handle': 13},
{'handle': 15,
'properties': 2,
'uuid': '00002a07-0000-1000-8000-00805f9b34fb',
'value_handle': 16},
{'handle': 18,
'properties': 2,
'uuid': '00002a19-0000-1000-8000-00805f9b34fb',
'value_handle': 19},
{'handle': 20,
'properties': 2,
'uuid': '00002a1a-0000-1000-8000-00805f9b34fb',
'value_handle': 21},
{'handle': 22,
'properties': 18,
'uuid': '00002a1b-0000-1000-8000-00805f9b34fb',
'value_handle': 23},
{'handle': 25,
'properties': 2,
'uuid': '00002a3a-0000-1000-8000-00805f9b34fb',
'value_handle': 26}]
00002a00-0000-1000-8000-00805f9b34fb ['BSBT4PT02BK']
00002a01-0000-1000-8000-00805f9b34fb ['\x00\x02']
00002a04-0000-1000-8000-00805f9b34fb ['\n\x00\n\x00\xc0\x00\xe8\x03']
00002a06-0000-1000-8000-00805f9b34fb ['\x00']
00002a06-0000-1000-8000-00805f9b34fb ['\x00']
00002a07-0000-1000-8000-00805f9b34fb ['\x04']
00002a19-0000-1000-8000-00805f9b34fb ['R']
00002a1a-0000-1000-8000-00805f9b34fb ['\x9f']
00002a1b-0000-1000-8000-00805f9b34fb ['R\x9f']
00002a3a-0000-1000-8000-00805f9b34fb ['\x02']