Widgets Label & Dynamik

Begonnen von rogerknop, 17 Dezember 2021, 09:36:18

Vorheriges Thema - Nächstes Thema

rogerknop

Hallo,

ich benutze sehr häufig die Widgets: https://wiki.fhem.de/wiki/FHEMWEB/Widgets

Da hätte ich 2 Fragen:

1. Würde ich gerne ein reines Label anzeigen. Es gibt ja textField (Label & Inputfeld) und textFieldNL (nur Inputfeld). Ich hätte jetzt gerne noch ein Label ohne Inputfeld. Gibt es dafür schon eine Lösung?

2. Angenommen ich hätte mehrere Devices mit einem User Attribut, die ich in Utils ermittle. Kann ich dann Dynamisch für jedes dieser Devices ein neues Widget generieren zur Laufzeit? Oder wie könnte man ein solches Problem lösen?

Danke & Grüße,
Roger

rudolfkoenig

1. Womoeglich hilft webCmdLabel: https://fhem.de/commandref_modular.html#webCmdLabel
2. Mir faellt z.Zt. nur die kuerzlich eingebaute SetExtensions-Erweiterung ein: wenn ein widget-spec den Regexp {[^ ]+} matcht, dann wird das evalueiert. Siehe auch: https://forum.fhem.de/index.php/topic,124505.msg1190832.html#msg1190832

TomLee

Zitat2. Mir faellt z.Zt. nur die kuerzlich eingebaute SetExtensions-Erweiterung ein: wenn ein widget-spec den Regexp {[^ ]+} matcht, dann wird das evalueiert.

