Ankündigung

Einklappen
Keine Ankündigung bisher.

verschachtelte Methodenaufrufe wirft Fehler

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    verschachtelte Methodenaufrufe wirft Fehler

    Hallo zusammen,

    ich bin an den ersten Gehversuchen von sh.py. Ist echt was tolles was ihr hier auf die Beine gestellt habt! Da ich Python-Neuling bin habe ich da wohl eine einfache Frage an die Experten.

    Ich habe eine Logik, welche die Jalousien fahren soll (Automatik auf dem Jalousieaktor). d.H. Jalousie unten, Lamellen geöffnet. Ich möchte nun zudem, wenn das Balkonfenster geöffnet ist, die Jalousie des Balkons nicht runter fährt. Dies löse ich mittels einer Sperre auf der Jalousie, welche ich dann wieder löse. Soweit so gut. Ich würde nun gerne die Methode "run" aufrufen. In dieser Run-Methode sollte wiederrum eine Methode aufgerufen werden. Dabei kommt es aber zu einer Exception:
    Logic: Automatikjalousie, File: automatikjalousie.py, Line: 26, Method: run, Exception: global name 'setSperre' is not defined

    Fragen:
    Wie kann kann ich eine Methode innerhalb einer Methode aufrufen?
    Gibt es eine elegantere Variante als mit Threads zu arbeiten?
    Sind sh und logger nicht "Global" verfügbar, warum muss ich diese übergeben?
    Kann ich einer Methode auch ein Item übergeben, welchem in dann einen Wert setzen kann?

    Hoffe jemand kann mir da weiterhelfen....
    Danke und Gruss Buffi

    Code:
    import datetime
    import threading
    
    def setSperre(sh, logger):
        logger.info("Auto.Jal: release Sperre Wohnen")
        #doit
    
        if sh.reedkontakt.wohnen() == False and sh.presenz.anwesend():
            threading.Event().wait(2)
            logger.info("Auto.Jal: setze Sperre Wohnen")
            #doit
            
            threading.Event().wait(4)
            logger.info("Auto.Jal: release Sperre Wohnen")
            #doit
    
    def autoJalEG(sh, logger):
        threading.Event().wait(4)
        logger.info("Auto.Jal: fahre EG")
        #doit
    
    def run(sh, logger, doSperre):
        if doSperre:
            threading.Thread(target=setSperre, args=(sh, logger)).start()
        threading.Thread(target=autoJalEG, args=(sh, logger)).start()
    
    if sh.zeit.morgendaemmerung():
        pass
    if sh.zeit.morgen():
        pass
    if sh.zeit.tag():
        pass
    if sh.zeit.abenddaemmerung():
        run(sh, logger, 1)
    if sh.zeit.abend():
        run(sh, logger, 1)
    if sh.zeit.vormitternacht():
        run(sh, logger, 1)    
    if sh.zeit.nacht():
        run(sh, logger, 1)

    #2
    Hallo Ramon,

    vergiss Threading! Das ist nichts für Python-Anfänger.

    Das sieht mir alles sehr sehr kompliziert aus, was Du da treibst.
    Du solltest Dein Problem, soweit beschrieben, auch mit einfachen Logiken und Items realisieren können.

    Bis bald

    Marcus

    Kommentar


      #3
      Hmm.... ich komme von der Java-Welt...und Python hat einfach nen anderen Syntax und hat sicherlich auch ihre Eigenheit. Ich arbeite mich ja erst ein
      Mein Code find ich nun nicht wirklich komplex, aber du hast sicherlich recht, es gibt bestimmt auch ne Variante ohne Threads...ich weiss im Moment nichts simpleres... Aber auch wenn ich keine Threads verwende, wüsste ich gerne warum bei verschachtelten Methodenaurufe eine Exception kommt. d.H ein Aufruf von bar() in foo().

      Code:
      def foo(item):
          bar(item)
      
      def bar(item):
          item(1)
      
      foo(sh.jalousie.automatik)
      Zudem kann ich ein Item eifach einer Methode übergeben und darauf zugreifen (item)?

      gruss Ramon

      Kommentar


        #4
        Hi Ramon,

        ja, man kann ein Item (Objekt) einer Methode übergeben und darin aufrufen.

        bar wird nicht in global gefunden, da es nicht global ist.

        Man könnte das mit
        Code:
        global bar
        def bar():
        ändern, das würde ich nicht empfehlen, da du dabei den Kontext der Logik verlässt.

        Alternativ dazu geht:

        Code:
        def foo():
             def bar():
                   pass
             bar()
        Bis bald

        Marcus

        Kommentar


          #5
          Hallo Marcus,

          vielen Dank für den Hinweis. Jetzt tut's was es tun soll

          gruss Ramon

          Kommentar


            #6
            Wäre es nicht einfacher, den Jalousieaktor direkt bzw. den Kanal zu sperren, wenn die Balkontüre offen ist?
            Mit freundlichen Grüßen
            Niko Will

            Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
            - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

            Kommentar


              #7
              Nein, es soll nur gesperrt werden, wenn wir Anwesend sind (ok, bei Abwesenheit dann sollte eigentlich die Balkontür nicht offen sein) und es nicht später als 23 Uhr oder so ist.

              Kommentar

              Lädt...
              X