丸くて白いシンプルな押しボタンスイッチを、HomeKitから使いました。Tuya準拠の製品で、Zigbee方式の電池内蔵スイッチです。いつものように、Zigbee2MQTTにペアリングし、Z2Mプラグインを入れたHomebridge経由で、HomeKitから使用しました。
安いZiegbee押ボタンスイッチ
このZigbee押しボタンスイッチは、AliExpressで本体676円、送料300円で売られてました。3個以上買うと、送料無料になります。最近、こういう形式の価格体系が多くなったように思います。一律送料無料にするより、運送に携わる人たちをリスペクトしていることが感じられて、良い傾向だと思います。
とても安いのですが、他社製品と比べて格安かというと、そうでもないです。例えば、IKEAのSOMRIG (ソムリグ) というショートカットボタンは、税込999円です。IKEAの通販を使うと、追加で送料500円が必要ですが、IKEA店舗の近所にお住まいの方なら、店頭価格で買えます。その上(現物未確認ですが、IKEAの実績から考えると)技適マークが付いているはずです。サイズは大きいですが、その代わり安価な単4電池が使えます。
とはいえ、今回の押しボタンスイッチの方が、送料込みでもお安いです。また、ボタン電池使用なので、薄型コンパクトなメリットがあります。
開封する
今回は、いつものAliExpress商品のように薄いビニール封筒に入って到着したので、紙箱はそれなりに潰れていました。でも中身には問題ありません。
箱の中には、本体、マニュアル、両面テープが入ってます。電池も付属していて、電池ボックス部分には、絶縁フィルムが差し込んでありました。
ボタンスイッチの直径は50mm, 厚さは13mm程度です。壁に貼り付けて照明のスイッチにする場合、薄くて手頃な感じになると思います。
同封されているマニュアルは以下です。電池は、CR2032です。ペアリングは、本体ボタンスイッチを10秒長押しすると、開始します。この時、本体内部のLEDが点滅します。
裏蓋を回転して開けると、電池ボックス部分が見えます。電池の近くに小さな丸穴が空いていますが、次の分解でわかるように、その内部にリセットやペアリングスイッチはありません。
分解する
電池の周囲を覆っているプラスチックカバーは、爪で引っかかっている状態です。隙間からギターピックのようなヘラを差し込んでいくと、外れます。
基板の中央には、押しボタンスイッチがあります。Zigbeeの2.4GHzのアンテナパターンもあります。写真左端には、LEDがあります。ペアリングモードの時に点滅します。中央ボタンスイッチの右下にある黒い部品が、CPUです。
CPUにはZ2と書かれてます。調べてみたところ、TuyaのZigbee搭載CPUのようです。
TuyaのZigbee製品には、ZT2Sというモジュール
がよく使われているのですが、ZT2Sは、このZ2チップに、アンテナや周辺回路を追加したモジュールだったようです。基板は、爪で止まっているだけなので、白いプラスチック部品から取り外せます。
基板の裏側には、電池の電極があるだけでした。他に部品はありません。
MOESのMatterゲートウェイを試す
MOESのZigbee – Matterゲートウェイを使えば、この押しボタンスイッチがMatter対応スイッチとして使えます。この時、HomeKitからは、デフォルトで1 Scene Switchという名前で表示されます。1ボタンのシーンスイッチという意味かと思います。
これに、1回押し、2回押し、長押しに対応するアクションを割り当てられます。
ただMOESゲートウェイでは、Tuya対応デバイス以外は使えません。IKEA, hue, Aqara, SonoffなどのZigbeeデバイスも使いたい場合は、それぞれのメーカー用ゲートウェイを用意する必要があります。
Zigbee2MQTTとペアリングする
そこで今回も、今までと同じく、Zigbee2MQTTにペアリングしてHomeKitで使えるようにします。この方式ならば、ほぼ全てのZigbeeデバイスを使用できます。
このためには、Zigbee2MQTTサーバが稼働していて、MQTTブローカー (Mosquitto) が動き、Homebridgeが動いていて、さらにHomebridgeにZigbee2MQTTを使用するプラグインが入っている必要があります。これらをRaspbetty Piで動かしてます。
これらの設定に関しては、以下をご覧ください。
まずは、Zigbee2MQTTのwebインタフェースからペアリングします。ペアリングモードがoffに設定してある場合は、webインタフェース右上のPermit join (All)のメニューをクリックしてペアリングを許可します。すると5分間、ペアリングが可能になります。
この状態で押しボタンスイッチを10秒長押しします。暗くて不鮮明ですが、内部のLEDが点滅して、ペアリングモードに入ります。ペアリングの進行に伴って、webインタフェースには以下のようなメッセージが出ます。
ペアリングが終了すると、以下のようにスイッチを確認できました。写真は製品と違いますが、おそらく同じチップを搭載した押しボタンスイッチ製品だと思われます。
HomeKitから使う
HomeKitにz2mプラグインが入っていれば、HomeKitから自動的に認識されているはずです。その結果、iPhoneやMacのホーム.appに、スイッチとして表示されます。デフォルトの名前はZigbeeのMACアドレスになりますが、以下ではZButtonに変えてあります。
壁スイッチやスマートコンセントもスイッチですが、こちらは、ステートレスプログラマブルスイッチという種類のアクセサリーです。ホーム.appに現れた表示をクリックすると、詳細設定が可能になります。
ここから、1回押し、2回押し、長押しに機能を割り当てられます。照明をOn/Offするなら、1回押しにOn、2回押しにOffとするのが良いでしょう。
一方で、長押しはちょっと使いにくいです。IKEAのTRÅDFRIスイッチや、Philipsのhueスイッチは、長押ししたまま規定の時間が経過すると、長押しイベントが発生します。なので、長押ししている間に、動作確認できた時点で、指を離せば良いわけです。それに対してTuYaのスイッチは、指を離した段階で、ようやく長押しイベントが発生します。指を離すまで、長押しに成功したかどうかわかりません。そのまま長く押しすぎると、ペアリングモードになってしまいます。ペアリングのやり直しになると、新しいスイッチが登録されたことになり、HomeKitで設定した動作が消えてしまいます。このような長押しの使いにくさは、以前使ったTuyaのスイッチと同じです。
なので、長押しは使わないのが良いと思いました。1回押し、2回押しは、キビキビと確実に動作します。
1回押しでToggleする実験
照明のスイッチとして使用するなら、1回押しするごとに照明がOn/Offにトグルしても良いと思います。1回押しでOn、2回押しでOffよりシンプルです。でも、HomeKitからのトグル操作は、設定が面倒で、低速でした。
今回、このスイッチを、TuyaのZigbeeスイッチモジュールと組み合わせることを考えました。壁スイッチの中に組み込んで、スマート壁スイッチを実現するZigbeeモジュールです。
このモジュールのZigbeeアクションには、ONとOFFの他に、第3の選択肢としてTOGGLEが用意されています。モジュールのMQTTトピックに、{“state”:”toggle”}というメッセージを送ると、On/Offが切り替わります。
{"state":"toggle"}
一方、今回の押しボタンスイッチを押すと、ボタンスイッチのMQTTトピックに、{“action”:”single”}が流れます。アクションの他に、バッテリー残量、電波強度などもjson形式で流れてきます。
{"action":"single","battery":100,"linkquality":91,"voltage":3000}
そこでsingleアクションが流れてきた際に、Zigbee壁スイッチモジュールのMQTTトピックに{“state”:”toggle”} を流せば、トグル操作ができると考えました。そしてこのプログラムをPythonで作成して、Raspberry Piで動かしてみることにしました。構成は、以下になります。HomebridgeやHomeKitとは関係なく動作することになります。
押しボタンスイッチのMQTTトピックには、このほかに、2回押しと長押しに対応する、doubleとholdが流れます。これらのどれでも照明トグルして良いなら、さらに簡単に、
- 押しボタンスイッチのMQTTトピックに何らかのメッセージが流れたら
- 照明用壁スイッチモジュールのMQTTトピックに{“state”:”toggle”}メッセージを流す
というシンプルなプログラムで良いことになります。これをRaspberry Pi上で動作するPython3で書いてみました。
#!/usr/bin/python3
import paho.mqtt.client as mqtt
## MQTT parameter ##
address='localhost' #MQTTブローカーは同じRaspberry Piで動作しているのでlocalhost
sub_topic='zigbee2mqtt/0x0000000000000000' #押しボタンスイッチのトピック
pub_topic='zigbee2mqtt/0x1111111111111111/set' #照明スイッチのトピック
username='xxxxxxxx' #MQTTブローカーのアカウントとパスワード
password='XXXXXXXX'
def on_connect(client, userdata, flags, reason_code, properties):
#print(f"Connected with result code {reason_code}") #for debug
client.subscribe(sub_topic)
def on_message(client, userdata, msg):
#print(msg.topic+" "+str(msg.payload)) #for debug
client.publish(pub_topic,'{"state":"toggle"}')
def setup():
mqttc=mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) #paho ver.2で変更
mqttc.on_connect = on_connect #call back function
mqttc.on_message = on_message #call back function
mqttc.username_pw_set(username,password)
mqttc.connect(address)
return mqttc
def main():
mqttc=setup()
mqttc.loop_forever() #MQTT endless loop
if __name__ == "__main__":
main()
最近、paho.mqttライブラリがVersion 2に更新されて、APIが多少変わったようです。なので、今までのプログラムのままだと、「古い書き方なので新しくしてください」というような内容の警告が出ます。なのでこのプログラムは、githubに書かれていたサンプルを参考に、書き直しました。
これを動作させておけば、HomeKitでの設定とは関係なく、押しボタンを押すと、照明がトグルする機能が実現できました。このプログラムを自動起動させるには、systemctlを設定すると良いです。systemctl設定の詳細は以下をご覧ください。
ただし、ここまで作るなら、もしかしたらHomebridgeよりもHome Assistantを使った方が良いのかもしれないと、最近考えてます。
まとめ
安価なZigbeeの押しボタンスイッチを、Zigbee2MQTTにペアリングして使いました。IKEAのスイッチなら、同程度の価格で技適マークが付いています。でもこちらのスイッチの方が、薄型でミニマルな、洗練されたデザインだと思います。
コメント