- Published on
ESP32でHomeKit対応のスイッチを作成する Part.2
Table of Contents
はじめに
前回は HomeSpan というライブラリを使って ESP32 で HomeKit 対応のスイッチを作りました。
しかし、それはモーメンタリタイプのスイッチ専用であり、そのままではオルタネイトタイプである壁のスイッチを接続して使うことはできないという状態でした。
そこで今回は、壁のスイッチでも正しく動作するようにプログラムを改変しつつ、ブレッドボード上の ESP32 に壁のスイッチを接続して正しく動作することを確認します。
サンプルプログラムの改変
#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
というクラスが用意されているので、これを使っていきます。SpanToggle
はSpanButton
と同様に指定したピンに繋がったスイッチに応じてbutton
メソッドが呼ばれますが、SpanButton
とは異なりメソッドに渡される引数のpressType
がSpanToggle::CLOSED
かSpanToggle::OPEN
のいずれかとなります。
また、HomeKit のスイッチが動作を設定できるのは 1 回押し・2 回押し・長押しのみで短絡・開放は存在しないので、スイッチが押されたら必ず 1 回押しをしたことにします。
そのために今回はbutton
メソッドが受け取るpressType
は無視して、今までbutton
メソッド内で行っていたswitchEvent->setVal
の引数を(int)SpanButton::SINGLE
に変更しました。
最後に、プログラムを簡潔にするために、2 つに分かれていたファイルを 1 つにまとめログの出力などのなくてもいい処理は消しました。
ブレッドボード上での組み立て
今回のプログラムでは 23 番ピンをスイッチに使っているので、それにしたがってスイッチを押したら GND と 23 番ピンがつながるようにスイッチを配置します。
スイッチ用の太い電線をブレッドボードに接続するためにターミナルブロックを使いました。
ちなみにうちの壁のスイッチは Panasonic のコスモシリーズワイド 21 のWT5001というスイッチです。
その後、前回と同じようにホームアプリでアクセサリの追加を行い、押すたびに 1 回押しの動作が実行されることが確認できました。
電力を送るケーブルではなくESP32に接続するので当然ですが、ほたるスイッチやパイロットスイッチのランプはつかなくなります。
おわりに
サンプルプログラムを改変して壁のオルタネイトスイッチを接続して利用できるようにしました。
次回は壁に埋め込むために電池で動くようにしていきたいと思います。