Hauptmenü

New FHEM Tablet UI

Begonnen von setstate, 22 Februar 2015, 23:37:24

Vorheriges Thema - Nächstes Thema

jsloot

Zitat von: setstate am 17 April 2015, 20:04:07
<li data-row="1" data-col="1" data-sizex="3" data-sizey="3">
    <header>Flur</header>
    <div data-type="dimmer" data-device="grWZ.Dimmer" class="cell" ></div>
    <div data-type="label" class="cell darker">Licht</div>
</li>


Autsch... ich gestehe: der Fehler befand sich ca. 50cm vor dem Bildschirm und nennt sich jsloot.... sorry  :( jetzt funktionierts....
Ein FHEM-Raspi mit HM-CFG-USB-2. 9 HM Heizthermostate, 9 HM Temperatursensoren, 22 HM Fensterkontakte, 7 Rolloaktoren, 17 HM Unterputz-Aktoren

setstate

Zitat von: setstate am 17 April 2015, 19:13:16
Upps, das Image Widget habe ich noch gar nicht an die neue Version angepasst, weil ich es persönlich nicht im Einsatz habe.
Ich melde mich wieder ...

Image Widget ist jetzt angepasst. Damit kann es auch mit der FTUI Version 1.4 wieder genutzt werden.

Zusätzlich kann jetzt auch das Update Intervall pro Bild vorgeben, wenn man ein Image per data-url eingebunden hat. Mit data-refresh legt man das Refresh-Intervall in Sekunden fest. Default für data-refresh ist 900 Sekunden (15Minuten).

Neuladen aller 15 Minuten:

<div data-type="image"
        data-url="./images/Karte.png"
        data-size="150px">
</div>


Neuladen jede Minute:

<div data-type="image"
        data-url="./images/Cam.png"
        data-size="200px"
        data-refresh="60">
</div>


Ein Bild, was per FHEM-Device Reading-URL (data-get) geholt wird, kann nicht per data-refresh beeinflusst werden. Das Update erfolgt, wie andere data-get Widgets über die normale Short/Long-Poll Refreshs.

<div data-type="image" data-device="AgroWeather"
        data-get="fc0_weatherDayIcon"
        data-size="50px">
</div>

nesges

Zitat von: Phil__ am 17 April 2015, 19:22:50
Habe einfach mal alle Files, bis auf die .html's, aus dem Ordner "...fhem/www/tablet" gelöscht und die aus dem GIT neu geladen und manuel rein kopiert!
Nun sind die Probleme verschwunden.

Hat sich das Problem mit den nicht geladenen Icons damit auch für die anderen erledigt, oder besteht noch Analysebedarf? Ich konnte die Probleme bisher bei mir nicht nachstellen - falls es also noch irgendwo nicht richtig funktioniert bitte nochmal melden.

johannes1984

Hallo,

wollte gerade mal das Update machen, bekomme aber folgende Fehlermeldung:

2015-04-18 10:57:03 Global global UPD www/tablet/js/fhem-tablet-ui.js
2015-04-18 10:57:03 Global global Got 13659 bytes for www/tablet/js/fhem-tablet-ui.js, not 13537 as expected,


Habe schon mal die fhem-tablet-ui.js in fhem-tablet-ui-old.js umbenannt, in der Hoffnung, dass er sie dann einfach nochmal runterlädt. Tut er aber nicht. :-(

Jemand eine Idee?

LG Johannes
RPi Version B, HMLAN, ZWave USB Stick, CUL

setstate

Bitte jetzt nochmal probieren. Mit dem Update Control File stehe ich noch etwas auf Kriegsfuß. Local Commit, Remote Pull Request Commit und Prepare Controlfile, da kommt man schnell durcheinander und in die falsche Reihenfolge.

Sorry
Mario

Phil__

Zitat von: johannes1984 am 18 April 2015, 10:57:56
Hallo,

wollte gerade mal das Update machen, bekomme aber folgende Fehlermeldung:

2015-04-18 10:57:03 Global global UPD www/tablet/js/fhem-tablet-ui.js
2015-04-18 10:57:03 Global global Got 13659 bytes for www/tablet/js/fhem-tablet-ui.js, not 13537 as expected,


Habe schon mal die fhem-tablet-ui.js in fhem-tablet-ui-old.js umbenannt, in der Hoffnung, dass er sie dann einfach nochmal runterlädt. Tut er aber nicht. :-(

Jemand eine Idee?

LG Johannes
Falls das Update nicht klappt, manuell die GIT Sourcen laden geht immer!
Server: Intel DH77EB + Core i3-2120 mit Ubuntu Server 14.04
Backup: Beaglebone Black
Homematic: HM-LAN-Adapter, HM-CC-RT-DN, HM-CC-TC, HM-LC-SW1-PL2, HM-SEC-RHS, HM-SEC-SC, HM-TC-IT-WM-W-EU, HM-WDS10-TH-O
Weitere: Denon-AVR, PhilipsTV, PhilipsHue, Raspi+XBMC
Nexus 7 (WebViewControl + FTUI)

miot

Die Probleme sind zumindest bei mir noch vorhanden.  Auch zu Hause - entgegen meiner gestrigen Aussage - sind in seltenen Einzelfaellen die Probleme zu sehen.

Ich hab einiges getestet, haufenweise console.log in die fhem-tablet-ui.js eingebaut, ein bisschen ajax und jquery gelesen und alles zusammen geworfen ;)

Hier mal ein Logauszug an dem man es gut erkennen kann (kommentare sind drin)


"Plugin dir: /fhem/tablet/js"
"Filename: index_weather.html"

Mein Kommentar: Alles mit ++++ passiert im plugins.load Teil:

"++++ Collecting required readings"
"++++ Initializing Widgets"
"++++ Initializing widget_clock"
"++++ Initializing widget_label"
"++++ Initializing widget_symbol"
"++++ Initializing widget_weather"
"++++ Request readings from FHEM"

Mein Kommentar: JETZT kommt aber schon das erste Ergebnis fuer ein Reading:

"MicaProplanta        2015-04-18 11:04:03 16"
"update done for device:MicaProplanta parameter:fc1_tempMax"

Mein Kommentar: UND JETZT wird erst das Widget in function intWidgets initialisiert!

"---- Loading plugin: widget_weather"
"---- Module added: widget_weather"
"---- Module widget_weather is now initialized"
"---- Module widget_weather is now requesting (FHEM) STATE"

Mein Kommentar: Jetzt kommt der Rest...

"MicaProplanta        2015-04-18 11:04:03 5"
"update done for device:MicaProplanta parameter:fc0_temp06"
"GA_HIN_TEMP01        T: 12.9 H: 47"
"update done for device:GA_HIN_TEMP01 parameter:STATE"


Im Screenshot (hier nur der relevante Teil) fehlt genau die Darstellung von fc1_tempMax, weil dieses Ergebnis bereits empfangen wurde bevor das Widget aktiv war oder Ergebnisse annehmen / verarbeiten / darstellen konnte.
Wenn ich in FHEM anschliessend manuell  'set MicaProplanta update' absende wird der fehlende Wert dank longpoll sauber dargestellt - so solls ja auch sein.

Ich denke ihr konnt das viel besser interpretieren als ich aber hinsichtlich sync / async muss sichergestellt werden, dass der Load UND Init der Wigets abgeschlossen ist BEVOR der erste Request an FHEM abgesendet wird bzw. Ergebnisse ankommen und verarbeitet werden sollen.
Ist aber nur eine Laien-Schlussfolgerung ;)

Waer super, wenn ihr das oben zusammengereimte mal fachmaennisch ueberdenken koenntet.


Achja: Und nochwas eher unschoenes (wird aber auch keiner bewusst machen): Wenn ich in meinem Browser staendig F5 auf einer der UI Seiten fuer aktualisieren druecke ohne die Ergebnis-Darstellung abzuwarten dann werden wohl soviele Anfragen parallel zu FHEM gesendet, dass FHEM zuverlaessig und reproduzierbar nach ca. 10-20 mal F5 druecken gnadenlos abstuerzt. Haengt wohl von der Anzahl der Anfragen auf der UI Seite ab, die gesendet werden und beantwortet werden muessen. Irgendwann sind es dann aber wohl zu viele und es scheint eine Ueberlaufsituation zu entstehen. 

Gruss
Michael

PS: Die Sources manuell von git zu laden und einzuspielen aendert bei mir nichts an dem Verhalten.


Zitat von: nesges am 18 April 2015, 09:51:10
Hat sich das Problem mit den nicht geladenen Icons damit auch für die anderen erledigt, oder besteht noch Analysebedarf? Ich konnte die Probleme bisher bei mir nicht nachstellen - falls es also noch irgendwo nicht richtig funktioniert bitte nochmal melden.

setstate

Hallo Michael, das ist doch mal eine Spur!
Vielen Dank für die umfangreiche Analyse

Ich werde mir es ansehen.

nesges

#968
Zitat von: bjoernbo am 17 April 2015, 09:36:58
es ist ja möglich, dass ich die UPDATE Funktion auf einen Button legen kann. Ist es technisch irgendwie möglich, dass mir das UI mitteilit, dass ein neues Update verfügbar ist? z.B. das mir der Button in einer anderen Farbe dargestellt wird o.ä..

Gute Idee! Das control-File hat ja schon die benötigten Infos, das müsste man nur prüfen und mit den lokalen Files vergleichen. Kann man mit HTTPMOD machen, man braucht nur eine Prüffunktion, die man irgendwo in eine 99_myUtils.pm legt:

sub controlfile_updatecheck($) {
    use Date::Parse;
    my $raw = shift;

    my $response='';
    my @lines = split "\n", $raw;
    foreach my $line (@lines) {
        my @remote= split " ", $line;
        if(@remote>3 && $remote[0] eq "UPD") {
            Log 3, $line;
            $remote[1]=~s/_/ /;
           
            my @local = stat($remote[3]);
            if($local[7] != $remote[2] || $local[9] < str2time($remote[1])) {
                $response .= $remote[0]." ".$remote[3]."\n";
            }
        }
    }
    return $response;
}


Eine Funktion um das Update durchzuführen und die Readings zu aktualisieren:

sub controlfile_update($) {
    my $device = shift;
    my $url = InternalVal($device, 'url', '');
    my $def = InternalVal($device, 'DEF', '');
   
    fhem("setreading $device available updated");
    fhem("setreading $device files -");
    fhem("define at_recheck_$device at +00:05:00 modify $device $def");
    fhem("update all $url");
}


Und in die fhem.cfg kommen dann diese Definitionen:

define UPDATE_FTUI HTTPMOD https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt 14400
attr UPDATE_FTUI alias Fhem Tablet UI
attr UPDATE_FTUI userattr timeout reading01Name reading01Regex reading02Name reading02Regex
attr UPDATE_FTUI event-on-change-reading available,files
attr UPDATE_FTUI reading01Name files
attr UPDATE_FTUI reading01Regex (?s)(UPD.*)
attr UPDATE_FTUI reading01Expr $val=controlfile_updatecheck($val);;$val
attr UPDATE_FTUI reading02Name available
attr UPDATE_FTUI reading02Regex (?s)(UPD.*)
attr UPDATE_FTUI reading02Expr $val=controlfile_updatecheck($val) ne ''?'yes':'no';;$val
attr UPDATE_FTUI room hidden

define UPDATE_WIDGETS HTTPMOD https://raw.githubusercontent.com/nesges/Widgets-for-fhem-tablet-ui/master/controls_widgets-for-fhem-tablet-ui.txt 14400
attr UPDATE_WIDGETS alias Widgets for Fhem Tablet UI
attr UPDATE_WIDGETS userattr timeout reading01Name reading01Regex reading02Name reading02Regex
attr UPDATE_WIDGETS event-on-change-reading available,files
attr UPDATE_WIDGETS reading01Name files
attr UPDATE_WIDGETS reading01Regex (?s)(UPD.*)
attr UPDATE_WIDGETS reading01Expr $val=controlfile_updatecheck($val);;$val
attr UPDATE_WIDGETS reading02Name available
attr UPDATE_WIDGETS reading02Regex (?s)(UPD.*)
attr UPDATE_WIDGETS reading02Expr $val=controlfile_updatecheck($val) ne ''?'yes':'no';;$val
attr UPDATE_WIDGETS room hidden

define UPDATES readingsGroup UPDATE_FTUI:available,files UPDATE_WIDGETS:available,files
attr UPDATES valueFormat { ($READING eq 'files' && $VALUE !~ /^-?$/)?'<a href="?cmd={controlfile_update(\'$DEVICE\')}">[Start Update]</a>':$VALUE }
attr UPDATES alias 3d Party Updates
attr UPDATES room System


In der readingsGroup wird ein Link mit dem Text "[Start Update]" angezeigt, sobald ein Update verfügbar ist. Die readingsGroup kann man sicher noch schöner machen, aber da kenn ich mich nicht aus und überlasse das euch :)

