Jump to content

UNRAID Laie braucht Tipp für Skripterstellung


MAM59

Recommended Posts

Ich bräuchte mal einen kleinen Denkanstoß.

Ich will mir ein simples Skript machen, was alle paar Sekunden die Temperatur, Prozessorauslastung und... (der dritte Wert steht noch nicht wirklich fest, vielleicht der LAN Durchsatz?) von IRGENDWOHER ausliest und als Farbe und Balkendiagramme an OpenRGB LEDs übergibt.

Das Ganze muss wohl in Python entstehen, nur dafür habe ich entsprechende (OpenRGB) Klassendefinitionen gefunden.

 

Die anzuzeigenden Werte sehe ich ja durch installierte Plugins wie Dynamix System Statistics auf der GUI, nur, wie krieg ich die Werte in ein Skript eingelesen???

 

Ist ja nur Bling-Bling, aber in der Tiefe der dunklen Garage sieht man dann schon gleich, ob der Admin mal einen Blick werfen sollte oder nicht.

 

Ein Band aus 6 gleichgeschalteten LEDS zeigt dann farblich die Prozessortemperatur (von dunkelblau bis hellrot), zwei eineln ansteuerbare LEDbalken mit jeweils 8 LEDs sollen je nach Auslastung angehen, die Farbe wird wohl konstant bleiben (will Infos, keine Disco).

 

Wie gesagt, wie krieg ich die Werte rein?

(geht mal davon aus, dass ich der Shellprogrammierung und noch einem Dutzend anderer Programmiersprachen mächtig bin)

 

Link to comment
14 hours ago, Michael Meiszl said:

Das Ganze muss wohl in Python entstehen, nur dafür habe ich entsprechende (OpenRGB) Klassendefinitionen gefunden.

Gibt es Beispiele?

 

Das beste wäre mir einem Beispiel zu arbeiten, wo du erstmal nur eine Farbe statisch steuerst. Danach könnte man überlegen wie man Werte aus dem System ausliest und verarbeiten lässt.

Link to comment
34 minutes ago, mgutt said:

iGbt es Beispiele?

 

Das beste wäre mir einem Beispiel zu arbeiten, wo du erstmal nur eine Farbe statisch steuerst. Danach könnte man überlegen wie man Werte aus dem System ausliest und verarbeiten lässt.

Das wäre ein trivialer 2 Zeiler, wie gesagt, der "bunte Teil" ist nicht das Problem (na ja, vielleicht doch noch, ich muss noch rauskriegen, wie ich bei UNRAID die nötige Bibliothek nachladen kann, bislang mach ich das von einem anderen Server aus. OpenRGB funktioniert über LAN Verbindungen, im Trivialfalle eben über "localhost").

 

Ich vermeide direkt auf UNRAID zu "basteln", die Kiste macht dann manchmal so komische Abflüge, wie z.B. gestern als ich "nur das Array stoppen" wollte um einen Pool zu löschen und nach über einer Stunde dann die Reset Taste drücken musste, weil die Leute mir schon im Nacken hingen und wieder an ihre Daten wollten...

 

Also eine Ansteuerung sähe etwa so aus:

Quote

from openrgb import OpenRGBClient
cli = OpenRGBClient('192.168.1.111', 8000, 'My client!')

 

from openrgb.utils import DeviceType

mobo = cli.get_devices_by_type(DeviceType.MOTHERBOARD)[0]

 

from openrgb.utils import RGBColor

red = RGBColor(255, 0, 0)

blue = RGBColor.fromHSV(240, 100, 100)

green = RGBColor.fromHEX('#00ff00')

mobo.set_color(blue)

cli.devices[0].set_color(red)

cli.devices[1].zones[0].set_color(green)

wobei die Devices und Zonen dynamisch sind.  Deshalb muss man sie von der Verbindung abfragen ("mobo =...")

Allerdings gibt es einen Haken: die einzeln ansteuerbaren LEDs sind ja alle in einer Kette angeschlossen. Die Befehle werden  zwar immer weiter durchgereicht (und die Adresse dabei um 1 subtrahiert, wenn sie 0 ist fühlt sich die LED angesprochen und gibt nix mehr weiter), aber es gibt keine Möglichkeit zu ermitteln, WIEVIELE angeschlossen sind. Diese "Size" muss man also hartkodieren und sie muß dann eben immer wieder angepasst werden.

