ラズパイで住宅省エネルギーシステムを作る(動機編)

2019年の電子工作は,ラズパイで使える物を作りましょう。趣味を生かして。

免責事項
自分自身が使う物を作っています。
第二種電気工事士以上の資格を持っていることを前提にしています。
ここに書かれた内容によって生じた損害等の一切の責任を負いかねますので, 予めご了承ください。

動機

エネルギー管理士(電気分野)の平成22年度合格証を持っている。これを免許証にするためには実務経験が必要。ネット上の情報によると家庭の省エネでも実務経験になるらしい(確認していない)ので, 趣味と実益を兼ねて省エネルギーシステムを作ってみようと思う。
照明とエアコンを点けたままで外出した場合に外出先から消せる(OFFにする)システムを今回作ります。

Raspberry Pi, HVAC(暖房換気空調システム)からPiHVACとします。

参考

1.国家試験による取得

I

一般財団法人省エネルギーセンター(経済産業大臣が指定した試験機関です。)が毎年8月に行うエネルギー管理士試験に合格する。試験はどなたでも受けられます。

試験はマークシート方式です。

II

免状申請の際に、エネルギーの使用の合理化に関する実務に1年以上従事したことを証する「エネルギー使用合理化実務従事証明書」の提出が必要となります。実務に従事した時期は、合格の前後を問いません。

III

経済産業大臣に申請することにより、エネルギー管理士免状が交付されます。

ECCJ 省エネルギーセンター / エネルギー管理士の資格の取得方法
https://www.eccj.or.jp/mgr1/guide/3.html

システムの概要

部屋にラズパイを設置して天井の照明とエアコンを赤外線リモコン信号でOffするまでを実現する。その他の冷やしすぎ, 暖めすぎを防ぐ機能は時間のあるときに追加する。
その機能を実現するハードウェアとソフトウェアを用意する。

Hardware

回路図

ラズパイ, ADRSIR, BME280はI2Cバスで接続。

KiCADファイルはhttps://github.com/ak1211/pi_hvac/KiCAD/

用意するもの

ラズパイはセットで購入。USBアダプタ, スイッチ, SDカードはラズパイのセットにあったもの。
他に両端メスのコード。

ヘッダピンのはんだ付けと組み立て

40ピンGPIOのピンの隙間からはんだ付けの都合でこて先はC型を使った。
ラズパイの廃熱のためにBME280はコードで離さないと正しい値を取れない。

初回のraspbian OS設定でCLI(コンソールログイン), SSHをon, I2CをonにしてSSHで入れるようにしておく。(これ以降ディスプレイ, キーボードは不要)

Software

プログラミング言語の選択

UIはWebブラウザで行なうので, ラズパイは照明等のコントローラとBME280センサーのデーターベースとWeb/RESTサーバーとしての機能を持つ。

構成をよく見るとラズパイ(本物のコンピュータ), ADRSIR(裏のPIC32MXが本物のコンピュータ), BME280(本物?のコンピュータ)。それらがお互いにメッセージをI2Cバス上で送りあう構造。
これはメッセージングの方のオブジェクト指向かな?と考えた。

私は、オブジェクト指向プログラミングというものに疑問を持ち始めました。Erlangはオブジェクト指向ではなく、関数型プログラミング言語だと考えました。そして、私の論文の指導教官が言いました。「だが、あなたは間違っている。Erlangはきわめてオブジェクト指向です。」 彼は、オブジェクト指向言語はオブジェクト指向ではないといいました。これを信じるかどうかは確かではありませんでしたが、Erlangは唯一のオブジェクト指向言語かもしれないと思いました。
オブジェクト指向プログラミングは間違いだったか? https://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang

こういう意見もあるようだし, Erlangの後継である Elixir / Phoenix にした。
バックエンドのラズパイは非力なので、できるだけフロントエンドに処理を押し付けていく。

ラズパイにErlangをインストール

erlang/OTPをダウンロード, configure, makeの手順だったような・・・
historyに残っていなかったので検索してください。


