Probleme beim SMS senden mit Python3 Gammu

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

    ich hoffe hier kann mir jemand weiterhelfen.

    Ich habe hier ein relativ einfaches Setup: ein Raspberry Zero W, ein Drucksensor, ein Huawei LTE-Stick mit Sim-Karte (am Stick steht Model: E3372h-320).

    Ziel: Der Raspberry misst den Druck über den Sensor und wenn der Druck einen bestimmten Wert unterschreitet, soll eine SMS geschickt werden via Python3 Gammu.

    Grundsätzlich funktioniert es auch. Aber eben nicht immer. Ich konnte leider nicht rausfinden, wieso manchmal die SMS geschickt wird, und nach einem Neustart und Neuversuch klappts dann wiederum plötzlich nicht mehr. Dann mach ich wieder einen Neustart, und dann klappts wieder. Wenn das Problem auftritt, bleibt das Python Programm in der Konsole einfach hängen an der Stelle wo die SMS geschickt werden soll und es gibt auch keinen Errorcode (obwohl ich einen Error-Handler drin hab).

    Ein paar Infos am Rande:

    • Die Stromversorgung ist ausreichend (5A Netzteil)
    • Das Programm "druckueberwachung.py" startet bei Autostart via LXDE Autostart. Es gibt aber keinen Unterschied wenn ich es manuell starte.
    • Es macht keinen Unterschied, ob ich das Programm mit root starte oder nicht
    • Wenn ich die SMS manuell verschicken möchte im Terminal via "gammu --sendsms" funktioniert es problemlos.
    • Wenn ich beim Ausführen des Programms am Anfang eine Zeile einfüge, die eine SMS verschickt, funkioniert es auch problemlos. Nur in der IF-Abfrage, wo die SMS bei einem gewissen Sensordruck augelöst werden soll, funktioniert nur zu 50% der Zeit. Meistens bleibt das Programm dann einfach stehen.
    • Wenn ich den SMS-Part auskommentiere, läuft das Programm reibungsfrei.
    • Ich kann die SMS via Python auf 2 Varianten senden - bei beiden Varianten gleiches Problem:
      1. os.system('lxterminal -e sudo gammu --sendsms TEXT 0049123456789 -text \'Wasser leer.\'')
      2. sm.SendSMS(message) (Funktion aus der Gammu Library)
    • Der LTE-Stick befindet sich immer im gleichen Modus (welcher bei "lsusb" angezeigt wird), und zwar 12d1:1442

    Code im Anhang.

    EDIT: dei Funktion "senden" kann ich problemlos aufrufen in Zeile 43 und 62 (hier auskommentiert). In Zeile 67 macht es jedoch Probleme. Das Problem tritt nur zufällig auf und ich kann es nicht vorhersagen wann es klappt und wann nicht.


    Liebe Grüße

    Klaus

    22 Mal editiert, zuletzt von haakla (17. Juli 2021 um 23:27)

  • Hallo,

    kannst du den Code bitte direkt ins Forum posten?

    Es gibt dafür im Editor den Button '</>' dann erscheint ein "Fenster", dort kannst du denn ganzen Code einfügen. Das ist für alle hier viel einfacher zu lesen und manch einer will den Code vielleicht testen und kann ihn dadurch einfach kopieren.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Zuerst: stellst du deine Handynummer absichtlich ins Netz?

    Obwohl ich in python absolut unerfahren bin: Stimmen die Leerzeichen in der fraglichen IF Zeile?

    Auch verstehe ich nicht, wie "active" gesetzt wird.

    Das ist nicht meine echte Nummer, das sind nur Random Zahlen (1 bis 9).. hab ich vorher ausgetauscht.


    Zuerst: stellst du deine Handynummer absichtlich ins Netz?

    Obwohl ich in python absolut unerfahren bin: Stimmen die Leerzeichen in der fraglichen IF Zeile?

    Auch verstehe ich nicht, wie "active" gesetzt wird.

    die beiden variablen "active" und "schalter" sind für dieses Problem hier nicht relevant - hätte ich aber vielleicht besser eklären können und ist nicht ganz sauber beschrieben.

    • Variable "active" sorgt dafür, dass wenn es beim erstmaligen Hochfahren zuerst einen Unterdruck gibt, dieser zuerst ignoriert werden. Es muss also zumindest einmal der Druck von "44" überschritten werden, dass er danach beim Unterschreiten einen Alarm auslöst.
    • Variable "schalter" sorgt dafür, dass der Alarm nur einmal ausgelöst wird. EDIT: habe "schalter" umbekannt in "sms_sent", dann ist es selbsterklärend.

    Leerzeichen machen Python nichts aus.

    Das Problem, dass die SMS nicht immer gesendet wird besteht auch wenn ich diese beiden Variablen weglasse.

    2 Mal editiert, zuletzt von haakla (17. Juli 2021 um 23:23) aus folgendem Grund: Ein Beitrag von haakla mit diesem Beitrag zusammengefügt.

  • Hallo,

    kannst du den Code bitte direkt ins Forum posten?

    Es gibt dafür im Editor den Button '</>' dann erscheint ein "Fenster", dort kannst du denn ganzen Code einfügen. Das ist für alle hier viel einfacher zu lesen und manch einer will den Code vielleicht testen und kann ihn dadurch einfach kopieren.

    Grüße

    Dennis

    erledigt :)

  • du hast 2 if.

    Zeile 58 >44 und

    Zeile 64 <44.

    Was passiert bei =44?

    nichts - aber das ist egal und nicht so genau .. der Wert "44" muss sowieso noch angepasst werden. Will das Ding nur mal so zum Laufen bekommen, dass es sauber auslöst indem ich künstlich ein wenig Unterdruck beim Sensor erzeuge

  • Lass dir mal in Zeile 72 den Druck beim print mit ausgeben :

    Code
     print("Message sent" , druck )

    Vielleicht hast du beim testen genau die druck=44 erwischt, wenns nicht funktioniert ?

    nein, dann müsste die Schleife ja weiterlaufen und das IF überspringen und dann hätte es ja in der nächsten Runde der Schleife den Alarm geschlagen, da der Wert weit unter 44 runterging

    Die IF-Schleife funktioniert ja. Wenn ich die SMS-Funktion entferne und stattdessen nur eine Nachricht ausgeben lasse, funktioniert alles wie es soll. Das Prolem ist nur diese SMS Funktion...

    • Offizieller Beitrag

    Hallo haakla,

    willkommen im Forum!

    Bitte sei mir nicht böse, aber ich habe Deinen ersten Beitrag nochmals bearbeitet und das Codehightlighting angepasst, damit der Code besser lesbar ist.


    Btw. http://if-schleife.de/ ;)

    Wenn ich die SMS-Funktion entferne und stattdessen nur eine Nachricht ausgeben lasse, funktioniert alles wie es soll. Das Prolem ist nur diese SMS Funktion...

    Was passiert, bzw. ist die Ausgabe, wenn Du die print("Mit Erklärung was genau hier an dem Punkt passiert") zusätzlich direkt nach dem SMS-Gedöns einfügst, also ohne entfernen?

  • Das Programm bleibt stecken, sobald es eine SMS in Zeile 67 schicken soll.

    D.h. wenn ich danach, also zB in Zeile 68 ein print machen soll, wird dieses nie angezeigt.

    Wenn ich zB in Zeile 66 ein print einfüge, funktioniert dieses ganz normal. Das ist dann aber das letzte Signal das rausgeht.

    Komischerweise kann ich das Programm im Terminal auch nicht mit Ctrl+C abbrechen, sondern muss mit der Maus das Terminal Fenster schließen (also es bleibt tatsächlich "hängen")

    • Offizieller Beitrag

    Dein Skript ist aber auch wirklich schwer lesbar, weil das (mit Verlaub) ganz besch... aus uraltem Zeugs geschrieben oder zusammenkopiert ist.

    Sorry! Ich wüsste da garnicht wo ich anfangen sollte zu meckern. :blush:

  • Hallo,

    wenn ich deinen Code richtig interpretiere, dann startet ab Zeile 49 deine Dauerschleife. Wenn dann 'druck' kleiner 44 ist, 'schalter' nicht wahr ist und 'active' ist wahr, dann wird eine SMS gesendet und danach 'schalter' auf 1 gesetzt. Das heißt für mich, dass die Dauerschleife zwar weiter läuft, aber nie mehr eine SMS gesendet wird, da 'schalter' in der Schleife immer '1' hat.

    Wie soll das gehandhabt werden? Sollte 'schalter' vielleicht wieder auf '0' gesetzt werden, wenn 'druck' größer wie 44 geworden ist?

    Allgemeines:

    'os' ist veraltet und soll nicht mehr verwendet werden. Hierfür gibt es 'subprocess'.

    Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen oder Klassen beschreibt. Das Hauptprogramm wird in einer Funktion, die üblicherweise 'main' heißt, gesteuert.

    Namen definiert man an dieser Stelle im Programm, an der man sie auch verwendet. 'schalter' wird in Zeile 14 definiert und irgendwo bei 60 erst benutzt. Man sollte auch sprechende Namen wählen , die dem Leser sagen um was es geht. 'schalter' ist zum Beispiel ein Schalter und nicht der Status ob eine Sms gesendet wurde.

    Wahrheitswerte werden nicht mit 0 oder 1 festgelegt, sondern mit True oder False.

    Zeile 39 und 40 sind eigentlich nicht nötig oder? Das ganze passiert ja "nachher" in der Schleife.

    Wenn man in einer 'for'-Schleife eine Variable benötigt, die man nicht weiter nutzt, bietet sich '_' an. 'range(0, 20)' ist das selbe wie 'range(20)'.

    'a = a + 1' kann man in Python kürzer schreiben: 'a += 1'. Was ich an der Stelle aber für unnötig halte, da man weis, das 'a' nach der Schleife den Wert 20 haben wird.

    'druck=values/(a)' hier wird keine Klammer benötigt, ebenso wie bei den 'if'-Abfragen.

    Ich habe das mal versucht etwas abzuändern. Ich hatte allerdings auch Probleme sprechende Namen zu wählen :blush: Ich weis auch nicht, ob du die 'kill'-Befehle brauchst, ich habe das einfach mal von dir übernommen. Mein Code hört auf, nach dem eine SMS gesendet wurde. Ich habe zusätzlich noch einen Logger eingebaut, der dir eine Datei nach '/home/pi/' schreibt. Falls es irgendwelche Probleme mit dem senden gibt, hast du den Fehler mal gesichert.

    Zwischenstand und ungetestet:

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Dein Skript ist aber auch wirklich schwer lesbar, weil das (mit Verlaub) ganz besch... aus uraltem Zeugs geschrieben oder zusammenkopiert ist.

    Sorry! Ich wüsste da garnicht wo ich anfangen sollte zu meckern. :blush:

    Hab ein bisschen aufgeräumt - ich weiß, ist schwer lesbar, da das relativ schnell gehen musste.

    Aber was meinst du mit uraltem Zeugs?

    • Offizieller Beitrag

    Aber was meinst du mit uraltem Zeugs?

    Damit meinte ich veraltete Tutorials, die so im Netz rumschwirren, Stichwort os.system usw., aber dazu hat Dennis89 ja schon etwas geschrieben.

  • Beitrag von haakla (18. Juli 2021 um 00:44)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.

Jetzt mitmachen!

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