Ankündigung

Einklappen
Keine Ankündigung bisher.

basic.symbol - Symbol abhängig von zwei Variablen

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

    basic.symbol - Symbol abhängig von zwei Variablen

    Hallo zusammen,

    in Anlehnung an diesen Beitrag
    https://knx-user-forum.de/forum/supportforen/smartvisu/1061839-basic-symbol-mode-a-and-not-b-und-not-a-and-b-wie-möglich-oder-anders?p=1062097#post1062097
    habe ich versucht, ein gekipptes oder ganz geöffnetes Fenster dazustellen. Leider scheitere ich an der Formel.

    Im geschlossenen Zustand sind beide Werte = true.
    Wenn der erste VAL1 false ist und VAL2 true ist, dann ist das Fenster gekippt. Wenn beide Werte false sind, ist das Fenster offen.
    Wie kann ich das als Formel hinterlegen, so dass dann das jeweils "richtige" Symbol angezeigt wird?

    {{ basic.symbol('', ['knx.0.Heizung_Klima.Fensterkontakt.OG_Büro_Fenste rkontakt_gekippt', 'knx.0.Heizung_Klima.Fensterkontakt.OG_Büro_Fenste rkontakt_offen'], '', ['fts_window_2w_tilt.svg', 'fts_window_2w_open_lr.svg'], ['1', '2'], '(if(VAL1===false AND VAL2===true){return 1;} else if(VAL1===false AND VAL2===false){return 2;})', 'icon1') }}
    Viele Grüße
    Zuletzt geändert von YellowFlash; 07.10.2020, 08:36.

    #2
    Hi,

    schau mal hier. Da habe ich schon ein gekipptes Fenster mit mehreren Zuständen als dynamisches Icon realisiert. Weitere Fenster-Widgets befinden sich in example3.graphic.

    Übrigens lauten die Variablen in der Formel "VAR" und nicht "VAL". Ob die Formel so akzeptiert wird, kann ich nicht auswendig sagen. Im Docstring steht, dass das Ergebnis der Formel noch mit einem Schwellwert verglichen wird.
    Code:
    * @param {formula=or} 'or', 'and' or any JavaScript expression with following variables, result will be compared to comparative value above. Additionally you can use 'min' and 'max' to test if any of the defined items has a value >= or <= comparative value (default 'or')
    	VAR1, VAR2, ... represent the corresponding item's value, VAR is an array of all item values
    	If the formula starts with a greater than symbol '>' the value will be treated as threshold. The symbol (text, icon and color) according to greatest reached threshold will be shown. The first symbol is the base for values below first threshold, so pass one symbol more than values.
    	If '>' is not used, symbols will only be shown if the item value matches exactly one of the given value parameters
    Gruß
    Wolfram

    Kommentar


      #3
      Ich habe das nun mal auf eine Minimalformel gebracht und erhalte immer den Fehler "invalid formula - SyntaxError: return not in function"

      {{ basic.symbol('', ['knx.0.Heizung_Klima.Fensterkontakt.OG_Büro_Fenste rkontakt_gekippt', 'knx.0.Heizung_Klima.Fensterkontakt.OG_Büro_Fenste rkontakt_offen'], '', ['fts_window_2w_tilt.svg', 'fts_window_2w_open_lr.svg'], ['1', '2'], 'if(1==1){return "1";}', 'icon1') }}
      Was muss ich an der if-Formel ändern, damit ich einen validen Code bekomme?
      Dann kann ich mich mit VAR1 und VAR2 weiter rantasten.

      Viele Grüße

      Kommentar


        #4
        Ich kann es Dir aktuell nicht genau sagen. Der js-Code zur Verarbeitung der Formel steht in ./widgets/basic.js im widget basic.symbol (im master branch ab Zeile 1190). Da Du Dich in js auszukennen scheinst, findest Du den Ansatz vielleicht selbst.

        Einfache Formeln sind dort direkt programmiert (and, or, min, max) und können als Vorlage genutzt werden, aber es scheinen darüber hinaus grundsätzlich alle Formeln verwendbar zu sein, die mit der js-Funktion eval() auszuführen sind. Die Fehlermeldung "SyntaxError: return not in function" kommt direkt aus eval.

        Gruß
        Wolfram

        Kommentar


          #5
          Ok, so tief sind meine Kenntnisse leider nicht, als dass ich das verstehen würde.
          Einfache if-then-else-Konstrukte mit Vergleichsoperatoren bekomme ich hin, das war es dann aber auch.
          Da komme ich so leider nicht weiter.

          Kommentar


            #6
            Mach's nicht so kompliziert.
            Ok, wenn das so klappen würde, wäre es eine elegante Lösung, aber erstmal willst du, dass es in der Visu macht was es soll.
            Was für ein Backend verwendest du mit der Visu? SHNG oder was anderes?

            Berechne per Logik einen Wert aus den zwei Bits, z.B. 0,1,2 für geschlossen, offen, gekippt.

            In der Visu dann MEHRERE basic.symbol für EIN Fenster. Z.B. so:

            Code:
            {{ basic.symbol('WZ_Terrassentuer_Gekippt', 'Wohnzimmer.Terrassentuer.Wert', 'Terrassentür gekippt', 'fts_door_tilt.svg', 2, '', '#FF0')
            {{ basic.symbol('WZ_Terrassentuer_Offen', 'Wohnzimmer.Terrassentuer.Wert', 'Terrassentür offen', 'fts_door_open.svg', 1, '', '#F00') }}
            {{ basic.symbol('WZ_Terrassentuer_Zu', 'Wohnzimmer.Terrassentuer.Wert', 'Terrassentür geschlossen', 'fts_door.svg', 0) }}
            Wenn du SHNG verwendest, kann ich dir die Logik genauer erklären, bei Edomi oder so muss ich passen.

            Dass du in deinem basic.symbol zwei Leerzeichen in den item Namen hast ist dir aufgefallen? Stichwort "...Fenste rkontakt...

            Gruß, Martin

            Kommentar


              #7
              Zitat von Sipple Beitrag anzeigen
              Dass du in deinem basic.symbol zwei Leerzeichen in den item Namen hast ist dir aufgefallen? Stichwort "...Fenste rkontakt...
              Bisher nicht, danke.

              Berechne per Logik einen Wert aus den zwei Bits, z.B. 0,1,2 für geschlossen, offen, gekippt.
              So habe ich es nun gemacht. Ich arbeite mit ioBroker. Darin habe ich bereits mehrere Logiken programmiert. So nun auch für den Fensterstatus.
              In smartVISU kann ich dann mit einer einzigen Zeile den Fensterstatus anzeigen - funktioniert genau wie gedacht. Vielen Dank für die Unterstützung.

              {{ basic.symbol('', ['knx.0.Heizung_Klima.Fensterkontakt.OG_Büro_Fenste rkontakt'], '', ['fts_window_2w_tilt.svg', 'fts_window_2w_open_lr.svg'], ['1', '2'], '', 'icon1') }}
              Angehängte Dateien

              Kommentar


                #8
                Jepp, so geht's auch. Muss ich bei mir mal bei Gelegenheit auch anpassen. Das ging "damals" so noch nicht.

                Kommentar


                  #9
                  Prima. Danke fürs Teilen.
                  Mit der Logik kann man natürlich auch das oben verlinkte dynamische "windows" Widget nutzen, das zusätzlich noch die Position der Jalousie anzeigt.
                  Soweit der Werbeblock

                  Ich nehme parallel mal auf die to-do Liste, dass die Beispiele für mögliche Formeln in der Inline-Doku besser beschrieben werden.

                  Gruß
                  Wolfram

                  Kommentar


                    #10
                    Der Vollständigkeit halber hier noch ein Tipp für die Formel:
                    wenn es nur um if-Anweisungen geht, kann man das natürlich auch in boolscher Logik formulieren. In Kombination mit etwas Arithmetik efüllt die Formel
                    ( !VAR1 && VAR2 ) + 2 *( !VAR1 && !VAR2 )
                    die oben gestellte Aufgabe.

                    Mein Test-Code:
                    Code:
                    {{ basic.symbol('', ['bath.window.tilt', 'bath.window.open'], ['zu','gekippt','offen'], ['fts_window_2w', 'fts_window_2w_tilt.svg', 'fts_window_2w_open_lr.svg'], [0,1,2], '( !VAR1 && VAR2 ) + 2 *( !VAR1 && !VAR2 )', ['green','yellow', 'red']) }}
                    Gruß
                    Wolfram
                    Zuletzt geändert von wvhn; 07.10.2020, 11:10.

                    Kommentar


                      #11
                      Gerade getestet, macht genau das gleiche, wenn ich es wie unten leicht abwandele. Wenn das Fenster geschlossen ist, benötige ich keine Anzeige. Auch den Text dazu habe ich entfernt.
                      Insgesamt finde ich es angenehmer, die Logik in der Visu zu haben, als solche Sachen alle extra in ioBroker berechnen zu müssen.


                      {{ basic.symbol('', ['knx.0.Heizung_Klima.Fensterkontakt.OG_Büro_Fenste rkontakt_gekippt', 'knx.0.Heizung_Klima.Fensterkontakt.OG_Büro_Fenste rkontakt_offen'], '', ['fts_window_2w_tilt.svg', 'fts_window_2w_open_lr.svg'], [1,2], '( !VAR1 && VAR2 ) + 2 *( !VAR1 && !VAR2 )', ['icon1', 'icon1']) }}

                      Kommentar

                      Lädt...
                      X