@switchbot/openapi-cli がいい

Switchbotのセンサーの情報をWebhookを使って取っていたのですが、SwitchbotのCLIコマンドがありまして、

github.com

これを使うと、センサーの値に変更があったとき受けることができるのでした。

コマンド的にはこれだけ。

switchbot events mqtt-tail

このコマンドは実行したら終了はせずにイベントを待ち受け、センサーの値が変更されたら標準出力にセンサー情報が出力されます。いいですねぇ。これがあればポーリングせずとも、ほぼリアルタイムでセンサー値を得ることができます。

今はWebhook と AWSのLambdaでWebSocketを使って家のラズパイでセンサー値の変更を受けているのですが、上のCLIコマンドを使えば代替できるかも。

osamuk.hatenablog.jp

AIに おんぶにだっこ でInfluxDBからVictoriaMetricsに移行

ラズパイCM5を買ったけど、移行には踏ん切れないでいた。旧ラズパイでInfluxDB v2を使っていたいのだが、Influx v3がラズパイ向きじゃなさそうだった。新しい物好きの私としては、InfluxDB v3が出たのにInfluxDB v2を使い続けるのは嫌だ。移行先は色々調べて、省メモリらしいのでVictoriaMetricsを使ってみることにした。移行するにあたっては、時系列DBのスキーマがInfluxDB流とVictoriaMetrics流(というかPrometheus流)が違う。本家にしっかり説明があって助かる。 それに対応するとき、InfluxDBからVictoriaMetricsになるべく変更なくデータを移すのではなく、しっかりネイティブ流にしたい派なので、どんなふうにするか悩んでいた。他にも移行にはそれなりに作業が必要で手間もかかりそうで腰が重くなっていた。

そうだ、AIに相談しよう。

まずは複数のAI(無料版だけど)にInfluxDBから移行先について相談したら、おおむねInfluxDBからVictoriaMetricsに移行は賛同してもらえた。AI相手だけど、ちょっと嬉しい。さらにスキーマをVictoriaMetricsの流儀にしたいと相談したらそれも教えてくれた。そこからはAIにチャットで相談/依頼して作業を進めることにした。InfulxDBの既存データをVictoriaMetricsにデータ移行する手順とスキーマ変換のコードも書いてくれた! あと、InfluxDBのデータはGrafanaでグラフ化していたのだが、VictoriaMetricsに移行したらGrafanaからのクエリも変更になる。それもAIに相談したら、GrafanaからInfluxDBのダッシュボードjsonをAIに見せてあげればVictoriaMetrics用に書き換えてくれるという、えらいぞAIくん。
さらに、 osamuk.hatenablog.jp 上のために動いていたスクリプトもVictoriaMetrics用に変更が必要になるのだが、それも頼んだらやってくれちゃった!すごいぞAIくん。

コーディングやコード変更を伴う作業は、ClaudeのAPI課金(モデルClaude Opus 4.6)でやりました。優秀だった。一人でやってたら何倍も時間がかかったと思う。お安いモデルSonnetを使おうと思ってたのに気づいたらOpusを使いたおしていた(アブナイ)。でも一連の作業で料金はClaude Proサブスクリプション一月分よりは安くできました。

そんなわけで、半年以上停滞していたラズパイCM5移行が、AIに おんぶにだっこ して一気に進んだのでした。
ただAIに頼り切ったので当然ながらVictoriaMetricsの知見はあまり私に残らない感じ...。でもまあ、とにかく動いたから、それはそれでいいや。

Raspberry Pi Compute Module 5(CM5)+ 公式IOボード

家の電気と温湿度をRaspberry Pi 3BでInfluxDB v2とGrafanaで記録とグラフ化できるようにしているのだが(このあたり)、昨年 Raspberry Pi Compute Module 5(CM5)+ 公式IOボード に移行しようと思い立った。あと時系列DBはInfluxDB v2からVictoriaMetricsに移行しようと思っていた。

この辺りを参考に必要なものを買い揃えたのは2025年8月。でも実際に乗り換えたのは今頃(2026年3月)になってしまった。(時系列DBの移行どうしようとか考えて腰が重かっただけ。)

gigazine.net

gigazine.net

一点、上の記事などによると、純正のヒートシンクとクラーファンを両方取り付けるとケースが閉まらないようなので、代わりにこれを探して買った。これ装着して公式I/Oボードのケースもちゃんと閉まりました。

www.marutsu.co.jp

ハードはそろった。次はInfluxDB v2 + Grafanaだった電力/温湿度ダッシュボードを、VictoriaMetrics + Grafanaにデータと実行環境を引っ越すのですが...、その後半年以上、RPI CM5は起動したけど何もしないままになったのだった...。

