Autor Thema: FW_addDetailToSummary kein Refresh  (Gelesen 214 mal)

Offline bismosa

  • Developer
  • Full Member
  • ****
  • Beiträge: 306
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: 306
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: 20774
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.

 

decade-submarginal