ホーム » コンピュータ (ページ 5)
「コンピュータ」カテゴリーアーカイブ
Switchbot Plug の制御
電気毛布が必要な時期、外出時の電源を切り忘れるのを防ぐために、昨年導入していた Switchbot Plug 。
スマホの SwitchBot アプリのタイマー機能で朝に強制オフの制御していたけど、寝る時にスイッチを入れるのは、自分が不在の時だとムダだし、homebridge や cron で制御するのも面白そう。
switchbot-utility のインストール
ということで、Raspberry-Pi に、switchbot-utility をインストール。
((( 事前にSwitchbot アプリは設定済み ))) $ sudo pip3 install switchbot-utility $ cd /usr/local/lib/python3.9/dist-packages/switchbot_utility
制御するには、Switchbot アプリのトークンと秘密鍵が必要なので、アプリを起動して「プロフィール」、「設定」の画面を開いて、「アプリバージョン」の表示を 10 回連打すると、「開発者向けオプション」を表示できる。この画面を開いてトークンとクライアントシークレットをコピーし、上記の switchbot_utility のフォルダ内に、settings.json のファイル名で保存。
Python で以下のスクリプトを実行すると、switchbot-utility で扱えるデバイスの一覧 deviceList.txt が作られる。
((( settings.json ))) // Switchbot アプリで取得したトークンとシークレットを、 // switchbot_utilitiy のフォルダに settings.json で保存しておく { "token": "xxxxx....", "secret": "yyyyy...." } ((( devicelist.py ))) // Python で以下のスクリプトを実行すると、deviceList.txt が作られる。 // 以下を devicelist.py で保存し、python3 devicelist.py で実行! from switchbot_utility.switchbot import Switchbot switchbot = Switchbot() switchbot.devicelist() ((( deviceList.txt ))) 441793xxxxxx, 電気毛布, Plug, 000000000000 C5B496xxxxxx, エアコン, Bot, 000000000000
実際に、Switchbot Plug を動かすために、下記のscriptでスイッチを制御できるようにしてみた。
#!/usr/bin/python3 # -*- mode: python; coding: utf-8; tab-width: 4 ; -*- # SwitchBot をON/OFFする import sys import time import os from switchbot_utility.switchbot_plug import SwitchbotPlug # ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ # 制御するSwitchBot に合わせて、上記~~~ を書き換える。 sb_dir = '/usr/local/lib/python3.9/dist-packages/switchbot_utility' # Switch Bot Plug MAC ADDR # deviceList.txt 調べた MACアドレスを記入 sb_plug_macaddr = '441793xxxxxx' # コマンドライン引数プロセス名 script_file_name = sys.argv.pop( 0 ) # コマンドライン引数 -d <デバイスID> while len( sys.argv ) >= 2 and sys.argv[0] == '-d' : sys.argv.pop( 0 ) sb_plug_macaddr = sys.argv.pop( 0 ) # setting.jsonを読み込むため os.chdir( sb_dir ) # SwitchBot Plug に接続 sb_plug = SwitchbotPlug( sb_plug_macaddr ) # ~~~~~~~~~~~~~ この部分に制御対象用のコンストラクタを書けばいい if len( sys.argv ) == 0 : # 引数なしは、状態を表示 print( sb_plug.get_power() ) elif len( sys.argv ) == 1 : # status | on | off | toggle or turn arg = sys.argv.pop() if arg == 'status' : # exitでスイッチ状態を返す sys.exit( 0 if sb_plug.get_power() == 'on' else 1 ) elif arg == 'on' : sb_plug.turn_on() # ON elif arg == 'off' : sb_plug.turn_off() # OFF elif arg == 'toggle' or arg == 'turn' : # スイッチを反転 pw = sb_plug.get_power() if pw == 'on' : sb_plug.turn_off() elif pw == 'off' : sb_plug.turn_on()
このプログラムを、homebridge-cmdswitch2 の設定に加える。
{ "platform": "cmdSwitch2", "name": "cmdSwitch2", "switches": [ { "name": "電気毛布", "on_cmd": "/usr/local/bin/switchbot-plug.py on", "off_cmd": "/usr/local/bin/switchbot-plug.py off", "state_cmd": "/usr/local/bin/switchbot-plug.py status" } ] }
ということで、「OK Google, 電気毛布を点ける」でON、朝は起床時間にあわせたタイマーでOFF完成。
空気品質センサーの挙動
空気品質センサー CCS811 を設置しているけど、夜中だけ値が上がるのなぜなんだろうなぁ?
このセンサーは、CO2センサーといいながら、有機ガスでCO2値を予想するタイプなので、灯油ストーブを使う季節になると、気化した灯油で値が高くなる。ストーブが点いているいる時は、有機ガスを燃焼させるのか値が下がる。だから、夜中はセンサー値が上がっていく。ただ、仕事で不在でストーブを使っていない時間にも値があがるはずなんだけど、夜中ほどじゃないんだよなぁ~!?!?
ウィルスバスターのライセンス追加購入
自宅では、ウィルスバスターのライセンスを家族で使ってる。最近あ~の新しいPCが増えたけど、マカフィーの無料ライセンスが切れアンインストール。でも、早々にウィルス感染を警告する詐欺のポップアップ広告を踏んだみたい。PCに慣れてれば標準Defenderでもなんとかできるかと思ってたけど、やっぱり対策ソフトは必要かな。
ウィルスバスターは1ライセンスで3台使えるけど、ママPC, あ~古PC、あ~スマホと使い切ってるし、お古のPCもまだそれなりに使ってるみたいだし、追加ライセンスを購入することにした。その結果、あと2台使えることになったので、自分のPCにも久々にウィルスバスターをインストールとなった。Windowsの標準Defenderでなんとかなるけど、たまに、うざぃポップアップ広告を踏むたびに、履歴削除とか面倒だったし。
Raspberry Pi のUSB電源ケーブルを交換
MZ80C筐体の Raspberry-Pi に温湿度センサーBME280をつけてトイレに置いてあるけど、ボードを Raspberry-Pi 3 model A+に替えたら、電圧不足の記録が残ってて週に1度のペースでフリーズしてる。USBの電源アダプターも2A以上だせる物に替えても効果なし。ただ、USB電源ケーブルの長さが足りなくて、古いUSB延長ケーブルを挟んでいるんだけど、これが怪しいのかな。長い太目のUSB電源ケーブルに交換し、延長ケーブルを取り外す。効き目あるかな。
交換して半日たったけど “vcgencmd get_throttled” を見ても、電圧低下の警告が出ていない。効果ありかな。
(追記)2日間運用して、電圧低下の警告が1度も発生していない。これで安心
google-home-playerをインストール
Raspberry Pi で動かしていた homebridge だけど、nodejs.20.x が出ているとのことで、更新をかけた。しかしこの反動で、google-home-notifier が喋らなくなった。以前より google-home-notifier の内部で利用している google-tts-api のバージョンがあがると動かなくなるトラブルが発生していた。この状況下で、この後継となる google-home-player が出ているので、これを契機に乗り換え。
google-home-player のインストール
google-home-player を使うと、Google Home mini, Google Nest mini で自然なに英語や日本語をしゃべらせることができる。
$ sudo npm install -g google-home-player
Rapberry-Pi の更新で GPIO が動かない
64bit OS の arm64 で動かしている Raspberry-Pi で、rpi-update を実行したら、kernel が Linux 6.1.61-v8+ となり、自作スクリプトのいくつかが動かなくなった。原因は wiringPi や GPIO など絡んだ処理の中では、/proc/cpuinfo にアクセスして “Hardware” を取得しその値に合わせてアクセスするポートなどを切り替えているみたい。しかしながら、linux-6.x になったら /proc/cpuinfo で Hardware 情報が取れなくなったため、wiringPi, GPIO関連のプログラムが動かなくなった。
BME280 温湿度センサーを GPIO 経由から ioctl() から I2C を制御する処理に書き換え
$ ./bme280 Oops: Unable to determine board revision from /proc/cpuinfo -> No "Hardware" line -> You'd best google the error to find out why.
参考にしていたプログラムが wiringPi 経由で I2C 接続の温湿度センサー bme280 を使っていたけど、仕方がないのでプログラムを修正し、ioctl() 経由に修正。
bit 演算が多用されていて、unsigned char と char の宣言を手抜きしたら、異常値が出るようになった。char型の部分を unsigned char に修正したら、大きな値にずれる異常値はなくなった。でも、その後も時々小さな値となる異常値が発生した。どうも nagios やら munin で監視していると時々同じタイミングで bme280 の値取得の処理が起動されるようで、I2C デバイスの競合が発生していると思われた。このため、I2C デバイス /dev/i2c-* を開く際に flock() による、排他処理も追加した。
OLED ディスプレィ SSD1306 の処理を Adafruit_CircuitPython_SSD1306 に変更
Adafruit_Python_SSD1306 を使って表示させていた処理が動かなくなる。内部で WiringPi などを使っているのか “RuntimeError: Could not determine platform…” といったメッセージが出て動かなくなる。これも GPIO あたりのトラブル。調べていると Adafruit_CircuitPython_SSD1306 なら動きそう。
$ sudo pip3 install adafruit-circuitpython-ssd1306
若干のプログラム修正で動くようになった。
自宅PCに指紋認証USB
職場のノートに指紋認証ついてて便利だし、自宅のPCにもUSBドングルを付けてみた。
Windows付箋アプリを使い始める
仕事で締め切り仕事の対応漏れしちゃうことを防ぐために Google の ToDo アプリを使っていたが、Windows の重要メールのマークによる ToDo も便利だし職場アカウントを使っていれば簡単に確認できる。ただ、両方使っていると、Google の ToDo 側に記載していることを忘れてしまいがち。常にデスクトップに表示できるような ToDo が欲しいと考えていたけど、これはまさに Windows の付箋アプリ。ということで、付箋を使い始めた。
メールによる ToDo との統合という意味で、職場の Windows アカウントにて付箋を使い始めたけど、職場アカウントは自宅からの利用だと頻繁に認証がかかり、同期切れが簡単に発生する。常に参照できる状態が欲しいのでここは統合はあきらめて、live.jp の個人アカウントの付箋に移行する。
スマホでもこの付箋を参照するには…と思ったけど、iOS のメモアプリで、単純に live.jp のメモ機能を有効にするだけだった。
gcalcli が dpkg_resources is deprecated…の警告
gcalcli を使っている自作スクリプトが、以下のような警告メッセージを吐くようになった。
$ gcal.pl /usr/bin/gcalcli:6: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html from pkg_resources import load_entry_point
python で dpkg_resources が廃止されたことによる警告。調べてみたけど、現時点では他の python のプログラムでも同様のエラーが出てるみたい。ひとまずは標準エラーに出力される警告なので、自作スクリプトには、gcalcli を呼出す処理の後ろに “2>/dev/null” をつけて黙らせた。
debian trixie/testing
最近、aptitude safe-upgrade かけてもパッケージの更新が少ないなぁ…と思ってたけど、bookworm は 6 月に stable になってたのね。
気づかず半年間、寝かせていたからか testing/trixie で大量の更新がかかったけど、競合ですぐに更新されないパッケージもあったけど、半年の間に testing といえども安定していたのか、トラブル無しで更新が終わった。
debian trixie/testing
以前、apt/souces.list.d を stable と testing で記述してたけど、更新のタイミングを見逃すと、急に大量の更新がかかってびっくりしたので、bullseye とか bookworm とかで記述するようにしていた。
/etc/apt/preferences が邪魔をしているかと思って消して更新かかったけど、大した量じゃなかったし。
linux 6.1 to 6.5
testing を追いかけていなかったから、linux-image も 6.1.0-13 から 6.5.0-2 にジャンプアップ。