如何用python检测firebase子的变化?

时间:2017-07-17 22:53:07

标签: python firebase firebase-realtime-database restful-architecture

我对这个应用程序有些麻烦。我需要的是,如果我检测到数据库中的更改(FIREBASE),特别是在'sala'和'ventilacion'节点中,该函数会执行它必须执行的操作。如果数据库没有任何变化,它将不会做任何事情。我正在使用python和pyrebase库。这是代码。非常感谢你的帮助。

            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()

3 个答案:

答案 0 :(得分:5)

  

问题:如何检测firebase子项中的更改

  

注意:所有示例均使用公开访问

  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. 创建更新的第一个脚本:

    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'}
    
  7. 使用Python测试:3.4.2

      

    Pyrebase
       流

         

    您可以使用stream()方法收听数据的实时更改。

    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)
    
         

    您至少应该处理put和patch事件。请参阅"来自REST API的流媒体"详情。

答案 1 :(得分:0)

我知道此职位2岁了,但希望对您有所帮助。尝试使用firebase_admin模块。

使用此命令- pip install firebase-admin

我也有一个要求,我需要检查对Firebase数据库所做的更改。我提到了here

以下是基于您的问题的示例代码,您可以参考并尝试使用它。

import firebase_admin
from firebase_admin import credentials
from firebase_admin import db


cred = credentials.Certificate("path/to/serviceAccountKey.json")
firebase_admin.initialize_app(cred, {
    'databaseURL': 'https://example.firebaseio.com',
    'databaseAuthVariableOverride': None
})


def ignore_first_call(fn):
    called = False

    def wrapper(*args, **kwargs):
        nonlocal called
        if called:
            return fn(*args, **kwargs)
        else:
            called = True
            return None

    return wrapper


@ignore_first_call
def listener(event):
    print(event.event_type)  # can be 'put' or 'patch'
    print(event.path)  # relative to the reference, it seems
    print(event.data)  # new data at /reference/event.path. None if deleted

    node = str(event.path).split('/')[-2] #you can slice the path according to your requirement
    property = str(event.path).split('/')[-1] 
    value = event.data
    if (node=='sala'):
        #do something
    elif (node=='ventilacion'):
        #do something
    else:
        #do something else


db.reference('/').listen(listener)

答案 2 :(得分:0)

我正在做同一件事,所以根据当前关于pyrebase的更新并从上面发布的答案中学习,我使它运行得很好(请确保将python从python2升级到python3以运行pyrebase和firebase-admin)

import firebase_admin
import pyrebase
from firebase_admin import credentials

config = {
    "apiKey": "",
    "authDomain": "",
    "databaseURL": "",
    "projectId": "",
    "storageBucket": "",
    "serviceAccount": "path to the service account json file you downloaded",
    "messagingSenderId": "",
    "appId": "",
    "measurementId": ""
}

firebase = pyrebase.initialize_app(config)
storage = firebase.storage()
cred = credentials.Certificate("path to downloaded json file")

firebase_admin.initialize_app(cred, {
    "databaseURL": "same as config",
    "databaseAuthVariableOverride": None
})
db = firebase.database()

def ignore_first_call(fn):
    called = False

    def wrapper(*args, **kwargs):
        nonlocal called
        if called:
            return fn(*args, **kwargs)
        else:
            called = True
            return None
    return wrapper

def stream_handler(message):
    ab = str(1)
    all_videos = storage.child("videos/").list_files() #node where files are

    path_on_local = "local path to save the downloads"
    print(message["event"]) # put
    print(message["path"]) # /-K7yGTTEp7O549EzTYtI
    print(message["data"]) # {'title': 'Pyrebase', "body": "etc..."}

    node = str(message["path"]).split('/')[-2] 
    property = str(message["path"]).split('/')[-1]
    value = message["data"]

    if (message["event"] == "put"):
        for videos in all_videos:
            try:
                print(videos.name)
                z = storage.child(videos.name).get_url(None)
                storage.child(videos.name).download(path_on_local + "/" + ab + ".mp4")
                x = int(ab)
                ab = str(x + 1)
            except:
                print('Download Failed')

    else:
        print("error")

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