我正在尝试根据用户通过gui提交的持续时间和间隔来填充rrd数据库。我建立了一个定时器,每隔......分钟调用一次更新功能。在测量之后,我尝试使用fetch-method查看收集的数据,但我只列出了“none”值。
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 :(得分:0)
您的问题是对步长,DS心跳和RRA XFF设置之间关系的误解。虽然你不能告诉我你的自由是什么。实际值是,显然RRD定义不正确。
步长是RRD文件中的最小时间间隔。默认情况下,这是300秒(5分钟),但您可以在创建时根据需要将其指定为更小或更大。通常,您可以将其设置为数据样本之间的预期时间量;因此,如果您的样品大约每隔5分钟进行一次,则将其设置为5分钟。
心跳是样本在被认为未知之前的最长时间量。这是样品不规则的指标。通常,这将是两倍预期的采样间隔;因此,如果您的样品每5分钟进行一次,则将其设置为600s(10分钟)。如果间隙大于此值,则样本范围标记为“未知”。
XFF 是构成RRA合并数据点的DS数据点的比例,在合成数据点变为未知之前可能是未知的。通常,这设置为0.5,但如果需要可以更高(例如0.9)。你的RRA使用了一个1的组合因子,所以在这种情况下,XFF是无关紧要的,但是当你开始总结时它更为重要。
由于您的心跳设置为fre
,这是到达数据样本的近似频率,因此您不可能在足够小的间隔内获得足够的样本,以便存储除了'未知&#39 ;.请记住,当数据到达时,RRD将对数据进行规范化和整合,并在内部转换为速率。这意味着传入的数据需要相当规律。如果采样间隔具有较高的标准偏差,那么您将需要高心跳,并且您将进行大量调整。
在您的情况下,我建议您将RRD步长设置为60或300(以小于fre
为准),并将心跳设置为2*fre
。