alexa-remote-controlをREFRESH_TOKENで

alexa-remote-control 0.20

Amazon Echoで時報する - Azzologに使っているalexa-remote-controlが、2月の頭ごろから動かなくなっていたようだ。ちょうどADSLのサービス終了でバタバタしたのと重なって、なかなか気づけなかったのだが、どうやらalexa.amazom.co.jpの認証が変わった(Old optionが使えなくなった)っぽい。 New option REFRESH_TOKENに切り替えることにする。

The Alexa-App way of logging in is using a REFRESH_TOKEN which allows for obtaining the session cookies.

REFRESH_TOKENを取得するのに alexa-cookie-cliを使わせてもらうので、まず、JavaScript実行環境を確認しておこう。

Node.js


なるほど。

$ sudo apt install nodejs
$ sudo apt install npm


そしてalexa-cookie-cliは、alexa-cookieのラッパーなので、パッケージで2つインストールしておく。

$ npm install alexa-cookie2@4.1.3
$ npm install commander@8.2.0


バージョンが違うと、うまくREFRESH_TOKENを返してくれない。指定しておくべし。自分の場合は、commanderのバージョンが違っていた。
アレクサでインターホンの通知をする - Qiita

がこのままだと失敗する。おそらく、利用している alexa-cookie2のバージョンが古い(4.0.1)ためだと思われる


用意ができたところで、

$ node cli.js -p amazon.co.jp -a ja_JP

The token looks something like Atnr|...

Raspberry Piを有線ネットワークからのWi-fiルータにする

Raspberry PiでWi-fiアクセスポイント - Azzologの逆バージョン。

ADSLが突然サービス終了し、しばらくテザリングでネットワーク環境をごまかすことにした。とは言え、ごまかしてる間だけ、すべてのデバイスWi-fi設定を変更するのは面倒である。お役御免になっていたホテルWi-fiを活用して、今と同じWi-fi環境を作り、そこからラズパイを経由してテザリングすることを思いついた。つまりはラズパイのルータ利用である。

ちなみにStretchはwpa_supplicantをアンインストールしてしまっており、Wi-fiクライアントにしようと思うとイッターネットにつないで、再インストールしないといけないといけないという、本末転倒な状況になってしまったので、クリーンなBullseyeで。

エレコム WRH-150x

動作モード

「アクセスポイントモード」では、WAN設定画面が表示されず、WAN側のEthenetポートはDHCPクライアントとなって、DHCPサーバがないとIPアドレスは振られない。LAN側と同じアドレス空間でラズパイのeth0を固定IPアドレスにすればよいかと思ったが、そうは問屋が卸さなかった。どうやらラズパイ側からの行き先が分からなくて、ロストしてるようだ。

「ルータモード」を選択してLAN側のWi-fiネットワークと、WAN側のEthernetネットワークをそれぞれ作ることにする。

WAN設定

「固定IP」を設定する。ラズパイでDHCPサーバを立ててもよいのだが、ポイントtoポイントでわざわざそこまでする必要もない。デフォルトゲートウェイDNSはラズパイのeth0へ向ける。

/etc/dhcpcd.conf

ただしこのままでは、ラズパイ自身の通信はeth0のmetricの方が低くてeth0へルーティングされるので、nogatewayを入れておく。これでwlan0からテザリングできるようになる。

でもって、iptablesでwlan0からのアウトバウンドをマスカレードして、だん。

iPhone / iPadからSambaできないとき

iPhone 12 / iPad mini (第6世代)

ラズパイもCUIに慣れてしまった。たまにイッターネットからファイルをダウンロードするのは、ブラウザで探す方が楽なので、iPhone / iPadでダウンロードしたファイルをラズパイへファイル共有できるようにしておこうと思う。となると、ラズパイをファイルサーバにして、iOSのファイルアプリから共有するのが手っ取り早いだろう。

Samba

おっと。

操作を完了できませんでした 属性が見つかりません

iOS14.5.1からの仕様で外部ファイルシステムにはそのままでは保存出来なくなっている。

やり方は以下の通り。

1. samba-vfs-moduelsの追加

sudo apt-get install samba-vfs-modules

2. /etc/samba/smb.confの[global]項目に以下を追加

fruit:nfs_aces = no
fruit:aapl = yes
vfs objects = catia fruit streams_xattr

3. smbd/nmbdの再起動

sudo /etc/init.d/smbd restart
sudo /etc/init.d/nmbd restart

壊れたLinkstationのHDDからデータ救出できた話

とても長らくお世話になってきたNAS、Linkstation LS-CH500Lも、いよいよステータスランプが赤色点滅したのはずいぶん前のこと。幸いコントローラーの障害のみで、HDDだけ抜き取ってラズパイにUSB接続したら、データは無事だった。ラッキーである。

Linkstation LS-CH500L

分解してHDDを抜き出す。SATA接続の3.5インチ。

SATAについて、軽く振り返る。なるほど。
シリアルATAとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典


apt install xfsprogs

Linkstation LS-CH500Lのファイルシステムは、XFSとのこと。


Raspberry Piファイルシステムは、ext4。なのだが、

コマンド一つでOKです

$sudo apt install xfsprogs


ダメならもうあきらめようと思いつつ、外付けHDDケースに入れてラズパイにつないでみると…はい、フツーにアクセスできたのでした。

ファイルシステムについても、軽く振り返る。なるほどなるほど。
【ざっくり概要】Linuxファイルシステムの種類や作成方法まとめ!

家に帰るとSwitchbotロックを自動解錠

せっかくのスマートロックだから、家に近づいたら勝手に鍵を開けてくれるといいなと思う。しかしながら、SwitchbotロックはIFTTTでは鍵を開閉したりはできないようだ。
MQTTブローカーをかませて、流れは以下の通り。

  1. IFTTで位置情報をトリガーに、BeebotteにWebhook
  2. BeebotteがPublish
  3. ラズパイでSubscribe
  4. ラズパイでSwitchbot APIを操作して解錠

IFTTT + Beebotte


IFTTTのトリガーをロケーションに変更する。

Switchbotロック API v1.1

温室時計はv1.0でも操作できたが、ロックはv1.1でないと操作できない。

これでアンロックできた。

systemd

デーモン化する。

mh-z19 sensor PWM Cons : Slow, in about 1 second necessary to get data.


センサー情報から室内環境のロギングや、アクションを実行するのに、いくつかシェルスクリプトPythonプログラムを用意してcronしている。ところが先日、思い立って重畳なプログラムを書き直したあたりからか、ところどころログが記録されなくなってきた。とうやら処理時間が短縮されて、プロセスが競合してしまうようになったんじゃないかと思う。いいんだか、わるいんだか。

/var/log/cron

まず、cronのログを確認しようと思ったが、
【Linux】/var/log/cron.logが存在しない場合 - (O+P)ut

syslogの設定ファイルは/etc/rsyslog.confに存在しているので、cronに関する記載有無を確認します。
デフォルトで以下のようにコメントアウトされている
#cron.*

コメントアウトをはずして、有効にする。

rsislog?と思ったら、今はreliable syslog = rsyslogらしい。よくsyslogと言うけれど。
rsyslogとsyslogの違い - Qiita

古いのがsyslogで新しいのがrsyslog


それと、よくわからないから、できるだけ多くログがほしい。
cronのログを確認する方法 | Armadillo

cronのログを有効にするには /etc/default/cronファイルのEXTRA_OPTSを設定します。
※ここでは例として、すべてのログを有効にするEXTRA_OPTS='-L 15'とします。


しばらくログを取ってみると、ところどころ

(pi) CMD ([***] /use/bin/python3 ***.py)
(CRON) error (grandchild #*** failed with exit status 1)
(pi) END ([***] /use/bin/python3 ***.py)

と、ある。どうやらこの.pyが失敗しているようなのだが、普通に実行すると、普通に完了する。

しばし黙考。cronは一気に同時プロセスする。同じタイミングでcronしている別の.pyは、普通にCMD - ENDしているようだ。共通しているのは、CO2濃度を取りに行く動作かなと。おそらく、競合してしまうのではないだろうか。

Python 3.5

例外処理

腕があれば、例外処理でログ取ってはっきり対処もできるのだろうが(while Trueで行けるかとも思ったが、ダメだった)、どうも思ったように動いてくれない。
Pythonの例外処理とは?try・except・else・finallyの使い方【処理を続行する方法】│とことん独学ブログ

time.sleep(3)

そう言えば、
PWM support. · UedaTakeyuki/mh-z19 Wiki · GitHub

Slow, in about 1 second necessary to get data.

だったな。失敗している.pyに、time.sleep(3)を入れてみる。

。。OKになった。ちなみに1秒だとときどきNG。2秒だと2、3日に1回NG。

WARNING: REMOTE HOST IDENTIFICATION CHANGED!

たまに古いサーバアドレスへSSHしようとした時に。

そうしょっちゅうはないことだし、当然に忘れてしまって毎回、調べ直すハメになるので、メモしておこう。

$ssh-keygen -R example.com

WARNINGから、ssh-keygen -Rのyes/no確認してくれるといいなと思ったけど、中間者攻撃対策のこと、あまり考えずにやっちゃったらヤバいから、こうなってるんだろうな、きっと。

ついでにフィンガープリントについても、お勉強。
SSHにおけるフィンガープリントとは。ホスト認証とあわせて解説