ラズパイにElixirをインストール

cloneしてmake, make installの手順だったような・・・
historyに残っていなかったので検索してください。

ラズパイにその他をインストール

postgresqlは sudo apt-get install -y postgresql-9.3
この後ロールの設定をしたような・・・

pi@raspberrypi:~ $ sudo apt-get install inotify-tools

ファイアウォールの設定

ufwを使います
22/tcp はSSH, 4000/tcp はphoenixが使うポート

pi@raspberrypi:~ $ sudo ufw allow 22/tcp 
pi@raspberrypi:~ $ sudo ufw allow 4000/tcp

ラズパイ上の開発環境

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux

pi@raspberrypi:~/pi_hvac $ erl +V
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 10.2

pi@raspberrypi:~ $ elixir --version
Erlang/OTP 21 [erts-10.2] [source] [smp:4:4] [ds:4:4:10] [async-threads:1]
Elixir 1.8.0 (compiled with Erlang/OTP 21)

pi@raspberrypi:~ $ psql --version
psql (PostgreSQL) 9.6.10

あとはこの手順で新規プロジェクト作成した。(備忘録)
cloneしたリポジトリならこうならないかもしれない。

pi@raspberrypi:~ $ mix phx.new pihvac --no-webpack
pi@raspberrypi:~ $ cd pi_hvac/
pi@raspberrypi:~/pi_hvac $ mix ecto.create
pi@raspberrypi:~/pi_hvac $ mix phx.gen.json Api EnvMeasured envmeasured measured_at:utc_datetime degc:decimal hpa:decimal rh:decimal sensor_id:string
Add the resource to your :api scope in lib/pi_hvac_web/router.ex:


    resources "/envmeasured", EnvMeasuredController, except: [:new, :edit]




Remember to update your repository by running migrations:


    $ mix ecto.migrate


pi@raspberrypi:~/pi_hvac $ vim priv/repo/migrations/20190121115611_create_envmeasured.exs
pi@raspberrypi:~/pi_hvac $ mix ecto.migrate


pi@raspberrypi:~/pi_hvac $ vim lib/pi_hvac/api/env_measured.ex
pi@raspberrypi:~/pi_hvac $ vim lib/pi_hvac_web/router.ex
pi@raspberrypi:~/pi_hvac $ vim lib/pi_hvac/application.ex
pi@raspberrypi:~/pi_hvac $ vim mix.exs
pi@raspberrypi:~/pi_hvac $ mix deps.get

GitHubリポジトリ

リポジトリはこちら
https://github.com/ak1211/pi_hvac

これをcloneして手元におく。

 pi@raspberrypi:~ $ git clone https://github.com/ak1211/pi_hvac.git
pi@raspberrypi:~ $ cd pi_hvac/
pi@raspberrypi:~/pi_hvac $ mix ecto.create
pi@raspberrypi:~/pi_hvac $ mix compile
Compiling 31 files (.ex)
Generated pi_hvac app

時間があるならdialyzerをすればこうなるはず

pi@raspberrypi:~/pi_hvac $ mix dialyzer
Checking PLT…
[:asn1, :certifi, :combine, :compiler, :connection, :cowboy, :cowlib, :crypto,
:csv, :db_connection, :decimal, :ecto, :ecto_sql, :eex, :elixir, :elixir_ale,
:file_system, :gettext, :hackney, :idna, :jason, :kernel, :logger, :metrics,
:mime, :mimerl, :mix, :parallel_stream, :phoenix, :phoenix_ecto, :phoenix_html,
:phoenix_live_reload, :phoenix_pubsub, :plug, :plug_cowboy, :plug_crypto,
:postgrex, :public_key, :ranch, :runtime_tools, :ssl, :ssl_verify_fun, :stdlib,
:telemetry, :timex, :tzdata, :unicode_util_compat]
PLT is up to date!
Starting Dialyzer
dialyzer args: [
check_plt: false,
init_plt: '/home/pi/pi_hvac/_build/dev/dialyxir_erlang-21.2_elixir-1.8.0_deps-dev.plt',
files_rec: ['/home/pi/pi_hvac/_build/dev/lib/pi_hvac/ebin'],
warnings: [:unknown]
]
done in 1m3.93s
done (passed successfully)
pi@raspberrypi:~/pi_hvac $

