Ankündigung

Einklappen
Keine Ankündigung bisher.

Abgleich items.yaml mit ETS / KNX GAs

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

    Abgleich items.yaml mit ETS / KNX GAs

    Hallo zusammen,

    durch Umbauten waren bei mir ein paar items nicht mehr konsistent mit der ETS, oder überhaupt noch nicht angelegt. Ein manueller Abgleich war extrem schwer. Bei fast 500 Items verliere ich zumindest den Überblick.
    Im KNX-Plugin gibt es schon ein Script, dass sich als Logik einbinden lässt, mit Hilfe dessen sich eine .esf-Datei aus der ETS auswerten lässt.
    https://www.smarthomeng.de/developer...ight=check_knx

    Ich habe das Script erweitert um die Möglichkeit, aus der Perspektive der Items zu schauen, ob diese überhaupt in der ETS angelegt sind und aus der Perspektive der GAs aus der YAML zu schauen, ob und wie diese in der ETS angelegt sind. Hierzu wurde einfach die Ausgabe der txt-Datei um zwei weitere Tabellen ergänzt.

    Ich habe einen entsprechenden Pull-Request gestartet.
    Vielleicht kann das aber auch hier schon jemand so gebrauchen...

    Viel Spaß!

    Code:
    Folgende Items sind mit Bezug zu KNX konfiguriert:
    
    ======================================================================
    item                                                        |type      |dpt       |GA        |bindtype  |ETS Name
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------
    wurzel.zentral.klingelknopf                                 |      bool|         1|     0/3/5|knx_listen| in ETS => Globale Daten.Meldungen.Türklingel Klingeln
    wurzel.zentral.klingelknopf                                 |      bool|         1|     0/3/5|knx_send  | in ETS => Globale Daten.Meldungen.Türklingel Klingeln  
    
    Folgende GAs sind in ETS konfiguriert:
    ======================================================================
            GA|ETS Name                                                         |ETS Typ                            |#Items |       DPT|      Type|  BindType|Item
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------
        0/0/14|Gerätefehler Dimmaktor 4Kanal EG                                 |EIS 1 'Switching' (1 Bit)          |     1 |         1|      bool|knx_listen|wurzel.stoerungen.geraetefehlerDimmaktorEg
        0/0/15|Gerätefehler Dimmaktor 2Kanal EG                                 |EIS 1 'Switching' (1 Bit)          |     0 |       N/A|         ?|     knx_?|NICHT ALS ITEM ANGELEGT
    Damit ist zwar nur ein Teil des genannten TODOs gelöst, der für mich aber den größten Mehrwert brachte.

    Code:
        # todo
        # iterate through all items to find those who are either
        # in ETS defined but not existent in SmartHomeNG
        # not defined in ETS but existent in SmartHomeNG
        # those defined in both should be cross checked for plausibility according to the data point types
        # eg. a 1-Bit in ETS should match a boolean in SmartHomeNG
    
    
    ################## Hier einfügen ###############
    
        try:
            f = open(outfile, 'w')
            f.write(out)
        except IOError as e:
            logger.error("Error '{0}' writing file {1}".format(e, outfile))
        finally:
            f.close()
    hier ist nun meine Ergänzung:
    Code:
        out += nl+nl+"Folgende Items sind mit Bezug zu KNX konfiguriert:"+nl
        out += "="*70+nl
        
        max_len_id = 0
        for item in sh.return_items():
            len_id = len(item.id())
            if len_id > max_len_id:
                max_len_id = len_id
        
        fmtStrg = "{0:<" + str(max_len_id) + "}"
        
        out += fmtStrg.format("item")
        for ct in ("type", "dpt", "GA", "bindtype"):
            out += sep + "{0:<10}".format(ct)
        out += sep + "ETS Name"
        out += nl
        out += "-"*(max_len_id+98) +nl
        
        item_ga = {}
        
        for item in sh.return_items():
            item_prefix = fmtStrg.format(item.id())
            item_prefix += "{1}{0:>10}".format(item.type(), sep)
                
            if "knx_dpt" in item.conf:
                item_prefix += "{1}{0:>10}".format(item.conf["knx_dpt"], sep)
                item_num = 0
                
                for ct in ("knx_listen", "knx_init", "knx_cache", "knx_send", "knx_status", "knx_reply", "knx_poll"):
                    if ct in item.conf:
                        ele = item.conf[ct]
                        if isinstance(ele, list):
                            for ga in ele:
                                ets_name = ""
                                if ga in ets_ga:
                                    ets_name = ets_ga.get(ga).get('name')
                                    if ets_name:
                                        ets_name = " in ETS => {0}.{1}.{2}".format(ets_ga.get(ga).get('main'), ets_ga.get(ga).get('middle'), ets_name )
                                    else:
                                        ets_name = " in ETS unbekannt"
                                else:
                                    ets_name = " in ETS unbekannt"
    
                                to_add = {
                                    'item_path':item.id(),
                                    'item_type':item.type(),
                                    'dpt':item.conf["knx_dpt"],
                                    'bind_type':ct}
    
                                if ga not in item_ga:
                                    item_ga[ga] = []
                                item_ga[ga].append(to_add)
    
                                out += "{2}{1}{0:>10}{1}{3:<10}{1}{4}".format(ga, sep, item_prefix, ct, ets_name) + nl
                                item_num += 1
                        else:
                            ga = ele
    
                            ets_name = ""
                            if ga in ets_ga:
                                ets_name = ets_ga.get(ga).get('name')
                                if ets_name:
                                    ets_name = " in ETS => {0}.{1}.{2}".format(ets_ga.get(ga).get('main'), ets_ga.get(ga).get('middle'), ets_name )
                                else:
                                    ets_name = " in ETS unbekannt"
                            else:
                                ets_name = " in ETS unbekannt"
    
                            to_add = {
                                'item_path':item.id(),
                                'item_type':item.type(),
                                'dpt':item.conf["knx_dpt"],
                                'bind_type':ct}
    
                            if ga not in item_ga:
                                item_ga[ga] = []
                            item_ga[ga].append(to_add)
                            
                            out += "{2}{1}{0:>10}{1}{3:<10}{1}{4}".format(ga, sep, item_prefix, ct, ets_name) + nl
                            item_num += 1
                
                if item_num == 0:
                    out += "{2}{1}{0:>10}{1}{3:<10}{1}{4}".format(" ", sep, item_prefix, "- undef -", " ") + nl
                              
    
        out += nl+nl+"Folgende GAs sind in ETS konfiguriert:"+nl
        out += "="*70+nl
        
        max_len_ga = 0
        max_len_ga_tp = 0
        for ga in ets_ga:
            len_ga = len(ets_ga.get(ga).get('name'))
            len_ga_tp = len(ets_ga.get(ga).get('type'))
            if len_ga > max_len_ga:
                max_len_ga = len_ga
            if len_ga_tp > max_len_ga_tp:
                max_len_ga_tp = len_ga_tp
        
        fmt_string = "{0:>10}{1}{2:<"+str(max_len_ga)+"}{1}{3:<"+str(max_len_ga_tp)+"}{1}"
        
        header = fmt_string.format("GA", sep, "ETS Name", "ETS Typ")    
        header += "{5:>6} {0}{3:>10}{0}{4:>10}{0}{1:>10}{0}{2}".format(sep, "BindType", "Item", "DPT", "Type", "#Items") + nl
        
        out += header
        out += "-" * len(header) + nl
        
        for ga in sorted(ets_ga):
            ga_prefix = fmt_string.format(ga, sep, ets_ga.get(ga).get('name'), ets_ga.get(ga).get('type'))
            
            if ga in item_ga:
                item_list = item_ga.get(ga)
                item_list_len = len(item_list)
                for it in item_list:
                    out += ga_prefix + "{5:>6} {0}{3:>10}{0}{4:>10}{0}{1:>10}{0}{2}".format(sep, it.get('bind_type'), it.get('item_path'), it.get('dpt'), it.get('item_type'), item_list_len) + nl
            else:
                out += ga_prefix + "{5:>6} {0}{3:>10}{0}{4:>10}{0}{1:>10}{0}{2}".format(sep, "knx_?", "NICHT ALS ITEM ANGELEGT", "N/A", "?", 0) + nl
    Zuletzt geändert von jentz1986; 09.12.2018, 11:36. Grund: Formatierung
Lädt...
X