Da komm ich nicht ganz mit, wie ich es verstanden habe greift die Änderung doch nur in setList eines MQTT2_DEVICE ?
Ein Test vor ein paar Tagen in setList bei einem dummy schlug zumindest fehl und zeigte das gleiche Verhalten wie immer ({my im Auswahlfeld).

rogerknop

Hallo Rudi,

WebCmdLabel ist ja nur für das Label zu einem Widget, wenn ich es richtig verstanden habe.
Ich möchte aber eigentlich ein eigenes Widget LABEL, um Readingswerte nur anzuzeigen.

Das mit den setExtensions hört sich spannend an. Allerdings geht es ja bei mir darum, dass ich eigentlich mehrere Widgets on-the-fly "generieren" möchte.

Grüße, Roger

rudolfkoenig

ZitatEin Test vor ein paar Tagen in setList bei einem dummy schlug zumindest fehl und zeigte das gleiche Verhalten wie immer ({my im Auswahlfeld).
Dummy ruft SetExtensions nur bei gesetzten useSetExtensions Attribut auf.


ZitatWebCmdLabel ist ja nur für das Label zu einem Widget, wenn ich es richtig verstanden habe.
Die Aufgabe ist schwammig genug beschrieben, so dass ich Faelle vorstellen kann, wo ein webCmdLabel (evtl. mit HTML Formatierung) sie loesen koennte.
Und was Anderes habe ich nicht gefunden :)

ZitatAllerdings geht es ja bei mir darum, dass ich eigentlich mehrere Widgets on-the-fly "generieren" möchte.
Ich will nicht behaupten, dass das Feature diese Aufgabe einfach und direkt loest.
Es ist nur das Einzige, was mir im Zusammenhang mit dynamischen Widget einfaellt.

Der Bereich der Befehle (webCmd & co) ist nicht so dynamisch, wie der Bereich der Statusanzeige, wo man mit devStateIcon (auch) beliebiges HTML generieren kann.

Der Fokus von FHEMWEB ist nicht ein beliebig konfigurierbares Bedienungs-Frontend (das koennen andere wie FUIP besser), sondern was out-of-the-box halbwegs Brauchbares, um die Automatisierung zu konfigurieren.

beaune

Als Widget für ein reines Label habe ich schon mal iconLabel verwendet. Gibt man da kein Icon an, wird der aktuelle Wert angezeigt. Hilft das vielleicht?

rogerknop

@Rudi: Das ist mir auch schon klar, dass es kein beliebig konfigurierbares UI ist. Allerdings gab es schon oft Lösungen, die ich selbst nicht direkt gesehen habe. Daher wollte ich nur nachfragen.

@beaune:
Das klingt genau nach so einer Lösung, die ich suche!
Ich habe im setList mal lastMsg:iconLabel hinzugefügt. In der Hoffnung dass dan ein Reading lastMsg angelegt wird, was ich mit einem bel. Text setzen kann.

Damian

#7
Hier ein Beispiel mit "voller" Dynamik, sowohl ein Label als auch ein FHEM-Widget werden durch das Ändern der entsprechenden Readings hier wochentag bzw. Tage dynamisch angepasst (die Definition muss nicht angepasst werden).

defmod di_set DOIF {}
attr di_set room test4
attr di_set uiTable {package ui_Table;;}\
[$SELF:wochentag]|widget([$SELF:wochentag],::ReadingsVal("$SELF","Tage",""))



Doku siehe: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#FHEM-Widgets_mit_der_Funktion_widget

Edit: siehe Animation im Anhang
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rogerknop

Hallo Damian,

das kling ja echt interessant!

Habe schon einiges gelesen, bin aber noch nicht ganz durchgestiegen.
Gibte s eine Möglichkeit die Tabellendefinition mit den Zeilen und Spalten auch in eine Perl Funktion auszulagern?
Dass hier dann auch ein String mit der Definition zurückgeliefert wird?

Auf jeden Fall tolle Arbeit!

Danke & Grüße,
Roger

Damian

Warum willst du die Tabellendefinition in Perl auslagern? Die einzelnen Zellen sind weitgehend Perl, sie werden mit eval ausgewertet. Soll eine Zelle sich dynamisch ändern können, braucht sie einen Trigger - das sind die Angaben in eckigen Klammern - das versteht Perl nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rogerknop

Ich habe mal einen einfachen Test gestartet:

fhem.cfg

define rokuiTable DOIF ##
setuuid rokuiTable 61bf6934-f33f-0fde-273d-3c170e694cf8b154
attr rokuiTable alias Meldungen
attr rokuiTable group Bewässerung Garten
attr rokuiTable room Bewässerung
attr rokuiTable uiTable ## keine Package-Definition im Perlblock\
\
## Tabellendefinition befindet sich im Package main\
\
## Funktionen aus dem main-Package können unmittelbar angegeben werden\
rokTable()


99_myUtils.pm

sub rokTable {
  my $table = "<table>";
  $table .= "<tr><td>R1S1</td><td>R1S2</td></tr>";
  $table .= "<tr><td>R2S1</td><td>R2S2</td></tr>";
  #my $wid = ui_table::WID([<device>:<reading>],<widget parameter>);
  $table .= "</table>";
  return ($table);
}


Das Ergebnis ist schon super!
Nur würde ich gerne noch in das HTML Widgets reingenerieren.
Da komme ich derzeit noch nicht weiter, wäre aber echt genial!
Dann kann man sich ja beliebig eine Ausgabe zusammenbasteln.

Danke & Grüße,
Roger


rogerknop

Zitat von: Damian am 19 Dezember 2021, 18:15:19
Warum willst du die Tabellendefinition in Perl auslagern? Die einzelnen Zellen sind weitgehend Perl, sie werden mit eval ausgewertet. Soll eine Zelle sich dynamisch ändern können, braucht sie einen Trigger - das sind die Angaben in eckigen Klammern - das versteht Perl nicht.

Ich möchte ja dynamisch auch die Zeilen generieren.
Aber ich glaub ich verstehe das Problem mit dem Trigger.
Das würde bedeuten, dass meine Anzeige sich bei Änderungen nicht Updaten würde - korrekt?
Und heisst das, dass ich bzgl. meiner vorherigen Frage keine Widgets mit reingenerieren kann?

Damian

#12
Zitat von: rogerknop am 19 Dezember 2021, 18:49:41
Ich möchte ja dynamisch auch die Zeilen generieren.
Aber ich glaub ich verstehe das Problem mit dem Trigger.
Das würde bedeuten, dass meine Anzeige sich bei Änderungen nicht Updaten würde - korrekt?
Und heisst das, dass ich bzgl. meiner vorherigen Frage keine Widgets mit reingenerieren kann?

So ist es. Die Idee hinter uiTable ist, dass man weitgehend von HTML/CSS-Syntax verschont wird. Natürlich kann man sich was in HTML bauen und in Funktionen verstecken, aber dann ist es statisch und ändert sich nur, wenn man die Seite aktualisiert. Soll eine Zelle sich automatisch ändern können, dann braucht sie halt einen Trigger. Es gibt auch Templates, damit lassen sich mit eine FOR-Schleife Tabellen mit vielen gleich aufgebauten Zeilen generieren. Allerdings ist die Größe der Tabelle selbst durch ihre Definition festgelegt. Soll sich die Anzahl von Spalten bzw. Zeilen ändern, dann muss die Definition geändert werden. Da aber eine Zelle einer Tabelle sich beliebig ändern kann, so kann man dort dynamisch eine Liste anzeigen, siehe https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Visualisierung:_offene_Fenster

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rogerknop

OK, aber könnte ich damit auch eine Liste von Devices erstellen, die ein bestimmten User Attribut haben?


[@as(<br>)"Fenster$":state:"open","keine"]


Hier so etwas wie: alleDevices mit UserAttribut ValveIP ?

Damian

Zitat von: rogerknop am 19 Dezember 2021, 19:14:47
OK, aber könnte ich damit auch eine Liste von Devices erstellen, die ein bestimmten User Attribut haben?


[@as(<br>)"Fenster$":state:"open","keine"]


Hier so etwas wie: alleDevices mit UserAttribut ValveIP ?

ja, siehe: https://fhem.de/commandref_DE.html#DOIF_aggregation
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF