私は、いかにしてぼったくり業者に反撃したか

はじめに

少々長文であるが、最後にどんでん返しもあるので、トイレの中や時間を持て余しているときに読んで頂ければ幸いである。

現在居住している賃貸集合住宅はプロパンガスである。
そして、とんでもないぼったくりガス会社の供給を受けている(2026-04時点で1㎥あたりほぼ1000円である)。
憤懣ふんまんやるかたないため、できる範囲で対抗策を講じることにした。

1つは電化である。シャワー以外はすべて電化した。
在宅勤務なのでシャワーは外出するときのみ利用し、使用量を半減する成果を上げられた。
ちなみに週1度の頻度である。刑務所でさえ週3回は入浴するらしいので、それ以下の生活を強いるぼったくり業者に怒りがおさまらない。

もう1つは灯油である。灯油は各部屋に供給されるが、その供給業者もぼったくりガス会社であった。これはまったく予期していなかった。
ガスであれだけ貪り食う連中だ、灯油代も容赦なく上乗せするだろう。
部屋には備え付けの灯油ストーブがあるが、これもぼったくりガス会社の設備なのである。喜々として灯油代に上乗せしてくるだろう。

さらにこのストーブには設定温度に達した時の自動停止機能がない。
ストーブは定価十数万円の10年程度前のものだ。50年前とかならわかるが、10年前で自動停止機能がないとかありえない話である。
室温がバリ島になってもストーブはバリバリ燃焼し続けるのだ。
私を含め大抵の人は停止するのが面倒なのでそのまま燃焼を続けるだろう。つまり灯油の消費量が増える。
これを見込んで自動的停止機能がないストーブを設置したものと推測する。
ぼったくりガス会社は天にも昇る気持ちだろう。いや、昇天しきって白目を剥いているだろう。

絶対に許さない。昇天なんてさせない。看過するわけにはいかない。
そして、ストーブのボタンを温度に基づきON/OFFするホームオートメーションを構築するに至ったのである。

ここにお金と労力をかけるくらいなら、灯油代のほうが安くないかと思われるかもしれない。
確かに金額だけを見るとそうなるかもしれない。
しかし本質は「ぼったくりガス会社への怒りの反撃」だ。
ホームオートメーションの構築は、私の勝利と同義なのである。

このページは勝利の証跡、つまりどのようにホームオートメーションを実現したのかを示す。

要件

  1. 設定した上限温度以上ならストーブをOFFにし、設定した下限温度以下になったらONにする。
  2. 設定温度は、昼間と夜間の2通りを指定できる。
  3. 停止ボタンを押下するとストーブをOFFにして、上記の制御を行わない待機状態にする。
  4. 2時間タイマーボタンを押下すると、2時間後にストーブをOFFにして待機状態にする。
  5. ストーブのON時間を指定できる(自動起動)。※1
  6. 操作や設定はGUIから行えるようにする。停止ボタンに関しては物理ボタンも用意する。
  7. ストーブが意図した動作にならない場合はエラー状態に遷移する。※2
  8. ストーブを手動操作した場合に備え、当該システムの状態をこれに合わせるボタンを用意する。
  9. クラウド非依存とする。※3
  10. ストーブ本体は改造等しない。

※1:自動起動とは、燃焼を行うことではなく、室温監視を行い必要に応じ燃焼を始めたり消火したりする状態にすることである。
※2:本システムが物理ストーブの制御を喪失した時は、(物理ストーブ自体に安全動作する機能があることを前提に)それ以上の制御を行わずエラー状態に遷移する。
※3:俗世ではクラウドでホームオートメーションを実現するのが一般的らしいが、その多くは Azure や AWS といった外部基盤に依存しており、障害が起きれば自宅の機能まで巻き添えになりかねない。
また、得も知れぬ会社のサービスに生活の制御を委ねれば、仕様変更や廃止の影響を避ける術もない。私にはどうにも受け入れがたい。

なお、当該制御は有人環境で行う。そもそも無人環境でストーブを焚く意味がない。

機材

機材金額説明
Raspberry Pi 4 Model B 8GB (失念)制御システムの本体。Home Assistantをインストールする。
元々はext4のUSB-SSDからファイルを取り出す為に使用していたが、現在それはWSL2で代用している。
256GByte 2.5inch SSD ¥6,980Pi4のメインストレージとして使用。マイクロSDではすぐに寿命に至ってしまう可能性が高い。
余っていた2.5inch HDDで試行したがUSBポートからの電力が足りず正常動作しなかったのでSSDにした。
USB SSDケース ¥959SSDをPi4にUSB接続する。
TP-Link TP110M 2個セット ¥2,900ストーブの稼働状況を電力量で判断するために用いる。Matter対応。2.4G WPA/WPA2-Personalで接続
M5Stack公式ATOMS3 Devキット 2個 ¥7,960停止ボタンとサーボ制御用で2個 / 2.4G WPA3で接続
ファームウェアはHome AssistantのAddon ESPHome Builderで作った(設計は自分、製造はGemini)。
M5ATOMS向け 4サーボ接続基板キット ¥1,200ATOMS3にサーボを接続する。
少しだけはんだ付けが必要であるが、これがあるとサーボのコネクタをそのままATOMS3に接続できる。
MG90Dデジタル・マイクロサーボ ¥1,756ストーブの電源ボタンを押下するために使用/茶(GND),赤(+5),黄(PWM)
L字ステー ¥620サーボをストーブの押しボタン位置に取り付けるため使用
テトラ サーボ取付L金具Sサイズ ¥785サーボをL字ステーに取り付けるために使用
タミヤ ミニ四駆用 620ボールベアリング 2個セット ¥600サーボアームに取り付けてストーブのボタンを押下するために使用
uxcell 十字穴付ボルト ナット ワッシャー セット M2*15mm ¥824サーボアームにボールベアリングを取り付けるために使用
オールメタルサーボアーム 9g 20T ¥751ストーブのボタン押下に負けてアームが曲がらないようにメタルサーボアームを用いる
ヤザワ コンセントタップ 2個口 ¥804パイロットランプ付きの2口コンセント。開発時にコンセントの通電状況を目視するために使用
スマホ (省略)これ用に購入したわけではない。普段使用しているスマホだ。GUIを表示し操作を行うために使用

実装

設計は自分で行い、コーディングは全て無料のGeminiやChromeのAIモードで行った。
YAMLでコードを記載するが、学習ゼロで挑んだ。
指示と異なるコードが生成される場合があり、これを検出できないと詰んでしまうだろう。

構成図

ストーブ制御の構成図
【構成図】

イベントマトリクス

制御といえばイベントマトリクス(状態遷移表)である。
PDFにしたイベントマトリクスを掲載する。
自分がわかる表であればよいので、表記の一貫性が低いことはご容赦願う。
[]で囲ったのはスクリプト名である。script.XXXXは、スクリプトXXXXの呼び出しを意味する。
Excel Onlineで作成し、掲載するためにPDF化した。

現在の状態をSW-ATOMS3に下記のように表示している。
図はいずれもいらすとやを使用した。
状態 図 意味
初期化初期化中の図起動する準備を行っている状態
監視中監視中の図室温を監視している状態
燃焼燃焼中の図ストーブのSWを押下(ON)し、燃焼を始めた状態
消火消火中の図ストーブのSWを押下(OFF)し、消火を始めた状態
エラーエラーの図何等かのエラーが発生
待機待機の図ストーブの監視・制御を行っていない状態
(疎通不可)疎通不可の図Home Assistantと疎通が取れなくなった

正常系の状態遷移の一例を記す。

正常系の状態遷移の例図
【状態遷移例】

ヘルパー一覧

