ラズパイ(ubuntu 20.04.4 LTS)に Tailscale を構築

ラズパイにtailscaleを構築した。 tailscaleはWireGuard(VPN)を扱いやすくしたものである(ざっくり) 素のWireGuardも検討したが、マンション住まいのため、上位のルーターの構成が不明で、かつポートを開けたり(知識不足)を下手にやってセキュリティガバガバになるのは嫌だったのでtailscaleにした 環境 ラズパイ 3B+ ubuntu 20.04.4 LTS 32GBのSDカード Tailscale のアカウント作成 何はともあれ、まずはアカウントを作る 参考: https://blog.tsukumijima.net/article/tailscale-vpn/#toc3 githubアカウントでログインした その端末の認証鍵の有効期限を無効にすることができます。 → 無効化した ラズパイに構築する前に、SynologyのNAS(DS118)がTailscaleに対応していたので、先に入れてみた すぐにアクセスできた 簡単すぎてビビった ラズパイのセットアップ まず、OSをSDカードに書き込み 書き込みには Raspberry Pi Imager を使用 https://www.raspberrypi.com/software/ 空だけど、何となく erase してから書き込む こちらを参考(↓)にしてwolサーバとしたかったのでubuntuにした https://macoshita.me/posts/wi-fi-router-and-tailscale/ ubuntu はラズパイ 3B+ なので、32bit armhf lts安定版 とした 初回セットアップはこちら(↓)を参考 https://takaken.tokyo/dev/raspberrypi/raspi_ubuntu_setup2004/ 習って、rootパスワード変更まで実施 有線だけで使うため、無線LANは無し(コメントアウトした) Tailscale のインストール 参考: https://tailscale.com/download/linux/ubuntu-2004 tailscale ip -4 か ip addr show tailscale0 で、ipがわかる でもipアドレスはtailscaleのページ(https://login.tailscale.com/admin/machines)でわかるから、コマンドを打たなくてもいいか ラズパイを再起動して、tailscaleが自動起動することを確認した 確認は、上記のtailscaleのページでactive(緑色の丸)になっていることからわかる exitnode の設定 ずっと電源入れっぱなしにしても大丈夫なラズパイをexitnodeに設定する VPNを野良Wi-Fiをセキュアにするために使いたいなら exitnode の設定が必要 exitnode経由にしてなかった時は、接続先がいなくてもVPN接続ができていた おやっ、VPNって2拠点間を繋ぐものなのになんで接続ができて(VPNがactiveになる)るんだ?って思ってグローバルipを確認したら、VPN接続前後でグローバルipが変わってなかった...

2022/06/26 Â· Last updated on 2023/09/22 Â· 1 min Â· 123 words

ラズパイを WOLサーバ にする

こちらの記事で紹介したようにtailscaleを使ってラズパイをVPNサーバとして使っていますが、VPNできたら当然自宅NASにもアクセスしたくなりますよね でも、以前書いたようにNAS(DS118)は常時電源を入れていないので、使うときには起こす必要があります ですので、必要な時にNASを起こせるようにラズパイをwolサーバに仕立てます NAS(DS118)のwolを有効にする 使っているNAS↓ まず、NASがwol信号を受け付けられるように、wolを有効にします https://support.ask-corp.jp/hc/ja/articles/360051678474-Wake-on-LAN-を設定したい ラズパイに WOLサーバ を建てる 参考(大感謝!) 構成は Flask + uWSGI + Nginx となっています ラズパイのCPU温度とクロック周波数を追加していますが、すべてそのまま使わせていただきました 便利に使えており、大変感謝しております! 構築に関して、自分のつまずいた点などを書いています 出来上がり見た目↓ pip install -r requirements.txt のインストール方法 https://note.nkmk.me/python-pip-install-requirements/ 文字化けしたがインストールできたっぽい たぶんteratermの設定のせいで文字化けした 起動など ファイルは大体をPCで作って、FTPソフト(filezillaを使用)でラズパイに転送し、手直しはSSH接続して直接ファイルを弄った ubuntu@ubuntu:~$ pwd /home/ubuntu /home/ubuntu の下にファイルを作って配置する サービス起動 sudo systemctl start wakeonlan-server サービス自動起動(起動時) sudo systemctl enable wakeonlan-server 実行したのでbootで自動実行される サービスのステータス確認 sudo systemctl status wakeonlan-server active(running)になっているのでおけ プログラム(wol.py)のエラー箇所もわかる ValueError(“Incorrect MAC address format”) が出ていることがわかった たぶんwol.htmlから変数(MACアドレス)をwol.pyに渡す時におかしくなってるのだが、検証できなかった なので、MACアドレスを直書きすることにした(当面は同じNASしか使わないし) MACアドレスは:で区切る # wol.py 一部抜粋 def wol(): # addr = request....