PS: Habe ein paar Stellen verändert, am besten komplett neu übernehmen.

bjoernbo

Sauber! Ich dachte schon der Post wäre untergegangen. Ich werde das mal ausprobieren!
Raspberry Pi 3 - FB6490C - Synology NAS DS916+ - NETATMO - HUE - SIEMENS G-Tag'S - FTUI - EchoDOT -

chris1284

#970
nabend,

cih benötige mal hilfe beim fomatieren. ich bekomme die werte nicht inline dargestellt ...  >:(

<li data-row="1" data-col="5" data-sizex="3" data-sizey="1">
        <header>Wettermast</header>
<div class="container inline">
            <div data-type="label" data-device="KS300" data-get="temperature" data-unit="%B0C%0A" class="cell small inline"></div>
    <div data-type="label" data-device="KS300" data-get="humidity" data-unit="%" class="cell small inline"></div>
    <div data-type="label" data-device="KS300" data-get="wind" data-unit="%B0C%0A" class="cell small inline"></div>
    <div data-type="label" data-device="KS300" data-get="rain" data-unit="" class="cell small inline"></div>
</div>
<div class="container inline">
    <div data-type="label" class="cell small inline">Temperatur</div>
    <div data-type="label" class="cell small inline">Luftfeuchte</div>
    <div data-type="label" class="cell small inline">Wind</div>
    <div data-type="label" class="cell small inline">Regen</div>
</div>
</li>


danke schon einmal

setstate

Hallo Chris1284,

leider kann ich nur raten, wie es am Ende aussehen soll ...
So?

<li data-row="1" data-col="5" data-sizex="3" data-sizey="1">
        <header>Wettermast</header>
        <div class="cell inline">
            <div data-type="label" data-device="KS300" data-get="temperature" data-unit="%B0C%0A" class="small"></div>
            <div data-type="label" class="small">Temperatur</div>
        </div>
        <div class="cell inline">
            <div data-type="label" data-device="KS300" data-get="humidity" data-unit="%" class="small"></div>
            <div data-type="label" class="small">Luftfeuchte</div>
        </div>
        <div class="cell inline">
             <div data-type="label" data-device="KS300" data-get="wind" data-unit="%B0C%0A" class="small"></div>
             <div data-type="label" class="small">Wind</div>
        </div>
        <div class="cell inline">
            <div data-type="label" data-device="KS300" data-get="rain" data-unit="" class="small"></div>
            <div data-type="label" class="small">Regen</div>
        </div>
</li>

chris1284

#972
EDIT:  *über sich selbst ärger* man sollte die richtiges css includen...

setstate

Zitat von: miot am 18 April 2015, 12:32:36
Die Probleme sind zumindest bei mir noch vorhanden.  Auch zu Hause - entgegen meiner gestrigen Aussage - sind in seltenen Einzelfaellen die Probleme zu sehen.

Ich hab einiges getestet, haufenweise console.log in die fhem-tablet-ui.js eingebaut, ein bisschen ajax und jquery gelesen und alles zusammen geworfen ;)

