プログラミング

【Python3】実際にラズパイでcronを動かしてデータの採取をしてみた

コマンドシェル

おはようございます。じぇいかわさきです。

 

この前Macでうまく行ったPythonプログラムを、ラズパイに移植してからcronで動かしてみようとしたんです。

 

しかし、そうは桑名の焼き蛤、そこからが試練の始まりでした。なにせ、前動いた実績のあるcronが全く動かないんです。

 

Python3だけでなく、Linuxの知識も必要になってきました。これはおじさんには結構きついぞ!

 

コマンドシェル

 

 

 

最初のつまづき

ラズパイにPythonプログラムを移植して、なんとか動くようになったのだが、その次の段階で一番最初に躓いたのは、cronが全く動かないんだ。

 

アレ?って思うよね。

 

一番最初にDHT11のデータを取得して、CSVファイルに吐き出すプログラムを作り、それをcronで動かした実績はある。

 

従って、絶対に間違っているとは思っていなかった。

 

当然、cronを疑ってはいなかったので、他の要因を一生懸命に探したんだ。確かに、新規に作ったPythonプログラムなのだが、Thonnyから実行する場合には問題ないが、コマンドラインから実行するとダメなんだよね。

 

ファイル実行

[ads]

 

つまりこういうこと。

 

python3 /home/pi/rasptemp/rasptemp.py

 

恐ろしいことに、これで動かないんだよ。

 

で、よくよく見ていったら、rasptemp.pyというファイルに、実行県が付与されていなかった。アクセス権が読み書きはできるが実行ができない、644になっていたので、これを755へ変更した。

 

これでrasptemp.pyには実行権が付いたので、もう一度先のコマンドをターミナルから打ってみた。

 

今度はちゃんとデータが書き込まれるようだ。従って、PythonのプログラムまではOKで、実行も可能となった。が、まだcronが動かない。

 

cronのLogをチェックすると、エラーが2つ出ていた。1つはMTAが無いようというエラー。もう一つが、どうやら実行不可のようなんだ。

 

まず、MTAが無いと怒られたので、aptを利用してインストールを実行する。

sudo apt-get install postfix

 

インストールが完了すると、メール設定を聞いて来るが、特に使用するわけでもないのでローカル使用で設定を行った。

 

rootで実行しているはずなので、アクセス権が無い事など考えられないんですよ。もちろん、crontabの設定はrootで実施している。

 

実はここに大きな落とし穴が有った事が判明したんです。

 

 

まず、ラズパイは電源を入れると自動的に立ち上がるしくみになっている。これはそういう仕様のようなんだよね。つまり、ある特定ユーザーでログインしているってことなんだ。

 

そのログインしているユーザーはrootではなく、初期値ではpiというユーザーなんだ。だから、ターミナル画面をよく見ると

pi@raspberrypi : ~$

こういう表示になっているはずだ。

 

つまりだ、cronの設定はrootではなく、piのcrontabを設定しなければならない

 

ここまで分かるに、1時間以上の時間を費やした。

 

rootのcrontabに書いた内容と全く同じ内容を、piのcrontabに書き込んだ。そしてcronを再起動!

sudo cron restart

 

この後、10分経過したらちゃんとcronが動いているかを、MariaDBのテーブルにて確認を実施する。

 

すると、cronはちゃんと動いているようだが、最初の1回はちゃんと正しいデータが入っているが、2回目移行は温度、湿度の値は0になっている。

 

 

データが記録されない問題を解決

どうしてデータが入らないのか?またプログラムが悪いのか?いろいろと考えを巡らせた。

 

せっかくMariaDBに接続して、センサーが検出した値を書き込むところまで行ったのに。またしても立ちはだかる大きな壁!

 

なんでかな?ってプログラムを眺めながらあることに気がついた。

 

そう言えば、今回仕様しているDHT11というセンサーの仕様で、データを採取した際に6秒以上開けないと、データが取得できずに0となってしまうという事を思い出した。

[ads]

 

今回、cronで動かしているのは10分毎なので、6秒よりは遥かに大きくそのような不具合が出るはずもないと思っている。しかし、結果としては全く同じ0となってしまうことなので、この対策方法を使うことにした。

 

つまり、温湿度の値を採取した際に、0だった場合にはもう一度データを採取し、0以外になるまで実行するということだ。

 

追加したのは、

While True:
   stat = shtStat.read()
   temp = stat.temperature
   humd = stat.humidity
   if stat.temperature == stat.humidity == 0:
    continue
   break

というルーチンを追加して、0とならないようにした。

 

プログラム改版

 

こうすることで、0のデータは無くなった。

 

24時間以上の連続運転を実施したら、ちゃんと10分ごとにデータを採取してテーブルに記録していた。

ランニングデータ

 

 

まとめ

全くの素人で始めたPythonやMariaDB。更にはLinuxの知識も必要となってきた。

 

今回も、一般的に使っているWindowsやMacからは思いもつかない理由で、プログラムが動かないということばかりだった。

 

しかし、ネット選べると近いような情報はあるが、バージョンが違ったり、古い内容だったりして、必ずしも使える内容ではない。

 

しかし、解決のヒントになる内容であることは間違いなく、これらの情報があるから自力でもなんとか解決ができるのだと思う。

 

このような事を繰り返していると、自分も何らかの形でデータを残していけば、同じようなことで悩んでいる人の助けに必ずなれるという自身も湧いてきた。

 

必ずしも同じではないが、必ず解決の糸口にはなると思う。是非、みんなの役に立ちたい。

 

そう思いながら、今日もまたなんで動かないのだろう?という難題に立ち向かっている。

 

 

[twt]

ABOUT ME
じぇいかわさき
進撃の社畜/弱小プロブロガー 本ブログは、還暦で定年の世代の筆者が、まだまだやれるという事を証明するために新たな事に挑戦した事を情報発信しているブログです。同世代の人達に対して、まだまだいろいろと頑張れる、第二の人生を楽しく生きていく為に現状維持は退化、失敗の反対は行動しないことを座右の銘とし、思い立ったことにチャレンジした記録です。また、せっかく稼いだ収益を騙し取られないように、毎日来る迷惑メールなどのネットリテラシーについても情報発信をしています。最近はプログラムにも挑戦しだしました。 このブログは ネットリテラシー ブログ 働くこと について書いており、第二の人生で頑張る同世代の心に刺さる記事を目指してます。人生100年、まだまだがんばれます。 >> Twitterをフォローする