こちらの記事はReazon Advent Calendar 2025の最終日の記事となります。
よろしければ他のメンバーの記事もご覧ください!
(最終日がこれでいいのか?)
はじめに
こんにちは。ゲーム開発部に所属しているエンジニアの松永と言います。
冬も真っ只中な今日この頃、皆様いかがお過ごしでしょうか?
私はもう自宅に帰るまでの自転車が寒くて寒くて・・・
自室くらいは暖かくあって欲しい・・・爆速ぬくぬくしたい・・・
今回はそんな切実(?)な気持ちから作成した「自動"暖房"システム」を紹介したいと思います。
暖房器具の選定
まず、何を用いて部屋を温めるかを考えました。
現在の自室には以下の2つの暖房があります。
- 灯油ストーブ
- エアコン
前者の灯油ストーブ、私の散らかっている部屋で自動化するとお家が燃えます(物理的に)。
純粋に危険ですし、お家本体で暖を取る羽目にならなくても、部屋に入った瞬間に一酸化炭素によって天国でぬくぬくする羽目になるかも。これは流石に避けたいです。
後者のエアコンも正直乗り気ではないです。
というのも、私の部屋にはロフトベッドがあり、その真上にエアコンがあります。
そして暖かい空気は上に溜まります。
そう、暖気が全く降りてこないのです。
ロフトベッド下の机で作業をしている身からすると、これほど悲しいことはありません。
また、センサーの位置も工夫しないとエアコンが反応しない事があるので、エアコンを自動化するのは難しいかな、となりました。
え〜、真っ当な手段が尽きましたね。そこで悩みました。
(何か暖房に使えそうな熱源はないかな・・・)
チラッ
RTX3090 \やあ/
私「せや!!!!!GPU使えばええやん!!!!!!」
PCをつけっぱなしでいつも仕事に行ってますし、GPUは暖かい。
温め時も電気を消費するだけで安全!おまけにロフトの下!
自動化もやりたい放題!
もうこれ以上なく完璧です。最強の暖房器具がそこにありました。
負荷の掛け方なんていくらでもあります。これにしましょう。
他の部分の準備
さて、一番重要な部分の選定が終わったので、それ以外の部分も準備していきましょう。
まずは室温の取得周りです。
常夏の部屋にしてしまうと温度差で逆に風邪をひいてしまいます。
寒いタイミングだけ暖房を入れられる様にしたいところ。
部屋を漁ったところ、自室に転がっていたArduino microを発掘。
これに温度センサーをつけて室温を読めば判断材料として使えそう。
という事でDHT22 というデジタル温湿度センサを購入し、これを使って温度を取得する形に。
(左がarduino micro、右がDHT22)
次に自動起動のトリガーを決めます。
これに関しては、手元のスマホにMacroDroidというマクロを組めるアプリが入っているので、MacroDroidのトリガーにあるジオフェンスを使いましょう。これは特定の範囲から「出る」「入る」をトリガーにするものです。
設定は単純で、オフィスの500メートル圏内から離れたらPCにHTTPリクエストを送るだけ!