(es gibt ein paar fiese Tricks, z.B. wenn man  eine LED AUS machen will, muß man ihr die Farbe "Schwarz  / (0,0,0)" zuordnen. Da die Einstellungen in den LEDs gespeichert werden, braucht man nur die jeweiligen Änderungen zu senden usw. ist aber alles total harmlos)

 

Edited by Michael Meiszl
Link to comment

Wenn Du es genauer wissen willst, hier mal ein Screenshot von dem UNRAID Plugin:

AuraLEDs.thumb.jpg.76a476b48d3cfff98b8c52363304d2b7.jpg

Jedes Mainboard bietet da andere Anschlüsse. Hier sind 3 LEDs auf (bzw UNTER) dem Motherboard (und natürlich im geschlossenen Gehäuse nicht sichtbar), 2 verschiedene RGB Header (da kann man die LED Streifen anschließen, die man so im Baumarkt kriegt und wo dann alle eine gemeinsame Farbe haben) und noch 16 LEDs die einzeln ansteuerbar sind (letztere mußte ich von Hand konfigurieren, wie erwähnt, es gibt keine Möglichkeit sie automatisch durchzählen zu lassen).

 

Du kannst also kein Skript machen, was überall sofort ganz toll läuft, weil jede Kiste einen anderen Aufbau hat.

 

Link to comment
24 minutes ago, mgutt said:

Und läuft es? Wie sieht das fertige Script aus?

jaja, das geht schon (wie gesagt, von einer ANDEREN Kiste aus, um UNRAID kümmere ich mich später) Die paar Zeilen da oben schalten verschiedene LEDs auf verschiedenen Anschlüssen auf die jeweilige Farbe. Um Helligkeiten zu regeln muss man die Farben abdimmen (also 255,0,0 für ganz helles rot, 10,0,0 für ganz schwaches rot).

Manche Farben (z.B. gelb) kommen mit den LEDs nicht so gut raus, weil die recht groß sind, und der Abstand der internen Farb LEDs doch auch recht weit. Die Farbmischung ist dann erst nach einigen Metern Abstand korrekt). Aber wenn man bei den Grundfarben bleibt, sieht alles recht gut aus.

 

Mit der GUI des besagten Plugins kannst du auch alles von Hand durchprobieren, aber das ist ja recht langweilig und doof.

 

(Anmerkung: "von einer ANDEREN Kiste aus" bedeutet, dass im Moment das Skript auf einem anderen Linux Server läuft, aber bei UNRAID die LEDs ansteuert. Könnte von mir aus auch so bleiben, aber dann müsste ich die Werte für CPU & Co remote auslesen können...)

Edited by Michael Meiszl
Link to comment
13 hours ago, mgutt said:

Und läuft es?

also ich habs heute abend mal ausprobiert, läuft wie ne 1 🙂

 

Das Testscript:

#!/usr/bin/env python3
from openrgb import OpenRGBClient
from openrgb.utils import RGBColor
import time

client = OpenRGBClient('192.168.0.4',6742,'MAMTest')

print(client)

print(client.devices)

#client.off()

while True:
    for x in range(360):
        client.set_color(RGBColor.fromHSV(x, 100, 100), fast=True)
        time.sleep(.05)

output auf der shell:

[root@l3router ~/openrgb-python-master/examples]# ./spectrum-cycle.py
OpenRGBClient(address=192.168.0.4, port=6742, name=MAMTest)
[Device(name=ASUS TUF GAMING X570-PLUS (WI-FI), id=0)]
^CTraceback (most recent call last):
  File "./spectrum-cycle.py", line 17, in <module>
    time.sleep(.05)
KeyboardInterrupt

steppt alle Farben durch, bis man es mit CTRL-C abbricht

Nur dieser "client.off()" Befehl funktioniert nicht, muss mal suchen warum (ist aber nicht so wichtig, die Dinger sollen ja leuchten, nicht aussein :-))) )

 

Hab auch schon Funktionen gefunden, die Temperaturen in Farben umrechnen und Balkengrafiken anzeigen können.

 

