家を建てる・リフォームするときにスマート照明スイッチを入れたい場合、選択肢はほとんどない。電気工事士法でPSE認証機器と有資格者による施工が求められるため、海外製品を気軽に導入できない。パナソニックのアドバンスシリーズ リンクプラスがほぼ唯一の選択肢になる。
1台あたり約12,000円。施工設定の手順は電気工事士が新築時に一括設定する前提で設計されている。ここに調べたことをまとめる。
構成部品
| 部品 | 型番 | 通信 | 役割 |
|---|---|---|---|
| 無線アダプタ | WTY2001 | Ethernet + 920MHz | 中央ハブ、LANとスイッチを橋渡し |
| 片切スイッチ(単回路) | WTY2201 | 920MHz + BLE | 2線式、ハンドルタイプ |
| 片切スイッチ(2回路) | WTY2202 | 920MHz + BLE | 2線式、1ユニットに2回路 |
| 片切スイッチ(3/4線式) | WTY2401 | 920MHz + BLE | 調光対応ハードウェア |
| ロータリー調光スイッチ | WTY22473 | 920MHz + BLE | 2線式、0-100%調光 |
| 一括OFF発信器 | (各種) | 920MHzのみ | 単独動作、アダプタ不要 |
アーキテクチャ
スイッチとアダプタは920MHzで常時通信している。アダプタはこの通信で各スイッチのON/OFF状態や調光レベルを把握する。
クラウドの問題
クラウドは完全に必須でもなく、完全に不要でもない。これが複雑さの原因。
基本的な制御はクラウドなしで動く。アダプタ単体でスイッチを920MHzで登録でき(登録モードで短押し)、ON/OFFや調光はローカルで機能する。ただしスイッチの名前は「照明1」「照明2」のまま。名前を設定するにはアプリが必要で、アプリにはインターネット接続とスイッチへのBLE到達距離が必要。フル登録フロー(いえのグループ化、暗号鍵)もインターネットが必要。設定完了後、日常の制御にクラウドは不要。ただし名前を変更したい場合、再びアプリ+インターネット+BLEが必要になる。
設定アプリはスイッチ(BLE)、クラウド(インターネット)、アダプタ(LAN)の3つを同時に調整する。この全体像を説明する単一のドキュメントは存在しない。施工説明書、設定ガイドPDF、パナソニックのサポートページ、ECHONET Lite仕様書、そして試行錯誤から組み立てた。
一括OFF発信器
単独の920MHz通信器。アダプタもクラウドも不要。スイッチに直接送信する。ペアリング情報はスイッチ側のメモリに保存され、他のすべてから独立している。
ローカルインターフェース
| インターフェース | ポート | プロトコル | 認証 | 用途 |
|---|---|---|---|---|
| HTTP CGI | 80 | HTTP GET、JavaScript応答 | なし | 簡易スクリプト、デバッグ |
| WebSocket | 8080 | WS、ldcサブプロトコル |
なし | 状態変更のプッシュ通知 |
| ECHONET Lite | 3610/UDP | ECHONET Lite | なし | 標準化された制御、自動化 |
3つとも認証なし。LAN上の誰でもすべてのスイッチを制御できる。
ゼロからの設定
公式の施工説明書にも記載があるが、電気工事士が順番通りに作業する前提で書かれている。何度も読み直してやっと手順が理解できた。
アダプタ、クラウド、スイッチはそれぞれ互いを認識する必要があるが、直接通信しない。スイッチがBLE(アプリ側)と920MHz(アダプタ側)を橋渡しする。クラウドはスイッチと直接通信しない。アプリは登録時にアダプタと直接通信しない。すべてスイッチを経由する。
登録パス
パス1:アダプタのみ(アプリなし)。 アダプタを登録モードにし、各スイッチを短押し。アダプタが920MHzで登録する。基本的な制御は可能だが、名前は「照明1」みたいになる、クラウド連携なし。
パス2:アプリ経由(アダプタあり)。 アダプタを登録モードにし、スイッチを短押し。アダプタが920MHzで登録し、スイッチがBLEアドバタイズを開始。アプリがBLEで検出、クラウドとハンドシェイク(暗号鍵、いえの割り当て、名前)を行い、BLE経由で設定をスイッチにプッシュ。スイッチが920MHzでアダプタに名前を含むID情報を通知する。
パス3:アプリBLEのみ。 スイッチのボタンを5秒以上長押ししてBLEペアリングモードに入る。アプリがBLEで接続しクラウドとハンドシェイク。アダプタとの連携は別途行う。
手順(パス2)
前提条件: リンクプラスアプリをインストール済み。アダプタをEthernetで接続済み。
1. アプリを開く → 施工設定。
2. 新規施工を押す。初回セットアップモードになる。
3. アダプタの登録ボタンを3秒以上長押しして登録モードにする。アプリがUPnPで検出する。
4. スイッチを短押し。アダプタが920MHzで認識し、スイッチがBLEアドバタイズを開始。アプリが検出・接続し、クラウドに登録する(ここで「いえ」が作成される)。スイッチの名前を入力。
5. 残りのスイッチも同じセッション内で続ける。
中断して後日再開する場合は追加施工を使う。既存の「いえ」に再接続する。
6. 完了。名前と設定がすべてのローカルAPIに反映される。
複数の「いえ」トラップ
新規施工を2回以上使うと、バッチごとに**別の「いえ」**が作成される。違う「いえ」のスイッチは互いに見えなくなる。アプリのエラー処理にバグがあり、ループする。
対処法:該当スイッチを初期化し、追加施工で一括再登録する。
パナソニックの設定ガイドに記載あり:「いえ」が複数生成されてしまうエラー(PDF)。
初期化(ハンドルタイプスイッチ)
パナソニック公式設定ガイド参照:「名称設定」から再設定するための事前準備(PDF)。
WTY2201、WTY2401、WTY2202の場合:
- プレートを外す(マイナスドライバー)、ハンドルを外す
- 切/入 + 登録を同時に1秒押す — 電波受信停止、ほたるランプが3回点滅モードに入る
- 消去 + 切/入を同時に3秒以上押す — 小さいLED点滅 + ビープ音で初期化確認
- 切/入 + 登録を同時に1秒押す — 電波受信再開、点滅停止
- ハンドルとプレートを取り付ける
パネル/タッチタイプの場合:パネルを外す(電波受信が自動停止)、消去 + 切/入を3秒以上押す、パネルを戻す。
ハンドルタイプではステップ2(電波停止)を先にやらないとステップ3が効かない。飛ばすと何も起きない。
一括OFF発信器の再ペアリング
一括OFF発信器はアダプタやクラウドと無関係にスイッチと920MHzで直接ペアリングする。スイッチを初期化した後は発信器の再ペアリングが必要。再登録は一括 — 全スイッチに対して一度に行われる。
HTTP CGI API
ポート80でlighttpdが動作。認証なし。レスポンスはJSONではなくJavaScript関数呼び出し。
デバイス状態取得
curl -s 'http://{adapter_ip}/cgi-bin/index.cgi?p=dataget'
lightValueSet(0, 1, 1, 100, 'ダイニングゾーン', 0, 'WTY22473+20.png');
// index, registered, hasDimmer, brightness, name, hasRepeater, image
// brightness: 0=OFF, 1-100=ON (調光 %), -1=オフライン
制御
# スロット0をON
curl -s 'http://{adapter_ip}/cgi-bin/index.cgi?p=datactrl&no=0&ctrl=1'
# OFF
curl -s 'http://{adapter_ip}/cgi-bin/index.cgi?p=datactrl&no=0&ctrl=0'
# 調光を50%に
curl -s 'http://{adapter_ip}/cgi-bin/dimming.cgi?p=datactrl&no=4&ctrl=50'
# シーン0を実行
curl -s 'http://{adapter_ip}/cgi-bin/scene.cgi?p=datactrl&no=0'
その他のエンドポイント
| エンドポイント | 用途 |
|---|---|
machineid.cgi?p=dataget |
ハードウェアID付きデバイス一覧(型番+無線アドレス+バリアント) |
signal.cgi?p=datactrl&no={slot} |
スイッチのRSSI |
machineid.cgi?p=modeset&no=1 |
スイッチ登録モードに入る |
scenein.cgi?p=dataget |
シーン内容(デバイスごとのON/OFF/調光値) |
setting.cgi?p=dataget&ntp=0 |
システム状態(サーバー接続、RTC、日時) |
一部の管理ページはアダプタの物理ボタンを押すまでリダイレクトされる(ボタンゲート)。ただし ?p=dataget / ?p=datactrl のエンドポイントはボタンなしで動作する。
エラーコード
| コード | 意味 |
|---|---|
| -2 | 通信失敗 — スイッチの電源が入っていない |
| -3 | この操作に対応していない |
| -4 | アダプタが登録モード中 |
| -10 | 状態取得失敗 |
パース
レスポンスはJSONではなくJavaScript。正規表現で処理する:
import re, urllib.request
url = 'http://{adapter_ip}/cgi-bin/index.cgi?p=dataget'
body = urllib.request.urlopen(url).read().decode()
for m in re.finditer(r"lightValueSet\((\d+),(\d+),(\d+),(-?\d+),'([^']*)',(\d+),'([^']*)'\)", body):
slot, registered, dimmer, brightness, name, repeater, image = m.groups()
if int(registered):
status = 'ON' if int(brightness) > 0 else 'OFF' if int(brightness) == 0 else 'OFFLINE'
print(f" [{slot}] {name}: {status} (brightness={brightness}, dimmer={dimmer == '1'})")
ECHONET Lite (UDP 3610)
ECHONET Liteは日本の標準スマートホームプロトコル。アダプタがUDP 3610番ポートで対応している。認証なし。
登録済みスイッチごとに「一般照明」インスタンスが公開される。ON/OFFスイッチは動作状態に対応。調光スイッチは追加で明るさ(0-100%)に対応。
例:全照明の一覧表示、1台のON/OFF
pychonetを使用(pip install pychonet):
import asyncio
from pychonet.lib.udpserver import UDPServer
from pychonet import ECHONETAPIClient
from pychonet.lib.const import GET, SETC
ADAPTER = "192.168.x.x" # アダプタのIPアドレス
async def main():
udp = UDPServer()
udp.run("0.0.0.0", 3610, loop=asyncio.get_event_loop())
api = ECHONETAPIClient(server=udp)
# アダプタ上のデバイスを検出
await api.discover(ADAPTER)
instances = api._state[ADAPTER]["instances"]
# 全照明の名前と状態を表示
print("=== Lights ===")
for ci in sorted(instances.get(0x02, {}).get(0x91, {}).keys()):
await api.getAllPropertyMaps(ADAPTER, 0x02, 0x91, ci)
await api.echonetMessage(ADAPTER, 0x02, 0x91, ci, GET, [
{"EPC": 0x80, "PDC": 0x00, "EDT": 0x00}, # 動作状態
{"EPC": 0xFD, "PDC": 0x00, "EDT": 0x00}, # デバイス名
])
state = instances[0x02][0x91][ci]
status = "ON" if state.get(0x80) == b"\x30" else "OFF"
name_raw = state.get(0xFD, b"")
null = name_raw.find(0x00)
name = name_raw[:null].decode("utf-8") if null > 0 else "?"
print(f" [{ci:2d}] {status:3s} {name}")
# 最初の照明をON(インスタンス1 = スロット0)
print("\nTurning on...")
await api.echonetMessage(ADAPTER, 0x02, 0x91, 0x01, SETC, [
{"EPC": 0x80, "PDC": 0x01, "EDT": 0x30}, # 0x30 = ON
])
await asyncio.sleep(20)
# OFF
print("Turning off...")
await api.echonetMessage(ADAPTER, 0x02, 0x91, 0x01, SETC, [
{"EPC": 0x80, "PDC": 0x01, "EDT": 0x31}, # 0x31 = OFF
])
asyncio.run(main())
出力:
=== Lights ===
[ 1] OFF 階段スイッチ
[ 2] OFF 一階玄関廊下
[ 3] OFF 脱衣室
[ 4] OFF 浴室スイッチ
[ 5] ON ダイニングゾーン
[ 6] ON テレビゾーン
[ 7] ON リビング入り口
...
Turning on...
Turning off...
調光はEPC 0xB0(値0-100)で設定:
await api.echonetMessage(ADAPTER, 0x02, 0x91, 0x05, SETC, [
{"EPC": 0xB0, "PDC": 0x01, "EDT": 50}, # 50%
])
WebSocket(ポート8080)
アダプタが暗号化なしのWebSocketで状態変更通知をプッシュする。
ws://{adapter_ip}:8080/api/v1/controllers/aiseg/websocket
Sec-WebSocket-Protocol: ldc
購読:
{"method": "subscribe", "event": "propertyChange", "type": "linkPlusLighting"}
応答:
{"method": "subscribeAck", "event": "propertyChange", "type": "linkPlusLighting"}
状態変更時の通知:
{"method": "publish", "event": "propertyChange", "type": "linkPlusLighting", "connectionNum": 1}
connectionNumは接続中のWebSocketクライアント数であり、照明のIDではない。どの照明が変化したかは通知に含まれない — ECHONET LiteまたはCGIで状態を読み取る必要がある。実際に状態が変化しなかった場合(既にONの照明をONにするなど)は通知が発生しない。通知はワンショット — 毎回再購読が必要。
注意: アダプタはSec-WebSocket-Acceptヘッダーを固定値(s3pPLMBiTxaQ9kYGzzhZRbK+xOo=)で返す。クライアントキーに関係なく同じ値。標準的なWebSocketライブラリ(Pythonのwebsockets等)は接続を拒否する。バリデーションを無効化するか、生ソケットでハンドシェイクする必要がある。
メモ
- デバイス名はすべてのローカルインターフェースから読み取り専用。変更にはアプリ+インターネット+BLE到達距離が必要。
- スロット番号はAPIでは0始まり、Web UIでは1始まり。
- CGI Web UIは施工者向けツール。その裏のAPIエンドポイントのほうが有用。
- ECHONET Liteはライブラリ対応(pychonet)があり、調光も適切に扱える。CGIは単発スクリプト向け。
- 設定完了後、アダプタはインターネットなしで動作する。すべての制御はローカル。
まとめ
設定さえ終われば日常の制御はローカルで完結し、インターネット不要。
WTY2001アダプタ(ファームウェア 01.0c.01.08)、WTY2201/WTY2202/WTY2401/WTY22473スイッチで検証。2026年4月。