最終更新日 2022/12/07
昨今の電力料金の高騰はすごいものがあります。ここまで世界情勢に左右されるとは思ってもいませんでした。まだまだ、この先も高騰が続くと思われ、「ものつくり」の一環で打開出来ないか? との考えに行きつきました。
まず、私の家の構成ですが、
・オール電化住宅でプランは東電の「電化上手」
・深夜帯にエコキュートや洗濯機などを稼働
・太陽光パネル3.1kwを屋根に搭載
電化上手は24時間を3つの電気料金で区分しています。
深夜がおよそ15円/kwh、日中の夏季が一番高く約35円/kwhです。太陽光は固定買い取り制度が完了し現在8.5円/kwhで余剰分を売電しています。
以上の現状を踏まえ、
まずどのように電気を使っているのか、見える化することが先決だろうと思いました。その上で現時点での対応を以下にまとめてみました。
スッテプ
1,家庭内の使用電力量を把握する。
(東電のHPで家全体の使用電力量は把握できるが、ブレーカー毎の回路
別電力量は分からない。電気の使用実態をテレビや冷蔵庫など機器ごと
に確認する)
2、エコキュートの運転を昼間帯に移行出来ないか?
(太陽光発電を自家消費することが、設備投資も無くハードルが低い)
3、蓄電システムの構築や太陽光パネルの増築の検討
段階を踏んで項目ごとに効果を確認しながら、時点修正などを加えて電気料金の削減に取り組むこととします。
1 電力計測装置の製作
Raspberry Pi ZeroとA/D変換部
家庭の電力量を見える化
今、流行りのIOT機器を活用します。ラズベリーパイ(Raspberry Pi 通称ラズパイ:小型コンピュータ)を活用して8チャンネル分の電力量監視システムを開発し、配電盤のブレーカー部にCTセンサーを取り付け、流れている電流を5分毎に計測し、メールで1日分のログを送信させるシステムを作ります。
・ラズパイはRaspberry Pi Zeroを用意し、PCからリモート動作とする。
・家庭で使用している機器の電流をCTセンサーで読み取る。
・A/DコンバーターMCP3208を活用しA/D変換してデジタル記録する。
(ラズパイはアナログ信号を直接受け取れないため)
・Pythonプログラムを作成し、得られた電流値から電力量を算出し5分毎に
CSV形式へ記録。
電流値×電圧(100vと決め打ち)=電力量
・1日分の計測結果をメール送信し、再起動までを自動で行う。
詳細の説明です。
手ハンダによるAD変換部(MCP3280)です。
巻き線比 1:3000のCTセンサーを使います。CTセンサーは直流(DC)の測定が出来ません。交流(AC)のみ計測が可能です。各CTセンサーのブロック図と信号の流れは以下の構成です。
CTセンサー ⇒ 整流回路(ブリッジダイオード) ⇒ 抵抗 ⇒
MCP3208 ⇒ ラズパイ
(整流回路以降がAD変換部に実装されています)
電流値の大小によって抵抗を変更する必要があるので、抵抗は着脱可能にしています。ハード面はそれほど難しい回路ではありません。
抵抗の選定ですが、1500W程度までの計測であれば、抵抗値は500~600Ωが妥当となります。また、プログラム内に微調整の係数を設定して、整合性を高めています。
ソフト面
ラズパイはマイクロSDカードに専用OSをインストールします。インターネット上にたくさんアップされているので、ここでは省略します。
リモートデスクトップで動作出来るように設定を行います。VNCをPCとラズパイにインストールし設定します。こちらも情報が溢れているので省略です。
AD変換部である、MCP3208とラズパイは「SPI」通信です。
・ラズパイの設定画面でSPIを有効にする。
・SPI通信を行うために『py-spidev』をインストールします。以下のコマンド。
$ cd ~
$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python2 setup.py install #対応するPythonを選んでください。
$ sudo python3 setup.py install
SPI接続が有効か確認します。
『$ls /dev/spi*』を実行結果が『/dev/spidev0.0 /dev/spidev0.1』と
表示されればOKです。
spidevとspi_bcm2835が有効になっているか確認します。
『$lsmod | grep spi』を実行し、以下のような結果(数字は異なっても可)
になればOKです。ならない場合は一度再起動してください。
spidev 7373 0
spi_bcm2835 7596 0
以下、SPI通信による電流計測から電力量を算出し、CSVに上書きしていくPythonプログラムです。****は任意のパス名になります。
CSVデータ格納の順番は、年月日・時間・チャンネル毎の電力量(8ch分)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# channel 0 pin1-GND
import spidev
import datetime # datetimeモジュールのインポート
import time # タイマーのライブラリ
import csv
import sys
Vref = 0.33
spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0
spi.max_speed_hz = 1000000 # 1MHz
adc = spi.xfer2([0x06,0x00,0x00])
data1 = ((adc[1] & 0x0f) << 8) | adc[2]
#print (str(Vref*data1/4096) + “V”)
adc = spi.xfer2([0x06,0x40,0x00])
data2 = ((adc[1] & 0x0f) << 8) | adc[2]
#print (str(Vref*data2/4096) + “V”)
adc = spi.xfer2([0x06,0x80,0x00])
data3 = ((adc[1] & 0x0f) << 8) | adc[2]
adc = spi.xfer2([0x06,0xc0,0x00])
data4 = ((adc[1] & 0x0f) << 8) | adc[2]
adc = spi.xfer2([0x07,0x00,0x00])
data5 = ((adc[1] & 0x0f) << 8) | adc[2]
adc = spi.xfer2([0x07,0x40,0x00])
data6 = ((adc[1] & 0x0f) << 8) | adc[2]
adc = spi.xfer2([0x07,0x80,0x00])
data7 = ((adc[1] & 0x0f) << 8) | adc[2]
adc = spi.xfer2([0x07,0xc0,0x00])
data8 = ((adc[1] & 0x0f) << 8) | adc[2]
#while 1:
ch1 = (Vref*data1)*1.2 #1.2が微調整係数
ch2 = (Vref*data2)*1.2
ch3 = (Vref*data3)*1.2
ch4 = (Vref*data4)*1.2
ch5 = (Vref*data5)*1.2
ch6 = (Vref*data6)*1.2
ch7 = (Vref*data7)*1.2
ch8 = (Vref*data8)*1.2
print (‘各チャンネルの発電量 ‘)
d = datetime.datetime.today() # 年月日の表示
print (‘%s年%s月%s日’ %(d.year,d.month,d.day))
print (‘%s時%s分%s秒’ %(d.hour,d.minute,d.second))
print (‘ch1 %d’ %(ch1))
print (‘ch2 %d’ %(ch2))
print (‘ch3 %d’ %(ch3))
print (‘ch4 %d’ %(ch4))
print (‘ch5 %d’ %(ch5))
print (‘ch6 %d’ %(ch6))
print (‘ch7 %d’ %(ch7))
print (‘ch8 %d’ %(ch8))
f=open(‘/home/*****/****.csv’, ‘a’) # CSVファイル上書き
writer = csv.writer(f, lineterminator=’\n’)
body = [‘%sy%sm%sd’ % (d.year,d.month,d.day),’%sh%sm’ % (d.hour,d.minute),str(int(ch1)),str(int(ch2)),str(int(ch3)),str(int(ch4)),str(int(ch5)),str(int(ch6)),str(int(ch7)),str(int(ch8)),]
writer.writerow (body)
spi.close()
次に、Gメール送信プログラムです。アドレスはAAAAAとしています。
CSVなどの名前は任意です。ここでは****としています。
Gメール ⇒ hotmail へ送信するように作成。
厄介なのが、Gメールのパスワードです。上記プログラム内の
PASSWARD = “#######” と書かれている部分です。
これは事前にGoogleのアカウント管理画面 ⇒ セキュリティ診断 ⇒
アプリパスワード ⇒ 機器を選択して生成したパスを”######”の
部分に入力します。
Gメールで設定したパスではないことに注意です。
!/usr/bin/env python
–– coding: utf-8 ––
“””
Gmail
Gmailで簡単にメール送信
“””
import os.path
import datetime
import smtplib
from email import encoders
from email.utils import formatdate
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
Gmailアカウント
ADDRESS = “AAAAAAAA@gmail.com” #ご自身のメールアドレス
PASSWARD = “#######”
SMTPサーバの設定(Gmail用)
SMTP = “smtp.gmail.com”
PORT = 587
def create_message(from_addr, to_addr, subject, body, mime=None, attach_file=None):
“””
メッセージを作成する
@:param from_addr 差出人
@:param to_addr 宛先
@:param subject 件名
@:param body 本文
@:param mime MIME
@:param attach_file 添付ファイル
@:return メッセージ
“””
msg = MIMEMultipart()
msg[“From”] = from_addr
msg[“To”] = to_addr
msg[“Date”] = formatdate()
msg[“Subject”] = subject
body = MIMEText(body)
msg.attach(body)# 添付ファイル #if mime != None and attach_file != None: attachment = MIMEBase("application","vnd.ms-excel") file = open("/home/*****/*****.csv") #同じデレクトリ内のファイルを送信 attachment.set_payload(file.read()) file.close() encoders.encode_base64(attachment) msg.attach(attachment) attachment.add_header("Content-Disposition","attachment", filename=attach_file['name']) return msg
def send(from_addr, to_addrs, msg):
“””
メールを送信する
@:param from_addr 差出人
@:param to_addr 宛先(list)
@:param msg メッセージ
“””
smtpobj = smtplib.SMTP(SMTP, PORT)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(ADDRESS, PASSWARD)
smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
smtpobj.close()
if name == ‘main‘:#宛先アドレス to_addr = "AAAAAAA@hotmail.com" #件名と本文 subject = "自宅の使用電力量" body = "1,リビング左・玄関・1Fトイレ \n2,キッチン・ダイニング・バス \n3,タタミルーム・納戸・2Fトイレ \n4,長女部屋・階段下 \n5,長男部屋 \n6,洗濯機・冷蔵庫 \n7,食洗器・カウンター \n8,リビング右" #添付ファイル設定(text.txtファイルを添付) mime={'type':'text', 'subtype':'comma-separated-values'} attach_file={'name':'*****.csv', 'path':'*****.csv'} #メッセージの作成(添付ファイルあり) msg = create_message(ADDRESS, to_addr, subject, body, mime, attach_file) #メッセージ作成(添付ファイルなし) #msg = create_message(ADDRESS, to_addr, subject, body) #送信 send(ADDRESS, [to_addr], msg)
次はCSV消去プログラムです。
–– coding: utf-8 ––
import os
import sys
os.remove(“/home/akasaka101/Strings.csv”)
os.remove(“/home/pi/total electric power.csv”)
os.remove(“/home/pi/denryoku.txt”)
sys.exit(0)
cron(クロン)を起動させてプログラムの動作時間を設定します。
$ crontab -e
以下を入力して保存してください。
*/5 4-23 * * * python /home/*****/mcp3208b.py
30 1 * * * python /home/*****/g.py
30 3 * * * python /home/*****/remove.py
45 3 * * * /sbin/reboot
mcp3208b.py・・・AD動作プログラムを5毎動作。4時~23時
g.py ・・・Gメール送信プログラムを1時30分に動作
remove.py ・・・CSV消去プログラムを3時30分に動作
/sbin/reboot ・・・再起動を3時45分に実行
大雑把でしたが、電力計測システムの製作概要は以上です。そして成果のご報告ですが、メールで送られてくるCSV形式のデータをエクセルでグラフ加工しました。
・平日なので、朝と夕方に電力を使用していることがわかります。
・濃い青はウォーターサーバーということが判明しました。短時間では
ありますが、結構な電力量です。
・みどり色の台形ギザギザは冷蔵庫と思われます。
・黄色はPCでした。
やっぱり、ウォーターサーバーは電気食いなのかなと。利便性と電気量は相反するのかなと感じています。もう少し計測を続けてデータの蓄積を行います。
その後、CTセンサーを付け替えエコキュートの動作状態も監視しようと考えております
⇒どうも、エコキュートは深夜帯をフルで稼働させていないように感じます。その計測データを元に、エコキュートの昼間稼働の最適時間帯を割り出して行こうと考えています。
次回につづく
コメントを残す