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

    Danke hab mir selber einen gebaut und werde diesen nach Tests auch noch zur Verfügung stellen

    Kommentar


      Moin hyman , könntest du mir vielleicht bei einer Formel zur Umwandlung des aktuellen Datums und Uhrzeit 00:00Uhr in UTC +000 helfen? Ziel ist es, nach Mitternacht das aktuelle Datum + Uhrzeit 00:00Uhr in UTC umzuwandeln und in die Webabfrage bei Awattar zu schieben. Als Ergebnis bekommt man sauber die nächsten 24h womit ich dann über die Statistik den niedrigsten Preis mit dazugehöriger Uhrzeit ermitteln kann.

      Ich danke dir, Martin.
      Angehängte Dateien

      Kommentar


        Hast Du mal in die Doku des Baustein geschaut
        image.png
        Gruß Bernhard

        Kommentar


          Guten Tag,

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

          Kommentar


            Guten Abend,
            der Gira Support hat mein Projekt analysiert und ist zu dem Ergebnis gekommen, dass anscheinden der Formelberechnung Baustein folgenden Fehler auslöst:
            Ich bekomme eine gelbe Warnmeldung mit Flash Speicher voll. Warum kann das an dem Baustein liegen?
            image.png

            Kommentar


              Das kann ich Dir leider auch nicht sicher sagen. Als Vermutung kann ich anbieten, dass der Baustein eine größere Bibliothek braucht, die natürlich auch im Flash-Speicher liegen muss. Für den L1 also vielleicht nicht so ideal, weil der halt nun mal wesentlich weniger Flash-Speicher hat als der X1.

              Kommentar


                Guten Abend,
                die Aufgabe bestand darin, den zweitgrößten Wert einer Werteliste (comma seperated values; liegt als string vor) zu finden. Ich habe dies jetzt unter etwas komplexem Einsatz des XML-JSON Parsers (Danke, Hyman!) und der Formelberechnung (nochmals Danke!) gelöst - siehe unten.
                Vielleicht habe ich damit ja mit Kanonen auf Spatzen geschossen und die Lösung ist viel einfacher. Falls nicht, wäre das möglicherweise ein Ergänzungsvorschlag zum XML-JSON-Parser: die Ausgabe einer sortierten (wahlweise aufwärts und abwärts) Liste (in Ergänzung zu Min, Max, chronologischer Liste usw.).
                Hier die quick (na ja) and dirty Lösung - würde mich über Rückmeldung freuen.
                Beste Grüße
                Wehner

                dataurl217860.png

                Wertgenerator (Beispiel): 123,0,456.0,-5.3,0

                Formelb_Werteliste_zu_JSON: ""+(char)123+(char)34+"T"+(char)34+(char)58+"["+{T:S}+"]"+(char)125,
                ergibt den JSON-Text: {"T":[123,…0]}

                Auswertung im XML-JSON-Parser mit /root/T/item[position()>-1] für Max

                Formelb_ersetze_Max
                {T1:S}.Replace({MX:S},"-9999") Dabei ist -9999 eine für meine Anwendung sehr kleine Zahl, die es übrigens auch verträgt, wenn beim Ersetzen noch Dezimalpunkt und Nachkommastellen übrigbleiben.

                Bitte nicht ungeändert nachmachen: Beispiel, wo's Probleme gibt: die Liste 0,1,24.48,48 wird zu 0,1,24.-9999,48:

                Entsprechende Auswertung im XML-JSON-Parser liefert jetzt die 2.-größte Zahl (im Beispiel 123).
                Für die 3.-größte etc. kann man das noch vervielfachen.





                Zuletzt geändert von Wehner123; 31.10.2023, 11:12.

                Kommentar


                  Könnt' mir vorstellen, dass auch alles in einer Formel geht:
                  Array.Sort( Array.ConvertAll(s.Split(','), int.Parse), (a, b) => b.CompareTo(a) )​ [1]
                  oder so ähnlich.

                  Kommentar


                    Hallo Hyman,

                    besten Dank für die schnelle Antwort. Ich habe den Vorschlag als

                    Array.Sort( Array.ConvertAll({TT:S}.Split(','), int.Parse), (a, b) => b.CompareTo(a))[1]

                    in die Formelberechnung eingegeben und erhalte die Meldung

                    Der Baustein „Formelberechnung“ hat folgendes Problem festgestellt: Formel 1 enthält eine Zuweisung. Dies ist in Formeln generell nicht zulässig.

                    Ich habe dann mal versucht, langsam anzufangen:
                    {TT:S}.Split(','))[2] ist schon mal sehr nett. Da bekomme ich bei String-Ausgabe mit meinen Werten 456.0 und als Number den Wert 456. Schon mal sehr schön.
                    Array.Sort({TT:S}.Split(','))[2] ergibt eine Fehlermeldung; Array.Sort({TT:S}.Split(',') läuft zwar ohne Fehlermeldung, aber mit leeren String bzw. 0 als Ergebnis.
                    Array.ConvertAll({TT:S}.Split(','), int.Parse)[2] ergibt bei einer Integer-Werte-Liste das richtige Ergebnis, bei float.parse wird der Dezimalpunkt aber ignoriert (wahrscheinlich Culture-Einstellung) und es ergibt 4560.


                    Ich probiere mal weiter. Für Tipps wäre ich weiterhin dankbar.
                    Zuletzt geändert von Wehner123; 31.10.2023, 11:05.

                    Kommentar


                      Die Fehlermeldung sollte eigentlich nicht kommen. Ich ahne aber, warum sie kommt. Kann ich gelegentlich mal fixen ... einen schönen Testfall hab' ich ja dann schon

                      Kommentar


                        Was stattdessen (für Ganzzahlen) gehen könnte:

                        Array.Reverse( Array.Sort( Array.ConvertAll({TT:S}.Split(','), int.Parse) ) ) [1]
                        Zuletzt geändert von hyman; 31.10.2023, 12:05.

                        Kommentar


                          Für Fließkommazahlen, bei denen ein Punkt als Separator für die Nachkommastellen verwendet wird, vielleicht etwa so (wie alle vorherigen ungetestet):

                          Array.Reverse( Array.Sort( Array.ConvertAll({TT:S}.Split(','), double.Parse(System.Globalization.CultureInfo.CreateSpecificCul ture("en-US")​)) ) ) [1]

                          Oder falls die CultureInfo nicht geht, stattdessen die Eingabedaten mit Komma als Dezimalseparator und Strichpunkt als Separator zwischen verschiedenen Zahlen aufbereiten. Dann könnte simpel:


                          Array.Reverse( Array.Sort( Array.ConvertAll({TT:S}.Split(';'), double.Parse) ) ) [1]

                          funktionieren.
                          Zuletzt geändert von hyman; 18.11.2023, 14:58.

                          Kommentar


                            Hallo,

                            das funktioniert schon mal:

                            Aus 123;1;456,12;-5;2
                            wird mit Array.ConvertAll({TT:S}.Split(';'), float.Parse)[2] der Wert 456,119995117188
                            und mit Array.ConvertAll({TT:S}.Split(';'), double.Parse)[2] der Wert 456,12

                            Aber
                            Array.Sort(Array.ConvertAll({TT:S}.Split(';'), double.Parse))[1]
                            bringt noch den Fehler:
                            Error CS0021: cannot apply indexing with [] to an expression of type „void“

                            Hier noch ein Fund aus Stackoverflow:
                            Sort is a void method, you can't retrieve a value from this method. It sorts the list in-place. If you want a copy, use OrderBy.


                            Übrigens: Array.ConvertAll({TT:S}.Split(';'), float.Parse).Length ergibt den Wert 5. Es existiert auf der Ebene wohl wirklich ein Array.

                            Ich versuche es weiter.

                            Beste Grüße
                            Zuletzt geändert von Wehner123; 31.10.2023, 15:02.

                            Kommentar


                              Ja, das mit dem Sort hab ich vergooft -- das kann so wirklich nicht gehen. Alternative fällt mir leider auch so direkt keine ein ...
                              Zuletzt geändert von hyman; 02.11.2023, 13:34.

                              Kommentar


                                Hallo, besten Dank für die Rückmeldung. 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. Der c# code innerhalb sollte ja recht übersichtlich sein; aber mir ist schon klar, dass das saubere Erstellen eines LBS schon ein größerer Aufwand ist. Gibt es eigentlich eine Projekt-Vorschlags-Liste?
                                Beste Grüße

                                Kommentar

                                Lädt...
                                X