02_FTUISRV.pm - Zeiger auf Array übergeben (aka Auswahl aus mehreren Variablen)

Begonnen von spi3845, 15 April 2019, 20:45:19

Vorheriges Thema - Nächstes Thema

spi3845

Ich nutze FTUISRV zur Definition von Templates.

Ich habe für Temperaturanzeigen aufwendige RegEx erstellt, die ich ungern als Parameter an das entsprechende Part übergeben möchte. Statt dessen würde ich gerne die unterschiedlichen RegEx als Strings zur Auswahl im Part hinterlegen und dann nur noch einen Zeiger aus der html an das Part übergeben.

Also etwas der Art:
html-Datei

<?ftui-inc="templates/temperatur.ftui.part" dev="dg_Heizung_West" name="West" limit="2" ?>


part-Datei

<?ftui-if=( {('<?ftui-key=limit ?>' eq "1" )} ) ?>
    states='abc'
    limits='123'
<?ftui-endif ?>
<?ftui-if=( {('<?ftui-key=limit ?>' eq "2" )} ) ?>
    states='def'
    limits='456'
<?ftui-endif ?>
...


Geht das? Konnte mit ftui-if keine Variablen im Part zuweisen. Habe es auch im Header versucht, aber die korrekte Syntax nicht hinbekommen. Habe so etwas getestet:
<?ftui-header="Temperatur" dev name limit="2" states="{(('<?ftui-key=limit ?\>' eq "2" )? "def":... )}" ?>

Auch so etwas klappt nicht:

<?ftui-header="Temperatur" dev name limit
    <?ftui-if=( {('<?ftui-key=limit ?>' eq "2" )} ) ?\>
        xxx="abc"
    <?ftui-else ?\>
        xxx="default"
    <?ftui-endif ?\>
?>


Hat jemand einen Tipp für mich?

Update 1: Habe mir zwischenzeitlich mit einem Wrapper-Part geholfen, der den Part aufruft, der das Widget enthält. Unschön, weil zwei Dateien...

<?ftui-header="Temperatur" dev name status="1" ?>
<?ftui-if=( {('<?ftui-key=status ?>' eq "1" )} ) ?>
<?ftui-inc="temperatur_widget.ftui.part" dev="<?ftui-key=dev ?>" name="<?ftui-key=name ?>" xxx="xxx1" ?>
<?ftui-endif ?>
<?ftui-if=( {('<?ftui-key=status ?>' eq "2" )} ) ?>
<?ftui-inc="temperatur_widget.ftui.part" dev="<?ftui-key=dev ?>" name="<?ftui-key=name ?>" xxx="xxx2" ?>
<?ftui-endif ?>
<?ftui-if=( {('<?ftui-key=status ?>' eq "3" )} ) ?>
<?ftui-inc="temperatur_widget.ftui.part" dev="<?ftui-key=dev ?>" name="<?ftui-key=name ?>" xxx="xxx3" ?>
<?ftui-endif ?>
<?ftui-if=( {('<?ftui-key=status ?>' eq "4" )} ) ?>
<?ftui-inc="temperatur_widget.ftui.part" dev="<?ftui-key=dev ?>" name="<?ftui-key=name ?>" xxx="xxx4" ?>
<?ftui-endif ?>


Update 2: Habe es in eine Datei gepackt (test.ftui.part) und rekursiv aufgerufen, funktioniert auch, ist aber etwas fehleranfällig...

<?ftui-header="Temperatur" dev name states="" limits="" xxx="" status="0" recursive="0" ?>
<?ftui-if=( {('<?ftui-key=recursive ?>' eq "1" )} ) ?>
    <div data-type="symbol" class="normal"
        data-device="<?ftui-key=dev ?>"
        data-get="measured-temp"
        data-icons='["fa-thermometer-empty","fa-thermometer-half","fa-thermometer-full"]'
        data-states="<?ftui-key=states ?>"
        data-colors='["lightblue","green","#FF0000"]'
    ></div>
    <div class="grow-1 left-align left-narrow">
        <div data-type="label" class="inline"><?ftui-key=xxx ?></div>
        <div data-type="label" data-device="<?ftui-key=dev ?>" data-get="measured-temp" data-substitution="toDate().hhmm()" class="timestamp inline"></div>
        <div data-type="label" data-device="<?ftui-key=dev ?>" data-get="measured-temp" data-limits="<?ftui-key=limits ?>" data-colors='["white","white","white"]' data-unit="&deg;C" class="large left-align"></div>
    </div>
