Testen von Raspberry Pi-Skripten auf einem PC

7

Ich schreibe ein Raspberry Pi-Programm, um Dinge auszuführen, Eingaben von Sensoren zu übernehmen, in einer Datenbank zu speichern und mit einem Server zu synchronisieren.

Gibt es eine Möglichkeit, es auf dem PC zu testen, bevor es auf dem Raspberry Pi bereitgestellt wird? Da es zu viele GPIO-Vorgänge gibt, möchte ich sicherstellen, dass es funktioniert, bevor ich es auf den Raspberry Pi lege. Eine Art GPIO-Emulator oder so. Ich bin auf Manjaro Linux .

Es muss kein Emulator sein, eine Art IDE, die GPIO-Funktionen verstehen kann. Eine mögliche Ausgabe wäre beispielsweise:

gpio 1 is running,
sensor 1 is running
sensor 2 isn't running

So etwas, vielleicht ein Bpython-Plugin oder so. Ich möchte nur sicherstellen, dass alle meine GPIO-Funktionen so funktionieren, wie ich sie haben möchte, bevor ich sie auf dem Raspberry Pi teste, da Fehler auf dem Raspberry Pi oft damit zusammenhängen, dass ich Teile nicht richtig verbinde. Und ich mag es nicht, Fehler auf dem Raspberry Pi zu codieren und zu beheben.

Wenn ich also überprüfen kann, ob mein Skript auf meinem PC ordnungsgemäß funktioniert, kann ich zum Raspberry Pi gehen, da ich weiß, dass mein Skript in Ordnung ist, und Probleme auf der Platine beheben. Ich möchte mein Skript einfach nicht mehr auf dem Raspberry Pi testen.

Lynob
quelle
Ein anderer Ansatz könnte darin bestehen, "sshfs" zu verwenden, um Ihr Himbeer-Pi-Home-Verzeichnis auf Ihrem PC zu mounten. Sie können dann alles verwenden, was Sie möchten, um Ihren Code mit Ihren Dateien auf dem Pi zu schreiben, und dann eine SSH-Shell auf dem Pi haben, in der Sie den Code tatsächlich ausführen. Da dies über eine SSH-Verbindung geschieht, ist die Geschwindigkeit begrenzt, aber es kann für Sie gut funktionieren.
Thorbjørn Ravn Andersen

Antworten:

6

Mir ist keine fertige Lösung für Ihre Anforderungen bekannt.

Sie können jedoch mit wenig Aufwand Ihre eigenen schreiben. Wie viele verschiedene Aufrufe tätigen Sie an die GPIO-Funktionen? Möglicherweise verwenden Sie weniger als 10. Erstellen Sie einfach Ihr eigenes lokales Python-Modul mit dem gleichen Namen wie Ihr Zielmodul und erstellen Sie Stubs für die von Ihnen verwendeten Funktionen.

Wenn Sie beispielsweise die Funktion gpio_write () verwenden, die ein gpio und ein Level benötigt, könnte Ihr Stub nur sein

def gpio_write(gpio, level):
   print("gpio_write called with gpio={} level={}".format(gpio, level))

Ihr gpio_read-Stub könnte sein

def gpio_read(gpio):
   global val
   print("gpio_read called with gpio={}, returning {}".format(gpio, val))
   return val # where val may be read from a file or set externally

Dies ist eine ziemlich übliche Praxis, die lange Zeit in der Softwareentwicklung verwendet wurde, um Software zu testen, bevor Hardware verfügbar ist.

Mein pigpio Python- Modul läuft übrigens auf Windows / Mac / Linux-PCs.

joan
quelle
Ihr Modul läuft unter Linux, gibt aber keinen Fehler aus, wenn es keine GPios wie die Standard-GPIO-Bibliothek findet? Ich benutze Ihr Modul übrigens
Lynob
Mein Modul gibt Fehler aus, wenn es nicht an den Pi angeschlossen wurde. Es benötigt einen vernetzten Pi, auf dem der Pigpio-Daemon ausgeführt wird, um verfügbar zu sein, wenn das Skript ausgeführt wird. Sie müssten also immer noch Stubs verwenden, wenn kein Pi im Netzwerk verfügbar wäre. Sie können jedoch Skripte auf Ihrem PC und nicht auf dem Raspberry Pi entwickeln und ausführen. Ich machte diesen Vorschlag als Antwort auf "Und ich mag es nicht, Fehler auf pi zu codieren und zu beheben".
Joan
1
ah das ist schön !!!
Lynob
Kann ich Ihr Modul mit pip installieren?
Lynob
@Lynob Soweit mir bekannt ist.
Joan
4