Nur, es fehlen immer noch die Daten von Prozessor, Ram und Platten (oder LAN)

 

Link to comment

so, ich bin auf der Zielgerade 🙂

 

Die CPU Temperatur kann man auslesen mit

X=`sensors |grep "CPU Temp:" | sed "s/.*+//" |sed "s/°.*//"`

 

(da steht normalerweise "CPU Temp:     +45.2°C" aber wir schneiden vorne und hinten ab und lassen nur "45.2" über)

 

die cpu Belastung findet man in /var/local/emhttp/cpuload.ini. Kann man einfach lesen mit dem json plugin.

 

Fehlt noch die LAN Auslastung... da hatte bislang noch niemand einen Tipp...

 

Link to comment
  • 2 weeks later...
On 4/2/2022 at 3:35 PM, Michael Meiszl said:

Fehlt noch die LAN Auslastung... da hatte bislang noch niemand einen Tipp...

 

Mit "ifstat" bekommst du die aktuelle Übertragungsrate. Mit "ifstat -j" bekommst du die Daten als "json" zurück. Das dürfte das Verarbeiten mit python erleichtern. Mit "ifstat -jt 60" bekommst du die durchschnittliche Transferrate der letzten 60 Sekunden zurück. Mehr Infos:

https://man7.org/linux/man-pages/man8/ifstat.8.html

Link to comment

ja, dange 🙂

ifstat hatte ich auch schon mal gefunden, bin aber etwas zu blöd, die Werte zu interpretieren und als sinnvolle Einheiten umzurechnen  (z.B. so, wie auf dem Dashboard).

eth0                5416 0          6174 0         1006K 0        960279 0
                       0 0             0 0             0 0             0 0
br0                 5356 0          6160 0        918958 0        958670 0

 

die dritte(+vierte) Spalte ist wohl interessant, aber, was sind 1006K ?

 

Aber, ist erstmal egal. Der Docker hat sich mal wieder verabschieded und ich habe keinen Bock darauf, zu suchen warum. auf einmal war das webinterface des dockers nicht mehr erreichbar ("cannot connect to server"), der server selber läuft aber und kann über LAN angesprochen werden. Das Konzept "Docker" hat sich mir nie erschlossen, ich hasse die Dinger wie die Pest und verwende keinen Einzigen bislang. Und dabei wirds wohl bleiben. Ich kann das LED Device ja mal an eine VM durchreichen, vielleicht kann Windows damit mehr anfangen... Sonst bleiben die Lämpchen aber dunkel, ich baue keine Kartenhäuser mit dem Motto "von hinten durch die Brust ins Auge, Hauptsache: GEHT IRGENDWIE". Die fallen einem immer wieder auf die Füße irgendwann...

 

Link to comment

Update: hab das Docker Geraffel (echt krank das Zeug 😞 ) erfolgreich entsorgt und das USB Device in eine VM durchgereicht.

Dort funktioniert die GUI und der Server nun erstmal.

Mal schauen, wie lange (der Docker hatte ja sonne Woche überlebt bevor er die Lust verlor).

Also kann ich bald mit dem Skript weitermachen, brauch ja nur die IP Adresse beim Öffnen ändern.

 

(Nein, normalerweise braucht niemand die GUI, aber sie erlaubt eine Gesamtanzeige aller gefundenen Geräte und man muss diese unter ihrem Namen ansprechen. Schlecht also, wenn man die Liste nicht sehen darf...)

 

Ach ja, prinzipbedingt (eben WEGEN dieser Namen) wird es nie möglich sein, ein "Skript für alle" anzubieten. Jeder muss da zumindest in einer Tabelle die Namen seiner eigenen Geräte (bzw LEDs) eintragen. Das wird also kein Point&Click Dingens...

 

Also keine übertriebene Euphorie bitte...

 

Edited by Michael Meiszl
Link to comment

Info für @mgut:

 

Ich hab heute morgen schon mal einen erfreulichen Fortschritt erzielt, ich bin nun in der Lage eine Liste der Geräte abrufen und somit jede LED/Stripe einzeln anzusteuern. Bleibt natürlich weiterhin "spezifisch", nähert sich aber schon mal einer wartbareren Form

 

