high temperature & smart solution

Das Problem

Wer Zweite Schritte unter Fhem gelesen und/oder bearbeitet hat – der hat nicht nur ein Sysmon Device, sondern weiß auch, dass meine CPU-Temperatur am Tinkerboard ziemlich hoch ist. Hier zeige ich euch, wie man aus einem kleinen Problem, mit einer simplen Lösung – einen smarten Film fahren kann 😉

Die Ursache

Das liegt daran, dass sich mein Tinkerboard in einem Hutschienengehäuse befindet, dieses befindet sich in einen geschlossenen Wandinstallationsgehäuse. Eine Belüftung findet dort nicht statt – und bei entsprechender Auslastung steigt die Temperatur des Tinkerboards locker auf bis zu 80 °C. Und um dem ganzen noch die Krone aufzusetzen, hängt das Ganze auf meinem Dachboden, wo im Sommer mitunter tropische Temperaturen vorherrschen.

P_20171210_182953_vHDR_Auto

Das Installationsgehäuse. Das war der Testaufbau – ohne Haube. Oben links das 5V Netzteil, daneben ein 8V Klingeltrafo – der ist aber durch ein 12V Netzteil ersetzt worden. Mittig ist die Relaiskarte angebracht

raspberry-pi-gehaeuse-licht-grau-rpi-bc-1076-dev-kit-kmgy-raspberry-pi

Das Hutschienengehäuse. Die Blende in der Mitte lässt sich aufklappen, bzw. entfernen. Links hat man ausreichend Platz um die Anschlusskabel dezent zu verstecken bzw. Kabel herein-oder heraus zu führen

Das ist nicht smart

Jetzt hätte ich einfach hergehen können und einen kleinen 5V Lüfter irgendwo im Bereich der CPU anbringen (wahrscheinlich im Bereich der Klappe) und über das Board betreiben können, aber wo ist da der Anspruch?!

Ich hab diese Lösung tatsächlich in Erwägung gezogen, allerdings keinen entsprechenden Lüfter da gehabt. In die Klappe vom Hutschienengehäuse hätte ich Problemlos einen 40×40 Lüfter einbauen können und das Problem wäre sicherlich erledigt. Dann hättet ihr euch aber nicht an diesem Kapitel hier erfreuen können, ich hätte mich auch erst viel später mit der Schaltung der GPIOs am Tinkerboard beschäftigt und meine Relaiskarte wäre weiterhin ungenutzt.

Warum also nicht die vorhandenen Mittel nutzen?

smarte Ansätze

Ich habe mein Sortiment durchgeguckt und einen ausrangierten Gehäuselüfter gefunden, den habe ich auf die Haube vom Installationsgehäuse, in Höhe der CPU des Tinkerboards, gesetzt. Die Klappe auf dem Hutschienengehäuse des Tinkerboards werde ich entweder weglassen, oder eine Öffnung im Bereich der CPU einbringen. Der Lüfter arbeitet allerdings mit einer Spannung von 12V.

P_20180513_225236_vHDR_Auto.jpg

Mit dem separaten Hutschienen-Netzteil für 12V (was ich noch besorgen musste und gegen den 8V Klingeltrafo ausgetauscht habe) will ich nun ab einer bestimmten Temperatur den Lüfter einschalten. Hier wird auf jeden Fall auch ein Relais o.Ä gebraucht, da das Board die 12V  nicht direkt schalten kann.

Hier wären jetzt die folgenden Szenarien denkbar

  • Ein Python-Skript, dass unabhängig von Fhem, in regelmäßigen Abständen die CPU-Temperatur ausliest und bei einem Wert höher X für Y-Minuten den Lüfter bzw. GPIO einschaltet
  • Ein Notify in Fhem, dass den Lüfter ab X-Grad für Y-Minuten einschaltet.
  • Ein Doif in Fhem, dass den Lüfter ab Temperatur X einschaltet und bei Temperatur Y wieder abschaltet

schwere Entscheidung…

