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()