Hallo,
ich nutze FHEM Tablet UI und passe gerade die index.html an.
Um FHEM-Variablen bzw. Readings einzulesen, benutze ich den Code:
<div data-type="label"
data-device="DeviceName"
data-get="FHEMvariable">
</div>
Dies funktioniert soweit wunderbar.
Jetzt habe ich noch ein Device, dass wie folgt konfiguriert wurde:
define MeinDevice1 HTTPMOD https://.... 600
attr MeinDevice1 enableControlSet 1
attr MeinDevice1 showMatched 1
attr MeinDevice1 reading03RegOpt g
attr MeinDevice1 reading03Name MeinErsterInhalt
attr MeinDevice1 reading03Regex MeinRegulaererAusdruck
Der Inhalt, der wegen "reading03RegOpt g" mehrere Treffer zurückliefert, wird in einer eigenen PERL-Funktion weiterverarbeitet, und die Ausgabe erfolgt in der normalen FHEM-WebView über das stateFormat mit dem Code
{return meineEigeneFunktionInDer99_myUtils.pm();}
Auch das funktioniert.
Nun möchte ich den Inhalt aus der PERL-Funktion auch in die index.html von FHEM Tablet UI einbinden, und weiß nicht wie.
Mit diesen Code
<div data-type="label"
data-device="MeinDevice1"
data-get="MeinErsterInhalt">
</div>
wird nicht die gewünschte Ausgabe erzielt, d.h. es wird nur 1 Treffer ausgegeben, und nicht ALLE Treffer (daher auch die Perl-Funktion meineEigeneFunktionInDer99_myUtils.pm, mit der über eine Schleife ALLE Treffer ausgegeben werden - aber nur über das stateformat, und eben nicht in der index.html von FHEM Tablet UI).
Testweise habe ich in der meineEigeneFunktionInDer99_myUtils.pm() folgenden Code eingetragen:
my $aaa = "helloWorld";
fhem ("set Variable123 $aaa");
Und habe dann in der index.html den Code
<div data-type="label"
data-device="MeinDevice1"
data-get="Variable123 ">
</div>
eingetragen. Leider bekomme ich überhaupt kein Ergebnis zurück, vermutlich, weil beim Aufruf der index.html die Funktion meineEigeneFunktionInDer99_myUtils.pm gar nicht ausgeführt wird.
Irgendwie drehe ich mich im Kreis, und benötige daher Hilfe von einem Experten.
Wer kann mir helfen?
mach ne readingsgroup deiner werte aus MeinDevice1 auf. die datstellung in ftui ist dann nur die angabe dieser readingsgroup
Trotz readingsgroup fehlt mir der Ansatz, wie ich "meineEigeneFunktionInDer99_myUtils.pm" einbinden kann, um sie später über eine FHEM-Variable aufrufen zu können.
Ich stelle mir das so ähnlich vor:
attr MeinDevice1 variableName55 {return meineEigeneFunktionInDer99_myUtils();}
Und dann die Ausgabe in der index.html:
<div data-type="label"
data-device="MeinDevice1"
data-get="variableName55">
</div>
Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt.
machmal
attr MeinDevice1 userReadings variableName55 {meineEigeneFunktionInDer99_myUtils();}
meineEigeneFunktionInDer99_myUtils() muss daa aber auch einen wert returnen
Zitat von: knopf_piano am 18 April 2020, 15:00:38
machmal
attr MeinDevice1 userReadings variableName55 {meineEigeneFunktionInDer99_myUtils();}
meineEigeneFunktionInDer99_myUtils() muss daa aber auch einen wert returnen
Funktioniert leider nicht, es kommt die Fehlermeldung: "Unknown command }, try help. "
habe zwei verschiedene Varianten probiert:
attr MeinDevice1 userReadings variableName55 {meineEigeneFunktionInDer99_myUtils();}
attr MeinDevice1 userReadings variableName55 {return meineEigeneFunktionInDer99_myUtils();}
Deine erste Version wäre wohl ok. Nur was gibt deine Funktion zurück? Poste mal die letzten Zeilen ...
lösch mal das semikolon raus. ruf mal deine funktion im fhem prompt auf.
{meineEigeneFunktionInDer99_myUtils()}
was passiert?
Hab's gerade genauso mit und ohne ; am Ende probiert. Geht beides ;-)
Aber: Du hast sicher ein "reload 99_myUtils.pm" gemacht und das FHEM-Objekt wird auch getriggert, damit deine Funktion überhaupt "läuft"?
Und unten schreibst Du:
my $aaa = "helloWorld";
fhem ("set Variable123 $aaa");
Variable123 ist aber wohl nicht der Name eines FHEM-Objektes !? Eher MeinDevice1
Sinn würde das machen, wenn in deiner Funktion am Ende stünde:
return $aaa;
Dann würde der Wert von $aaa in das Reading "variableName55" geschrieben.
passt. reload ist bei edit+save über fhemweb nicht notwendig. lediglich der trigger muss kommen, der ist aber zweitrangig. von daher ist erstmal die korrektheit der funktion wichtig, also output von
{meineEigeneFunktionInDer99_myUtils()}
die Anweisung
fhem ("set Variable123 $aaa");
ist mit userReadings eh quark.
Wenn, dann muß das so heißen:
my $aaa = "helloWorld";
fhem ("setreading MeinDevice1 Variable123 $aaa");
oder mit UserReading :
attr MeinDevice userReadings Variable123 {meineEigeneFunktionInDer99_myUtils()}
mit 99_myUtils.pm-Inhalt
sub meineEigeneFunktionInDer99_myUtils()
{
my $aaa = "helloWorld";
return $aaa;
}
Zunächst einmal DANKE für den tollen Support!
Nun, EINEN Schritt bin ich jetzt schon weiter.
Ich habe das Semikolon nun weggelassen:
attr MeinDevice1 userReadings Variable123 {meineEigeneFunktionInDer99_myUtils()}
und schon wurde die userReadings eingetragen.
Leider bekomme ich im FHEM Tablet UI immer noch keine Ausgabe.
Einen Fehler innerhalb "meineEigeneFunktionInDer99_myUtils" schließe ich aus, denn mittels stateFormat wird mir der Inhalt auf der Standard-FHEM-Weboberfläche ausgegeben. Das stateFormat heißt:
stateFormat {return meineEigeneFunktionInDer99_myUtils();}
Für mich als Anfänger ist es übrigens nicht nachvollziehbar, warum einmal das "return" und Semikolon benötigt wird, und einmal nicht.
Warum zum Teufel bekomme ich keine Ausgabe, wenn ich in der index.html den folgenden Code eintrage:
<div data-type="label"
data-device="MeinDevice1"
data-get="Variable123">
</div>
In der Funktion "meineEigeneFunktionInDer99_myUtils" ist die letzte Codezeile übrigens ein "return", d.h. die Variable wird zurückgegeben, was die Ausgabe mittels stateFormat auch beweist.
Wo könnte der Hund noch begraben liegen?
Zeig bitte ein "list MeinDevice1"
Danke für das "list" in PN
Also: dein userReading taucht gar nicht in der Liste der Readings. Es wird einfach nicht kalkuliert. So lange Du kein Variable123 Reading (oder in dem Fall "m...T...e" Reading) in Fhem hast, wird es auch in TabletUI nicht angezeigt.
Ein userReading wird erst kalkuliert, wenn getriggert. Entweder hast Du ein explizites Trigger, oder gar keine, was dazu führt, dass jedes Event des Devices die Aktualisierung des userReadings anstosst. Aber: es muss eine Aktualisierung stattfinden. Wird es auch nicht kalkuliert, wenn Du ein "set <HTTPMODName> reread" machst?
Zitat von: amenomade am 18 April 2020, 19:56:34
Wird es auch nicht kalkuliert, wenn Du ein "set <HTTPMODName> reread" machst?
Wahnsinn, JETZT funktioniert es!
Ich verstehe aber nur Bahnhof.
Kannst du mir vielleicht in verständlichen Worten erklären, warum das reread notwendig wurde?
Muss ich das jetzt jedes Mal machen, wenn ich einen vergleichbaren Fall habe?
Ich habe jetzt testweise den Code in "meineEigeneFunktionInDer99_myUtils" geändert.
In der Ausgabe von Tablet UI ist die Änderung aber erst zu sehen, wenn ich wieder "set <HTTPMODName> reread" ausführe ...
Somit ist mein ganzer Aufwand umsonst :-(
Ich dachte eigentlich, der Ablauf wäre wie folgt:
1. ich rufe die index.html auf.
2. Der Code data-get="Variable123" in der index.html sorgt dafür, dass die Variable123 abgerufen wird.
3. Da Variable123 über eine userReadings mit der PERL-Funktion "meineEigeneFunktionInDer99_myUtils" verknüpft ist, wird diese Funktion ausgeführt (und zwar JEDES Mal, wenn die index.html aufgerufen wird).
Anscheinend hab ich falsch gedacht? Wird die Variable123 nach dem 1. Aufruf "gecached"?
html != php.
wenn, dann mußt du das httpmod-intervall (was aber änder sich so derart dynamisch auf einer website?) kleiner wählen oder
via php einen fhem-call erzeugen, um deine variable aktualisieren zu lassen
Zitat von: knopf_piano am 18 April 2020, 21:07:03
html != php.
wenn, dann mußt du das httpmod-intervall (was aber änder sich so derart dynamisch auf einer website?) kleiner wählen oder
via php einen fhem-call erzeugen, um deine variable aktualisieren zu lassen
Du hast meine letzte Frage indirekt beantwortet:
Der Aufruf der eigenen PERL Funktion "meineEigeneFunktionInDer99_myUtils" erfolgt nicht bei JEDEM index.html-Aufruf (wie von mir fälschlicherweise vermutet), sondern bei jedem httpmod-intervall.
Herzlichen Dank an alle, die zur Lösungsfindung beigetragen haben. Ihr seit echt Spitze!
Zitat von: Pi_01 am 18 April 2020, 22:36:09
Du hast meine letzte Frage indirekt beantwortet:
Der Aufruf der eigenen PERL Funktion "meineEigeneFunktionInDer99_myUtils" erfolgt nicht bei JEDEM index.html-Aufruf (wie von mir fälschlicherweise vermutet), sondern bei jedem httpmod-intervall.
Herzlichen Dank an alle, die zur Lösungsfindung beigetragen haben. Ihr seit echt Spitze!
Genauer gesagt, deine Funktion wird bei jeder Aktualisierung des HTTPMODs erfolgen (bei jedem Event-Block), es sei durch httpmod-intervall oder durch ein set reread.
Und die HTML Seite von FTUI wird bei jeder Aktualisierung des data-get Readings aktualisiert.
Noch eine letzte Anmerkung für die Nachwelt:
Die Ausgabe mittels
<div data-type="label"
data-device="DeviceName"
data-get="FHEMvariable">
</div>
funktioniert auch dann nicht, wenn der Zeichensatz nicht stimmt.
Und so wird er gesetzt (Beispiel UTF-8):
attr MeinDevice1 get01Encode utf8