CPU-Takt auf 20x4 LCD

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo, ich lasse mir auf meinem Pi einige Werte auf einem 20x4 LCD ausgeben. Unter anderem auch die Taktfrequenz. Da ich bisher einen Pi2 genutzt habe, ging das auch Problemlos. Nun habe ich einen Pi4 angeschlossen. Da dieser bis 1500MHz taktet, stimmt die Anzeige nicht mehr sobald der Wert 4-stellig wird.

    Die Taktfrequenz wird mit folgender Funktion ermittelt:

    Code
    def get_cpu_speed():
        "Returns the current CPU speed"
        f = os.popen('/opt/vc/bin/vcgencmd measure_clock arm')
        cpu = f.read()
        return cpu[14:]

    Die Ausgabe erfolgt dann so:

    Code
    lcd_string('CPU-Speed:   '+str(get_cpu_speed()[:3])+'MHz')

    Wenn ich nun die Ausgabe auf 4 Stellen erhöhe ([:4]) werden dann natürlich statt z. B. 600Mhz 6000 MHz angezeigt.

    Ich wäre sehr dankbar, wenn mir jemand helfen könnte, damit wieder die richtigen Werte angezeigt werden.

    Vielen Dank im voraus

  • Die Funktion für lcd_string() musst du noch selbst einbauen da du das nicht gezeigt hast.

    Weitere Informationen zum verwendeten Modul psutil findest du hier: https://psutil.readthedocs.io/en/latest/#psutil.cpu_freq

    Möchtest du die MHZ noch weiter Runden oder auf eine gewisse Zeichenzahl beschränken so kannst du das über format() innerhalb der {} erledigen. Siehe hier: https://pyformat.info/#number_padding

  • Hallo, vielen Dank für die Antwort. Leider kriege ich bei "import psutil" eine Fehlermeldung. Ich denke es hängt mit der verwendeten Python-Version zusammen. Ich habe mal meine Datei angehangen. Es wäre super wenn du sie dir mal anschauen könntest. Vielleicht kann man den Code auch ohne "psutil" so abändern, das die Frequenz richtig angezeigt wird. Vielen Dank für die Mühe.

  • Hallo,

    `psutil`muss du installieren, dass ist ein Modul, was nicht zur Standardinstallation gehört.

    Deinen Code solltest du als erstes dahin gehend ändern, dass du Python 3 benutzt. Das von dir verwendete Python 2 ist seit dem 1.1.2020 ohne Support durch die Entwickler von Python.

    Bzgl. deines Problems: du solltest dich mal mit Slicing und String-Formatierung beschäftigen, also den Basics von Python. Dann lässt sich dein Problem ziemlich sicher auch lösen. Aber mit dem psutil ist ein einfacher und eleganter, weil du die high-level API von psutil nutzen kannst statt dir alles selber zurecht zu fummeln.

    Warum nutzt du für den Aufruf von `/opt/vc/bin/vcgencmd` mal `os.popen` (alt) und mal `subprocess` (richtig)? Könnte es sein, dass der Code zusammen kopiert ist und du nicht wirklich verstehst, was da eigentlich läuft?

    Gruß, noisefloor

  • Du hast recht, so wirklich verstehe ich den Code nicht. Ich komme auch überhaupt nicht aus der IT. Mir selbst fehlt wirklich die Zeit und die Erfahrung mich näher damit zu beschäftigen. Also, ich wäre dir wirklich sehr dankbar, wenn du den betreffenden String bzw. die Ausgabe so formatieren könntest, das die Angabe im Endeffekt passt.

    kratz, kratz :)

    Vielen Dank

  • Du hast doch schon einen Code von mir bekommen...

    Ja, aber da gibt es ja das Problem mit psutil, wie oben geschrieben. Das einfachste wäre doch die Ausgabe von "def get_cpu_speed():" aus meinem Code einfach durch 1000000 zu teilen und dann mit "lcd_string('CPU-Speed: '+str(get_cpu_speed()[:3])+'MHz')" anzuzeigen. Jetzt werden ja nur die ersten 3 Stellen der Ausgabe angezeigt. Wenn ich 4 Stellen ausgeben lasse, kommt eben 6000MHz raus, statt 600 MHz. Ich weiß eben nicht wie ich die eine Zeile abändern soll. Und den gesamten Code für Python3 umzuschreiben, dafür fehlt mir die Erfahrung...

  • `psutil`muss du installieren, dass ist ein Modul, was nicht zur Standardinstallation gehört.

    Und woran scheiterts?

    EDIT:

    und zu deinem Code:

    os.popen ist veraltet -> müsstest du ersetzen

    Strings werden nicht mit + zusammengesetzt, sondern mit f-Strings oder format().

    Kannst also fast alles bei deinem Code ändern ;)

  • Hallo,

    ungetestet, aber aufgedröselt in kleine Stücke:

    Python
    ...
    cpu_speed = get_cpu_speed()
    cpu_speed_mhz = cpu_speed/1000
    lcd_string('CPU-Speed: {} MHz'.format(cpu_speed_mhz))
    ...

    Aber, im Ernst: was du machst ist stark fragwürdig. Du kopierst mehr oder minder Code zusammen, den du nicht verstehst, _und_ nutzt dazu noch eine veraltete Python-Version.

    Gruß, noisefloor

  • Danke schon mal. Ich habe eben versucht psutil zu installieren (sudo pip install psutil). Das ist dann auch ohne Fehlermeldung durchgelaufen.

    Wenn ich abder dann "import psutil" im Code einfüge, kommt die Fehlermeldung "ImportError: No module named psutil" . Muß das noch irgendwie registriert werden? Das der Code nicht das Gelbe vom Ei ist weiß ich auch. Ich nutze den Pi nur als owncloudserver und der läuft eben 24h. Das Display ist nur ein nettes Gimmick, mehr nicht. Und wenn man drauf schaut ist es egal ob nun die Python-Version veraltet ist oder nicht. Das Ergebnis zählt. Also: wie installiere ich psutil richtig, damit ich es mit meinem Code nutzen kann?

  • Hallo,

    Zitat

    Und wenn man drauf schaut ist es egal ob nun die Python-Version veraltet ist oder nicht.

    Du hast einen Server und darauf läuft veraltet Software, die _keine_ Sicherheitsupdates mehr bekommt. Das ist so ziemlich die schlechteste Kombination, die es gibt - und das ist dir egal?

    Gut, dein Problem. Aber ich bin raus.

    Gruß, noisefloor

  • Der Server ist nur über https und vpn erreichbar. Wie eine veraltete Python-Version, welche nur zum Ansteuern eines Displays genutzt wird, ein Sicherheitsrisiko darstellt verstehe ich nicht. Aber egal. Aber selbst wenn jemand einen Hack versucht. Was hat er dann? Meinen Kalender und mein Adressbuch. Es soll Leute geben, die syncen ihr Daten mit Servern von Google und Apple oder wo auch immer....

    Trotzdem vielen Dank für die Tips, auch wenn... ach egal ich hab auch keinen Bock mehr

  • Aufruf: "python script.py". Steht im crontab @reboot, also autostart. Falls das auch nicht der Norm entspricht, bitte ich um Entschuldigung.

    Code
    cpu_speed = int(get_cpu_speed()) #
    cpu_speed_mhz = cpu_speed/1000000

    Also das Ergebnis meiner Funktion in einen Integerwert umwandeln, und dann durch 1000000 teilen.

    Vielen Dank noch mal :)

  • Ne hier gings mir darum,

    denn wenn der Aufruf mit python3 script.py erfolgt wäre, hätte der Befehl zur Installation mit pip wie folgt lauten müssen:

    pip3 install --user psutil)

    Außerdem ist es Entscheidend, welche Benutzer installiert und welcher Installiert.

    Mit meinem oben gezeigten Befehl steht dann das Modul für den Benutzer pi zur Verfüng, aber nicht für den Benutzer root (also auch Aufrufe mit sudo), hierfür müsste dann auch das Modul gezielt für diesen Benutzer installiert werden.

  • Du hast einen Server und darauf läuft veraltet Software, die _keine_ Sicherheitsupdates mehr bekommt. Das ist so ziemlich die schlechteste Kombination, die es gibt - und das ist dir egal?

    Grundsätzlich magst du ja Recht haben, aber bei isolierten Systemen ist das ziemlich egal.

    Was meinst du, wieviel Kleinst-Kontroller (Server) innerhalb ihrer Lebenszeit (>10 Jahre) NIE ein Update bekommen (Waschmaschine, Kaffeemaschine usw.) und dennoch zuverlässig laufen?

    (ja, da läuft vielleicht kein Python drauf, aber weißt du es genau in jedem Fall??)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!