Published on

ESP32でHomeKit対応のスイッチを作成する Part.2

Table of Contents

はじめに

前回は HomeSpan というライブラリを使って ESP32 で HomeKit 対応のスイッチを作りました。

しかし、それはモーメンタリタイプのスイッチ専用であり、そのままではオルタネイトタイプである壁のスイッチを接続して使うことはできないという状態でした。

そこで今回は、壁のスイッチでも正しく動作するようにプログラムを改変しつつ、ブレッドボード上の ESP32 に壁のスイッチを接続して正しく動作することを確認します。

サンプルプログラムの改変

ProgrammableToggle.ino
#include "HomeSpan.h"

struct DEV_ProgButton: Service::StatelessProgrammableSwitch {
  SpanCharacteristic *switchEvent;

  DEV_ProgButton(int buttonPin, int index): Service::StatelessProgrammableSwitch() {
    switchEvent = new Characteristic::ProgrammableSwitchEvent();
    new Characteristic::ServiceLabelIndex(index);

    new SpanToggle(buttonPin);
  }

  void button(int pin, int pressType) override {
+   switchEvent->setVal((int)SpanButton::SINGLE);
-   switchEvent->setVal(pressType);
  }
};

void setup() {
  Serial.begin(115200);

  homeSpan.begin(Category::Switches, "HomeSpan Switch");

  new SpanAccessory();
    new Service::AccessoryInformation();
      new Characteristic::Identify();

    new DEV_ProgButton(23, 1);
}

void loop() {
  homeSpan.poll();
}

これが今回の目的に合わせて改変したプログラムです。
下でどのような改変をしたのか説明します。

まず、サンプルプログラムがモーメンタリスイッチ向けになっているのはDEV_ProgButton.h内でSpanButtonを使っているからです。
オルタネイトスイッチ用に改変するにはここを変える必要があります。

HomeSpan にはオルタネイトスイッチのためにSpanToggleというクラスが用意されているので、これを使っていきます。
SpanToggleSpanButtonと同様に指定したピンに繋がったスイッチに応じてbuttonメソッドが呼ばれますが、SpanButtonとは異なりメソッドに渡される引数のpressTypeSpanToggle::CLOSEDSpanToggle::OPENのいずれかとなります。

また、HomeKit のスイッチが動作を設定できるのは 1 回押し・2 回押し・長押しのみで短絡・開放は存在しないので、スイッチが押されたら必ず 1 回押しをしたことにします。
そのために今回はbuttonメソッドが受け取るpressTypeは無視して、今までbuttonメソッド内で行っていたswitchEvent->setValの引数を(int)SpanButton::SINGLEに変更しました。

最後に、プログラムを簡潔にするために、2 つに分かれていたファイルを 1 つにまとめログの出力などのなくてもいい処理は消しました。

ブレッドボード上での組み立て

今回のプログラムでは 23 番ピンをスイッチに使っているので、それにしたがってスイッチを押したら GND と 23 番ピンがつながるようにスイッチを配置します。
スイッチ用の太い電線をブレッドボードに接続するためにターミナルブロックを使いました。

ちなみにうちの壁のスイッチは Panasonic のコスモシリーズワイド 21 のWT5001というスイッチです。

その後、前回と同じようにホームアプリでアクセサリの追加を行い、押すたびに 1 回押しの動作が実行されることが確認できました。

esp32_breadboard_alternate

電力を送るケーブルではなくESP32に接続するので当然ですが、ほたるスイッチやパイロットスイッチのランプはつかなくなります。

おわりに

サンプルプログラムを改変して壁のオルタネイトスイッチを接続して利用できるようにしました。

次回は壁に埋め込むために電池で動くようにしていきたいと思います。