ラズパイzero を bluetoothボタンで操作

ラズパイzero を bluetoothボタンで操作

ラズパイzero にはボタンなどがないので
コマンドから実行になるけど
毎回シャットダウンや撮影のたびにコマンド実行は
ターミナル環境がないとできないので

簡易ドライブレコーダーZeroWにBluetoothボタンでオンオフ編

Bluetoothシャットダウンボタンを作る #300円でIoTボタン

を参考に

bluetoothボタンで操作できるよう設定

あといらないものを削除

Raspberry Pi 不要パッケージの削除

を参考に

Wolframとmathematica
libreoffice
Scratch

sudo apt-get remove --purge libreoffice*
sudo apt-get purge scratch
sudo apt-get purge wolfram-engine
sudo apt-get purge sonic-pi
sudo apt-get clean
sudo apt-get autoremove

で容量を確保

しかし
Waiting to connect to bluetoothd…
となりそのまま止まってしまう

raspberry pi3 をbluetooth接続するときのエラー

を元に

sudo apt-get update 
sudo apt-get upgrade -y 
sudo apt-get dist-upgrade -y 
sudo apt-get install pi-bluetooth 
sudo apt-get install raspberrypi-sys-mods

を実行したが変わらず

ラズベリーパイでbluetooth機能が使えません

を参考に

sudo apt-get install bluez pulseaudio-module-bluetooth python-gobject python-gobject-2 

次にbluetooth の接続

bluetoothctl
power on
scan on

で周辺デバイスを検索

[NEW] Device 2A:07:98:10:34:99 CW Shutter

となるので

pair 2A:07:98:10:34:99

でペアリング

しかし

trust 2A:07:98:10:34:99

のあと

Failed to pair: org.freedesktop.DBus.Error.NoReply
Waiting to connect to bluetoothd...

となってしまう

sudo apt-get install pi-bluetooth pulseaudio-module-bluetooth pavucontrol bluez

を実行し再起動

しかし途中で途切れるため

Raspberry Pi3 の Bluetooth を Ubuntu Mate 16.04 LTS で使えるようにする

を参考に

sudo apt-get install rpi-update -y
sudo rpi-update
sudo reboot

でファームウェアのアップデート

これで再度

bluetoothctl

としたら接続できた

次に
簡易ドライブレコーダーZeroWにBluetoothボタンでオンオフ編

を参考に

sudo apt install ruby
sudo gem install bluebutton

で bluebutton のインストール

イベント検知設定ファイルを作成

sudo nano ~/.config/bluebutton

でファイル作成し

keyup=echo UP
keydown=echo DOWN
longup=echo LONG UP
longdown=echo LONG DOWN

を記述して保存

しかし、このプログラムは
CW shutter では機能しない

Raspberry Pi + Bluetooth リモコンシャッター + Google Home で「こっちに来て!」メッセージ

を参考に

sudo apt-get install evtest

でインストール
evtest を使うことでデバイスが発行するイベントを拾う

しかしなぜか evtest での検出はできなかったため
ダイソーの
AB Shutter3 ボタン
を購入することに

sudo bluetoothctl 
power on
scan on

として

AB Shutter3 ボタンの電源をONにすると

[NEW] Device FF:FF:00:26:F2:FF AB Shutter3       

が検出される

これでMACアドレスがわかったので

scan off

でスキャン停止

connect FF:FF:00:26:F2:FF
pair with FF:FF:00:26:F2:FF
trust FF:FF:00:26:F2:FF

で接続して次回からも自動認識するように信頼させる

しかしうまくいかないので

sudo apt install bluez bluetooth libbluetooth-dev build-essential
sudo apt install bluez-cups

を実行

しかし結果は変わらない

raspberry pi と AB Shutter3(bluetoothボタン) の連携

によれば最初についている電池はお試しなので
ペアリングはできるがボタンを押したときのイベントが拾えない
という状況があるらしい

このため新しく電池を購入し再度実験

しかし結果は変わらず

Try to find device AB Shutter3...
Device AB Shutter3 find at /dev/input/event2
Unable to connect to X server
Reading events from /dev/input/event2...

のまま

他の手段を探し
100均Bluetoothボタンをラズパイに活用

を参考に

disconnect FF:FF:9A:4A:49:94
remove FF:FF:9A:4A:49:94
power on
power off
pair FF:FF:9A:4A:49:94
connect FF:FF:9A:4A:49:94

と繰り返していたら繋がるようになった

bluetoothctlコマンドについては
bluetoothctl

を参考に

ただ
ラズパイで300円のリモートシャッターをIoTボタン化する方法

にあるように複数台購入しても1台しか動かないケースもあり
ペアリングできても動作しない
電池交換しても改善されない
ということもあるらしい

問題点としては長押ししても
longup
longudown
を検出しないので
1つの動作しかできてない

とりあえずシャットダウン機能を実行してみる

sudo nano shutdown.sh

でファイルを作成

#!/bin/bash
sudo shutdown -h now

として保存

sudo chmod +x shutdown.sh 

で実行権限付与

sudo nano ~/.config/bluebutton

で内容を

keyup=echo UP && ~/shutdown.sh
keydown=echo DOWN
longup=echo LONG UP
longdown=echo LONG DOWN

として保存

sudo bluebutton -c ~/.config/bluebutton

だと

