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

    Zitat von Wehner123 Beitrag anzeigen
    Vielleicht findet sich ja jemand, der einen LBS schreibt, der aus einem CSV (Comma Seperated Values) -string einen sortierten (wahlweise auf- und abwärts) macht.
    EInfacher wär wahrscheinlich, ich bau' eine entprechende Funktion in die Formelberechnung ein ... oder jemand anders erbarmt sich, der Quellcode ist ja offen.

    Jedenfalls hab ich für beide hier gefundenen Punkte in Github mal entsprechende Tickets auf gemacht:

    Kommentar


      Zitat von Paddo5819 Beitrag anzeigen
      hat jemand in der Formelberechnung den Typ Hlk.AbsHumidity im Einsatz? Ein Beispiel wäre super, ich scheitere an den Definitionen...


      Welche Definitionen sind Dir unklar? Vielleicht hilft dieser Betrag schonmal etwas weiter ...
      Zuletzt geändert von hyman; 03.11.2023, 17:52.

      Kommentar


        Gestern und heute hatte ich etwas Zeit, die beiden neulich eingegebenen Tickets anzugehen. Folgende Erweiterung der Formelberechnung ist dabei raus gekommen:

        Funktionen zur Verarbeitung von Daten in eindimensionalen Feldern

        Als Quellen für zu verarbeitende Datenfelder dienen meist Web-Abfragen, oft in Verbindung mit einer Datenauswahl aus XML- oder JSON-Antworten.

        .NET 4.0 stellt in den String- und Array-Klassen Methoden bereit, mit denen sich eindimensionale Felder von Zahlen oder Texten erzeugen und weiter verarbeiten lassen. Die Methoden der Erweiterungsklasse Data ergänzen diese so, dass mehrere Verarbeitungsschritte in einem Ausdruck auch in solchen Fällen möglich werden, wo dies allein mit .NET nicht möglich wäre:
        Data.ConvertDoubles(input) string[] → double[] Vereinfacht gegenüber der .NET-Methode Array.ConvertAll, ein Feld von Textstrings in ein Feld von Fließkommazahlen zu konvertieren, wenn dabei . als Dezimaltrennzeichen und ggf. , als Gruppentrennzeichen interpretiert werden soll.
        Data.Sort(values,
        comparer)
        values: Eindimensionales Feld

        comparer: optionaler Lambdaausdruck zur Festlegung der Sortierreihenfolge (aufsteigend falls nicht gegeben)
        Sortiert das gegebene Feld von Werten aufsteigend (wenn kein comparer gegeben ist) oder gemäß der vom comparer gegebenen Ordnung.

        Im Gegensatz zur .NET-Methode Array.Sort besteht gibt siese Methode das sortierte values-Feld auch zurück. Dadurch kann es im gleichen Ausdruck weiter verarbeitet werden.
        Data.Join(separator,
        values,
        startIdx,
        length)
        separator: string

        values: Eindimensionales Feld

        startIdx: erstes auszugebendes Element (falls nicht gegeben: 0)

        length: Anzahl der auszugebenden Elemente (falls nicht oder zu groß gegeben: alle bis zum Ende des Felds)
        Verkettet Werte des gegebenen Feldes values zu einem Ausgabe-Textstring, indem die einzelnen Werte formatiert und durch den gegebenen separator voneinander getrennt werden.

        Anders als mit der .NET-Methode Array.Join
        • werden dabei Fließkommazahlen ohne Gruppentrennzeichen und mit . als Dezimaltrennzeichen formatiert,
        • kann mit den optionalen Parametern startIdx und length wahlweise nur ein Teil der Feldelemente ausgegeben werden.
        Da Datenfeld-Typen für Ausgänge des Bausteins nicht direkt verwendbar sind, muss die letze Operation auf einem Feld immer einen zulässigen Ausgabetyp erzeugen. In Frage kommen dafür vor allem:
        1. Auswahl eines einzelnen Werts mit dem Indexoperator [n],
        2. Verkettung mehrerer Werte zu einem Textstring mit einer der Join-Varianten.
        Die zweite Variante erlaubt auch, ein Feld in einer nachfolgenden Formel weiter zu verarbeiten, indem der Text dort zunächst wieder in ein Feld konvertiert wird.

        Beispiel 1: Ausgabe des zweitgrößten Werts einer Zahlenmenge

        Data.Sort( Data.ConvertDoubles({text:S}.Split(';')), (a, b) => b.CompareTo(a) ) [1]
        Die verwendeten Funktionen im Einzelnen:
        • {text:S}.Split(';') zerlegt den Eingabetext anhand der darin enthaltenen Trennzeichen ; in ein Feld von Texten
        • Data.ConvertDoubles(...) erzeugt daraus ein Feld von Fließkommazahlen
        • Data.Sort(...) sortiert dieses Feld ...
        • ... wobei der Lambdaausdruck (a, b) => b.CompareTo(a) die Elemente in absteigender Reihenfolge anordnet
        • Der Indexoperator ... [1] wählt aus dem Feld das zweite, also zweitgrößte Element aus
        Beispiel 2: Ausgabe der drei kleinsten positiven Ganzzahlen einer Zahlenmenge

        Data.Join( ", ", Data.Sort( Array.FindAll( Array.ConvertAll({text:S}.Split(','), int.Parse), x => (x > 0) ) ) , 0, 3 )
        Die verwendeten Funktionen im Einzelnen:
        • {text:S}.Split(',') zerlegt den Eingabetext anhand der darin enthaltenen Trennzeichen , in ein Feld von Texten
        • Array.ConvertAll(..., int.Parse) erzeugt daraus ein Feld von Ganzzahlen
        • Array.FindAll( ..., x => (x > 0) ) wählt aus dem Feld mit dem Lambda-Operator alle positiven Elemente aus
        • Data.Sort( ... ) sortiert diese positiven Werte aufsteigend
        • Data.Join( ", ", ..., 0, 3 ) formatiert die ersten bis zu drei Zahlen des verbleibenden Feldinhalts als Komma-separierten Text
        Zuletzt geändert von hyman; 28.11.2023, 08:08. Grund: Bausteinpaket in der Version 1.6.1 ist jetzt freigegeben und liegt in der Download-Area.

        Kommentar


          Hallo Hyman,
          mit dem aufrichtigen Ausdruck meiner Bewunderung möchte ich mich (sicherlich nicht nur für mich) bedanken und bestätigen, dass offensichtlich alles funktioniert wie beschrieben und wirklich sehr hilfreich ist. Wie schreibt man in solchen Foren, wenn man wirklich zufrieden ist? Ohne dass es furchtbar übertrieben wirkt? Ich hoffe, ich habe den richtigen Ton getroffen.
          Beste Grüße Wehner123

          Kommentar


            Ich habe soeben die Version 1.6.1 des Pakets Visu- & Web-Logikbausteine freigegeben.

            Verbesserung an der Formelberechnung:
            • Neue Methoden der Data-Klasse erlauben die Verarbeitung von indimensionalen Datenfeldern aus Zahlen oder Texten. Näheres dazu (auch Beispiele) finden sich in der Dokumentation zum Baustein (oder vorab im Post #288)
            Die neue Version steht ab sofort im Download-Bereich zur Verfügung.​
            Zuletzt geändert von hyman; 27.11.2023, 23:54.

            Kommentar


              Entschuldige meine Frage aber ich stehe auf dem Schlauch gerade:

              Möchte eine Formel als Trigger nutzen "_out2_ == _previousOut2_ ? 0 : 1" aber beim initialisieren erhalte ich immer eine 0 und würde gerne eine 1 erhalten. Hast DU einen Tipp für mich?

              Gruss André

              Kommentar


                Da baruch ich etwas mehr Kontext ... was genau willst Du erreichen? Zeig' mal das ganze Logikblatt und erklär' ein bißchen ...

                Was ich in Deiner Formel erkenne ist eine Art Änderungserkennung für _out2_. Aber wie wird _out2_ berechnet?

                Kommentar


                  Zitat von hyman Beitrag anzeigen
                  Kontext
                  Sorry anbei ein paar Screenshots. Ich möchte auf Basis der Scharfschaltung und aktuellen Szene ein Web-Request mit Parameter triggern. Dieser Request stellt über meine eigene API den aktuellen Status der Öffnungszeiten für Web und Digital-Signage ein.

                  Kommentar


                    Screenshot (784).png Screenshot (783).png Screenshot (782).png

                    Kommentar


                      Obwohl das allein sicher nicht hilft, würde ich den Typ des Ausgangs 2 auf INTEGER stellen. Fließkommazahlen brauchst Du da nicht. Wenn ich das richtig verstehe, nimmt Ausgang 2 nur die Werte 0 (geschlossen), 1 (geöffnet) oder 2 (geöffnet im shooting) an. Soweit richtig?

                      Den Initialwert für _previousOut2_ kannst Du nicht beeinflussen. Du kannst aber den Wertebereich des Ausgangs 2 so ändern, dass 0 nicht vorkommet, z. B. 1 (geschlossen), 2 (geöffnet) oder 3 (geöffnet im shooting). Dann musst Du "nur noch" die Formeln 4 und 5 entsprechend anpassen.

                      Spannend finde ich übrigens die Addition/Verkettung eines Strings und einer Zahl in Formel 4. Ich wusste nicht, dass sowas funktioniert ...

                      Kommentar


                        Zitat von hyman Beitrag anzeigen
                        Du kannst aber den Wertebereich des Ausgangs 2 so ändern, dass 0 nicht vorkommet

                        Spannend finde ich übrigens die Addition/Verkettung
                        Lieben Dank, werde ich ausprobieren - muss nur dazu noch die API anpassen. Das mit der Verkettung habe ich einfach ausprobiert und dann einen anderen LBS für den Web-Request genommen, bei dem ich die URL als Parameter übergeben kann.

                        Ich probiere und berichte.

                        Kommentar


                          Zitat von hyman Beitrag anzeigen
                          dass sowas funktioniert
                          Und es funktioniert wunderbar:

                          You do not have permission to view this gallery.
                          This gallery has 3 photos.

                          Kommentar


                            Schlaflos in Basel?

                            Zitat von araeubig Beitrag anzeigen
                            Lieben Dank, werde ich ausprobieren - muss nur dazu noch die API anpassen.
                            Die API kannst Du so lassen. Du musst nur Formel 4 entsprechend anpassen: _out1_ + (_out2_ - 1)
                            Damit werden für den Status in der URL wieder die Werte 0 bis 2 verwendet wie bisher.

                            Und Formel 5 musst Du natürlich auch ändern, aber da dürfte klar sein wie ...
                            Zuletzt geändert von hyman; 16.02.2024, 06:33.

                            Kommentar


                              Zitat von hyman Beitrag anzeigen
                              (_out2_ - 1)
                              Um mit den Werten konsistent zu sein, habe ich die API ja schon geändert. Die Screenshots zeigen das Live-Ergebnis (Der Status wird über AJAX alle 10 Sekunden abgefragt). Danke Dir!

                              Nicht wirklich schlaflos aber wach geworden und an den Rechner - heute muss ich früh auf der "Baustelle" sein (50 Meter 3P-DALI-Schiene werden nachher geliefert).

                              Kommentar


                                Zitat von hyman Beitrag anzeigen
                                Funktionen zur Verarbeitung von Daten in eindimensionalen Feldern
                                Guten Morgen,

                                Bin gerade dabei mit Deinen neuen Funktionen ein wenig zu testen.

                                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?


                                Gruss und schönen Sonntag, André

                                Kommentar

                                Lädt...
                                X