# -*- coding: utf-8 -*- # Alarmgeber MainCode # 2022-03-06 - devnull - initial # 2022-03-25 - devnull - JSON Config # - tcall Objekt # 2022-04-17 - devnull - Logger Objekt integriert # 2022-04-27 - devnull - ADC auslesen und auswerten # - ADC Anbindung an die Klasse tcall weitergereicht # 2022-04-29 - devnull - Alarmüberwachung eingebaut import ujson import sys from machine import Timer from machine import ADC from machine import Pin # Logging Klasse from logger import * # Unsere Klassen für die Steuerung des Boards und des Modems from tcall import * from SIM import * ADCTim=Timer(3) ADCObj=None AlarmTimer=0 AlarmSMS=False # als erstes nach dem starten lesen wir die die config with open('config.json','r') as cf: try: config = ujson.load(cf) except: sys.stderr.write("Fehler beim lesen der Config. Bitte die Datei config.json pruefen") sys.exit(1) log=logger(debugIn = config['debug'], verboseIn = config['verbose'], errorIn = config['error']) # tcall Objekt initialisieren und Maschinen LED einschalten tcall = tcall(config['tcall']['MDM_PWR_PIN'], config['tcall']['MDM_PWRKEY_PIN'], config['tcall']['MDM_RST_PIN'], config['tcall']['MLED_PIN'], logger=log) tcall.mledblink(2000) # Modem einschalten tcall.mdmpwrsw() # SIM Objekt anlegen und starten sim = SIM(baud = 115200, pintx = config['SIM']['MDM_TX_PIN'], pinrx = config['SIM']['MDM_RX_PIN'], simpin = config['SIM']['SIMPIN'], logger=log ) # Ab hier sollten wir nun beginnen, die Messwerte der Alarmanlage abzufragen # Die Callback Funktion die vom Timer ausgeführt wird # dies ist eine Wrapper Funktion die die eigentliche Funktion aufruft def callbackADC(timer=None): global ADCObj global AlarmTimer global AlarmSMS messwert=ADCObj.read_u16() # wir prüfen, ob der AlarmTimer schon überschritten wurde ## Messwerte der Honeywell HS300S Alarmdauer im Mittel (Sekunden) ### Panikalarm 148s ### Alarm 153,6s ### Scharfschaltung - ### Freischaltung - ### Voralarm - # todo: die Alarm-wartezeit muss ins Config-Objekt ... das brauchen wir hier nicht if AlarmTimer > config['alarm']['dauer']: log.verbose('Alarmueberwachung: Alarm erkannt') ## wenn noch keine SMS gesendet wurde (StateMaschine SMS), dann schicken wir eine if not AlarmSMS: log.verbose('Alarmueberwachung: Alarmierung per SMS an ' + str(config['SIM']['ANR'])) ## SMS mit Configwerten versenden -> siehe config.json sim.sendSMS(config['SIM']['ANR'], config['SIM']['ATXT']) AlarmSMS = True # hier kommt der Messwertzähler ## wenn ein sehr hoher (nahe am Maximum) gemessen wird, dann zählen wir die Sekunden if messwert > 65500: log.debug('Alarmueberwachung: Alarmdauer ' + str(AlarmTimer)) AlarmTimer += 1 ## wenn ein niedriger Wert gemessen wird, dann gibt es wohl keinen Alarmton, dann gehen wir runter und setzen den ## Timer und SNS Versand zurück elif messwert < 65500: log.debug('Alarmueberwachung: AlarmTimer zurueckgesetzt, AlarmSMS zurueckgesetzt') AlarmTimer = 0 AlarmSMS = False # hier registrieren wir die Abfrage am ADC log.debug("Alarmueberwachung: ADC Anbindung an Pin " + str(config['alarm']['pin1'])) ADCObj=ADC(Pin(config['alarm']['pin1']),atten=ADC.ATTN_11DB) # hier starten wir den notwendigen Timer zur Überwachung log.debug("Alarmueberwachung: Timer gestartet") ADCTim.init(period=1000, callback=callbackADC) # todo: Implementierung der ADC Abfragen # #todo: Abfrage Callback erstellen # INPUT Callback Funktion # GPIO4 #def INcheckCallback(t): # p4 = Pin(4, Pin.IN, Pin.PULL_UP) # create input pin on GPIO4 aber Bitte PullUP, weil das hier ja ein Taster ist #print("Taster = " + str(p4.value())) # get value, 0 or 1 #print("SIM is on TTY: " + str(sim.getTTY())) #sim.sendSMS(znr, atxt) #adc=ADC(Pin(34),atten=ADC.ATTN_11DB) # #todo: Abfrage Timer starten # das ist der Timer zur Tasterabfrage (in Klammern die ID) #tim = Timer(1) # periodic with 100ms period #tim.init(period=500, callback=INcheckCallback)