2022/06/26 Â· Last updated on 2023/09/22 Â· 1 min Â· 113 words

【ラズパイで猫ちゃんカメラ】その6 LINE NotifyのAPI制限を確認する

前回 前回はpythonで定期的な動作を実装しました。 これで例えば10分毎に撮影し、画像をLINEすることができます。 今回 LINE NotifyのAPI制限を確認します。 画像のアップロード枚数制限やAPIのコール回数制限があります。 テストで画像を送りまくっていると制限にかかり、送れなくなります。 突然送れなくなるので、注意が必要です。 APIコール回数は1000回ですのでそうそう消費しないと思います。 ですが、画像のアップロード枚数制限は50枚(1時間あたり)です。 案外すぐ達してしまうのでモニターすることをオススメします。 ドキュメントのAPI Rate Limitに記載があります。 各サービスごとに1時間にAPIをcallできる回数の上限が設定されています。 デフォルトは1000回に設定されています。 上限はaccess tokenごとに設定されています。 API Rate Limitのstatusは、APIの以下のresponse headerで確認することができます。 API Rate Limitの確認方法 こちらを参考にさせていただきました。ありがとうございます(^^) # line-notify-limit.py import requests token = 'あなたの取得したトークン' api = 'https://notify-api.line.me/api/notify' message = '\n\nLIMIT CHECK' headers = {'Authorization': 'Bearer'+' '+token} data = {'message': message} resp = requests.post(api,headers=headers,data=data) print(message) # APIコール残 ratelimit = resp.headers.get("X-RateLimit-Limit") # max API call ratelimit_remaining = resp.headers.get("X-RateLimit-Remaining") # API call remaining print('API call remaining : {} / {}'....

2021/10/19 Â· Last updated on 2023/09/23 Â· 1 min Â· 131 words

【ラズパイで猫ちゃんカメラ】 その5 10分毎撮影しLINEに送信する【python】

