FHEM Forum

FHEM => Frontends => TabletUI => Thema gestartet von: spi3845 am 15 April 2019, 20:45:19

Titel: 02_FTUISRV.pm - Zeiger auf Array übergeben (aka Auswahl aus mehreren Variablen)
Beitrag von: spi3845 am 15 April 2019, 20:45:19
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 ?>
Titel: Antw:02_FTUISRV.pm - Zeiger auf Array übergeben (aka Auswahl aus mehreren Variablen)
Beitrag 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.

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.

Titel: Antw:02_FTUISRV.pm - Zeiger auf Array übergeben (aka Auswahl aus mehreren Variablen)
Beitrag von: spi3845 am 14 Mai 2019, 09:24:45
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:

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.
Titel: Antw:02_FTUISRV.pm - Zeiger auf Array übergeben (aka Auswahl aus mehreren Variablen)
Beitrag 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.

Titel: Antw:02_FTUISRV.pm - Zeiger auf Array übergeben (aka Auswahl aus mehreren Variablen)
Beitrag von: spi3845 am 17 Mai 2019, 16:45:31
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 ;-)