Nach PING senden funktionieren Interrupts nicht mehr

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Hallo,

Ich habe folgendes Problem. Ein im Netzwerk befindlicher Pi soll beim Start kontrollieren, ob das Netzwerk bereit ist. Dazu pinge ich einen Server an.
Wenn der Ping OK, wartet das Programm auf Eingaben ab deb GPIOs und soll einen Interrupt auslösen. In der Entwicklung Unter Python 2 funktioniert alles prima.
Starte ich das Programm von der Konsole mittels: /usr/bin/python /home/pi/test.py wird die IP korrekt erkannt. Das Programm reagiert aber nicht mehr auf Interrupts.
Nehme ich die Zeile mit dem Ping raus, funktionieren die Interrupts.
Hier mal ein stark gekürzter Code zur Verdeutlichung meines Problems. Sicher ist es etwas triviales, was ich übersehe.
Danke schon mal für's Lesen.

MfG LotharK

Code: Alles auswählen

#!/usr/bin/env python
#coding: utf-8
from __future__ import absolute_import, division, print_function
import time
import RPi.GPIO as IO
import os.path


TRANS1=17 # Transponderlesegeraet an GPIO17
TRANS2=4  # Transponderlesegeraet an GPIO4

IO.setmode (IO.BCM)

IO.setwarnings(False)

IO.setup(TRANS1,IO.IN)
IO.setup(TRANS2,IO.IN)

def INT_TRANS1(channel):
    print('Interrupt1 ausgeloest')
    
def INT_TRANS2(channel):
    print('Interrupt2 ausgeloest')

def PruefeNetz():
    IPx = os.system("ping -c 1 -w 1 192.168.25.27 >/dev/null")
    if IPx==0:
      print ("Die IP wirde erkannt")
    return 


IO.add_event_detect(TRANS1, IO.FALLING, callback=INT_TRANS1, bouncetime=300)
IO.add_event_detect(TRANS2, IO.FALLING, callback=INT_TRANS2, bouncetime=300)

# ****************  Programmbeginn Hauptschleife
def main():
     print ('Programm gestartet...')
     
     IP=PruefeNetz()

     while True:
        time.sleep(2)
      
     
if __name__ == '__main__':

   main()

__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zeigt auch diese gekürzte Version das Problem? Einen offensichtlichen Fehler kann ich nicht erkennen. Aber RPI.GPIO ist definitiv die schlechteste aller Wahlmöglichkeiten. Ich würde PIGPIO verwenden, oder gpiozero, und schauen, ab das Problem immer noch besteht.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@LotharK: Was passiert denn, wenn Du die Interrupts erst nach dem ping initialisierst? Zur Form: außer Konstanten schreibt man alles klein_mit_unterstricht. Eingerückt wird immer mit 4 Leerzeichen pro Ebene. os.system sollte man durch subprocess.check_call ersetzen. Die Prüfung macht an sich keinen Sinn, denn ob im Moment des Pings eine bestimmte Adresse erreichbar ist oder nicht, sagt nichts darüber aus, ob das einen Augenblick später immer noch so ist. Der GPIO-Initialisierungscode sollte auch noch in eine Funktion wandern.
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Hallo,

Ja, das Problem tritt genau bei dem geposteten Code auf. Ich habe schon mal ne zeit gegoogelt. Leider habe ich noch kein Beispiel gefunden, wo PIGPIO verwendet und richtig beschrieben wird. Ich finde immer nur das so, wie ich es auch verwende.

Danke erst mal für Deine Hilfe.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Webseite von pigpio hat eine Beispielsektion. Gleiches gilt für gpiozero. Da kannst du ruhig noch mal die Suchmaschine anwerfen.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@LotharK: Wenn die IP-Adresse immer da ist und das Script nur warten soll, bis die Netzwerkverbindung eingerichtet ist, würde ich es über eine systemd-Unit starten, die von `network-online.target` abhängt.
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

@Sirius3
Den Ping muss ich von Zeit zu Zeit senden um zu prüfen, ob noch die Server laufen. Der genaue Zusammenhang ist ja hier auch egal. Ich suche eine Möglichkeit, diese Prüfung durchzuführen und Interrupts zu kontrollieren. Die Webseite von pigpio werde ich mir mal ansehen.
Trotzdem erstaunlich, dass es in der Shell funktioniert und in der Konsole nicht.

MfG Lothar
PS.: Hat vielleicht jemand ein kleines Beispiel? Ich bin nämlich nicht der Python-Profi und über jede Hilfe dankbar
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

