import socket,numpy,time,thread,json class meas_data: def __init__(self,var_name,ring_length=100,device=socket.gethostname(),sensor="CPU",i2c=0,store_file="/home/pi/data"): self.var_name=var_name self.value=[] self.stat_val_mean=0 self.stat_val_std=0 self.ring_length=ring_length 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 self.act_time=0 self.device=device self.sensor=sensor self.i2c=i2c 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 tsb=tsb[1:24] self.sensebox=tsb tsi=senseid tsi=tsi[1:24] self.senseid=tsi self.sense_intervall=int(intervall) self.bsense=True self.sense_url="https://ingress.opensensemap.org/boxes/%s/%s" % (tsb,tsi) 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) def append(self,value): if len(self.value)self.stat_val_std) or (self.act_value==0): self.act_value=value 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,)) self.value.append(value) self.value=self.value[1:] 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 self.json_out['payload']['timestamp']=self.act_time self.json_out['payload']['value']=self.act_value print(json.dumps(self.json_out)) 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): if (self.act_time-self.sense_last_time)>(self.sense_intervall*1000): r = requests.post(self.url,json={'value': self.act_val}) 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 #test=meas_data("temp",5) #test.set_sql("localhost") #test.set_file_log("/home/ademant/data")