Ankündigung

Einklappen
Keine Ankündigung bisher.

Suche bessere Lösung für time.sleep

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

    Suche bessere Lösung für time.sleep

    Hallo zusammen,
    ich möchte gerne mit einer Logik Außenlicht für 3 minuten einschalten und anschließend wieder aus. Dazu habe ich aktuell man das time.sleep (180) verwendet. Aber das ist ja sicherlich programmiertechnisch sehr unsauber, da es das System blockiert. Manche Funktionen laufen dann nicht mehr einwandfrei, so lange der PC am Schlafen ist. Gibt es da auch eine andere Lösung. Anbei mal die aktuelle Logik:

    Code:
    [COLOR=#008000]#!/usr/bin/env python
    # -*- coding: iso-8859-1 -*-
    # Imports
    # Maybe needs to install "apt-get install python-requests"[/COLOR]
    import time
    
    [COLOR=#008000]# ------------------------------------------------------------------------------------------------
    # Beschreibung
    # Dieses Skript prüft den BWM und schaltet das Außenlicht.
    # ------------------------------------------------------------------------------------------------
    
    # Logik aktiv?[/COLOR]
    if sh.ZENTRAL.LOGIKEN.BWM_LIGHT():
    [COLOR=#008000]    # Für Debug Zwecke wird angezeigt das das Skript gestartet wurde[/COLOR]
        logger.debug('{} : START : trigger={}'.format(logic.name, trigger))
        ...
    [COLOR=#008000]            # Prüfung ob es auch dunkel ist (nacht)[/COLOR]
                if sh.env.location.night():
                       ...
                            # Prüfung, ob das Licht aktuell auch aus ist
                            if not sh.R93.LICHT.SUED():
    [COLOR=#008000]                            # Info im Meldesystem[/COLOR]
                                sh.messagesystem('INFO', 'Licht im Garten aktiviert (3min)')
                                sh.R93.LICHT.SUED('on')
    [COLOR=#008000]                            # Zeit abwarten bevor das Licht wieder ausgeschaltet wird.[/COLOR]
                                [COLOR=#FF0000]time.sleep(180)[/COLOR]
    [COLOR=#008000]                            # Licht wieder ausschalten[/COLOR]
                                sh.R93.LICHT.SUED('off')
        else:
           ...
    [COLOR=#008000]    # Für Debug Zwecke wird angezeigt das das Skript beendet wurde
        # So kann eingesehen werden, welche Ausgaben zwischenzeitlich ausgegeben wurden.[/COLOR]
        logger.debug('{} : ENDE'.format(logic.name))
    else:
        ...
    Ich könnte auch versuchen einen Sheduled Job für das Ausschalten zu erstellen. Gibt es da auch einen Einzeiler für? Ich möchte nach Möglichkeit alles in diesem einen Skript abhandeln und nicht ein anderes aufrufen, welches das Licht dann nur ausschaltet.

    Vielleicht habt ihr ein paar Tipps für mich.
    Danke

    Gruß
    loeserman

    #2
    Moin zusammen,
    na toll, nach weiterer Suche im Forum habe ich die Lösung. Folgender Tread hat mir geholfen:
    https://knx-user-forum.de/forum/supp...ausf%C3%BChren

    Ich rufe nun die Logik mit einem eigenen Value erneut auf und prüfe darauf:

    Code:
    [COLOR=#008000]#!/usr/bin/env python
    # -*- coding: iso-8859-1 -*-
    # Imports
    # Maybe needs to install "apt-get install python-requests"[/COLOR]
    import time
    
    [COLOR=#008000]# ------------------------------------------------------------------------------------------------
    # Beschreibung
    # Dieses Skript prüft den BWM und schaltet das Außenlicht.
    # ------------------------------------------------------------------------------------------------
    
    # Logik aktiv?[/COLOR]
    if sh.ZENTRAL.LOGIKEN.BWM_LIGHT():
    [COLOR=#008000]    # Für Debug Zwecke wird angezeigt das das Skript gestartet wurde[/COLOR]
        logger.debug('{} : START : trigger={}'.format(logic.name, trigger))
        ...
    
    [COLOR=#FF0000]    triggervalue = trigger['value'][/COLOR]
        
    [COLOR=#008000]    # Prüfung ob das Skript durch sich selbst aufgerufen wurde
        # Prüfung auf ein manuell gesetzten Value[/COLOR]
    [COLOR=#FF0000]    if triggervalue == 'R93_BWM_LIGHT_RESET':[/COLOR]
    [COLOR=#008000]        # Licht wieder ausschalten[/COLOR]
    [COLOR=#FF0000]        sh.R93.LICHT.SUED('off')[/COLOR]
    
    ...
    [COLOR=#008000]            # Prüfung ob es auch dunkel ist (nacht)[/COLOR]
                if sh.env.location.night():
                       ...
    [COLOR=#008000]                        # Prüfung, ob das Licht aktuell auch aus ist[/COLOR]
                            if not sh.R93.LICHT.SUED():
    [COLOR=#008000]                            # Info im Meldesystem[/COLOR]
                                sh.messagesystem('INFO', 'Licht im Garten aktiviert (3min)')
                                sh.R93.LICHT.SUED('on')
    [COLOR=#008000]                            # Zeit abwarten bevor das Licht wieder ausgeschaltet wird[/COLOR].
    [COLOR=#008000]                            # Skript erneut aufrufen, um die Lichter nach einer definierten Zeit wieder auszuschalten.
                                # Es wird mit einem definierten Triggervalue aufgerufen, damit darauf reagiert werden kann.[/COLOR]
    [COLOR=#FF0000]                            logic.trigger(dt=sh.now() + datetime.timedelta(seconds=180), value='R93_BWM_LIGHT_RESET') [/COLOR]
    
        else:
           ...
    [COLOR=#008000]    # Für Debug Zwecke wird angezeigt das das Skript beendet wurde
        # So kann eingesehen werden, welche Ausgaben zwischenzeitlich ausgegeben wurden.[/COLOR]
        logger.debug('{} : ENDE'.format(logic.name))
    else:
        ...
    Das klappt prima und blockt nicht mein System.

    Vielleicht hilfts auch anderen.

    Gruß
    loeserman

    Kommentar


      #3
      Hallo,

      erst einmal, time.sleep blockiert nicht das System. Es blockiert die Ausführung der Logik. Wenn die Logik jetzt sehr oft innerhalb kurzer Zeit aufgerufen wird, dann kann das System blockiert werden.

      Aber zurück zu Deinem Problem. Wie wäre es mit autotimer? Siehe Doku.

      Bis bald

      Marcus

      Kommentar


        #4
        Ja mensch, prima.
        Das ist ja viel simpler. Nun sieht es wie folgt aus.

        Code:
        ...
        [COLOR=#008000]# Lichter einschalten[/COLOR]
        sh.R93.LICHT.SUED('on')
        [COLOR=#008000]# Licht nach 3 Minuten wieder ausschalten[/COLOR]
        sh.R93.LICHT.SUED.timer('3m', 'off')
        ...
        Habe mich für den timer anstatt dem autotimer entschieden, da das in dem Fall vom BWM ausgelöst wird und ich das zusammen mit ein paar anderen Abfragen nur selten ausführe.. Bei den Tastern soll es Dauerlicht bleiben, wie bisher. Vielen Dank mknx.

        Gruß
        loeserman
        Zuletzt geändert von loeserman; 05.02.2016, 00:24. Grund: Wahl vom timer anstatt autotimer

        Kommentar

        Lädt...
        X