Ankündigung

Einklappen
Keine Ankündigung bisher.

Liste/Array aus Widget an visu.js übergeben und auswerten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Liste/Array aus Widget an visu.js übergeben und auswerten

    Irgendwie schaffe ich nicht eine Liste/Array in der visu.js auszuwerten.

    widget
    Code:
    {% macro maptext(id, text, gad, txt, val) %}
        {% import "basic.html" as basic %}
        <li data-icon="false">
        <div class="nw_table">
            <div class="text">{{ text|e }}</div>
            <div>
                <span
                    id="{{ uid(page, id) }}"
                    data-widget="visu.maptext"
                    data-item="{{ gad }}"
            data-txt ="{{ txt }}"
            data-val ="{{ val|default('') }}"
                    class="text">
                </span>
        </div>
        </li>
    {% endmacro %}
    visu.js
    Code:
    // ---- MAPTEXT -------------------------------------------------------
    // ----- visu.maptext -----------------------------------------------------------
    $(document).delegate('[data-widget="visu.maptext"]', {
        'update': function (event, response) {
            var txt_arr = $(this).attr('data-txt');
            var val_arr = $(this).attr('data-val');
    
            alert($.inArray('Aus', $(this).attr('data-txt')))
    
            $('#' + this.id).html("TestText");
        }
    });
    *.html
    Code:
    {{ list.maptext('status_hk_text', 'Heizbetrieb', 'ebus.status_hk', ['Heizen', 'Aus', 'Auto', 'Eco', 'Absenken'], [1, 2, 3, 4, 5]) }}
    Egal wie ich es drehe, er findet nichts.

    Der Inhalt von data-txt und data-val scheint immer "Array" zu sein. Also keine Liste von Werten. Ich will eigentlich nur durch data-val einen Loop machen und dann das entsprechende data-txt zurückgeben.

    Dank und Gruß
    Mirko
    Zuletzt geändert von JuMi2006; 11.04.2015, 07:52. Grund: *.html vergessen
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    #2
    Hallo Mirko,

    Du kannst keine Arrays übergeben. Die übliche Vorgehensweise ist ein implode() im PHP (widget.html) und eine explode() Funktione im JS script Teil. Der Transfer erfolgt durch Wandle Array ins einen Textstrang mit Separator (implode()) und wieder zurück (explode()). Ein Beispiel dazu findest Du bei dem UZSU Widget von mir. Dort sind die beiden Funktionen umgesetzt / verwendet um Arrays zu übergeben.

    Michel

    Kommentar


      #3
      Das widget.explode hatte auch schon probiert. Aber das gleiche Verhalten gehabt.
      Das implode im widget hat gefehlt.

      Für die Nachwelt:

      Im widget:
      implode(array)

      In der visu.js
      widget.explode(array)

      Wobei "array" dann eben die entsprechnde Liste mit items o.ä. ist ['1','2','3','4']

      Danke, jetzt läufts!


      Umgezogen? Ja! ... Fertig? Nein!
      Baustelle 2.0 !

      Kommentar


        #4
        Hi zusammen!

        Ich hab das hier jetzt versucht nachzubauen, aber irgendwie bekomme ich das für meinen Anwendungsfall nicht so ganz hin.
        Ich würde gerne in die Visu einen Button einbauen, der ein knx_dpt 2 in Form einer Liste schickt. Wenn ich das mit implode und explode versuche, wird auch der Value "0, 3" geschickt, Smarthome.py meint aber, dass das keine Liste sei.

        Hier der Aufruf aus der Visu, wobei ich die Angabe der zwei Ziffern auch schon ohne '' und [] versucht habe. Implode und Explode scheinen generell zu funktionieren
        Code:
        {{ visu.zwangswitch(id~'_sperren', sperren~'.sperren', icon1~'secur_locked.png', icon0~'secur_open.png', implode(['0','3']), implode(['0','1'])) }}
        Muss ich hier im visu.js Aufruf noch ein [] um die Werte legen, damit das dann als Liste raus geschickt wird, die Smarthome.py erwarte..?
        Code:
        io.write($(this).attr('data-item'), widget.explode($(this).attr('data-val-off'));
        Vielen Dank für die Hilfe!

        Kommentar


          #5
          Hallo Onkelandy,

          Du verwendest implode() direkt im HTML, ich habe die immer in das widget gepackt. Damit wird es transparent, wie die Parameter übergeben werden (weil nicht im Aufruf selbst weitere Funktionen enthalten).

          Schaue Dir doch mal das Ergebnis aus dem Widget im JavaScript in eine Variable und deren Typ an. Aus meiner Sicht macht widget.explode nur ein array, keine Liste. Da mußt Du evt. ein TypeCast vorher machen.

          Michel

          Kommentar


            #6
            Danke, Orion. Hinbekommen hab ich es leider trotzdem nicht. Ein Workaround ist nun aber, statt der Liste für das Item mit DPT 23 einfach eine Zahl zu schicken.
            0 = 0,0,
            1= 0,1
            2 = 1,0
            3 = 1,1
            So interpretiert das zumindest mein DALI Gateway. Als num kann ich es nicht senden, aber ich hab mir jetzt hilfsweise eine eigene DPT gebastelt und jetzt klappt es. Allerdings hab ich mich da sehr doof angestellt, wodurch mein Code richtig "hardcoded" ist. Wenn mir jemand einen guten Ansatz hätte, wie ich das nobler lösen könnte, wäre ich nicht unfroh...

            Ziel wäre quasi, über einen normalen Switch die Werte "3" und "1" zu senden als wäre es ein Boolsches Objekt. Wenn der Wert "3" draußen ist, soll die Anzeige des Switch auf "ein/true" sein, wenn ich den Wert "1" schicke, ist die Sperre aufgehoben, also "False"

            Gelöst hab ich das im dpts.py wie folgt, allerdings wie gesagt, erstens ist das unflexibel und zweitens.. bekomm ich dann auch eine Fehlermeldung im Log, dass der Payload falsch wäre. Ich muss gestehen, auch keine wirkliche Ahnung zu haben, was ich da gemacht hab - aber es funzt mal. Nur nobel ist anders...

            Code:
            def en23(value):
                if value == '1':
                    return [int(value) & 0x01]
                elif value == '3':
                    return [int(value) & 0x03]
                else:
                    return value
            
            
            def de23(payload):
                if len(payload) != 1:
                    return None
                if payload[0] == 1:
                    return [int(1) & 0x01]
                elif payload[0] == 3:
                    return [int(3) & 0x03]
            Zuletzt geändert von Onkelandy; 24.07.2015, 13:56.

            Kommentar

            Lädt...
            X