実行は

 pi@raspberrypi:~/pi_hvac $ iex -S mix phx.server 

Bosch BME280 device driver

参考文書
メーカーによるドライバー
https://github.com/BoschSensortec/BME280_driver
https://github.com/SWITCHSCIENCE/samplecodes/tree/master/BME280
データーシート
https://www.bosch-sensortec.com/bst/products/all_products/bme280

データーシートとpython, C言語のデバイスドライバを参考にElixirにポーティング。
うまくいっていると思う。しらんけど。

引用:Bosch Sensortec | BME280 Data sheet. page 24
~/pi_hvac/lib/bme280.ex
データーシートに載っているレジスタマップどおりに書けるバイナリパターンマッチは便利。

ADRSIR device driver

参考文書
メーカーによるソフトウェア
http://bit-trade-one.co.jp/support/download/
pythonサンプル, I2C仕様, リモコンコードCSVを手に入れる。


BME280と同じくpythonドライバーからExixirにポーティング
I2C仕様書に重要な情報が書かれている, このとおりにバックエンド/フロントエンドでコードを書いた。

これに書かれたとおり書いたつもり, これでいいはず。しらんけど。

BME280センサーはアナログ部を持つので補正があったが, これには必要ないのでシンプル。
~/pi_hvac/lib/adrsir.ex

ここで10個有るボタン全てにリモコンを覚えさせておく。(メーカー出荷時の状態でread_command()すると反応が返ってこないので。)

iexターミナル上でread_command()を呼ぶとリモコン信号が返ってくる。

iex(5)> ADRSIR.read_command(1) 
"86004300120011001100340012001100120012001200100012001100120011001100110011001200110012001200110011001300110012001100320011001200110011001100130012001100110013001200110012001100110033001100330011003200120012001100120012003300120011001200110012001100110011001100110012001200120011001200120011001300110011001100120011001100120011001200110012001200110012001200120011001100110012001200100012001100110012001200120011001200120012001200100012001100120011001200100012001100120033001200330012001100120011001100120011001100110011001100830187004200120011001100340012001100120012001200110012001000120011001100110011001300110012001200120011001200110012001100330010001200110011001100130012001100120012001200120011001100110033001100330011003200130011001200110012003300120012001100110011001200110011001100120011001200110013001200110011001300110011001100120011001100120011001200330012001100120012001100330011001200110011001200110011001100120012001200110011003400120033001100110012003200110012001200100012001200120011001200120011001200110012001100110012001100120032001200320012003300130032001300320010001200110032001100110012003200120033001200110011003400120033001100110011001200110011001200110011001200120012001200110012001200110011001200110011001200120010001200110011003400120033001200330010001200110012001100110012001100110012001200120012001100120012001200100012003200110033001100330013001000120012001100120011001300110011001100120011003300100012001200110012001200120011001200120011001200110011001200110011001100120012001200320013003200120012001100110011001200110011001200320013001000120012001200110012001200110033001100330010001200120011001200110012001100120033001200330011003300110011001100110011003300120032001200330012003300120011001100330012003200110033001000330012004205"

これでOK

Webフロントエンド

もし「本当のオブジェクト」がRCATWDならば、各オブジェクトはその本質にもっともふさわしいプログラミング言語を使って実装できる。これは、「多言語プログラミング」という言葉に新しい意味を与えるだろう。


オブジェクト指向プログラミングは間違いだったか? https://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang

フロントエンド / バックエンドは本当のコンピュータであるので, 引用通りに本質にもっともふさわしい言語を使って実装できる。
バックエンド側にElixir/Phoenixを採用。
フロントエンド側ではPureScript/Halogenを採用した。

次回に続く。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください