As I Please

MTのいんすとーるの練習と、その他びぼうろく・・・

raspberry pi3 に python3.9 をinstall

  • 投稿日:
  • by
バージョンを調べたら( lsb_release -a )、Release 9.13, stretch だった。 このバージョンで apt で標準的にインストールできる最新の python3 は 3.5だった。
raspberrypi# apt show python3
Package: python3
Version: 3.5.3-1
(略)
今回は influxdb2 のクライアントの influx-pythonをインストールしたい。で見ると、python 3.6以上となっているので aptの pythonは使えない。 pythonの別バージョンをインストールして venvで環境を切り替えて 使う. 通常のインストール参考例はここらへん。 configure のオプションに --prefix=/usr/local, などでディレクトリ指定すると無難か。 あとは、make; make altinstall と、altinstall で上書きしないようにするところ。 今回、python3.10系をインストールしようとしたら、openssl が 1.1.1以上を要求されてしまった。 aptで見ると1.1.0が最終なので、このままではインストールできなかった。 これがなくてもmakeはできるが、https通信他で支障を来すのはあきらかなのでちょっと検討。 で、日和って 3.9系を入れてみることにしたら、これは 1.1.0でもOKだったのでこちらで妥協。

influxdb + grafana + python3 + python-influx データ投入 stringになってしまった。

InfluxDB Error: unsupported mean iterator type: *query.booleanInterruptIterator

というエラーが出た。meanが取れない?何でと思って、influxの中で各種データを見たら、ジャイロ、加速度、温度、気圧、その他全てのデータが 'string'になっていた。 cactiで使っているプログラム(python3)で、redisからデータを取ってきて do.wirte_points で書き込んでるだけだけど、redisで引っ張ってきたデータが文字列処理をしていることもあり、string形式を保ったまま influxdbに放り込まれてたっぽい。 float()とか int()(バッテリーは%の整数値)とcastして放り込み直して解決。


switchbot 温湿度計2つ目 交換品

がamazonから送られてきたのでさっそくつ買ってみた。冷蔵庫の中に新しいものと古いものをほぼ同じ場所に置いて計測。(cactiから influxdb + grafana に移行中)

古いswitchbot温湿度計
switchbot_old_b.png

新しいswitchbot温湿度計
switchbot_new_b.png


データは5分に1回取得するように設定。一目瞭然で、新しい方はほぼデータを拾えているのに、古い方は1時間1回程度。
製品の性能にばらつきありすぎのような気もするけど、中華製ならこんなもんですか?
とりあえずこの新しいものを冷蔵庫に。
また、gatt でエラーが出る件についても、新しい方では解消しなかった。
charastaristicsは同じようだが。。。
ただ、公式githubには、同じことを言っている人がいる。2022/02/10 の投稿のようなのでやはり最近の話っぽい。公式のレスポンスは無いが、そろそろ何か書き込みあるかも。

switchbot 温湿度計2つ目

家の中にセンサーを置いていろいろ(安価に)計測するのに、4年前にはテストで CC2650STKを購入して BlueToothでデータの取得とかやってたが、単純に 温度・湿度程度であれば、SwitchBotの温湿度計が良さそうということで購入してみて、データを取り始めていた。Switchbotハブミニと一緒に導入したら nature remo と同様に Cloudにデータが上がり、auth0 の認証で APIを叩くことで温度・湿度のデータが取れる。が、すでに nature remoもあるし赤外線リモコンはもう不要だし、そもそも Bluetooth でローカルにデータは出ている、RSSIとBatteryはAPIでは取得できず、なので、4000円弱出して ハブミニを買うのをためらっていた。
室内の温度とは別に、冷蔵庫(飲み物用の、出し入れ扉がガラス製)が夏にはときどきエラーを出して内部温度が上がってしまうことが月に1度程度発生していたので、それを検知するのに、もう1つswitchbot温湿度計を買って今年の夏に備えることにてみようと考えた。
CC2650だと、2分以内に connect して繋ぎ続けないと BLEの接続が切れてしまう仕様で消費電力が多くなるが connect しながら使い続ける必要があり、そうなると電源(CR2022)の寿命問題があるので外付けで単3x8本(2本直列x4並列)など作ってみたが最長3ヶ月くらいしかもたなかった。もっとうまいハンドリング手法があるのだろうけど、、、と思いながら switchbot を使ってみたら単4電源2本で半年は優に問題なくデータを出し続けていて、かつ、バッテリー表示が100%と本当か?と思えるくらい。温度だけだけど安定してデータが長期間取れるのであれば、まずはこれで冷蔵庫のモニターは必要十分ということで、amazonでもう1つ買ってみた。

ここから時系列で書いてみると、


  • 新Switchbotで接続・データ取得はうまくいく。ただし液晶の温度で数字で2,3カ所表示されないところがあって、これはちょっと何だかな・・・まぁ冷蔵庫の中に入れるので問題ないか。

  • これを冷蔵庫の中に入れたら、データが電波強度が激減。データがraspberyy pi3では取れない。が、同じ場所にいる iPhoneアプリからは取得可能。でかつ過去データの取得もOK.冷蔵庫の扉のガラス、2重でUVカットとかをうたっているのでこれが影響?

  • データを取得するために、タイムアウト対応を強化(取れないときはあきらめる)したプログラムで動かしてみるが、やはり3時間に1度くらいしかデータを拾って来ない。raspberryp pi3の位置・角度を変えたりしてみたがなかなか良いところは見つからない。

  • 電池消耗を抑えるために、BLEの advertisingデータを拾って温湿度等を取っていたが不安定。アプリだとしっかりconnectしてデータ取得しているようなので、公式のgit.hubにあるpython-hostを見て、connect してデータを取得しようとしたら、古いものはデータが来るが、新しく購入した方はデータが取れない。Errorを返す。どうも、GATTを発行しているところで error になる。2つとも firmwareは同じバージョン(2.6)なのに、、、?とはいえ、CC2650STKでもあった話だから、bluetooth機器だとよくある話なのかも

  • ふと思い立って、古いほうの switchbot を冷蔵庫の中に入れて運用してみたら、これも電波強度は落ちているかもしれないが、raspberry pi3でデータは取得している。時に欠損するときもあるが新しいものとは段違いに取れている。これ、同じものとは言えない?


ということで、同一製品とは言えどうも中身が違うのでは?という感じ。
新しいもののほうが劣化版のような気がするので、液晶表示が欠けるのを理由に、返却・交換してもらうことに。新しいものも劣化している可能性はあるが。

YAMAHA AV AMP RX-600S 保護回路のリセット

YAMAHA RX-600S があるときから電源が入らなくなった。全く入らない、というよりも電源onしても直後に切れる。サポートに電話すると、保護回路が働いているようです、とのこと。
Amazonで購入したもので、修理・確認にはサポートに持ち込みか量販店などに修理依頼をしてほしい、チェックでも機材やりとりで最低でも8000円くらいから、あとは故障内容に応じてとのこと。

保護回路が単に働いていて、これをリセットする方法は?と聞いても教えてくれないので、どうしようかと考えていて3ヶ月経って、あらためて webで検索したら、同様の問題に対処している人がいた。
https://john-rama01.hatenablog.com/entry/2021/07/15/073914 この方は RX-583ということだったが、同じYAMAHAのAVアンプだし、何か同じ方法だろうと思って見てみると、保護回路リセットは 'tone control' + 'info' + 'power' とのこと。RX-600Sには 'tone control' が無いのでそれっぽいのを探すと、
'info' + 'direct' + power on の同時押しがBINGO。

これで保護回路はリセットされたので、OK,復帰、かと思ったが、、、数回スピーカーから音が出たがまたもや保護回路が働いたようだ。
表示を見ると 'DC PRT 000L' という表示。これは 検索するといろいろすぐに出てきて、DC Amp abnormal voltage, ということでやはり故障確定のようだ。

さて1万(以上)かけて直すか。。。 602Sも生産終了みたいだし、後継機種の生産予定も無いようなのでちょっと困る。。。 サウンドバーをいくつか探してみたけど、やはり帯に短しな感じだし。。。

メールがspamassasin (sa-spamd) を通っていない。

spamassasinは怪しいメールには、メール本文の冒頭に警告メッセージをつけてくれるので、スマートフォンなどのメール通知で怪しいメールが来たかどうかをすぐに見分けることができる。本当はすぐに隔離して mailboxに入らないようにすればいいんでしょうが。。。
ところが最近、別のサーバ(MX secondary)に届くメールにそれが入らなくなってしまった。どうも milterでsa-spamd を通らなくなってしまったようだ。
milter-manager ? spamd ? socketのowner,permission ? 何が悪いのかよくわからないまま、perlのライブラリ、ruby、openssl,gpgなどいろいろアップデートしてみたが、なかなか解決と行かなかった。


/var/log/spamd.log をつぶさに追っかけて、spamdがちゃんと起動していないのが原因のよう。
どうも sendmail をバージョンアップしたときからおかしくなってしまったよう。


error: Can't locate Net/SSLeay.pm in @INC
spamd: error: Bad arg length for Socket::unpack_sockaddr_in, length is 28, should be 16

あたりが問題だったようで、以下の記事を参照に、Socket6 を再インストールしたら解決した。
https://freebsd.sing.ne.jp/daily/09/09/05.html

let's encrypt のサーバ証明書を使っていて、iphoneのメールアプリでエラーが表示される件

let's encryptの無料サーバ証明書を、httpsサーバ(このサイト)や他サイトでも利用していて、webだけではなくて、smtp(s)でも流用できるので使っていた。
メールも受信(server)・送信(client) がデフォルトで smtps/starttls を利用するようになってきているようで、
グローバルにauthorized された証明書を使っているほうが、いろいろ良さそう。
imapsは相変わらずプライベートCA+証明書を利用しているけど。

先日、2021/09でlets encrypt の証明書のCA問題の影響を受けて、iOSの標準のメールアプリからメールサーバ(smtps)の接続がうまくいかない(メールが送れなく)なった。imapsでの接続でメールの取得・閲覧はうまくいっているに。
ということでいろいろ調べてみると、openssl 1.0.2 ではCA証明書への辿りの解釈に難があるよう。
で、問題を起こしているのは sendmail が共有ライブラリとして libssl.so をリンクしていてその中身が 1.0.2(またはそれ以前)のホストばっかり!ということに気づいた。opensslは 1.1系を /usr/local/bin/openssl にインストール,libssl.so は /usr/local/lib/ あたりにいたが、sendmailのを作成したときには /usr/lib/libssl.so あたり(/usr/bin/openssl は version 1.0.2!) の共有ライブラリをリンクしていた!
なので対応としては、


  1. openssl 1.1系列(今の最新は1.1.1l)をコンパイルして、共有ライブラリのバージョン(1.1.1)を用意する。

  2. sendmailを作成し直して、openssl(libssl.so or libssl.a) をリンクし直す。


ことに。
sendmailも8.15.2と思ったら、8.17.1が最新なのでこれも sourceから持ってきて recompileした。
$src/devtools/Site/site.config.m4 の設定をよくみて、、、。
EOLになってしまっている、FreeBSD-11.4だと、

APPENDDEF(`conf_smrsh_ENVDEF', `-DCMDDIR="\"/usr/local/libexec/sm.bin\""')
APPENDDEF(`conf_smrsh_ENVDEF', `-DPATH="\"/bin:/usr/bin\""')
define(`confEBINDIR',`/usr/local/libexec')
define(`confMANROOT',`/usr/local/man/cat')
define(`confMANROOTMAN',`/usr/local/man/man')
define(`confMBINDIR',`/usr/local/sbin')
define(`confSBINDIR',`/usr/local/sbin')
define(`confUBINDIR',`/usr/local/bin')
define(`confNO_STATISTICS_INSTALL',`True')
define(`confHFDIR', `/usr/local/share/sendmail')
APPENDDEF(`conf_sendmail_ENVDEF', `-DTCPWRAPPERS')
APPENDDEF(`conf_sendmail_LIBS', `-lwrap')"
APPENDDEF(`conf_sendmail_ENVDEF', `-DNETINET6')
APPENDDEF(`conf_libmilter_ENVDEF', `-DNETINET6')
APPENDDEF(`conf_libsm_ENVDEF', `-DNETINET6')
APPENDDEF(`conf_sendmail_ENVDEF', `-DDANE')
APPENDDEF(`conf_sendmail_ENVDEF', `-I/usr/local/include')
APPENDDEF(`conf_sendmail_ENVDEF', `-DSASL=2')
APPENDDEF(`confLIBDIRS', `-L/usr/local/lib')
APPENDDEF(`conf_sendmail_LIBS', `-lsasl2')
APPENDDEF(`conf_sendmail_ENVDEF', `-DUSE_BLACKLIST')
APPENDDEF(`conf_sendmail_LIBS', `-lblacklist')
APPENDDEF(`conf_libmilter_ENVDEF', `-DMILTER')
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
APPENDDEF(`conf_sendmail_ENVDEF', `-DHASSRANDOMDEV')
APPENDDEF(`confINCDIRS', `-I/usr/local/include')
APPENDDEF(`confLIBDIRS', `-L/usr/local/lib')
APPENDDEF(`confLDOPTS', ``-Wl,-rpath=/usr/local/lib'')
APPENDDEF(`conf_sendmail_ENVDEF', `-DSTARTTLS -DTLS_EC')
APPENDDEF(`conf_sendmail_LIBS', `-lssl -lcrypto')
APPENDDEF(`conf_sendmail_ENVDEF', `-DPICKY_HELO_CHECK')
sendmail-8.15のときとの違いは、、、'_FFR_TLS_EC' だったものが 'TLS_EC'と正規?なパラメータ名になったこと、くらいか。いつものように、milter,sasl2,あたりをlinkすることも忘れないように。

sendmailを展開した $srcトップ にて、'sh ./Build;sh ./Build install'
実はこの作業の前に FreeBSD 11.2 -> 11.4, perlの入れ直し、gccの入れ直しなど大工事あり・・・
それにしても、、、古い OSを使い続けるとどんどん大変になる。

sshへの不正アクセスが多いので、denyhosts をいまさらながらに導入

しつこいのは手動で /etc/hosts.allow をメンテしていたり、/etc/ssh/sshd_config で MaxAuthTries 2 とかですぐにたたき落とすようにしていたけど、やはり自動化しておいたほうが無難かと。

http://tokcs.com/2012/12/freebsd-denyhosts%E3%82%92%E5%B0%8E%E5%85%A5/を見つけてdenyhostsが簡単そうなので、インストールしてみる。
portsから入れたが、python3 が入っていればすんなり入る。
/sbin/iptables を起動しようとしたりするけどとりあえず放っておく。
早速起動したら、/var/log/auth.log を見て、3つのIPアドレスを denyした。
台湾、フランス、ロシア(シベリア)
今後はこの手は必須で入れておく必要ありかなぁ。。。時にアドレスリストのメンテが必要かもしれない(膨大に増えていく?)けど。


ubuntu20 でのサービスの起動・停止・自動起動など

FreeBSDなら 自動起動は /etc/rc.conf あたりで設定、個別のサービスの on/offは /etc/rc.d/, /usr/local/etc/rc.d/ あたりを見るというのは身体に染みついているけど、linux系はよく分かっていなくて、再起動するとサービスが立ち上がってこなかったりというのをよくやらかし、結局よくわかってない。systemctl 使いにならなくては。。。

とりあえず、まとままとまとまっているのは、https://eng-entrance.com/linux_startupあたりか。
start/stop/restart , enable/disable あたり。
サービス一覧は、systemctl list-units あたり?

CentOS6 の /etc/init.d あたりの記憶から抜け出さないと。

webコンテンツの localキャッシュ時の改行コード問題

jsonの内容を定期的にチェックするのに、一度取得してきた textデータをローカルに保存して、毎回比較(本当は headや not modifiedを利用すべきだろうけど、perlのlibwww,LWP::Simple の mirrorのようなものが見当たらなかった)することに。
単純に、requests.get, write したファイル内容と、次回の取得したデータを比較しても毎回違う結果になって、なぜ?と思ったら、元のテキストファイルが DOS形式(LF+CR)で、writeしたときに LFに置き換えてるということだった。
そのため、毎回取得して比較しても同じということに。
ということで回避策は、open()のときに newline='' のオプションをつけて改行を変更しないということで。
https://www.curict.com/item/1b/1b608b2.html
これでまた3時間。。。