Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS für String/Zahlenformatierung analog einem Visu-Element?

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

    LBS für String/Zahlenformatierung analog einem Visu-Element?

    Hallo Christian,
    Hallo in die Runde,

    in meiner Visu habe ich an vielen Stellen von den eingebauten Funktionen und Formeln für Visuelemente Gebrauch gemacht: Runden, Stringoperationen etc. Klappt wunderbar.

    Mittlerweile gibt man KO-Inhalte aber nicht mehr nur in der Visu aus- man verschickt sie per Telegram.... oder lässt sie sich von Alexa vorlesen. Auch dafür wird oft eine Berechnung/Formatierung gebraucht.

    Wäre es möglich, ein LBS bereitzustellen, in dem man das Eingangs-KO mit demselben "Werkzeugkasten" (Funktionsreferenz) zu einem String verarbeiten kann, wie das bei Visuelementen jetzt schon möglich ist?

    Oder gibts das schon und ich habe nur was übersehen?

    Grüße,

    Gunnar






    #2
    Sollte prinzipiell kein großes Problem darstellen. In der Visu ist zwar Javascript am Werk, aber dies sollte sich relativ einfach in PHP übersetzen lassen. Ich pack's mal uff meine Liste

    Wer's selbst angehen möchte - hier ist der JS-Code. Die Funktion pS() ist die Parsefunktion - der Rest sind diverse Hilfsfunktionen zum Umwandeln von RGB-Werten etc.:

    Code:
    function pS(n,ko) {
        //parseStyle
        //berechnet (eval) alles innerhalb von "{...}" in einem String n und ersetzt dabei "#" durch ko
        //return: In den String n eingesetztes Ergebnis
        //n: der String, z.B. "Temperatur beträgt {#*4+12+#+2} Grad"
        //ko: Wert von #
    
        //Spezialfunktionen innerhalb(!) von {...}, also z.B. "Gerundet: {round(#*5.1)} Grad"    
        //!!!ACHTUNG!!!
        //Wenn hier noch Funktionen ergänzt werden sollten ist darauf zu achten, dass eventuelle Hilfsfunktionen in diese(!) shared/main.js gehören!
    
        //Mathematische Funktionen    
        function abs(x) {return Math.abs(parseFloat(x));}                    //absoluter Wert
        function floor(x) {return Math.floor(parseFloat(x));}                //Wert abrunden
        function ceil(x) {return Math.ceil(parseFloat(x));}                    //Wert aufrunden
        function pow(x,y) {return Math.pow(parseFloat(x),y);}                //Potenzieren
        function sqrt(x) {return Math.sqrt(parseFloat(x));}                    //Quadratwurzel
        function log(x) {return Math.log(parseFloat(x));}                    //Logarithmus
        function sin(x) {return Math.sin(parseFloat(x));}                    //Sinus
        function cos(x) {return Math.cos(parseFloat(x));}                    //Cosinus
        function tan(x) {return Math.tan(parseFloat(x));}                    //Tangens
        function round(x) {return Math.round(parseFloat(x));}                //Wert runden
        function fixed(x,anz) {return parseFloat(x).toFixed(anz);}            //Wert auf "anz" Nachkommastellen bringen
    
        //String-Funktionen mit Übergabe des Strings (Achtung: Aufruf z.B. mit str_left('#',2) - wenn das KO '' enthält, muss ggf. escaped werden!)
        function str_left(x,anz) {return numberOrString(x.toString().substr(0,anz));}                        //"anz" Zeichen von links des Strings "x" ausgeben
        function str_right(x,anz) {return numberOrString(x.toString().substr(x.toString().length-anz));}    //"anz" Zeichen von rechts des Strings "x" ausgeben
        function str_mid(x,pos,anz) {return numberOrString(x.toString().substr(pos,anz));}                    //"anz" Zeichen ab der Position "pos" des Strings "x" ausgeben ("pos" beginnt mit 0)
        function str_split(x,pos,sep) {                                                                        //Splittet den String x mittels sep (optional) und liefert den Wert mit dem Array-Index pos zurück
            if (!sep) {sep="|";}
            var n=x.split(sep);
            if (pos<n.length) {
                return numberOrString(n[pos]);
            } else {
                return null;
            }
        }
        function str_len(x) {return x.toString().length;}                                    //Länge des Strings "x" ermitteln
        function str_replace(x,n1,n2) {return x.toString().replace(n1,n2);}                    //ersetzt jedes Vorkommen von "n1" durch "n2" im String "x"
        function str_lcase(x) {return x.toString().toLowerCase();}                            //wandelt den String "x" in Kleinbuchstaben um
        function str_ucase(x) {return x.toString().toUpperCase();}                            //wandelt den String "x" in Großbuchstaben um
        function str_trim(x) {return x.toString().trim();}                                    //entfernt "whitespace" am Anfang und Ende des Strings "x"
    
        //String-Funktionen ohne Übergabe des Strings (immer auf das KO bezogen)
        function left(anz) {return numberOrString(ko.toString().substr(0,anz));}                        //"anz" Zeichen von links des KO-Werts (String) ausgeben
        function right(anz) {return numberOrString(ko.toString().substr(ko.toString().length-anz));}    //"anz" Zeichen von rechts des KO-Werts (String) ausgeben
        function mid(pos,anz) {return numberOrString(ko.toString().substr(pos,anz));}                    //"anz" Zeichen ab der Position "pos" des KO-Werts (String) ausgeben ("pos" beginnt mit 0)
        function split(pos,sep) {return str_split(ko,pos,sep);}                                            //Splittet den KO-Wert mittels sep (optional) und liefert den Wert mit dem Array-Index pos zurück
        function len() {return ko.toString().length;}                                    //Länge des KO-Werts (String) ermitteln
        function replace(n1,n2) {return ko.toString().replace(n1,n2);}                    //ersetzt jedes Vorkommen von "n1" durch "n2"
        function lcase() {return ko.toString().toLowerCase();}                            //wandelt den KO-Wert in Kleinbuchstaben um
        function ucase() {return ko.toString().toUpperCase();}                            //wandelt den KO-Wert in Großbuchstaben um
        function trim() {return ko.toString().trim();}                                    //entfernt "whitespace" am Anfang und Ende des KO-Werts
    
        //Spezialfunktionen
        function hsvrgb() {return HSVHEXtoRGBHEX(ko);}            //KO-Wert (Hex-String) von HSV in RGB umwandeln (keine Parameter!)
        function hsvlight() {                                    //KO-Wert (Hex-String) von HSV in RGBA umwandeln (keine Parameter!)
            var rgba=RGBHEXtoRGBA(HSVHEXtoRGBHEX(ko));
            return "rgba("+rgba[0]+","+rgba[1]+","+rgba[2]+","+rgba[3]+")";
        }
        function rgblight() {                                    //KO-Wert (Hex-String) von RGB in RGBA umwandeln (keine Parameter!)
            var rgba=RGBHEXtoRGBA(ko);
            return "rgba("+rgba[0]+","+rgba[1]+","+rgba[2]+","+rgba[3]+")";
        }
    
    
        //Ist n leer? => es gibt nichts zu parsen
        if (n=='') {return n;}
    
        //alle "{#}" werden direkt durch den KO-Wert ersetzt und nicht weiter berechnet
        n=n.replace(/{#}/g,ko);
    
        //Parsen
        var regex=/{([\s\S]*?)}/;
        do {
            var f=regex.exec(n);
            if (f) {
                ff=f[1].replace(/[#]/g,ko);
                try {
                    ffeval=eval(ff);
                } catch(e) {
                    //falls Berechnung nicht klappt, {...} mit KO-Wert ersetzen
                    ffeval=ko;
                }
                if (ffeval==undefined) {ffeval="";} //falls ko="" ist, wird eval() das Ergebnis "undefined" ausgeben => "" draus machen
                n=n.replace(regex,ffeval);
            }
        } while (f);
    
        return n;
    }
    
    function RGBHEXtoRGBA(rgbhex) {
        //wandelt RGB-Hex in r/g/b/a, wobei "a" (Transparenz) in Abhängigkeit von der Helligkeit berechnet wird.
        //(z.B. um Dimmer/RGB-Leuchte im Grundriss zu simulieren)
        //return: Array[0..3]=R/G/B/A (A=0..1) - bei Fehler wird 0/0/0/0 zurückgegeben!
        if (rgbhex) {
            var hsv=RGBHEXtoHSV(rgbhex);
            if (hsv!==false) {
                var rgb=HSVtoRGB(hsv[0],hsv[1],255);
                if (rgb!==false) {
                    return [rgb[0].toFixed(0),rgb[1].toFixed(0),rgb[2].toFixed(0),(hsv[2]/255)];
                }
            }
        }
        return [0,0,0,0];
    }
    
    function HSVHEXtoRGBHEX(hsv) {
        //wandelt HSV-Hex in RGB-Hex um
        var r=HSVHEXtoHSV(hsv);
        if (r!==false) {
            return HSVtoRGBHEX(r[0],r[1],r[2]);
        }
        return false;
    }
    
    function RGBHEXtoHSV(rgb) {
        //wandelt RGB im Hexformat in h/s/v um
        //rgb: "#A1B2C3" oder "A1B2C3"
        //return: Array[0..2]=H/S/V (H=0..255, S=0..100, V=0..100)
        if (rgb) {
            var r=RGBHEXtoRGB(rgb);
            if (r!==false) {
                return RGBtoHSV(r[0],r[1],r[2]);
            }
        }
        return false;
    }
    
    function HSVtoRGBHEX(h,s,v) {
        //wandelt h/s/v ins RGB-Hexformat um
        //h/s/v: H/S/V-Werte  (H=0..255, S=0..255, V=0..255)
        //return: String=RGB-Hex  (z.B. "A1B2C3")
        var r=HSVtoRGB(h,s,v);
        return RGBtoRGBHEX(r[0],r[1],r[2]);
    }
    
    function HSVtoHSVHEX(h,s,v) {
        //wandelt h/s/v ins HSV-Hexformat um
        //h/s/v: H/S/V-Werte  (H=0..255, S=0..255, V=0..255)
        //return: String=HSV-Hex  (z.B. "A1B2C3")
        h=parseInt(h);
        s=parseInt(s);
        v=parseInt(v);
        if (h>=0 && h<=255 && s>=0 && s<=255 && v>=0 && v<=255) {
            h=h.toString(16);
            if (h.length==1) {h='0'+h;}
            s=s.toString(16);
            if (s.length==1) {s='0'+s;}
            v=v.toString(16);
            if (v.length==1) {v='0'+v;}
            var n=h+s+v;
            if (n.length==6) {
                return n;
            }
        }
        return false;
    }
    
    function HSVHEXtoHSV(hsv) {
        //wandelt HSV im Hexformat in h/s/v um
        //hsv: "#A1B2C3" oder "A1B2C3"
        //return: false=Fehler, Array[0..2]=H/S/V-Werte
        hsv=hsv.replace("#","");
        var h=parseInt(hsv.substr(0,2),16);
        var s=parseInt(hsv.substr(2,2),16);
        var v=parseInt(hsv.substr(4,2),16);
        if (h>=0 && h<=255 && s>=0 && s<=255 && v>=0 && v<=255) {
            return [h,s,v];
        }
        return false;
    }
    
    function RGBHEXtoRGB(rgb) {
        //wandelt RGB im Hexformat in r/g/b um
        //rgb: "#A1B2C3" oder "A1B2C3"
        //return: false=Fehler, Array[0..2]=R/G/B-Werte
        if (rgb) {
            rgb=rgb.replace("#","");
            var r=parseInt(rgb.substr(0,2),16);
            var g=parseInt(rgb.substr(2,2),16);
            var b=parseInt(rgb.substr(4,2),16);
            if (r>=0 && r<=255 && g>=0 && g<=255 && b>=0 && b<=255) {
                return [r,g,b];
            }
        }
        return false;
    }
    
    function RGBtoRGBHEX(r,g,b) {
        //wandelt r/g/b ins RGB-Hexformat um
        //r/g/b: R/G/B-Werte
        //return: false=Fehler, String=RGB-Hex  (z.B. "A1B2C3")
        r=parseInt(r).toString(16);
        if (r.length==1) {r='0'+r;}
        g=parseInt(g).toString(16);
        if (g.length==1) {g='0'+g;}
        b=parseInt(b).toString(16);
        if (b.length==1) {b='0'+b;}
        var n=r+g+b;
        if (n.length==6) {
            return n;
        }
        return false;
    }
    
    function RGBtoHSV (r,g,b) {
        //wandelt r/g/b in h/s/v um
        //r/g/b: R/G/B-Werte
        //return: false=Fehler, Float-Array[0..2]=H/S/V (H=0..255, S=0..255, V=0..255)
        r/=255;
        g/=255;
        b/=255;
        var max=Math.max(r,g,b);
        var min=Math.min(r,g,b);
        var h,s;
        var v=max;
        var d=max-min;
        s=max==0 ? 0 : d/max;
        if (max==min) {
            h=0;
        } else {
            switch(max){
                case r: h=(g-b)/d+(g<b ? 6 : 0); break;
                case g: h=(b-r)/d+2; break;
                case b: h=(r-g)/d+4; break;
            }
            h/=6;
        }
        if (h>=0 && h<=1 && s>=0 && s<=1 && v>=0 && v<=1) {
            //return [(h*255).toFixed(0),(s*255).toFixed(0),(v*255).toFixed(0)];
            return [(h*255),(s*255),(v*255)];
        }
        return false;
    }
    
    function HSVtoRGB (h,s,v) {
        //wandelt h/s/v in r/g/b um
        //h/s/v: H/S/V-Werte  (H=0..255, S=0..255, V=0..255)
        //return: false=Fehler, Float-Array[0..2]=R/G/B
        var r,g,b;
        h/=255;
        s/=255;
        v/=255;
        var i=Math.floor(h*6);
        var f=h*6-i;
        var p=v*(1-s);
        var q=v*(1-f*s);
        var t=v*(1-(1-f)*s);
        switch (i%6) {
            case 0: r=v,g=t,b=p; break;
            case 1: r=q,g=v,b=p; break;
            case 2: r=p,g=v,b=t; break;
            case 3: r=p,g=q,b=v; break;
            case 4: r=t,g=p,b=v; break;
            case 5: r=v,g=p,b=q; break;
        }
        if (r>=0 && r<=1 && g>=0 && g<=1 && b>=0 && b<=1) {
            //return [(r*255).toFixed(0),(g*255).toFixed(0),(b*255).toFixed(0)];
            return [(r*255),(g*255),(b*255)];
        }
        return false;
    }
    
    function RGBtoGREYSCALE (r,g,b) {
        //wandelt r/g/b in Schwarz/Weiß um (Helligkeit 0..255)
        //r/g/b: R/G/B-Werte
        //return: false=Fehler, INT: 0..255
        r/=255;
        g/=255;
        b/=255;
        var bw=(0.2126*r)+(0.7152*g)+(0.0722*b);
        bw=Math.round(bw*255);
        if (bw>=0 && bw<=255) {
            return bw;
        }
        return false;
    }
    Zuletzt geändert von gaert; 16.02.2017, 09:11.
    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

    Kommentar


      #3
      Ich habe mal einen LBS dazu erstellt. ==> siehe HIER

      Damit kann man auf einen String/Zahl an E1 jede beliebige PHP Funktion anwenden. Den PHP Asudruck definiert man an E2. Das Ergebnis erhält man dann an A1.

      Beispiel:

      E1: "Die ist eine beliebiger String"
      E2: strtoupper(strrev($E1))
      A1: "GNIRTS REGIBEILEB ENIE TSI EID"

      E2 gibt an dass der String zuer invertiert (strrev()) und dann in Großbuchstaben (strtoupper()) konvertiert werden soll.

      Damit sollte eigentlich alles möglich sein was das Herz begehrt. Aber Vorsicht, damit kann man jeglichen PHP ausführen.

      Kommentar


        #4
        siehe auch 19000333 falls mehrere Ein / Ausgänge gewünscht sind. Ich nutze den Baustein gerne für simple Routinen die sonst keine Wiederverwendung haben.... Man muss aber ein wenig Ahnung von php haben....

        Kommentar


          #5
          Zitat von jonofe Beitrag anzeigen
          Ich habe mal einen LBS dazu erstellt. ==> siehe HIER

          Damit kann man auf einen String/Zahl an E1 jede beliebige PHP Funktion anwenden. Den PHP Asudruck definiert man an E2. Das Ergebnis erhält man dann an A1.

          Damit sollte eigentlich alles möglich sein was das Herz begehrt. Aber Vorsicht, damit kann man jeglichen PHP ausführen.
          Hallo und besten Dank für das LBS...

          Leider klappt die Installation nicht- Beim Versuch, den LBS zu installieren, kommt ein Syntaxfehler.

          Grüße,

          Gunnar

          Kommentar


            #6
            Zitat von junibart Beitrag anzeigen

            Leider klappt die Installation nicht- Beim Versuch, den LBS zu installieren, kommt ein Syntaxfehler.

            Verrätst du mir welcher?
            Ich hatte noch ein kleines Update hinterher geschoben. hatte zunächst $E statt $E1 verwendet.
            Hast du die letzte Version genommen?

            Zeig mal den Fehler...

            Kommentar


              #7
              Hallo,

              Fehlermeldung siehe Bild.
              Zwischenablage01.jpg

              Grüße,
              Gunnar

              Kommentar


                #8
                Habe den LBS jetzt noch mal neu hochgeladen und vorher getestet, ob er sich importieren lässt. Sollte eigentlich jetzt funktionieren.

                Kommentar

                Lädt...
                X