Autor Thema: FW_addDetailToSummary kein Refresh  (Gelesen 517 mal)

Offline bismosa

  • Developer
  • Full Member
  • ****
  • Beiträge: 308
FW_addDetailToSummary kein Refresh
« am: 10 August 2019, 19:28:36 »
Hallo!

Sorry, wenn ich mich schlecht ausdrücke. Ich bin da noch nicht so geübt  ;)

Ich habe vor kurzem 2 Module (Blitzer und Jarolift) umgestellt von
$hash->{FW_summaryFn} = "Blitzer_summaryFn";          # displays html instead of status icon in fhemweb room-viewauf
$hash->{FW_detailFn}  = "Blitzer_summaryFn";
$hash->{FW_addDetailToSummary} = 1;
$hash->{FW_deviceOverview} = 1;

So kann das Layout auch über die ganze Zeile gehen. Dies habe ich von hier: https://forum.fhem.de/index.php?topic=71772.0

Jetzt habe ich aber Schwierigkeiten mit der Aktualisierung. Gerade in der Raumansicht funktioniert diese gar nicht mehr.
Ich habe mal eine kleines TestModul geschrieben:

package main;

# Laden evtl. abhängiger Perl- bzw. FHEM-Hilfsmodule
use strict;
use warnings;
use POSIX;

sub TEST_Initialize() {
my ($hash) = @_;
$hash->{DefFn} = "TEST_Define";
$hash->{UndefFn} = "TEST_Undef";
$hash->{AttrFn} = "TEST_Attr";
$hash->{SetFn} = "TEST_Set";
$hash->{GetFn}      = "TEST_Get";
#$hash->{ParseFn} = "TEST_Parse";
$hash->{AttrList} = " "
.$readingFnAttributes;
  $hash->{FW_summaryFn} = "TEST_summaryFn";          # displays html instead of status icon in fhemweb room-view
 
  #$hash->{FW_detailFn}  = "TEST_summaryFn";
  #$hash->{FW_addDetailToSummary} = 1;
  #$hash->{FW_deviceOverview} = 1;
}

#####################################
sub TEST_Define() {
my ($hash, $def) = @_;
my $name = $hash->{NAME};

return undef;
}

#####################################
sub TEST_Undef($$) {
my ($hash, $name) = @_;
delete($modules{TEST}{defptr}{$hash->{DEF}}) if(defined($hash->{DEF}) && defined($modules{TEST}{defptr}{$hash->{DEF}}));
return undef;
}

#####################################
sub TEST_Attr(@) {
my ($cmd, $name, $attrName, $attrValue) = @_;
my $hash = $defs{$name};

return undef;
}

#####################################
sub TEST_Set($$$@) {
my ( $hash, $name, @a ) = @_;

my $cmd = $a[0];

if ($cmd eq "Update"){
TEST_Update($hash);
} else {
return "Unknown argument $cmd, choose one of Update";
}
}

###################################
sub TEST_Get($$@){
my ( $hash, $name, $opt, @args ) = @_;

return "Unknown argument $opt, choose one of ";
}

#####################################
sub TEST_summaryFn($$$$){
my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set fosummaryFn.
my $hash   = $defs{$d};
my $name = $hash->{NAME};
my $stateFormat = AttrVal($name, "stateFormat", undef);

my $Nummer = ReadingsVal($name, "Nummer", 0);

my $html;
$html = "<div><table class=\"block wide\"><tr>";
 
my $img = FW_makeImage("refresh");
my $cmd = "cmd.$name=set $name Update";
$html.="<td style=\"width: 50px;\"><a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmd')\">$img</a></td>";
$html.="<td style=\"width: unset;\">$Nummer</td>";
$html .= "</tr></table></div>";

return $html;
}

#####################################
sub TEST_Update($){
my $hash = shift;
my $name = $hash->{NAME};

my $Nummer = ReadingsVal($name, "Nummer", 0);
readingsSingleUpdate($hash, "Nummer", $Nummer + 1, 1);

return;

}

# Eval-Rückgabewert für erfolgreiches
# Laden des Moduls
1;


# Beginn der Commandref

=pod
=item [helper]
=item summary ...
=item summary_DE TEST
=begin html_DE


=end html_DE

=cut

Mit dieser Variante funktioniert alles wie gewünscht. Das Reading wird bei Aktualisierung direkt auch angezeigt.

Wenn man nun die Zeilen aktiviert:
$hash->{FW_detailFn}  = "TEST_summaryFn";
$hash->{FW_addDetailToSummary} = 1;
$hash->{FW_deviceOverview} = 1;
und diese deaktiviert:
#$hash->{FW_summaryFn} = "TEST_summaryFn";          # displays html instead of status icon in fhemweb room-view
Ist die Anzeige zwar besser, aber eine Aktualisierung im Browser funktioniert erst nach einem neu Laden der Seite.

Habe ich irgendwo etwas übersehen? Muss ich das anders lösen?

Gruß
Bismosa
FHEM 14873 auf einem Raspberry PI 2 (B) Wheezy
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x 433MHz Sender an ESP (Jarolift Rolläden)
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

Offline bismosa

  • Developer
  • Full Member
  • ****
  • Beiträge: 308
Antw:FW_addDetailToSummary kein Refresh
« Antwort #1 am: 12 August 2019, 22:01:25 »
Hallo!

Ich möchte nicht ungeduldig erscheinen...ich habe jetzt aber noch ein paar Stunden gesucht und probiert...verstehe es leider immer noch nicht.

