Ankündigung

Einklappen
Keine Ankündigung bisher.

Neuer Formel-Baustein - wenn ihn jemand braucht

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

    HS/FS Neuer Formel-Baustein - wenn ihn jemand braucht

    Ich vermisse öfters das einfache Hintippen meiner Gedanken als Formel im Homeserver und finde das Zusammenstecken von mehreren Bausteinen für eine einfache Berechnung nicht Zeitgemäß. Geht das nur mir so?

    Ich hätte eine Lösung, aber weiß nicht, ob ich allein bin mit dem Problem - oder es gar so einen Baustein schon gibt. Hab mich heute hingesetzt und mal ne Idee umgesetzt:Greenshot 2022-07-13 00.40.35.png
    n + m Addiert Wert n und m
    n - m Substrahiert den Wert m vom Wert n
    n * m Multipliziert zwei Werte
    n / m Dividiert den Wert n durch den Wert m
    n ** m Potenziert den Wert n "hoch" den Wert m
    n % m Modulo: Dividiert n durch den Wert m und gibt den Rest zurück
    pow(n,m) Potenziert n mit m (analog **)
    sqrt(n) Die Wurzel von n
    ceil(n) Runde n zum nächsten Integer auf
    floor(n) Runde n zum nächsten Integer ab
    trunc(n) Schneidet alles rechts vom Komma ab. Entpricht floor bei positiven und ceil bei negativen Zahlen
    exp(n) Eulersche Zahl: e hoch n
    log(n, m) Logarithmus von n - zur optionalen Basis m
    n << m Shiftet m bits nach links
    n >> m Shiftet m bits nach rechts
    sin(n) Sinus von n als Bogenmaß
    cos(n) Cosinus von n als Bogenmaß
    tan(n) Tangens von n als Bogenmaß
    asin(n) Arcsinus von n (radiant). Ergebnis zwischen -pi/2 und pi/2.
    acos(n) Arcuscosinus von n (radiant). Ergebnis zwischen 0 und pi.
    atan(n) Arctangens von n (radiant). Ergebnis zwischen -pi/2 und pi/2.
    degrees(n) Winkel von Radiant in Grad umrechnen
    radians(n) Winkel von Grad in Radiant umrechnen
    min(n,m,..) Gibt den kleinsten Wert zurück
    max(n,m,..) Gibt den größten Wert der Menge zurück
    • Es gilt Punkt vor Strich-Rechnung 1+2*3=7
    • Einfache Klammern führen zur Vorberechnung der Werte (1+2)*3=9
    • Eulerische Zahl mittels e
    • PI mittels pi
    • Teilt man Ganzzahlen, so ist auch das Ergebnis wieder eine Ganzzahl. Dies lässt sich direkt nicht auf dem Homeserver verändern. Abhilfe: Statt 2/3 einfach 2/3.0 (Oder wenn der HS endlich auf python 3 geht!)
    • Alles linksassoziativ: 16/4/2 = 2 (nicht 8 wie bei rechts-assoziation!)
    Logik

    Einfache Logiken sind möglich, z.B. mit Vergleichen kombiniert:
    Code:
    expression_if_true if condition else expression_if_false
    Sprich
    Code:
    x1 if x1 > x2 else x2
    gibt x1 zurück, wenn es größer als x2 ist - sonst x2 Das kann man auch klammern:
    Code:
    (x1 if x1 > x2 else x2) * 2 * x3
    Das alles verhindert dann so doofe Verschachtelungen, die schon bei einfachem Kram alles verkomplizieren:
    Greenshot 2022-07-13 00.40.55.png

    Download: http://service.knx-user-forum.de/?co...nload&id=14188
    Amazon Wishlist: https://www.amazon.de/hz/wishlist/ls...?ref_=wl_share
    Zuletzt geändert von SvenB; 29.07.2022, 20:27.

    #2
    Ja, unbedingt, würde meine Umrechnung der Wasserhöhe der Kugelzisterne um einiges vereinfachen!
    Gruss Daniel

    Kommentar


      #3
      Finde ich eine gute Idee, bisher habe ich auch immer mit Verschachtelungen gearbeitet.

      Kommentar


        #4
        Zitat von SvenB Beitrag anzeigen
        Oder wenn der HS endlich auf python 3 geht!
        Wir sind nur 30 Jahre von der Kernfusion entfernt!
        Dieser Beitrag enthält keine Spuren von Sarkasmus... ich bin einfach so?!

        Kommentar


          #5
          Sieht interessant aus - stellst Du den auch in den Download?
          Möchte den Komfort meiner Installation nicht mehr missen!

          Kommentar


            #6
            Ich hab gerade nochmal geschaut und vorher garnicht gesehen. Von Axel gibt es ja auch Universal Logikmodul für Formeln. Scheint auf HSL1 zu beruhen und kann folgendes:
            + Addition
            - Subtraktion
            * Multiplikation
            / Division
            & binäres UND
            | binäres ODER
            == Gleich (als Vergleicher)
            < Kleiner
            <= Kleiner gleich
            > Größer
            >= Größer gleich
            != Ungleich (identisch "<>")
            <> Ungleich (identisch "!=")
            Scheint also Inline HSL1 zu machen, während meiner nun Inline HSL2 macht. Andere Möglichkeiten scheint es sonst nicht zu geben mit Formeln was zu tun oder?

            (Ich würde meinen natürlich dann hier einstellen und SourceCode offen rausgeben (Github))
            Zuletzt geändert von SvenB; 13.07.2022, 09:08.

            Kommentar


              #7
              Servus Sven,

              da haben zwei die gleiche Idee :-) Du kannst in meinem Baustein durchaus auch mathematische Funktionen u.a. nützen. Sprich, die Bibis welche im HS Python dabei sind. Ich mache da beispielsweise eine umfassende Trendberechnung damit, für ein Lastmanagement im Spitzenstrom.

              Beim Code muss man sich bei meinem Baustein exakt an die API HSL1 halten. Das kann ein Vorteil sein. Die Idee bei mir kam für den Baustein, dass ich nicht für jeden "Mist" ein eigenen Baustein schreiben wollte und damit flexibel bin. Mit HS4.11 und LiveView lässt sich das noch besser Debugen bei einer Entwicklung.

              Finde beide Bausteine super! Denke der Ansatz und Funktion ist unterschiedlich. Je nach Aufgabenstellung. Bitte in den Download hier im Forum.

              Kommentar


                #8
                Danke Axel für deine Einschätzung. Gerade die Logik-Expressionen sind Gold wert. Ich hab so z.B. meine Fensterkontakte auf den QC-Baustein gemapped und auch Flügelfenster mit geteilten Kontakten sauber verarztet ohne riesige Bausteinketten. Und man kann es dann im Logikeditor auch schnell und zur Laufzeit anpassen.

                Ich werde meinen Baustein auch veröffentlichen, wenn er grundsätzlich getestet ist, da ich folgendes sehe:
                • Programmiersprachen wie python sind etwas eingängiger als HSL, da man sie öfter im Leben antrifft
                • python verzeiht in meinen Augen mehr syntaktische Ungereimtheiten
                • Ich kann auch Hilfsmethoden einfach hinzufügen soweit Ideen da sind. Z.B. (avg(..) für Durchschnitt oder med(..) für den Median von Werten)
                Wie ist der Stand:
                Ich hatte bei der Entwicklung auch die Idee mehrere Formeln zu ermöglichen und dass die nachfolgenden Formeln mit den Ergebnisse der Anderen arbeiten können. Das habe ich umgesetzt und noch zwei Eingänge hinzugefügt (10stück nun). Die Ergebnisse sind y0-y2 und auch der ersten Formel steht y0 aus dem SBC-Speicher zur Verfügung. Wenn Formel 2 aber y2 verändert, so wird nicht noch ein Durchlauf gemacht. Wer das braucht, muss sich selbst um einen manuellen Trigger (Setzen des gleichen Wertes auf einen Eingang) kümmern. Aber ich möchte keine Loop-Erkennung einbauen.

                Der Baustein wird von mir gerade getestet und ersetzt eine Menge an Ketten. Wer auch aktiv testen will: PM an mich. Freue mich!
                Hier frei reinstellen: Ist mir noch zu unsicher und hab nicht jeden Tag Zeit für adhoc-Fixes.

                Greenshot 2022-07-18 09.53.12.png

                Kommentar


                  #9
                  Erste public beta ist raus. Gibts morgen hier im Download. Für ungeduldige gibts die auf Github (Code ist rauch veröffentlich).
                  Konstruktive Kritik gerne her.

                  Neuster Trennt: Für das QC Fensterstatus 4.0 die Status aus zwei Reed-Kontakten auf die richtigen Werte bringen (mit z.B.
                  Code:
                  1 if x2 == 1 and x4 == 1 else 2 if x2 == 1 and x4 == 0 else 0
                  )

                  Update: Nun auch hier im Download: http://service.knx-user-forum.de/?co...nload&id=14188
                  Zuletzt geändert von SvenB; 29.07.2022, 20:27.

                  Kommentar


                    #10
                    Im Download-Bereich ist seit heute eine neue Version vom Baustein. Es ist nur ein kleiner Bugfix für den Start vom HS. Da kann es vorkommen, dass er auf ein Dict zugreift, was noch nicht initialisiert wurde. Führt dann dazu, dass der Baustein nicht läuft.

                    Kommentar


                      #11
                      gefällt mir, jetzt brauche ich nur noch eine anwendung dazu
                      gemäss forenregeln soll man bitte und danke sagen! also: bitte und danke!

                      Kommentar


                        #12
                        Hallo Sven!

                        Du hast in Deinem Baustein Aufrunden und Abrunden drin - kannst Du auch noch "mathematisches Runden" einbauen, also <5 => abrunden, >5 = aufrunden?

                        Ist der Baustein eigentlich "Berechnung bei Neustart" ja oder nein?

                        EDIT: Hab es gerade in der Hilfe im Download gefunden: Berechnung bei Neustart = ja. Mist, dann kann ich ihn bei den Usecases, wo ich ihn für sinnvoll halte, nicht einsetzen bzw. meine ungeliebte Neustart-Sperre dahinter bleibt erhalten! Oder Du spendierst dem Baustein noch einen Eingang "Berechnung beim Neustart ja/nein", damit man das je nach Anwendungsfall einstellen kann?

                        Grüße

                        Olaf
                        Zuletzt geändert von Hightech; 02.01.2023, 10:06.
                        Möchte den Komfort meiner Installation nicht mehr missen!

                        Kommentar


                          #13
                          Hi Hightech,

                          danke für das Feedback. Runden baue ich ein (bzw. hab es schon, teste es gleich. Gibt dann ein Update)

                          Neuberechnung beim Neustart: Da es sich um einen HSL2-Baustein handelt ist dieser doch zwangsläufig so oder? HSL2 nutzt HSL1 für die Baustein-Config und dort wird in Satz 5001 immer die Init-Berechnung auf 1 gesetzt. Wenn ich es aber richtig verstehe sitzt der Wert auf 1, damit der HS bei HSL2 die on_init()-Methode aufruft. Hier kann man natürlich auch den Ausgang berechnen - und das mache ich auch. Also so einen Eingang kann ich bauen, dann sollte es richtig sein.

                          Long story short: Auf die Anzeige im Forum/Download kann man sich nicht verlassen (in meinen Augen).

                          Kommentar


                            #14
                            Hier wäre IMHO eine Lösung:
                            • E14 ist neu
                            • Ist E14 beim Start 1, so wird zum Start einmal neu berechnet. Bei 0 nicht.
                            • Es wird nur neu gerechnet, wenn E14 einen Wert erhält. Der kann dann auch 0 sein. Das führt aber zu mehr Verdrahtung.
                            Beispiel:
                            Greenshot 2023-01-02 12.18.53.png
                            Sprich Vorher war nur E1 und E2 verbunden. Beide sind nun gleichzeitig mit E14 verbunden, damit jede Änderung an E1 und E2 auch eine Neuberechnung macht.

                            Meinung dazu?

                            Kommentar


                              #15
                              Mega Happy bin ich damit nicht. Ich glaube ich mache zwei Eingänge dann oder nur die Config wie du vorgeschlagen hast mit Init-Berechnung.
                              Weil das wird mega unübersichtlich so:
                              Greenshot 2023-01-02 12.25.08.png

                              Kommentar

                              Lädt...
                              X