OpenRGBClient(address=192.168.0.183, port=6742, name=MAMTest)
[Device(name=ASUS , id=0)]
[LED(name=Aura Mainboard, LED 1, id=0), LED(name=Aura Mainboard, LED 2, id=1), LED(name=Aura Mainboard, LED 3, id=2), LED(name=Aura Mainboard, RGB Header 1, id=3), LED(name=Aura Mainboard, RGB Header 2, id=4), LED(name=Aura Addressable 1, LED 1, id=5), LED(name=Aura Addressable 1, LED 2, id=6), LED(name=Aura Addressable 1, LED 3, id=7), LED(name=Aura Addressable 1, LED 4, id=8), LED(name=Aura Addressable 1, LED 5, id=9), LED(name=Aura Addressable 1, LED 6, id=10), LED(name=Aura Addressable 1, LED 7, id=11), LED(name=Aura Addressable 1, LED 8, id=12), LED(name=Aura Addressable 1, LED 9, id=13), LED(name=Aura Addressable 1, LED 10, id=14), LED(name=Aura Addressable 1, LED 11, id=15), LED(name=Aura Addressable 1, LED 12, id=16), LED(name=Aura Addressable 1, LED 13, id=17), LED(name=Aura Addressable 1, LED 14, id=18), LED(name=Aura Addressable 1, LED 15, id=19), LED(name=Aura Addressable 1, LED 16, id=20)]

 

Also, wenn ich nun id 20 auf (20,20,20) setze, geht nur die eine LED an und zeigt ein wenig weiß... damit lässt sich arbeiten.

 

Offensichtlich ist id0 "alles" (damit werden alle angeschlossenen Devices auf einmal umprogrammiert), die IDs 1,2 und 3 sitzen als einzelne LED unter (! sehr sinnvoll!!! ) dem Motherboard, id 3 ist der linke Stripe Anschluss, id 4 der rechte Stripe und 5.... (bei mir eben 20, weil 16 LEDs angeschlossen sind) der Anchluß für die Einzel LEDs extern.

 

So ähnlich wird wohl jedes Board ausgestattet sein, Prozessorkühler, Tastaturen, RAMs und Mäuse sind ein anderes Forschungsgebiet. Da muss jeder selber fuckeln bis seine Maus die Temperatur anzeigt.

 

 

Link to comment

So, ich bin fertig 😁

 

Hab den LAN Kram letztendlich weggelassen, das wäre noch kompliziert geworden (damit diese ifstat zahlen irgendwas aussagen können, muß man erstmal die Schnittstellengeschwindigkeit ermitteln, ausserdem hat der User keine Chance zu sagen WELCHES LAN er angezeigt haben will usw...)

 

Ist nun auf dem Stick unter /boot/config/optional und hat ein Startskript, dass per "go" aufgerufen wird. Das Startskript kopiert den ganzen Ordner mit Unterordnern nach /usr/local/bin, wartet, bis das NerdPack python installiert hat, und startet dann das eigentliche Temp2RGB (oder wie immer man es nennen will) Skript im Hintergrund.

Selbiges versucht dann eine LAN Verbindung zum RGB Server aufzubauen, der steckt bei mir in einer VM, man könnte nun aber auch wieder den Docker nehmen da man die Gui nur braucht, um die Geräte einmalig zu ermitteln.

(kann ich nun aber auch per Skript, also GUI unnötig)

Das läuft dann bis zum NImmerleinstag vor sich hin und frißt kein Brot.

IMG_0875.thumb.jpg.74a6398bdab4c176890a9c82c98c966c.jpg

Links die Temperatur, in der Mitte ein Bargraph aus 8 LEDs für die Auslastung und ganz rechts blinkt eine grüne LED im 2s Rhytmus und signalisiert "Hurra, ich lebe noch!"

Die Farben wechseln bei Temperatur und Auslastung.  Die LEDs werden alle so mit max. 20% Helligkeit betrieben, voll aufgedreht wird man blind.

Nur bei Übertemperatur wird es seeeehr rot, seeeehr hell und blinkt seeeehr heftig...

 

Ich kann die ganzen Scripts hier reinpacken, aber, wie gesagt, da muss auf jeden Fall Hand angelegt werden, das ist kein Plug&Pray...

 

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...