Wenn man schon Fhem nutzt, kann man Fhem das auch machen lassen – daher fällt die erste Option weg. Da mir die (Perl-)Syntax von Notify nicht sonderlich zusagt (ja, aufgrund mangelnder Kenntnisse), nehme ich das Doif.

Generell werde ich Python ein Skript brauchen um einen GPIO zu schalten. Da ich bereits eine 4er-Relaiskarte in meinem Gehäuse verbaut habe, werde ich Eins davon nutzen, um den Lüfter zu schalten.

observe

Die CPU-Temperatur liegt bei geschlossenem Hutschienengehäuse und aufgesetzter Haube auf dem Installationsgehäuse zwischen 65-75° unter sehr hoher Last kratzt sie gar an der 80° Marke.

Während ich mir Gedanken um die Belüftung gemacht und auf das 12V Netzteil gewartet habe, lief das Board etwa eine Woche ohne Haube und Klappe, bei sommerlichen Temperaturen vor sich hin. Die Temperatur pendelte sich so auf etwa 60 ° ein – das ist meiner Meinung nach, ohne Kühlung, in Ordnung.

Ich werde den Lüfter vorerst bei einer Temperatur größter 62° einschalten  und bei kleiner 55° wieder abschalten lassen. Zusätzlich lass ich mich per Telegram-Bot darüber informieren, wann der Lüfter eingeschaltet wurde. So kann ich die Regelung bei Bedarf noch optimieren.

Python

Neben der Hardware brauche ich noch zwei kleine Python Skripte. Das eine schaltet den GPIO, an dem das Relais hängt ein, das Zweite schaltet den GPIO wieder aus. Dazu erstelle ich zwei Python Files im Fhem Verzeichnis, diese kann ich dann wahlweise im Terminal per Nano oder über die Fhem-Weboberfläche bearbeiten.

Im Linux-Terminal navigiert man dazu ins entsprechende Verzeichnis

cd /opt/fhem/FHEM

und erstellt zwei leere Dateien. Beiden wird auch in einem Zug die entsprechende Berechtigung zum Ausführen gegeben und werden an den Benutzer Fhem übertragen. 

touch GPIO32HIGH.py && sudo chmod 700 /opt/fhem/FHEM/GPIO32HIGH.py && sudo chown -R fhem:root /opt/fhem/FHEM/GPIO32HIGH.py
touch GPIO32LOW.py && sudo chmod 700 /opt/fhem/FHEM/GPIO32LOW.py && sudo chown -R fhem:root /opt/fhem/FHEM/GPIO32LOW.py

GPIO32 ist in dem Fall der GPIO, an dem ein Relais hängt – und der durch je ein Skript auf High oder Low gezogen wird.

Man kann das ganze jetzt auch komfortabel über die Fhem-Weboberfläche bearbeiten, dazu gibt man im Browser folgendes ein:

http://192.168.XXX.XXX:8083/fhem?cmd=style%20edit%20DATEINAME.py

Dann schreibt man ein bisschen.. Zum HIGH setzen des GPIO

#Datei GPIO32HIGH.py
import ASUS.GPIO as GPIO
import time,sys
#GPIO Einstellungen
GPIO.setmode (GPIO.BCM)
GPIO.setwarnings(False)
#GPIO als Ausgang festlegen
GPIO.setup (12,GPIO.OUT)
#Zustand des GPIO festlegen
GPIO.output (12,False)

und für LOW

#Datei GPIO32LOW.py
import ASUS.GPIO as GPIO
import time,sys
#GPIO Einstellungen
GPIO.setmode (GPIO.BCM)
GPIO.setwarnings(False)
#GPIO als Ausgang festlegen
GPIO.setup (12,GPIO.OUT)
#Zustand des GPIO festlegen
GPIO.output (12,False)

Das ganze noch abspeichern – fertig sind die beiden Skripte. Selbstverständlich kann man die Zeilen auch per Nano im Linux-Terminal einfügen.

Update

