我正在尝试用覆盆子Pi制作smarthome软件,我使用firebase作为我的数据库,我已经尝试过了,它工作了,但是为什么它花了这么长的时间(大约10 -30秒开/关灯)我试着从我的网站控件上按下按钮开/关,我看到在firebase中的值变化如此之快(大约1-2秒),但为什么在我的硬件上开/关花了很慢。下面是我的代码(main.py)
#!/usr/bin/python
import sys
import signal
import dht11
import socket
import time
import datetime
import os
import RPi.GPIO as GPIO
from gpiozero import LED
from clases.Connection import Connection
from firebase import firebase
from time import sleep
#firebase
fire = firebase.FirebaseApplication('https://21324.firebaseio.com', None)
#initialization GPIO port
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
garage = LED(17)
livingroom = LED(27)
familyroom = LED(22)
bedroom2 = LED(18)
bedroom1 = LED(23)
kitchen = LED(24)
bathroom = LED(5)
backyard = LED(6)
waterpump = LED(13)
fan = LED(19)
##Date time formatting
dateString = '%d/%m/%Y %H:%M:%S'
def lastupdate():
updated = str(datetime.datetime.now().strftime(dateString))
return(updated)
fire.put("/Settings", "/last_update_datetime", datetime.datetime.now().strftime(dateString))
#pin temperature
instance = dht11.DHT11(pin=21)
result = instance.read()
def readdht11():
if result.is_valid():
#temperature = ("Temperature: %d C" % result.temperature)
#humidity = ("Humidity: %d %%" % result.humidity)
temperature = ('%d' % result.temperature)
humidity = ('%d' % result.humidity)
return(temperature, humidity)
def process(value_garage, value_livingroom, value_familyroom, value_bedroom1, value_bedroom2, value_kitchen, value_bathroom, value_backyard, value_waterpump, value_fan, result):
print("=======================================")
print(lastupdate())
print("Temp | Humid")
print(readdht11())
print("CPU temp: "+getCPUtemperature())
print("CPU used:"+getCPUuse())
print("RAM info:")
print(getRAMinfo())
print("Disk space:")
print(getDiskSpace())
if value_garage:
garage.on()
print ("garage on")
else:
garage.off()
print ("garage off")
if value_livingroom:
livingroom.on()
print ("livingroom on")
else:
livingroom.off()
print ("livingroom off")
if value_familyroom:
familyroom.on()
print ("familyroom on")
else:
familyroom.off()
print ("familyroom off")
if value_bedroom2:
bedroom2.on()
print ("bedroom2 on")
else:
bedroom2.off()
print ("bedroom2 off")
if value_bedroom1:
bedroom1.on()
print ("bedroom1 on")
else:
bedroom1.off()
print ("bedroom1 off")
if value_kitchen:
kitchen.on()
print ("kitchen on")
else:
kitchen.off()
print ("kitchen off")
if value_bathroom:
bathroom.on()
print ("bathroom on")
else:
kitchen.off()
print ("bathroom off")
if value_backyard:
backyard.on()
print ("backyard on")
else:
backyard.off()
print ("backyard off")
if value_waterpump:
waterpump.on()
print ("waterpump on")
else:
waterpump.off()
print ("waterpump off")
if value_fan:
fan.on()
print ("fan on")
else:
fan.off()
print ("fan off")
def getCPUtemperature():
res = os.popen('vcgencmd measure_temp').readline()
return(res.replace("temp=","").replace("'C\n",""))
def getRAMinfo():
p = os.popen('free')
i = 0
while 1:
i = i + 1
line = p.readline()
if i==2:
return(line.split()[1:4])
# Return % of CPU used by user as a character string
def getCPUuse():
return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip(\
)))
def getDiskSpace():
p = os.popen("df -h /")
i = 0
while 1:
i = i +1
line = p.readline()
if i==2:
return(line.split()[1:5])
def updateinfo():
print("## Updating Firebase Info.. ##")
fire.put("/Settings", "/last_update_datetime", datetime.datetime.now().strftime(dateString))
#retrive max & min humidity (remove the %)
maxHumidity = fire.get("/Controls/Sensors/Humidity/max_inside", None)
maxHumidity = maxHumidity[:-1]
minHumidity = fire.get("/Controls/Sensors/Humidity/min_inside", None)
minHumidity = minHumidity[:-1]
#retrieve max & min temperature (remove the C)
#maxTemperature = fire.get("/Controls/Sensors/Temperature/max_inside", None)
#maxTemperature = maxTemperature[:-1]
#minTemperature = fire.get("/Controls/Sensors/Temperature/min_inside", None)
#minTemperature = minTemperature[:-1]
#add current value
temperature, humidity = readdht11()
#fire.put("/Controls/Sensors", "/Humidity/current_inside", ""+humidity+"%")
#fire.put("/Controls/Sensors", "/Temperature/current_inside", ""+temperature+"C")
#check for max values
#if float(humidity) > float(maxHumidity):
# fire.put("/Controls/Sensors", "/Humidity/max_inside", ""+humidity+"%")
# print("Updated Humidity max_inside")
#if float(temperature) > float(maxTemperature):
# fire.put("/Controls/Sensors", "/Temperature/max_inside", ""+temperature+"C")
# print("Updated Temperature max_inside")
# check for min values
#if float(humidity) < float(minHumidity):
# fire.put("/Controls/Sensors", "/Humidity/min_inside", ""+humidity+"%")
# print("Updated Humidity min_inside")
#if float(temperature) < float(minTemperature):
# fire.put("/Controls/Sensors", "/Temperature/min_inside", ""+temperature+"C")
# print("Updated Temperature min_inside")
#CPU INFO
CPU_temp = getCPUtemperature()
CPU_usage = getCPUuse()
fire.put("/PI/CPU", "/temperature", CPU_temp)
#RAM INFO
RAM_stats = getRAMinfo()
RAM_total = round(int(RAM_stats[0]) / 1000,1)
RAM_used = round(int(RAM_stats[1]) / 1000,1)
RAM_free = round(int(RAM_stats[2]) / 1000,1)
fire.put("/PI/RAM", "/free", str(RAM_free)+"")
fire.put("/PI/RAM", "/used", str(RAM_used)+"")
fire.put("/PI/RAM", "/total", str(RAM_total)+"")
#DISK INFO
DISK_stats = getDiskSpace()
DISK_total = DISK_stats[0]
DISK_free = DISK_stats[2]
DISK_perc = DISK_stats[3]
DISK_used = float(DISK_total[:-1]) - float(DISK_free[:-1])
fire.put("/PI/DISK", "/total", str(DISK_total[:-1]))
fire.put("/PI/DISK", "/free", str(DISK_free[:-1]))
fire.put("/PI/DISK", "/used", str(DISK_used))
fire.put("/PI/DISK", "/percentage", str(DISK_perc))
print(datetime.datetime.now().strftime(dateString))
#print("Temperature: Current["+temperature+"], Max["+maxTemperature+"], Min["+minTemperature+"]")
print("Humidity: Current["+humidity+"], Max["+maxHumidity+"], Min["+minHumidity+"]")
print("CPU temperature: "+CPU_temp)
print("RAM total["+str(RAM_total)+" MB], RAM used["+str(RAM_used)+" MB], RAM free["+str(RAM_free)+" MB]")
print("DISK total["+str(DISK_total)+"], free["+str(DISK_free)+"], perc["+str(DISK_perc)+"]")
print("## Update finished successfully ##")
print("======================================================\n")
sys.stdout.flush()
while True:
try:
##print ("Start")
print("")
## sleepTime = 500#fire.get("/Settings/info_update_time_interval", None)
## sleepTime = int(sleepTime)
## sleep(sleepTime)
# updateinfo() #old
t = Connection(process) #old
t.daemon=True #old
t.start() #old
signal.pause() #old
except (KeyboardInterrupt, SystemExit): #old
continue
# raise #old
#print ("output") #old
还有这个(Connection.py)
from requests import ConnectionError
import requests
from firebase import firebase
import threading
import time
class Connection(threading.Thread):
def __init__(self, cb):
threading.Thread.__init__(self)
self.callback = cb
self.fire = firebase.FirebaseApplication('https://213214.firebaseio.com/', None)
self.status_garage = self.fire.get('/lights/garage', None)
self.status_livingroom = self.fire.get('/lights/livingroom', None)
self.status_familyroom = self.fire.get('/lights/familyroom', None)
self.status_bedroom2 = self.fire.get('/lights/bedroom2', None)
self.status_bedroom1 = self.fire.get('/lights/bedroom1', None)
self.status_kitchen = self.fire.get('/lights/kitchen', None)
self.status_bathroom = self.fire.get('/lights/bathroom', None)
self.status_backyard = self.fire.get('/lights/backyard', None)
self.status_waterpump = self.fire.get('/devices/waterpump', None)
self.status_fan = self.fire.get('/devices/fan', None)
self.status_result = self.fire.get('/lampu/result', None)
#self.date = self.fire.get('/status/date', None)
#self.humidity = self.fire.get('/status/humidity', None)
#self.temperature = self.fire.get('/status/temperature', None)
self.callback(self.status_garage, self.status_livingroom, self.status_familyroom, self.status_bedroom2, self.status_bedroom1, self.status_kitchen, self.status_bathroom, self.status_backyard, self.status_waterpump, self.status_fan, self.status_result)
def run(self):
SG = []
SG.append(self.status_garage)
SLR = []
SLR.append(self.status_livingroom)
SFR = []
SFR.append(self.status_familyroom)
SB2 = []
SB2.append(self.status_bedroom2)
SB1 = []
SB1.append(self.status_bedroom1)
SK = []
SK.append(self.status_kitchen)
SB = []
SB.append(self.status_bathroom)
SBA = []
SBA.append(self.status_backyard)
SWP = []
SWP.append(self.status_waterpump)
SF = []
SF.append(self.status_fan)
SR = []
SR.append(self.status_result)
i = 0
while True:
status_terkini_garage = self.fire.get('/lights/garage/garage', None)
SG.append(status_terkini_garage)
status_terkini_livingroom = self.fire.get('/lights/livingroom/livingroom', None)
SLR.append(status_terkini_livingroom)
status_terkini_familyroom = self.fire.get('/lights/familyroom/familyroom', None)
SFR.append(status_terkini_familyroom)
status_terkini_bedroom2 = self.fire.get('/lights/bedroom2/bedroom2', None)
SB2.append(status_terkini_bedroom2)
status_terkini_bedroom1 = self.fire.get('/lights/bedroom1/bedroom1', None)
SB1.append(status_terkini_bedroom1)
status_terkini_kitchen = self.fire.get('/lights/kitchen/kitchen', None)
SK.append(status_terkini_kitchen)
status_terkini_bathroom = self.fire.get('/lights/bathroom/bathroom', None)
SB.append(status_terkini_bathroom)
status_terkini_backyard = self.fire.get('/lights/backyard/backyard', None)
SBA.append(status_terkini_backyard)
status_terkini_waterpump = self.fire.get('/devices/waterpump/waterpump', None)
SWP.append(status_terkini_waterpump)
status_terkini_fan = self.fire.get('/devices/fan/fan', None)
SF.append(status_terkini_fan)
status_terkini_result = self.fire.get('/lights/result/result', None)
SR.append(status_terkini_result)
if SG[i] != SG[-1]:
self.callback(status_terkini_garage, status_terkini_livingroom, status_terkini_familyroom, status_terkini_bedroom2,
status_terkini_bedroom1, status_terkini_kitchen, status_terkini_bathroom, status_terkini_backyard, status_terkini_waterpump, status_terkini_fan, status_terkini_result)
del SG[0]
if SLR[i] != SLR[-1]:
self.callback(status_terkini_garage, status_terkini_livingroom, status_terkini_familyroom, status_terkini_bedroom2,
status_terkini_bedroom1, status_terkini_kitchen, status_terkini_bathroom, status_terkini_backyard, status_terkini_waterpump, status_terkini_fan, status_terkini_result)
del SLR[0]
if SFR[i] != SFR[-1]:
self.callback(status_terkini_garage, status_terkini_livingroom, status_terkini_familyroom, status_terkini_bedroom2,
status_terkini_bedroom1, status_terkini_kitchen, status_terkini_bathroom, status_terkini_backyard, status_terkini_waterpump, status_terkini_fan, status_terkini_result)
del SFR[0]
if SB2[i] != SB2[-1]:
self.callback(status_terkini_garage, status_terkini_livingroom, status_terkini_familyroom, status_terkini_bedroom2,
status_terkini_bedroom1, status_terkini_kitchen, status_terkini_bathroom, status_terkini_backyard, status_terkini_waterpump, status_terkini_fan, status_terkini_result)
del SB2[0]
if SB1[i] != SB1[-1]:
self.callback(status_terkini_garage, status_terkini_livingroom, status_terkini_familyroom, status_terkini_bedroom2,
status_terkini_bedroom1, status_terkini_kitchen, status_terkini_bathroom, status_terkini_backyard, status_terkini_waterpump, status_terkini_fan, status_terkini_result)
del SB1[0]
if SK[i] != SK[-1]:
self.callback(status_terkini_garage, status_terkini_livingroom, status_terkini_familyroom, status_terkini_bedroom2,
status_terkini_bedroom1, status_terkini_kitchen, status_terkini_bathroom, status_terkini_backyard, status_terkini_waterpump, status_terkini_fan, status_terkini_result)
del SK[0]
if SB[i] != SB[-1]:
self.callback(status_terkini_garage, status_terkini_livingroom, status_terkini_familyroom, status_terkini_bedroom2,
status_terkini_bedroom1, status_terkini_kitchen, status_terkini_bathroom, status_terkini_backyard, status_terkini_waterpump, status_terkini_fan, status_terkini_result)
del SB[0]
if SBA[i] != SBA[-1]:
self.callback(status_terkini_garage, status_terkini_livingroom, status_terkini_familyroom, status_terkini_bedroom2,
status_terkini_bedroom1, status_terkini_kitchen, status_terkini_bathroom, status_terkini_backyard, status_terkini_waterpump, status_terkini_fan, status_terkini_result)
del SBA[0]
if SWP[i] != SWP[-1]:
self.callback(status_terkini_garage, status_terkini_livingroom, status_terkini_familyroom, status_terkini_bedroom2,
status_terkini_bedroom1, status_terkini_kitchen, status_terkini_bathroom, status_terkini_backyard, status_terkini_waterpump, status_terkini_fan, status_terkini_result)
del SWP[0]
if SF[i] != SF[-1]:
self.callback(status_terkini_garage, status_terkini_livingroom, status_terkini_familyroom, status_terkini_bedroom2,
status_terkini_bedroom1, status_terkini_kitchen, status_terkini_bathroom, status_terkini_backyard, status_terkini_waterpump, status_terkini_fan, status_terkini_result)
del SF[0]
i = i+i
time.sleep(0.1)
有人能帮帮我吗?
发布于 2018-03-14 01:09:15
我也遇到了同样的问题,我发现由于某种原因,第一个操作(无论是写还是读) firebase需要很长时间才能执行respond.Maybe,这是由于身份验证之类的原因。
我建议尝试从数据库中进行“虚拟”读取来“初始化它”,然后继续执行您的主逻辑。所有使用firebase的后续操作都应该立即发生。
如果有帮助,请告诉我。
https://stackoverflow.com/questions/47510755
复制相似问题