ヘルパーとは、状態を持つ何かである。グローバル変数やタイマーが該当する。
エンティティ名 型 備考
sv_atoms3_lastupdate input_datetime SW-ATOMS3のハートビート時間を格納する。SW-ATOMOS3の死活監視に用いる。
sv_autotime input_datetime 使用者が指定した自動起動時間(時分)を保持する。
sv_cnt_burn input_number 燃焼継続カウンタ
sv_cnt_burn_poweron input_number PowerOnリトライカウンタ
sv_cnt_burn_retry input_number 燃焼リトライカウンタ
sv_cnt_putout input_number 消火継続カウンタ
sv_cnt_putout_retry input_number 消火リトライカウンタ
sv_cnt_sensor_error input_number センサー取込連続カウンタ
sv_debug input_boolean 開発・デバッグモードを表すフラグ。
sv_directive_idle input_boolean 待機状態への遷移を予約するならTrueを指定する。
sv_enable_autotime input_boolean 自動起動を有効にするならTrueを指定する。
sv_forcesync_idle_btn input_button ダッシュボードの同期ボタン(待機)に連動する。
sv_forcesync_burn_btn input_button ダッシュボードの同期ボタン(監視中-燃焼)に連動する。
sv_forcesync_putout_btn input_button ダッシュボードの同期ボタン(監視中-消火)に連動する。
sv_gui_nhour_btn input_button ダッシュボードのタイマーボタンに連動する。
sv_gui_stopcont_btn input_boolean ダッシュボードの自動起動ボタンに連動する。
sv_next_autostart input_datetime svtm_autostartのタイマー値を設定するために使用している。
ヘルパー(グローバル変数)ではなくローカル変数で足りる使途であった。
sv_nhour_text input_text 2時間タイマーの残り時間をテキストで保持する。ダッシュボードの表示に用いる。
sv_note input_text エラー要因テキストを保持する。ダッシュボードの表示に用いる。
sv_plug_root_onoff input_boolean ストーブに接続したスマートコンセントの電源状態(ON/OFF)に連動する。
sv_plug_root_power input_number ストーブに接続したスマートコンセントの電力値に連動する。
sv_sts input_select 主状態を保持する。
sv_sts_keep input_text 物理ボタンのPress~Release間で主状態の変化を検知するために主状態を一時保存する。
sv_sts_sensor input_boolean 動作に必要なATMOS3等がすべてONLINEならTrueを設定する。
sv_sts_sub input_text 副状態(燃焼・消火)を保持する。
sv_temp input_number 現在の室温を保持する。
sv_temp_debug input_number 開発・デバッグモードでは、この値をsv_tempとして用いる。
svtm_pull_value timer センサー取込タイマー
svtm_monitor timer 監視タイマー
svtm_mon_poweron timer PowerOn監視タイマー
svtm_burn timer 燃焼タイマー
svtm_mon_burn timer 燃焼監視タイマー
svtm_putout timer 消火タイマー
svtm_mon_putout timer 消火監視タイマー
svtm_buzzer timer ブザー鳴音タイマー
svtm_2hour timer 2時間タイマー
svtm_autostart timer 自動起動タイマー
sw_atomos3_lcd_brightness input_number SW-ATOMS3のLCDの明るさに連動する。
servo_atmos3_lcd_brightness input_number SERVO-ATOMS3のLCDの明るさに連動する。

スクリプト一覧

