[erledigt] uiTable FOR-Schleife: nur bestimmte Einträge anzeigen möglich?

Begonnen von Sany, 01 Dezember 2022, 17:30:58

Vorheriges Thema - Nächstes Thema

Sany

Hallo Damian,
ich habe mir die Tages-/Monats-/Jahresstatisik aus dem Wiki zusammengebaut und zusätzlich zu ein paar Cards noch eine Tabelle mit den verschiedenen Daten.
Im "push"-Teil habe ich den Wasserzähler und dann diverse Stromzähler eingetragen. In der Tabelle kann ich per FOR-Schleife nur auf alle Einträge zugreifen, würde aber gerne dem Wasserzähler die Liter und m³ als Einheiten mitgeben, in Form einer eigenen Überschrift.
In etwa so:

in der uiTable:
Zitat"Wasserzähler"|"heute(ltr)"|"gestern(ltr)"|........
FOR(@$_counter}, ???             <<<(hier nur die erste Zeile aus dem push-array)
"Name"   "Wh heute"   "KWH gestern"   "KWh Monat"....
FOR(@{$_counter},....  << hier ab Zeile 2 vom Array bis zum Ende

Gibts da Parameter ähnich dem "normalen" for-Befehl (for my i=0; i<5; i++)? Sonst wäre FOR ja eher foreach, oder?


Danke schon mal.


Gruß


Sany

fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

Zitat von: Sany am 01 Dezember 2022, 17:30:58
Hallo Damian,
ich habe mir die Tages-/Monats-/Jahresstatisik aus dem Wiki zusammengebaut und zusätzlich zu ein paar Cards noch eine Tabelle mit den verschiedenen Daten.
Im "push"-Teil habe ich den Wasserzähler und dann diverse Stromzähler eingetragen. In der Tabelle kann ich per FOR-Schleife nur auf alle Einträge zugreifen, würde aber gerne dem Wasserzähler die Liter und m³ als Einheiten mitgeben, in Form einer eigenen Überschrift.
In etwa so:

in der uiTable:
Gibts da Parameter ähnich dem "normalen" for-Befehl (for my i=0; i<5; i++)? Sonst wäre FOR ja eher foreach, oder?


Danke schon mal.


Gruß


Sany

Indizes gibt es intern schon: $i und $j. Auf die einzelnen Elemente eines zweidimensionalen Arrays hier @{$_sc} kann über den Platzhalter $i$j  zugreifen, $1$1 aktuelles Element der ersten Spalte, $1$2 aktuelles Element der zweiten Spalte usw.

Im dem vorherigen Wiki-Beispiel: https://wiki.fhem.de/wiki/DOIF/Automatisierung#Steuerung_von_Raumthermostaten_f.C3.BCr_mehrere_R.C3.A4ume_mit_GUI
habe ich diese Eigenschaft für die Erstellung einer dynamischen Tabelle genutzt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#2
Da sich bei mir die einheitliche Darstellung der Energie/Verbräuche inzwischen etabliert hat, werde ich die Definition (Wiki-Beitrag) so verallgemeinern, dass die Tabelle automatisch erstellt wird.

Edit:

Zukünftig soll es möglich sein, den Tages-/Monats-/Jahresverbrauch als Säulen darzustellen. So sollen z. B. Monatsverbräuche jeweils eines Jahres der letzten X-Jahre nebeneinander dargestellt werden können.

siehe: https://forum.fhem.de/index.php/topic,130437.msg1246847.html#msg1246847
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sany

Hallo Damian,

vielen Dank für Deine Antwort.
Zitatndizes gibt es intern schon: $i und $j. Auf die einzelnen Elemente eines zweidimensionalen Arrays hier @{$_sc} kann über den Platzhalter $i$j  zugreifen, $1$1 aktuelles Element der ersten Spalte, $1$2 aktuelles Element der zweiten Spalte usw.

Das war nur ein Teil von dem, was ich wollte, habe mich da nicht richtig ausgedrückt.

Von meinen 10 push-Einträgen ist der erste der Wasserzähler, die restlichen für Strom.
Ich wollte nun in der uiTable zuerst die erste Zeile vom array, also wasser, dann eine Legende für Strom, dann die restlichen Zeilen vom array. Der Aufruf auch in einer Schleife.

Ich habe nun folgende Lösung gefunden:
in der DEF pushe ich einfach in mehrere arrays: eins für Wasser, enthält nur den Wasserzähler, eins für PV, enthält alle Zähler für Bezug, Einspeisung, Ertrag, und noch ein array für die restlichen Zähler.
Den Aufruf der TPL am Ende der DEF mache ich einfach 3x für die verschiedenen arrays, ebenso in der uiTable nutze ich eben verschieden FOR-Schleifen für die Erstellung der Tabelle.
Funktioniert prima und das DOIF bleibt übersichtlich.


Gruß


Sany
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

Zitat von: Sany am 02 Dezember 2022, 08:37:17
Hallo Damian,

vielen Dank für Deine Antwort.
Das war nur ein Teil von dem, was ich wollte, habe mich da nicht richtig ausgedrückt.

Von meinen 10 push-Einträgen ist der erste der Wasserzähler, die restlichen für Strom.
Ich wollte nun in der uiTable zuerst die erste Zeile vom array, also wasser, dann eine Legende für Strom, dann die restlichen Zeilen vom array. Der Aufruf auch in einer Schleife.

Ich habe nun folgende Lösung gefunden:
in der DEF pushe ich einfach in mehrere arrays: eins für Wasser, enthält nur den Wasserzähler, eins für PV, enthält alle Zähler für Bezug, Einspeisung, Ertrag, und noch ein array für die restlichen Zähler.
Den Aufruf der TPL am Ende der DEF mache ich einfach 3x für die verschiedenen arrays, ebenso in der uiTable nutze ich eben verschieden FOR-Schleifen für die Erstellung der Tabelle.
Funktioniert prima und das DOIF bleibt übersichtlich.


Gruß


Sany

Das ist auch die sinnvolle Lösung. Man kann sagen: Ein zweidimensionales Array sollte für alle Elemente z. B. einer Spalte die gleiche Bedeutung haben, die Überschrift gehört da nicht dazu. Also gehört sie nicht in dieses Array. Das würde man z. B. bei der Definition einer relationalen Datenbank nicht anders machen, wenn man einzelne Tabellen definiert. Die Überschriften sind nicht die Inhalte, sondern beschreiben lediglich die Bedeutung der Inhalte.
Und da man beliebig viele FOR-Schleifen ineinander schachteln kann (ich habe eine Rekursion im Parser eingebaut) und man auf jedes Element des aktuellen Durchlauf jeder Schleife zugreifen kann, sollte sich jede erdenkliche Darstellung realisieren lassen, wenn man die Informationen geschickt auf verschiedene Arrays verteil. Das ist besonders deutlich beim geposteten Wiki-Beispiel zu Heizungssteuerung.




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

Sany

Zitatdie Überschrift gehört da nicht dazu. Also gehört sie nicht in dieses Array.
nein, die stehen auch nicht im array, sondern werden einfach in der uiTable als Textzeile zwischen die FOR-Loops geschrieben.
Aber das ineinanderschachteln ist interessant, muss mir das Beispiel noich genauer ansehen....
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

Zitat von: Sany am 02 Dezember 2022, 09:32:12
nein, die stehen auch nicht im array, sondern werden einfach in der uiTable als Textzeile zwischen die FOR-Loops geschrieben.
Aber das ineinanderschachteln ist interessant, muss mir das Beispiel noich genauer ansehen....

Wenn alle Inhalte einer Spalte die gleiche Bedeutung haben, dann gibt es auch keinen Grund die erste Zeile anders zu behandeln.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sany

Name ltr today ltr lastDay m³ Month m³ lastMonth m³ Year
Wasserzähler 33         333          0.366 6.259        96.589
Wh today KWH lastDay KWh Month KWh lastMonth KWh Year
...hier kommen die Werte der verschiedenen Stromzähler....


So sieht das aus. Der erste Eintrag im ursprünglichen array war halt der Wasserzähler, der Rest sind Stromzähler. Deshalb die erste Zeile anders, da andere Einheiten.
Mit den verscheidenen arrays geht das nun problemlos, die Legende ist nur Text in der uiTable.
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

Zitat von: Sany am 02 Dezember 2022, 10:12:48
Name ltr today ltr lastDay m³ Month m³ lastMonth m³ Year
Wasserzähler 33         333          0.366 6.259        96.589
Wh today KWH lastDay KWh Month KWh lastMonth KWh Year
...hier kommen die Werte der verschiedenen Stromzähler....


So sieht das aus. Der erste Eintrag im ursprünglichen array war halt der Wasserzähler, der Rest sind Stromzähler. Deshalb die erste Zeile anders, da andere Einheiten.
Mit den verscheidenen arrays geht das nun problemlos, die Legende ist nur Text in der uiTable.
OK. Dann ist es wohl am einfachsten ein Array für Wasserzähler zu machen und ein Array für Stromzähler. In dem konkreten Fall lohnt sich der Aufwand die zwei Überschriftzeilen in ein Array zu packen nicht unbedingt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF