Hauptmenü

KodiNowPlaying

Begonnen von eisi, 15 Oktober 2017, 20:14:41

Vorheriges Thema - Nächstes Thema

eisi

Hallo,
ich versuche gerade das Widget von Nesges zu portieren.
FTUI nutze ich schon eine längere Zeit und es macht richtig Spaß mit den Widgets zu arbeiten.
Nur wurde genau dieses Widget nicht portiert und ich versuche mich gerade per Anleitung von https://wiki.fhem.de/wiki/FTUI_eigene_Widgets an einer neuen Version.
Das Widget wird initialisiert, aber es springt nicht in die Updatefunction :-(
Das Javascript:

var Modul_mywidget = function () {

function init() {

    me.elements = $('div[data-type="' + me.widgetname + '"]', me.area);
    me.elements.each(function (index) {

        var elem = $(this);
        elem.initData('get', 'STATE');
        elem.initData('currentTitle', '');
        elem.initData('label', '');
        elem.initData('volume', '');
        me.addReading(elem, 'get');
        me.addReading(elem, 'currentTitle');
        me.addReading(elem, 'label');
        me.addReading(elem, 'volume');
        me.addReading(elem, 'skin');
        var label = elem.getReading('label').val;
        var playStatus = elem.getReading('playstatus').val;
        elem.html("PS:" + playStatus);
    });
}

    function update(device, reading) {
        var elem = $(this);
        var label = elem.getReading('label').val;
        var playStatus = elem.getReading('playstatus').val;
        elem.html("PS:" + playStatus);
    }

    var me = $.extend(new Modul_widget(), {
        widgetname: 'mywidget',
        init: init,
        update: update,
    });

    return me;
};



HTML:

<li data-row="1" data-col="5" data-sizex="1" data-sizey="2">
        <header>MY</header>
        <div data-type="mywidget" data-device="Kodi.WoZi" data-get="volume"></div>
    </li>


Kodi kann ich ganz normal ansprechen und es gibt auch aktuelle Werte in FHEM.
Wo ist der Fehler?

LG,
Ingo
3 x Rasp mit fhem 5.8 | 1 Rasp mit Kodi |1x Cube | 15 x MaxLan Thermostate und 18 Fensterschalter | 30 WLAN Schalter Sonoff | Diverse Sensoren mit Arduino | Tablet mit FTUI 2.6

setstate

Vielleicht täuscht es nur, und update wird gerufen.

Was passiert, wenn man unter update() den Output ändert?

elem.html("PS_update:" + playStatus);

eisi

Leider nichts.

Ich habe jetzt mal das Reading version eingebaut.
FHEM zeigt das auf jeden Fall immer mit der neusten Updatezeit an.
Leider geht es nicht.
Ich habe auf derselben Seite (also auch im selben HTML) noch eine Instanz von meinem Kodi.
Eine Fernbedienung. Kann das ein Problem darstellen?

Ingo

var Modul_mywidget = function () {

function init() {

    me.elements = $('div[data-type="' + me.widgetname + '"]', me.area);
    me.elements.each(function (index) {

        var elem = $(this);
        elem.initData('get', 'STATE');
        elem.initData('currentTitle', '');
        elem.initData('label', '');
        elem.initData('volume', '');
        me.addReading(elem, 'get');
        me.addReading(elem, 'currentTitle');
        me.addReading(elem, 'label');
        me.addReading(elem, 'version');
        me.addReading(elem, 'skin');
        var label = elem.getReading('label').val;
        var playStatus = elem.getReading('playstatus').val;
        elem.html("PS:" + playStatus);
    });
}

    function update(device, reading) {
        var elem = $(this);
        var label = elem.getReading('version').val;
        var playStatus = elem.getReading('playstatus').val;
        elem.html("PS_update:" + playStatus);
    }

    var me = $.extend(new Modul_widget(), {
        widgetname: 'mywidget',
        init: init,
        update: update,
    });

    return me;
};
3 x Rasp mit fhem 5.8 | 1 Rasp mit Kodi |1x Cube | 15 x MaxLan Thermostate und 18 Fensterschalter | 30 WLAN Schalter Sonoff | Diverse Sensoren mit Arduino | Tablet mit FTUI 2.6

setstate

   
function update(device, reading) {
        var elem = $(this);
        var label = elem.getReading('version').val;
        var playStatus = elem.getReading('playstatus').val;
        elem.html("PS_update:" + playStatus);
    }


$(this) liefert so nicht eine Referenz auf dein <div data-type="mywidget" data-device="Kodi.WoZi" data-get="volume"></div>

Du musst aus der Liste aller "mywidget" das entsprechende raussuchen: me.elements.filterDeviceReading()

   
function update(device, reading) {
        me.elements.filterDeviceReading('playstatus', device, reading)
            .each(function (idx) {
                var elem = $(this);
                var playStatus = elem.getReading('playstatus').val;
                elem.html("PS:" + playStatus);
             });
    }


Man kann natürlich auch bei jeglichen Updates etwas anzeigen

   
function update(device, reading) {
      var param = ftui.getDeviceParameter(device, reading);
      var val = (param) ? param.val : '';
      alert(val);
    }



Oder bei jeglichen Updates nur den Wert von 'playstatus'

   
function update(device, reading) {
      var param = ftui.getDeviceParameter('Kodi.WoZi', 'playstatus');
      var val = (param) ? param.val : '';
      alert(val);
    }


eisi

Hmm, irgendwie nicht.
Der erste Alert ist leer.
PS ist undefined
Ich setze das Volume in FHEM hoch, aber es kommt kein Update :-(

HTML:

<li data-row="1" data-col="5" data-sizex="1" data-sizey="2">
        <header>MY</header>
        <div data-type="mywidget" data-device="Kodi.WoZi" data-get="volume"></div>
    </li>

JS:

var Modul_mywidget = function () {

function init() {

    me.elements = $('div[data-type="' + me.widgetname + '"]', me.area);
    me.elements.each(function (index) {

        var elem = $(this);
        elem.initData('get', 'STATE');
        elem.initData('currentTitle', '');
        elem.initData('label', '');
        elem.initData('volume', '');
        me.addReading(elem, 'get');
        me.addReading(elem, 'currentTitle');
        me.addReading(elem, 'label');
        me.addReading(elem, 'version');
        me.addReading(elem, 'skin');
        var label = elem.getReading('label').val;
        var playStatus = elem.getReading('playstatus').val;
        elem.html("PS:" + playStatus);
    });
}

function update(device, reading) {
      var param = ftui.getDeviceParameter('Kodi.WoZi', 'playstatus');
      var val = (param) ? param.val : '';
      alert(val);
    }

    var me = $.extend(new Modul_widget(), {
        widgetname: 'mywidget',
        init: init,
        update: update,
    });

    return me;
};

3 x Rasp mit fhem 5.8 | 1 Rasp mit Kodi |1x Cube | 15 x MaxLan Thermostate und 18 Fensterschalter | 30 WLAN Schalter Sonoff | Diverse Sensoren mit Arduino | Tablet mit FTUI 2.6

eisi

Nächster Versuch :-)
Widget_Example umgeschrieben

Readings: Temperatur, Luftfeuchtigkeit
Device: Wohnzimmer_Luft

Alert INIT wird angezeigt
Alert Update: 'IN TEMP' undefined 'Grad');
Also ist value leer.
Warum???