Eine kleine Erweiterung konnte ich noch einbauen, um den vermuteten Race Conditions zu umgehen.
Bitte ladet mal die geänderte fhem-tablet-ui.js von Github und testet bei euch, ob es damit besser ist.

Viele Dank

miot

Funktioniert wieder alles perfekt!  Erstmal vielen Dank dafuer ;)

Compare sei Dank hab ich mal geschaut, was Du geaendert hast und ein wenig weiter experimentiert.  Seit gestern ist bei mir nicht viel neues Wissen dazugekommen, so dass ich immer noch jede Menge Fragezeichen habe aber auch was rausfinden konnte:

loadplugin_async wird nicht aufgerufen oder?   Die drei Zeilen Teil solltest Du wieder entfernen sonst fragt man sich in 2 Wochen, wofuer das wohl sein soll...
In Zeile 384 habe ich async: true fest gesetzt (loadplugin_async wird ja nicht aufgerufen) zumal Firefox und Chrome von sync XMLHttpRequests abraten.
In der Funktion (loadplugin) wird zwar zwischen success und error unterschieden aber ich finde partout keinen Code der darauf reagiert... Dafuer reichts wohl bei mir mit dem Verstaendnis noch nicht  :(
Zum Erfolg fuehren jedenfalls die Zeilen 40-45, die die Widgets nach dem Laden zuerst updaten bevor ein neuer Request bereits empfangene Werte ueberschreibt.

Da es ja um Optimierung geht: In Zeile 40-45 werden bei geladenem widget ALLE readings von ALLEN devices upgedatet. Ich habe mal einen Zaehler eingebaut und mir das im Log anzeigen lassen. Bei meiner Wetterseite sind das bei 5 verwendeten Widgets und jeweils 81 updates insgesamt 405 Aufrufe von module.update fuer 0-10 vorhandene Werte. Ich weiss nicht wie lange diese Updates dauern bzw. wie gross die reale Verzoegerung ist aber von den Zahlen her wuerde ich sagen da steckt Potential fuer Optimierung drin.

Aber das sind alles spinnerte Peanuts. Alles funktioniert - 1000 Dank fuer Deine Bemuehungen!

Gruss
Michael

Zitat von: setstate am 18 April 2015, 22:13:28
Eine kleine Erweiterung konnte ich noch einbauen, um den vermuteten Race Conditions zu umgehen.
Bitte ladet mal die geänderte fhem-tablet-ui.js von Github und testet bei euch, ob es damit besser ist.

Viele Dank