Ich baue gerade den Raspberry Pi aus dem Wohnwagen um in ein anderes Gehäuse, mit mehr Platz, besserer Belüftung (Thermalright TL-8015) und leichterer Montage. Der Pi4 hat ja leider keinen Eingang für die Lüfterdrehzahl, so daß man dies manuell über einen der GPIO-Pins erledigen muß. Den Code für die Messung der Lüfterdrehzahl habe ich auf Github hier gefunden, geringfügig modifiziert und um die passenden Befehle für dem MQTT-Client paho ergänzt. Paho kümmert sich so auch um den nötigen Reconnect nach Ausfall des Brokers. Die Einbindung in Homeassistant ist damit leicht zu erreichen. Mosqitto habe ich eh als Container laufen, um mir die Daten des Teltonika-Routers anzeigen zu können.
sudo apt install python3-rpi-lgpio
sudo apt install python3-paho-mqtt
Die Datei fanrpm.py sieht dann so aus:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import paho.mqtt.client as mqtt
# Pin configuration
TACH = 17 # Fan's tachometer output pin
PULSE = 2 # Thermaltake-Lüfter gibt 2 Impulse pro Umdrehung aus
WAIT_TIME = 1 # Wartezeit zwischen Messungen
# Setup GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(TACH, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Pull up to 3.3V
# Setup variables
t = time.time()
rpm = 0
# Setup und Start mqtt-client
mqtt_host = "localhost"
mqtt_port = 1883
topic1 = "homeassistant/sensor/raspi/fan_rpm"
client = mqtt.Client()
client.connect(mqtt_host,mqtt_port)
client.loop_start()
# Caculate pulse frequency and RPM
def fell(n):
global t
global rpm
dt = time.time() - t
if dt < 0.015:
return # Thermaltake-Lüfter dreht nicht schneller als 2000 U/min
freq = 1 / dt
rpm = round((freq / PULSE) * 60, -1)
t = time.time()
# Add event to detect
GPIO.add_event_detect(TACH, GPIO.FALLING, fell)
try:
while True:
client.publish(topic=topic1, payload=str(rpm), qos=0)
rpm = 0
time.sleep(1) # Detect every 1 second
except KeyboardInterrupt: # trap a CTRL+C keyboard interrupt
GPIO.cleanup() # resets all GPIO ports used by this function
client.loop_stop()
Jetzt muß nur noch das Script als Dienst durch systemd gestartet werden:
rainer@wohnwagen:~ $ mkdir -p ~/.config/systemd/user
rainer@wohnwagen:~ $ touch ~/.config/systemd/user/fanrpm.service
Die gerade erzeugte Datei befüllt man mit folgendem Inhalt:
[Unit]
Description=Log fanspeed via MQTT
DefaultDependencies=no
After=docker.service
[Service]
ExecStart=python /home/rainer/.local/bin/fanrpm.py
Type=exec
Restart=always
RestartSec=5s
[Install]
WantedBy=default.target
Jetzt noch den Dienst aktivieren und starten:
rainer@wohnwagen:~ $ sudo loginctl enable-linger $USER
rainer@wohnwagen:~ $ systemctl --user daemon-reload
rainer@wohnwagen:~ $ systemctl --user enable fanrpm.service
Created symlink /home/rainer/.config/systemd/user/default.target.wants/fanrpm.service → /home/rainer/.config/systemd/user/fanrpm.service.
rainer@wohnwagen:~ $ systemctl --user start fanrpm.service
rainer@wohnwagen:~ $
In der config.yaml vom Homeassistant muß dann der folgende Text ergänzt werden. Das automatische Erkennen über das MQTT.Plugin funktioniert nämlich nicht:
mqtt:
sensor:
- name: "U/min Raspi Lüfter"
state_topic: "homeassistant/sensor/raspi/fan_rpm"
unique_id: "rpm_raspi_fan"
device_class: speed
icon: mdi:speedometer-medium