Wenn ich es bisher richtig verstanden habe, dann greift Longpoll nicht, wenn ich
$hash->{FW_detailFn}  = "TEST_summaryFn";
$hash->{FW_addDetailToSummary} = 1;
$hash->{FW_deviceOverview} = 1;
gesetzt habe. Dies müsste ich dann selbst umsetzen.

Ich habe bisher nur die Variante über FW_directNotify gefunden und habe diese versucht umzusetzen:
sub TEST_refresh($){
my $hash   = shift;
my $name = $hash->{NAME};
my $room = AttrVal($name, "room", "Unsorted");
# nur Räume mit dem Modul updaten
my @rooms = split(",",$room);
foreach (@rooms) {
my $r = $_;
        { map { FW_directNotify("FILTER=room=$r", "#FHEMWEB:$_", "location.reload('true')", "") } devspec2array("TYPE=FHEMWEB") }
}
}

Dies funktioniert. Allerdings wird immer die ganze Seite neu geladen. Das wäre ja eigentlich nicht nötig.

Wie könnte ich das umsetzen, wenn ich nur den entsprechenden HTML-Code ersetzen möchte? Ich bräuchte da wohl mal einen kleinen schubser...

Generell: Ist dies überhaupt der "richtige" bzw. "bevorzugte" Weg? Letztendlich funktioniert es ja super mit
$hash->{FW_summaryFn} = "TEST_summaryFn";          # displays html instead of status icon in fhemweb room-view
Allerdings stört mich hier immer der Device-Name vor der HTML-Anzeige.
Alternativ könnte ich diese mit
$hash->{FW_hideDisplayName} = "1";ausblenden und selbst im HTML hinterlegen....?

Ich habe noch viel zu lernen  ;)

Gruß
Bismosa
FHEM 14873 auf einem Raspberry PI 2 (B) Wheezy
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x 433MHz Sender an ESP (Jarolift Rolläden)
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 21002
Antw:FW_addDetailToSummary kein Refresh
« Antwort #2 am: 17 August 2019, 13:52:51 »
summaryFn wird verwendet, um den "Status" des Geraetes anzuzeigen.
Wenn dieser Status sich aendert, dann wird summaryFn aufgerufen, und das komplette alte angezeigte Feld durch den Rueckgabewert ersetzt.

detailFn ist fuer die Detailseite gedacht, damit man da z.Bsp. ein Wizard (wie bei notify oder at) unterbringen kann.
Da es in bestimmten Faellen praktisch war, kann man dies auch in der Uebersicht anzeigen lassen (per FW_addDetailToSummary).

Das erzeugte HTML muss die Aktualisierung in diesem Fall selbst uebernehmen.
Das kann (soweit ich es sehe) nur durch Verwendung von fhemweb_widgets erfolgen, wo updateLine (Beispiel dafuer ist fhemweb_readingsGroup.js oder fhemweb_readigsHistory.js, updateLine ist aber unerwuenscht/deprecated) oder updateDevs (Beispiel dafuer ist svg.js) aufgerufen wird.

Offline bismosa

  • Developer
  • Full Member
  • ****
  • Beiträge: 308
Antw:FW_addDetailToSummary kein Refresh
« Antwort #3 am: 19 August 2019, 21:27:37 »
Hallo!

Danke für die Info und den Denkanstoss!
Ich muss ehrlich zugeben...da ist sehr viel neuland für mich dabei. Eigentlich bin ich sehr zufrieden mit der Variante summaryFn und dem kompletten Austausch von meinem "customHTML".
Sicherlich ist dies nicht die optimale Lösung. Gerade wenn mehrere Readings etc. vorhanden sind, wird es interessanter diese einzeln auszutauschen (wie es ja. z.B. auch in der Detailansicht gemacht wird).

Eigentlich wollte ich "nur" mein eigenes HTML nicht an der "Status"-Position darstellen, sondern in einer nächsten Zeile um etwas mehr Platz zu bekommen. Bei einigen Styles ist der Bereich für die Status-Anzeige so klein...dann passen meine Steuerelemente nicht mehr dort rein. Ich hätte nicht gedacht, das es nun so aufwendig wird  :)

Ich habe nun noch diesen Beitrag von Dir gefunden:
Zitat
Dazu musst du eine fhemweb_XXX.js Datei erstellen (ja, fhemweb.js ist auch modular), und da drin eine updateLine oder updateDevs Funktion deklarieren. Diese Funktion wird bei einem Event, was ein Geraet in dem gerade angezeigten Raum betrifft(!), aufgerufen, siehe fhemweb.js.

So ganz verstehe ich das aber noch nicht. Denn lt. fhemweb.js ist
Zitat
// updateLine is deprecated, use setValueFn
Das wird mit dem neuen Wert aufgerufen.? Das bringt mir ja nichts, wenn ich aufgrund eines neuen Readings oder eines abgelaufenen Timers neue Werte erzeugen möchte.? Wenn ich das richtig verstehe, gilt dies nur für Readings?

Eigentlich möchte ich im PERL-Modul einen HTML-Code erzeugen und diesen dann darstellen.
Wäre dazu nicht vielleicht ein FW_directNotify besser geeignet?
Damit sollte ich dann doch eigentlich auf alles reagieren können und bei Bedarf Teile meines HTML-Codes austauschen können? Leider haben meine Versuche bisher nicht
funktioniert. Ich vermute aber einen Fehler in der Programmierung von mir.

Sorry für die Anfängerfragen. Ich bin halt leider kein gelernter Programmierer...und verstehe denn Quellcode in den Beispielen nur bedingt.  :)

Gruß
Bismosa

FHEM 14873 auf einem Raspberry PI 2 (B) Wheezy
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x 433MHz Sender an ESP (Jarolift Rolläden)
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...