質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • HTML

    8708questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • Python

    7532questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Heroku

    825questions

    HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

  • Flask

    199questions

    FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

センサから取得したデータをブラウザ上で見れるようにしたい!

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 224

ryoty

score 1

 前提・実現したいこと

ラズベリーパイ3 ModelB を温度・湿度・気圧センサと接続し,取得データをpythonでherokuに送信し,ブラウザ上でデータを見れるようにしたいです.
・送信側:python
・受信側:flask
以下のサイトを参考にプログラムを作りました.送信側プログラムはcronで定期的に動かそうと考えています.
【Linebot #3】家の温度をLineで通知するアプリ (BME280使用)
第39回「ラズベリーパイで温度・湿度・気圧をまとめて取得!AE-BME280でIC2通信」
[Python] 軽量WebフレームワークのFlaskに入門(準備、起動、HTML、静的ファイル、GET、POSTなど)

pythonを始めて約2週間なので,イマイチ分かってないです…

 発生している問題・エラーメッセージ

herokuにデプロイし,heroku open で見てみると以下のメッセージが…

Method Not Allowed
the method is not allowed for the requested URL.

 該当のソースコード

・送信側 app.py

#coding: utf-8
import bme280_custom #データ取得プログラム
import urllib.request, urllib.parse

csv = bme280_custom.readData()
list = csv.split(",")
press = list[0]
temp = list[1]
hum = list[2]

def post_message(t, p, h):
    print("post")
    data = {}
    data["temp"] = t
    data["pres"] = p
    data["hum"]  = h
    server_addr = "https://xxxx.herokuapp.com/"
    try:
        data = urllib.parse.urlencode(data).encode("utf-8")
        with urllib.request.urlopen(server_addr, data=data) as res:
            res = res.read().decode("utf-8")
            print(res)
    except:
        print('error')

post_message(temp, press, hum)


・受信側 server.py

# coding: utf-8
from flask import Flask, request, render_template
app = Flask(__name__)

@app.route("/",methods=['POST'])
def info():
    t = float(request.form['temp'])
    p = float(request.form['pres'])
    h = float(request.form['hum'])
    return render_template('index.html',t=t,h=h,p=p)

if __name__ == "__main__":
    app.run()

・index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
  </head>
  <body>
    <div class="container">
      <div class="header">
     <form method="post">
        <h3 class="text-muted">温度:{{t}}℃,湿度:{{h}}%,気圧:{{p}}hPa</h3>
     </form>
      </div>
    </div>
  </body>
</html>


・Procfile

web: gunicorn app:app

 試したこと

アプリケーション?自体は開いてるのでflask側のプログラムがおかしいと思い調べるも解決せず…
私は以下のようになると考えています.
1.取得したデータを指定したURLに送る
2.デプロイされたプログラムをopenするとデータが見れる
この考えは違うのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

原因はPOSTのみ許可しているのに、GETでリクエストをおくっていることです。

def post_message(t, p, h):
    print("post")
    data = {}
    data["temp"] = t
    data["pres"] = p
    data["hum"]  = h
    server_addr = "https://xxxx.herokuapp.com/"
    try:
        data = urllib.parse.urlencode(data).encode("utf-8")
        #ここでPOSTではなくGETを送っている。
        with urllib.request.urlopen(server_addr, data=data) as res:
            res = res.read().decode("utf-8")
            print(res)
    except:
        print('error')

以下のように変えてみてください。

def post_message(t, p, h):
    print("post")
    data = {}
    data["temp"] = t
    data["pres"] = p
    data["hum"]  = h
    server_addr = "https://xxxx.herokuapp.com/"
    try:
        data = urllib.parse.urlencode(data).encode("utf-8")
        #先にPOSTリクエストを作ってしまう。
        req = urllib.request.Request(server_addr, data=data, method="POST")
        #作ったリクエストを使って接続
        with urllib.request.urlopen(req) as res:
            res = res.read().decode("utf-8")
            print(res)
    except:
        print('error')

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/23 02:24

    回答ありがとうございます.
    試しましたが https://xxxx.herokuapp.com/ を開いても変わってなかったです…
    しかし app.py を動かすと変数 res の中身がプリントされるようにはなりました.

    herokuへデプロイするファイルは
    server.py Procfile requirements.txt templates(index.html入り) であってますでしょうか?

    キャンセル

  • 2018/06/23 02:42

    あ、ごめんなさい。理解が間違ってました。Raspberry Piからデータを送信してPCのブラウザで見たいって言うことでしょうか?

    キャンセル

  • 2018/06/23 02:51 編集

    https://gist.github.com/frodo821/6616da56252d01b118970dc952933b7e

    こうするとPOSTでデータ更新、GETで表示といった動作ができます。
    統計やデータの保存が必要なら、データベースの利用を検討してください。CSVという手もありますが、時間のスパンが巨大になる場合読み込みに時間がかかったり、ファイルサイズがとても大きくなるのでおすすめできません。

    キャンセル

  • 2018/06/23 10:54

    回答ありがとうございます!今回はブラウザ上でデータを見ることだけ考えています.
    結果ですが,herokuで動かすと温度のみ nan℃ と表示されます…湿度,気圧は表示されています.
    しかし,localで動かすと温度,湿度,気圧は表示できています.何が原因かよく分からないです…

    キャンセル

  • 2018/06/23 11:06 編集

    POSTで適当にデータを送れば表示されるはずです。
    想定動作としては、

    ①サーバー起動
    ②起動直後はデータが無いのでNaNを使用
    ③POSTでデータが送信される
    ④データを更新
    ⑤GET要求
    ⑥設定された値を表示
    ③④、⑤⑥を独立に繰り返す

    といった感じです。ですので、POSTでデータがセットされるまでの表示はNaNになります。
    どういった手順で動作確認しているのかよく分からないのでなんとも言えませんが...。

    キャンセル

  • 2018/06/23 11:10

    ですが温度が表示されない、と言うのは不可解ですねぇ...。温度のデータは何を使っているのでしょう?実測データですか?

    キャンセル

  • 2018/06/23 11:33

    実測データ使ってます…

    キャンセル

  • 2018/06/23 11:57 編集

    温度計のデータをログ表示できますか?たとえば湿度だけNaNであれば、湿度が正しく送信できていないと推測できます。気圧と湿度であれば、少なくとも気圧が正しく送信できていません。ですが温度だけNaNという状態は、そもそもNaNを送っていなければあり得ないはずです。確かめてみてください。

    キャンセル

  • 2018/06/23 12:29

    heroku logs のことでしょうか?

    キャンセル

  • 2018/06/23 12:48

    いえ。送信側のプログラムで送信するデータをロギングできないかな、と。温度計のデータがとれていない可能性がありますので。
    勿論heroku logでPOSTリクエストのステータスコードも見る必要があると思いますが...。

    キャンセル

  • 2018/06/24 13:19

    返信遅れてすいません
    時間をおいてから,サーバー起動→データ送信 を行うと全てのデータが表示されました!なぜNaNとなっていたのか不思議です.データも取得してましたし…

    キャンセル

  • 2018/06/24 16:33

    そうですか。無事解決してよかったです。

    キャンセル

  • 2018/06/24 23:23

    いろいろ教えてくださりありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • HTML

    8708questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • Python

    7532questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Heroku

    825questions

    HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

  • Flask

    199questions

    FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。