FW_directNotify funktioniert nur für state?

Begonnen von Elektrolurch, 07 Mai 2018, 09:32:10

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo,

versuche per FW_directNotify ein Element auf der fhemweb - Seite abzuändern.
Die informId ist bspw. so gesetzt:

<table informId='RTVhelper-list'...

Mit

{FW_directNotify('RTVhelper-list','event1','event2')

tut sich aber nichts. Statt des "-" habe ich auch "." usw. ausprobiert.

FW_directNotify funktioniert bspw bei einem dummy aber nur für den "state".
DA sind auch schon andere darüber gestolpert, aber leider endet der Beitrag ohne Lösung:
https://forum.fhem.de/index.php/topic,37869.msg301163.html

Mach ich da was falsch?

Elektrolurch


configDB und Windows befreite Zone!

rudolfkoenig

FW_directNotify erwartet als erstes Argument etwas in der Form #FHEMWEB:<InstanzName>, einen zweiten Parameter, was (wegen #FHEMWEB:) als JavaScript ausgefuehrt wird, und einen sinnlosen dritten Parameter. Das was du moechtest, ist mW z.Zt. nicht moeglich. Ich habe fhemweb.js angepasst, dass es, auch wenn etwas umstaendlich, moeglich ist, mit folgender Schreibweise:
{ FW_directNotify("#FHEMWEB:w", "setValue(['dummy-state', '9','9'])","") }
{ FW_directNotify("#FHEMWEB:w", "setValue(['dummy-state-ts', 'bla','bla'])","") }

Oder man setzt den Wert einfach mit "set dummy 9", was natuerlich alle verbundenen Browser, die dummy gerade anzeigen, aktualisiert.

ZitatFW_directNotify funktioniert bspw bei einem dummy aber nur für den "state".
Kannst du das bitte mit einem Beispiel demonstrieren?

Elektrolurch

Hallo Rudi,

danke für die Antwort.
Was ich ja eigentlich möchte, ist das was ja mit "DoTrigger" schon geht, ohne das alle  Objekte das event bekommen.
Was also mit FW_directNotify funktioniert:

define test dummy
attr test room test
{FW_directNotify('test','wird ignoriert','kappuuuttttt')}

Und schon steht statt der ??? "kappuuuttttt" beim dummy im state.
Wenn das jetzt für eine beliebige informId funktionieren würde, wäre das fein.

So sieht es mit DoTrigger aus:

my $ret = GetmyHTMLElement($hash,'VolumeUp');
DoTrigger($name,"VolumeUp: <html>$ret</html>");


und schon ist das Icon ausgetauscht. Es hat die informId:'name-VolumeUp', aber ist kein reading.
  DoTrigger ist aber nicht so elegant, weil es das Ereignis an "alle" sendet und ich möchte ja nur alle mit einr inform im hash (also fhemWEB usw.) adressieren.

Elektrolurch
configDB und Windows befreite Zone!

rudolfkoenig

Muss mich korrigieren: FW_directNotify erwartet als erstes Argument etwas in der Form #FHEMWEB:<InstanzName> _oder_ ein in einem der FHEMWEB Instanzen aktuell angezeigtes Geraet. Im ersten Fall wird das zweite Argument als JavaScript ausgewertet, im zweiten Fall der Inhalt des zum Geraete-Status gehoerenden divs auf das dritte Argument gesetzt. Wenn du andere informid-divs  aendern moechtest, musst die von mir gezeigte setValue Funktion verwenden, mit der genauen Adressierung der FHEMWEB Instanz.

Elektrolurch

Hallo Rudi,
zunächst einmal Dank für die Unterstützung.
Leider klappt das nicht in allen Fällen, da kommt manchmal:
fhemweb.js line 2:
SyntaxError: missing ] after element list
Für einfache readings (nur Text) klappt es mit FW_direktNotify, für Grafiken (Icons) oder Dropdownmenus leider nicht.

Und zwar habe ich das jetzt so mal bei mir eingebaut, so dass ich den Unterschied zwischen Dotriggger und FW_direktNotify testen kann:


sub SCC_htmlDoTrigger($$$)
{
my ($name,$rd,$val) = @_;
# FHEMWEB:<InstanzName>
# einen zweiten Parameter, was (wegen #FHEMWEB:) als JavaScript ausgefuehrt
#  FW_directNotify("#FHEMWEB:w", "setValue(['dummy-state', '9','9'])","");
DoTrigger($name,"$rd: $val");
return undef;

FW_directNotify("#FHEMWEB:$FW_wname", "setValue(['$name-$rd',
'Der erste Parameter?','$val'])","");
} # end sub SCC_htmlDoTrigger
################################

"Der erste Parameter" hat wohl keine Funktion.
$val übergebe ich bei den komplexeren Bildelementen in <html>$val</html>
DoTrigger macht dann auch alles richtig (es sei denn, ein fhem-widget wie ein DropDown - Menu steckt in $val), bei  FW_directNotify klappt das nur, wenn $val ein einfacher Wert ist.

Woher kommt der Unterschied?

Elektrolurch
configDB und Windows befreite Zone!

rudolfkoenig

Zitatfhemweb.js line 2:SyntaxError: missing ] after element list
Kannst du bitte ein JavaScript-Consolen-Stacktrace anhaengen?
Und ein konkretes Problem zeigen?

Ich habe kein Problem mit:fhem> define d dummy
fhem> attr d readingList rd1
fhem> attr d setList rd1
fhem> set d rd1 5
(im Browser d anzeigen)
fhem> { FW_directNotify("#FHEMWEB:w", "setValue(['d-rd1', 'par1', '<html><select><option>a</option><option>b</option></select></html>'])", "") }
siehe Anhang.

Elektrolurch

Hallo Rudi,

das Problem liegt wohl an der Parameterübergabe:

FW_directNotify("#FHEMWEB:$FW_wname", "setValue(['$name-$rd',
'Der erste Parameter?','$val'])","");

Da wird ein String geschickt in (" "), der Teilstrings für die Parameterübergabe an setValue wird mit ' ' (einfachen) enthält.
Aber mein $val ist html und enthält beides (doppelte und einfache)
Zuerst dachte ich

$val =~s/'/"/g;

wäre mein Freund, aber dann ist das html kaputt.

<a style='cursor:pointer' onClick=\"FW_cmd('/fhem?XHR=1&cmd=$cmd')\">

Da hat man im html leider beides (einfache und doppelte) und das beist sich dann wohl mit der Art der Parameterübergabe an setValue.
Weiß da leider keine Lösung....

Elektrolurch
configDB und Windows befreite Zone!

rudolfkoenig

ZitatWeiß da leider keine Lösung....
Eine Loesung mit FW_directNotify gibts schon, aber nicht sehr elegant:
fhem> { my $cmd="list";; FW_directNotify("#FHEMWEB:w", "setValue(['d-rd1', '', \"<html><a style='cursor:pointer' onClick='FW_cmd(\\\"/fhem?XHR=1&cmd=$cmd\\\")'>Blub</a></html>\"])", "") }

Stellen wir fest: fuer Erweitern der Oberflaeche, insb. mit Javascript, ist FW_directNotify (oder trigger) ungeeignet. Ich empfehle stattdessen JavaScript in einer eigenen Datei dazuzupacken, oder gar ein fhemwidget bauen, analog zu FW_createSelect in fhemweb.js. Die Sache wird dadurch am Anfang zwar nicht einfacher, aber die Loesung ist "sauberer".