Ankündigung

Einklappen
Keine Ankündigung bisher.

Parameter aus Logic.conf auslesen

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

    Parameter aus Logic.conf auslesen

    Guten Morgen,

    ich habe mir ein eigenen Skript geschrieben umd die UZSU zu einem Zeitfenster zu bewegen. Im Kern gleiche ich die Sunshine ab und schalte 4 Zeiten ( 2* an und 2* aus)
    Jetzt habe ich diverse Lampen, die ich gerne mit dem Skript zu verschiedenen Zeiten ansteuern will.

    Da ich im Skript nicht für jede Lampe einen eigenen ITEM hinterlegen will und auch noch diverse Anfangszeiten definiere habe ich mir überlegt, ob aus der LOGIC-Conf noch weitere Parameter wie z.B. Anschaltzeit und Item herausgelesen werden können. Bin aber gescheitert.

    In der Plugin geht das, aber ein eigenen Plugin.conf will ich daraus nicht machen.

    Wie konkret müsste ich denn weitere Parameter defninieren und abfragen? Any Ideas?

    Beispielcode aus Logic.conf:
    Code:
    [Aussen_Schriftzug]
    filename=aussenbeleuchtung_schriftzug.py
    watch_item=pi|zeit.schriftzug.schalter
    visu_acl=yes
    crontab = init | 1 0 * *       ## minute stunde tag wochentag

    Der Skript:
    Code:
    #!/usr/bin/env python
    ## AUSLÖSEN VON CRONJOB
    ## TRIGGER AUF watch_item=feiertag.valarm ( 0/2/3)
    
    import logging, datetime, time, string
    
        
    def schaltitem(sh,SCHALTITEMS):
        sh.zeit.hqi.schalter.uhr(SCHALTITEMS)
        
    def schaltzeiten():
    
        MORGEN_START    =   '7:00'
        MORGEN_ENDE     =   '9:00'
        ABEND_START     =   '16:30'
        ABEND_ENDE      =   '21:00'
        TIME_OFFSET     =   '1:00'
        return (MORGEN_START, MORGEN_ENDE, ABEND_START, ABEND_ENDE, TIME_OFFSET)
       
    
    def time2int(eingabe):
        if ':' in eingabe:
            hour   = int(eingabe.split(':')[0])
            minute = int(eingabe.split(':')[1])
        else:
            hour = int(eingabe)
        val = hour *60 + minute
        return val
        
    
    def int2dt_object(eingabe, DATUM):
        if ':' in eingabe:
            hour   = int(eingabe.split(':')[0])
            minute = int(eingabe.split(':')[1])
        else:
            hour = int(eingabe)
        dt_object = datetime.datetime(int(DATUM.strftime('%Y')),int(DATUM.strftime('%m')),int(DATUM.strftime('%d')),hour,minute,0)         #Morgenschaltung
        return dt_object
    
    def sun_prf(sun, vglw):
        SRISE_TUP=time.mktime((sun.year,sun.month,sun.day,sun.hour,sun.minute,sun.second,0,0,0))
        START_TUP=time.mktime((vglw.year,vglw.month,vglw.day,vglw.hour,vglw.minute,0,0,0,0))
        DIFF=START_TUP-SRISE_TUP
        return DIFF
    
    
        
    mylogger = logging.getLogger('')  
    mylogger.info("Programmstart")
    
    ## notwendige DATEN: Feiertag, Feiertag-VA, Dämmerung, morgens an, morgens aus, abens an, abends aus
    ## morgens an modifizieren,
    ## abends aus modifizieren
    ##Daemmerng (4/0/8)  aussen.daemmerung
    ## Logik läuft täglich um 0:01 Uhr            
    
    #if sh.pi()== 0: sys.exit()           #abbruch wenn pi auf 0, sonst zuviele Zustandsmails
    
    log=''
    
    MORGEN_START, MORGEN_ENDE, ABEND_START, ABEND_ENDE, TIME_OFFSET = schaltzeiten()
    
    
    MORGEN_ON_ACTIVE    =True
    ABEND_ON_ACTIVE     =True
    MORGEN_OFF_ACTIVE   =True
    ABEND_OFF_ACTIVE    =True
    
    #BERECHNEN und FORMATIEREN....
    DATUM   =  datetime.datetime.now()
    SRISE   =  sh.sun.rise().astimezone(sh.tzinfo())    #Sunrse
    SSET    =  sh.sun.set().astimezone(sh.tzinfo())     #SunSet
    
    MORGEN_ZF_START = int2dt_object(MORGEN_START  , DATUM)
    MORGEN_ZF_ENDE  = int2dt_object(MORGEN_ENDE    , DATUM)            
    MORGEN_AUS      = int2dt_object(MORGEN_ENDE    , DATUM)
    ABEND_ZF_START  = int2dt_object(ABEND_START   , DATUM)
    ABEND_ZF_ENDE   = int2dt_object(ABEND_ENDE    , DATUM)
    ABEND_AUS       = int2dt_object(ABEND_ENDE    , DATUM)
    OFFSET          = time2int(TIME_OFFSET)
    
    # verschieben um eine Stunde bei Feiertag Voralarm
    if sh.feiertag.alarm() == 1:
        MORGEN_ZF_START = MORGEN_ZF_START + datetime.timedelta(minutes=OFFSET)
        mylogger.debug('Feiertag-ALARM, ANFANG um ' + str(OFFSET) + ' Minuten verschoben auf ' + MORGEN_ZF_START.strftime('%H:%M'))
    
    DIFF = sun_prf(SRISE,MORGEN_ZF_START)
    mylogger.debug( 'STARTZeit:' + MORGEN_ZF_START.strftime('%H:%M ') +' SUNRISE ' + SRISE.strftime('%H:%M'))
    if DIFF < 0: # von Sonnenaufgang bis  STARTZEIT und SUNRISE Start unterdrücken.
        mylogger.debug('Morgens Hysterese erreicht oder SunRise zur früh, Logik inaktiv')
        MORGEN_ON_ACTIVE=False
        
    
    #Hier ABEND
    if sh.feiertag.valarm() == 1:
        ABEND_ZF_ENDE = ABEND_ZF_ENDE + datetime.timedelta(minutes=OFFSET)
        ABEND_AUS = ABEND_AUS + datetime.timedelta(minutes=OFFSET)
        mylogger.debug('Feiertag-Voralarm, ENDE um ' + str(OFFSET) + ' Minuten verschoben auf ' + ABEND_ZF_ENDE.strftime('%H:%M'))
       
    
    DIFF = sun_prf(SSET,ABEND_ZF_ENDE)
    mylogger.debug( 'Endzeit Abends:' + str(ABEND_ZF_ENDE) +' Sunset ' + str(SSET))
    if DIFF < 0:
        mylogger.debug('Abend Sunset ausserhalb Zeitfenster, bleibt aus')
        #DIFFERENZ Ausschaltzeit(21.00) zu Sunset 2016-05-19 21:04:38.372872+02:00 ist -278.0 in sekunden -- aussenbeleuchtung.py:<module>:61
        ABEND_ON_ACTIVE=False
    
    
    #Werte in den notwendigen String konvertieren....
    MORGEN=MORGEN_ZF_START.strftime('%H:%M') +  '<sunrise<' + MORGEN_ZF_ENDE.strftime('%H:%M')
    mylogger.debug(MORGEN)    
    ABEND = ABEND_ZF_START.strftime('%H:%M') +  '<sunset<' + ABEND_ZF_ENDE.strftime('%H:%M')    
    mylogger.debug(ABEND)
    
    MORGEN_ENDEE = MORGEN_AUS.strftime('%H:%M')
    ABEND_ENDE = ABEND_AUS.strftime('%H:%M')
       
    
    
    L1={'active':MORGEN_ON_ACTIVE,  'time':MORGEN,       'value':'on' }
    L2={'active':MORGEN_OFF_ACTIVE, 'time':MORGEN_ENDEE,  'value':'off'}
    L3={'active':ABEND_ON_ACTIVE,   'time':ABEND,        'value':'on' }
    L4={'active':ABEND_OFF_ACTIVE,  'time':ABEND_ENDE,   'value':'off'}
    SCHALTITEMS = {'active':True, 'list':[L1,L2,L3,L4]}
    
    
    
    log+='Zustand Schalter: ' + str(sh.pi()) + '\n\n'
    log=log.replace('False','AUS')
    
    
    if sh.feiertag.alarm() == 1:
        log += 'Feitertag-Alarm' + sh.feiertag.name() + '\n\n'
    log += 'Schaltzeit 1:' + str(L1)+ '\nSUNRISE:' + str(SRISE) + '\n\n'
    log += 'Schaltzeit 2:' +str(L2) + '\n\n'
    
    if sh.feiertag.valarm() == 1:
        log += 'Feiertag-Voralarm ' +  sh.feiertag.vname() + '\n'
    log += 'Schaltzeit 3:' +str(L3)+ '\nSUNSET:' + str(SSET) + '\n\n'
    log += 'Schaltzeit 4:' +str(L4)  
    
    
    log = log.replace('sunrise','sunrise (' + SRISE.strftime('%H:%M') + ')')
    log = log.replace('sunset', 'sunset (' + SSET.strftime('%H:%M') + ')')
    
    
    schaltitem(sh,SCHALTITEMS)
    sh.mail("Peter.Hoegg@Allianz.de", "Schaltzeiten-Vorgabe HQI Außen", log)
    
    sh.pi(0)
    never fummel a running system...

    #2
    Auf zusätzliche Parameter in der Konfiguration der Logik kannst Du so zugreifen:

    Bei der Logik definieren:
    Code:
     [Aussen_Schriftzug]
     filename=aussenbeleuchtung_schriftzug.py
     watch_item=pi|zeit.schriftzug.schalter
     visu_acl=yes
     crontab = init | 1 0 * *    
     my_param = test
    und in der Logik:
    Code:
    configvalue = obj.my_param
    Edit: Noch etwas:

    Wenn Du die Schaltzeiten in der Config unterbringen willst, kannst Du das so machen:
    Code:
     [Aussen_Schriftzug]
     filename=aussenbeleuchtung_schriftzug.py
     watch_item=pi|zeit.schriftzug.schalter
     visu_acl=yes
     crontab = init | 1 0 * *    
     schaltzeiten = '7:00' | '9:00' | '16:30' |   '21:00' | '1:00'

    und in der Logik entweder mit unpack:
    Code:
    a,b,c,d,e = obj.schaltzeiten
    oder in einer for Schleife:
    Code:
    for o in obj.schaltzeiten:
        logger.debug(o)
    Zuletzt geändert von cmalo; 27.05.2016, 12:37.

    Kommentar


      #3
      Zitat von cmalo Beitrag anzeigen
      und in der Logik:
      Code:
      configvalue = obj.my_param
      Bist Du Dir da sicher? Muß es nicht
      Code:
      configvalue = obj.conf['my_param']
      heißen, denn my_parm ist ja ein Attribut und kein Objekt, oder?
      Habe Deinen Weg nicht probiert, da ich Attribute immer über .conf anspreche...

      Kommentar


        #4
        Ja ganz sicher, ist getestet. Es geht beides. Die Parameter aus der Config werden bei der Logik als Member abgelegt.


        Kommentar


          #5
          Danke, wieder was gelernt!

          Kommentar


            #6
            danke.... jetzt ist die Logik 'universal' parametrierbar und nicht als Plugin definiert.
            Wenn einer will, dann gerne, schicke das dann rüber
            never fummel a running system...

            Kommentar


              #7
              Gerne.
              Wir könnten sauber programmierte Logiken als Sammlung ins Repository aufnehmen. Die müssen eh erst in der config gernauso wie Plugins aktiviert werden.

              Kommentar


                #8
                wahrscheinlich fehlt es an dem "sauber programmiert", ich bin Autodidakt und somit automatisch großer Anhänger von Spaghetti-Code.... Vielleicht findet sich einer, der das dann in die gewünschte Form bringen kann.
                never fummel a running system...

                Kommentar

                Lädt...
                X