Python2.7X ```解決したいこと 下記のコードをcronに登録して一定時間ごとに動作させたいのですが 初回動作時に、03行目のLEDがONの状態で停止してしまいます。 LED-onはprintしません。 cronの登録内容 0-59/10 * * * * /home/pi/thpva.py 04-05行目を削除しても動作は同じでした。 なお、thpva.pyは sudo python thpva.py で正常に動作しています。 ```コード thpva.py 質問の当初に省略していたコード(前半、01行目-23行目を追記しました。 ---------------------------以下、追記 01 import RPi.GPIO as GPIO 02 import time 03 import commands 04 import datetime 05 import csv 06 import os 07 import bme280_custom 08 09 def GetV(): 10 check = commands.getoutput("i2cget -y 1 0x41 0x02 w") 11 return (int(check[4:6],16)*256+int(check[2:4],16))*1.25/1000 12 13 def GetA(): 14 check = commands.getoutput("i2cget -y 1 0x41 0x04 w") 15 if int(check[4:6],16)<128: 16 return (int(check[4:6],16)*256+int(check[2:4],16)) 17 else: 18 return (int(check[4:6],16)*256+int(check[2:4],16)-256*256) 19 20 21 GPIO.setmode(GPIO.BCM) 22 GPIO.setup(5,GPIO.OUT) 23 -------------------------------以上、追記 24 check = commands.getoutput("i2cset -y 1 0x41 0x05 0x0a 0x00 i") 25 26 GPIO.output(5,GPIO.HIGH) 27 print "LED-on" 28 time.sleep(1) 29 30 dir_path = '/home/pi/ina226-data' 31 32 now = datetime.datetime.now() 33 filename = now.strftime('%Y%m%d') 34 label = now.strftime('%H:%M') 35 csv = bme280_custom.readData() 36 va = str(GetV())+","+str(GetA()) 37 38 if not os.path.exists('/home/pi/ina226-data'): 39 os.makedirs('/home/pi/ina226-data') 40 f = open('/home/pi/ina226-data/'+filename+'.csv','a') 41 f.write("'"+label+"',"+csv+","+va+"\n") 42 43 #with open('/home/pi/ina226-data/'+filename+'.csv','a')as f: 44 # writer=csv.writer(f) 45 # writer.writerow ([GetV(),GetA()]) 46 #f.close() 47 48 GPIO.output(5,GPIO.LOW) 49 print "LED-off" 50 51 52 GPIO.cleanup() 53 exit
09~20行目までをコメントアウトしても22行目で消灯しないでしょうか?(途中で、例外エラーで異常終了していないか?)
LEDが点灯しなくなってしまいました。
sudo python thpva.py とすると点滅します。
マシンを再起動して再試行してみてください。前回実行時に異常終了などで「GPIO.cleanup()」が呼ばれず、GPIO状態がおかしくなっている可能性があるので。
(sudo をつけずに)python thpva.py した結果はどうなりますか?
あとひとつ。cronの登録はちゃんと「sudo crontab -e」で行いましたか?参照→http://denshikousaku.net/raspberry-pi-cron-and-python
再起動後、sudo python thpva.py および(sudo をつけずに)python thpva.py した結果LEDがON,OFFするようになりました。登録は「sudo crontab -e」で行っています。
crondの動作を確認するため「sudo /etc/rc.d/init.d/crond status」を実行したところ、「#/etc/rc.d/init.d/crond: コマンドが見つかりません」と表示されます。sudoをつけても同様です。
質問の当初に省略していたコード(前半、01行目-23行目を追記しました。 11行目のint()の引数が不正な書式ということでしょうか?どのように修正すればよいかご教示ください。
状況を整理したいのですが、まずはLED点灯→消灯のみの最低限のコードであればcronにて正常に繰り返し動作しますか?
はい、正常に動作しています。cronの動作に関しては解決したようです。
結論から言えば「i2cgetコマンドはフルパスで指定する(呼び出す)」ようにすればそのエラーについては解決すると思います。
10行目 check = commands.getoutput("i2cget -y 1 0x41 0x02 w")の「i2cget」でしょうか?
はい。現状ではcheckには意図しない結果(文字列)が入ってきていませんか?
10行目、14行目を「"/usr/sbin/i2cget」に修正し「ValueError: invalid literal for int() with base 16: '1:'」は解決しました。
その後、Traceback (most recent call last): File "/home/pi/thpva.py", line 40, in <module>
f = open('/home/pi/ina226-data/'+filename+'.csv','a')
IOError: [Errno 13] Permission denied: '/home/pi/ina226-data/20180118.csv'
のエラーが出てしまいました。20180118.csvのPermissionは内容の変更が「所有者のみ」となっていて変更できません。20180118.csvのPermissionは内容の変更が「所有者のみ」となっていて変更できません。 データの生成、書き込み時に何か指定が必要でしょうか?
/ina226-dataのパーミッションが、
「drwxrwxr-x」となっていたものを「drwxrwxrwx」と変更した結果、正常に動作できました。
丁寧に説明をいただきありがとうございました

回答1件
あなたの回答
tips
プレビュー