我正在尝试根据用户通过 gui 提交的持续时间和间隔填充 rrd 数据库。 我构建了一个计时器,它每隔...纪要。测量后,我尝试使用 fetch-方法 查看收集的数据,但我只列出了"无"值。
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
您的问题是误解了步长、DS 检测信号和 RRA XFF 设置之间的关系。 虽然你没有告诉我你的"fre"值实际上是什么,但很明显RRD的定义是不正确的。
步长是 RRD 文件中的最小时间间隔。 默认情况下,这是 300 秒(5 分钟),但如有必要,您可以在创建时将其指定为更小或更大。 通常,应将此设置为数据样本之间的预期时间量;因此,如果您的样品大约每 5 分钟出现一次,则将其设置为 5 分钟。
检测信号是样本在被视为未知之前之间的最长时间。 这是样本不规则性的指标。 通常,这将是预期采样间隔的两倍;因此,如果您的样本每 5 分钟出现一次,请将其设置为 600 秒(10 分钟)。 如果差距大于此值,则样本范围标记为"未知"。
XFF是构成 RRA 合并数据点的 DS 数据点的比例,在 RRA 合并数据点变为未知之前,该数据点可能是未知的。 通常,此值设置为 0.5,但如果需要,可以更高(例如 0.9)。 您的 RRA 使用了 1 的安慰因子,因此在这种情况下,XFF 无关紧要,但当您开始总结时,它更重要。
由于您将心跳设置为fre
,这是到达数据样本的大致频率,因此您不太可能以足够小的间隔拥有足够的样本,以便将任何样本存储为"未知"以外的任何内容。 请记住,RRD 将对数据进行规范化和整理,并在数据到达时在内部转换为速率。 这意味着传入的数据需要相当规则。 如果采样间隔具有高标准偏差,那么您将需要高心跳,并且您将进行大量调整。
在您的情况下,我建议您将 RRD 步长设置为 60 或 300(以小于fre
为准),并将心跳设置为2*fre
。