MuninPlugin ‐ HU - gajdipajti/fan-control GitHub Wiki

Munin Plugin

A dokumentáció, rajzok, áramköri vázlatok CC BY-SA-4.0 license alatt érhetőek el.

A munin beépülő moduloknak megvan a saját lelki világuk. Nincs nyelvi megkötés. Lehet bash, perl, python, c, vagy bármi ami fut az adott operációs rendszeren. munin-nonitoring. Érdemes körbenézni a github felületen.

Ami érdekes lehet:

Ehhez a beépülő modul megírásához a python3 nyelvet választottam, abból is a python3.10-et. Nagyon szeretem a switch/case struktúrát, vagy pythonosan match/case. De mi is történik:

  • A fájlnévből kiolvassuk azt, hogy melyik tty eszközhöz fogunk csatlakozni. Majd csatlakozunk is.
  • Függvénybe írjuk az egyes értékek kiolvasását.
    • Soros port esetén bytefolyamot szeretünk, így le tudom küldeni a kocsi-vissza karaktert.
    • A .readline() függvény az újsor karakterig vár a válaszban, vagy amíg a timeout le nem telik.
    • A választ ASCII szerint értelmezzük.
    • Visszaadjuk a megtisztított értéket.
  • Ha a beépülő modul egy argumentummal került meghívásra, akkor tudjuk, hogy a beállításokat kéri le a közpointi munin grafikon rajzoló.
  • Ha a beépülő modult argumentum nélkül hívja meg a munin-node, akkor csak az értéket kell visszaadni.
#!/usr/bin/python
# A basic munin-node plugin to monitor the Fan Control Nano.
"""
USAGE

    rename the file to contain the tty device: fan-control-nano_ttyUSB0
    add dialout permissions

DESCRIPTION

    A Munin plugin to graph the temperatures and fan speeds of a rack. It requires
    the Fan Control Nano.

AUTHOR

    Tamás Gajdos [https://github.com/gajdipajti]
    Founded by the Free Software Foundation Hungary.

LICENSE

    This munin plugin script is GPLv3 licensed.
"""

import re
import serial
import sys

# Extract tty device from filename
ttyDevice = re.search('_tty(.*)', __file__)
# print(ttyDevice.group()[1:])

# Create the connection
ser = serial.Serial("/dev/" + ttyDevice.group()[1:], baudrate=115200, timeout=3.0)

# Implemented functions, to extract data
def getTemperature():
  ser.write(b't?\r')
  answer = ser.readline()
  temperature = bytes(answer).decode('ASCII')
  return temperature.strip()

def getTemperatureSource():
  ser.write(b'ts?\r')
  answer = ser.readline()
  tempSource = bytes(answer).decode('ASCII')
  match tempSource[0]:
    case 'N':
      return 'NTC'
    case 'L':
      return 'LM35'
    case 'D':
      return 'DS18B20'
    case 'A':
      return 'AD22100KTZ'
    case _:
      return 'Unknown'

def getRPM():
  ser.write(b'rpm?\r')
  answer = ser.readline()
  rpmValues = bytes(answer).decode('ASCII')
  return rpmValues.strip()

def getPWM():
  ser.write(b'pwmA?\r')
  answer = ser.readline()
  pwmValues = bytes(answer).decode('ASCII')
  return pwmValues.strip()

if len(sys.argv) == 2:
  # Something was passed
  match sys.argv[1]:
    case 'autoconf':
      print('yes')
    case 'config':
      # We configure the plugin here
      # print('multigraph fan_control_temp')
      print('graph_title Fan Control Nano Temperature: ' + getTemperatureSource())
      print('graph_vlabel Temperature in Celsius')
      print('graph_category Sensors')
      print('temp.label Measured Temperature')
      print('graph_args --base 1000  --lower-limit 0 --upper-limit 85')
else:
   print('temp.value ' + getTemperature())

ser.close()