sh: 1: /root/shutdown.sh: not found

となってしまうが

bluebutton -d="AB Shutter3" -c /home/pi/.config/bluebutton

として
ボタンを押すと無事にシャットダウンができた

なお2つのボタンの認識もできるようだが
残念ながらこちらも実行できなかったため
実質的に1つの動作のみになっている
当面はシャットダウンボタンの活用になりそう

ラズパイzero 動画をNASへ保存

ラズパイzero 動画をNASへ保存

本体に録画データを保存すると容量がすぐにいっぱいになる

このため Nas へ保存するようにする

まず起動時に NAS をマウントするようにする

過去に
ラズパイZeroW から NAS へアクセス

ですでに zero には設定がある程度できている

行っているのは
ラズパイZero W で
SMB でNASをマウントするツールのインストール

sudo apt install cifs-utils

次にマウントするためのディレクトリを作成

sudo mkdir /mnt/nas

次にNAS の設定
NASを構築しているラズパイ3へログインし

sudo vim /etc/samba/smb.conf 

でファイルを開き
最終行に

[pizero_photo]
        path = /mnt/hdd/share/pizero
        writable = yes
        guest ok = yes
        guest only = yes
        create mode = 0777
        directory mode = 0777

を追記し保存

sudo service smbd restart

で設定反映

外付けHDDは過去に

mkdir /mnt/hdd/share/pizero
 sudo chmod -R 777 /mnt/hdd/share/

でディレクトリを作成していたので今回は省略

ここまでできたら

sudo mount -t cifs //192.168.1.6/pizero_photo /mnt/nas -o username=pi,password=raspberry,iocharset=utf8

でマウント

df -h

でNASの容量が表示されれば成功

ファイルシス               サイズ  使用  残り 使用% マウント位置
/dev/root                    5.7G  4.5G  903M   84% /
devtmpfs                     181M     0  181M    0% /dev
tmpfs                        186M     0  186M    0% /dev/shm
tmpfs                        186M  2.8M  183M    2% /run
tmpfs                        5.0M  4.0K  5.0M    1% /run/lock
tmpfs                        186M     0  186M    0% /sys/fs/cgroup
/dev/mmcblk0p6                68M   23M   46M   33% /boot
tmpfs                         37M     0   37M    0% /run/user/1000
/dev/mmcblk0p5                30M  398K   28M    2% /media/pi/SETTINGS1
//192.168.1.6/pizero_photo   916G   47G  870G    6% /mnt/nas

というかんじ

次にOS起動したら自動的にNASをマウントするように
/etc/fstab にマウントに必要な情報を記述

sudo nano /etc/fstab

でファイルをひらき
最終行を

//192.168.1.6/pizero_photo /mnt/nas cifs username=pi,password=raspberry,file_mode=0755,dir_mode=0755,iocharset=utf8,uid=1000,gid=1000,forceuid,forcegid,_netdev 0 0

を追記

次にOS起動後にNASが自動マウントするように
ブートオプションを変更
これはネットワークサービスが
起動してからブートしないとNASのマウントが失敗するから

 sudo raspi-config 

で設定画面を開き

3の
Boot Options を選びSelect にしてEnter

次に
B2 Wait for Network at Boot Choose whether to waito for n
で Select にして Enter

次に
Would you like boot to wait until a network connection is established?
となっているので
はい
にしてEnter

Waiting for network on boot is enabled
となるので
了解で Enter

あとは Finish で Enter することで設定画面を抜けます

設定確認のため

sudo reboot

で再起動して

df -h

でNASがマウントされていれば成功

次に音声つき動画の保存場所の指定

ffmpegで出力先の指定は出来なのでしょうか。

を参考に ffmpeg の出力先をNASに指定し実行

timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 |    arecord -D hw:1,0 -f S16_LE -r 44100 -d 0 test.wav;ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy /mnt/nas/test.mkv

とすればNASへ保存される

今後の予定では
bluetooth シャッターボタンで撮影できるようにする予定

ラズパイ3へNAS 構築

ラズパイ3へNAS 構築

以前構築したものが壊れたので再度NASの構築

以前ダウンロードしておいた
NOOBSを使いインストールメディアの作成

microSD を差し込み

unzip NOOBS_lite_v3_3.zip -d /media/snowpool/0403-0201/

で解凍

インストールは通常版をインストール

インストール終了後
ssh の有効化

sudo raspi-config

で設定画面をだす

5 Interfacing Options を選択

P2 SSH を選択

はい を選択

設定が終わったら
Finish で設定画面を抜ける

これでSSHは有効化されるので
続いて公開鍵認証にする

Ubuntu で ssh-keygenコマンドで作成

-t で暗号形式を rsa
-b で4096ビットに指定
なおデフォルトでは2048ビット

ssh-keygen -t rsa -b 4096

で作成

Enter file in which to save the key (/home/snowpool/.ssh/id_rsa): 

となったらファイル名を入力

今回は nas
としておく

パスフレーズは省略するので

Enter passphrase (empty for no passphrase): 

Enter same passphrase again: 


Enter にすればパスフレーズなしとなる

次に公開鍵の登録

これは
ssh-copy-id コマンドを使う

なお接続するラズパイ3のIPは
Android ならFing で調べることが可能

ssh-copy-id -i nas.pub pi@192.168.1.6

で登録

