main.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. # -*- coding: utf-8 -*-
  2. # Alarmgeber MainCode
  3. # 2022-03-06 - devnull - initial
  4. # 2022-03-25 - devnull - JSON Config
  5. # - tcall Objekt
  6. # 2022-04-17 - devnull - Logger Objekt integriert
  7. # 2022-04-27 - devnull - ADC auslesen und auswerten
  8. # - ADC Anbindung an die Klasse tcall weitergereicht
  9. # 2022-04-29 - devnull - Alarmüberwachung eingebaut
  10. import ujson
  11. import sys
  12. from machine import Timer
  13. from machine import ADC
  14. from machine import Pin
  15. # Logging Klasse
  16. from logger import *
  17. # Unsere Klassen für die Steuerung des Boards und des Modems
  18. from tcall import *
  19. from SIM import *
  20. ADCTim=Timer(3)
  21. ADCObj=None
  22. AlarmTimer=0
  23. AlarmSMS=False
  24. # als erstes nach dem starten lesen wir die die config
  25. with open('config.json','r') as cf:
  26. try:
  27. config = ujson.load(cf)
  28. except:
  29. sys.stderr.write("Fehler beim lesen der Config. Bitte die Datei config.json pruefen")
  30. sys.exit(1)
  31. log=logger(debugIn = config['debug'],
  32. verboseIn = config['verbose'],
  33. errorIn = config['error'])
  34. # tcall Objekt initialisieren und Maschinen LED einschalten
  35. tcall = tcall(config['tcall']['MDM_PWR_PIN'],
  36. config['tcall']['MDM_PWRKEY_PIN'],
  37. config['tcall']['MDM_RST_PIN'],
  38. config['tcall']['MLED_PIN'],
  39. logger=log)
  40. tcall.mledblink(2000)
  41. # Modem einschalten
  42. tcall.mdmpwrsw()
  43. # SIM Objekt anlegen und starten
  44. sim = SIM(baud = 115200,
  45. pintx = config['SIM']['MDM_TX_PIN'],
  46. pinrx = config['SIM']['MDM_RX_PIN'],
  47. simpin = config['SIM']['SIMPIN'],
  48. logger=log
  49. )
  50. # Ab hier sollten wir nun beginnen, die Messwerte der Alarmanlage abzufragen
  51. # Die Callback Funktion die vom Timer ausgeführt wird
  52. # dies ist eine Wrapper Funktion die die eigentliche Funktion aufruft
  53. def callbackADC(timer=None):
  54. global ADCObj
  55. global AlarmTimer
  56. global AlarmSMS
  57. messwert=ADCObj.read_u16()
  58. # wir prüfen, ob der AlarmTimer schon überschritten wurde
  59. ## Messwerte der Honeywell HS300S Alarmdauer im Mittel (Sekunden)
  60. ### Panikalarm 148s
  61. ### Alarm 153,6s
  62. ### Scharfschaltung -
  63. ### Freischaltung -
  64. ### Voralarm -
  65. # todo: die Alarm-wartezeit muss ins Config-Objekt ... das brauchen wir hier nicht
  66. if AlarmTimer > config['alarm']['dauer']:
  67. log.verbose('Alarmueberwachung: Alarm erkannt')
  68. ## wenn noch keine SMS gesendet wurde (StateMaschine SMS), dann schicken wir eine
  69. if not AlarmSMS:
  70. log.verbose('Alarmueberwachung: Alarmierung per SMS an ' + str(config['SIM']['ANR']))
  71. ## SMS mit Configwerten versenden -> siehe config.json
  72. sim.sendSMS(config['SIM']['ANR'], config['SIM']['ATXT'])
  73. AlarmSMS = True
  74. # hier kommt der Messwertzähler
  75. ## wenn ein sehr hoher (nahe am Maximum) gemessen wird, dann zählen wir die Sekunden
  76. if messwert > 65500:
  77. log.debug('Alarmueberwachung: Alarmdauer ' + str(AlarmTimer))
  78. AlarmTimer += 1
  79. ## wenn ein niedriger Wert gemessen wird, dann gibt es wohl keinen Alarmton, dann gehen wir runter und setzen den
  80. ## Timer und SNS Versand zurück
  81. elif messwert < 65500:
  82. log.debug('Alarmueberwachung: AlarmTimer zurueckgesetzt, AlarmSMS zurueckgesetzt')
  83. AlarmTimer = 0
  84. AlarmSMS = False
  85. # hier registrieren wir die Abfrage am ADC
  86. log.debug("Alarmueberwachung: ADC Anbindung an Pin " + str(config['alarm']['pin1']))
  87. ADCObj=ADC(Pin(config['alarm']['pin1']),atten=ADC.ATTN_11DB)
  88. # hier starten wir den notwendigen Timer zur Überwachung
  89. log.debug("Alarmueberwachung: Timer gestartet")
  90. ADCTim.init(period=1000, callback=callbackADC)
  91. # todo: Implementierung der ADC Abfragen
  92. # #todo: Abfrage Callback erstellen
  93. # INPUT Callback Funktion
  94. # GPIO4
  95. #def INcheckCallback(t):
  96. # p4 = Pin(4, Pin.IN, Pin.PULL_UP) # create input pin on GPIO4 aber Bitte PullUP, weil das hier ja ein Taster ist
  97. #print("Taster = " + str(p4.value())) # get value, 0 or 1
  98. #print("SIM is on TTY: " + str(sim.getTTY()))
  99. #sim.sendSMS(znr, atxt)
  100. #adc=ADC(Pin(34),atten=ADC.ATTN_11DB)
  101. # #todo: Abfrage Timer starten
  102. # das ist der Timer zur Tasterabfrage (in Klammern die ID)
  103. #tim = Timer(1)
  104. # periodic with 100ms period
  105. #tim.init(period=500, callback=INcheckCallback)