Mahlzeit Forum,
ich hatte vor langer Zeit mal ein Script geschrieben welches eine Alarmanlage steuert. Das Script war ziemlich funktionell und da ich mich mit OOP beschäftigen wollte hatte ich das Script umgeschrieben.
Ich lege mir die Türen als Objekte an und wenn ich den Befehl zum einschalten des Alarms via Telegram schicke übergebe ich diese Türen der Methode def pruefe_tuer(self):.
Damit ich nicht jedesmal 2 oder mehr Nachrichten bekomme wenn mehr als eine Tür offen ist, wollte ich die noch nicht geschlossenen Türen in eine Liste schmeißen und diese dann via Telegram schicken. An sich funktioniert das mit einer Tür, bei mehr Türen nicht so richtig.
#!/usr/bin/python3
import logging
from telegram import ReplyKeyboardMarkup, Bot
from telegram.ext import Updater, CommandHandler
from gpiozero import Button
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
class Alarm(Button):
"""
To-Do: Zeitschaltuhr, Chatwechsel, Alarm für Tueren einzeln schalten, Telegramm vererben
"""
tuerZaehler = 0
liste_offener_tueren = []
an = False
TEST_TOKEN = "Token"
TEST_CHATID = chatID
statusText = [
"Alarm ist AN",
"Alarm ist AUS",
]
def __init__(self, tuer_name ="", pin=None, pull_up=True, bounce_time=None):
self.tuer = tuer_name
self.meldeText = [f"{self.tuer} ist noch offen.",
f"Alarm! {self.tuer} wurde geoeffnet."
]
super().__init__(pin, pull_up=True, bounce_time=None)
@staticmethod
def start(update, context):
reply_keyboard = [["/An", "/Aus"]]
update.message.reply_text(
"Hi, ich bin ein Bot.\n"
"Ich schalte die Alarmanlage.\n"
"Benutze dazu die Buttons /An und /Aus.\n",
reply_markup = ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True, resize_keyboard = True))
@staticmethod
def einschalten(update, context):
holztuer.pruefe_tuer()
werkstatttuer.pruefe_tuer()
@staticmethod
def ausschalten(update, context):
Alarm.an = False
holztuer.sende_nachricht()
def pruefe_tuer(self):
if not self.is_pressed:
Alarm.an = False
Alarm.tuerZaehler += 1
Alarm.liste_offener_tueren.append(self.tuer)
if Alarm.tuerZaehler > 0:
self.sende_nachricht(tuerOffen=True)
Alarm.tuerZaehler = 0
del Alarm.liste_offener_tueren[:]
else:
Alarm.an = True
self.sende_nachricht()
def melde_einbruch(self):
if Alarm.an:
self.sende_nachricht(einbruch=True)
def sende_nachricht(self, einbruch=None, tuerOffen=None):
bot = Bot(Alarm.TEST_TOKEN)
chatID = Alarm.TEST_CHATID
if not Alarm.an:
if tuerOffen:
bot.sendMessage(chatID, f"Alarm AUS\n{', '.join(Alarm.liste_offener_tueren)} noch offen.")
else:
bot.sendMessage(chatID, Alarm.statusText[1])
elif Alarm.an:
if einbruch:
bot.sendMessage(chatID, self.meldeText[1])
else:
bot.sendMessage(chatID, Alarm.statusText[0])
holztuer = Alarm(tuer_name="Holztuer", pin=17, pull_up=False, bounce_time=0.1)
werkstatttuer = Alarm(tuer_name="Werkstatttuer", pin=18, pull_up=False, bounce_time=0.1)
def main():
#Überwachung der Türen, sendet Nachricht bei Alarm ein
holztuer.when_released = holztuer.melde_einbruch
werkstatttuer.when_released = werkstatttuer.melde_einbruch
#Telegram
updater = Updater(Alarm.TEST_TOKEN)
updater.dispatcher.add_handler(CommandHandler("start", Alarm.start))
updater.dispatcher.add_handler(CommandHandler("an", Alarm.einschalten))
updater.dispatcher.add_handler(CommandHandler("aus", Alarm.ausschalten))
updater.start_polling()
if __name__ == "__main__":
main()
Alles anzeigen
Da alle Türen einzeln geprüft, gezählt und in eine Liste gepackt werden, ist die Bedingung if Alarm.tuerZaehler > 0 in dem Fall wahr wenn nur eine oder mehrere Tür nicht geschlossen ist/sind und die Null mit einem anderen Wert ersetzen bringts ja auch nicht.
Dann dachte ich mir, ich zähle wie oft das Wortschnippsel "tuer" in meiner Liste vorkommt und vergleiche das mit dem zähler, was im prinzip aufs selbe Problem hinaus führt.
Lange Rede kurzer Sinn.
Hat jemand eine Idee wie ich mir meine Bedingung so zurecht basteln kann damit mir zuerst alle meine offenen Türen in eine Liste gepackt werden und danach die Liste verschickt wird?
def pruefe_tuer(self):
if not self.is_pressed:
Alarm.an = False
Alarm.tuerZaehler += 1
Alarm.liste_offener_tueren.append(self.tuer)
if Alarm.tuerZaehler > 0:
self.sende_nachricht(tuerOffen=True)
Alarm.tuerZaehler = 0
del Alarm.liste_offener_tueren[:]
else:
Alarm.an = True
self.sende_nachricht()
Alles anzeigen