カレントディレクトリに鍵ファイルなどが生成されるので

mv nas* .ssh/

でファイル移動

ssh -i .ssh/nas pi@192.168.1.6

で接続

次に vim の設定

vim-tiny がインストールされているので

sudo apt-get --purge remove vim-common vim-tiny

でアンインストール

[shel]
sudo apt-get install vim
[/shell]
で通常版 vim をインストール

設定ファイルをつくるので

vim .vimrc

でファイルを作成

"クリップボードからのコピペを可能にする
set clipboard+=unnamed
" シンタックスハイライトの有効化
syntax enable
" 不可視文字を可視化(タブが「▸-」と表示される)
set list listchars=tab:\▸\-
" コマンドラインの補完
set wildmode=list:longest

を記述し保存

なお sudo 権限で vim を使うと設定が反映されていないので

sudo ln -s ~/.vimrc /root/.vimrc

でシンボリックリンクにしておく

鍵認証でログインできるようになったので
パスワード認証による SSHログインを無効化しておく

sudo vim /etc/ssh/sshd_config 

で設定ファイルをひらき

56行目の

#PasswordAuthentication yes

PasswordAuthentication no

にしておく

次に
外付けHDDを再起動時に自動マウントする設定

外付けHDDはすでに過去にext4 でフォーマットしたものを利用
ラズパイ4でRAID1 NASを構築した

によれば
直接ファイルシステムでやり取りしないため
フォーマットは exFAT でなくてもOKとのこと

 fdisk -l

を実行し

Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: External HDD    
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc675b7b1

Device     Boot Start        End    Sectors   Size Id Type
/dev/sda1          63 1953520064 1953520002 931.5G 83 Linux

となっているので認識はしているのを確認

UUIDを確認するので

sudo blkid /dev/sda1

を実行

今回の結果は

/dev/sda1: LABEL="outhdd" /dev/sda1: UUID="96cc41c9-808c-4851-83f5-53bdfa487787" TYPE="ext4" PARTUUID="c675b7b1-01"

外付けHDDのマウント先を作成し
マウント

sudo umount -f /media/pi/96cc41c9-808c-4851-83f5-53bdfa487787 /
sudo mkdir /mnt/hdd
sudo mount /dev/sda1 /mnt/hdd/

これを元に fstab の最終行へ書き込む

sudo vim  /etc/fstab 

でファイルを開き

UUID="96cc41c9-808c-4851-83f5-53bdfa487787"     /mnt/hdd       ext4    defaults 0 0

を追記

fstab については
fstab
https://wiki.archlinux.jp/index.php/Fstab
を参考に

あとは設定反映のため再起動するので

sudo reboot

を実行

これで

 df 

を実行し
マウントされていればOK

今回だと

ファイルシス   1K-ブロック    使用    使用可 使用% マウント位置
/dev/root         29542476 3659976  24358788   14% /
devtmpfs            440756       0    440756    0% /dev
tmpfs               474036       0    474036    0% /dev/shm
tmpfs               474036   18272    455764    4% /run
tmpfs                 5120       4      5116    1% /run/lock
tmpfs               474036       0    474036    0% /sys/fs/cgroup
/dev/mmcblk0p6      258094   54603    203491   22% /boot
/dev/sda1        960379088   95880 911428824    1% /mnt/hdd
tmpfs                94804       0     94804    0% /run/user/1000

というかんじ

次にSamba のインストール

sudo apt-get -y install samba

途中でWINS設定の有無が聞かれるけどいいえでOK

次に設定ファイルの編集

sudo vim /etc/samba/smb.conf 

で設定ファイルを開き
25行目あたりに

dos charset = CP932
unix charset = UTF-8
guest account = pi

を追加

dos charset = cp932
はwindows 側の文字コード

なお、vim の場合 ctrl + shift + v で貼り付けが可能
shift + g で最終行に移動し

[ファミリー]
        path = /mnt/hdd/share/family
        writable = yes
        guest ok = yes
        guest only = yes
        create mode = 0777
        directory mode = 0777

として保存

sambaの設定に関しては
SAMBAの設定(3.0  FC3)(Windowsから利用する場合) 
http://s135.moo.jp/linux/samba.html
を参考に

これで

service smbd restart

でSamba の再起動をすることでファイル共有が可能に

Ubuntu 16.04 の場合
エクスプローラで
ネットワークをクリックすると
RASPBERRYPI
と表示されるので
これを
クリックして今回設定したフォルダをクリックすると
ユーザ認証になるので
ユーザ名 pi
パスワード ラズパイ3のパスワード
とすることでログインしてファイル共有することが可能に

Macの場合 Finder からネットワークをクリックすれば
ファイル共有が可能

ラズパイzero で音声つき動画撮影

ラズパイzero で音声つき動画撮影
Raspberry Piで音声付き動画を撮影する

Raspberry PIとffmpegとWebカメラ、USBマイクを利用して動画を取得

を参考に実践

raspivid コマンド
motion コマンド
ともに実行しても音声は入っていないため

カメラから画像を取得
マイクから音声を取得

これらをエンコードして保存
という流れになる

MKV もしくは MP4 で保存しているが
違いについては
【5分で分かる】mkvとmp4の違いは?変換する方法は?

に載っている

高品質なら mkv
いろいろなデバイスで再生させたいなら mp4
というかんじ

