Ergebnis von ftui.sendFhemCommand in Javascript verwenden

Begonnen von reisner, 22 November 2019, 15:39:35

Vorheriges Thema - Nächstes Thema

reisner

Hallo,
ich habe eine eigene Funktion get_LUs() in der 99_myUtils angelegt, die den Inhalt eines Readings zurück gibt, z.B. '1,2,5,7'. Ich möchte nun innerhalb einer FTUI page diese Information per sendFhemCommandabfragen und weiter verarbeiten. Dazu habe ich folgendes script im HTML:

<script type="text/javascript">
var lus;
ftui.sendFhemCommand('{get_LUs}').done(function (data) {
    lus = data.split(",");
});

for(var i=0; i<lus.length; i++){.......


gebe ich per Alert innerhalb der function(data) lus aus, dann bekomme ich den richtigen Inhalt, ausserhalb von ftui.senFhemCommand() ist lus aber leer. Ich hätte erwartet, das die var Deklaration von lus ausserhalb der Funktion diese global macht, das scheint aber nicht so zu sein:-)
Könnt Ihr mir auf die Sprünge helfen, wie ich das Problem löse?

Gruß
Ralph

setstate

alles was hier innerhalb von done() behandelt wird, ist asynchron, d.h. wird erst aufgerufen, wenn das Ergebnis von der Anfrage zurückkommt.
In der Zwischenzeit wird der nachfolgende Code schon abgearbeitet.

Du hast also ein zeitliches Problem.

Lösung ist: alles nur innerhalb der done() function zu verarbeiten bzw. dort einen Aufruf einer Function mit Übergabe von data zu setzen.

reisner

Hi setstate,
Vielen Dank für die schnelle Antwort.
Ja - richtiges Timing war immer schon der Schlüssel zum Erfolg. Ich habe nun auf direkten Ajax Aufruf mit async = false umgestellt, damit klappt es:


<div class="gridster">
<ul>
<script type="text/javascript">
var lus;
$.ajax({
            async: false,
            cache: false,
            method: 'GET',
            dataType: 'html',
            url: ftui.config.fhemDir,
            username: ftui.config.username,
            password: ftui.config.password,
            data: {
                cmd: '{get_LUs}',
                fwcsrf: ftui.config.csrf,
                XHR: "1"
            },
            error: function (jqXHR, textStatus, errorThrown) {
                ftui.toast("<u>FHEM Command failed</u><br>" + textStatus + ": " + errorThrown + " cmd=" + cmdline, 'error');
            }
        }).done(function( resp ) {
lus = resp;
});
document.write("<li data-row='1' data-col='1' data-sizex='2' data-sizey='2'>");
document.write("<header>State von Alarm : " + lus + "</header>");
document.write("</li>");
</script>

</ul>
</div>


Der Wert des zurück gegebenen Funktionsaufruf aus Fhem wird im Header des <li> angezeigt. Der eigentliche Hintergrund meines Codes ist es am Ende aber, auf einer Sub Page, in Abhängigkeit der Information in einem Readings, verschiedene highcharts in einzelne <li>'s anzuzeigen.
Das klappt nun mit diesem Code auch, nur nicht in einer Sub Page :(. Wenn ich das div 'class=page' aktiviere, werden die li's nicht erzeugt, das script wird scheinbar nicht gestartet. Hast Du eine Ahnung? Blöde Frage, hast Du sicherlich :D

Gruß
Ralph