スクリプトとは、YAMLで記載したプログラムの事である。
私見であるが、YAMLのプログラムは、Excelの関数以上にイケてない。Excelの関数とYAMLのプログラムの間には超えられない壁がある。
本件は生成AIでコーディングしたが、自分でしようとは思わない酷さだ。
数本だけコードを見られるようにリンクした(全部は手間なのと、そもそもこのページを見る人はほとんどいなりだろうから)。
スクリプト名 概要
check_sensor_status ATOMS3等がONLINEであるか検査し、OFFLINEならエラー状態へ遷移する。
clear_all_counter 各種カウンタ(sv_cnt_~)をゼロクリアする。
event_dispatcher 前述したイベントマトリクスに基づき各種スクリプトへ呼び出す。各スクリプトの実行は直列化されている。
event_dispatcherAsync 前述したイベントマトリクスのsvon_press_stopcontイベントだけは本スクリプトで処理する。
get_constants 各種定数を取得する。
save_sensor_values ATOMS3等の状態や値をヘルパーに書き込む。
save_sts sv_stsをsv_sts_keepへ保存する。
set_autostart 現在の時刻に基づき、自動起動タイマーを開始する。
start_putout 消火を始める。
svact_2hour 2時間タイマーの満了に伴う消火を始める。
svact_autostart_onoff 自動起動をON→OFFしたり、OFF→ONしたりする。
svact_autostart_through 燃焼・消火中に自動起動タイマーが満了した時に、先行処理の終了後に監視状態へ遷移する準備を行う。
svact_burn ストーブの燃焼が継続していることを確認する処理を開始する。
svact_buzzer スマホを鳴音する。
svact_change_autostart 自動起動時間が変更されたとき、起動用タイマーを再設定する。
svact_initialize_2 センサー取込タイマーを開始し、初期化状態へ遷移する。
svact_mon_burn ストーブの燃焼が始まったことを電力で判定する。
svact_mon_poweron ストーブの電源(スマートコンセント)がONであることを確認する。
svact_mon_putout ストーブが消火した事を電力で判定する。
svact_monitor 室温に基づき燃焼や消火を始める。範囲内の室温なら監視を継続する。
svact_push_stopcont_1 監視状態で停止・再開ボタン(ダッシュボード)が押下されたので、消火を開始し待機状態への遷移を予約する。
svact_push_stopcont_2 燃焼または消火状態で停止・再開ボタン(ダッシュボード)を押下された。待機状態への遷移を予約する。
svact_push_stopcont_3 待機状態で停止・再開ボタン(ダッシュボード)が押下されたので、監視状態へ遷移する。
svact_putout 消火状態を電力で監視することを始める。
svact_release_stopcont_1 監視状態で停止・再開ボタン(物理ボタン)が押下されたので、消火を開始し待機状態への遷移を予約する。
svact_release_stopcont_2 燃焼または消火状態で停止・再開ボタン(物理ボタン)を押下された。待機状態への遷移を予約する。
svact_release_stopcont_3 待機状態で停止・再開ボタン(物理ボタン)が押下されたので、監視状態へ遷移する。
svact_startmon 監視タイマーを開始し、監視状態へ遷移する。

オートメーション一覧

オートメーションとは、イベント(ボタンONやタイマー満了)の受け口とその時に行う処理(YAMLで書いたプログラム)である。
下記のオートメーションは、一部を除きスクリプトevent_dispather(1つだけevent_dispatcherAynsc)を呼び出す。
こちらも数本だけコードをリンクする。
スクリプト名 トリガー
svon_startup HomeAssistantが起動した
svon_pull_value センサー取込タイマー満了
svon_monitor 監視タイマー満了
svon_mon_poweron PowerOn監視タイマー満了
svon_burn 燃焼タイマー満了
svon_mon_burn 燃焼監視タイマー満了
svon_putout 消火タイマー満了
svon_mon_putout 消火監視タイマー満了
svon_buzzer ブザー鳴音タイマー満了
svon_press_stopcont SW-ATOMS3のボタンを押下
svon_release_stopcont SW-ATOMS3のボタンを開放
svon_push_stopcont ダッシュボードの停止・開始ボタン押下
svon_forcesync_burn ダッシュボードの同期(監視中-燃焼)ボタン押下
svon_forcesync_putout ダッシュボードの同期(監視中-消火)ボタン押下
svon_forcesync_idle ダッシュボードの同期(待機)ボタン押下
svon_push_2hourbtn ダッシュボードの2時間タイマーボタン押下
svon_2hour 2時間タイマー満了
svon_autostart_onoff 自動起動ボタン押下
svon_autostart 自動起動タイマー満了
svon_change_autostart 自動起動時間を変更したとき
svon_connect_servo_atmos3 SERVO-ATOMS3がHomeAssistantにONLINEしたとき
svon_connect_sw_atmos3 SW-ATOMS3がHomeAssistantにONLINEしたとき
svon_nhour_interval 2時間タイマー稼働中は1秒毎にトリガーされる
svon_servo_ping SERVO-ATOMS3からのハートビート(毎秒)受信
svon_change_servo_atmos3_lcd_brightness SERVO-ATOMS3のLCD明るさに連動するヘルパー値が変更されたとき
svon_change_sw_atmos3_lcd_brightness SW-ATOMS3のLCD明るさに連動するヘルパー値が変更されたとき

