2017-02-06 9 views
0

ラズベリーパイとPIRセンサーを接続しています...私はセンサーの入力を得るためにPythonスクリプトを書いています...今、私のウェブサイトのさらなるアクションのためにPHPのpythonスクリプトからの出力が必要です...私は次のコード:pythonスクリプトからPHPに動的に出力する方法は?

<?php  
    $output=shell_exec('python/sense1.py'); 
    echo $output; 
?> 

これは、Pythonのコードは次のとおりです:これはPHPコードである私はPythonで、単一のprint文を試してみましたが、... PHPで出力を得た。しかし、今問題がある

import RPi.GPIO as GPIO 
import time 
GPIO.setmode(GPIO.BOARD) 
PIR_PIN = 26 
GPIO.setup(PIR_PIN, GPIO.IN) 
while True: 
    time.sleep(1) 
    if GPIO.input(PIR_PIN): 
     print ("Human Moving") 
    else: 
     print ("No human moving") 

Pythonスクリプトは無限に1秒ごとに出力を返しています...だから、私はpythonスクリプト(無限ループのbecoz)から出力を得ることができません...しかし、私はtをしたい彼はPIRセンサーの状態をチェックするために1秒ごとに出力します...どうすればいいですか?私を助けてください...

+1

[PHPでリアルタイム出力でプロセスを実行する]の可能な複製(http://stackoverflow.com/questions/1281140/run-process-with-realtime-output-in-php) – insertusernamehere

+0

それぞれを保存することができますセンサーのアクティビティのすべてのログをローカルのsqlite Dbまたは他のDBにコピーし、PHPアプリケーションが接続されている中央DBに更新するスクリプトを実行します。 – webDev

+0

もう一つの可能​​な方法は、pythonフラスコを使用してREST APIエンドポイントを作成し、このコードをフラスコの残りのエンドポイントコードの中に置くことです。フラスコは軽量で、このセンサーコードを含む小さなファイルを書くだけです。GETメソッドまたはPOSTメソッドを使用して、PHPからこの残りのエンドポイントを簡単に呼び出します。 – webDev

答えて

-2

あなたのpythonスクリプトでは、テキストファイル(それを表示するのではなく)にセンサー値を書き、それをループでPHPで読み取る必要があります。

または、Pythonスクリプトからループを削除するだけです。その後、Pythonスクリプトを起動すると、ただ1つの値が出力され、PHPでスクリプトを実行します。問題は、PHPがページを一度生成し、値を再ロードしないことです。その後、毎秒ページをリロードして値を実現することができます。

+0

センサーはアクティビティを連続的に読み取る必要があります。センサーは各アクティビティを記録し、PHPに報告する必要があります。 – webDev

+0

私はあなたの答えを強調している理由を理解できません。これは自宅で私の機器で使用する方法で、完全に機能しています。センサーはデータを連続的に読み取りますが、ループの代わりにスクリプトを再起動するだけです。 – saperlipopette

+0

私はバディを強調しなかった、私はちょうどコメントした。 – webDev

0

ラズベリーPIの温度センサーと同様のことをやっています。 Pythonフラスコを使用して作成したREST APIを呼び出すことによって、部屋の温度レベルがわかりにくくなっています。

(あなたは自分のセンサコードと温度センサのコードを交換する必要がある)私がやっている何をここで

MY Pythonのフラスココード:

@app.route('/room-temp') //This is my get rest endpoint, i call from php 
@requires_auth //You dont need authentication, so you should remove this 
def room_temp(): 
    pi = pigpio.pi() 
    pigpio.exceptions = False 
    c, files = pi.file_list("/sys/bus/w1/devices/28-00*/w1_slave") 
    pigpio.exceptions = True 
    if c >= 0: 
     for sensor in files[:-1].split("\n"): 
      devid = sensor.split("/")[5] # Fifth field is the device Id. 

      h = pi.file_open(sensor, pigpio.FILE_READ) 
      c, data = pi.file_read(h, 1000) # 1000 is plenty to read full file. 
      pi.file_close(h) 

      if "YES" in data: 
      #gc.collect() 
      (discard, sep, reading) = data.partition(' t=') 
      t = float(reading)/1000.0 
      #print("{} {:.1f}".format(devid, t)) 
      data5 = {'temp':"{} {:.1f}".format(devid, t)} 
      pi.stop() 
      return jsonify(data5) 
      else: 
      #print("999.9") 
      #gc.collect() 
      data6 = {'temp':"999.9"} 
      return jsonify(data6) 

私はラズベリーにこのフラスコAPIを実行していますし、私は私のPHPアプリケーションからajax呼び出しを行います。私はPHPからhttp://raspberryip:port/room-tempへAJAXコールを行います。

注: Python Flask(Link)でREST、REST、PHPからAJAXを参照するだけでいいです。

これはセンサーから結果を得るのは非常に簡単ですが、Pythonフラスコで書かれたRESTエンドポイントにAJAXリクエストを送るのに数ミリ秒かかることが問題です。だからあなたはあなたとあなたのすべてのセンサーの活動をローカルのDBにあなたがPythonスクリプトを継続的に実行することによってあなたを格納する必要があり、あなたはその軽量DBから値を取得することができます。ラズベリーからフェッチした後、ラズベリーのレコードを削除してオーバーヘッドを無視することができます。
センサー上のすべてのアクティビティ。
推奨事項:センサの結果をローカルデータベースに保存してから、そのレコードをDBから取得するためのRESTエンドポイントを作成してください。あなたのAJAXコールをPHPアプリケーションからそのRESTエンドポイントに置いて、そのラズベリーのローカルDBからデータを取得します。

関連する問題