参考サイトをみながらコマンドのオプションを調べてみた

raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 | \
   arecord -D hw:1,0 -f S16_LE -r 16000 -d 0 test.wav;
ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy test.mkv


撮影と録音を同時に行いそれぞれをファイルに保存して、後から結合する

raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -o - | \
   ffmpeg -y -ac 2 -f alsa -ar 16000 -i plughw:1 -r 30 -i pipe:0 -vcodec copy test.mkv


映像、音声を取得しながらエンコードする

これらは室内なので
raspividのawbオプションで光源の設定している

動画のエンコーディングにはffmpegを使用

20 November 2016 raspivid コマンド表


raspivid コマンドのオプションが載っているので
これを参考に
-t キャプチャする時間をミリ秒で指定

-t 0 なら0秒

-w で動画幅
デフォルトは 1920
-h 動画の高さ
デフォルトは 1080

-b ビットレート
10MBits/secは-b 10000000

-fps は記録するフレーム数
今回は30

-awb でAWBモードを設定
fluorescent で蛍光

-o - で出力ファイル名
今回はパイプで指定

次にffmpeg のオプション
最新ffmpegのオプションまとめ †

を参考に

-y で確認なしでファイル上書き

-ac で音声チャンネル数を指定
今回は2

-f 指定したフォーマットで出力

-i 入力ファイルのパス
-i plughw:1 でマイクを指定

-r でフレームレートの指定

フレームレートは動画の滑らかさの設定
フレームレート(FPS)って何?どのくらいの値にすればいいの?

に詳細が載っている
動画の撮影なら30でOK

-vcodec
でコーデック指定
copy を指定すれば直接コピーになる
copy test.mkv
とすれば test.mkv となる

raspivid -t 10000 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -o - | \
   ffmpeg -y -ac 2 -f alsa -ar 16000 -i plughw:1 -r 30 -i pipe:0 -vcodec copy test.mkv

もうひとつは

ffmpeg -f alsa -thread_queue_size 8192 -i hw:2,0 \
  -f v4l2 -thread_queue_size 8192 -s 640x480 -i /dev/video0 \
  -c:v h264_omx -b:v 768k \  
  -c:a aac \
  output.mp4 

録画の終了はqキー

オプションは
-f で
ファイルフォーマット
マイクやカメラから取得するなら必須
今回はマイクが alsa ビデオが v412

-thread_queue_size データを読むときのキュー
高フレームレートの動画ストリームとかだと
処理が追い付かずに捨てられてしまうデータがあったりするのだが
キューサイズを大きくすると、それを防げる
今回は 8192

-s は動画サイズ
640×480 にしている

-i で入力デバイスの指定
今回はマイクとUSBカメラのパスを指定

-c でエンコードのコーデック指定
-c:v h264_omx
でビデオ v がビデオの意味
-c:a aac
でa がオーディオコーデック

-b:v 768k
でビデオのビットレート
大きくすれば画質がきれいになる

実行したときに終了時間の指定ができなかったので
timeout コマンドを使うことにした

このコマンドに関しては
timeout コマンド

を参考に

 timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 |    arecord -D hw:1,0 -f S16_LE -r 44100 -d 0 test.wav;ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy test.mkv

というように
timeout コマンドを使うことで指定の時間で停止させることができる

ここまでできたら
あとは bluetooth などで撮影ボタンを作成する予定

ラズパイzero マイク設定

ラズパイzero マイク設定

以前、ラズパイzero で動画を撮影したが
音声がなかったので

ラズパイZeroWで作る簡単アクションカメラ——バイク編

Raspberry Pi Zeroで簡易ドライブレコーダーを自作する

を参考に設定

micro USB 変換アダプターを使うことで
ラズパイzero でも usb マイクを使用することが可能に

今回は

を使用

まずUSBマイクが認識されているか確認

lsusb

結果は

Bus 001 Device 002: ID 8086:0808 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

次にモジュール確認

cat /proc/asound/modules 

結果は

 0 snd_bcm2835
 1 snd_usb_audio

次にサウンドカードを調べる

arecord -l

結果は

**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

ここまでできたら録音テスト

arecord -D plughw:1,0 ~/test1.wav

これで
test1.wav という音声ファイルができるので
これを scp コマンドで転送

しかし再生してみるとノイズがおおく音量が小さい

マイクの集音量と感度の調整 ラズパイ
で検索し
raspberry Pi3(ラズパイ)でマイクを使う

を参考に

[^shell]
amixer sget Mic
[/shell]
としたが

amixer: Unable to find simple control 'Mic',0

となってしまう

このため
amixer コマンドを調べる

Linux の Audio 機能をコマンドラインで設定

によれば

amixer -c1

でサウンドカード1の情報がみれる

結果は

Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 0 [0%] [0.00dB] [on]
Simple mixer control 'Auto Gain Control',0
  Capabilities: pswitch pswitch-joined
  Playback channels: Mono
  Mono: Playback [on]

また
Linuxでマイクの音量が小さいときに、それを上げる方法

amixer -D hw:1

でも同じ結果がでる

Mono: Capture 0 [0%] [0.00dB] [on]

となっているので
これだとマイクボリュームが0

これを100%にする

amixer -D hw:1 sset Mic 100%

を実行すると

Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 16 [100%] [23.81dB] [on]

