AlarmSMS.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. # Diese Klasse ist für normales Python mit pySerial
  2. # Sie stellt ein Interface für SIM800 Befehlssätze dar
  3. # 2022-03-02 - devnull - initial
  4. import sys
  5. import io
  6. class SIM:
  7. tty = None
  8. ser = None
  9. pin = None
  10. baud = None
  11. sio = None
  12. devInfo = None
  13. devTemp = None
  14. devSN = None
  15. devProd = None
  16. devRev = None
  17. # wenn keine PIN übergeben, dann brechen wir ab
  18. def __init__(self, tty = None, baud = 115200, pin = None):
  19. # wir brauchen hier noch etwas um zu prüfen und abzubrechen, wenn PIN und TTY nicht gesetzt sind
  20. if (tty is None) or (pin is None):
  21. sys.stderr.write('TTY oder PIN fehlt')
  22. sys.exit(1)
  23. else:
  24. self.setTTY(tty)
  25. self.setBaud(baud)
  26. self.setPIN(pin)
  27. import serial
  28. try:
  29. # Verbindung oeffnen
  30. self.ser = serial.Serial(self.getTTY(), self.getBaud(), timeout=1)
  31. #self.sio = io.TextIOWrapper(io.BufferedRWPair(self.ser, self.ser),newline="\r\n")
  32. self.sio = io.TextIOWrapper(io.BufferedRWPair(self.ser, self.ser))
  33. self.devSetup()
  34. #try:
  35. # self.ser.open()
  36. except serial.SerialException as e:
  37. sys.stderr.write('Could not open serial port {}: {}\n'.format(self.getTTY(), e))
  38. sys.exit(1)
  39. # sammle Modem Informationen
  40. self.devInfo()
  41. self.devProd()
  42. self.devRev()
  43. self.devSN()
  44. self.devTemp()
  45. # PIN Übergabe
  46. self.sendPIN(pin)
  47. print("DEBUG:")
  48. print(" " + self.devInfo)
  49. print(" " + self.devProd)
  50. print(" " + self.devRev)
  51. print(" " + self.devSN)
  52. print(" " + self.devTemp)
  53. # PIN senden
  54. #übermittelt ein AT Command, aber bitte nur eine Zeile als Rückgabewert
  55. def sendAT(self,AT):
  56. self.sio.write(AT + '\n')
  57. self.sio.flush() # it is buffering. required to get the data out *now*
  58. return self.cleanOutput(self.sio.readlines())
  59. # Antwort DICT bereinigen
  60. def cleanOutput(self,output):
  61. # erstmal suchen wir nach einem OK in der Ausgabe
  62. if not 'Error' in output:
  63. # wir entfernen alle OKs
  64. while 'OK\n' in output:
  65. output.remove('OK\n')
  66. # wir entfernen alle \n
  67. while '\n' in output:
  68. output.remove('\n')
  69. else:
  70. return 'ERROR'
  71. if len(output) > 0:
  72. return output[0].replace('\n','')
  73. else:
  74. return ' '
  75. # tty setter
  76. def setTTY(self,tty):
  77. self.tty = tty
  78. # tty getter
  79. def getTTY(self):
  80. return self.tty
  81. # PIN setter/getter
  82. def setPIN(self,pin):
  83. self.pin = pin
  84. def getPIN(self):
  85. return self.pin
  86. # Baud setter/getter
  87. def setBaud(self,baud):
  88. self.baud = baud
  89. def getBaud(self):
  90. return self.baud
  91. # Konfigurationsoptionen für das Modem
  92. def devSetup(self):
  93. self.sendAT('ATE0')
  94. self.sendAT('AT+CRSL=100')
  95. self.sendAT('AT+CSCS="GSM"')
  96. self.sendAT('AT+CMGF=1')
  97. # Temperaturchecks
  98. def devTemp(self):
  99. self.devTemp = self.sendAT('AT+CMTE?').partition(",")[2]
  100. # Informationen vom Modem lesen
  101. def devInfo(self):
  102. self.devInfo = self.sendAT('ATI')
  103. def devProd(self):
  104. self.devProd = self.sendAT('AT+GMM')
  105. def devSN(self):
  106. self.devSN = self.sendAT('AT+GSN')
  107. def devRev(self):
  108. self.devRev = self.sendAT('AT+GMR')
  109. # setzt den PIN auf dem Modem
  110. def sendPIN(self,pin):
  111. if not 'ready' in self.sendAT('AT+CPIN?'):
  112. # PIN fehlt, hier noch eintragen
  113. self.sendAT('AT+CPIN=' + str(pin))
  114. def sendSMS(self,number,text):
  115. self.sendAT('AT+CMGS="'+ str(number) + '"\n' + str(text) + '\x1A')
  116. #print (ser.out_waiting)
  117. mdm = SIM('/dev/ttyUSB1', 115200, 2389)
  118. mdm.sendSMS("017643609376", "neue Testnachricht")