<?ftui-endif ?>

<?ftui-if=( {('<?ftui-key=status ?>' eq "1" )} ) ?>
    <?ftui-inc="test.ftui.part" dev="<?ftui-key=dev ?>" name="<?ftui-key=name ?>" xxx="xxx1" recursive="1" status="0" ?>
<?ftui-endif ?>
<?ftui-if=( {('<?ftui-key=status ?>' eq "2" )} ) ?>
    <?ftui-inc="test.ftui.part" dev="<?ftui-key=dev ?>" name="<?ftui-key=name ?>" xxx="xxx2" recursive="1" status="0" ?>
<?ftui-endif ?>
<?ftui-if=( {('<?ftui-key=status ?>' eq "3" )} ) ?>
    <?ftui-inc="test.ftui.part" dev="<?ftui-key=dev ?>" name="<?ftui-key=name ?>" xxx="xxx3" recursive="1" status="0" ?>
<?ftui-endif ?>
<?ftui-if=( {('<?ftui-key=status ?>' eq "4" )} ) ?>
    <?ftui-inc="test.ftui.part" dev="<?ftui-key=dev ?>" name="<?ftui-key=name ?>" xxx="xxx4" recursive="1" status="0" ?>
<?ftui-endif ?>

viegener

Ich muss zugeben, ganz vollständig habe ich Dein Problem nicht verstanden, aber die Lösung in Update 1 scheint mir auch die einzige zu sein.
Hintergrund: Es gibt heute keine Möglichkeit innerhalb einer part-Datei Werte für keys neu zu setzen (ausser im Header). Nur beim Aufruf von includes kann man Keys (Variablen) frei setzen.

Die Lösung in Update 2 verstehe ich nicht. Die Rekursion dient hier doch nur dazu nicht 2 getrennte Dateien zu haben?

Eine weitere Lösung ist natürlich immer die Variablen in FHEM (z.B. in einem Device zu hinterlegen) und dann in der part-Datei über set magic aus FHEM zu holen.

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

spi3845

Zitat von: viegener am 14 Mai 2019, 08:38:07
Ich muss zugeben, ganz vollständig habe ich Dein Problem nicht verstanden, aber die Lösung in Update 1 scheint mir auch die einzige zu sein.
Hintergrund: Es gibt heute keine Möglichkeit innerhalb einer part-Datei Werte für keys neu zu setzen (ausser im Header). Nur beim Aufruf von includes kann man Keys (Variablen) frei setzen.
Danke für das Feedback.
Mein Problem ist folgender Natur:

  • ich habe verschiedene Templates für Widget gleicher Art erstellt, die ich an verschiedenen Stellen in meinen GUIs nutze, z.B. Temperaturanzeige für verschiedene Räumen
  • die Räume lassen sich in Raumgruppen einteilen, z.B. Schlafzimmer, Bad, Wohnraum etc.
  • jede Raumgruppe hat Eigenschaften, die ich gern zur Visualisierung nutze (z.B. Einfärben des Icon je nach Temperatur)
  • ich kann das durch verschiedene part-Dateien lösen, z.B. temp-bad.ftui.part, temp-schlazi.ftui.part etc.
  • dann muss ich aber mehrere part-Dateien pflegen, wenn sich etwas an dem Widget ändert - ich hätte gerne eine part-Datei für all diese Fälle und möchte die Unterscheidung per Parameter beim Aufruf aus der html-Datei treffen
  • z.B. könnte ich beim Aufruf der part-Datei folgende Parameter übergeben: dev="t_bad" name="T Bad"
  • bei einfachen Parametern funktioniert das, es wird aber kompliziert, wenn Parameter der Form data-icons='["fa-thermometer-empty","fa-thermometer-half","fa-thermometer-full"]' benötigt werden - wie übergibt man das korrekt aus der hmtl-Datei an die part-Datei?
  • ich habe mir durch den geschachtelten/rekursiven Aufruf geholfen, in dem ich die Parameter erst in der part-Datei definiere (das macht auch den Aufruf aus der originären html-Datei einfacher und lesefreundlicher)
  • in der part-Datei setze ich die Parameter zusammen wie folgt: zuerst wird definiert nach Vorgabe (das ist sozusagen der Zeiger auf die Eigenschaften) icons1="fa-check-square-o" icons2="fa-window-close-o warn", danach wird ausgeführt data-icons='["<?ftui-key=icons1 ?>","<?ftui-key=icons2 ?>"]'