これで録音の音は改良されたけど
ノイズがまだ残っている

原因は録音したときのレートの Hz の数値

arecord -D plughw:1,0 ~/test3.wav

を実行すると

録音中 WAVE '/home/pi/test3.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル
^Cシグナル 割り込み で中断...

となり 8000Hz となる

arecord -Vmono -D hw:1 -f S16_LE -c1 -r48000 test4.wav

とすると

録音中 WAVE 'test4.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル

となり
48000Hz になる

これだと少しトトトトトと音が入っている

Raspberry Pi3で音声録音

を参考に

arecord -D plughw:1,0 -f cd  mic.wav

を実行すると

録音中 WAVE 'mic.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ

となり
44100 Hz となる

-f cd の設定で 44100Hz となる

acreclrd コマンドのオプションについては

8.1. ALSAによるサウンド機能の実現

を参考に

aplay と arecord のオプションは同じとのこと

arecord -D plughw:1,0 -f cd  mic.wav

を実行したときが一番聴きやすいかんじ

しかしノイズのような音は残るので
あとはマイクの性能によるのかもしれない

LINE Messasging API でメッセージ送信

LINE Messasging API

LINE Messasging APIでメッセージ送信を試してみた

を参考に実践

なお後で調べたら
Messaging APIを始めよう

にドキュメントによれば
QRコードでのログインもできるらしい

まずスマホの LINEアプリで
メルアドとパスワードを設定

ログイン許可にチェックを入れる

https://developers.line.biz/console/
へアクセスしログイン

ユーザ名
メールアドレスを設定

I have read and agreed to the
LINE Developers Agreement
(規約に同意します)
にチェックをいれ

Create my account をクリック

これでアカウントの作成ができるので

次にプロバイダーの作成

下へスクロールし
Create a new provider をクリック

任意の名前を入力
ただしすでに他の人が使っていないものであること

Create をクリック

次にチャンネルの作成

使用するのは
Messaging API なので

Create a Messaging API channel
をクリック

Channel type

Provider
については
デフォルトのままでOK

Channel name には任意のチャンネル名

Channel description には
チャンネルの説明

Category には業種

Subcategory には業種の詳しいカテゴリ

Email address にはメルアド

I have read and agree to the LINE Official Account Terms of Use
LINE公式アカウント利用規約 の内容に同意します

I have read and agree to the LINE Official Account API Terms of Use
LINE公式アカウントAPI利用規約 の内容に同意します

にチェックをいれて

Create をクリック

これでチャンネルが作成されるので

Messaging API をクリックし
QRコードで自分のLINEアプリで友達登録しておく

次にメッセージ送信のテスト

アクセストークンが必要なので
Channel access token(long-lived) の
issue をクリック

これでアクセストークンが発行される

アクセストークンの種類については
チャネルアクセストークン

の公式ドキュメントを参考に

次にIDの確認
これは自分のIDを使うので
Basic settings タブをクリック

Your user ID の部分を確認

ここまでできたら
curl コマンドでメッセージ送信

curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer { アクセストークン }' \
-d '{
    "to": "ユーザID",
    "messages":[
        {
            "type":"text",
            "text":"Hello, world"
        }
    ]
}'

これを実行すると

LINEアプリに
hello world
と書かれたメッセージが届く

なおデフォルトでは自動応答メッセージがあり
これを無効にするには
Messaging API をクリック

Auto-reply messages の Edit をクリック

応答メッセージをオフに設定

これで自動応答メッセージがでなくなる

今後の課題としては
LINEトークルームを作成
Google Assistant SDK をラズパイに入れる
google-home-notifier 設定
とやっていけば

【ベビテクDIY】LINEやスマートスピーカーでらくらく家事育児効率化 その2

のように
LINEのやり取りを音声のみでできるいう予定

シェルスクリプトでJSON の処理

シェルスクリプトでJSON の処理

sRemo-R3 で
温湿度や時刻を取得すると
JSONで返ってくるので
これをファイルに保存

なお、これだけでもAmazon Echo で操作することができるけど
自動処理させるのをやりたいので
センサーの代わりに使うことに

curl -H "Authorization: Bearer jgw5E82Ic6BISXjssK4xoKf36XeJIfjHgL53KD69" https://uapi1.sremo.net/user_api/av63hsbsyxq/get_thl > sremo.json


curl の結果を
sremo.json に保存

中身は

{"t":28,"h":45,"l":17}

となっている

シェルスクリプトで json を使うには
jq が必要なので

sudo apt-get install jq

でインストール

bashやshなどのsh系スクリプトでJSON形式のデータを読み込む【サンプルプログラムあり】

を参考に
まずはJSONデータの読み込み

## 1. JSONデータを取得
jsonData=`cat sremo.json`

#echo $jsonData | jq '.t'
temp=$(echo $jsonData | jq '.t')
echo $temp

とすればJSONデータから温度の取り出しと表示ができる

ただし、この結果は文字列扱いのため
数値変換しないと if で操作ができない

jq の tonumberで数値変換が可能とのことだが

expr コマンドを使えば
bash で文字列を数値変換して実行可能

bashで文字列を数値に変換して数値計算する方法

では数値変換による計算の例が載っている

【 expr 】コマンド――計算式や論理式を評価する

では論理式での例が載っている

これを元に