AirMac Time Capsule(第3世代) に、さよならする

10年以上使っていたAirMac Time Capsule 第3世代に、とうとう、さよならする時が来た。

別に壊れたわけではなく、Time MachineのストレージとしてAirMac Time Capsuleを使えるのはmacOS Tahoeが最後のサポートとなるらしい。すでに自分のMacBook Airにもその旨警告が出ている。名残惜しいが、さよならすることにした。

osamuk.hatenablog.jp

Time Machine用に使っていたので正直普段は存在を忘れているほどだったのだが、Appleらしい使いやすさが好きだった。

PowerShellでWin11のマウスポインターのサイズ変更

[Edit2026/02/22] SystemParametersInfoの第3引数の型がおかしかったので修正。

Win11環境でマウスポインターのサイズをPowerShellで変更しようとした。検索するとSystemParametersInfo()でやる方法がすぐ出てくる。でも実際やってみたら、マウスポインターのサイズが即時反映されなくてログインし直さないと反映されなかった。さんざん調べた結果、ポインターサイズを即時反映させるには、MSの公式SystemParametersInfo()関数の説明には無いけど第1引数に 0x2029 を指定したらできたよ。("SystemParametersInfo" "0x2029"でググると見つかると思います)

こんな感じ。IntPtr型引数に直接整数を渡すのは違和感だけど、第3引数の型は何でもありの使い方されるので、これでイイのだ。

Add-Type –MemberDefinition @"
    [DllImport("user32.dll")]
    public static extern bool SystemParametersInfo(int uAction, int uParam, IntPtr pvParam, int fuWinIni);
"@ -Name "User32" -Namespace "Win32Functions" -PassThru

$cursorSize = 32
[Win32Functions.User32]::SystemParametersInfo(0x2029, 0, [IntPtr]$cursorSize, 0x02)

SwitchBotの防水温湿度計のデータをS3に保存できたので、さらに自宅ラズパイにWebSocketでプッシュしてGrafana+InfluxDBで表示したい

これまで、SwitBotの温湿度計を使って自宅の各所の温度湿度をAWSのS3にストアするようにできてました。

osamuk.hatenablog.jp

osamuk.hatenablog.jp

で、その温度湿度計測データをS3保存だけでなく、自宅ラズパイでGrafana+Influxdbのダッシュボードに表示できるようにしようと。
今回もほぼ全編他力本願で作り、結果こんな感じにできました。

これを作るにあたって、せっかくSwitchBotのWebhookでデータ更新のあったタイミングで通知してもらえているので、ラズパイ側からポーリング的にデータを取りに行くのではなく、WebSocketでAWS側から自宅ラズパイに計測データをプッシュするようにしました。

AWSでWebSocket使うにはAPI GatewayとLambdaの組み合わせで実現できます。このあたりを参考にさせていただきました。

Amazon API Gateway の WebSocket API を理解する | Fintan

チュートリアル: WebSocket API、Lambda、DynamoDB を使用して WebSocket チャットアプリを作成する - Amazon API Gateway

上のAWSのチュートリアルはWebSocketクライアントとの接続情報を覚えておくのにDynamoDBが使われています。でも私の使い方ではWebSocketクライアント自宅ラズパイ1つだけなので、クライアントの接続情報はS3にファイルで保存してます。このLambda関数内でSwitchBotの計測データを受けて自宅ラズパイのWebSocketクライアントにプッシュするところを作っておきます。

ラズパイ側もPythonで実装していて、WebSocketのライブラリはwebsocket-clientを使いました。

ラズパイで受けたデータはInfluxDBにストアします。このあたりを参考にさせていただきました。

Pythonで収集したデータをInfluxDBに格納してGrafanaで可視化する #Ubuntu - Qiita

ここまでWebSocket用のLambda関数で自宅ラズパイとの通信ができるようにできたので、あとは、前回までで作ったSwitchBotのWebhookを受けるためのLambda関数でS3にデータ保存してたところに、今回作ったWebSocket用のLambda関数の呼び出して温度湿度計測データを渡すところを追加しました。こちら参考にさせていただきました。

AWS LambdaからLambdaを非同期で呼び出す(Python) #Python3 - Qiita

呼び出しLambda関数側の設定で他のLambda関数を呼び出すためにはポリシーで権限を与える必要があるところは注意点ですね。

"Action": ["lambda:InvokeFunction"]

生徒,学生さん向けのプログラミング講義動画を見た

一休の伊藤直哉さんが若者向け講義をする動画があったので、ちょうど個人的に今時の高校生,大学生くらいの人はプログラミングはどの程度のレベルのことを学習するのか興味があったこともあり、自分はおじさんだけど一気見してみた。 nnn.ed.jp