Pi-Modell-Erkennung

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    mit der `processor()` Methode des `platform` Moduls bekommst du die Info, welche CPU verbaut ist. Mit der `cpu_count()` Methode des `multiprocessing` Moduls bekommst du die Anzahl der Kerne. Was zur Unterscheidung Pi Zero und Pi 3 ja ausreicht. Beide Module sind standardmäßig in Python enthalten.

    Alternativ geht natürlich auch, diverse Infos aus dem `/proc` Verzeichnis auszulesen. Da unter Linux ja alles eine Datei ist, kannst du das ja mit Bordmitteln von Python auslesen.

    Gruß, noisefloor

  • Was genau hast du denn vor?


    Der einzige Weg um das unabhängig zu erkennen, den ich spontan kenne, wäre durch auslesen der sysfs Datei /proc/cpuinfo und dann anhand der "Revision" Zeile zu ermitteln um welches Model es sich handelt... Das müsstest du dann aber selber einpflegen.
    "Revision" aus /proc/cpuinfo bezieht sich auf die Hardware Revision, nicht auf die RaspberryPi Revision.

    Beispiel:

    In der Datei steht bei mir folgendes drin:

    Mithilfe folgendes Python Scripts bzw Funktion kann man diese Informationen auslesen: https://github.com/meigrafd/Sampl…ster/cpuinfo.py
    Sollte selbsterklärend sein: Die Datei wird Zeile für Zeile verarbeitet und anhand ":" gesplittet.
    Die Rückgabe der Funktion getCPUinfo() wird in eine eigene Variable "cpuInfo" hinterlegt, über die man dann den entsprechenden Wert abrufen kann.. So würde zum Beispiel cpuInfo['Serial'] das beinhalten: 00000000b751890d

    Wie gesagt unterscheidet man die RaspberryPi Modelle anhand dieser HW-Revision. Eine Übersicht dazu findest du hier: http://elinux.org/RPi_HardwareHistory#Which_Pi_have_I_got.3F
    In meinem Fall wäre es also: Q1 2015, 2 Model B, 1.1, 1 GB, (Mfg by Sony)
    ...aber wie du vielleicht selber siehst steht bei mir noch eine "3" am Anfang der Revision... Tja, noch eine Schwierigkeit :fies: Seit dem Pi2 hat sich das Encoding der Revision geändert.... Siehe dazu https://github.com/AndrewFromMelb…i-2--model-zero

    Wenn du das nun universell umsetzen möchtest müsstest du also die gesamte Tabelle in dein Python Script einpflegen.
    Nachteil: Kommt später ein neuer Pi raus wird der von deinem Script nicht erkannt. Abhilfe hierfür könnte nur sein dass dein Script die elinux.org Seite parsed und sich die nötigen Infos raus fischt, dafür müsste der Client dann aber Online sein... Viel Aufwand.


    Eine weitere Möglichkeit bzgl. GPIO besteht darin das "RPi.GPIO" Module zu verwenden, was bei Raspbian (noch) standardmäßig installiert ist.
    Beispiel:


    Über den von wiringpi kommende Konsolen Befehl gpio -v kann das Model ebenfalls ermittelt werden:

  • Quote from "meigrafd" pid='298844' dateline='1504865296'


    Mit zumindest Raspbian besteht auch die Möglichkeit die sysfs Datei /proc/device-tree/model auszulesen, wo der Kernel genau rein schreibt um welchen Pi es sich dabei handelt - allerdings ist das wie gesagt vom Kernel abhängig und ggf funktioniert das mit anderen Betriebssystemen nicht.
    Bei mir steht da zB das folgende drin:

    Code
    Raspberry Pi 2 Model B Rev 1.1

    Das ist es! Simple und eindeutig. Da auf allen relevanten Gerätschaften Raspbian läuft, ist das genau meine Lösung. Vielen Dank!!

  • Wenn du das nun universell umsetzen möchtest müsstest du also die gesamte Tabelle in dein Python Script einpflegen.
    Nachteil: Kommt später ein neuer Pi raus wird der von deinem Script nicht erkannt. Abhilfe hierfür könnte nur sein dass dein Script die elinux.org Seite parsed und sich die nötigen Infos raus fischt, dafür müsste der Client dann aber Online sein... Viel Aufwand.

    Wenn man externe Daten für Skript mit lokalen Daten nutzt - ja, das ist Aufwand.

    Wenn man schon online ist, dann geht das ziemlich einfach (habe die Revision meines Zero2W 902120 genommen):

    Code
    lynx -dump http://elinux.org/RPi_HardwareHistory#Which_Pi_have_I_got.3F | grep 902120
      902120 Q4 2021 Zero 2 W 1.0 512 MB (Mfg by Sony)

    Danke für den Link.

    Wenns ner net G'wittern tun tut.

  • Das ist ja noch besser (hätte mal bis an den Anfang der Ausgabe scrollen sollen) und informativer.
    Danke.

    Eine Ausgabe irritiert mich allerdings:

    Storage            : MicroSD

    Er bootet direkt von USB-SSD, hat aber eine leere SD-Karte im Schacht (sozusagen Staubschutz). Oder interpretiere ich nur MicroSD falsch?


    Edit:

    Code
    ~ $ lsblk
    NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
    sda           8:0    0 223.6G  0 disk 
    ├─sda1        8:1    0   512M  0 part /boot/firmware
    └─sda2        8:2    0 223.1G  0 part /
    mmcblk0     179:0    0   1.9G  0 disk 
    └─mmcblk0p1 179:1    0   1.9G  0 part

    Wenns ner net G'wittern tun tut.

  • Das würde auf dem Rechner von Bergwichtel folgendes ausspucken (die eigentlichen Pinout-Infos ausgenommen):

    Wobei man wenn man das in einem lokalen Programm machen möchte, ja nur die relativ kurze und feste Old-style revision codes-Tabelle einpflegen muss und dann die Informationen aus der New-style revision codes-Tabelle was die einzelnen Bitgruppen in der Revision bedeuten. Und ab da braucht man dann ja nur noch nachzupflegen wenn sich da Kleinigkeiten ändern.

    Und falls es ein Python-Programm ist, und gpiozero als Abhängigkeit okay ist, kann man die entsprechenden Informationen einfach mit dem Modul ermitteln. Dann kümmern sich andere um das pflegen der Tabellen in dem Code. 😉

    “Since, in the long run, every planetary society will be endangered by impacts from space, every surviving civilization is obliged to become spacefaring — not because of exploratory or romantic zeal, but for the most practical reason imaginable: staying alive.” — Carl Sagan, Pale Blue Dot

  • Bergwichtel  hyle Ich denke ihr denkt beide zu kompliziert: Die Information sagt was da verbaut ist. Bei den Modellen "A" und "B" ist das "SD", bei den "CM*"-Modulen entweder "eMMC" oder "eMMC / off-board" und sonst bei allen anderen "MicroSD". Das war's an Möglichkeiten und da wird auch nichts dynamisch ermittelt über das Modell hinaus. Die entsprechende Stelle im Quelltext sieht so aus:

    Python
                storage = {
                    'A':    'SD',
                    'B':    'SD',
                    'CM':   'eMMC',
                    'CM3':  'eMMC / off-board',
                    'CM3+': 'eMMC / off-board',
                    'CM4':  'eMMC / off-board',
                    }.get(model, 'MicroSD')

    “Since, in the long run, every planetary society will be endangered by impacts from space, every surviving civilization is obliged to become spacefaring — not because of exploratory or romantic zeal, but for the most practical reason imaginable: staying alive.” — Carl Sagan, Pale Blue Dot

  • Aber ob das Herrn Kaiser heute nach über 6 Jahren noch hilft und ob er überhaupt noch einen Pi nutzt ??

    ;) Gruß Outi :D
    Pis: 2x Pi B, 1x Pi B+, 1x Pi 2 B in Rente / 2x Pi 3 B (RaspberryMatic / Repetier Server) / 2x Pi Zero 1.2 / 2x Pi Zero 1.3 / 2x Pi Zero W 1.1 / 1x Pi Zero 2 (BW+CUPS/SANE) / 1x Pi 3 B+ (Tests) / 1x Pi 4 B 4GB (Tests) / Pi 400 (BW) / 1x Pi 5 8GB (BW) / 2x Pi Pico / 2x Pi Pico W
    HATs: Sense HAT / HM-MOD-RPI-PCB / RPI-RF-MOD / PiFi DAC+ V2.0 / TV HAT / Pi 5 Kühler HAT / Pimoroni NVMe BASE
    Cams: orig. Raspberry Pi Camera Module V1 & V3 / PS3 Eye

  • Ok aber sonst gibts immer Haue wegen "Leichen aus dem Keller holen".
    Dachte, dass man da nen neuen Fred öffnet, da der alte Kram evtl. eh übrholt wäre.

    ;) Gruß Outi :D
    Pis: 2x Pi B, 1x Pi B+, 1x Pi 2 B in Rente / 2x Pi 3 B (RaspberryMatic / Repetier Server) / 2x Pi Zero 1.2 / 2x Pi Zero 1.3 / 2x Pi Zero W 1.1 / 1x Pi Zero 2 (BW+CUPS/SANE) / 1x Pi 3 B+ (Tests) / 1x Pi 4 B 4GB (Tests) / Pi 400 (BW) / 1x Pi 5 8GB (BW) / 2x Pi Pico / 2x Pi Pico W
    HATs: Sense HAT / HM-MOD-RPI-PCB / RPI-RF-MOD / PiFi DAC+ V2.0 / TV HAT / Pi 5 Kühler HAT / Pimoroni NVMe BASE
    Cams: orig. Raspberry Pi Camera Module V1 & V3 / PS3 Eye

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!