2019-06-25 07:32:44 -07:00
|
|
|
import socket,numpy,time,thread,json,requests
|
2019-06-23 21:26:41 -07:00
|
|
|
class meas_data:
|
2019-06-30 12:23:04 -07:00
|
|
|
def __init__(self,var_name,ring_length=100,sigma=2,device=socket.gethostname(),sensor="CPU",i2c=0,store_file="/home/pi/data",mean_count=5,store_each_cycle=True,multiplicator=1):
|
2019-06-23 21:26:41 -07:00
|
|
|
self.var_name=var_name
|
|
|
|
self.value=[]
|
2019-06-30 10:19:49 -07:00
|
|
|
self.mval=[]
|
2019-06-23 21:26:41 -07:00
|
|
|
self.stat_val_mean=0
|
|
|
|
self.stat_val_std=0
|
|
|
|
self.ring_length=ring_length
|
2019-06-30 10:19:49 -07:00
|
|
|
self.mean_count=mean_count
|
2019-06-23 21:26:41 -07:00
|
|
|
self.sensebox=""
|
|
|
|
self.senseid=""
|
|
|
|
self.sense_url="https://ingress.opensensemap.org/"
|
|
|
|
self.sense_intervall=300
|
|
|
|
self.sense_last_time=0
|
|
|
|
self.sqlhost=""
|
|
|
|
self.sqlport=0
|
|
|
|
self.bsense=False
|
|
|
|
self.bsql=False
|
|
|
|
self.bchanged=False
|
|
|
|
self.bfile=False
|
|
|
|
self.store_file=store_file
|
|
|
|
self.act_value=0
|
2019-06-30 11:37:57 -07:00
|
|
|
self.act_std=0
|
2019-06-23 21:26:41 -07:00
|
|
|
self.act_time=0
|
2019-06-30 10:19:49 -07:00
|
|
|
self.stat_mean=0
|
|
|
|
self.stat_std=0
|
2019-06-24 07:08:14 -07:00
|
|
|
self.sigma=sigma
|
2019-06-23 21:26:41 -07:00
|
|
|
self.device=device
|
|
|
|
self.sensor=sensor
|
|
|
|
self.i2c=i2c
|
2019-06-30 12:23:04 -07:00
|
|
|
self.mult=multiplicator
|
2019-06-30 10:23:46 -07:00
|
|
|
self.bstoreeach=store_each_cycle
|
2019-06-23 21:26:41 -07:00
|
|
|
self.json_out={"time":0,"device":device,"payload":{var_name:{"sensor":sensor,"value":0,"i2c":i2c}}}
|
|
|
|
def set_sensebox(self,sensebox,senseid,intervall=300):
|
|
|
|
tsb=sensebox
|
2019-06-25 07:32:44 -07:00
|
|
|
tsb=tsb[0:24]
|
2019-06-23 21:26:41 -07:00
|
|
|
self.sensebox=tsb
|
|
|
|
tsi=senseid
|
2019-06-25 07:32:44 -07:00
|
|
|
tsi=tsi[0:24]
|
2019-06-23 21:26:41 -07:00
|
|
|
self.senseid=tsi
|
|
|
|
self.sense_intervall=int(intervall)
|
|
|
|
self.bsense=True
|
|
|
|
self.sense_url="https://ingress.opensensemap.org/boxes/%s/%s" % (tsb,tsi)
|
2019-06-25 07:32:44 -07:00
|
|
|
print(self.sense_url)
|
2019-06-23 21:26:41 -07:00
|
|
|
def set_sql(self,host,port=24049):
|
|
|
|
th=host
|
|
|
|
self.sqlhost=th
|
|
|
|
self.sqlport=int(port)
|
|
|
|
self.bsql=True
|
|
|
|
def set_file_log(self,store_file="/home/pi/data"):
|
|
|
|
if len(store_file)>1:
|
|
|
|
self.store_file=store_file+"_{:d}.txt"
|
|
|
|
try:
|
|
|
|
f1=open(self.store_file+"_{:d}.txt".format(int(time.time()/3600)),"a")
|
|
|
|
except:
|
|
|
|
print("could not open data storage")
|
|
|
|
self.bfile=False
|
|
|
|
else:
|
|
|
|
self.bfile=True
|
|
|
|
def show_def(self):
|
|
|
|
print(self.var_name)
|
|
|
|
print(self.value)
|
2019-06-30 12:23:04 -07:00
|
|
|
def set_multiplicator(self,multiplicator):
|
|
|
|
self.mult=multiplicator
|
2019-06-23 21:26:41 -07:00
|
|
|
def append(self,value):
|
2019-06-30 10:19:49 -07:00
|
|
|
self.value.append(value)
|
|
|
|
if (len(self.mval)==0) and (len(self.value)>1):
|
|
|
|
self.stat_mean=numpy.mean(self.value)
|
2019-06-30 10:28:18 -07:00
|
|
|
self.stat_std=numpy.std(self.value)/numpy.sqrt(len(self.value)-1)
|
2019-06-30 10:19:49 -07:00
|
|
|
self.mval.append(value)
|
|
|
|
if len(self.mval)==self.mean_count:
|
|
|
|
nmean=abs(numpy.mean(self.mval)-self.stat_mean)
|
2019-06-30 10:28:18 -07:00
|
|
|
nstd=self.stat_std+numpy.std(self.mval)/numpy.sqrt(len(self.mval)-1)
|
2019-06-30 10:19:49 -07:00
|
|
|
bsave=self.bstoreeach
|
|
|
|
if nmean > (self.sigma*nstd):
|
|
|
|
bsave=True
|
|
|
|
if bsave:
|
|
|
|
if self.stat_val_std==0:
|
|
|
|
self.stat_val_std=abs(self.stat_val_mean/100)
|
|
|
|
nmean=numpy.mean(self.mval)
|
2019-06-30 13:00:33 -07:00
|
|
|
nstd=10**(round(numpy.log10(numpy.maximum(0.001,numpy.std(self.mval))))-1)
|
2019-06-30 10:19:49 -07:00
|
|
|
nmean=round(nmean/nstd,0)*nstd
|
2019-06-30 12:23:04 -07:00
|
|
|
self.act_value=int(self.mult*nmean)
|
|
|
|
self.act_std=int(self.mult*numpy.std(self.mval))
|
2019-06-23 21:26:41 -07:00
|
|
|
self.act_time=int(1000*time.time())
|
|
|
|
if self.bsql:
|
|
|
|
thread.start_new_thread(self.send_sql,(0,))
|
|
|
|
if self.bfile:
|
|
|
|
thread.start_new_thread(self.send_file,(0,))
|
2019-06-25 07:32:44 -07:00
|
|
|
if self.bsense:
|
|
|
|
thread.start_new_thread(self.upload_osm,(0,))
|
2019-06-30 10:19:49 -07:00
|
|
|
self.mval=[]
|
|
|
|
if len(self.value)>=self.ring_length:
|
2019-06-30 10:21:53 -07:00
|
|
|
self.value=self.value[((-1)*self.ring_length):]
|
2019-06-23 21:26:41 -07:00
|
|
|
def get_ring(self):
|
|
|
|
return(self.value)
|
|
|
|
def get_act_value(self):
|
|
|
|
return(self.act_value)
|
|
|
|
def send_file(self,trigger=0):
|
|
|
|
try:
|
|
|
|
f1=open(self.store_file.format(int(time.time()/3600)),"a")
|
|
|
|
except:
|
|
|
|
print("could not open log file")
|
|
|
|
else:
|
|
|
|
f1.write("time:{0};".format(int(self.act_time))+self.var_name+":{0}".format(self.act_value)+"\n")
|
|
|
|
# print("time:{0};".format(int(self.act_time))+self.var_name+":{0}".format(self.act_value)+"\n")
|
|
|
|
f1.close()
|
|
|
|
def send_sql(self,trigger=0):
|
|
|
|
self.json_out['time']=self.act_time
|
2019-06-25 05:50:23 -07:00
|
|
|
self.json_out['payload'][self.var_name]['timestamp']=self.act_time
|
2019-06-30 12:40:44 -07:00
|
|
|
self.json_out['payload'][self.var_name]['value']=int(self.act_value)
|
|
|
|
self.json_out['payload'][self.var_name]['std']=int(self.act_std)
|
2019-06-26 20:52:23 -07:00
|
|
|
# print(json.dumps(self.json_out))
|
2019-06-23 21:26:41 -07:00
|
|
|
try:
|
|
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
|
except:
|
|
|
|
print("{}: could not connect to database".format(time.time()))
|
|
|
|
else:
|
|
|
|
try:
|
|
|
|
s.connect((self.sqlhost, self.sqlport))
|
|
|
|
except:
|
|
|
|
print("{}: could not connect to database".format(time.time()))
|
|
|
|
else:
|
|
|
|
s.sendall(json.dumps(self.json_out))
|
|
|
|
s.close()
|
|
|
|
def upload_osm(self,trigger=0):
|
2019-06-30 10:31:38 -07:00
|
|
|
# print(self.act_value)
|
2019-06-24 05:38:23 -07:00
|
|
|
if (self.act_time-self.sense_last_time)>(self.sense_intervall*1000):
|
2019-06-30 12:23:04 -07:00
|
|
|
r = requests.post(self.sense_url,json={'value': float(self.act_value)/self.mult})
|
2019-06-24 05:38:23 -07:00
|
|
|
if (r.status_code != requests.codes.ok) & (r.status_code != 201):
|
|
|
|
print("Error %d: %s" % (r.status_code,r.text))
|
|
|
|
else:
|
|
|
|
self.sense_last_time=self.act_time
|
2019-06-23 21:26:41 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
2019-06-24 06:57:54 -07:00
|
|
|
#test=meas_data("temp",5)
|
|
|
|
#test.set_sql("localhost")
|
|
|
|
#test.set_file_log("/home/ademant/data")
|