HTML-Code:

<li data-row="1" data-col="5" data-sizex="1" data-sizey="2">
        <header>MY</header>
        <div data-type="mywidget" data-device='Wohnzimmer_Luft' data-get='Temperatur'></div>


JS:

"use strict";

function depends_mywidget() {
    var deps = [];

    return deps;
}

var Modul_mywidget = function () {

    // privat sub function
    function doSomething(elem) {

        if (elem.hasClass('colorfull')) {
            elem.css({
                backgroundColor: '#aa44ff',
            });
        }
    }

    function init() {
alert('INIT');
        me.elements = $('div[data-type="' + me.widgetname + '"]', me.area);
        me.elements.each(function (index) {

            var elem = $(this);
            elem.initData('Temperatur', '00');
            elem.initData('Luftfechtigkeit', '00');

            // subscripe my readings for updating
            me.addReading(elem, 'Temperatur');
            me.addReading(elem, 'Luftfeuchtigkeit');

            // call sub function for each instance of this widget
            doSomething(elem);
        });
    }

    function update(dev, par) {
        // do updates from reading for content
        me.elements.filterDeviceReading('Temperatur', dev, par)
            .each(function (index) {
                var elem = $(this);
                var value = elem.getReading('Temperatur').val;
alert('IN TEMP' + value + 'Grad');
                if (value) {
                    elem.html(value);
                }
            });

        // do updates from reading for color
        me.elements.filterDeviceReading('Luftfeuchtigkeit', dev, par)
            .each(function (idx) {
                var elem = $(this);
                var val = elem.getReading('Luftfeuchtigkeit').val;
                if (val) {
//                    val = '#' + val.replace('#', '');
                    elem.html("color", val);
                }
            });
    }

    // public
    // inherit all public members from base class
    var me = $.extend(new Modul_widget(), {
        //override or own public members
        widgetname: 'mywidget',
        init: init,
        update: update,
    });

    return me;
};
3 x Rasp mit fhem 5.8 | 1 Rasp mit Kodi |1x Cube | 15 x MaxLan Thermostate und 18 Fensterschalter | 30 WLAN Schalter Sonoff | Diverse Sensoren mit Arduino | Tablet mit FTUI 2.6

setstate

Kleine Verwechslung noch:

me.addReading(elem, 'Temperatur');

Temperatur ist der Parameter-Name, nicht der Reading-Name

Also muss es data-Temperatur="myTempReading" heißen.


Oder andersrum:


HTML:
data-temp="Temperatur"

JS:
me.addReading(elem, 'temp');



eisi

Okay, die Temperatur zeigt es jetzt an.
2 Fragen hätte ich noch :-)
1. Es kommt kein Update im Widget, auch wenn sich die Temperatur in FHEM ändert.
2. Wie bekomme ich alle Readings eines Geräts ohne sie in ellenlangem HTML-Code zu definieren?
Wenn ich jetzt zum Beispiel Kodi auslesen möchte, müsste ich ja ALLE Parameter die wichtig sind im Div-Tag unterbringen.
Geht das besser?

JS:


"use strict";

function depends_mywidget() {
    var deps = [];

    return deps;
}

var Modul_mywidget = function () {

    // privat sub function
    function doSomething(elem) {

        if (elem.hasClass('colorfull')) {
            elem.css({
                backgroundColor: '#aa44ff',
            });
        }
    }

    function init() {
        me.elements = $('div[data-type="' + me.widgetname + '"]', me.area);
        me.elements.each(function (index) {

            var elem = $(this);
            elem.initData('temp', '00');
//            elem.initData('Luftfechtigkeit', '00');

            // subscripe my readings for updating
            me.addReading(elem, 'temp');
//            me.addReading(elem, 'Luftfeuchtigkeit');

            // call sub function for each instance of this widget
//            doSomething(elem);
        });
    }

    function update(dev, par) {
        // do updates from reading for content
        me.elements.filterDeviceReading('temp', dev, par)
            .each(function (index) {
                var elem = $(this);
                var value = elem.getReading('temp').val;
                if (value) {
                    elem.html(value);
                }
            });

    }

    // public
    // inherit all public members from base class
    var me = $.extend(new Modul_widget(), {
        //override or own public members
        widgetname: 'mywidget',
        init: init,
        update: update,
    });

    return me;
};
3 x Rasp mit fhem 5.8 | 1 Rasp mit Kodi |1x Cube | 15 x MaxLan Thermostate und 18 Fensterschalter | 30 WLAN Schalter Sonoff | Diverse Sensoren mit Arduino | Tablet mit FTUI 2.6

setstate

Schau dir mal das widget_joinedlabel.js an, da wird mit einem get-Array gearbeitet


<div data-type="joinedlabel" data-device="MPD1" data-mask="[$1 - ][$2]-[$3][: $4]"
      data-get='["Track","Artist","Title","currentSenderCurrent"]'>
</div>

eisi

Sieht intesressant aus, Danke!
Das werde ich morgen mal versuchen.

Aber warum sich die Tempertaur nicht updated bleibt mir ein Rätsel.
An der Update Routine ist doch eigentlich nicht falsch, oder?
Einmal hat es den Wert eingelesen und dann nie wieder verändert.
Selbst ein STRG-F5 bleibt ohne Wirkung.
Wird da irgendwo was gecached?

3 x Rasp mit fhem 5.8 | 1 Rasp mit Kodi |1x Cube | 15 x MaxLan Thermostate und 18 Fensterschalter | 30 WLAN Schalter Sonoff | Diverse Sensoren mit Arduino | Tablet mit FTUI 2.6

eisi

Also im Consolelog stehen alte Werte:

Wohnzimmer_Luft  widget_mywidget.js:24:1
Temperatur  widget_mywidget.js:25:1
Object { date: "2017-10-20 15:20:02", val: "23.00", valid: false }  widget_mywidget.js:26:1

Wohnzimmer_Luft  widget_mywidget.js:24:1
Luftfeuchtigkeit  widget_mywidget.js:25:1
Object { date: "2017-10-20 15:20:02", val: "51.40", valid: false }
3 x Rasp mit fhem 5.8 | 1 Rasp mit Kodi |1x Cube | 15 x MaxLan Thermostate und 18 Fensterschalter | 30 WLAN Schalter Sonoff | Diverse Sensoren mit Arduino | Tablet mit FTUI 2.6

setstate

Sieht so aus, als klappt die Initialisierung der Seite nicht.

Ich schlage vor, nimm die https://github.com/knowthelist/fhem-tablet-ui/blob/master/www/tablet/index_empty.html und setze nur das eine neue Widget drauf. Debug auf 1, dann muss man nach erfolgreicher Initialisierung die Refresh-Toast Messages sehen.

eisi

Damit kommen jetzt die Updates, Danke !!!

Also gehe ich davon aus, dass

<?
    include("ui.php");
    $ui = new UI();
?>

Nicht mehr gebraucht wird?
3 x Rasp mit fhem 5.8 | 1 Rasp mit Kodi |1x Cube | 15 x MaxLan Thermostate und 18 Fensterschalter | 30 WLAN Schalter Sonoff | Diverse Sensoren mit Arduino | Tablet mit FTUI 2.6

setstate

Das ist PHP Code, der wurde im  Standard-Setup noch nie gebraucht. Das hast du bestimmt aus einem User-Beispiel kopiert.

masterpete23

Ich wollte mich mal einklinken - da ich starkes Interesse an dem KODI Widget hätte.

Wie ist der Stand?
Kann man schon etwas testen? Gibt es noch Aufgaben?