2017-06-18 19 views
0

我想根据持续时间和用户通过gui提交的时间间隔来填充rrd数据库。我建立了一个计时器,每隔...分钟调用一次更新函数。在测量之后,我尝试通过使用获取方法来查看收集的数据,但我仅获得“无” - 列出的值。RRD数据库为空虽然正在更新

def update(self): 
    t=getTemperature() 
    h=getHumidity() 
    if self.status==11: 
     rrdtool.update(self.path,"N:"+t+":"+h) 
    elif self.status==10: 
     rrdtool.update(self.path,"N:"+t) 
    elif self.status==01: 
     rrdtool.update(self.path,"N:"+h) 

传感器值是正确的,我通过打印输出来检查它。 rrdtool.create-method工作也完全正常,数据库被创建,但正如我所说的,实际上并没有正确更新。

这里rrdtool.create的使用():

def __init__(self,term,temEnabled,humEnabled,mins,hrs,fre): 
    self.path="/home/pi/Wetterstation/Speicherort/"+term+".rrd" 
    if os.path.exists(self.path)==False: 
     totalEntries=int((mins+hrs*60)/fre) 
     totalEntries=str(totalEntries) 
     if temEnabled==True and humEnabled==True: 
      rrdtool.create(self.path, 
          "DS:temperature:GAUGE:900:0:50", 
          "DS:humidity:GAUGE:"+str(fre)+":0:100", 
          "RRA:AVERAGE:0.5:1:"+totalEntries,          "RRA:MIN:0.5:12:2400", 
          "RRA:MAX:0.5:"+totalEntries+":1", 
          "RRA:MIN:0.5:"+totalEntries+":1") 
      self.status=11 
     elif temEnabled==True: 
      rrdtool.create(self.path, 
          "DS:temperature:GAUGE:"+str(fre)+":0:50", 
          "RRA:AVERAGE:0.5:1:"+totalEntries, 
          "RRA:MIN:0.5:"+totalEntries+":1", 
          "RRA:MAX:0.5:"+totalEntries+":1") 
      self.status=10 
     elif humEnabled==True: 
      rrdtool.create(self.path, 
          "DS:hum:GAUGE:"+str(fre)+":0:100", 
          "RRA:AVERAGE:0.5:1:"+totalEntries, 
          "RRA:MIN:0.5:"+totalEntries+":1", 
          "RRA:MAX:0.5:"+totalEntries+":1") 
      self.status=01 
     self.success=True 
    else: 
     self.success=False 
+0

'fre'的价值是什么?这是你的湿度心跳。什么是totalEntries?这是您的RRA的大小。最后,在尝试查看数据之前,您多久调用一次update()以及多少个样本?可能你没有提交足够长的时间(45分钟或更长时间)的数据来获得RRA条目?你能否显示存储数据的列表以及你用来提取的命令 - 可能你正在查询存储数据的不同时间窗口? –

+0

此外,如果两个DS都存在,您似乎硬编码900的心跳,但使用“fre”,否则。这可能会导致你的问题,如果你得到不同的心跳,你期望的。你没有指定一个步骤,所以可能会获得300作为默认值,但你的RRA计算是基于心跳,当他们应该在步骤... –

+0

@SteveShipway“fre”是在几分钟内提交的频率,“ totalEntries“计算我保存一个值的次数。每调用一分钟我都会调用方法更新。我仅在短时间内提交数据(测试时),例如等一下。我忘了用“fre”代替,就像我现在定义的步骤一样。 – byteshark17

回答

0

您的问题是步长大小,DS心跳,RRA XFF设定之间的关系的误解。尽管你没有告诉我你的“fre”值是什么,但很明显RRD的定义是不正确的。

步长是RRD文件中的最小时间间隔。默认情况下,这是300秒(5分钟),尽管您可以在创建时将其指定为更小或更大。通常,您可以将其设置为数据样本之间的预期时间量;所以如果您的样品大约每5分钟进行一次,则将其设置为5分钟。

心跳是它们被认为未知之前的采样之间的时间最大量。这是样品不规则性的指标。一般来说,这将是两次预期的采样间隔;所以如果您的样品每5分钟进来一次,请将其设置为600秒(10分钟)。如果间隙大于此值,则样本范围标记为“未知”。

XFF是构成RRA统计数据点的DS数据点的比例,在统一数据点未知之前该数据点可能是未知的。一般来说,这个设置为0.5,但是如果你想要的话可​​以更高(例如0.9)。你的RRA使用了1的收敛因子,所以在这种情况下,XFF是无关紧要的,但是当你开始总结时更重要。

由于您的心跳信号设置为fre,即到达数据采样的大概频率,您不可能在足够小的时间间隔内获得足够的采样,以便存储除“未知” 。请记住,RRD将规范化并整理数据,并在数据到达时将内部转换为速率。这意味着传入的数据需要相当规范。如果采样间隔有很高的标准偏差,那么您需要高心跳,并且您会进行很多调整。

就你而言,我建议你将RRD步长设置为60或300(以小于fre为准),心跳为2*fre