Temperaturüberwachung für  Server-Schrank (Teil 4)

Für die Temperaturüberwachung in einem Server-Schrank haben wir in den vorangegangenen Teilen der Artikelserie die grundlegende Temperaturüberwachung und Alarmierung eingerichtet. Jetzt fehlt noch die optische Alarmierung mit Hilfe von RGB-LEDs. Leuchten diese Rot oder blinken sie sogar, dann sollte sich jemand um den Server kümmern...

Es wird davon ausgegangen, dass Home Assistant und ein MQTT-Broker (z.B. mosquitto) bereits erfolgreich eingerichtet sind. Außerdem sollte die vorherigen Teile der Artikelserie umgesetzt sein. Für die optische Warnung sollte eine RGB-Lampe bereits in Home Assistant eingebunden und korrekt angesprochen werden können. 

1| Farbe der Lampen anpassen

Damit die Farbe der RGB-LEDs entsprechend der Temperatur im Serverschrank angepasst wird, muss die Lichtfarbe zunächst beim Einschalten gesetzt werden. Wird zum setzen der Farbe das Attribut hs_value, also der HS-Farbraum, verwendet, dann muss das zu berücksichtigende Temperaturintervall lediglich auf das entsprechende Farbwerte-Intervall abgebildet werden. Zur Berechnung des Farbwerts für die aktuelle Temperatur kann folgende Formel genutzt werden:

Formel zur Berechnung des Farbwertes aus der aktuellen Temperatur

Dabei setzen sich die Variablen folgendermaßen zusammen:

VariableBeschreibung
TaktAktuelle Temperatur im Rack.
TminMinimale Wert des zu berücksichtigen Temperaturbereichs. Temperaturen unterhalb von 20°C sollen als tiefblau dargestellt werden. Daher wird für diesen Wert 20 angenommen. 
TmaxMaximaler Wert des zu berücksichtigen Temperaturbereichs. Temperaturen ab 45°C sollen als tief rot angezeigt werden. Daher wird für diesen Wert  45 angenommen.
HminMinimaler Farbwert auf der Farbton-Skala. Temperaturen <= Tmin wird dieser Farbwert zugeordnet.
HmaxMaximaler Farbwert auf der Farbton-Skala. Temperatiren >= Tmax wird dieser Farbwert zugewiesen.

Gemäß Wikipedia ist die Farbwertskala folgendermaßen aufgebaut:

Farbtonskala (Quelle: wikimedia)

Da die Temperaturen auf Farbwerte zwischen Blau und Rot abgebildet werden sollen, wird für Hmax ein Wert von ca. 250 und für Hmax von 360 angenommen.

Mit der folgenden Automatisierung kann dementsprechend die Farbe der RGBs beim Einschalten angepasst:

alias: 'Server-Rack: Farbe beim Einschalten setzen'
description: >-
  Wird der LED-Streifen im Rack eingeschaltet, wird die Farbe entsprechend
  der Temperatur im Rack gesetzt.
trigger:
  - platform: state
    entity_id: light.tint_led_rgb_01
    to: 'on'
    from: 'off'
condition: []
action:
  - service: light.turn_on
    data:
      transition: 1
      hs_color: >
        {% set Hmin = 250 | float %}
        {% set Hmax = 360 | float %}
        {% set Tmin =  20 | float %}
        {% set Tmax =  45 | float %}
        {% set Takt = states('sensor.temperature_rack') | float %}
        {% set H = (((Hmax - Hmin) * Takt) + ((Hmin * Tmax) -  (Tmin * Hmax))) / (Tmax - Tmin) %} 
        {% if H < Hmin %}
            {% set H = Hmin %}
        {% elif H > Hmax  %}
            {% set H = Hmax %}
        {% endif %}   
        [ {{ H }}, 75 ]
    entity_id: light.tint_led_rgb_01
mode: single

Zusätzlich muss die Farbe der Lampen kontinuierlich angepasst werden, wenn sich die Temperatur im Serverschrank ändert:

alias: 'Server-Rack: Farbe aktualisieren'
description: >-
  Ist die Beleuchtung im Rack eingeschaltet, wird die Farbe entsprechend
  der Temperatur im Rack laufend aktualisiert.
trigger:
  - platform: state
    entity_id: sensor.temperature_rack
condition:
  - condition: state
    entity_id: light.tint_led_rgb_01
    state: 'on'
action:
  - service: light.turn_on
    data:
      transition: 1
      hs_color: >
        {% set Hmin = 250 | float %}
        {% set Hmax = 360 | float %}
        {% set Tmin =  20 | float %}
        {% set Tmax =  45 | float %}
        {% set Takt = states('sensor.temperature_rack') | float %}
        {% set H = (((Hmax - Hmin) * Takt) + ((Hmin * Tmax) -  (Tmin * Hmax))) / (Tmax - Tmin) %} 
        {% if H < Hmin %}
            {% set H = Hmin %}
        {% elif H > Hmax  %}
            {% set H = Hmax %}
        {% endif %}   
        [ {{ H }}, 75 ]
    entity_id: light.tint_led_rgb_01
mode: single

2| Optischer Alarm

Nachdem die Farbtemperatur richtig gesetzt wird, muss noch der optische Alarm ausgelöst werden, wenn die Temperatur zu hoch ist. Damit das Blinken dauerhaft funktioniert muss als erstes eine Schleife aus zwei Scripten angelegt werden. Mit dem ersten Script wird ein Effekt gestartet, 5 Sekunden gewartet und dann das zweite Script aufgerufen:

alias: Flash Serverrack On
sequence:
  - service: light.turn_on
    data:
      effect: okay
    entity_id: light.tint_led_rgb_01
  - delay: '5'
  - service: script.turn_on
    data: {}
    entity_id: script.flash_serverrack_loop
mode: single
icon: 'mdi:alarm-light-outline'

Im zweiten Script wird dann schließlich weider das erste Script aufgerufen. Zuvor wird noch eine Sekunde geewartet, damit das erste Script auch beendet wurde bevor es erneut aufgerufen wird:

alias: Flash Serverrack Loop
sequence:
  - delay: '1'
  - service: script.turn_on
    data: {}
    entity_id: script.flash_serverrack_on
mode: single
icon: 'mdi:alarm-light-outline'

Mit einem Schalter soll der Alarm später manuell quittiert werden können. Daher wird in Home Assistant unter Configuration > Helpers ein Toggle-Element angelegt:

Schalter zum quittieren des optischen Alarms

Mit einer Automation wird der optische Alarm gestartet, wenn der Schalter eingeschaltet wird...

alias: 'Serverrack: Start Optical Alarm'
description: >-
  Wird der Alarm-Schalter eingeschaltet, muss der optische Alarm gestartet
  werden.
trigger:
  - platform: state
    entity_id: input_boolean.serverrack_alarm
    to: 'on'
condition: []
action:
  - service: script.turn_on
    data: {}
    entity_id: script.flash_serverrack_on
mode: single

und gestoppt, wenn er wieder ausgeschaltet wird:

alias: 'Serverrack: Stop Optical Alarm'
description: >-
  Wird der Alarm-Schalter ausgeschaltet, muss der optische Alarm gestoppt
  werden.
trigger:
  - platform: state
    entity_id: input_boolean.serverrack_alarm
    to: 'off'
condition: []
action:
  - service: script.turn_off
    data: {}
    entity_id: script.flash_serverrack_on
  - delay: '2'
  - service: script.turn_off
    data: {}
    entity_id: script.flash_serverrack_on
mode: single

Hinweis: Damit der optische Alarm auch wirklich ausgeschaltet wird, wird das Script zweimal gestoppt.

Der Schalter muss jetzt noch automatisch getriggert werden, wenn der Temperaturstatus auf alarm gesetzt wird. Dazu wird die Automatisierung Serverrack: Set status alarm die wir im vorherigen Teil erstellt haben, um folgende Action erweitert: 

Optischen Alarm starten

In den Automations Serverrack: Set status normal, Serverrack: Set status warm und Serverrack: Set status hot muss dann noch folgende Aktion ergänzt werden, damit der optische Alarm auch automatisch wieder gestoppt wird:

Optischen Alarm wieder stoppen

Damit ist das Projekt "Serverschrank-Überwachung" soweit erstmal abgeschlossen. Sicherlich gibt es auch für dieses Projekt noch Verbesserungspotential. Aktuell hat mein Serverschrank beispielsweise einen Lüfter eingebaut, den ich manuell regeln muss. Schöner wäre es, wenn der Lüfter mit einem ESP 8266 geregelt werden könnte. Dann könnte man mit dieser Automatisierung natürlich auch noch versuchen den Lüfter hoch zu regeln, bevor der Server ausgeschaltet wird. Für Hinweise wie sowas umgesetzt werden kann, wäre ich auf jeden Fall dankbar...

Kommentare

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page