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:
- os.system('lxterminal -e sudo gammu --sendsms TEXT 0049123456789 -text \'Wasser leer.\'')
- 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.
#!/usr/bin/env python3
import os
os.system('sudo killall python3-gammu')
os.system('sudo killall gammu')
os.system('sudo udevadm trigger')
os.system('sudo usb_modeswitch -v 0x12d1 -p 0x14fe -V 0x12d1 -P 0x1442 -M \'55534243000000000000000000000611060000000000000000000000000000\'')
os.system('sudo usb_modeswitch -v 0x12d1 -p 0x1f01 -V 0x12d1 -P 0x1442 -M \'55534243000000000000000000000611060000000000000000000000000000\' ') #die vorigen beiden Zeilen sind nur prophylaktisch, falls mein LTE-Stick einmal ungewollt den Modus wechseln sollte
import gammu
import smbus
import time
address = 0x48 #Sensor Interface
bus = smbus.SMBus(1)
#-----------Gammu initialisieren-------------
connected=False
sm = gammu.StateMachine()
sm.ReadConfig()
while connected== False:
try:
sm.Init()
connected=True
time.sleep(3)
except Exception as e:
print(e)
time.sleep(1)
print("Gammu initializied")
message = {
'Text': 'Wasser ist leer.',
'SMSC': {'Location': 1},
'Number': '0043123456789',}
def senden():
sm.SendSMS(message)
#---------------------------------------------
#senden()
#Wenn ich von hier aus eine Nachricht sende, funktioniert es problemlos
sms_sent=False
active=False
#----------------------Endlosschleife---------
while True:
#------------Sensorwerte auslesen und Durchschnitt ausrechnen-------------------------------------
a=0
values=0
for i in range(0,20):
a=a+1
bus.write_byte(address,0x40)
value = bus.read_byte(address)
values=values+value
time.sleep(0.01)
druck=values/a
if druck>44 and active==False: #Wenn active einmal auf True ist, bleibt es das für immer
active=True
print(druck, value)
#---------------------------------------------------------------------------------------------------
#senden() #hier funktioniert es auch problemlos
#------Wenn Druck unter 44 ist, wenn Druck vorher schon über 44 war und wenn SMS vorher noch nicht geschickt wurde
if druck<44 and sms_sent==False and active==True:
try:
senden() #hier funkioniert es nur zu ca. 50% der Zeit
#os.system('lxterminal -e sudo gammu --sendsms TEXT 0043123456789 -text \'Wasser leer.\'')
#Alternative -> bringt jedoch das gleiche Problem
time.sleep(1)
sms_sent=True #Wenn True, wird die SMS kein zweites Mal mehr gesendet
print("Message sent")
except Exception as e:
print ("Error", e)
time.sleep(5)
#-------------------------------------------------------------------------------------------------------------------
#---------------------------------------------
Alles anzeigen
Liebe Grüße
Klaus