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

弁当肥という技術

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

Seed of...

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

恥という意識について

フィリピンで生活しているといろいろ考えられないことを経験できます。そして、日本の素晴らしさ(全てではないですが)を目の当たりにします。 … 最近、気にかかることしか 子どもたちにハポン(日本人)と言われること。 挨拶がペラ(金)と言われること。 … 日本ではなかなか言われません。 私が日本人だからですが、外国人に対してもそうは呼びません。 どうしてそう呼ばれるのか。 親がそう呼ぶからです。 フィリピンは貧富の差が激しく私が接しているのは小学校までしか行けないような人たちが多いのです。 悪い人たちではないですが、やはり教育が足らないように思います。 2番目の金と言われるのも親の影響だとは思いますが、教育なのかなと思ってしまいます。 日本ではどうかなと想像するのですが、恥ずかしくて言えない。と思いました。 … 恥というものが足らないのではないかと思います。 身なりが悪くて恥ずかしいというのはよくあります。 でも、そこまでです。内面に対して、目に見えない事柄に対して、恥はなさそうです。 以前、読んだのですが、知識、勉強というのは目に見えない事柄を認識できるようになる。というものでした。 私の周りのフィリピンにはそれが欠けているように思えます。 フィリピンは経済発展中で日本からも今までにないくらいに企業が来ています。 しかし、私には見せかけの発展なのかなと見えてしまいます。 上流階級は発展していますが、私の周りは変わらずです。 やはり教育なのかなと思ってしまいます。 … ヤサイを育てるのは3ヶ月。 コメを育てるのは6ヶ月。 果樹を育てるのは10年。 ヒトを育てるのは一生。 本質はすぐには変わらないようです。