ホーム » 「Raspberry Pi」タグがついた投稿
タグアーカイブ: Raspberry Pi
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完成。
raspberry-pi のディスク容量増
自宅内の色々な処理(温湿度モニタリング, 家電リモコン制御, homebridge)をさせている、Raspberry-Pi のディスク容量(8GB) の容量が不足してきた。大した処理はしていないし、不要なパッケージは消していたけど、homebridge などを使っていたりで、ギリギリになってきた。
Raspberry Pi の SDD交換&拡張
しかたがないので、32GB SDD を買ってきて、イメージファイルでコピーを行う。
((( 元のraspberry-piのイメージ吸い出し ))) $ sudo dd bs=4M if=/dev/sdd of=~/rpi.img ((( 新しいSDDにイメージを書き戻し ))) $ sudo dd bs=4M if=~/rpi.img of=/dev/sdd ((( 新しいSDDでraspberry-piを起動し ))) $ sudo raspi-config --expand-rootfs
フレームバッファ出力で電力不足?
ラズパイの状態表示を出力させてみたけど、このあとからか、Raspberry-Pi が Under-Voltage 警告が増えたみたい。そして、よく落ちるようになってきた。
HDMI 出力をすることで、電力不足だと思われる。homebridgeさえ動いていればいいので、状況表示はもともとそんなに使うはずでもないので、早々に出力の処理は止めた。
素直に大電流ACアダプタ
ACアダプタをこれ以上増やしたくないと、ルータの USB-3.0 端子から、homebridge用 Raspberry-Pi に給電していたけど、不安定なのは困る。RPi 3 用と書いてある AC アダプタを購入して取り換え。Under-voltage の警告は出なくなったな。当然か。
1日間で700回ほど出力されていた、電圧低下の警告がキレイさっぱりなくなった。当然か…(^_^;
ラズパイのフレームバッファ出力
家電制御とhomebridge専用のRaspberry-Piだけど、HDMI制御用にテレビに繋がっているし、ラズパイの動作状況なりを出力させられないかと思っていた。
X11 の GUI の autologin を使うのが定番だろうけど、X11 が動いているだけで、OS リソースをかなり食っちゃうので、あまりやりたくなかった。
でも、フレームバッファ出力で映像を出すための fbi コマンドをみつける。
そこで、wkhtmltopdf パッケージの wkhtmltoimage コマンドを使って、状況表示のページをキャプチャさせ、その画像を fbi コマンドで、フレームバッファ表示させてみた。
/usr/bin/wkhtmltoimage --width 1200 --height 800 \ -q 'http://www.example.co.jp' /tmp/web.png /usr/bin/sudo /usr/bin/fbi -T 1 -d /dev/fb0 --noverbose \ /tmp/web.png > /dev/null 2>&1
HomeKit/homebridgeをラズパイで再開
一時期、google home notifier のインストールで削除した Siri を使うための HomeKit 互換の homebridge を raspberry-pi の上に再インストールを行った。
Google Home Mini を喋らせるためにインストールした google home notifier では、node.js を使うため(あとで問題がないと分かったけど)に、一旦機能を止めていたけど、機能の競合の起こりにくい raspberry-pi に暇つぶしも兼ねて homebridge を入れる。
インストールにあたり、赤外線リモコンの制御の python-broadlink を raspberry-pi にインストールしたので、単独でテレビのON/OFF/ビデオ入力切替の cec もあるから、サーバを活用しなくても済む。
手順は、過去の自分のインストールメモを参考。ちょっと手間取ったけど。
ということで、
- テレビ,チューナー,PS4のON/OFF
- 2つの照明のON/OFF
- 室内/室外の温度計の表示
が、Hey, Siri で可能。
ラズパイのインタフェース名
自宅の raspberry-pi の設定を触っていて、何気に raspi-config を起動して設定を確認していたら、適当にポチポチさわってて、Network Options, N3 Network Interface Names の設定を触ったようで、再起動がかかったらネットワークがつながらない。
しかたがないので USBキーボードとHDMI のモニタつなげて、直接設定を触ろうとするものの、HDMI に信号が出てこない。
これでは、設定を触ろうにも何もできない。
raspi-config を使わないで設定を変更
もう raspberry-pi 単独では触りようがないので、micro-SD を外して、母艦のサーバで 起動時の設定を触ることとした。
間違って触った Network Interface Names は、古い eth0 などのインタフェース名でなく、enx112233aabbcc みたいな MAC アドレス を交えた新しいインタフェース名を使うような設定(predictable interface naming)。この機能が動き出したおかげで、インタフェースの初期化に失敗している。この設定を戻さないと。
$ sudo bash ((( raspberry-piの/bootフォルダをマウント ))) # mount -t vfat /dev/sdd1 /mnt デバイス名/sddの部分は要変更 ((( predictable interface naming を無効化 ))) # vi /mnt/cmdline.txt net.ifnames=0 ファイル末尾に追加 ((( sshサーバ機能を有効化 ))) # touch /mnt/ssh ((( HDMI の出力を有効化 ))) # vi /mnt/config.txt hdmi_safe=1 先頭の方のこの行をコメントアウト 低解像度のsafeモードでHDMIを設定 # umount /mnt ((( raspberry-piのrootをマウント ))) # mount -t ext4 /dev/sdd2 /mnt ((( ネットワークの設定ファイルを変更 ))) # vi /mnt/etc/dhcpcd.conf ...
んで、母艦で編集していた micro-SD を raspberry-pi に差し戻して起動。
Raspberry-Pi のファーム壊れた
Raspberry-Pi、ネットワーク越しに rpi-update してた途中でWiFi中継器のネットワークが切れてしまった。おかげでファームウェアの更新に失敗。どうもファームウェアがぶっ飛んだようで、起動しなくなった。タイミング最悪。
その RPi は、ITオンチな1F両親向けに、家族の予定をLED掲示板に表示させてるために使ってた。でも、買い替えるといっても RPi4 買うほどの処理じゃないしな。
難しい話抜きで、Google Nest 買った方が便利かな。でも、OK,Google、使いこなせないだろうしなぁ…
iphoneの検知難しい
大学でアパート住まいの子供が、帰っているのか確認するために、LINE beacon を置いて検知を試したけど、bluetooth を切って既読スルーなヤツなので、ほとんど検知することができない。
そこで、アパートでは無線LANルータを使ってるし Raspberry-Pi で、arpalert を使えば簡単に検知できるだろうと、実験中。でも iPhone はセキュリティ対策なのか、 arp の返答は必要最小限なので同じサブネットとはいえ、そのままでは通信の必要の無い raspberry-pi には、ARP 情報が送られてこない。また ping には返答しないようで、単純に ping で確認も困難。ということで単純な arpalert では検知が難しいなぁ。
定時処理で、”arping -c 1 -I wlan0 IPHONEのIPアドレス” を実行させて、強制的に ARP を送ってもらうか…
stretchで起動しづらい
自宅で色々と動いている Raspberry-Pi 。OS更新はまめにやっているけど、外気温測定に使っているのが Jessie のままだったのに気づく。stretch に上げたけど、どうも起動に失敗する。更新に失敗したかと思ったけど、キーボードをつなぐために USB WiFi を抜いて起動すると、普通に動いている。
今までも、多少 boot が不安定なのはあったけど、stretch になって起動シーケンスが最適化されたのか、WiFi 有効化のタイミングが早まり、ブート時の電力不足が発生していると思われる。
ひとまず、改造面倒だし USB WiFi を抜いて、boot がそれなりに進んでから USB を指して対応。