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日前くらいに追肥をして田植え後の栄養にする肥料だそうです。 それによって田植え後の活着を良くして生長させるようです。 田植えに弁当を持っていくことから弁当肥と言うらしいです。 そう言われるとフィリピンでもそれをしています。 忘れましたが現地でも言葉があるくらいです。 最初、やる理由がわからなかったのです。 田植えしたら早く元気になると言われました。 体内に栄養を保持してるのか疑問でしたし、ちょっとおなかがすいている方が頑張って根を伸ばすだろうと思っていました。 ですので育苗の時には肥料を少ない目にやっていました。 ひょっとしたらそれが理由なのかもしれません。 なかなか思ったようにはいきません。 皆がしている技術には理由があることを改めて思い知らされました。 農業において引く、減らすというのは慎重にしなければならないようです。 … 調べるのは次回、来年の雨季になってしまいます。 準備はできるだけしなければいけないのですが、なかなか結果を見て対処しなければいけないことが多いです。

Ay yai yai

Just now i put schedule on my calendar. ... ... Ay!!! There are only 2 paper. I put the schedule on November. I saw also December. Dieses Jahr ist fast fertig gegangen... Es ist sehr schnell

フィリピン食べ歩き

フィリピンにもいろいろな外食?屋台?みたいなものがあります。 BBQ BBQを焼いている近くを通ると、炭火の良い香りがしてきます。 フィリピンでは、BBQというと、豚肉を一口サイズに切ったものを串に刺して焼いたものをいいます。 日本でいうと焼き鳥みたいなもの。 鶏肉でなくて豚肉、味付けも少し違います。 でもだいたい同じ。 豚肉のほかにも、ソーセージ、豚の耳、内臓とかがあります。 他にも、豚の血を固めたもの、鶏の頭もあります。 食べるときは、それを網の上にのせて焼いてもらいます。 で、数分後、焼き上がるので、それを、たれに浸して食べます。 たれは、通常、酢にタマネギ、トウガラシ等をつけたものと内臓から作ったソースをベースにした甘ダレがあります。 それを好みに合わせて浸します。 一串5ペソから8ペソくらい。 ビールがほしくなります。   続いて、フィッシュボール つみれみたいなものです。それを、油で揚げて食べるもの。 通常、フィッシュボールのほかに各種つみれ、ウズラの卵の天ぷら、鶏の軟骨などがあります。 食べるには、油で揚げて温めてもらいます。それを、BBQと同じようにたれに浸けて食べます。 こちらは、一串5ペソから10ペソです。 ここでの名物は、ワンデイオールド(One Day Old) 鶏がこの世に生まれて1日したひよこさんを熱い油のお風呂に入れてあげちゃいました。 残酷ですが・・・ ・・・ごめんなさい。おいしいです。   最後は、マミ。人の名前ではありません。 日本流にいったらラーメンです。 でも脂っこくなくあっさりしています。 トッピングは、チキン、ポーク、エッグがあります。 それに好み次第で、ネギ、トウガラシ、こしょう、酢などを使います。 酢を入れるとなかなかおいしいです。 もしかしたら、日本でもラーメンに酢を入れるとおいしいかもしれません。 一杯20から30ペソ。 おやつにも夜食にも良いです。