Ankündigung

Einklappen
Keine Ankündigung bisher.

Neue Logikbausteine für den L1/X1: Formelberechnung, Statistik und mehr...

Einklappen
Dieser Beitrag wurde beantwortet.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Moin André,

    Zitat von araeubig Beitrag anzeigen
    Wäre es technisch möglich
    - auf einen Eingang ein JSON-Array zu legen in der Form "{key1:"value2",key2:"value2"}" welches per Web-Request bereitgestellt wird
    - auf einen zweiten Eingang einen Integer-Wert

    um auf einem weiteren Ausgang die passende "value" des "keys" vom zweiten Eingang zu haben?

    Du möchtest einen Index angeben um den passenden Wert zu bekommen. Dazu ist die von Dir gewählte JSON-Darstellung eher unüblich (weil die keys ja eigentlich überflüssig sind; es zählt nur die Reihenfolge der Werte. Aber egal ...

    Im JSON-Parser musst Du zunächst die Werte als komma-separierte Liste ausgeben lassen. Für Dein Beispiel geht das mit:
    • Pfad: /root/*
    • Art der Pfadauswahl: Alle Treffer als verketteter Text
    • Text-Trenner: ,
    Dann bekommst Du z. B. für {"key1":"value1","key2":"value2","key3":"value3 "} folgende Ausgabe: value2,value2,value3

    Wenn Deine Eingabe als JSON-Array daher kommt: ["value1","value2","value3"]​, dann funktioniert das immer noch (weil die Keys ohnehin ignoriert werden).

    In jedem Fall kannst Du die komma-separierte Liste mit einer Formelberechnung weiter verarbeiten:
    • Typ des Ausgangs: STRING
    • Formel: {CommaSeparated:S}.Split(',')[{Index:I}]
    Et voilá ...

    Schwieriger wird's, wenn Du statt dem Index einen textuellen Key angeben willst – da fällt mir auf Anhieb keine Lösung ein.

    Grüße von Horst
    Zuletzt geändert von hyman; 18.02.2024, 16:19.

    Kommentar


      Zugriff über textuellen Key geht auch:

      KeyValue.png

      Das wäre weniger aufwändig, wenn der XML/JSON-Parser XPath 2.0 unterstützen würde. Dann käme man nämlich sehr einfach an eine komma-separierte Liste der Keys ...

      Da wir das nicht haben, müssen wir uns die Key-Liste mit einer wilden Regular-Expression-Ersetzung zusammenfummeln (Formel 1):

      System.Text.RegularExpressions.Regex.Replace({Keys Xml:S}, "<[^<]*</", "").Replace('>',',')

      Dabei bleibt am Ende ein Komma zu viel stehen, was in Formel 2 zu einem Leerstring als überflüssigem letzten Key im Array führt. Wir gleichen das aus, indem wir beim Suchen nach einem Leerstring als Key den ungültigen Index -1 zurückgeben (den IndexOf auch im Fall des Nichtauffindens des Keys zurück gibt):

      ({Key:S}.Length > 0) ? Array.IndexOf(_out1_.Split(','), {Key:S}) : -1

      Die Formel 3 kommt uns teilweise schon aus dem vorigen Beitrag bekannt vor. Nur kommt ihr Index jetzt nicht mehr von einem Eingang, sondern aus Formel 2 und wird vor Verwendung auf Gültigkeit geprüft:

      (_out2_ < 0) ? "" : {CommaSeparated:S}.Split(',')[_out2_]

      Ist der Index ungültig, gibt der Ausgang einen Leerstring aus.
      Zuletzt geändert von hyman; 18.02.2024, 16:32.

      Kommentar


        Zitat von hyman Beitrag anzeigen
        Zugriff über textuellen Key geht auch
        Der absolute Hammer !!!!

        Probiere gerade mal ein paar Varianten aus. Kann ich auch irgendwie die Anzahl der Elemente in dem String ermitteln? Also eine Art "count(array)"?

        Screenshot (790).png

        Kommentar


          hyman

          Habe es herausgefunden mit GetLength: "{keys}.Split(',').GetLength(0)" liefert mir die Anzahl der Element im Array.

          Deine Bausteine sind einfach absolut mega!!!

          Kommentar



            Zitat von hyman Beitrag anzeigen
            Zugriff über textuellen Key geht auch:
            Deine Umsetzung funktioniert perfekt -> jetzt habe ich allerdings das Problem, dass die Keys zwar im JSON als String enthalten sind aber keinen Text enthalten:



            Screenshot (791).png

            und dann generiert mir der Parser ein unbrauchbares Ergebnis. Hast Du noch eine Idee?

            Kommentar


              Ja, siehe Post #155 hier im Thread, dort unter "Das zweite ...".
              Zuletzt geändert von hyman; 20.02.2024, 21:36.

              Kommentar


                hyman

                Guten Abend Horst, wie Du vielleicht in dem Thread "Webservices....." schon gelesen hast, bin ich ein gutes Stück weiter gekommen.
                • - Daten werden vom Server abgeholt und mit Hilfe des XML/JSON-Parsers und des Textformatierers für die Formelberechnung aufbereitet.
                • - Die Formelberechnung baut mir mit Deinen Hinweisen nun aus dem JSON:
                  • die "Keys" welche ich zur Weiterverarbeitung benötige
                  • die "Values" welche ich zur Anzeige nachher in der X1-Funktion "Audiosteuerung" für die <Playlists> benötige
                  • ich benötige aber noch die <aktuell laufende Playlist als Name> und möchte gerne auf Basis der JSON-Daten "Active" (wird als Key übergeben) in den Values suchen... -> mit "System.Array.FindIndex(({Keys}.Split(';')),'3 7')" und unzähligen Varianten davon habe ich es probiert, komme aber zu keiner Lösung ohne Fehlermeldung - es liegt irgendwie immer an dem nicht gesetzten Datentyp dieser Funktion. Kannst Du mir da helfen?

                Screenshot (812).png Screenshot (813).png

                Kommentar


                  Leider ist Deine Fragestellung nicht ganz klar. Wenn ich das richtig verstehe, benötigst Du den Index, an dem in einem Array ein bestimmter Wert steht. Dafür ist FindIndex nicht so richtig geeignet (weil Du eine Funktion oder ein Lambda brauchst, um die Elemente zu qualifizieren). Array.IndexOf sollte dafür die einfachste und damit richtige Methode sein.
                  Zuletzt geändert von hyman; 06.03.2024, 18:16.

                  Kommentar


                    Zitat von hyman Beitrag anzeigen
                    einfachste und damit richtige Methode
                    Hallo Horst,

                    mega - es funktioniert perfekt. Vielen Dank. Deine "Hints" sind Gold wert und helfen sich nach und nach ein wenig mehr mit dem Thema C# zu beschäftigen. Werde das Logikblatt nun fertigstellen und Dir und Euch ein Bildschirm-Video davon machen, um zu zeigen was mit dem X1 und Deinen Bausteinen möglich ist.

                    Merci und Gruss André

                    Kommentar


                      So nun habe ich die in der Simulation funktionierende Lösung live gestellt und es geht leider nicht. Der X1 meldet mir "'37' is not a valid XML Name"

                      Das ist das Ergebnis der Webabfrage:

                      {"playlists":{"37":"Menschen","56":"Dinge","17":"G eschichten","2":"Sammlungen","78":"Porträts (Frauen)","14":"Sensual"},"active":"37","state":"1 ","display":"1"}

                      und das sind die Formeln im XML/JSON-Parser. Ich denke, dass es wieder mit den Keys zu tun hat - aber wie kann ich es sonst lösen? Das JSON ist ja absolut korrekt.

                      Screenshot (903).png

                      Kommentar


                        Hi,
                        ich nutze den Textformatierer und die Formelberechnung ja schon lange an diversen Stellen, daher zunächst noch mal ein Riesendankeschön an hyman für die super Bausteine, ohne die hätte ich meine Visu überhaupt nicht so gut hinbekommen.

                        Jetzt habe ich aber mal wieder eine neue Herausforderung und zwar bekomme ich von einem Baustein einen Timestamp zurück. Dazu habe ich in der (sehr guten) Doku auch schon die passende Konvertierung gefunden:
                        (new DateTime(1970,1,1,0,0,0,0,DateTimeKind.Utc)).AddSe conds({unixUtcTimestamp:I}).ToLocalTime().ToString ()​
                        Das sind im GPA auch super aus (also z.B. "13.03.2024 12:58:00") aber in die X1-App (auch auf dem G1) macht daraus 03/13/2024.

                        Ich dachte, dass mir da der ebenfalls in der Doku enthaltene Tipp "in Typ-Konverter, der aus Text einen Datenpunkt vom Typ "Datum und Uhrzeit" erzeugen kann. Dazu verwendet man zweckmäßig folgenden Parameter im letzten Funktionsaufruf der Formel: ...ToString("s") . (Ohne diesen werden evtl. Tag und Monat vertauscht, weil der Gira-Typ-Konverter das Textformat nicht richtig erkennt.)​" hilft, also habe ich
                        (new DateTime(1970,1,1,0,0,0,0,DateTimeKind.Utc)).AddSe conds({unixUtcTimestamp:I}).ToLocalTime().ToString ("s")
                        verwendet, doch das macht es leider noch schlimmer:
                        2024-03-13T13:00:47

                        Hat jemand einen Tipp für mich, wie ich in der App und auf dem G1 am besten folgendes Format bekomme:
                        ​13.03.2024 13:01
                        ​(zur Not auch mit Sekunden, das wäre nicht so störend)

                        Danke und Gruß
                        Martin

                        UPDATE:
                        Ein bisschen Google und herumprobieren im Simulator hat geholfen ;-). Hier das Ergebnis, das für mich das richtige Ergebnis bringt:
                        (new DateTime(1970,1,1,0,0,0,0,DateTimeKind.Utc)).AddSe conds({unixUtcTimestamp:N}).ToLocalTime().ToString ("dd.MM.yyyy HH:mm")
                        Zuletzt geändert von martiko; 13.03.2024, 13:49.

                        Kommentar


                          Ich versuche gerade, den Logikbaustein "Verbesserte Standardbausteine sowie Statistikfunktionen auch für Zeitreihen V 1.3.10" zu integrieren. Leider erhalte ich die Meldung "Die Datei ist keine gültige Logikbaustein-Paketdatei", die hier zwar schon mal jemand hatte, aber es wurde keine Lösung gepostet. Ich finde auch keine Anleitung zur Installation. Mache ich vielleicht was falsch?
                          1. GPA 5.0.1 öffnen
                          2. Logik-Editor öffnen
                          3. Logikbausteine hinzufügen
                          4. ZIP auswählen
                          Vielen Dank im Voraus...

                          Edit 1: Bei dem Visu-Baustein kommt die gleiche Meldung.

                          Edit 2: Lösung: Die Zip Datei entpacken, denn darin ist noch eine andere Zip-Datei enthalten. 🙈
                          Zuletzt geändert von Flommm; 24.03.2024, 20:48.

                          Kommentar


                            ... und genau das steht auch schon in Post #1:

                            Zitat von hyman Beitrag anzeigen
                            1. Das jeweilige Bausteinpaket (ID 20000010 oder 20000011; Download-Links unten) herunterladen.
                            2. Das erhaltene Zip-Archiv auspacken: Man erhält 3 HTML-Dateien und ein weiteres Zip-Archiv. Dieses bitte nicht weiter auspacken, sondern...
                            3. ... im GPA mit der Schaltfläche Logikbausteine hinzufügen (im Logik-Editor) importieren.

                            Kommentar


                              Guten Tag,

                              vielen Dank für diese tollen Bausteine die ich schon an verschiedenen Stellen nutze.

                              Aktuell habe ich die Anforderung eine Drittanbieter-Beschattungsanlage ins KNX einzubinden.
                              Diese bietet eine Rest API nach folgendem Muster.

                              http://192.168.178.xxx:8081/shadeCom...Id=2&target=50

                              Wobei target=50 natürlich für eine Beschattung von 50% steht.

                              Wie wäre es denn möglich mit dem Textformatierer eine KNX Dezimalwert vom Bus in diesen Query-Parameter zubekommen?

                              Oder wäre es sinnvoller dies über den WebRequest Node abzubilden? Hier bestünde aber das Problem das der Trigger vom Typen nicht passt.

                              Entschuldigt bitte die Anfänger Fragen. Für Hilfe wäre ich sehr dankbar.

                              shadeCommand.png

                              Kommentar


                                Zitat von Kingpin3k Beitrag anzeigen
                                Oder wäre es sinnvoller dies über den WebRequest Node abzubilden?
                                Würde ich so machen.

                                Zitat von Kingpin3k Beitrag anzeigen
                                Hier bestünde aber das Problem das der Trigger vom Typen nicht passt.
                                Dafür gibt's den Typkonverter, der sich auch an jeden Ausgang konfigurieren lässt.

                                Kommentar

                                Lädt...
                                X