Zitat von: viegener am 14 Mai 2019, 08:38:07
Die Lösung in Update 2 verstehe ich nicht. Die Rekursion dient hier doch nur dazu nicht 2 getrennte Dateien zu haben?

Richtig. Ich hätte alle Informationen zu einem Widget gerne in einer einzigen Datei, das macht die Pflege leichter. Ich habe inzwischen in vielen part-Dateien die Rekursion eingebaut und sie funktioniert bisher zuverlässig. Es ist etwas gewöhnunsbedürftig in der Lesart, weil beim ersten Aufruf der part-Datei die unteren if-Blöcke mit {('<?ftui-key=status ?>' eq "1" )} etc. aufgerufen werden (zu diesem Zeitpunkt liefert {('<?ftui-key=recursive ?>' eq "1" )} noch false). In den unteren Blöcken werden die Variablen neu gesetzt und die part-Datei erneut aufgerufen, beim zweiten Aufruf ist dann recursive=1 und modus=0, so dass der erste if-Block ausgeführt wird und nicht mehr die unteren.

Zitat von: viegener am 14 Mai 2019, 08:38:07
Eine weitere Lösung ist natürlich immer die Variablen in FHEM (z.B. in einem Device zu hinterlegen) und dann in der part-Datei über set magic aus FHEM zu holen.
Ja, darüber hatte ich auch nachgedacht, aber wie oben schon geschrieben, hätte ich alle Informationen gerne an der Stelle, an der sie benötigt werden. In fhem brauche ich sie nicht, sondern erst für die GUI - daher möchte ich sie lieber in der html-Datei haben. Würde ich die Infos in fhem am Device hinterlegen, würde ich je Device nur einen Satz an Vorgaben ermöglichen. Durch meinen Ansatz kann jedes Gerät unterschiedliche Parameter auf unterschiedlichen ftui-Seiten bekommen.

Meine urspüngliche Frage bezog sich darauf, ob man das ganze einfacher realisieren kann z.B, in der Form, dass in der part-Datei ein Array mit Werten definiert wird und aus der html-Datei als Parameter ein Index auf das Array übergeben wird. Damit wäre die Schachtelung der part-Dateien nicht nötig.

viegener

Ich denke die Funktionalität, die Dir am ehesten helfen würde, wäre, wenn Du in der Datei selbst (z.B. im ftui-if) Werte für FTUI-Keys / Variablen setzen könntest, das ist so bisher nicht vorgesehen. Damit liesse sich die Rekursion vermeiden. Da jede Syntaxerweiterung aber auch die Komplexität bei der Bearbeitung (zur Laufzeit)  erhöht, habe ich das bisher nicht geplant und komme auch wohl in absehbarer Zeit nicht dazu. Für Deinen Anwendungsfall ist die Rekursion zwar etwas ungewöhnlich, aber solange Du alles in einer Datei haben willst, leider auch die einzige Lösung, die mir einfällt.

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

spi3845

Zitat von: viegener am 17 Mai 2019, 16:13:35
Ich denke die Funktionalität, die Dir am ehesten helfen würde, wäre, wenn Du in der Datei selbst (z.B. im ftui-if) Werte für FTUI-Keys / Variablen setzen könntest, das ist so bisher nicht vorgesehen. Damit liesse sich die Rekursion vermeiden. Da jede Syntaxerweiterung aber auch die Komplexität bei der Bearbeitung (zur Laufzeit)  erhöht, habe ich das bisher nicht geplant und komme auch wohl in absehbarer Zeit nicht dazu. Für Deinen Anwendungsfall ist die Rekursion zwar etwas ungewöhnlich, aber solange Du alles in einer Datei haben willst, leider auch die einzige Lösung, die mir einfällt.
Alles klar und danke! Ich habe mich an die Rekursion gewöhnt und kann damit leben ;-)