2

解決済み、解決策を追加 Raspberry Pi に接続した温度センサーの出力からPyRRD を使用してグラフを作成しようとしましたが、実際のデータをグラフに表示することができませんでした (ただし、png -ファイルが作成されます)。これが正しい方法かどうかはわかりませんが、このコードは毎秒温度を吐き出すので、while ループは少なくとも機能します。

import os
import glob
import time
import subprocess

# RDD-imports
from pyrrd.graph import DEF, CDEF, VDEF
from pyrrd.graph import LINE, AREA, GPRINT
from pyrrd.graph import ColorAttributes, Graph
from pyrrd.rrd import DataSource, RRA, RRD

# Sensor-stuff 
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

# RRD-stuff
startTime = int(time.time())
filename = 'temptest.rrd'
dataSources = []
rras = []
dataSource = DataSource(dsName='temp', dsType='DERIVE', heartbeat=5)
dataSources.append(dataSource)
rra1 = RRA(cf='AVERAGE', xff=0.5, steps=1, rows=5)
rra2 = RRA(cf='AVERAGE', xff=0.5, steps=6, rows=10)
rras.extend([rra1, rra2])
myRRD = RRD(filename, ds=dataSources, rra=rras, start=startTime)
myRRD.create()

# Graph-making
graphfile = 'tempgraf.png'
def1 = DEF(rrdfile=myRRD.filename, vname='mytemp', dsName=dataSource.name)
# Data going into green field
cdef1 = CDEF(vname='temp', rpn='%s,3600,*' % def1.vname)
# Line for max value
line1 = LINE(value=30, color='#990000', legend='Max temp allowed')
# Green area
area1 = AREA(defObj=cdef1, color='#006600', legend='Temp')

def read_temp_raw():
    catdata = subprocess.Popen(['cat',device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out,err = catdata.communicate()
    out_decode = out.decode('utf-8')
    lines = out_decode.split('\n')
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        myRRD.bufferValue(int(time.time()), int(temp_c))
        myRRD.update()
        return temp_c

while True:
    print(read_temp())
    g = Graph(graphfile, start=startTime, end=int(time.time()), vertical_label='Temp(c)')
    g.data.extend([def1, cdef1, line1, area1])
    g.write()
    time.sleep(1)

私は試行錯誤しており、RRD マニュアルの ALOT と初心者向けのチュートリアルを読んでいますが、これを正しく理解できません。#Graph-make 部分のrpn-stuffについてはよくわかりません。私を助けてください:)また、これを行うためのより良い方法がある場合は、教えてください!

解決策 (私の問題): PyRRD を削除し、rrdtools 独自の python 実装を試しました。http://oss.oetiker.ch/rrdtool/prog/rrdpython.en.html

プログラムの外部でデータベースを作成し、ターミナル (Linux) で次のように Step を正しく設定しました。

rrdtool create dailyTemp.rrd --step 5      \
DS:temp:GAUGE:10:-100:200                  \
RRA:AVERAGE:0.5:1:2880 RRA:MAX:0.9:1:2880  \

次に、PyRRD に接続されているすべてのコードを削除し、いくつかのインポート行と rrdtool 更新用の 1 つの行を追加しました。はるかにきれいになり、グラフを作成できるようになりました:D 「最終的な」コードは次のとおりです。

import os
import glob
import time
import subprocess
import sys
sys.path.append('/usr/local/lib/python2.7/site-packages/')
import rrdtool, tempfile

# Sensor-stuff 
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

# RRD-stuff, not specific
startTime = int(time.time())

def read_temp_raw():
    catdata = subprocess.Popen(['cat',device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out,err = catdata.communicate()
    out_decode = out.decode('utf-8')
    lines = out_decode.split('\n')
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        print(int(temp_c))
        print(int(time.time()))
        rrdtool.update('dailyTemp.rrd','N:' + `temp_c`)
        return temp_c

while True:
    print(read_temp())
    time.sleep(5)

グラフ作成をコードにまだ実装していませんが、過去 2 時間の測定値を次のように出力できます。

rrdtool graph temp120.png --end now --start end-7200s --width 400   \
    DEF:ds0a=dailyTemp.rrd:temp:AVERAGE             \

グラフの結果 (進行中): 必要な評判を得たらすぐに画像を追加します (10)

4

3 に答える 3

1

温度値を取得してから RRD を更新する別の方法を次に示します...

#!/usr/bin/python

# reads 1-wire DS18B20 temperature sensors and outputs options for rrdupdate

import os
import glob
import rrdtool

sensors = ( {'aab8': {                 # last four characters of sensor ID
                      'DS': 'DSName1', # DS name in rrd
                      'value': 0
                     },
             '5cc3': {
                      'DS': 'DSName2',
                      'value': 0
                     },
             '9ce0': {
                      'DS': 'DSName3',
                      'value': 0
                     }
          } )

RRD='/path/to/my.rrd'

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')

DS_list = ""
value_list = "N:"

for index, sensor in enumerate(device_folder):
    for k, v in sensors.items():
        if sensor[-4:] == k:
            f = open(sensor + '/w1_slave', 'r')
            lines = f.readlines()
            f.close()
            if lines[0].strip()[-3:] == 'YES':
                v['value'] = float(lines[1][lines[1].find('t=')+2:])/1000.0
                DS_list += v['DS'] + ':'
                value_list += str(v['value']) + ':'

DS_list = DS_list[:-1]
value_list = value_list[:-1]

rrdtool.update(RRD, '--template', DS_list, value_list)
于 2014-02-22T07:44:52.530 に答える
0

あなたのようなrrdファイルを作成するときに、「ステップ」セットアップに固執しました。

RRD ファイルを作成するときに設定する必要があります。

myRRD = RRD(filename, step=5, ds=dataSources, rra=roundRobinArchives, start=datetime.fromtimestamp(time.time()), step=60)
myRRD.create()

最初に思ったようにデータソースにはありません...

PyRRD で提供されるファイル example5.py で解決策を見つけました

于 2013-09-09T19:42:02.987 に答える
0

rrdtool と混同しているようです。最初に rrdtool を使用してグラフを手動で生成することをお勧めします。機能を理解したら、pyrrd に移行できます。

これらの URL には、rrd に関する非常に優れたドキュメントが含まれています。

http://oss.oetiker.ch/rrdtool/doc/index.en.html

既に rrd を生成している場合は、次の URL を使用して手動でグラフを生成してみてください。

http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html

空の png ファイルが生成されると述べたので、データが rrd に適切に更新されていることを確認してください。rrdtool fetch を使用して、実際のデータが rrd で更新されたかどうかを調べます。

http://oss.oetiker.ch/rrdtool/doc/rrdfetch.en.html

于 2013-04-05T17:07:43.823 に答える