Skip to main content

ラズパイとDHT11。温度と湿度を自動的にGoogleスプレッドシートに記録しています。

やっと重い腰を上げてラズベリーパイなるものに手を出しました。
これからの時代IoTだと。
プログラミングなんてほとんど知らないのでインターネットから先人の方々のお知恵を拝借しました。
参考にしたサイトはこちら。
簡単にRaspberryPi+DHT11で気温と湿度を通知するTweetBotを作る。

ラズパイを通じてIoTデバイスからtwitterにつぶやいてみる(DHT11+IFTTT編)

両方とも温度と湿度をTwitterに通知するところまでやっています。
私は…
挫折しました。

TwitterのAPI取得がめちゃくちゃ手間だったのです。

ですので、webhooksというものを使いIFTTTに飛ばし、そこからGoogleスプレッドシートに書き込んでいくという形にしました。

まず、ラズベリーパイをインストールし、設定などやっていきました。

家にUSBキーボードがなかったのでVNCでノートパソコンで操作できるようにしました。
 
よりDHT11の接続、温度と湿度の取得を行いました。
プログラムがどうなっているかほとんどわかりません。少し英語の力でこうなのかなと思えるくらいです。
超初心者。
 
なんとか温度、湿度が出るようになりました。
それをどう手元で確認できるようにするのか。
TwitterだとAPIに登録するところでめんどくさくなってつまづきました。
IFTTTはどうか?
Google大先生に教えを頂き、直接IFTTTではなくwebhooksというものを間にいれるということを知りました。
そこで、
ここでつまづきました。
  dht11_ifttt.py
# -*- coding: utf-8 -*

import RPi.GPIO as GPIO
import dht11
import time
import os
import sys

sys.path.append('/path/to/program/') #auth_ifttt.pyのありか

import json
import requests
from auth_ifttt import(
    ifttt_key
)

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

instance = dht11.DHT11(pin=21)

def getInfo():
    while True:
        result = instance.read()
        if result.is_valid():
            #print('温度:', str(result.temperature), '℃です。')
            #print('湿度:', str(result.humidity), '%です。')
            pass
        break
    time.sleep(1)
    return result

def commInfo(current_time, res):
    #IFTTT Webhooks
    str_key = ifttt_key
    str_event = "DHT11"
    str_headers = {'Content-Type': 'application/json'}
    str_json_data = {
        "value1" : current_time,
        "value2" : res.temperature,
        "value3" : res.humidity
    }
    str_url = "https://maker.ifttt.com/trigger/"\
              + str_event\
              + "/with/key/"\
              + str_key
    #print(str_url)

    jd = json.dumps(str_json_data)

    print("begin request")
    s = requests.Session()
    r = requests.post(str_url, data=jd, headers=str_headers)
    #print("status code : ", r.status_code)
    print("end request")

    if r.status_code == 200:
        return r.text
    else:
        return "error occurred!!"

if __name__ == '__main__':

    #time stamp
    timestamp = 'date +%F_%H:%M:%S'
    current_time=os.popen(timestamp).readline().strip()

    res = getInfo()
    rt = commInfo(current_time, res)
    print(rt)
どうやっても温度と湿度が出てきません。0になるのです。
プログラミング超初心者。どこをどう変えてもうまくいきません。
試行錯誤、Google大先生の聞いてもわかりません。
最後の望み、知人。
彼からラズパイの面白さを聞いたと言っても過言ではありません。
彼にどうすれば最後の値が返るのか尋ねました。
ちょっとしたら、彼は言います。
このプログラム、変だ。と。
なぬっ。
 
def getInfo():
    while True:
        result = instance.read()
        if result.is_valid():
            #print('温度:', str(result.temperature), '℃です。')
            #print('湿度:', str(result.humidity), '%です。')
            pass
        break
    time.sleep(1)
ここのpassが入らなくてbreakとtime.sleep(1)を一階層下げないといけない。と。
なんと。
そんなことがすぐわかるのか。
ということで修正しました。
最後、値が返るのか確認のためにprintがいくつか入っています。
# -*- coding: utf-8 -*

import RPi.GPIO as GPIO
import dht11
import time
import os
import sys

sys.path.append('/path/to/program/') #auth_ifttt.pyのありか

import json
import requests
from auth_ifttt import(
ifttt_key
)

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

instance = dht11.DHT11(pin=14)

def getInfo():
while True:
result = instance.read()
if result.is_valid():
print('温度:', str(result.temperature), '℃です。')
print('湿度:', str(result.humidity), '%です。')
break
time.sleep(1)
return result

def commInfo(current_time, res):
#IFTTT Webhooks
str_key = ifttt_key
str_event = “DHT11"
str_headers = {'Content-Type': 'application/json'}
str_json_data = {
"value1" : current_time,
"value2" : res.temperature,
"value3" : res.humidity
}
str_url = "https://maker.ifttt.com/trigger/"\
+ str_event\
+ "/with/key/"\
+ str_key
#print(str_url)

jd = json.dumps(str_json_data)

print("begin request")
s = requests.Session()
r = requests.post(str_url, data=jd, headers=str_headers)
#print("status code : ", r.status_code)
print("end request")

if r.status_code == 200:
print(res.temperature, res.humidity)
return r.text
else:
return "error occurred!!"

if __name__ == '__main__':

#time stamp
timestamp = 'date +%F_%H:%M:%S'
current_time=os.popen(timestamp).readline().strip()

res = getInfo()
rt = commInfo(current_time, res)
print(rt)
 
これで、値がWebhooksを通じてIFTTTへ行くようになりました。
IFTTTからGoogleスプレッドシートへ行くようになっています。
 
ちなみにこのプログラムはcronで1時間おきに動くようになっています。
 
 
なんとか完成。
知人、ありがとう。めちゃくちゃ助かった。
 

Comments

Popular posts from this blog

Seed of...

Pine tree. Very big. I've never seen there big pine tree seed. You can eat it... Maybe

弁当肥という技術

台風通過中で季節外れの大雨です。 今季の稲ですが、なんだか出穂が少ないように思いました。 肥料なのか水なのか。 肥料は少なく1回多めに散布しました。 総量は同じですが、1回の量は減らしています。 イネがほしいときに少なかったのかもしれません。 ただ、丈は良いのです。 灌水もできる限りしました。 しかしながら、穂の数が少ないのです。 有効分げつが少ないという言い方をします。 なぜなのか。 調べてみると肥料が少ないとのことでした。 その中で ”弁当肥” という言葉がありました。 何という意味なのか。 田植え5日前くらいに追肥をして田植え後の栄養にする肥料だそうです。 それによって田植え後の活着を良くして生長させるようです。 田植えに弁当を持っていくことから弁当肥と言うらしいです。 そう言われるとフィリピンでもそれをしています。 忘れましたが現地でも言葉があるくらいです。 最初、やる理由がわからなかったのです。 田植えしたら早く元気になると言われました。 体内に栄養を保持してるのか疑問でしたし、ちょっとおなかがすいている方が頑張って根を伸ばすだろうと思っていました。 ですので育苗の時には肥料を少ない目にやっていました。 ひょっとしたらそれが理由なのかもしれません。 なかなか思ったようにはいきません。 皆がしている技術には理由があることを改めて思い知らされました。 農業において引く、減らすというのは慎重にしなければならないようです。 … 調べるのは次回、来年の雨季になってしまいます。 準備はできるだけしなければいけないのですが、なかなか結果を見て対処しなければいけないことが多いです。

Verlorenen