前回、LINE Notifyを使って簡単に画像を送ることができました。次は、定期的にLINEに画像を送る下準備として、定期的に動作させる方法を考えてみたいと思います。 pythonでプログラムを書いていきます(^o^) 構想だけ(というか実装できる気がしない) こちらの記事を参考にして、10分ごとに写真を撮り、前回写真と差分があればLINEする というのも考えました 送る画像を減らせてAPIの節約になることと、猫の動きがわかるメリットがありますが、日暮れで暗くなった場合にしきい値が変わるので誤って撮ってしまいそうでした ですので、実装やめました(てかできない) なので、変化ありなしに関わらず、10分ごとに写真を撮ってLINEすることにします time.sleep()はイマイチ イマイチというのは、今回の用途には合わないということです 真っ先に思いつくsleepは例えば10分止める場合は以下のように書けます import time time.sleep(600) # 600秒(=10分)スリープ イマイチなところは、処理を止めてしまうのでその間に他のことができなくなってしまうことです お安いWEBカメラ 10分スリープして、直後に撮影をすると画像が真っ暗になりました お安いWEBカメラにはシャッター時間を長くとって明るさを確保しないと画像が暗いということがよくあるようですが、私の数年前のWEBカメラも漏れずそんな感じみたいです 撮影する少し前に起動して、明るくなったら撮影する必要があります というわけでsleepは却下〜 起動処理は以下記事内にあるこの文↓ ret, frame = capture.read() タイマー割り込み? → 無い😇 別の方法としてタイマー割り込みを考えてみます 割り込みであればメインループでカメラを起動しておき、時間が来たら割り込みの処理を実行する(撮影する)ため明るさの問題は回避できそうです 10分毎に割り込み処理が入るようにすれば、10分毎の動作が可能です し・か・し どうやらラズパイにはタイマー割り込みがない模様・・・(pythonで書く場合) こちら↓の方が質問をされています 残念〜 python以外(Cとか?)で制御するならできなくは無さそうですが、敷居はとっても高そうです 割り込みはありますが、外部入力でGPIOに変化があったことをトリガーにする動作なのでタイマー割り込みではありません メインループ内で時間を測る 割り込みが使えないので、正確な時間は測れ無さそうです ですが、10分毎に動作のように分オーダーの時間であれば数秒程度の誤差なら全く問題にならなそうです というわけで、メインループ内で時間を測ることにしました import time old = time.time() # 現在時刻取得(sec) while(True): # main loop time0 = time.time() # 現在時刻取得 delta = time0 - old # 差分 if delta > 600: # 差が600sec(=10分)以上だったら print(delta) # 確認 old = time0 # 古い値を保持 はじめにoldに現在時刻を取得して格納します...

2021/10/05 Â· Last updated on 2023/09/23 Â· 1 min Â· 90 words

【ラズパイで猫ちゃんカメラ】 その4 ラズパイからPythonでLINEする(メッセージ、画像)LINE Notify

前回、Twitterのデベロッパーは却下されてしまったので別の方法を模索する中、LINE Notifyを使ってみることにしました。 こちらはAPI取得が楽ちんです。 自分のLINEや、LINEグループに画像を送るだけの今回のような用途には、こちらの方が適しているかもしれませんね! トークンの取得 こちらでトークンを取得します iPhoneからだとアクセストーン発行ボタンが見えませんでしたが、デスクトップモードにしたら見えました ご注意ください(^^) ドキュメントを見ると、トークンは一人当たり100個までのようです まずはメッセージを送ってみる【Python】 まずはメッセージだけを送ってみたいと思います プログラムはこれだけ↓ import requests token = 'あなたの取得したトークン' api = 'https://notify-api.line.me/api/notify' message = 'Hello!! message check!!' # 辞書型で記載 headers = {'Authorization': 'Bearer'+' '+token} data = {'message': message} requests.post(api,headers=headers,data=data) たったこれだけでメッセージが送信できてしまいます 「あなたの取得したトークン」と書かれているところに、取得したトークンを記載します 本当は、トークンはOSの環境変数において読み込んだほうが良いらしいですが、ここではしません(以下参照) 次に画像を送ってみる【Python】 カメラ画像を送りたいので、これが本来の目的です jpeg画像を用意して、以下のプログラムを実行すればLINEに画像を送ることができます ここでは、ラズパイのデスクトップにtest.jpegという画像データをおいて、それを送信します 画像だけを送ることはできないようです(メッセージとセットで送る) import requests token = 'あなたの取得したトークン' api = 'https://notify-api.line.me/api/notify' images = '/home/pi/Desktop/test.jpeg' # 画像のフルパスを記載 形式はjpgかjpegかpng message = 'Send image!!' # 辞書型で記載 headers = {'Authorization': 'Bearer'+' '+token} data = {'message': message} files = {'imageFile': open(images,'rb')} # バイナリ形式(テキスト以外) requests....

2021/09/15 Â· Last updated on 2023/09/23 Â· 1 min Â· 97 words