@LotharK: Außer Konstanten schreibt man alles klein_mit_unterstricht. Eingerückt wird immer mit 4 Leerzeichen pro Ebene. os.system sollte man durch subprocess.check_call ersetzen. Die Prüfung macht an sich keinen Sinn, denn ob im Moment des Pings eine bestimmte Adresse erreichbar ist oder nicht, sagt nichts darüber aus, ob das einen Augenblick später immer noch so ist. Der GPIO-Initialisierungscode sollte auch noch in eine Funktion wandern.
Hm,
und dass soll wirklich den Fehler beseitigen? Mich wundert, dass hier beurteit wird, ob der Ping Sinn mach oder nicht. Zumal ich schrieb, dass das nur ein Programmbeispiel zum Verdeutlichen ist.
Ich habe jetzt auf den Servern jeweils ein Verzeichnis gemountet, welches ich auf Gültigkeit überprüfe. In der Zwischenzeit habe ich den Code auch auf 2 anderen Pi's getestet. Das Ergebnis ist das gleiche. Mich interessiert vor allem, warum es in der Python-SHELL funktioniert und von der Console aus nicht. (auch nicht als root)
Gruß Lothar
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
und dass soll wirklich den Fehler beseitigen? Mich wundert, dass hier beurteit wird, ob der Ping Sinn mach oder nicht. Zumal ich schrieb, dass das nur ein Programmbeispiel zum Verdeutlichen ist.
Das ist nun mal der Seiteneffekt, wenn man in einem Forum mit kompetentem Support eine Frage postet, dann bekommst du auch Kommentaren zur Codequalität und zur (möglichen) Sinnhaftigkeit deines Anliegens.

Die Antwort auf die Frage "Was passiert denn, wenn Du die Interrupts erst nach dem ping initialisierst?" steht noch aus. Das wäre aktuell auch meine (einzige) Idee.

Gruß, noisefloor
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Hallo,

Die Interrupts funktionieren solange, bis ich die IP abfragen lasse. Ich habe dazu das Programm mal umgestrickt. Sobald der Ping gesendet wird, ist's aus. Ist mir schleierhaft. Wie gesagt - nur im Konsolenaufruf.

Gruß Lothar
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und das GPIO setup *nach* dem PING zu machen? Wurde ja schon mehrfach angeregt.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

FYI - die gleiche Frage gibt's jetzt auch im deutschen Raspi-Forum: https://forum-raspberrypi.de/forum/thre ... icht-mehr/

In Post #5 wird gesagt, dass der Fehler mit gpiozero (statt RPi.GPIO) wohl nicht auftritt...

Gruß, noisefloor
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Hallo noiceflor,

Richtig, ich habe die Frage noch mal in einem anderen Forum gestellt. Dort erfolgreich.
Ich hatte die Frage gestellt, warum der Interrupt nach einem Ping nicht mehr funktioniert. Hier wurde wirklich mit großer Anstrengung versucht, das Problem mit anderen Mitteln zu umgehen. Das Paradoxeste war. Ich solle richtig formatieren und mich an die Schreibkonventionen halten.
Ja, das ist ein echtes Problem!!!
Leider konnte mir aber niemand die Antwort geben.
Noch mal - Die Frage lautete - warum funktioniert der Interrupt nicht nach dem Ping.
Ok, manche werden sich jetzt sagen, Oh - ich kann den Code richtig formatieren - aber sorry, Deine Frage beantworten kann ich nicht, :-)

Ich weiß, ihr werdet mich jetzt hassen und es wird eine Flut an Threads hageln, wie undankbar ich bin. 'Ich entschuldige mich für mein Tun!

Viele Grüße an alle, die meinen Sarkasmus verstanden haben.

LotharK
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
. Hier wurde wirklich mit großer Anstrengung versucht, das Problem mit anderen Mitteln zu umgehen
Falsch. Hier wurde bis dato in der Tat dein Problem nicht gelöst (streng genommen im Raspi-Forum auch nicht, da wird bis jetzt "nur" behauptet, das gpiozero eine Lösung ist), aber dir wurden hier Tipps gegeben, wie du als Python-Programmierer besser werden kannst. Die Tipps kannst du annehmen oder nicht, deine Sache. Aber sich darüber zu beschweren, dass dir Leute helfen wollen, besser zu werden, ist echt daneben...

Jedenfalls kannst du fest davon ausgehen, dass du die Tipps hier immer wieder bekommst, wenn du Code in dem Stil postest wie im Eingangsposting. Wird dir im Raspi-Forum übrigens auch passieren, nur vielleicht nicht so schnell wie hier...

Gruß, noisefloor
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

hm,

ja aber was ist nun die Lösung?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dir wurden bereits mehrere Ansätze zur Lösung genannt, die du bis dato geflissentlichst ignoriert hast. Sich zu echauffieren über andere, aber selber keinen Finger krumm machen :lol:

Viel Erfolg beim weiteren rumstümpern...
Antworten