Text (Datei) Listing ausgeben

Begonnen von KNUT345, 16 April 2016, 12:47:51

Vorheriges Thema - Nächstes Thema

KNUT345

Hallo Zusammen,
ich suche schon seit geraumer Zeit eine Möglichkeit in meiner FHEM Oberfläche Text aus einer Datei darzustellen,
so ähnlich wie das beim Update angezeigt wird oder hier beim Beitrag schreiben.
(https://forum.fhem.de/index.php?action=dlattach;topic=52252.0;attach=50610;image)
Allerdings soll nicht die komplette Datei sondern nur einzelne Zeilen davon eingelesen werden.
Hier könnte ich mir eine Lösung über ein bisschen Perl schon vorstellen.
Nur wo schreibe ich die Daten dann hin?

Auf der Suche nach einer Lösung habe ich bereits 2 Möglichkeiten gefunden, die mir allerdings noch nicht so richtig gefallen wollen.

Variante 1: https://forum.fhem.de/index.php?topic=42163.0
{ fhem("setreading dummyDevice myReading ".`cat /opt/fhem/blub`) }
Würde evtl. über Umweg, Zerlegen der Datei, funktionieren.

Variante 2: https://forum.fhem.de/index.php?topic=35797.0
define hr weblink htmlCode <hr>das ist mein text<hr>
(https://forum.fhem.de/index.php?action=dlattach;topic=52252.0;attach=50608;image)
Das gefällt mir schon recht gut, allerdings habe ich deutlich mehr Zeilen und hätte darum gerne eine vertikale Bildlaufleiste.
Allerdings will mir das mit der Option htmlattr nicht gelingen.
Zitathtmlattr width="20%" height="50" frameborder="10" marginheight="10" marginwidth="10"

Wo ist mein Fehler?
Gibt es eine andere Lösung?

Danke im voraus.

KNUT345

Hallo Zusammen, hat keiner einen Tipp für mich?

Ellert

Siehe https://forum.fhem.de/index.php/topic,43668.msg417363.html#msg417363

Wenn Du das Beispiel umbaust, könnte es Deiner Vorstellung nahe kommen.

KNUT345

#3
Danke für den Tipp.
Ich hab mal versucht es um zu setzten aber so richtig bringt mich das nicht ans Ziel.

OK, Text kann ich problemlos eingeben:
(https://forum.fhem.de/index.php?action=dlattach;topic=52252.0;attach=51505)

Zur Anzeige hätte ich eine readingsGroup gewählt.
(https://forum.fhem.de/index.php?action=dlattach;topic=52252.0;attach=51507)
Aber dann wird aus meinen Zeilen untereinander Felder nebeneinander.

Wie gesagt Danke für den Tipp,
aber was ich suche soll im Frontend so aussehen wie:
(https://forum.fhem.de/index.php?action=dlattach;topic=52252.0;attach=50610)

Eigentlich wollte ich das ja so machen wie es beim Update abläuft,
heißt Textfeld evtl über weblink htmlcode mit falls erforderlich vertikaler und horizontaler Bildlaufleiste.
Wobei ich mich in diesem Fall noch frage wie ich den Text da rein bekomme...

Ist die Darstellung nur für Entwickler verfügbar?

Grüße
Knut

Ellert

Wenn Du Dir das Beispiel anlegst
defmod helpText cmdalias set .* helpText AS { AttrVal($EVTPART0, "comment", "No comment") }
define d1 dummy
attr d1 webCmd helpText
attr d1 comment This is comment for d1

und dann in der Detailansicht des Dummys auf helpText klickst, bekommst Du den Inhalt von comment angezeigt , wie das Logfile, den Event-Monitor oder das Update-Listing.

Ist das die Ausgabe, die Du haben möchtest?

Ellert

Ich habe mir das so zusammengebastelt, Du benötigst einen cmdalias.

defmod Liste cmdalias set .* AbfrageListe AS {Abfrage}

dann eine Funktion, die Deine Liste zeilenweise zurück gibt.

sub Abfrage {
...
return $liste;
}

und die Funktion rgLink, sie kommt von hier: http://www.fhemwiki.de/wiki/ReadingsGroup#Funktion_rgLink.28.29
ich habe sie erweitert um den command-Teil:
############ Devicelink erzeugen #############
sub rgLink {
  my ($name,$action,$label,$command) = @_;
  my $link = "";
  my $fhemLink = "";
  my $txt = "";
  my $ret = "";
  my $divStyle = "";
  my $aStyle = "text-decoration:underline;";
 
  # FHEM Variablen einbinden
  use vars qw($FW_ME);
  use vars qw($FW_subdir);
  use vars qw($FW_ss);
  use vars qw($FW_tp);

  if( $action eq "konfigurieren" ){
    $fhemLink  = "detail=$name";
    $divStyle = "cursor:pointer;font-size:11px;padding-bottom:2px;padding-left:3px;";
  }
  elsif( $action eq "detail" ){
    $fhemLink  = "detail=$name";
    $divStyle = "cursor:pointer;display:inline;";
  }
  elsif( $action eq "command" ){
    $fhemLink  = "detail=$name&cmd.$name=set%20$name%20$command";
    $divStyle = "cursor:pointer;display:inline;";
  }

$link = '<a onclick="location.href=\'' . $FW_ME . $FW_subdir . '?' . $fhemLink . '\'" style="' . $aStyle . '">' . $label . '</a>';
  $txt  = '<div style="' . $divStyle . '">' . $link . '</div>';
  $ret  = "$txt";
  return $ret;
}


und jetzt noch die Readingsgroup

define rgListe readingsGroup rgListe:,<{rgLink('rgListe','command','Liste_aufrufen','AbfrageListe')}>


KNUT345

Zitat von: Ellert am 30 April 2016, 19:12:12
Wenn Du Dir das Beispiel anlegst
defmod helpText cmdalias set .* helpText AS { AttrVal($EVTPART0, "comment", "No comment") }
define d1 dummy
attr d1 webCmd helpText
attr d1 comment This is comment for d1

und dann in der Detailansicht des Dummys auf helpText klickst, bekommst Du den Inhalt von comment angezeigt , wie das Logfile, den Event-Monitor oder das Update-Listing.

Ist das die Ausgabe, die Du haben möchtest?
Ok, das kommt meiner Vorstellung schon recht nahe, muss ich mal in Ruhe ausprobieren.

Das Beispiel mit der RG und der Liste das muss ich erst mal verdauen...

Ellert

Also, in die Funktion Abfrage gehört das Auslesen der Datei.

sub Abfrage {
   my $rohdaten =  fhem "cat /opt/fhem/blub";
      "Hier könnte ich mir eine Lösung über ein bisschen Perl schon vorstellen."
   return $liste;
}


ZitatNur wo schreibe ich die Daten dann hin?

In den cmdalias. AbfrageListe AS {Abfrage} Du kannst den Kode von "Abfrage" direkt in die Definition des cmdalias schreiben oder eine Funktion in der 99_myUtils.pm erstellen.

Die Funktion "rgLink" macht dann einen Link daraus, der so aussieht, wie "helpText" in der Detailansicht von d1 aus dem Beispiel.

KNUT345

Vielen Dank für die Tipps. :)
Ich hab das nun soweit hinbekommen, Dummy mit webcmd und cmdalias,
Datei einlesen, ggf. Zeilen filtern, usw. und in einem Textfeld ausgeben.
Das entspricht nun schon fast meiner Vorstellung.
Was mir leider immer noch nicht gefällt ist, dass das Textfeld als Dialog aufgeht.
Eigentlich suche ich eine Lösung wie ich es direkt in die Ansicht, eben wie mit weblink, integrieren kann.
Ist der Vorschlag mit der Integration in eine readingsGroup da eine Lösung,
oder ist es nur eine Alternative zu Dummy mit webcmd und cmdalias?

Grüße

Ellert

ZitatWas mir leider immer noch nicht gefällt ist, dass das Textfeld als Dialog aufgeht.
Ich bin mir nicht sicher woran das liegt.

Wenn Du in der Raumansicht auf webcmd klickst bekommst Du den Dialog.
Wenn Du in der Detailansicht des Dummys klickst, gibt es den Text direkt in der Ansicht, wie im Beispiel bei d1.

rgLink erzeugt in der ReadingsGroup einen Link der so aussieht als würdest Du in der Detailansicht drauf klicken.

Es wird ein Link erzeugt, der so aussieht:
http://IP:Port/fhem?detail=rgListe&cmd.rgListe=set%20rgListe%20AbfrageListe

KNUT345

#10
Ok, ich sehe den Unterschied.
Ja und die Variante aus der Detailansicht des Dummys kommt meiner Vorstellung schon sehr nahe.
Allerdings habe ich da das Problem, dass mein Umwandlen/Zerlegen nicht optimal ist.
Meine Rohdaten sehen so aus:

2016-01-10_16:43:49 Energie_Speichern 0
2016-01-10_16:43:59 Strom1 DeltaHour: 243.13
2016-01-10_16:43:59 Strom1 Ist: 20644.6
2016-01-10_16:43:59 Strom1 Delta: 28.0999999999985
2016-01-10_16:43:59 Strom1 DeltaPerHour: 115.57
2016-01-10_16:44:06 Strom2 DeltaHour: 243.13
2016-01-10_16:44:06 Strom2 Ist: 81696.0
2016-01-10_16:44:06 Strom2 Delta: 150.5
2016-01-10_16:44:06 Strom2 DeltaPerHour: 619.01
2016-01-10_16:44:13 Strom3 DeltaHour: 243.13
2016-01-10_16:44:13 Strom3 Ist: 4411.4
2016-01-10_16:44:13 Strom3 Delta: 6
2016-01-10_16:44:13 Strom3 DeltaPerHour: 24.67
2016-01-10_16:44:20 Strom4 DeltaHour: 243.14
2016-01-10_16:44:20 Strom4 Ist: 3342.2
2016-01-10_16:44:20 Strom4 Delta: 5
2016-01-10_16:44:20 Strom4 DeltaPerHour: 20.56
2016-01-10_16:44:28 KWasser DeltaHour: 243.14
2016-01-10_16:44:28 KWasser Ist: 156.848
2016-01-10_16:44:28 KWasser Delta: 7.20100000000002
2016-01-10_16:44:28 KWasser DeltaPerHour: 29.61
2016-01-10_16:44:35 WWasser DeltaHour: 243.14
2016-01-10_16:44:35 WWasser Ist: 2979.276
2016-01-10_16:44:35 WWasser Delta: 2.05299999999988
2016-01-10_16:44:35 WWasser DeltaPerHour: 8.44
2016-01-10_16:44:42 Gas DeltaHour: 243.14
2016-01-10_16:44:42 Gas Ist: 17010.640
2016-01-10_16:44:42 Gas Delta: 152.041000000001
2016-01-10_16:44:42 Gas DeltaPerHour: 625.32
2016-01-10_16:44:49 Solar DeltaHour: 243.14
2016-01-10_16:44:49 Solar Ist: 8782
2016-01-10_16:44:49 Solar Delta: 3
2016-01-10_16:44:49 Solar DeltaPerHour: 1.2
2016-01-10_16:44:55 GWasser DeltaHour: 243.14
2016-01-10_16:44:55 GWasser Ist: 53.478
2016-01-10_16:44:55 GWasser Delta: 0
2016-01-10_16:44:55 GWasser DeltaPerHour: 0

2016-01-10_16:43:59 Energie_Speichern 1
2016-01-17_14:41:57 Energie_Speichern 0
2016-01-17_14:43:32 Strom1 DeltaHour: 165.99
2016-01-17_14:43:32 Strom1 Ist: 20664.7
2016-01-17_14:43:32 Strom1 Delta: 20.1000000000022
2016-01-17_14:43:32 Strom1 DeltaPerHour: 121.09
2016-01-17_14:43:38 Strom2 DeltaHour: 165.99
2016-01-17_14:43:38 Strom2 Ist: 81794.7
2016-01-17_14:43:38 Strom2 Delta: 98.6999999999971
2016-01-17_14:43:38 Strom2 DeltaPerHour: 594.61
2016-01-17_14:43:43 Strom3 DeltaHour: 165.99
2016-01-17_14:43:43 Strom3 Ist: 4417.0
2016-01-17_14:43:43 Strom3 Delta: 5.60000000000036
2016-01-17_14:43:43 Strom3 DeltaPerHour: 33.73
2016-01-17_14:43:49 Strom4 DeltaHour: 165.99
2016-01-17_14:43:49 Strom4 Ist: 3346.5
2016-01-17_14:43:49 Strom4 Delta: 4.30000000000018
2016-01-17_14:43:49 Strom4 DeltaPerHour: 25.9
2016-01-17_14:43:54 KWasser DeltaHour: 165.99
2016-01-17_14:43:54 KWasser Ist: 161.678
2016-01-17_14:43:54 KWasser Delta: 4.82999999999998
2016-01-17_14:43:54 KWasser DeltaPerHour: 29.09
2016-01-17_14:43:59 WWasser DeltaHour: 166
2016-01-17_14:43:59 WWasser Ist: 2980.98
2016-01-17_14:43:59 WWasser Delta: 1.70400000000018
2016-01-17_14:43:59 WWasser DeltaPerHour: 10.26
2016-01-17_14:44:05 Gas DeltaHour: 166
2016-01-17_14:44:05 Gas Ist: 17134.210
2016-01-17_14:44:05 Gas Delta: 123.57
2016-01-17_14:44:05 Gas DeltaPerHour: 744.39
2016-01-17_14:44:10 Solar DeltaHour: 166
2016-01-17_14:44:10 Solar Ist: 8792
2016-01-17_14:44:10 Solar Delta: 10
2016-01-17_14:44:10 Solar DeltaPerHour: 6
2016-01-17_14:44:15 GWasser DeltaHour: 166
2016-01-17_14:44:15 GWasser Ist: 53.478
2016-01-17_14:44:15 GWasser Delta: 0
2016-01-17_14:44:15 GWasser DeltaPerHour: 0

usw.


Mit meiner Abfrage:

open (DATEI, $datei) or die $!;
my @Ddaten = <DATEI>;
close (DATEI);
foreach my $Zeile (@Ddaten) {
  if(index($Zeile,"_Speichern") > -1) {
   $daten = $daten."<br>";
  }
  else
  {
   $daten = $daten.$Zeile."<br>";
  }
}
return $daten;


Sieht das in der Raumansicht dann so aus:
(https://forum.fhem.de/index.php?action=dlattach;topic=52252.0;attach=51592)

Hingegen in der Detailansicht wären dann die "<br>" überflüssig, denn dort sieht das so aus:
(https://forum.fhem.de/index.php?action=dlattach;topic=52252.0;attach=51594)

Gibt es für den Zeilenumbruch eine andere Funktion als "<br>"?
"\n" hab ich schon ohne Erfolg getestet.
Mal eine Weile testen und wirken lassen.

In der Zwischenzeit werde ich mal testen wie ich das mit einer ReadingsGroup hin bekomme.
Zitat von: Ellert am 01 Mai 2016, 17:21:16
rgLink erzeugt in der ReadingsGroup einen Link der so aussieht als würdest Du in der Detailansicht drauf klicken.

Es wird ein Link erzeugt, der so aussieht:
http://IP:Port/fhem?detail=rgListe&cmd.rgListe=set%20rgListe%20AbfrageListe

Grüße

Ellert

Die Daten aus dem Logfile haben schon eine Zeilenumbruch, Du könntest <br> weglassen  ;)

Sonst \n statt <br>

KNUT345

Es handelt sich nicht um ein reguläres Log-File sondern schreib ich selber...

  {fhem("setreading $DEVICE DeltaPerHour $Y")};
  print DATEI $W." ".$DEVICE." DeltaPerHour: ".$Y."\n";


Ohne <br> hab ich probiert und dann kommt der Text ohne Zeilenumbrüche.

Danke und Grüße

KNUT345

Hallo Zusammen, hallo Ellert,
ich muss mich korrigieren.
Es funktioniert nur bedingt, heißt:
Das webCmd am Dummy angeklickt bringt ein Listing im Dialogfeld
Das Kommando set Dummy AbfrageListe im Eingabefeld einer "beliebigen" Seite liefert das Listing direkt auf der Seite ähnlich wie beim Anzeigen des Logfiles.
Das Kommando set Dummy AbfrageListe über die Link-Einbindung in der readingsGroup und der Ergänzung in der rgLink
Zitatelsif( $action eq "command" ){
    $fhemLink  = "detail=$name&$name.cmd=set%20$name%20$command";
    # $fhemLink  = "cmd=$name";
    $divStyle = "cursor:pointer;display:inline;";
  }
ZitatEs wird ein Link erzeugt, der so aussieht:
Code: [Auswählen]
http://IP:Port/fhem?detail=rgListe&cmd.rgListe=set%20rgListe%20AbfrageListe
baut lediglich die Seite neu auf.
Hierzu war cmd.$name nach $name.cmd zu ändern.

Was fehlt da noch?

Danke im Voraus und Grüße
Knut