GPIO Zero bietet eine Mock-Pin- Schnittstelle, sodass Sie denselben Code auf Ihrem PC ausführen und die Pins emulieren können. Sehen Sie sich Beispiele für die Verwendung in der Testsuite an .

ben_nuttall
quelle
Heutzutage ist es sinnvoll, Ihre Antwort als die beste zu markieren, aber dies ist eine alte Frage (mehr als 4 Jahre). Allerdings hat es mir mit dem gleichen Zweifel geholfen, gute Arbeit :)
Fernando Ortega
3

Ich habe diese kleine Bibliothek fedeb95 / pin gemacht , die sich für mich als nützlich erwiesen hat. Es fehlen einige Funktionen, aber wenn es zu Ihnen passt ... hat es bei mir funktioniert.

Bearbeiten: Pin ist ein RPi.GPIO-Wrapper. Anstatt die Methode x von RPi.GPIO aufzurufen, rufen Sie die Methode x von pin auf. Sie können in einer Konfigurationsdatei angeben, ob Ihr Programm im Testmodus ausgeführt wird (wenn Sie zufällige Werte von Pins lesen oder Werte, die Sie mit set_value festgelegt haben) oder auf einer tatsächlichen Himbeere, in der diese Bibliothek einfach die entsprechende RPi.GPIO-Methode aufruft. Es fehlt etwas, aber es ist eine sehr einfache Bibliothek, und jeder kann mir einen Beitrag leisten oder mir sagen, welche Funktion er benötigt, und ich werde versuchen, sie hinzuzufügen

fedeb
quelle
2
Können Sie hier einen kurzen Überblick über die Funktionen geben?
RalfFriedl
Im Grunde ist es ein RPi.GPIO-Wrapper. Anstatt die Methode x pf RPi.GPIO aufzurufen, rufen Sie die Methode x von pin auf. Sie können in einer Konfigurationsdatei angeben, ob Ihr Programm im Testmodus ausgeführt wird (wenn Sie zufällige Werte von Pins lesen oder Werte, die Sie mit set_value festgelegt haben) oder auf einer tatsächlichen Himbeere, in der diese Bibliothek einfach die entsprechende RPi.GPIO-Methode aufruft. Es fehlt etwas, aber es ist eine sehr einfache Bibliothek, und jeder kann mir einen Beitrag leisten oder mir sagen, welche Funktion er benötigt, und ich werde versuchen, sie hinzuzufügen
13.
Sie sollten das in der Antwort bearbeiten.
RalfFriedl
2

Ich nehme an, Sie könnten spöttische Bibliotheken wie Mock verwenden .

Sie werden hauptsächlich für Unit-Tests verwendet, aber ich bin mir sicher, dass es in Ihrem Fall sehr gut funktionieren würde. Und Sie sollten es wahrscheinlich besser versuchen, indem Sie einige Unit-Tests schreiben.

Es ersetzt unterwegs eine vorhandene Klasse, und Sie müssen sich nur das Verhalten selbst schreiben, nach dem Sie suchen. Sie können damit nichts an Ihrer Logik ändern (auch nicht die Importe), aber dennoch die Rückgabewerte erhalten, die Sie vermutlich von einem tatsächlichen Aufruf der API erhalten würden.

BriceP
quelle
2

Als Neuling in Python und dem Pi verstand ich Joans Antwort nicht und brauchte eine einfache (Bot nicht elegant!) Methode, um mein Programm auf dem PC ohne Fehlermeldungen zu testen, die durch fehlende GPIO-Aufrufe verursacht wurden. Ich wähle einfach aus, welche Codeabschnitte ausgeführt werden sollen, indem ich überprüfe, auf welchem ​​Computer ich ausgeführt werde. Ich kann dann einen GPIO-Anruf - wie das Schließen eines Schalters - über die PC-Tastatur auslösen.

#!/usr/bin/python3
import socket
my_PC_host_name = 'Dev'
host_name = socket.gethostname()
if (host_name != my_PC_host_name):  # Only run these lines if we're not on the PC
    import RPi.GPIO as GPIO
    # Set GPIO numbering mode and define the input pin
    GPIO.setmode(GPIO.BOARD)  # Uses the same board numbering as on the board
    GPIO.setup(16, GPIO.IN)  # Set up the pin 16 as input

if (host_name != my_PC_host_name):  # Only run these lines if we're not on the PC
    try:
        while True:
            if GPIO.input(16) == 0:
                print ("Switch is open")
            else:
                print ("Switch is closed")             
    finally:
        GPIO.cleanup()  # Cleanup the GPIO ports before ending          
else:  # We're running on the PC
    try:
        while True:
            c = input('Press "o" then "Enter":')
            if c.upper() == 'O':
                print ("Switch is open")
            else:
                print ("Switch is closed")
    finally:           
        print ("Process completed")
M61Vulcan
quelle