Ankündigung

Einklappen
Keine Ankündigung bisher.

Generator für .conf-Files

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

    Generator für .conf-Files

    Hi allerseits,

    ich wollte mal vorstellen, was ich bei mir alles gemacht habe, um bei sh.py den Überblick zu behalten. Das ist jetzt etwas länger

    Ich habe ab ca. 600 Items festgestellt, dass quasi jede Änderung in irgendwelchen .conf-Files dazu geführt hat, dass durch Seiteneffekte irgendetwas anderes kaputt gegangen ist. Da dieses erst beim starten von sh.py festgestellt werden kann (wenn es schlecht läuft, auch erst viel später durch Laufzeitfehler), kann es passieren, dass es sehr lange dauert, bis sh.py wieder richtig läuft.
    Mein Ziel war es, die Down-Zeit von sh.py möglichst kurz zu gestalten, so dass man möglichst viele Fehler vorher rausbekommt. Ferner sollte das Editieren von .conf-Files auch einfacher und übersichtlicher werden.
    Herausgekommen ist ein .conf-Generator, der folgende Features hat:
    • Erzeugt korrekte und gut formatierte .conf-Files
    • Erkennt einige Fehler bereits beim editieren:
      • Tippfehler bei Item-Eigenschaften
      • Formatfehler bei Werten (z.B. dass die KNX-GA korrekt geschrieben ist)
    • Eingabeunterstützung (code completion) für bekannte Item-Eigenschaften (auch für einige plugins)
    • Eingabeunterstützung für aufzählbare Werte (true, false, KNX-DPT, Item-type etc.)
    • Kurzdoku (als Tooltip) für jede bekannte Item-Eigenschaft (leider nicht auch für die Werte von enums, das kann json-Schema noch nicht)
    • Überprüfung von Item-Referenzen (ist noch unvollständig)
    • Relative Adressierung von Items
    • Outline (zusammenklappen von Items mit allen Unteritems - für Übersichtlichkeit)
    • Templates (bestimmte Item-Kombinationen können als Template abgelegt werden und dann von mehreren Stellen referenziert werden, z.B. für Rolladen, Lüftung, Heizung etc)
    • Die Angaben in Templates können durch lokale Werte immer übersteuert werden
    • Es können auch Templates in Templates genutzt werden
    • Mehrzeilenfähigkeit für einige Eigenschaften (z.B. sv_widget, eval_trigger, ...)
    • Wenn ein ETS4 Projekt vorliegt, dann erzeugt mein Konverter noch 4 Info-Files
      • Alle GA aus der ETS mit deren Beschreibung
      • Alle GA aus allen .conf-Files mit dem Item-Pfad zur GA
      • Alle GA, die in der ETS sind, aber in smarthome fehlen
      • Alle GA, die in smarthome sind, aber in der ETS fehlen
      • Alles ist nach GA sortiert und lässt sich gut vergleichen

    Es gibt auch einige Nachteile bzw. Voraussetzungen:
    • Nur unter Windows lauffähig
    • Die Editier-Features sind nur mit einem Schemabasierten json-Editor zu nutzen, mir ist derzeit nur der Visual Studio Editor bekannt
    • Stark gewachsenes Coding, sicherlich so nicht publizierbar (da kann man aber was dran machen...)
    • Unvollständig (sollte um User- und Plugin-Eigenschaften erweiterbar sein)
    • Um die überprüfbarkeit durch ein json-Schema zu ermöglichen, musste ich die Möglichkeiten in den .conf-Files einschränken
      • Alle Items müssen mit einem Großbuchstaben beginnen
      • Alle Eigenschaften mit einem kleinbuchstaben
    • Bei Templates werden derzeit nur KNX-Adressen angepasst, weiteres wäre denkbar, habe ich aber noch nicht gebraucht
    • Für das Templating braucht man eine sehr regelmäßige GA-Struktur in der ETS (ist nicht wirklich ein Nachteil, aber eine Voraussetzung)
    • es gibt derzeit keinerlei Integration mit den Logik-Files, das ist noch immer eine große Fehlerquelle
    • Keinerlei Doku - das müsste man definitiv auch ändern!

    Mehr fällt mir derzeit nicht ein... vielleicht später...

    Wie bin ich vorgegangen: Erstmal wollte ich einfacher editieren können. Auf json-Schema kam ich durch meine Arbeit, damit kann man schon mal die syntaktische Korrektheit verifizieren, bevor man etwas auf den smarthome server deployed. Natürlich ist json als Eingabe auf den ersten Blick aufwändiger zu schreiben als die .conf-Files, und mit einem notepad-Ansatz hätte ich hier wohl auch nicht weiter gemacht. Aber in Visual Studio 2015 (auch in der kostenlosen Version) ist ein sehr guter json-Editor, der schemabasierte Eingaben erlaubt und all die Features hat, die man von einem komfortablen Editor erwartet: Syntax Highlighting, Code completion, Outline, Verifikation bei editieren. Es ist unglaublich, wie wenig man tippen muss, um korrektes json zu erhalten.

    Da die config-Files jetzt in json da waren, brauchte ich einen Konverter json2conf, der mir .conf-Files erzeugt. Da ich sowieso konvertieren musste, konnte ich gleich relative Adressierung von Items einbauen. Damit konnte man schnell mal einen Block von A nach B kopieren und die Item-Adressen stimmten immer noch. Sobald relative Adressierung da war, habe ich sehr schnell gemerkt, dass man sich dabei genau so oft vertut wie bei absoluten Adressen - nur eben bei anderen Editier-Aktionen. Also habe ich eine Verifikation eingebaut, die alle aufgelösten relativen Adressen auf Existenz überprüft und als Fehler meldet. Von hier war es dann nur ein kurzer Weg, die Item-GA rauszufinden und mit der ETS zu vergleichen.

    Mir ist bei meinen .conf-Files aufgefallen, dass sich bestimmte Item-Gruppen immer wieder wiederholen. Rollos, Temperatur, Luftfeuchte, Licht und Präsenz habe ich immer! Teilweise kommen noch Sachen wie Lüftung, Audio, Video, Tablet hinzu, die in bestimmten (aber mehreren) Räumen sind. Und wenn man schon einen Generator mit einer relativen Adressierung hat, kann man auch sich wiederholende Item-Gruppen generieren lassen - bei mir haben sie sich primär durch die KNX-Adressen und die Item-Namen unterschieden. Also habe ich eine kleine Template-Engine geschrieben, die ein Template (Datei mit einer Item-Struktur, so gesehen ein Teil-Conf-File) einliest, darin die KNX-GA ersetzt und in die aktuelle Datei einsetzt. Das Ganze geht rekursiv (Template in Template). In der Ziel-Datei kann man jedes Item, das aus einem Template kommt, überschreiben oder löschen. So kann man im Template die Grundfunktion haben, der Template-Verwender kann aber diese Grunfunktion ändern oder erweitern (oder auch Teile davon löschen, das ist aber noch nicht durchgängig).

    Tja, das wars. Mein Hauptziel ist erreicht: Wenn ich alle Editier-Fehler im json bereinigt habe, dann noch alle Fehler, auf die mich der Konverter hinweist, dann kann ich die generierten .conf-Files auf den smarthome server deployen, kurz
    Code:
    smarthome.py -s
    smarthome.py -v
    machen und das System läuft. Natürlich bewahrt mich das nicht vor Logik-Fehlern, falschen evals etc. Aber es bewahrt mich vor Tippfehlern und falschen Item-Referenzen, was gerade bei Kopieroperationen viel ausmacht.
    Ein anderer Vorteil kommt durch das Templating. Ich bin inzwischen bei ca. 2000 Items, alle .conf-Files zusammen haben 11048 Zeilen und werden aus gerade mal 3601 Zeilen json generiert.
    Code:
    admin@smarthome:/usr/smarthome/items$ cat *.conf | wc -l
    11048
    admin@smarthome:/usr/smarthome/items$ cat *.json | wc -l
    3601
    Trotz 3.5 mal mehr Items haben sich die Probleme durch fehlerhaftes Deployment drastisch reduziert und die Übersicht ist (meiner Meinung nach) stark gestiegen.

    Ich bin mir nicht sicher, ob es Interesse für diese sicherlich sehr individuelle Lösung gibt, ich könnte mir aber vorstellen, dass das json-Schema schon einen Wert hat - und wenn jemand einen Konverter in einer anderen Sprache will, in .NET sind das gerade mal 700 Zeilen code, das könnte man dann ja portieren. Neben Visual Studio als schemabasierten json-Editor soll das auch Visual Studio Code unterstützen, das konne ich aber mangels aktuellem Linux nicht ausprobieren.

    In Zukunft werde ich den Generator noch dahingehend erweitern, dass die SmartVisu-Seiten auch noch aus dem json generiert werden. Derzeit nutze ich die Standard-Generierung von sh.py, aber die ist mir zu eingeschränkt und ich habe sie auch schon an 2 Stellen erweitern müssen... im eingenen Coding geht so was dann besser und schneller.

    Bei Interesse können wir hier im Thread diskuttieren, wie man das Ganze verfügbar machen könnte und wie die (nicht vorhandene) Doku aussehen müsste.

    Ich habe auch ein Video vom Editing aufgenommen, ich bekomme es aber hier nicht hochgeladen, da zu groß (6 MB, man darf nur 1 MB). Deswegen hier: https://drive.google.com/file/d/0B0H...ew?usp=sharing

    Gruß, Waldemar




    OpenKNX www.openknx.de

    #2
    Hi Waldemar,
    das hört sich klasse an. Schaue ich mir sehr gerne an, habe aktuell > 3200 Items und kann Deine Beobachtung nur bestätigen. Werde berichten,muß mir allerdings erst mal das Visual Studio Zeugs installieren.
    Cheers,
    Oliver

    Kommentar


      #3
      Hi Oliver,

      bevor es Missverständnisse gibt: Ich habe noch nichts veröffentlicht, in meinem Download ist nur ein kleines Video, dass eine Edit-Session mit dem Visual Studio Editor zeigt. Da Du Interesse hast, stelle ich das gerne zur Verfügung, aber derzeit bezieht sich der Konverter auf fest programmierte Dateipfade, das geht dann bei Dir gar nicht. Deswegen brauche ich noch 2-3 Abende, um das vernünftig zu machen => frühestens Samstag.

      Falls Du trotzdem vorher schon Visual Studio installieren willst:
      Du brauchst unbedingt Visual Studio 2015 (das ist das neueste, bisher nur als RC - also Release Candidate - final gibt es das erst ab dem 20.7.). Es reicht die kostenlose Community Edition, die gibt es hier: https://www.visualstudio.com/en-us/d...nloads-vs.aspx. Bei der Installation muss bei den "Optionalen Features" unbedingt ein Haken bei "Microsoft Web Developer Tools" an sein (war aber bei mir der Default).

      Und - bevor Du Dir vielleicht überflüssige Mühe machst: Das Ganze beruht darauf, dass Item-Namen mit einem Großbuchstaben beginnen, alle anderen Eigenschaften klein. Nur so konnte ich im json-Schema die Bedingungen für die Überprüfung ausdrücken. Überleg Dir, ob Du wirklich 3200 Items umstellen willst?

      Der Rest dann am Samstag oder Sonntag,
      Gruß, Waldemar

      P.S.: Ich bewundere Dich, dass Du 3200 Items mit "normalen" .conf-Files durchgehalten hast. Aber ich komme auch noch da hin...
      OpenKNX www.openknx.de

      Kommentar


        #4
        Hi Waldemar,
        danke für das Feedback. Bin aktuell auch gerade unterwegs und hatte daher den DL noch nicht angeschaut. Schaue mir das Video aber dennoch gerne an, denn die Idee klingt klasse. Naja, die Items kamen so Zug um Zug durch Copy&Paste, also nicht wirklich eine Leistung. Manchmal aber eine Herausforderung die richtige Struktur anzulegen damit man effizientes C&P machen kann. Dabei ist mir dann leider auch schon öfter die Hierarchie durcheinandergekommen mit der Konsequenz das nicht alle Items eingelesen worden sind. Ist inzwischen Dank der Nachjustierungen von Marcus dann aber auch kein Beinbruch mehr, denn mit der Version im Dev. werden ja in so einem Fall zum einen die Daten nicht mehr aus der SQL gelöscht und zum anderen wird einem im Log beim Start immer die Gesamtanzahl angezeigt....

        Cheers,
        Oliver

        Kommentar


          #5
          Hi Waldemar,
          ich stehe auch schon in den Startlöchern...das Studio wird gerade installiert.
          VG
          Jürgen

          Kommentar


            #6
            Ok, jetzt hab ichs auch gefunden. Schließe mich an, werde aber wohl erst Anfang August dazu kommen.

            Kommentar


              #7
              Hallo,

              super Sache. Das hätte mir schon viel Zeit gespart!

              Gruß,
              Hendrik

              Kommentar


                #8
                Hi allerseits,

                ich habe eine gute und eine schlechte Nachricht:
                1. Der User Sandmann60 hat mir netterweise seine .conf-Files zugeschickt, um zu schauen, wie mein Generator damit zurecht kommt. Und da es >3000 Items sind, wollte ich eine solche Test-Quelle nicht ignorieren. Da ich aber so viele Items nicht manuell von conf nach json wandeln wollte, habe ich mich dieses WE nicht mit der Doku, sondern mit einem conf2json-Konverter beschäftigt. Und anschließend noch mit der Verbesserung meines json2conf-Konverters . Das war die "schlechte" Nachricht, da ich sicherlich heute nicht das Projekt veröffentlichen kann.
                2. Die gute Nachricht: Mit dem conf2json kann man jetzt einfach ein conf-File nach json bekommen, um anschließend mit json weiter zu machen. Die Konvertierung ist nicht perfekt, man muss einige manuelle Nacharbeiten machen, aber es ist wesentlich weniger, als wenn man alles manuell machen müßte . Das werde ich dann auch noch versuchen zu beschreiben.
                Ich werde im laufe der Woche die Doku schreiben und dann das ganze Paket hier einstellen.
                Gruß, Waldemar
                OpenKNX www.openknx.de

                Kommentar


                  #9
                  Hi Waldemar
                  Gibt es schon was neues zu deinen Tools?

                  ---
                  Martin

                  Kommentar


                    #10
                    Hi,

                    da meldet sich mal wieder das schlechte Gewissen...

                    Sorry, ist/war Urlaubszeit und Dachbodenausbau - bis seit Sonntag erst wieder zurück. Eigentlich wollte ich schon Ende Juli was reinstellen, aber die zip's waren zu groß, um als Anhang hier rein zu können.

                    Langer Rede kurzer Sinn: Ich werde erst am WE wieder zu etwas kommen, da werde ich mir irgendwo etwas Webspace besorgen, das entsprechend hochladen und den Link hier reinstellen. Danke für die Erinnerung...

                    Gruß, Waldemar
                    OpenKNX www.openknx.de

                    Kommentar


                      #11
                      Du kannst auch gerne von mir etwas Webspace bekommen. Kein Thema.
                      ---
                      Martin

                      Kommentar


                        #12
                        Bin auch schon gespannt...
                        Geniale Menschen sind selten ordentlich, ordentliche selten genial. (Albert Einstein)

                        Kommentar


                          #13
                          Hi,

                          auch wenn es später geworden ist... besser spät als nie. Ich habe das derzeitige Projekt mal auf mein GoogleDrive hochgeladen, ihr könnt es über den folgenden Link runter laden: https://drive.google.com/file/d/0B0H...ew?usp=sharing

                          Die Doku findet ihr im Konverter.zip\json2conf\Docu-Verzeichnis, es gibt 3 Teile:
                          1. InitialSetup.pdf - beischreibt wie das Ganze aufzusetzen ist
                          2. Arbeiten mit json2conf.pdf - beschreibt einen normalen "roundtrip" beim Arbeiten mit dem Projekt
                          3. smarthome.json.pdf - beschreibt den "Sprachumfang" der json-Notation.
                          Ich hoffe, dass alles klar genug beschrieben ist. Fragen bitte hier ins Forum, dann hat jeder was davon!

                          Gruß, Waldemar
                          OpenKNX www.openknx.de

                          Kommentar


                            #14
                            erst mal großes Danke für die Tolle arbeit!!!

                            Installation und Setup haben soweit funktioniert (Win 10 pro - 64 bit in einer vm)
                            als ich die "arbeiten mit josn2conf.pdf" durchprobiert hab erhalte ich beim start des Debuggers immer folgenden Fehler


                            util-cs.png

                            Code:
                            System.FormatException wurde nicht behandelt.
                              HResult=-2146233033
                              Message=Die Eingabezeichenfolge hat das falsche Format.
                              Source=mscorlib
                              StackTrace:
                                   bei System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
                                   bei System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
                                   bei System.Int16.Parse(String s, NumberStyles style, NumberFormatInfo info)
                                   bei System.Convert.ToInt16(String value)
                                   bei json2conf.Util.Compare(String x, String y) in C:\Develop\Konverter\json2conf\Util.cs:Zeile 53.
                                   bei System.Collections.Generic.SortedDictionary`2.KeyValuePairComparer.Compare(KeyValuePair`2 x, KeyValuePair`2 y)
                                   bei System.Collections.Generic.SortedSet`1.FindNode(T item)
                                   bei System.Collections.Generic.SortedSet`1.Contains(T item)
                                   bei System.Collections.Generic.SortedDictionary`2.ContainsKey(TKey key)
                                   bei json2conf.ConvertJson2Conf.OutputPropertyValue(JProperty iProperty, Boolean iNewLine, String iValue) in C:\Develop\Konverter\json2conf\ConvertJson2Conf.cs:Zeile 287.
                                   bei json2conf.ConvertJson2Conf.OutputSimpleProperty(Int32 iLevel, JProperty iProperty, Boolean iNewLine, String iValue, Boolean iAsComment) in C:\Develop\Konverter\json2conf\ConvertJson2Conf.cs:Zeile 269.
                                   bei json2conf.ConvertJson2Conf.Conversion(JObject iJson, Int32 iLevel) in C:\Develop\Konverter\json2conf\ConvertJson2Conf.cs:Zeile 186.
                                   bei json2conf.ConvertJson2Conf.Conversion(JObject iJson, Int32 iLevel) in C:\Develop\Konverter\json2conf\ConvertJson2Conf.cs:Zeile 222.
                                   bei json2conf.ConvertJson2Conf.Conversion(JObject iJson, Int32 iLevel) in C:\Develop\Konverter\json2conf\ConvertJson2Conf.cs:Zeile 222.
                                   bei json2conf.ConvertJson2Conf.Conversion(JObject iJson, Int32 iLevel) in C:\Develop\Konverter\json2conf\ConvertJson2Conf.cs:Zeile 222.
                                   bei json2conf.ConvertJson2Conf.Conversion(JObject iJson, Int32 iLevel) in C:\Develop\Konverter\json2conf\ConvertJson2Conf.cs:Zeile 222.
                                   bei json2conf.ConvertJson2Conf.Initialize(JObject iJson, String iFileName) in C:\Develop\Konverter\json2conf\ConvertJson2Conf.cs:Zeile 26.
                                   bei json2conf.ConvertJson2Conf..ctor(FileInfo iFile) in C:\Develop\Konverter\json2conf\ConvertJson2Conf.cs:Zeile 32.
                                   bei json2conf.Program.Main(String[] args) in C:\Develop\Konverter\json2conf\Program.cs:Zeile 22.
                                   bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
                                   bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
                                   bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
                                   bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
                                   bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
                                   bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
                                   bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
                                   bei System.Threading.ThreadHelper.ThreadStart()
                              InnerException:
                            hab ich vielleicht was flasch gemacht?

                            Christian

                            Kommentar


                              #15
                              Hi,

                              wahrscheinlich hast Du nichts falsch gemacht... ich habe sicherlich noch nicht alle Exceptions sinnvoll abgefangen. Aus der Programmstelle vermute ich ein falsches GA-Format. Du müsstest mir sagen, welchen Wert die Parameter x bzw. y haben. Die Werte siehst Du, wenn Du mit der Maus über das x bzw. y kurz verweilst (in dem oberen Fenster). Ich meine die Programmstelle
                              Code:
                              public int Compare(string x, string y) {
                              Und - falls Du nur ein json file übersetzt, wäre das File auch interessant (gerne auch per PM, falls Dir das zu public sein sollte).

                              Gruß, Waldemar
                              OpenKNX www.openknx.de

                              Kommentar

                              Lädt...
                              X