ich bin erst seit kurzem mit python unterwegs und programmiere eine "Alarmanlage" für unseren Garten auf einem Raspberry.
Zur Alarmierung nutze ich u.a. den python-telegram-bot.
Obwohl ich dachte das Thema exceptions einigermaßen verstanden zu haben, scheitere ich jedoch an folgendem Problem und komme nicht wirklich weiter:
Sobald der Router im Garten definiert neu rebootet und somit der Raspberry kurzzeitig keinen Internetzugriff hat erhalte ich aus dem Script bzw. durch den python-telegram-bot haufenweise Fehler wie MaxRetryError, TimeoutError "geraised" von urllib3, OS Error weil das Netzwerk nicht erreichbar ist und so weiter.
Das ist bei einem Alarm Script natürlich nicht wirklich sinnvoll. Ich habe diverse Variationen schon ausprobiert. Es greift jedoch kein einziger try/except block.
Ich habe den stark gekürzten Code mal angehangen und würde mich freuen wenn mir hier jemand mal unter die Arme greifen kann, da ich aktuell keinen Ansatz mehr finde.
Oder habe ich evtl. den Code-Aufbau nicht korrekt?
Code: Alles auswählen
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
import datetime # Importing the datetime library
import time # Nur für eignen Time
import RPi.GPIO as GPIO # Importing the GPIO library to use the GPIO pins of Raspberry pi
import http.client # Benötigt zum URL Aufruf um eine Nachricht auf dem TV anzuzeigen
from contextlib import closing
from time import sleep # Importing the time library to provide the delays in program
from telegram.ext import Updater # Importing the telepot library
import subprocess # Zum Ausführen von Ping benötigt
from urllib3 import exceptions
alarm_relay = 20 # Initializing GPIO´s
alarm_werkzeugraum = 17
alarm_gartenlaube = 27
...
try:
updater = Updater(token=bot_api_key, use_context=True)
updater.start_polling()
except MaxRetryError:
logging.info("!!!!!!!!!!!!!!!!!!!!!MaxRetryError")
except NetworkError:
logging.info("!!!!!!!!!!!!!!!!!!!!!NetworkError")
except NewConnectionError:
logging.info("!!!!!!!!!!!!!!!!!!!!!NewConnectionError")
except ConnectTimeoutError:
logging.info("!!!!!!!!!!!!!!!!!!!!!ConnectTimeoutError")
except Exception:
logging.info("Es ist eine nicht behandelte Exception aufgetreten ...")
dispatcher = updater.dispatcher
# Telegram Antwortfunktionen
def start(update, context):
context.bot.send_message(chat_id=update.effective_chat.id, text="I'm a bot, please talk to me!")
......
# Handler aktivieren
from telegram.ext import CommandHandler
start_handler = CommandHandler('start', start)
dispatcher.add_handler(start_handler)
# Diverse Funktionen
def event_sec15(lasttimer15):
#print(time.time()) # use for testing, comment out or delete for production
return lasttimer15 + 15 < time.time()
# Anwesenheitserkennung
def check_anwesenheit():
global away_count
ergebnis= 0
# -c bei Linux und -n bei Windows
ipcheck = subprocess.call(['ping', '-c', '1', SMARTPHONE_IP])
if ipcheck == 1:
away_count = away_count + 1
print("Abwesenheits-Pingzähler: " +str(away_count))
if ipcheck == 0:
away_count = 0
print("Abwesenheit zurückgesetzt: Pingzähler: " +str(away_count))
if away_count > 4:
ergebnis = 0
else:
ergebnis = 1
return ergebnis
def main():
global lasttimer15
global ...
while 1:
if event_sec15(lasttimer15) == True:
lasttimer15 = time.time()
logging.info("TIK 15!")
anwesend = check_anwesenheit()
......
if anwesend == 0:
if state_alarm_werkzeugraum == 0 and state_alarm_werkzeugraum != laststate_alarm_werkzeugraum:
updater.bot.send_message(chat_id=group_id, text="Alarm: Tür Werkzeugraum wurde geöffnet!")
laststate_alarm_werkzeugraum = 0
sleep(1)
......
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt: # If CTRL+C is pressed, exit cleanly:
print("Steuerung-C erkannt. Programm wird beendet ...")
updater.stop()
print("Cleaning GPIOs ...")
GPIO.cleanup() # cleanup all GPIO
print("Alles beendet!")
#break
except Exception:
logging.info("MAIN- Es ist eine nicht behandelte Exception aufgetreten ...")
logging.info("Aus MAIN() geflogen!!!!!!!!!!!!!!")