追加の機器は購入せず、WindowsのPCと既存のHue Bridgeで試した備忘録です。確認日:2026年10月18日。
症状:暗くできるのに、オフだけ効かない
今回困ったのは、接続そのものができない症状ではありません。Hueに登録されたKAJPLATSに対し、調光はできるのに、通常の消灯操作だけが期待どおりに働かないというものでした。
- 明るさを下げると、電球は暗くなる。
- 1%程度まで暗くする方法では、完全な消灯にはならない。
- オフ状態を保存したシーンを呼び出すと、実際に光が消えた。
「調光できるなら消灯もできるはず」とは限らない、というのが今回のポイントです。
なぜ「明るさを下げる」と「オフにする」で違いが出るのか
明るさの変更とオン・オフは、別の操作です。Hue APIでも、明るさのbriと電源状態のonは別の項目として扱われています。調光の命令が通っていても、消灯に使う命令やその前後の処理に互換性の問題があれば、オフだけ失敗することがあります。Philips Hue公式のAPI入門でも、それぞれの操作を確認できます。
関連するZigbee2MQTTのGitHub Issue #30211には、KAJPLATSと、グループに直接バインドしたPhilips Dimmer Switch v2の組み合わせで、消灯できないという利用者の調査報告があります。報告では、リモコンが送るOff with effect(0x40)が現在の設定をグローバルシーンに保存してから消灯する処理に関係し、電球側のシーン保存でInsufficient Spaceエラーが返り、消灯しないと説明されています。
ただし、これは別環境での報告です。今回の電球とHue Bridge間のZigbee通信は採取していないため、同じ命令・同じ保存エラーが原因とは断定していません。今回も「調光は通るが、通常の消灯が通らない」という症状があり、命令ごとの互換性の問題が原因候補になります。
1%まで暗くする方法は、消灯とは別の調光操作を使っています。そのため通常のオフ操作が失敗する場合でも暗くできることはありますが、消灯の不具合を直したことにはなりません。
今回うまくいった回避策:消灯専用シーン
通常のオフ操作の代わりに、対象の電球すべてをon: falseにしたシーンを呼び出す方法です。同様の消灯シーンを使う方法は、RedditのKAJPLATS利用者による投稿でも紹介されています。
Hueアプリで全灯オフのシーンを作る操作には制約があるため、今回はPCからHue BridgeのローカルAPIを使って作成しました。通常のオフ操作とシーン呼び出しで結果が変わったことは確認できましたが、無線上の命令の違いまでは今回測定していません。
| 試した構成 | 確認した結果 |
|---|---|
| KAJPLATSの1灯だけを含む専用ゾーン | シーン呼び出しで完全消灯。ほかの電球の状態は変わらなかった。 |
| KAJPLATSを含む部屋全体 | 対象のすべての電球が完全消灯した。 |
どちらもAPIの応答だけで判断せず、実際に光が消えたことを目で確認しました。なお、シーンで消灯しても電球への給電は続いています。壁スイッチを切った状態とは異なります。
WindowsのPowerShellで作る手順
以下はHueに登録済みの電球を対象にした例です。KAJPLATSをHueへペアリングする手順や初期化手順は含みません。コードは今回成功したHue API v1の操作を、入力式の例に整理したものです。
PCをHue Bridgeと同じ家庭内ネットワークにつなぎ、PowerShellを開きます。以降のコードは同じPowerShell画面で順に実行してください。認証キーは変数にだけ保持し、ファイルには保存しません。
1.Bridgeへの接続処理を準備する
HueアプリでBridgeのIPアドレスを確認してから実行します。-kはローカルBridgeの証明書検証を省略する指定なので、この接続例の範囲に限定して使います。
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
$bridge = Read-Host "Hue BridgeのIPアドレス"
$parsedAddress = $null
if (-not [System.Net.IPAddress]::TryParse($bridge, [ref]$parsedAddress)) {
throw "Hueアプリに表示されるIPアドレスを入力してください"
}
function HueRequest($method, $path, $body = $null) {
$url = "https://$bridge/api$path"
if ($null -eq $body) {
$raw = curl.exe --noproxy "*" -k -sS --connect-timeout 5 --max-time 15 $url
} else {
$json = $body | ConvertTo-Json -Depth 15 -Compress
$raw = $json | curl.exe --noproxy "*" -k -sS --connect-timeout 5 --max-time 15 `
-X $method -H "Content-Type: application/json" --data-binary "@-" $url
}
if ($LASTEXITCODE -ne 0) { throw "Bridgeとの通信に失敗しました" }
$result = ($raw -join "`n") | ConvertFrom-Json -ErrorAction Stop
foreach ($item in @($result)) {
if ($item.error) {
throw ("Hue APIエラー {0}: {1}" -f $item.error.type, $item.error.description)
}
}
return $result
}
2.Bridgeの丸いリンクボタンを押し、操作を登録する
Bridge本体の丸いリンクボタンを1回押してから、すぐに次を実行します。リセットボタンではありません。ボタン操作による登録はHue公式の手順に沿ったものです。エラー101が出る場合は、リンクボタンを押して登録部分を再実行します。
$auth = HueRequest POST "" @{devicetype="off_scene#Windows"}
$key = $auth.success.username
if (-not $key) { throw "操作の登録に失敗しました" }
Write-Host "操作を登録しました。認証キーは表示・保存していません。"
$groups = HueRequest GET "/$key/groups"
$groups.PSObject.Properties | Where-Object {
$_.Value.type -in @("Room", "Zone")
} | ForEach-Object {
"{0}: {1} / {2} / {3}灯" -f $_.Name, $_.Value.name, $_.Value.type, @($_.Value.lights).Count
}
一覧には部屋(Room)とゾーン(Zone)の番号・名前・電球数が表示されます。認証キーが入る$keyや$authの内容は、公開したりスクリーンショットに載せたりしないでください。
3.対象の部屋・ゾーンに「照明 OFF」を作る
選んだ部屋またはゾーンの電球すべてを消す設定です。1灯だけを消したい場合は、先に次の節を読んで専用ゾーンを作ってください。この段階ではシーンを保存するだけで、消灯の呼び出しは行いません。同じ作成コードを繰り返すと同名シーンが増えるため、再利用するときはHueアプリから既存のシーンを選びます。
$groupId = Read-Host "全消灯したい部屋またはゾーンの番号"
$groupProperty = $groups.PSObject.Properties | Where-Object { $_.Name -eq $groupId }
if (-not $groupProperty -or $groupProperty.Value.type -notin @("Room", "Zone")) {
throw "一覧にある部屋またはゾーンの番号を入力してください"
}
$targetGroup = $groupProperty.Value
if (@($targetGroup.lights).Count -eq 0) { throw "電球が登録されていません" }
$offStates = @{}
foreach ($lightId in @($targetGroup.lights)) {
$offStates[[string]$lightId] = @{on=$false}
}
$created = HueRequest POST "/$key/scenes" @{
name = "照明 OFF"
type = "GroupScene"
group = "$groupId"
lightstates = $offStates
recycle = $false
}
$sceneId = $created.success.id
if (-not $sceneId) { throw "シーンを作成できませんでした" }
$saved = HueRequest GET "/$key/scenes/$sceneId"
foreach ($lightId in @($targetGroup.lights)) {
if ($saved.lightstates.$lightId.on -ne $false) {
throw "消灯状態を確認できません。シーンを呼び出さずに確認してください"
}
}
Write-Host ("作成完了: {0} / 照明 OFF / {1}灯" -f $targetGroup.name, @($targetGroup.lights).Count)
4.シーンを呼び出し、実物の消灯を確認する
対象の照明が消えてよいタイミングで実行します。
HueRequest PUT "/$key/groups/$groupId/action" @{scene="$sceneId"}
$after = HueRequest GET "/$key/groups/$groupId"
$after.state | Select-Object all_on, any_on
any_on: falseは、Bridge上では対象グループに点灯中の電球がない状態です。ただし、API上の状態と実物の光は、両方確認してください。画面上だけオフで電球が光っていれば、成功とは扱いません。
作成したシーンはBridgeに保存されるため、PCを閉じても残ります。以降はHueアプリで該当の部屋・ゾーンを開き、「照明 OFF」を呼び出す構成にできます。PowerShellを閉じた後にAPIから再操作する場合は、保存していない認証キーを改めて取得する必要があります。
1灯だけ消したいときは、専用ゾーンを使う
部屋に複数の電球がある場合、その部屋のGroupSceneを作ると、ほかの電球の状態も含まれることが今回のAPI確認で分かりました。KAJPLATSだけを消すつもりで、ほかの電球の明るさや点灯状態まで戻してしまうのは避けたいところです。
そこで、電球は元の部屋に置いたまま、その1灯だけを含むゾーンを別に作成しました。Hueアプリで1灯専用のゾーンを用意し、そのゾーンを対象に前述の「照明 OFF」シーンを作る方法です。部屋から電球を移動させる必要はありません。
- KAJPLATSだけ消す:1灯専用ゾーンの消灯シーンを使う。
- 部屋の電球を全部消す:部屋全体の消灯シーンを使う。
シーンは部屋やゾーンに紐づきます。電球を別の部屋へ移動したり、対象グループの電球を増減したりした場合は、シーンの対象と動作を確認し、必要に応じて作り直します。
今回確認できた範囲と、まだ分からないこと
今回の環境では、Hueにつないだまま、追加購入なしで完全消灯できました。ただし、消灯シーンは回避策であり、通常のオフボタンやリモコンの動作そのものを修正したわけではありません。リモコンへのシーン割り当ても、今回の作業では行っていません。
KAJPLATSは、IKEAの国内製品ページではMatter over Thread対応として案内されています。この記事でHue経由の操作が成功したことと、Hueとの組み合わせが公式に保証されていることは別です。型番やファームウェアが異なる電球でも同じ結果になるかは、確認していません。
「暗くなるのに消えない」という症状なら、明るさ1%を消灯代わりにするだけでなく、オフ状態を保存したシーンを呼び出す方法が、手元で有効だった選択肢として残せました。

