RaspberryPi
raspbian
python2.7
IoT
netdata

Raspberry PiのCPU温度をnetdataで可視化してみた

More than 1 year has passed since last update.

毎回vcgencmd measure_tempするのが面倒くさいので、netdataのプラグインを自作してみたお話。

前提

  • Raspberry Pi
    • Raspberry Pi 2 model Bで確認済み
  • RASPBIAN JESSIE
    • LITE版でもDESKTOP版でもお好きな方でー
  • netdata
    • インストールされていない方はInstallationを参考にインストールしましょう
    • インストール先はデフォルト

プラグインの作成

スケルトンプラグイン(/usr/libexec/netdata/python.d/example.chart.py)をベースにプラグインを作成。プラグインのファイル名は{{プラグイン名}}.chart.py、設定ファイル名は{{プラグイン名}}.confとするようです。今回、設定ファイルは使いません。

プラグイン名 raspberry_pi
プラグインファイル名 raspberry_pi.chart.py
プラグイン格納先 /usr/libexec/netdata/python.d

コード

raspberry_pi.chart.py
# -*- coding: utf-8 -*-
# Description: example netdata python.d module
# Author: Pawel Krupa (paulfantom)

import os
from base import SimpleService

NAME = os.path.basename(__file__).replace(".chart.py", "")

# default module values
# update_every = 4
priority = 90000
retries = 60


class Service(SimpleService):
    def __init__(self, configuration=None, name=None):
        super(self.__class__,self).__init__(configuration=configuration, name=name)

    def check(self):
        return True

    def create(self):
        self.chart("raspberry_pi.temperature", '', 'Core temperature', 'Celsius',
                   'temperature', 'temperature', 'line', self.priority, self.update_every)
        self.dimension('temperature')
        self.commit()
        return True

    def update(self, interval):
        temp = int(open('/sys/class/thermal/thermal_zone0/temp').read().rstrip('\n')) / 1000
        self.begin("raspberry_pi.temperature", interval)
        self.set("temperature", temp)
        self.end()
        self.commit()
        return True

example.chart.py丸パクリですね。^^;;

def check(self)

return Trueしているだけですが、本来であれば値を取得するコマンド等が存在するかチェックする関数のようですね。

def create(self)

self.chart("raspberry_pi.temperature", '', 'Core temperature', 'Celsius',
                   'temperature', 'temperature', 'line', self.priority, self.update_every)

チャートの定義を行います。
chart関数の詳細は本家が詳しいです。当たり前ですが。。。^^;;

self.dimension('temperature')

チャートに表示する値の入れ物に名前を付けます。わかりやすくtemperatureとしました。

def update(self, interval)

temp = int(open('/sys/class/thermal/thermal_zone0/temp').read().rstrip('\n')) / 1000

CPU温度を/sys/class/thermal/thermal_zone0/tempから取得します。1000倍された値の文字列で取得されるのでint型に変換して1000で割ってます。
実際どんな値が取れるかコマンドラインでcat /sys/class/thermal/thermal_zone0/tempしましょう。

self.set("temperature", temp)

取得したCPU温度をcreate関数のself.dimensionで名前を付けたtemperatureに入れます。

デバッグ

プラグインが書き上がったらERRORがないかデバッグしましょう。

$ sudo -u netdata /usr/libexec/netdata/plugins.d/python.d.plugin debug 1 raspberry_pi
2017-08-14 20:08:35:  INFO: Using python v2
2017-08-14 20:08:35:  INFO: YAML output is ordered
2017-08-14 20:08:35: python.d INFO: reading configuration file: /usr/libexec/netdata/plugins.d/../../../../etc/netdata/python.d.conf
2017-08-14 20:08:35: python.d INFO: MODULES_DIR='/usr/libexec/netdata/python.d/', CONFIG_DIR='/usr/libexec/netdata/plugins.d/../../../../etc/netdata/', UPDATE_EVERY=1, ONLY_MODULES=['raspberry_pi']
2017-08-14 20:08:36: python.d DEBUG: raspberry_pi: loading module configuration: '/usr/libexec/netdata/plugins.d/../../../../etc/netdata/python.d/raspberry_pi.conf'
2017-08-14 20:08:36: python.d DEBUG: raspberry_pi: reading configuration
2017-08-14 20:08:36: python.d DEBUG: raspberry_pi: job added
2017-08-14 20:08:36: python.d DEBUG: all job objects [<Service(None, initial daemon)>]
2017-08-14 20:08:36: python.d INFO: CHECKED OK: raspberry_pi
2017-08-14 20:08:36: python.d DEBUG: overridden job names: []
2017-08-14 20:08:36: python.d DEBUG: all remaining job objects: [<Service(None, initial daemon)>]
CHART raspberry_pi.temperature '' 'Core temperature' Celsius temperature temperature line 90000 1
DIMENSION temperature temperature absolute 1 1

CHART netdata.plugin_pythond_raspberry_pi '' 'Execution time for raspberry_pi plugin' 'milliseconds / run' python.d netdata.plugin_python area 145000 1
DIMENSION run_time 'run time' absolute 1 1

2017-08-14 20:08:36: python.d DEBUG: created charts for raspberry_pi
2017-08-14 20:08:36: python.d DEBUG: raspberry_pi starting data collection - update frequency: 1.0  retries allowed: 60
2017-08-14 20:08:36: python.d DEBUG: raspberry_pi sleeping for 0.905741930008 secs to reach frequency of 1.0 secs, now: 1502708916.09  next: 1502708917.0  penalty: 0
BEGIN raspberry_pi.temperature 0
SET temperature = 37
END

BEGIN netdata.plugin_pythond_raspberry_pi 0
SET run_time = 0
END

2017-08-14 20:08:37: python.d DEBUG: raspberry_pi raspberry_pi updated in 0 ms
2017-08-14 20:08:37: python.d DEBUG: raspberry_pi sleeping for 0.997577905655 secs to reach frequency of 1.0 secs, now: 1502708917.0  next: 1502708918.0  penalty: 0
BEGIN raspberry_pi.temperature 1000080
SET temperature = 37
END

BEGIN netdata.plugin_pythond_raspberry_pi 1000080
SET run_time = 0
END

2017-08-14 20:08:38: python.d DEBUG: raspberry_pi raspberry_pi updated in 0 ms
2017-08-14 20:08:38: python.d DEBUG: raspberry_pi sleeping for 0.99743103981 secs to reach frequency of 1.0 secs, now: 1502708918.0  next: 1502708919.0  penalty: 0

プラグインの有効化

自作プラグインを有効にするため/etc/netdata/python.d.confを編集します。
{{プラグイン名}}: yesの1文を追記する。無効にする場合はyesnoに変えてください。

/etc/netdata/python.d.conf
raspberry_pi: yes

修正後はnetdataを再起動します。

$ sudo systemctl stop netdata
$ sudo systemctl start netdata

問題がなければ下記のようにサイドメニューにプラグインが追加されると思います。

netdata.png

ポチると

raspberry_pi_plugin.png

チャートが表示されました。

参考