2022年9月18日日曜日

ホームオートメーションを作ってみる(2)Home Assistant

Home Assistantの作成

構成

ボード:RaspberryPi 3B+

Micro SD: Toshiba 32GB HC-1

使うラズパイにあった電源 

設定用のWindows PC 

準備

ホームページのここで情報収集です。要約しておきます。
  • 注意:しっかりした電源を用意しないとラズパイはまともに動きません。USB充電器では不十分なものが多い。PCのUSBポートでは電力不足で使うべきではありません。
  • 推奨ハードウエア 
    • RaspberryPi 4を推奨しますが、既に持っているなら3でも大丈夫です。
    • 使うラズパイに適した電源。
    • MicroSDはClass2がいいです。容量は32GB以上を推奨します。
    • SDカードリーダ たいていのPCにはついてます。なければ安い一般的なものを買えば間に合います。
    • LANケーブル インストールが終わればWi-Fiで動きます。しかし有線接続は信頼性が高く強くお勧めします。

    手順

    MicroDSのフォーマット

    SD Associationのサイトからフォーマットツールをダウンロードして初期化します。

    上書きフォーマットにしたので時間がかかっています。

    起動メディアにイメージを書く

    SDカードをPCに差す。
    ボードにあったイメージを選ぶ。64bitが推奨だそうです。
    https://github.com/home-assistant/operating-system/releases/download/9.0/haos_rpi4-64-9.0.img.xz
    https://github.com/home-assistant/operating-system/releases/download/9.0/haos_rpi4-9.0.img.xz
    https://github.com/home-assistant/operating-system/releases/download/9.0/haos_rpi3-64-9.0.img.xz
    https://github.com/home-assistant/operating-system/releases/download/9.0/haos_rpi3-9.0.img.xz

    BalenaEtcherを起動する。

    Flash from URLをクリックする。
    先に選んだURLをコピペする。

      • OKをクリックするとダウンロードが始まるらしくしばらく待たされます。

    Flashをクリックします。

    書き込みが始まりました。終わるまで待ちます。
    書き込みが終わると、Windowsが認識できなくなりますのでこんなダイアログがでます。しかし、フォーマットしてはいけません。

    用意ができましたので、MicroSDを抜いて、ラズパイにさして電源をいれればよいはずです。

    RaspberryPi ボード

    24時間運転することになるので、放熱をしておこうと思います。自然空冷でよいでしょう。



    足りないようならこれにファンを追加しましょう。

    初回起動

    MicroSDをラズパイに差します。
    ラズパイとLANを有線でつないでおきます。
    あれば、HDMIモニタをつなぎます。
    ラズパイに電源をいれます。
    ラズパイの赤LEDがつきます。
    ラズパイの緑LEDが点いたり消えたりします。
    HDMIモニタがつながっていればこのような画面になります。

    PCのブラウザから homeassistant.local:8123.を開いてみます。

    こうなりました。なんと日本語です。

    続きは、ONBOARDINGでできると、書いてあります。

    Onboarding Home Assistant

    ここまでこれれば、難しいところは終わったと書いてありますね。
    名前とユーザー名をいれて、パスワードを設定し、次のページでも色々設定したら、初期設定は終わりです。
    画面をみると、今の天気は雨降りです。あってますね。



    ちなみに、Chromeで開いていましたが 同じPCのEdgeで開いてみました。
    URLは http://homeassistant.local:8123/lovelace/0 になりますが、Loginが要求されて開くことができました。



    (1) に戻る (3)に進む

    2022年9月17日土曜日

    ホームオートメーションを作ってみる(1)プロローグ

     我が家の太陽光発電と消費電力のモニタが 先日の落雷(近所の木に落ちた模様)で壊れてしまったので 代わりがほしくなりました。

    電力モニターを探す。

    長い前書き

    すぐ見つかるのはHEMSですが、お高いんですよね。そこで 色々探してEmporia Vue 2というのを見つけました。大手通販会社で扱ってます。

    WiFiを使うので電波法の適用を受けるのですが、本家のサイトで内部写真をみたらWi-FiモジュールはよくあるESP32のシリーズで技適付きでした。

    懸念事項は、専用のクラウドサービスを使って読み出すので、メーカーがクラウドを何時まで維持するかわからないことです。売り切り装置の無償アフターサービスを無制限に続けるのは不可能ですよね。おまけに、既にクラウドサーバが過負荷になってないか?という疑念もあるらしい。これは、通販会社のレビューでも指摘している人がいました。せっかく作ったのに数年でゴミになるのは悲しすぎる。ハードはコンパクトにまとまっていて使えないのはもったいない。

    同じことを考えた人が世界には居て、ローカル接続用に改造する方法が公開されているのを見つけました。Wi-FiモジュールがESP32ですが、ESPHomeというグループがあってそこの有志が解析してHome Assistantに接続できるようになっているようです。Home Assistantは、オープンソースのHEMSのようなシステムです。RaspberryPiでも動くようですが 海外のWebを検索すると活発に活動していて とにかく何でもつながるようになりつつあるようです。アレクサに音声で指示して家電を操作したり、監視カメラも映像をモニタに出したりとか 色々できるようにできるらしい。

    話がそれましたが、Emporia Vue 2を改造して、Home Assistantから電力を読み取って スマホやタブレットにグラフをだすというのを、やってみようと思ったわけです。

    スマートメータのBルートの消費電力もHome Assistantにつないでみたいですが、これは日本にしかない規格を使っているので自分でつくる必要がありそうです。米国だとZigBeeを使っているようですね。日本だったらTWELITEとか使えばよかったのにと思ってしまいます。

    それはともかく、Home Assistantは 発展性もありそうで色々試したいと思います。

    サーバの選択

    RaspberryPi ですが、最新の 4の8Gメモリを使いたいところですが、ちょっと高すぎですねえ。3+は持っていますので 32Gのメモリカードとの組み合わせでパフォーマンスがどうか気になります。MicroSDは キオクシア製を使いたいと思います。Webで使えると書いてあった某社のSDを使ったことがあるのですが 使うほどにどんどん壊れて大変なめにあいました。東芝さんは大丈夫だったのでキオクシア製を使ってみることにします。→(追記)手元にTOSHIBAのMicroSDが残っていたので、それで始めることにしました。


    リンク

    忘備録を兼ねて必要そうなLINKを置いておきます。

    Home Assistant関係

    Home Assistantホーム https://www.home-assistant.io/getting-started/

    インストールページ https://www.home-assistant.io/installation/

    Raspberry Pi インストール https://www.home-assistant.io/installation/raspberrypi

    ESPHome関係

    ホームページhttps://esphome.io/

    Emporia Vue Gen2のESPHome化https://gist.github.com/flaviut/93a1212c7b165c7674693a45ad52c512

    日本語の先達のページ

    facebookで教えて頂きました。

    スマートメーター bルート http://blog.andromeda.jp/archives/2194


     つづき(2)

    2022年3月6日日曜日

    LEDで数字を表示する件(MAX7219)

     簡単な数値表示をしたくなったので、7セグメントのLED表示モジュールを動かしてみました。MAX7219を使った8桁モジュールを2個つないで16桁出してみます。

    MAX7219を使った8桁2行の数値表示

    MAX7219は、8桁の数字を表示できるコントローラで、複数つないで桁数を増やすことができます。
    コントローラはArduinoを使いました。汎用ポートで制御しました。

    早速ですが試作品の動画です。
    表示内容と明るさが変わっています。

    接続は、簡単です。Arduino側の端子は後述のソースコードをご覧ください。


     // MAX7219 LED表示器 x2
    //   7セグメント16桁
    //
    // MAX7219 接続端子宣言
    #define LED_DIN   4
    #define LED_CLK   5
    #define LED_LOAD  6
    #include "MAX7219.h"
    void setup() {
      // put your setup code here, to run once:
      
      LED_init();
    }
    void loop() {
      // put your main code here, to run repeatedly:
      char pp[16] = "1234567812345678";
      char *p;
      p = pp;
      LED_Intensity(1);
      LED_Print(p);
      delay(1000);
      
      //p = "2468024680246802";
      p = "1357913579135791";
      p[0] = '9';
      p[1] = '9';
      p[2] = '9';
      p[3] = '9';
      p[4] = '9';
      p[5] = '9';
      p[6] = '9';
      p[7] = 10;
      p[8] = 12;
      p[9] = 11;
      p[10] = 13;
      p[11] = 14;
      p[12] = 15;
      LED_Intensity(4);
      LED_Print(p);
      delay(1000);
      
    }

    以下を"MAX7219.h"というファイル名でスケッチフォルダに保存します。

    // LED Commad
    #define LED_DecodeMode 0x09
    #define LED_intensity  0x0a
    #define LED_ScanLimit  0x0b
    #define LED_Shutdown   0x0c
    #define LED_DisplayTest 0x0f
    #define LED_ShutdownMode     0x00
    #define LED_NormalOperation  0x01
    #define LED_NoDecode      0x00
    #define LED_DecodeFor7Seg 0xff
    #define LED_DecodeMode2   0x01
    #define LED_DecodeMode3   0x0f
    // 関数プロトタイプ
    void LED_send(byte address, byte data);
    void LED_Byte(byte data);
    void LED_init()
    {
      pinMode(LED_DIN,OUTPUT);
      pinMode(LED_CLK,OUTPUT);
      pinMode(LED_LOAD,OUTPUT);
      digitalWrite(LED_CLK, HIGH);
      digitalWrite(LED_LOAD, LOW);
      LED_send( LED_DecodeMode,LED_DecodeFor7Seg);
      LED_send( LED_intensity,0x01);
      LED_send( LED_ScanLimit,0x07);
      LED_send( LED_Shutdown,LED_NormalOperation); 
      LED_send( LED_DisplayTest,0);
    }
    void LED_send(byte address, byte data)
    {
      LED_Byte(address);
      LED_Byte(data);
      LED_Byte(address);
      LED_Byte(data);
      digitalWrite(LED_LOAD, HIGH);
      digitalWrite(LED_LOAD, LOW);
    }
    void LED_Byte(byte data)
    {
      int i;
      for(i=0; i<8; i++)
      {
        if((data & 0x80) == 0)
        { digitalWrite(LED_DIN, LOW); }
        else {digitalWrite(LED_DIN, HIGH);}
        digitalWrite(LED_CLK, LOW);
        digitalWrite(LED_CLK, HIGH);
        data = data << 1;
      }
    }
    void LED_Intensity(byte intensity)
    {
        LED_send( LED_intensity,intensity);
    }
    void LED_Print(char* pp)
    {
      for(int i = 0; i < 8; i++)
      {
        LED_Byte(8 - i);
        LED_Byte(pp[i]);
        LED_Byte(8 - i);
        LED_Byte(pp[i + 8]);
        digitalWrite(LED_LOAD, HIGH);
        digitalWrite(LED_LOAD, LOW);
      }
    }


    スケッチをここに置いておきます。