太陽光の発電量に応じたBitaxeのモード切替(umbrelのHome Assistant使用)
ソーラーパネルとソロマイニング用の小型Bitcoinマイナー Bitaxe Gamma がある我が家。今回は「太陽光が余っている時間は全力で回し、足りない時間は省エネに落とす」を全自動でやる仕組みを、Claudeと一緒に作ったので、その記録。
制御の母艦には、すでに自宅で動かしている Umbrel 上の Home Assistant(HA)を使った。
■ まずは完成形
ざっくりの流れはこう。
1. ソーラーモニタから「発電・消費・売電・買電」を取得
2. Home Assistant で「余剰電力」を計算
3. しきい値を超えたら Bitaxe の AxeOS API を叩いてモード切替

切り替える2つのプロファイルは、前回の記事で詰めた値を流用した。

挙動はシンプルで、
- 余剰(売電−買電)が 150W超を10分継続 → 最高ハッシュレート
- 余剰が 50W未満を10分継続 → 高効率
雲が通るたびにパタパタ切り替わらないよう、しきい値に幅を持たせ「○分継続」条件も付けてある。
そして状態を一望できるダッシュボードがこれ。左に余剰電力ゲージ・太陽光・自動制御・Bitaxe詳細、右に電力/温度/エラー率の48時間グラフ。

■ どうやって作ったか
ここからは作成の流れ。基本はClaudeに相談しながら、要所で自分が判断していった。
▼ 1. なぜHome Assistantにしたか
最初に「Umbrelで動かすなら何が良いか」をClaudeに相談したところ、Home Assistant / Node-RED / Grafana / n8n / 自作スクリプト など複数の選択肢が出てきた。
今回は「Umbrelを使う」ことが前提で、なるべくシンプルな仕組みにしたかったので、Home Assistant単体を選んだ。ソーラー連携・条件判定・可視化(ダッシュボード)まで1つで完結できるのが決め手。
ただしトレードオフもあった。UmbrelのHAは「Container版」でアドオン(Supervisor)が使えないため、設定の一部をコマンドライン(SSH)から直接書く必要が出た。ここは、Claudeが提案してくれたNode-RED併用にしておけば全部ブラウザ操作で済んだかもしれない。シンプルさを取った代償、という感じ。
▼ 2. 必要な情報が揃うかを順に確認してくれた
ありがたかったのが、Claudeが「これを作るのに必要な情報が手に入るか」を順番に確認してくれたこと。
- ソーラーの発電量はどこから取れるか
- BitaxeのIPアドレスとモード設定値
- それぞれにアクセスできるか(認証は?)
いきなり手を動かすのではなく、足りないピースを先に潰してくれたので、手戻りが少なかった。
▼ 3. ソーラーモニタから値を取る(Digest認証の壁)
ソーラーモニタはLAN内にWeb画面を持っていて、裏で getinfo.cgi というCGIを叩いて数値を取っていた。直接叩くと素のテキストが返る。
{...&IG0:0.5&IBE:0.1&ISE:0.0&ICE:0.6&IGE:500}
IG0=発電(kW)、IGE=発電(W)、ISE=売電、IBE=買電、ICE=消費。つまり 余剰 = 売電(ISE) − 買電(IBE) で出せる。


ところがHAから取りに行くと 401。原因は HTTP Digest認証 だった(ブラウザはログイン情報をキャッシュしていたので通っていただけ)。HAの rest センサーはDigestに対応しているので、認証情報を足して解決。
rest:
- resource: "http://10.0.8.21/getinfo.cgi?<シリアル>&HA&0000000000&0000000000&Z17&IG0&IBE&ISE&ICE&IGE"
scan_interval: 30
authentication: digest
username: "(モニタのID)"
password: "(モニタのパスワード)"
sensor:
- name: "Solar Export"
unique_id: solar_export_kw
unit_of_measurement: "kW"
value_template: "{{ value | regex_findall_index('ISE:([0-9.]+)') | float(0) }}"
# 買電・発電・消費 も同様に regex で抜く
レスポンスがJSONではないので regex_findall_index で抜くのがコツ。余剰電力はテンプレートセンサーで計算した(HAが日本語名をローマ字IDに変換してくる罠があり、英語名で作るのが無難だった)。
▼ 4. Bitaxe側の制御
Bitaxe(AxeOS)は PATCH /api/system にJSONを投げるだけ。frequency / coreVoltage を効かせるには overclockEnabled: 1 が必須。
rest_command:
bitaxe_max:
url: "http://10.0.8.42/api/system"
method: PATCH
content_type: "application/json"
payload: '{"overclockEnabled":1,"frequency":800,"coreVoltage":1220,"autofanspeed":0,"fanspeed":100}'
bitaxe_eco:
url: "http://10.0.8.42/api/system"
method: PATCH
content_type: "application/json"
payload: '{"overclockEnabled":1,"frequency":525,"coreVoltage":1150,"autofanspeed":1}'
実機で試すと、525MHz⇄800MHz の切替は 再起動なしでライブ反映 された。動作確認もバッチリ。

あとは余剰電力をトリガーにこのコマンドを呼ぶオートメーションを組めば、自動切替の完成。
▼ 5. 一番時間がかかったのはダッシュボード
ここまで自分でも驚くくらいすんなりと出来上がったのだが、なぜか一番時間を食ったのはダッシュボード作りだった。「グラフを横並びにしたい」「パネルの余白が多い」「Bitaxeのグリッド表示は見づらい」…と自分が変にこだわったせいで、レイアウトを何度もやり直すことに。最終的にセクション表示の2カラムに落ち着いた。Claudeには延々と付き合わせてしまった。
■ やってみての感想
今まで Home Assistantは「名前は知ってるけど使い方が分からない」枠で放置していた。今回Claudeが順を追って設定してくれたおかげで、RESTセンサー・テンプレート・オートメーション・ダッシュボードの作法がふんわりわかるところまできた。これなら次からは自分でも設定できそう。……まあ、結局またClaudeに任せる気がするけど。
前回の記事で「余った電気はマイニングするより売った方が得」とか書いておきながら、今こうして嬉々として 売るより先にBitaxeをぶん回している。まあ、そんなもんでしょ。
次はBitaxe複数台のコントロールも面白いかもしれないが、ますます経済合理性が遠のくので・・・、だれかFIT落ちの太陽光発電所持て余してたり、マイニングマシン余らせて困っている人いませんか?




