自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

自宅で開発・導入しているIoT機器や機能を晒してみる

多分生まれつきとにかく楽をしたい気持ちが強いが、GoogleアシスタントとAlexaなどの音声アシスタント、超小型の低消費電力コンピュータのRaspberry Pi、便利なIoTデバイスの登場がそれに拍車をかけた。

もしかしたら誰かの参考になるかもしれないので晒してみる。

  • 自動でSlackへ通知→GoogleHomeで読み上げ
    • お父さんが会社から出たらSlackへ通知→GoogleHomeで読み上げ
    • お父さんが自宅の半径100m以内に入ったらSlackへ通知→GoogleHomeで読み上げ
    • Slackへ定時投稿→GoogleHomeで読み上げ
  • スマートロック
  • Googleアシスタントコマンド
  • ペアレンタルコントロール
  • Raspberry Pi で作っている省電力サーバたち
  • スマート家電コントローラー(アプリ、Googleアシスタント、Alexaから操作可能)
  • GAS、スプレッドシート
  • 今後作りたいもの
続きを読む

pyenvでPython3.7.0をインストールしようとしたらWARNING発生

pyenvでPython 3.7.0をインストールしようとしたらエラー発生。

WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?

拡張機能が足りないけどいいすか?みたいな内容らしい。

それぞれapt-getすればOK。

$ sudo apt-get update
$ sudo apt-get install -y libbz2-dev libreadline-dev libsqlite3-dev

Raspberry PiのセットアップからPython実行環境構築とイメージファイルバックアップまで

Raspberry Piを購入してから10ヶ月ほど経ちましたが、分からないなりに色々いじくり回していると余計に訳がわからない事態に陥ることもしばしば。

仕方ないクリーンインストールするか・・・ということが何度もありました。

その手間をなるべく省くために大まかなセットアップ手順とリセットを楽にするためのimgバックアップの方法をメモしておきます。

  • Raspberry PiのRaspbianセットアップと設定後イメージファイルのバックアップ
    • ①OSのイメージファイルをダウンロード
      • どちらを選べばいいのか
    • ② EtcherでSDカードに書き込む
    • ③ 起動後すぐにSSH接続できるように設定しておく
      • Wi-Fi設定
        • 最新版では一度有線接続してセットアップが必要かも
      • SSHの有効化
    • ④ Raspberry Piにセットして起動し、SSH接続
      • 有線LANで直接接続する場合
      • 無線LANでする場合
    • ⑤ raspi-configで各種設定
      • 1 ChangeUser Password
      • 3 Boot Options・・・起動方法
      • 4 Localisation Options
      • 5 Interfacing Options
      • 7 Advanced Options
    • ⑥ IPアドレスを固定する
  • こだわり設定
    • ①「SDカード寿命対策」
      • 1. Swap領域の無効化
      • 2. テンポラリ領域 を RAM へ
      • 3. rsyslog の ログ出力を抑制
      • 4. ログ出力ディレクトリ を RAM へ
    • ② 軽量化・高速化
      • 1. カーネルのログを抑制
      • 2. CPU の 動作クロック設定
      • 3. アップデートやらクリーンアップやらをshファイルで一括実行
  • イメージファイルのバックアップ
  • Python実行環境を整える
    • git経由でpyenvをインストール
    • 依存関係のあるライブラリをインストール
    • pipenvをインストール
    • pipenvでプロジェクト単位の仮想環境構築
    • 仮想環境でHello World!
      • pipでパッケージをインストールするには
      • 別の仮想環境に切り替える
  • あとがき

Raspberry PiのRaspbianセットアップと設定後イメージファイルのバックアップ

NOOBSが書き込まれたSDカードが付属しているパターンならそれを使ってもいいと思います。

①OSのイメージファイルをダウンロード

RASPBIAN

www.raspberrypi.org

RASPBIANにはDESKTOP版とLITE版の2種類が用意されています。