Hier hatte ich erwähnt, dass es auch die Möglichkeit gibt die GPIOs per Bash-Skript zu steuern. Da das natürlich deutlich leichter ist, habe ich den Python-Teil (trotz einwandfreier Funktion) gestrichen und verwende stattdessen das Bash-Skript. Im Folgenden habe ich die Angaben entsprechend angepasst.

Rechte

Da die Python-Skripte Da das Bash-Skript mit sudo ausgeführt werden, muss dem User Fhem erlaubt werden sudo zu benutzen. Dafür gibt es die Gruppe „sudo„. Alle Mitglieder sind berechtigt Terminal-Befehle mit vorangestelltem sudo ausführen zu dürfen.

Um das zu ermöglichen gibt man im Terminal

sudo visudo

ein und fügt einen Eintrag für Fhem hinzu – unter Ubuntu wie folgt

# User privilege specification
root ALL=(ALL:ALL) ALL
fhem ALL=(ALL) NOPASSWD: ALL

Unter Raspbian muss der Eintrag  an eine andere Stelle

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
fhem ALL=(ALL) NOPASSWD: ALL

Der Editor kann, wie Nano auch, mit STRG+O speichern und mit STRG+X beendet werden. Fhem darf damit sudo – Befehle ausführen.

Man könnte hinter NOPASSWD: auch einen Dateipfad setzen und die Rechte für Fhem so auf die angegebene Datei beschränken. In meinem Fall wären das recht viele, da jeder GPIO nur per Skript gesteuert werden kann.

Doif

Fehlt nur noch ein Doif zur Erfassung der Temperatur und entsprechender Steuerung des GPIO. Ich hab mir dafür erstmal ein nacktes Doif in Fhem angelegt.

define Lueftersteuerung DOIF (x)

Das kann man jetzt schön bearbeiten.

In das DEF schreibe ich in den ersten Befehlszweig (cmd_1), dass das Reading cpu_temp des sysmon größer als 62° eine Reaktion erfordert – das Skript GPIO32HIGH.py soll ausgeführt werden und eine Nachricht per Telegram gesendet werden.

([sysmon:cpu_temp] > 62) (set TelegramBot _msg CPU-Temperatur über 62°. Lüfter wird eingeschaltet.)  ({system("sudo sh /opt/fhem/FHEM/fhem-gpio.sh 239 1 &")})

Da  im zweiten Befehlszweig (cmd_2) wieder auf ein Reading reagiert werden soll, muss DOELSEIF verwendet werden.