通信に関しては外出先のスマホから家のPCへ通信をする必要があるので、Tailscale を通してVPNを構築します。上記のMacroDroidでの送信先はTailScaleで割り当てられたIPになります。
IoTプラットフォームは色々と存在していますが、今回は自宅のPCを制御する関係でVPN系のサービスを利用しました。
TailScaleはP2Pのようなネットワークを簡単に構築できるサービスで、特定IPへの発信のみトンネルを通る形のネットワークになります。
今回のような「自分だけ使うサービス」を作る場合はかなり便利だと思います。
負荷の掛け方
さて、枠組みが完成しました。
残るはPCへどのように負荷を掛けるか選ぶだけです。
まずパッと思い浮かぶのはベンチマークソフトやストレステスト系のソフトですね。
CPUだとMaxon社のCineBench やOCBASE社のOCCT 、
GPUだとSQUARE ENIX社のFF14ベンチ やGeeks3D社のFurMark などでしょうか。
どれも定番でよく見かけるテストソフトですが、CPUとGPU両方に負荷を掛ける+自動化となるとこれらでこなすのは中々難しいです。
まずCPUとGPU両方に負荷を掛ける場合、選択肢はこのようになります。
- CineBench + FurMark
- OCCTのPower Test
- FF14 Bench(CPU負荷欲しければcineBenchかOCCT同時)
しかし、これらには以下の問題があります。
- Cineベンチのループ実行が難しく、FurMarkだけ動き続けてしまう
- CLIで制御できる機能は有料版に含まれている
- そもそもCLIで動かせない
また、どれにも言えることですが、CPUとGPUを100%張り付きで毎日1時間前後回すのは、パーツの耐久性をかなり犠牲にする行為です。
自宅のGPUも3~4年選手なので、下手すると1ヶ月持たないかも・・・
PCパーツの値上がりが激しい昨今、懐事情まで木枯らしに吹き飛ばされるのは辛い・・・
これらを踏まえ、一旦ストレステスト系ソフトを利用するのは断念しました。
こうなってくると次に思いつくのはゲームソフトの類です。
幸い、SteamであればURL形式で起動できますし、多重起動も防いでくれるので自動化はかなりしやすいと思います。
あとはタイトル画面や起動後の画面でそこそこ負荷がかかるゲームやソフトを見つけてくれば良さそうですね。
最近プレイしていて、暖房として有用なGPUに負荷がかかるもの・・・
ところで、最近の私はよくVR空間で睡眠 をしています。
ということで、自動起動に選んだのはVRChat というVRコミュニケーションソフトになります。
3D空間上でチャットや簡単なゲームができるプラットフォームで、有志の方々が作られた3Dモデルやワールドが無数にあります。
それらの組み合わせによって負荷の調節が可能な点、毎晩起動しているので自動起動の旨みが大きい点が見事にマッチしたため、今回の負荷役に抜擢しました。
場所にもよりますが、DesktopでGPU 60%・VRでGPU 80%ぐらいの使用率は出せるので、負荷のかかり方も理想的でした。
実際にやってみた
実装時に書いたコードは以下になります。
自宅PCで常駐させてるpython web鯖
from flask import Flask, request
import time
import subprocess
import takeTemp # 同じフォルダに takeTemp.py
# --- 設定 ---
SECRET_KEY = "" # パスワードみたいなやつです
TEMP_THRESHOLD = 23.0 # この温度以下ならソフト起動
# Flask サーバー
app = Flask(__name__)
def start_vrchat():
"""Steam URL で DesktopMode VRChat 起動"""
url = "steam://rungameid/438100//--no-vr" #オプションで--no-vrをつけるとデスクトップモードで起動します。
try:
subprocess.Popen([
"powershell",
"Start-Process",
url
])
print("起動しました")
except Exception as e:
print("起動エラー:", e)
@app.route("/leave", methods=["POST"])
def leave():
"""MacroDroid からの外出通知を処理"""
key = request.args.get("key", "")
if key != SECRET_KEY:
print("Unauthorized access attempt")
return "Unauthorized", 403
# Arduino から温度取得
temp, hum = takeTemp.read_temperature()
if temp is None:
print("センサー読み取り失敗")
return "sensor_error", 500
print(f"温度={temp}°C, 湿度={hum}%")
if temp < TEMP_THRESHOLD:
print(f"温度 {TEMP_THRESHOLD}°C 以下 → 起動")
start_vrchat()
return "vrchat_started"
else:
print(f"温度 {TEMP_THRESHOLD}°C 以上 → 起動不要")
return "no_need"
if __name__ == "__main__":
print("監視サーバー起動中...")
app.run(host="0.0.0.0", port=5000)
Arduinoから温度を取得してくるpythonスクリプト
import serial
ARDUINO_PORT = "COM3" # Arduino Micro が接続されているポートに変更
BAUDRATE = 9600
def read_temperature():
try:
with serial.Serial(ARDUINO_PORT, BAUDRATE, timeout=2) as ser:
ser.write(b"READ\n") # Arduino に読み取り要求
line = ser.readline().decode().strip()
if line:
temp_str, hum_str = line.split(",")
return float(temp_str), float(hum_str)
except Exception as e:
print("Error reading sensor:", e)
return None, None
if __name__ == "__main__":
temp, hum = read_temperature()
if temp is not None:
print(f"Temp: {temp} °C, Hum: {hum} %")
else:
print("Failed to read sensor")
Arduino Microの温度取得用スクリプト
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
if (cmd == "READ") {
float t = dht.readTemperature();
float h = dht.readHumidity();
Serial.print(t);
Serial.print(",");
Serial.println(h);
}
}
}
利用者が私だけのサービスなので簡単実装です。USBも差したままで運用しているのでCOMもベタ打ちです。(ここは自動取得のスクリプト組んだ方が良い)
steamのリンク部分を変更すればお好きなsteam上のソフトを自動起動させることもできます。タイトルBGMを部屋のBGMとして利用している方などは利用しやすいと思います。
とりあえずテストをして無事にVRChatが起動することを確認したので、いざ実践投入。
普段16度行かないくらいの温度を差していた温湿度計が、18~19度を示すようになりました!!

(ちなみに、PCを起動放置しないと平気で8度くらいまで下がります。)
凄くぬくい訳ではないですが、部屋で気兼ねなく着替えができるくらいの気温ですし、その後もVRで負荷をかけ続けることを考えたら十二分の成果です!!
まとめ
いかがでしたか?
今回は自宅のPCを暖房にしてみる試みをしました。
この構成の応用として、別のPCとWoL対応のネットワークカードを増やせば、「帰宅する頃にメインPCを起動する」なんてこともできると思います。
様々な応用が効くと思うので、自宅PCのちょっとした自動化などに活用いただければ幸いです!
▼新卒エンジニア研修のご紹介
レアゾン・ホールディングスでは、2025年新卒エンジニア研修にて「個のスキル」と「チーム開発力」の両立を重視した育成に取り組んでいます。 実際の研修の様子や、若手エンジニアの成長ストーリーは以下の記事で詳しくご紹介していますので、ぜひご覧ください!
▼採用情報
レアゾン・ホールディングスは、「世界一の企業へ」というビジョンを掲げ、「新しい"当たり前"を作り続ける」というミッションを推進しています。 現在、エンジニア採用を積極的に行っておりますので、ご興味をお持ちいただけましたら、ぜひ下記リンクからご応募ください。