DESKTOP LITE
容量 4.49GB 1.73GB
UI GUI / CLI CLIのみ

GUI・・・グラフィックユーザーインターフェース。Windowsのようにマウスを使って視覚的、直感的な操作。

CLI・・・コマンドラインインターフェース。マウスなどは使わずキーボードでのコマンド入力のみで操作。

どちらを選べばいいのか

CLIでの操作に慣れていない場合やSDカードの容量に余裕がある(8GB以上)場合はDESKTOP版。

とりあえず手持ちの古いSDカード(4GB)などで安く済ませたい、Raspberry Pi Zeroなのでスペックが低いという場合はLITE版。

※DESKTOP版も設定で後からCLIに切り替えることが可能です。

続きを読む

Google HomeをPythonで自在に喋らせてみた(VoiceTextを使ってるので声も選べます)

f:id:maru0014:20180923220401p:plain

昨年末から愛用してきたGoogle Home Mini。

手に入れて最初にやったのがNode.jsの「google-home-notifier」で色んな通知を喋らせるというもの。

しかし、自分のjavascriptの知識なんてjQueryでウェブサイトに動きをつけて遊んだりする程度。よくわからないまま先人の知恵たるブログを参考にして実装しましたが、仕組みがよくわからなくてモヤモヤしていました。

でもようやく出来ました!Pythonで!これを「google-home-notifier-vt」と名付けます。

  • できるようになること
  • 参考にした記事
  • 改良点
    • Voice Text API対応
    • slackの特定チャンネルに投稿したら喋る
    • 文字化け対策
    • 謎の空白対策
  • コード全文
  • 導入手順
    • ① 各種ライブラリをインストール
      • python-voicetextのインストールでエラーが発生した場合
    • ② ngrokの準備
      • インストール
      • ユーザー登録・認証
    • ③ VoiceText APIユーザー登録
    • ④ Slackのチャンネルと着信Webフックを用意
    • ⑤ Pythonコード編集
    • ⑥ 実行
      • SSHで実行する場合
    • ⑦ Slackの発信Webフックを用意
      • その他オプションなど
  • あとがき

できるようになること

  • Slack→ngrok→Raspberry Pi→VoiceText→Google Homeを喋らせる
  • 声や読み上げ速度を選べる(Voice Text API)

参考にした記事

このQiita記事を見てこれはやれる!と思いました。

Pythonを使って、Google Homeに喋らせてみる - Qiita

決定打はこれ。Flaskで作られていますが素晴らしい出来栄え。

Chromecastデバイスに喋らせるPython スクリプト · GitHub

最初はBottleで自分なりにやってみたもののキャストしたあとの遅延が長くて3日間くらい悩みましたが、Slash Nephyさんのようにファイル名を時間から出力してユニークなものにすることで多分解決?

そして楽したいのでそのままFlaskでやります笑

続きを読む

Pythonのスコープ(変数の参照・代入可能範囲?)でつまづいた。グローバル変数を関数内で変更するには

今日Flask-ngrokというライブラリを使っていてつまづいたので戒めメモ。

Pythonのグローバル変数は関数内で代入できない

num = 0

def num_func ():
    num = 1
    print("num " + x)

このように実行したときにてっきりnum 1と表示されると思っていましたが、表示されたのはnum 0でした。

実はPythonのグローバル変数は関数内で参照はできるが、変更はできないらしいです。

困った・・・。と調べていたらありました。

【Python】ローカル変数とグローバル変数 | アルゴリズム雑記

関数内でglobal宣言すれば代入可能

num = 0

def num_func ():
    global num 
    num = 1
    print("num " + x)

関数内で代入したい変数名の前にglobalと付けて宣言したあとなら関数内で代入可能らしい!

やっぱりこういう基礎的なところすっ飛ばして動くもの作ろうとするとちょいちょいつまづきますね笑

でも真面目に基礎やるのが嫌いなので走りながら勉強します。