GPIO modul erben funktioniert nicht

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

    Ich probierte diesen Code auszufüren:

    Python
    from RPi import GPIO
    
    
    class GPIO(GPIO):
        pass#hier definiere ich noch einige weitere Funktionen. und Variablen.

    So habe ich alle GPIO Sachen kompackt in einer Klasse. (dachte ich. :@ :helpnew: )
    Als
    Error:
    Traceback (most recent call last):
    File "/home/pi/GPIO1.py", line 7, in <module>
    class GPIO(GPIO):
    TypeError: module.__init__() takes at most 2 arguments (3 given)


    Ich hab bereits in die Datei GPIO.__file__ also '/usr/lib/python3/dist-packages/RPi/GPIO/__init__.py', was dann hier rauf verweist: '/usr/lib/python3/dist-packages/RPi/_GPIO.cpython-34m-arm-linux-gnueabihf.so'Dort wird jedoch noch nicht mal eine Klasse definiert.
    Die ist jedoch nicht lesbar.
    :wallbash:

    Ok also ist es eine Klasse?
    wieso wird __init__ beim erben ausgeführt?
    welches modul ist mit "modul" gemeint?

    über meinen Pi:
    RaspberryPi 3
    Raspbian 8 jessie (nicht die allerneuste neuste version, da dort 1-Wire und Camera nicht zusammen genutzt werden können - oder wurde das gelöst?)

  • GPIO ist der Modulname. Das ganze Modul ist in C/C++ geschrieben.

    Einfacher ist es, wenn du dir das gpiozero Modul installierst/verwendest.
    https://gpiozero.readthedocs.io/en/stable/
    Dann sähe eine Klasse für zB Buttons so aus:

    Python
    from gpiozero import Button
    
    
    class MyButtonClass(Button):
        def __init__(self, pin):
            #usw
  • bootsmann: ja genau, wobei ich dann doch eher meine eigene Klasse mache, da mein vorhaben ziemlich speziell ist und ich trotz dem gpiozero modul ich eine weitere eigene Klasse definieren müsste
    raspiprojekt: wie ich die GPIOs bediene mit Python ist mir schon klar nur hab ich da ein ziemlich großes Projekt, weshalb ich einzelne Sachen wie GPIOs in eine eigene Datei stecken will.
    In der eigenen GPIO Klasse wollte ich im
    __init__: RPi.GPIO.setmode(..), Daten wie welcher GPIO der Bewegungsmelder ist, etc.
    __exit__:RPi.GPIO.cleanup()
    weitere Funktionen wie: starte_Überwachung
    ...
    definieren. Wenn diese gleich auch noch die RPi.GPIO Funktionen bekommt, die ich sowieso auch brauche, wäre dies natürlich sehr gut und übersichtlicher gewesen.

    Ok also das mit dem Erben geht nicht, Ich mache dafür eine eigene getrennte Klasse.
    Vielen Dankundefined

  • Zitat von &quot;bootsmann&quot; pid='291273' dateline='1500302723'


    raspiprojekt
    Es geht ja um dieses Modul.
    Was aber sein Fehler ist, ist, dass eine Klasse nicht von einem Modul erben kann sondern eben nur von einer anderen Klasse...

    Deswegen importiert man ja auch aus dem Modul eine Klasse und vererbt dann. Ich hatte vielleicht zu kurz geschrieben. Der Ansatz das komplette Modul zu importieren ist in dem Fall schon nicht richtig.

  • Zitat von &quot;raspiprojekt&quot; pid='291277' dateline='1500308596'

    Deswegen importiert man ja auch aus dem Modul eine Klasse und vererbt dann. Ich hatte vielleicht zu kurz geschrieben. Der Ansatz das komplette Modul zu importieren ist in dem Fall schon nicht richtig.

    Hä also hat das RPi modul doch irgendwo eine Klasse?
    Wo denn wie heißt sie?
    Auf der Seite, die du verlinkt hast, sind ja nur Funktionen des GPIO Modul aufgelistet also keine Klasse

    @meigraft letztendlich ein Überwachungssystem mit Bewegungsensor, Mailversendung (sowohl Bilder, als auch Videos), YouTube upload, Licht automatisch anschalten (im eigenen GPIO-modul), und noch ein paar andere Sachen.
    Also recht viel. Zur Übersicht würde ich die GPIO-Sachen, Die Aufnahme, Den Upload,... in getrennten Klassen/Dateien haben. Aber auch ungern zusammen gehörende Dinge (GPIO) trennen.

  • Und was war dann mit Klasse hier gemeint?

    Zitat von &quot;raspiprojekt&quot; pid='291277' dateline='1500308596'

    Deswegen importiert man ja auch aus dem Modul eine Klasse und vererbt dann. Ich hatte vielleicht zu kurz geschrieben. Der Ansatz das komplette Modul zu importieren ist in dem Fall schon nicht richtig.

    Das was du gerade sagtest dachte ich ja auch. Das wundert mich eben.

    mit "Versuchs mal hiernach: https://sourceforge.net/p/raspberry-gpio...asicUsage/"
    sagt er ja eindeutig, das es doch geht.


    Also: raspiprojekt: was meintest du damit geht es oder nicht?

  • Zitat von &quot;Eine Person&quot; pid='291355' dateline='1500380629'


    Und was war dann mit Klasse hier gemeint?

    Nichts ist damit gemeint. Ein Schnellschuss mehr nicht...

    Nochmals: ``GPIO`` ist der Modulname, welcher global in den Namensraum geladen wurde. Wenn du eine Klasse (warum auch immer) bauen willst, dann kannst du innerhalb einer Klasse mittels ``GPIO.setup()`` etc. auf die Funktionen des Moduls referenzieren.
    zB:

    Python
    from Rpi import GPIO
    
    
    
    
    class MyClass(object):
        def __init__(self, pin):
        GPIO.setup(pin, GPIO.IN)
  • Mir ist klar wie man das macht ich bin nur an einer besseren Lösung interessiert. Wenn das also deiner Meinung nach nicht funktioniert, habe ich es verstanden. Raspiprojekt hat halt nun mal gesagt, dass man "aus dem Modul eine Klasse" importiert, was mich verwirrte. Mit dieser Art die GPIOs zu benutzen, wie Sie es gesagt haben, arbeite ich schon seit mehr als einem Jahr!

  • Ich frage mich weiterhin, wieso du unbedingt eine eigene Klasse erzeugen willst die das vorhandene RPi.GPIO Module quasi überschreiben soll :s

    Wenn du eine eigene Klasse schreibst um darin dann GPIO's zu schalten und zu verwalten, dann schreib doch lieber ein paar Methoden um die entsprechenden Dinge zu bewerkstelligen, aber lass das "vererben" weg? Also wieso den vorhandenen Namensraum überschreiben?
    Wie bootsmann schon andeutete, würde das viel mehr Sinn machen:
    [code=php]
    from RPi import GPIO


    class MyClass(object):
    def __init__(self, mode, pir_pin):
    self.mode = mode
    self.pir_pin = pir_pin
    GPIO.setmode(mode)

    def init_motion(self):
    GPIO.setup(self.pir_pin, GPIO.IN)


    bla = MyClass(GPIO.BCM, 17)
    bla.init_motion()
    [/php]...etc...

  • Ich will den Namensraum nicht Überschreiben, sondern nur weitere Funktionen hinzufügen, da ich dann die GPIO-Sachen schön kompakt zusammen hab. Da dies jedoch anscheinend nicht geht, habe ich es nun auch genauso gemacht.

Jetzt mitmachen!

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