brauche Hilfestellung bei Parameterübergabe bzw. beim speichern eines Wertes

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich grüße euch,

    ich bin seit ein paar Tagen daran mein Script für eine Alarmanlage umzuschreiben und übersichtlicher zu gestalten und hatte dadurch auch schon einige Aha-Effekte beim lernen von Python.

    Jetzt bin ich an einer Stelle wo ich nicht mehr weiter komme und hoffe das der ein oder andere mir zumindest einen Stups in die richtige Richtung gibt.

    Ich nutze Telegram um den Alarm Ein- bzw. Auszuschalten.

    Beim Einschalten soll zu erst geprüft werden ob alle Türen geschlossen sind. Wenn dies der fall ist schaltet der Alarm Ein ansonsten wird mir gesagt welche Tür noch offen ist bzw. geschlossen werden muss.

    Das Funktioniert soweit.

    Mein Problem ist das ich bei eingeschaltetem Alarm keine Einbruchsmeldung bekomme.

    Die Idee war jetzt eine Statusvariable in der "def send_message" funktion zu setzen. Dann hab ich gemerkt das die Variable bei jedem Funktionsaufruf zurückgesetzt wird.

    Da kommt der Schlips ins Rad. Ich habe keine Ahnung wie ich das lösen soll. :helpnew:

    beste Grüße und schönes Wochenende

    Einmal editiert, zuletzt von keepfear (9. Mai 2020 um 08:28)

  • brauche Hilfestellung bei Parameterübergabe bzw. beim speichern eines Wertes? Schau mal ob du hier fündig wirst!

  • Du hast if statements nicht verstanden.

    Du bekommst keine Nachricht, weil Zeile 65 niemals erreicht werden kann.

    Code
    if an:
        pass
    elif scharf and an:
        pass

    Wie soll das zweite statement wahr sein, ohne dass das erste wahr ist und damit kein elif mehr ausgeführt wird?

    Reihenfolge tauschen oder aus dem elif ein if machen.

  • Morjen El_Zetto,

    hab das Script in Beitrag #1 angepasst. Das löst aber nicht mein Problem.

    ein Bsp.:

    Angenommen ich starte das Script und sage dem Pi er solle doch den Alarm anschalten und ich jetzt eine Tür öffne kommt folgendes bei rum.

    Python
    Up and Running.... #<----Telegram ist start klar
    Received: /an #<----ich sende eine Nachricht vom Telephon an den Pi.
    prüfe ob alle tueren geschlossen #<----sind alle Türen zu?....
    alle tueren geschlossen#<----....JA.
    wenn die Funktion send_message aufgerufen wird. scharf = False ...#<------Funktion zur Rückmeldung auf Telegram/Telefon
    ...if an. scharf = True #<----Statusvariable 
    alarm an #<--- Türen sind alle zu. Alarm an. Danke
    wenn die Funktion send_message aufgerufen wird. scharf = False ... #<----Tür wurde geöffnet (holztuer.when_released = functools.partial(send_message, .....)
    wenn die Funktion send_message aufgerufen wird. scharf = False ... #<----Tür wurde geschlossen holztuer.when_pressed = functools.partial(send_message, .....)

    sprich die zeilen...

    Python
    #--------------------------------------------------------
    #Überwachung der Tueren bei eingeschaltetem Alarm
    #--------------------------------------------------------
    holztuer.when_released = functools.partial(send_message, door ="Holztuer", openClose = "geöffnet")
    holztuer.when_pressed = functools.partial(send_message, door ="Holztuer", openClose = "geschlossen")
    werkstatttuer.when_released = functools.partial(send_message, door ="Werkstatttuer", openClose = "geöffnet")
    werkstatttuer.when_pressed = functools.partial(send_message, door ="Werkstatttuer", openClose = "geschlossen")

    ...rufen die Funktion immer wieder neu auf, wobei die Variable "Scharf" immer wieder neu aufgerufen wird, also immer False ist -> if scharf: niemals wahr.

    Und das ist das Problem. Da egal was ist, die Türen immer geprüft werden und ich keine Meldung möchte wenn der Alarm aus ist. Deswegen die Statusvariable.

    Ich hoffe ich hab das etwas besser aufklamüsert.

  • Nur eine Anmerkung:

    #!/usr/bin/env python

    Du solltest auf Python3 umschwenken, Python2 wird nicht mehr gepflegt.

    Bevor Du in noch mehr Arbeit investierst.

    MfG

    Jürgen

  • python ist python 2. Wenn du python 3 willst, musst du python3 benutzen.

  • wobei die Variable "Scharf" immer wieder neu aufgerufen wird, also immer False ist

    Und warum machst du das? Wenn du die Variable bei jedem Funktionsaufruf als False definierst, kann das ja auch nicht klappen.

    Einmal am Anfang außerhalb der Funktionen initialisieren und dann nur noch ändern falls der Alarm an oder ausgeschaltet wird.

  • Arbeite bitte ein Python Tutorial deiner Wahl zum Thema Scope von Variablen durch um das grundlegende Prinzip zu verstehen. Danach solltest du das Problem selber lösen können.

    Was du brauchst ist eine globale Variable, wie es auch deine gpiozero buttons sind.

    Für das Beispiel kannst du eine globale Variable nutzen. Für komplexere Angelegenheiten solltest du dich aber mit Klassen auseinandersetzen.

  • Ich bedanke mich bei allen.

    Die globale variable werde ich vorerst nicht nutzen und mich mit dem, was hier schon erwähnt wurde, befassen.

    Ich melde mich ggf. wieder.

    Schönen Sonntag noch.

  • Mahlzeit,

    ich poste einfach mal mein fertiges Script. Ist sicher nicht ganz rund, läuft aber.

    Edit: Sry. das ich das Thema nochmal hoch hole. Hab das Script nochmal geändert.

    Einmal editiert, zuletzt von keepfear (8. Juni 2020 um 12:09)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!