- 賃貸アパートで機器を交換したり電気工事士を呼んだりせず、既存サーモスタットの無線信号の再送によって Home Assistant の暖房制御を実現した事例
- サーモスタットは
868MHz 帯でボイラーと通信しており、プロトコルは暗号化されていたが、Replay Attack はパケット内容を知らなくても機能した
rtl_433 の分析結果では Honeywell 系に近いプロトコルに見え、demand 値がボイラーのオン・オフを示し、ボイラーが確認応答を返す構造だった
- 最終構成は
HackRF One クローンと hackrf_transfer で信号を録音・再生し、Docker の Web サーバーと Home Assistant の command_line、average、generic_thermostat を接続するもの
- 2024年12月初旬から問題なく使用中だが、
868MHz 送信は地域の法規によっては違法となる可能性があり、単純なオン・オフ制御に HackRF を使う選択は大げさでもある
賃貸住宅で暖房の自動化が難しい理由
- 賃貸アパートのボイラーは、大家が設置した無線サーモスタット1台で制御されていた
- サーモスタットは内蔵温度センサーで目標温度に合わせて暖房をオン・オフする仕組みだった
- 実際の使用では不便な点が3つあった
- センサーがアパートの1部屋の温度しか測らず、部屋ごとに暖房の効きが均一でない
- 操作部のある部屋次第で、ベッドやリビングから使いにくい
- 外出前に暖房を切り忘れると高価なエネルギーを無駄にしてしまう
- すでに Home Assistant で家の自動化をしており、暖房も同じように制御したかった
- 市販ソリューションもあったが、大家の協力や電気工事士の訪問が必要になる可能性があったため、既存のサーモスタットをそのまま使う道を選んだ
プロトコル解析の代わりに再送攻撃を選択
- 出発点は、サーモスタットとボイラーが無線プロトコルで通信しているという事実だった
- プロトコルを最初からリバースエンジニアリングするのは、無線に関する知識レベルに比べてあまりに複雑だった
- 選んだ方法は Replay Attack だった
- ボイラーとサーモスタットの間の信号を複製する
- 複製した信号を再送して、攻撃者がサーモスタットのように見えるようにする
- プロトコルの中身を理解しなくても動作可能
- この方法は機器の実装に運が左右される
- 通信に増加カウンターがあれば過去の信号を無視して再送攻撃を防げる
- 対象サーモスタットはその方式を使っていなかったため、再送が可能だった
信号帯域の確認と最初の観察
- オンラインで正確なサーモスタットのモデル情報を見つけ、データシートの RF Communication 項目から
868MHz 付近の帯域を使うことを確認した
- データシートには
Protocol: Encrypted とあったが、再送方式では大きな問題ではなかった
868MHz 信号の複製に関する資料は多くなかった
- LoRa/Meshtastic 関連の資料は多かった
- シーリングファンやガレージドアのような機器を複製しようとする Reddit 投稿は多かったが、答えは乏しかった
433MHz であれば、民生向けツールははるかに多かっただろうと判断した
- 信号を見るために Software-Defined Radio を使った
- Flipper Zero はこの状況には向いていなかった
- Flipper Zero は SDR ではない
- 動作可能な周波数範囲が限られており、この機器には使えなかった
プロトコルの手がかりと失敗した送信の試み
- rtl_433 でサーモスタットが既知のプロトコルを使っているか確認した
- 名前に反して他の周波数でも動作する
- より珍しい機器は認識されないことがある
- 結果として、このサーモスタットは他の Honeywell 機器と同じプロトコルを使っているように見えた
- 通信では
demand 属性がボイラーの状態を示していた
1 はボイラーオン
0 はボイラーオフ
- ボイラーは確認応答を返し、サーモスタットが圏外かどうかを判断する用途に見えた
- その後、直接パケットを作って送信しようとしたが失敗した
- URH でパケットを手動でリバースエンジニアリングして再構成しようとした
- 安価な
868MHz マイコンボードで送信しようとした
- それらのボードは同じボード同士の通信向けで、先に進むには無線レジスタを直接扱う必要があった
- これは自分の技術レベルの範囲外だと判断した
HackRF で信号をそのまま録音・再生
- 最終的に HackRF を使い、信号内容を解析せずそのまま再生する方式を選んだ
- 既存の RTL-SDR は受信専用で、送信には使えなかった
HackRF One は通常 400 ドル以上するが、AliExpress には 40 ドル程度のクローンがあった
- hackrf_transfer でオン・オフ信号をそれぞれ録音した
# We set the frequency to 868.3Mhz and the sample rate to 2000000.
hackrf_transfer -r turn_off.raw -f 868300000 -s 2000000
hackrf_transfer -r turn_on.raw -f 868300000 -s 2000000
- 同じ設定で信号を再生すると、CLI からボイラーをオン・オフできた
# We use -a to turn on the amplifier and -x to increase the gain a tad.
hackrf_transfer -t turn_off.raw -f 868300000 -s 2000000 -a 1 -x 23
hackrf_transfer -t turn_on.raw -f 868300000 -s 2000000 -a 1 -x 23
- コマンド実行後、ボイラー内部の物理リレーがオン・オフする音を聞けた
Home Assistant への接続方法
- HackRF を給電用 USB ハブに挿し、それを Home Assistant サーバーに接続した
- Docker コンテナ内で送信コマンドを実行するシンプルな Web サーバー を書いた
- Home Assistant では Average Sensor Plugin を使い、
command_line、average、generic_thermostat の構成をつないだ
command_line:
- switch:
name: Boiler
command_on: "curl http://docker-vm:1111/api/on"
command_off: "curl http://docker-vm:1111/api/off"
sensor:
- platform: average
name: "Average Temperature"
entities:
- sensor.bedroom_thermostat_temperature
- sensor.kitchen_thermostat_temperature
climate:
- platform: generic_thermostat
name: Boiler Thermostat
heater: switch.boiler
target_sensor: sensor.average_temperature
- この構成により、寝室とキッチンの温度センサーの平均温度を基準にボイラーを制御するサーモスタットを作った
- 実装は応急処置に近い
- 専用の Home Assistant プラグインを書くほうがよい
- CLI をシェル経由で呼ぶ代わりに無線を直接制御するほうがきれい
curl に暖房を依存させる構成はやや扱いづらい
実際の使用結果と残る制約
- この設定は 2024年12月初旬からアパートの暖房制御に使われており、その後は問題がなかった
- スマートフォンから温度を調整できて便利だった
- 自動化の例は次のとおり
- 就寝中は温度を下げる
- 朝の起床時間に合わせて温度を上げる
- 街に出たら暖房を切る
- 帰宅の数駅前に暖房を再度入れ、到着時に暖かくしておく
- 最も残念なのは、単純なボイラーのオン・オフスイッチのために HackRF のような強力な無線機 を常時使わなければならない点だった
- 小さな無線機を無理に合わせるのに時間をかけるより、大げさな機材でもきちんと動くほうを選んだ
無線送信とブログコメントに関する法的注意
- 無線信号の送信では、地域の法規を必ず確認する必要がある
- 文中で使った
868MHz 帯は、米国では免許なしで送信すると 違法 になる
- 2025年3月16日から英国の Online Safety Act が全面施行され、ブログコメントのようなユーザー間コンテンツの運営負担が大きくなる
- 規制当局 Ofcom が個人ブログまで取り締まる可能性は低いが、違反時には 1,800万ポンドの罰金 リスクがあるため、コメント欄を削除した
- 自前運営ブログへの法の影響を扱った記事として、関連法の解説 と hobbyist internet に関する議論 も示している
1件のコメント
Hacker News のコメント
エネルギーやコスト削減が目的なら、20分で涼しい家を暖かくできるシステムは、むしろ望ましくないものです。
代わりに、暖房水の循環温度をずっと低くして運転し、非暖房空間での損失を減らしつつ、部屋全体をより均一に暖める方式がよいです。コンデンシングボイラーなら、目標の出水温度を下げるだけでも可能です。
さらに外気温補正(weather compensation)を加えると、外の気温に応じて出水温度を調整し、建物が目標温度にかろうじて回復する程度にだけ運転できます。
適切にチューニングした場合、サーモスタットが上限リミッターのように動作し、1日22〜24時間暖房を要求するものの過熱しないように調整できました。通常の出水温度は暖かい日で110°F、氷点下の天候で135°F程度で、前年冬の固定160°F出水と比べてガス使用量が8〜15%減少し、快適性も大幅に向上しました。ただし、この方式は回復時間が長いため、大きなセットバック設定とは相性がよくなく、普段は精密に低温で回しつつ、回復区間だけより熱いお湯を使う、より賢い制御が必要です。
熱は温度差に応じて、熱い場所から冷たい場所へ線形に移動します。仮に配管温度が室内と同じなら、伝わる熱はすべて外皮の外へ逃げることになり、配管が熱いほどこの比率は良くなります。配管の何パーセントが外皮の内側にあっても同じです。
ただし、窓の下のように外壁沿いで暖房すると、室内サーモスタットよりも外壁を高い温度に暖め、外への損失が大きくなります。一方、輻射暖房はこの効果をおおむね避けられます。
つまり、合理的に断熱された家では、20°C程度の低い一定温度を維持するのが快適性の面で最もよく、暖房水温度も下げられるため、ヒートポンプやボイラーの効率が良くなります。
一定温度にしておく場合と、外出時に上げる/下げる/切って帰宅前に戻す場合を比較しても差はほとんどなく、電力消費量も同程度でした。
リンクがあるとよいのですが、効率が落ちる再加熱状況までテストしていました。ここには「非常暖房」も含まれていました。
素晴らしいハックです。
もっと簡単な方法は、サーモスタットの下にペルチェ加熱/冷却素子を置いて遠隔制御し、サーモスタットが認識する温度を掌握することのように思えます。
正確なサーモスタットのモデルへのリンクが機能しないので、このアプローチが設計上どれほど適しているかは分かりませんが、私が使ったことのあるサーモスタットは普通は壁掛けなので、その下に熱源や冷源を置くのはそれほど難しくありませんでした。熱い側と冷たい側が同時にサーモスタットへ入らないようにすればよく、それは単純な配置の問題です。
ツールボックスが解法空間を本当に左右するのだと思います。RF方面はまったく知らない状態でこの記事を読んでいると、自分の道具により合った別の攻撃がすぐに思い浮かびました。サーモスタットを箱に入れて、その箱の温度を機械的に制御できないでしょうか?
それでもサーモスタット内部にアクセスできるなら、温度センサーを回路で置き換えて、必要なときに非常に高く、または非常に低く読ませるのは難しくなさそうです。
初めてでもおそらく30分の作業で、両面テープが少しあれば簡単に元に戻せます。Tracy Islandを作ったことのある英国人ならなじみのあるものです。感電の危険は実際にありますが、ボイラーの電源を切れば完全に減らせます。
それでも面白いハックで、よく実装されています。
汎用サーモスタットの理想形は何なのか気になる。
うちのアパートのサーモスタットには、最近の米国製品によくある「機能」があって、起床、外出、帰宅、就寝という4つの順序付きの時刻と、各区間の希望温度を設定するようになっている。家の全員が毎日同じ時刻に起きて、出かけて、帰ってきて、寝る世帯なんてほとんど知らない。
私は在宅勤務なので、単に温度を1つ設定して無期限に維持したいだけなのに、このシステムでは希望温度を4回押して入力し、4つの区間を確認しなければならない。
結局、昔ながらのダイヤル式サーモスタットのように動作するよう設定できる、よりプログラム可能なサーモスタットのほうがよさそうだ。
理想的な構成は、家中のすべてのラジエーターにスマートサーモスタットバルブを取り付け、部屋にいないときに手動で下げたり、活動や窓の開放を自動検知して調整したりすることだ。ただし、リビングのメインサーモスタットだけがボイラーをオンにするのではなく、各バルブが必要に応じて中央ボイラーをオンにする権限を持つべきだ。
夜は涼しめが好きなので、普段の就寝時間ごろに温度が変わるようにしていて、日中の温度を調整していたとしても自動的に戻る。そもそも、戻すのを覚えておきたくないからスマートサーモスタットを使っているのだから。家を出ると検知してAwayに切り替わり、休暇中は家を安全に保つだけで快適にはしないよう設定しておき、飛行機の着陸時刻ごろに戻すこともできる。
スケジュールがめちゃくちゃにランダムでない、あるいは寝ているときも起きているときも不在時も常に同じ温度にしたいわけでないなら、基本スケジュールを入れておき、必要なときに手動調整すればよい。1時間早く起きたら自分で変えればいいし、時間どおりに起きるなら気にする必要もない。
望む使い方も可能だ。標準プログラムを15°Cにしておき、必要なときに好みの温度に設定したholidayをオンにすればよい。夕方の適当な時刻に15°Cへ戻るようにしておけば、忘れてもずっとオンのままにはならない。
Flipper Zeroは素晴らしく、カスタムファームウェアを入れれば、ハッキングや調査の部分はすべて処理できる。
元の製品は、理解できることに、かなり制約の多いファームウェアで出荷されている。会社が受ける非難を減らす目的なのだろう。ただ、Flipper Unleashedのようなものをインストールするのは非常に簡単で、そうすればその制約を取り除き、多くの追加機能を得られる。
犯罪に使える道具を持っていること自体が、必ずしも犯罪ではない。ただし、自分が何をするかには注意が必要で、国によってはスーツ姿の人たちがドアをノックしに来るかもしれない。
個人的には、自分の装置、たとえば電動ゲート、ローラードア、ローラーシャッターなどの「暗号化された」433MHz信号を再生したかったのだが、Flipperの地域設定がAustraliaのときは無効化されていた。
技術的な探究と好奇心は常に奨励するが、Flipper Zeroの例だけ見ても、管轄に関係なく念頭に置くべきことがある。使うつもりがないなら持ち歩かないこと。練習前にすべての文書を読み、目立たないようにする練習をすること。アウトドア活動で学んだ「痕跡を残さない」姿勢を適用すること。自分の存在と行動が環境や対象にどのような影響を与え、外部の観察者にどう解釈されるかを気にかけ、疑いを減らすための措置を取ること。
こうした原則は、使い捨てスマートフォンからTemuの安価なRFIDカード複製機まで、多くの装置に当てはまる。
特に初心者は熱意が先走り、テレビやゲームの中のハッカーのように見える段階へすぐ飛び込みたがる。彼らが架空の人物であるのには理由がある。行動が無害だったかどうかにかかわらず、結局重要なのは、質問してくる権限者がどう認識するかだ。
復号したいなら、おそらくそれほど難しくはないだろう。以前これをやったとき、送信側も実装しようとしたが、引っ越しでできなかった。
https://blog.habets.se/2017/04/Decoding-FSK.html
私なら無線信号をいじるより、サーモスタット自体を温めたり冷やしたりする方法にすると思う。小さな箱をかぶせ、小さなペルチェ素子のようなもので箱の中の温度を制御すればよい。暖房を入れたいなら箱の中を冷やし、止めたいなら温めればよい。
ただ、趣味で熱制御装置を作っているので、この方法のほうがずっと簡単に見えているだけかもしれない。
[0]: https://thex10shop.com/products/x10-powerhouse-th2807-thermo...
元記事の投稿者がここに来るなら、ボイラーと互換性のあるサーモスタットにそのまま交換していれば、お金も厄介事も少なくて済んだ可能性が高い。ランダムなオープンソースプロジェクトで Honeywell の信号を見つけ、それが動作したという事実だけを見ても、ボイラー市場は競争にかなり開かれている
今後のアパートのカスタマイズにも幸運を祈る
すばらしいプロジェクトだ
比較的新しい天然ガス(CH4)暖房機なら、どれも OpenTherm/eBus のようなプロトコル経由の変調式サーモスタット機能があるべきだ。外気温センサー付きのサーモスタットと組み合わせれば、システム効率が数パーセント上がり、サーモスタットと設置費用の回収にも役立つ。結果的に、より効率的な現代的暖房システムになる
ヒートポンプシステムにも同じことが当てはまるはずだ
新しいアパート、正確には家に引っ越し、全面リノベーションが必要だった。現代的な断熱はなかったが、当面は断熱への投資対効果が合わないと計算した。複数階のセミデタッチド住宅なので、できるだけ快適で経済的な暖房にしたかった
特に寝室とリビングは安定して個別に調整できる温度、一部の部屋は床暖房、一部はラジエーター暖房、また別の部屋は厳寒期に床暖房だけでは足りない可能性があるため、床暖房+ラジエーターの組み合わせを望んでいた
お金を払えば、誰かが制御システムを設定してくれるだろうと思っていた。簡単なことのはずでは?
完全に間違っていた。「専門家」たちが薦めた構成を数時間かけて理解したあと、無駄が出たり不快になったりする境界ケースを見つけた。不必要で避けられない温度のオーバーシュートやアンダーシュートのようなものだ。Honeywell、Tado、Siemens などと何度も話し合ったが、どれにも大きな欠陥があった
そのためリノベーションは少し止まったが、配管は用意できており、少なくとも配管とポンプが動くか見てみたかった。そこでポンプとバルブを Zigbee 制御のスマートプラグにつなぎ、オンになるか確認した。うまくいき、そこから考えがつながっていった
今では家中に20ドルの Zigbee 温度センサーを配置し、30ドルのスマートプラグとリレーがバルブ、ポンプ、ボイラーを駆動し、Home Assistant が全体を制御している。すべて完璧に動作しており、既製システムでは不可能な機能も実現した。たとえば床暖房とラジエーターが両方ある部屋では、目標温度との差が大きいときは両方を動かして素早く暖め、目標に近づいたらラジエーターを切って床暖房を主役にする。より快適で、ラジエーターよりエネルギー効率も良い。ラジエーターの部屋は目標に対して±0.4°C、床暖房の部屋は±0.1°C以内に収まる
そのため、単純なモデルが見落とすものを考慮して、ほぼ常に少し過剰設計で非効率になる
暖房だけでなく工学の大半がそうで、完全に最適化されたものはかなり珍しい
「HVAC/暖房業界全体が愚かで、こういうことをきちんとできない」と考えるより、自分の前提や基準が間違っている可能性を振り返るほうがよい
たとえば現代的な HVAC や暖房システムでは、アンダーシュートやオーバーシュートが無駄や不快感を引き起こすわけではない。1〜2°F のオーバーシュートが、暖房された空間が設定点に完全に合っている場合よりも目に見えて多くの熱を失うという意味ではない。即時に反応するシステムも望ましくないはずだ。宅配便を受け取るためにドアを開け、サインまでしてから閉めると、室内の空気はかなり冷たくなる
このとき暖房はオンになるべきか?
あなたの家ではオンになりそうだが、正解はノーだ。空気は、室温だったあらゆる物体からすぐに再び暖められるからだ。表面積だけでも数千平方フィートを超える
Honeywell、JCI、Siemens、Trane、Carrier のような住宅向けの選択肢は汎用的な適用により重点を置いているようで、商業用 BAS システムは汎用センサーやコントローラーを使うとしても、特定の建物に合わせたカスタム設計に近い。ちなみに、先に挙げた5社すべてとビル自動化プロジェクトを行ったことがある
機械工学者がボイラー構成を設計した家を運悪く買ってしまう人もいて、ボイラー室には Titanic のエンジンを操作するかのようにバルブと圧力計がぎっしり並んでいる
最近は、この分野の新たな罪人はプログラマーのようだ