ATOMS3

2つのATOMS3用にHome AssistantのAddOn ESPHome Builderでファームウェアを作成した。
仕様は私が与え、実装は生成AIが行った。
ソースコード中のWiFiパスワードはマスクした。
デバイス 概要
SW-ATOMS3 状態表示と停止・再開(物理)ボタンを持つ。
SERVO-ATOMS3 デジタルサーボを用いてストーブの電源ボタンを押下する。物理ボタンは使用していない。

写真

■ATOMS3とサーボ

■スマホの操作画面

Home Assistantのダッシュボードで基本的な操作を行えるようにした。
下図の左で監視と通常操作を行い、右でリカバリー操作を行う。
HomeAssistantダッシュボード(通常操作) HomeAssistantダッシュボード(リカバリー操作)

Home Assistant備忘

オープンソースに文句を言うのはお門違いということは理解しているが、これだけは言いたい。
  • ダッシュボードの部品の機能が貧弱すぎる。
  • YAMLでプログラムを書くというのは失敗ではないだろうか。割り箸で肉を切るようなものだ。
  • 拡張機能を利用するにはGitHUBのアカウントが必要である。
    叶うるかぎりアカウントは増やしたくないので拡張機能は断念した。
    なぜGitHUBからコードを持ってくるだけなのにアカウントが必要になるのだろうか。
とは言え、Home AssitantやAddonの開発に携わっている方々といらすとやには、このようなシステムを作れる環境を無料で提供して頂けることに感謝の念が絶えない。

残作業

残作業は、下記パラメータの決定である。
まだストーブを使用する時期ではないので、実測と調整は秋になるだろう。

定数 概要
power_threshold ストーブが灯油を燃焼させているときと、そうではないときの電力の閾値
limit_continue, limit_retry_burn 燃焼を開始してから、燃焼したと確定できるまでの時間
limit_continue_putout, limit_retry_putout 消火を開始してから、消火したと確定できるまでの時間

記:2026-08-04


そして初冬

残念なのか喜ばしいことなのか、本システムを使う必要がなくなってしまった。
  1. 20[L]程度の小型の灯油タンクを室内に置き、ここからストーブに燃料を供給することにした。
    これでぼったくり業者の灯油を利用する必要が無くなった。
  2. 自動停止・再開機能が無いと思っていたが、実際はあった。
    ストーブのマニュアルを読んではいたが、見落としていたのである。
本システムは、カウントダウンによるOFFタイマーと時刻指定のONタイマーを実装している。
この両方を満たす機能はストーブに無いが、あると便利な機能ではある。
しかし、このために本システムを稼働させたいと強く思える機能ではない。
動かすべきか動かさざるべきか・・・。多分、動かさないだろう。
ソフトの開発に費やした労力と部材の購入費が無駄になってしまう。さて、どうしたものだろう。
疲れた。

記:2026-11-07