## 1. JSONデータを取得
jsonData=`cat sremo.json`

#echo $jsonData | jq '.t'
temp=$(echo $jsonData | jq '.t')

if [ 'expr $temp >= 25' ]; then
curl -H "Authorization: Bearer APIアクセストークン" https://APIサーバ/user_api/sRemo識別子/send_sig?sig=画面番号-a-n-2-1-4-22
fi

とすれば気温が25度以上になれば
22度設定でエアコンが起動するという処理になる

同じように照度25以上なら消灯するようにするのなら

## 1. JSONデータを取得
jsonData=`cat sremo.json`

illumi=$(echo $jsonData | jq '.l')

if [ 'expr $illumi >= 25' ]; then
curl -H "Authorization: Bearer APIアクセストークン" https://APIサーバ/user_api/sRemo識別子/send_sig?sig=画面番号-l-2
fi

というようにすれば消灯させることができる

こちらは後々人感センサーと合わせて処理すれば
退席したら照明を消すようなものを作成できる

ラズパイとスマートホームコントローラ sRemo-R3

ラズパイとスマートホームコントローラ sRemo-R3

Raspberry PiとNode-redで、リビングに飾れる美しい「スマートホームコントローラ」を作ってみた

を参考に実践

irMagician で赤外線センサーを実験したけど
今使われているリモコンのように多数の赤外線センサーが
あるわけではなく1つだけなので
これだと正確に向きを合わせる必要性があり断念

多方向に赤外線を飛ばすには
スマートリモコンを自作するか
もしくは
対応するパーツを購入し
センサーの代わりに代用するほうが効率的と判断

今回は
sRemo-R3 を購入し
これを赤外線でコントロールするセンサーの代わりに使う

すでに node-red はセットしてあるので

ubuntu のブラウザ
今回は firefox で
http://raspberrypi.local:1880/admin/
へアクセス

すでにログインしているなら数日間は
自動ログインできる

管理者権限でのログインになるので
ユーザを admin

パスワードは

bash nrpiadminpass.sh 任意のパスワード

で設定したパスワードを使用

これでログインできることを確認したら
次に静的 webサーバの有効化

settings.js を変更することで静的webサーバを有効化

cd .node-red/
vim settings.js

で設定ファイルを開き
104行目の

//httpRoot: '/red',

のコメントアウトを外し

109行目の

//httpStatic: '/home/nol/node-red-static/',

    //httpStatic: '/home/nol/node-red-static/',
    httpStatic: '/home/pi/node-red-static/',

と元のコードを残し
パスを変えて保存

cd
mkdir node-red-static
cd node-red-static/
echo "<html><body>Test Page</body></html>" > index.html

でテストページを作成

あとは

node-red-restart

で node-red を再起動し

ブラウザで
http://raspberrypi.local:1880/
へアクセスすれば
テストページが表示される

次にスマートリモコンの設定
これはマニュアルをみて設定する

使用したスマートリモコンは
sRemo-R3

マニュアルについては
リモコン設定と操作(エアコン)

を参考に

次にsRemo Cloud へアクセス
https://sremo.biz/
へアクセス

Login をクリックし
初期設定のときに登録した
メルアドとパスワードでログイン

sRemo 情報をクリック

sRemo識別子を覚えておく

そして元のメニューにもどり
APIアクセストークン
をクリック

新規トークン発行をクリック

これでアクセストークンが発行される
なお1ユーザ1トークンとなるので
わからなくなったら再発行することになる

次に sRemoWebAPI の操作

curl -H "Authorization: Bearer <APIアクセストークン>" https://<APIサーバ>/user_api/<sRemo識別子>/send_sig?sig=0-<リモコン番号>

を実行

例えば

APIアクセストークン
123456789

APIサーバ
uapi1.sremo.net

sRemo識別子
abcdefghij

リモコン番号

なら

 curl -H "Authorization: Bearer 123456789" https://uapi1.sremo.net/user_api/abcdefghij/send_sig?sig=0-1

を実行すると
OK
となる

sCloud-API の利用方法については
sCloud-API利用方法

を参考に

温度 湿度 照度
を取得するなら

curl -H "Authorization: Bearer APIアクセストークン" https://APIサーバ/user_api/sRemo識別子/get_thl

を実行すれば

{"t":27,"h":48,"l":55}

というように
JSON形式で返答される
t が温度
h が湿度
l が照度
となる

時間の取得をするには

curl -H "Authorization: Bearer APIアクセストークン" https://APIサーバ/user_api/sRemo識別子/get_time

を実行すれば

{"t":"2020-08-08 05:47:12"}

というように現在時刻を取得できる

コマンドをコピペして実行したときに

{"error":"invalid_request","error_description":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Check the \"access token\" parameter."}

と出たが
これは ” の部分が全角になっていたため

温度や湿度、照度の取得はできたので
次にエアコンの制御

{画面番号}-a-{ON/OFF}-{モード}-{風量}-{風向}-{温度}
という書式

画面番号1、冷房ON、風量:自動、風向:両方、温度:22℃の場合
リクエストは
https://uapi1.sremo.net/user_api/abcdefghij/send_sig?sig=1-a-n-2-1-4-22
というパラメータになる

ON なら n
OFF なら f

モードは
1 自動
2 冷房
3 暖房

風量は
1 自動
風向き両方なら

