2017-07-17 40 views
0

我有這個應用程序的一些麻煩。我需要的是,如果我檢測到數據庫(FIREBASE)的變化,特別是在'sala'和'ventilacion'節點中,該功能就會做它必須做的事情。如果數據庫中沒有任何變化,它不會無所事事。我正在使用python和pyrebase庫。這是代碼。非常感謝您的幫助。如何使用python檢測firebase孩子的變化?

  import pyrebase 
      import serial 
      import time 
      config = { 
         #firebase configurations 
       } 


      firebase = pyrebase.initialize_app(config) 


      db = firebase.database() 
      def ReconfiguracionFabrica(): 
        ser.write('AT') 
        time.sleep(0.2) 
        ser.write('AT+RENEW') 
        time.sleep(0.3) 

      def ConfiguracionMaster(): 
        time.sleep(0.5) 
        ser.write('AT+IMME1') 
        time.sleep(0.350) 
        ser.write('AT+ROLE1') 
        time.sleep(0.2)  

      ser=serial.Serial(port="/dev/ttyAMA0", baudrate=9600, timeout=1) 
      ReconfiguracionFabrica() 
      time.sleep(0.1) 
      ConfiguracionMaster() 
      time.sleep(0.1) 

      print "********** INICIO *************" 

      ser.flushInput() 
      contador=0 
      prender= '' 
      ventilacion1= '' 
      checkeo= '' 

      while True: 
       #if db.child("sala").: # It is the line where would be the conditional that allows me to detect any change only in the sala's node. 
          salidaLed1 = db.child("sala").get() 
          ser.write('AT') 
          time.sleep(0.1) 
          ser.write('AT+CON508CB16A7014') 
          time.sleep(0.1) 
          if salidaLed1.val()== True: 
            prender=";" 
          if salidaLed1.val()== False: 
            prender="," 

          ser.write('luz: %s \n' %(prender)) 
          print ('luz: %s \n' %(prender)) 
          time.sleep(1) 
          ser.read(checkeo) 
          if checkeo== 'j': 
            ReconfiguracionFabrica() 
            time.sleep(0.1) 
            ConfiguracionMaster() 

回答

1

問題:如何檢測孩子火力變化


注意:所有的例子使用公共訪問

  1. 設置示例數據並驗證它是否可讀。
    這是要做的一旦

    enter image description here

    temperature_c = 30 
    data = {'date':time.strftime('%Y-%m-%d'), 
         'time':time.strftime('%H:%M:%S'), 
         'temperature':temperature_c} 
    db.child('public').child('Device_1').set(data) 
    
    response = db.child('public').child('Device_1').get() 
    print(response.val()) 
    
  2. 創建的第一個Script做更新:

    for t in [25, 26, 27, 28, 29, 30, 31, 32, 33, 35]: 
        temperature_c = t 
        data = {'date':time.strftime('%Y-%m-%d'), 
          'time':time.strftime('%H:%M:%S'), 
          'temperature':temperature_c} 
        db.child('public').child('Device_1').update(data) 
        time.sleep(60) 
    
  3. 與流處理器創建第二個腳本

    def stream_handler(message): 
        print('event={m[event]}; path={m[path]}; data={m[data]}' 
         .format(m=message)) 
    
    my_stream =db.child('public').child('Device_1').stream(stream_handler) 
    
    # Run Stream Handler forever 
    while True: 
        data = input("[{}] Type exit to disconnect: ".format('?')) 
        if data.strip().lower() == 'exit': 
         print('Stop Stream Handler') 
         if my_stream: my_stream.close() 
         break 
    
  4. 運行流處理器腳本:

    def stream_handler啓動後

    響應輸出(初始數據):

    event="put"; path=/; data={'Device_1': {'temperature': 30, 'time': '13:34:24', 'date': '2017-07-20'}} 
    
  5. 運行更新腳本:從流處理器腳本

    響應輸出

  6. 觀看輸出def stream_handler首先更新數據:

    event=patch; path=/Device_1; data={'temperature': 25, 'time': '13:49:12'} 
    

測試使用Python 3.4.2


Pyrebase

您可以聆聽現場更改您的數據流()方法。

def stream_handler(message): 
    print(message["event"]) # put 
    print(message["path"]) # /-K7yGTTEp7O549EzTYtI 
    print(message["data"]) # {'title': 'Pyrebase', "body": "etc..."} 

my_stream = db.child("posts").stream(stream_handler) 

您應該至少處理放置和修補事件。有關詳細信息,請參閱「從REST API進行流式傳輸」。

+0

嗨stofvl,感謝您的快速回答,我已經看到pyrebase庫中的流方法,但不幸的是我不明白如何使用它。你能幫我用這個嗎?我的firebase數據庫沒有任何路徑。我有名叫'sala'和'ventilacion'的孩子。在這種情況下,我想檢測孩子薩拉的變化。再次感謝您的幫助。 – JoaquinMiguens

+0

@JoaquinMiguens:閱讀[rest/database /#section-streaming](https://firebase.google.com/docs/reference/rest/database/#section-streaming)並相應地設置你的'sala'。 – stovfl

+0

閱讀文檔後,我無法使其工作。我想如果有人能幫助我或指導我如何使其工作。謝謝。 – JoaquinMiguens