DOELSEIF ([sysmon:cpu_temp] < 55) ({system('"sudo sh /opt/fhem/FHEM/fhem-gpio.sh 239 0 &")})

Das Doif wäre also fertig. Um es zu testen habe ich es ohne Lüfter einfach mal aktiviert. Da das Sysmon-Device seine Temperatur momentan minütlich aktualisiert, musste ich nicht lang auf eine Nachricht warten

Screenshot_20180514-130853.jpg

Da die Zieltemperatur ohne Lüfter nur schwer erreicht werden kann, habe ich zum Test des zweiten Befehlszweigs einfach das cpu_temp Reading manipuliert

setreading sysmon cpu_temp 50

Das Doif wechselte unverzüglich in den zweiten Befehlszweig (cmd_2) – funktioniert also einwandfrei.

Jetzt noch eben ein paar schöne Bildchen zuweisen

attr Lueftersteuerung icon vent_ventilation_level_automatic
attr Lueftersteuerung devStateIcon cmd_1:vent_ventilation_level_3 cmd_2:vent_ventilation

doif

Top.

Sysmon

Dem Sysmon-Devive kann man vorgeben in welcher Zeitspanne die Readings aktualisiert werden, dazu kann man die Multiplikatoren erweitern. Nähere Angaben dazu findet man im Fhem-Wiki (SYSMON).

Wie oben schon beschrieben aktualisiert es die Readings momentan im Minutentakt. Da ich nicht davon ausgehe, dass die Temperatur mit dem aktuellen Intervall von einer Minute den entsprechenden Zielwert erreicht, setze ich den Intervall auf 5. So läuft der Lüfter immer mindestens 5 Minuten, bevor das Sysmon-Device die neue Temperatur einliest.

Hat der Lüfter es innerhalb der 5 Minuten nicht geschafft den Wert auf unter 55° zu drücken, läuft er weitere 5 Minuten, bis der nächste Wert kommt. All diese Parameter lassen sich hinterher natürlich auch sehr leicht anpassen.

Praxistest

Nachdem alles fertig angeschlossen ist, kann man sehen, wie sich das System in der Praxis macht.

Unter den oben genannten Parametern (>62° an, < 55° aus, Sysmon Intervall 5 Minuten, Lüfter auf Schalterstufe 2 – mittel) bekam ich etwa alle 20 Minuten eine Nachricht, dass die obere Temperatur wieder erreicht wurde und der Lüfter eingeschaltet wird.

Das ist auf Dauer etwas lästig, daher hab ich unmittelbar Korrekturen vorgenommen.

Als erstes stellte ich fest, dass das Board nachdem der Lüfter abschaltete ca. 42° erreicht hatte – um den Wert generell besser einzuschätzen habe ich den Sysmon Intervall auf 2 Minuten herabgesetzt. Damit der Lüfter nicht ständig in kleinen Zeitspannen ein- und ausgeschaltet wird, habe ich die Schalterstufe am Lüfter auf 1 (niedrig) gesetzt. Die Temperaturen im Doif habe ich angepasst auf > 55 ° – Lüfter an und < 41 ° – Lüfter aus.

Der Lüfter lief in dem Szenario exakt 12 Minuten. Das Board benötigte danach weitere 6 Minuten, um wieder  > 55 ° zu erreichen. Insgesamt entspricht das dann einer Periode von 18 Minuten – nach wie vor nicht optimal. Es gilt die untere Temperaturschwelle zu finden, die einen gesunden Mix aus Lüfterlaufzeit und erneutem Erreichen der Obergrenze bildet.

Cool?

Um die untere Temperaturgrenze, bei geringster Lüfterstufe und gleichmäßiger CPU Auslastung zu finden, habe ich den Eventmonitor beobachtet und die Abschalttemperatur im Doif auf < 40 ° gesetzt. Der Lüfter schaltete also bei > 55 ° ein – und

temperaturen

vorerst nicht wieder ab. Die Temperatur lag nach 12 Minuten Laufzeit bei 40,91 ° – danach stieg sie wieder leicht an, blieb in diesem Bereich etwa aber konstant. Um 16:14   sank sie kurz auf 40,45 ° ab. Unter 40 ° geht die Temperatur, ohne Anpassung der Lüfterdrehzahl am Schalter, so definitiv nicht. Meiner Meinung nach ist das auch kühl genug für das Board und 55 ° definitiv nicht zu heiß.

Zwischen 15:48 Uhr (dem Einschalt-Zeitpunkt des Lüfters) und 16:14 Uhr (dem Erreichen von 40,45 °) liegen allein gute 20 Minuten – das ist wohl eine angemessene Laufzeit für den Lüfter. Sofern das Board wieder etwa 6 Minuten benötigt um >55 ° zu erreichen, beträgt die Peroide im Idealfall ca. eine halbe Stunde.

Final

Nach erneuter Anpassung des Doif schaltete der Lüfter um 16:36 Uhr bei 57.73 ° CPU-Temperatur ein und um 16:54 Uhr bei 40.45 ° wieder ab. Über das erneute Einschalten wurde ich um 17:01 Uhr benachrichtigt – und um 17:20 Uhr waren wieder 40.45 ° erreicht.

plot

Ganz zufrieden war ich damit aber nicht. Daher kam mir der Gedanke, einfach mal die Durchschnittstemperatur (cpu_temp_avg) als Regelwert zu nehmen. Diese habe ich nun zum Einschalten auf > 49 ° und zum abschalten auf < 40 ° gesetzt. Der Telegram-Bot wird mich allerdings nicht mehr informieren, dafür kann ich jetzt den Gplot nutzen.

Fazit

Wie ihr sehen könnt, kann man sich an simplen Problemen ziemlich lange aufhalten.