温度を22
としているので
コマンドは

curl -H "Authorization: Bearer APIアクセストークン" https://APIサーバ/user_api/sRemo識別子/send_sig?sig=画面番号-a-n-2-1-4-22

としたらできた

エアコンの停止をするには

curl -H "Authorization: Bearer APIアクセストークン" https://APIサーバ/user_api/sRemo識別子/send_sig?sig=画面番号-a-f-2-1-4-22

というように
パラメータを 停止の f を指定して実行すればOK

次に照明

{画面番号}-{家電種別}-{制御番号}
照明 l
TV 5
DVD d
スイッチ s
が家電種別

制御番号は
消灯2
全灯3

画面番号3、TV、ミュートの場合
https://uapi1.sremo.net/user_api/abcdefghij/send_sig?sig=3-t-29
というパラメータになるので
これを参考に実践

curl -H "Authorization: Bearer APIアクセストークン" https://APIサーバ/user_api/sRemo識別子/send_sig?sig=画面番号-l-3

で全灯

curl -H "Authorization: Bearer APIアクセストークン" https://APIサーバ/user_api/sRemo識別子/send_sig?sig=画面番号-l-2

で消灯
となる

とりあえずエアコンの動作、照明のON・OFFは
コマンドから操作できるようになり
部屋の温湿度、照度も
sRemo-R3 で取得できるようになった

取得結果は JSON で得られるので
今後の課題は
シェルスクリプトで定期的にセンサーで取得し
温湿度に合わせて自動でエアコンを動作させること

ラズパイ3で赤外線リモコンの操作

ラズパイ3で赤外線リモコンの操作

Raspberry Pi 3 で赤外線リモコン&温度センサーを試す

を参考に実践

まず
irMagician を ラズパイ3にUSB ケーブルで接続

使用するのはAndroid で使っているものでOK

irMagician の黄色LEDが点滅していれば認識している

また

ls -l /dev/ttyACM0


/dev 以下に ttyACM0 が存在していれば認識しているのを
確認できる

次に
ptyhon-pip と pyserial のインストール

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install pyserial

制御プログラムを git で取得

git clone https://github.com/netbuffalo/irmcli.git
cd irmcli/

で移動してから赤外線センサーの学習

udo python irmcli.py -c

を実行したけど

  File "irmcli.py", line 15
    print "Capturing IR..."
                          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Capturing IR...")?

となる

SyntaxError: Missing parentheses in call to ‘print’.
で検索してみると
どうやら
python3 から print の構文が変わっていて

Python3 print でシンタックスエラーになった。

によれば

Python3からはprint()で実行しないとエラーになる

とのこと

15行目の
print “Capturing IR…”

print(“Capturing IR…”)
として
実行したら

  File "irmcli.py", line 19
    print msg
            ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(msg)?

となるので

さすがに毎回変更は面倒なので

vim irmcli.py

でファイルを開き

:%s/print msg/print(msg)/g

で一度に変更

vim の置き換えについては
vim置換

を参考に

いくつか修正するところがあるので
/print ”
で検索し
print() になるように修正

  File "irmcli.py", line 113
    print ir_serial.readline().rstrip()

については

print(ir_serial.readline().rstrip())

とすると

Traceback (most recent call last):
  File "irmcli.py", line 142, in <module>
    captureIR(args.file)
  File "irmcli.py", line 16, in captureIR
    ir_serial.write("c\r\n")
  File "/home/pi/.pyenv/versions/3.6.10/lib/python3.6/site-packages/serial/serialposix.py", line 532, in write
    d = to_bytes(data)
  File "/home/pi/.pyenv/versions/3.6.10/lib/python3.6/site-packages/serial/serialutil.py", line 63, in to_bytes
    raise TypeError('unicode strings are not supported, please encode to bytes: {!r}'.format(seq))
TypeError: unicode strings are not supported, please encode to bytes: 'c\r\n'

となってしまう

irmagician ラズパイ エラー
で検索し

JSONに保存した赤外線データを使って赤外線照射したいのですが、エラーが出てできません。

によれば
python3 だと
“n,%d\r\n” % recNumberはstr型なので提示エラーになる

~.encode()とbyte型に変換するとよい
とのこと
python3 pySerial TypeError: unicode strings are not supported, please encode to bytes:

も参考にするように書いてある

少しわかりにくかったので
ser.write
で検索し

Python3でpyserialを使う

をみると
write() で
文字列の前に
b
をつければOKらしい

