Seite 1 von 1
Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 07:39
von LotharK
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()
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 08:11
von __deets__
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.
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 09:12
von Sirius3
@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.
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 09:26
von LotharK
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.
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 09:36
von __deets__
Die Webseite von pigpio hat eine Beispielsektion. Gleiches gilt für gpiozero. Da kannst du ruhig noch mal die Suchmaschine anwerfen.
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 09:38
von narpfel
@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.
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 10:41
von LotharK
@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
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 11:40
von __deets__
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 13:26
von LotharK
@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
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 14:40
von noisefloor
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
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 15:18
von LotharK
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
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Dienstag 21. November 2017, 16:43
von __deets__
Und das GPIO setup *nach* dem PING zu machen? Wurde ja schon mehrfach angeregt.
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Mittwoch 22. November 2017, 13:13
von noisefloor
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
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Mittwoch 22. November 2017, 20:24
von LotharK
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
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Mittwoch 22. November 2017, 20:53
von noisefloor
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
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Mittwoch 22. November 2017, 21:10
von LotharK
hm,
ja aber was ist nun die Lösung?
Re: Nach PING senden funktionieren Interrupts nicht mehr
Verfasst: Mittwoch 22. November 2017, 23:25
von __deets__
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
Viel Erfolg beim weiteren rumstümpern...