:%s/write(“/write(b”/g
で置き換えて実行したが
リモコンの学習ができない

仕方ないので
コードを書き換えるより
ディレクトリ単位で python 環境を構築することに

pyenv-virtualenvでディレクトリ単位のpython環境構築

ラズパイにpyenv・Python3.7.0をインストールしてpyenv-virtualenvで仮想環境の構築!

を参考に

なお pyenv-virtualenv のインストールに関しては
pyenv と pyenv-virtualenv で環境構築

を参考に

 git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

でファイルを取得

sudo vim .bash_profile 

でファイルを開き

最終行に

eval "$(pyenv virtualenv-init -)"

を追記して保存

source ~/.bash_profile

でファイルをリロード

次に仮想環境の構築

cd irmcli/

で irmagician のディレクトリに移動

次に python 2.7.9 をインストール

pyenv install 2.7.9

しかし

ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

となる

エラーを検索

RaspberryPiにpyenvを入れて複数のPython動かすよ

を参考に

sudo apt install -y libssl1.0-dev

Debian 9 Stretchでは、libssl-devは
OpenSSL 1.1.xベースになっているので
あったlibsslを入れろとの事

再度

pyenv install 2.7.9

を実行しインストール成功

pyenv は
global なら全体のバージョンを設定

local なら
カレントディレクトリに反映となるので

pyenv local 2.7.9 

として
irmcli ディレクトリのみ
python を 2.7.9 にする

次に
仮想環境の保存と再構築のため

pyenv exec pip install wheel

で wheel をインストール

freeze コマンドで
requirements ファイルを作成し
wheel ファイルを出力

pyenv exec pip freeze > ~/pyp_list.txt
pyenv exec pip wheel --wheel-dir=~/wheelhouse -r ~/pyp_list.txt

としておく

次に

python --version

で ver 2.7.9 になっているのを確認

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install pyserial
[/shell
で必要なものをインストール


vim irmcli.py

で変更した部分を元に戻しておく

元に戻したら

sudo python irmcli.py -c

で部屋のリモコンの全灯を押し学習させる

sudo python irmcli.py -s -f light_on.json

でファイルへ書き出し

リモコンの消灯を押して照明を消す

sudo python irmcli.py -p -f light_on.json

を実行すると全灯になって照明が点灯する

なお距離は2mでも動作するが
リモコンと異なり
赤外線センサーの向きなどがあっていないと
操作できないので注意

Amazon Echo でラズパイのコマンドを実行

Amazon Echo でラズパイのコマンドを実行

声で部屋の電気のON/OFFをしたい(後編:音声認識しちゃうよ)

AmazonEchoからRaspberryPiのコマンドを実行する(node-red-contrib-amazon-echo)

を参考に

ubuntu のブラウザ
今回は firefox で
http://raspberrypi.local:1880/admin/
へアクセス

すでにログインしているなら数日間は
自動ログインできる

ハンバーガーメニューから
パレットの管理をクリック

ノードを追加 をクリック

node-red-contrib-amazon-echo
で検索

node-red-contrib-amazon-echo

ノードを追加をクリック

追加をクリック

しばらくすると追加されるので
閉じるをクリック

これで入力欄に
amazon echo hub
amazon echo device
が追加される

amazon echo hub をドラッグ&ドロップ

ダブルクリックし
編集画面をだす

Port を 8111 にして
完了をクリック

次に
Amazon Echo Device をドラッグ&ドロップし
灰色の○をクリックして
Amazon Echo Hub とワイヤーをつなげる

Amazon Echo Device をダブルクリックし
設定画面で
Name に任意の名前を入力

今回は テスト として完了をクリック

これでデブロイをクリック

次に
https://alexa.amazon.co.jp/
へアクセスし

スマートホーム > デバイス > 検出
としたが
なぜか追加されない

とりあえず後にして
Node-RED のフローを作成

http://raspberrypi.local:1880/admin/
へアクセス

debug をドラッグ&ドロップすると
msg.payload となるので

これを
テスト
とワイヤーでつなぐ

なお
つなげるところを間違えたら
ワイヤーをクリックし
delete キーで消すことができる

今回はテストと
Amazon Echo Hub をつなげるときに
ワイヤーを間違えて設定したので
これを修正した

つなげることができたら
デブロイをクリック

次に
msg.payload をクリックし
デバッグアイコンをクリック

しかし反応がないため

sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8111

で設定

iptables コマンドについては
iptables – システム管理コマンドの説明 – Linux コマンド集 一覧表

を参考に
ーI オプションでルール追加
–dport は送信先ポート設定
今回は80ポートを送信先にしている
-j で行動の設定
ACCEPTなのでパケットを通している

-A はルールの追加
PREROUTING は
送信先IPをマシン自身のIPへ変換

sudo apt-get install iptables-persistent

でインストール

現在のIpv4ルールを保存しますか?
現在のIpv6ルールを保存しますか?
となるので
はい
を選択

これで

sudo reboot

で再起動後

再度
デバイスを検出すると
Royal Philips Electronics スマートデバイス
として認識された

これで
Amazon Echo に
アレクサ テスト オン
アレクサ テスト つけて
と言っても動作しない

Android の Alexa アプリで見ると
照明として認識されているので

アレクサ 照明 オン
アレクサ 照明 オフ
とすると反応した

これで反応するようにはなったので
次に
Node-RED でのラズパイコマンドを実行

機能のところにある
exec をドラッグ&ドロップ

テストから
exec までをワイヤーでつなぐ

execをダブルクリックし
コマンドに
sh /home/pi/test.sh
として
完了をクリック

デブロイをクリック

次にラズパイで

vim test.sh

でファイルを作成し

if [ $1 = "on" ]
then
    echo "ON" >> /tmp/test.txt
elif [ $1 = "off" ]
then
    echo "OFF" >> /tmp/test.txt
fi

として保存

これで
アレクサ 照明 つけて
とすると
/tmp/test.txt

ON
と書き込まれる

確認したいのなら

cat /tmp/test.txt

とすればファイルの中身を見ることができる

なお
Alexa アプリで
文字化けしていたデバイス名を
テスト
と変更すれば
アレクサ テスト つけて
でも反応するようになった