Wie schon im Tablet UI thread beschrieben, habe ich in meinem tablet UI viele gleichartige Widgets oder gar Widgetgruppen.
Bei Änderungen heisst das immer sehr viel manueller Aufwand und das löse ich lieber über ein Programm ;D
Idee ist ein Servermodul, dass andere Dateien (Parts) vor der Übertragung an den Browser einfügen kann und dabei auch gleich Variablen (mit default-Werten) ersetzen. So können nicht nur der Devicename und Texte sondern auch Formatierungen angepasst werden. Solche Dateien, in die etwas eingefügt werden soll nenne ich Formulare.
Das ganze basiert auf dem 02_HTTPSrv von Boris Neubert und verhält sich für Nichtformulare auch genauso wie das Original. Wenn die Datei aber ein .ftui. im Namen trägt, so wird nach Elementen gesucht, die ersetzt werden sollen.
- Durch das tag <?ftui-inc="dateiname.part" ?> wird die durch dateiname.part angegebene Datei (mit Pfad) an der Stelle des tags eingesetzt.
- Bei ftui-inc können auch Ersetzungen für Variablen angegeben werden. <?ftui-inc="dateiname" variable1="ersetzung1" ... variablen="ersetzung20" ?>
- In der part-Datei werden Variablen durch Angabe des Tags <?ftui-key=variable ?> angegeben. Das gesamte tag wird dann durch den in ftui-inc angegebenen Wert ersetzt.
- Ausserdem kann man in der part-Datei auch Standardwerte für Variablen angeben, so dass im ftui-inc nicht alle Variablen mit Werten versehen werden. Dazu wird im Kopf der part-Datei ein <?ftui-header="Name" variable="defaultwert" ... ?> tag eingeführt, dass den defaultwert für die variable definiert. Das ftui-header-Tag wird bei der Einfügung entfernt und findet sich nicht mehr in der an FTUI übergebenen Datei.
WICHTIG: Eingefügte Dateien können selbst wieder Formulare sein, dazu müssen diese aber auch wieder im Dateinamen den Teil ".ftui." enthalten
WICHTIG: Dateinamen und Ersetzungen müssen in Anführungsstriche (") eingeschlossen werden.
Aktualisierung: 25.4. Das Modul ist jetzt auch über den normalen Update verfügbar.
Die neueste Version findet sich aber nur in github unter folgendem Link:
https://github.com/viegener/Telegram-fhem/blob/master/ftuisrv/02_FTUISRV.pm (https://github.com/viegener/Telegram-fhem/blob/master/ftuisrv/02_FTUISRV.pm).
Achtung: Der Link verweist nicht direkt auf die Datei, sondern auf eine Seite in Githuib --> von dort kann man die Datei über den Knopf "raw" herunterladen.
Um es mit dem FHEM Tablet UI (FTUI) zu verwenden ersetzt man einfach den existierenden define für HTTPSrv durch einen define mit FTUISrv
also z.B. so
define nftui FTUISRV ftui ./www/tablet New-FTUI
Damit es etwas klarer wird hier ein Beispiel:
In der Datei roomx.ftui.html findet sich folgender Inhalt:
<li data-row="1" data-col="2" data-sizex="2" data-sizey="1">
<header>Bad</header>
<?ftui-inc="temphum.part" dev="temp_gb" format="left cell" ?>
</li>
Die Datei temphum.part sieht dann wie folgt aus:
<?ftui-header="TempHum" dev format tempreading="temperature" ?>
<div class="<?ftui-key=format ?>">
<div data-type="label" data-device="<?ftui-key=dev ?>" data-get="<?ftui-key=tempreading ?>" data-unit="%B0C%0A" class="large"></div>
<div data-type="label" class="small fixedlabel">Temperatur</div>
<div data-type="label" data-device="<?ftui-key=dev ?>" data-get="humidity" data-unit="%" class="large top-space"></div>
<div data-type="label" class="small fixedlabel">Luftfeucht.</div>
</div>
Daraus entsteht dann folgendes Ergebnis, das an den Server gesendet wird:
<li data-row="1" data-col="2" data-sizex="2" data-sizey="1">
<header>Bad</header>
<div class="left cell">
<div data-type="label" data-device="temp_gb" data-get="temperature" data-unit="%B0C%0A" class="large"></div>
<div data-type="label" class="small fixedlabel">Temperatur</div>
<div data-type="label" data-device="temp_gb" data-get="humidity" data-unit="%" class="large top-space"></div>
<div data-type="label" class="small fixedlabel">Luftfeucht.</div>
</div>
</li>
Wie immer Kommentare
Hallo Johannes,
ich habe nun versucht FTUISRV umzusetzen, leider ohne Erfolg. Hier die einzelnen Informationen:
list der FTUISRV Definition:
Internals:
CFGFN ./MyFHEM/WEB/WEBtablet_iPad.cfg
DEF tablet_iPad ./www/tablet_iPad/ Tablet_iPad_Frontend
NAME MyTablet_iPad_UI
NR 20
STATE MyTablet_iPad_UI
TYPE FTUISRV
Fhem:
directory ./www/tablet_iPad/
friendlyname Tablet_iPad_Frontend
infix tablet_iPad
Attributes:
room Z-HA-fhem
verbose 1
Die ftui Datei wird wie folgt aufgerufen:
<div class="cell"
data-type="pagetab"
data-url="h-eg-r.ftui.html"
data-icon="oa-control_building_eg"
data-background-icon="fa-circle"
data-off-background-color="dimgrey"
data-on-background-color="darkorange"
data-on-color="black"
data-off-color="black">
</div>
Inhalt von h-eg-r.ftui.html:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<meta name="widget_base_width" content="100">
<meta name="widget_base_height" content="120">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="longpoll" content="1"> <!-- 1=longpoll;0=shortpoll every 30sec -->
<meta name="debug" content="0"> <!-- 1=output to console;0=not output -->
<meta name="gridster_disable" content="0"> <!-- verschieben abschalten -->
<link rel="stylesheet" href="/fhem/tablet/lib/jquery.gridster.min.css" />
<link rel="stylesheet" href="/fhem/tablet/css/fhem-tablet-ui.css" />
<link rel="stylesheet" href="/fhem/tablet/lib/font-awesome.min.css" />
<link rel="stylesheet" href="/fhem/tablet/lib/jquery.toast.min.css" />
<link rel="stylesheet" href="/fhem/tablet/lib/powerange.min.css"/>
<!-- Charts Theme CSS -->
<link rel="stylesheet" href="/fhem/tablet/lib/openautomation.css" />
<link rel="stylesheet" href="/fhem/tablet/lib/fhemSVG.css" />
<!-- define your personal style here, it wont be overwritten -->
<link rel="stylesheet" href="/fhem/tablet/css/fhem-tablet-ui-user.css" />
<!-- Javascript -->
<script type="text/javascript" src="/fhem/pgm2/jquery.min.js"></script>
<script type="text/javascript" src="/fhem/tablet/lib/jquery.knob.mod.min.js"></script>
<script type="text/javascript" src="/fhem/tablet/lib/jquery.toast.min.js"></script>
<script type="text/javascript" src="/fhem/tablet/lib/jquery.circlemenu.js"></script>
<script type="text/javascript" src="/fhem/tablet/lib/powerange.min.js"></script>
<script type="text/javascript" src="/fhem/tablet/lib/jquery.gridster.min.js"></script>
<script type="text/javascript" src="/fhem/tablet/lib/fa-multi-button.min.js"></script>
<script type="text/javascript" src="/fhem/tablet/js/fhem-tablet-ui.js"></script>
<title>EG Heizung</title>
</head>
<body>
<div class="gridster">
<ul>
<!-- Menu -->
<div class="container">
<li data-row="1" data-col="1" data-sizex="1" data-sizey="5" data-template="menu-main.html"></li>
<li data-row="6" data-col="1" data-sizex="1" data-sizey="1.5" data-template="menu-datetime.html"></li>
</div>
<!-- Content -->
<li data-row="2" data-col="2" data-sizex="2" data-sizey="3">
<header><font size="+1">Büro</font></header>
<?ftui-inc="h-hz-template_HKFH.part" dev="Buero" ?>
</li>
</ul>
</div>
</body>
</html>
Und die part Datei selber:
<?ftui-header="HKFH" dev ?>
<div class="container">
<div class="container row big top-space">
<div class="col-1-2 left">
<div data-type="label"
data-device="<?ftuikey=dev ?>_TC" data-get="measured-temp" data-unit="%B0C%0A" data-fix="1"
data-limits='[-20,20,24]' data-colors='["skyblue","darkorange","orangered"]'>
</div>
</div>
<div class="col-1-2 right">
<div data-type="label"
data-device="<?ftuikey=dev ?>_TC" data-get="humidity" data-unit="%%0A" data-fix="1"
data-limits='[0,40,60]' data-colors='["skyblue","darkorange","orangered"]'>
</div>
</div>
</div>
<div class="container row">
<div class="top-space" data-type="label">Heizkörper</div>
<div class="container top-space">
<div class="col-2-3 left">
<div data-type="thermostat"
data-device="<?ftuikey=dev ?>_HK_Clima" data-get="desired-temp" data-set="desired-temp" data-temp="measured-temp" data-valve="ValvePosition"
data-min="0" data-max="30" data-step="0.5"
data-mode="controlMode"
data-off="controlManu off" data-boost="controlMode boost"
data-fgColor="darkorange"
data-height="96px"
data-width="96px">
</div>
</div>
<div class="col-1-3 top-space right"><font size="-2">
<div data-type="multistatebutton"
data-device="<?ftuikey=dev ?>_HK_Clima" data-get="controlMode" data-get-on='["auto","manual"]'
data-set='["controlMode manual","controlMode auto"]' data-icons='["oa-sani_heating_automatic","oa-sani_heating_manual"]' data-colors='["darkgreen","darkblue"]'
data-background-icon="fa-square" data-background-colors='["dimgrey","dimgrey"]'
>
</div><br>
<div data-type="multistatebutton"
data-device="<?ftuikey=dev ?>_HK" data-get="R-btnLock" data-get-on='["on","off"]'
data-set='["regSet btnLock off","regSet btnLock on"]' data-icons='["oa-secur_locked","oa-secur_open"]' data-colors='["darkred","darkblue"]'
data-background-icon="fa-square" data-background-colors='["dimgrey","dimgrey"]'
>
</div>
</font>
</div>
</div>
</div>
<div class="container row">
<div data-type="label">Fussboden</div>
<div class="container top-space">
<div class="col-2-3 left">
<div data-type="thermostat"
data-device="<?ftuikey=dev ?>_TC" data-get="desired-temp" data-set="desired-temp" data-temp="measured-temp" data-valve="actuator"
data-min="0" data-max="30" data-step="0.5"
data-mode="controlMode"
data-off="controlManu off" data-boost="controlMode boost"
data-fgColor="darkorange"
data-height="96px"
data-width="96px">
</div>
</div>
<div class="col-1-3 top-space right"><font size="-2">
<div data-type="multistatebutton"
data-device="<?ftuikey=dev ?>_TC_Climate" data-get="controlMode" data-get-on='["auto","manual"]'
data-set='["controlMode manual","controlMode auto"]' data-icons='["oa-sani_heating_automatic","oa-sani_heating_manual"]' data-colors='["darkgreen","darkblue"]'
data-background-icon="fa-square" data-background-colors='["dimgrey","dimgrey"]'
>
</div><br>
<div data-type="multistatebutton"
data-device="<?ftuikey=dev ?>_TC" data-get="R-btnLock" data-get-on='["on","off"]'
data-set='["regSet btnLock off","regSet btnLock on"]' data-icons='["oa-secur_locked","oa-secur_open"]' data-colors='["darkred","darkblue"]'
data-background-icon="fa-square" data-background-colors='["dimgrey","dimgrey"]'
>
</div>
</font>
</div>
</div>
</div>
</div>
Der screenshot zeigt das Ergebnis.
Ein Tipp wo ich weiter nach dem Fehler suchen kann?
Danke und ciao Walter
Hallo zusammen,
Ich glaube das Modul ist seit der Existenz parametriesierter Templates nicht mehr nötig, oder?
Viele Grüße
Andreas
Gesendet von iPad mit Tapatalk
Hallo zusammen,
Ich glaube das Modul ist seit der Existenz parametriesierter Templates nicht mehr nötig, oder?
Viele Grüße
Andreas
Gesendet von iPad mit Tapatalk
@Walter
Ich habe Deine Definitionen mal bei mir nachgestellt, dabei sind mir verschiedene Probleme aufgefallen:
1) Der Define für das Modul enthält meines Erachtens noch einen / zuviel
Ich würde die Definition nochmals löschen und dann folgendes anlegen:
define tablet_iPad FTUISRV ./www/tablet_iPad Tablet_iPad_Frontend
2) Zumindest in h-eg-r.ftui.html befinden sich Referenzen auf einen Pfad: /fhem/tablet/... selbst wenn das möglicherweise auch so existiert, ist es doch problematisch, es wäre besser in tablet_iPad ein kompletten Satz des tablet uis zu haben. Eigentlich betrifft das aber eher Deine index.html-Datei
3) Ich denke in h-eg-r.ftui.html können aber die gesamten css / js-Includes entfallen, die werden ja vom index.html eingelesen.
Nur als Seitenanmerkung, die Umlaute sind als äöü geschrieben, hier müsste in html eigentlich als ä etc stehen, sonst bekommst Du falsche Zeichen.
Wenn Du die Änderungen umstellst, habe ich hier noch eine Version von FTUISRV angehängt, die mehr Info herausgibt, wenn man das Attribut verbose auf den Wert 5 setzt. Hinweis wenn bei verbose 5 keine Einträge im log entstehen, dann kommen Deine Requests gar nicht beim Modul an. Diese lässt sich ganz gut verhindern, wenn man das Verzeichnis im www-Verzeichnis anders nennt als den Teil im URL. Also das Verzeichnis z.B. nur iPad (die urls bleiben natürl,ich bei fhem/tablet_iPad).
Zitat von: andreas13 am 01 Januar 2016, 16:31:18
Hallo zusammen,
Ich glaube das Modul ist seit der Existenz parametriesierter Templates nicht mehr nötig, oder?
Aus meiner Sicht schon, da der Zusammenbau auf Server-Seite besser geeignet ist um Probleme mit Javascript bei den dynamischen Ladevorgängen zu vermeiden. Für das Javascript kommt dann wenigstens nur 1 Datei heraus. Ausserdem würde ich gerne immer noch eine Seite dynamisch aufbauen können.
Zitat von: viegener am 01 Januar 2016, 19:48:20
Aus meiner Sicht schon, da der Zusammenbau auf Server-Seite besser geeignet ist um Probleme mit Javascript bei den dynamischen Ladevorgängen zu vermeiden. Für das Javascript kommt dann wenigstens nur 1 Datei heraus. Ausserdem würde ich gerne immer noch eine Seite dynamisch aufbauen können.
Hallo Andreas,
in dieses Problem bin ich gelaufen. Ich habe ein Template für meine Thermostate erstellt und es mehrmals innerhalb einer Darstellung aufgerufen. Eine 100% richtige Darstellung kommt fast nie zustande.
Deswegen teste ich aktuell die Lösung von Johannes.
ciao walter
Zitat von: viegener am 01 Januar 2016, 19:46:09
Wenn Du die Änderungen umstellst, habe ich hier noch eine Version von FTUISRV angehängt, die mehr Info herausgibt, wenn man das Attribut verbose auf den Wert 5 setzt.
Hallo Johannes,
habe zum Testen alles soweit abgespeckt, dass sowenig wie möglich Nebeneffekte entstehen.
Im Log findet sich nun z.B. Folgendes (auf MyTestUI gefiltert):
2016.01.02 13:43:32.904 5: MyTestUI: Request to :/TEST/menu-datetime.html:
2016.01.02 13:43:32.904 5: MyTestUI: handletemplatefile :./www/TEST/menu-datetime.html:
2016.01.02 13:43:33.434 5: MyTestUI: Request to :/TEST/js/widget_pagetab.js:
2016.01.02 13:43:33.434 5: MyTestUI: handletemplatefile :./www/TEST/js/widget_pagetab.js:
2016.01.02 13:43:33.442 5: MyTestUI: Request to :/TEST/js/widget_clock.js:
2016.01.02 13:43:33.443 5: MyTestUI: handletemplatefile :./www/TEST/js/widget_clock.js:
2016.01.02 13:43:34.047 5: MyTestUI: Request to :/TEST/js/widget_famultibutton.js:
2016.01.02 13:43:34.047 5: MyTestUI: handletemplatefile :./www/TEST/js/widget_famultibutton.js:
2016.01.02 13:43:34.075 5: MyTestUI: Request to :/TEST/js/widget_widget.js:
2016.01.02 13:43:34.075 5: MyTestUI: handletemplatefile :./www/TEST/js/widget_widget.js:
2016.01.02 13:43:34.132 5: MyTestUI: Request to :/TEST/hegr.ftui.html:
2016.01.02 13:43:34.133 5: MyTestUI: handletemplatefile :./www/TEST/hegr.ftui.html:
2016.01.02 13:43:34.134 4: MyTestUI: is real template :./www/TEST/hegr.ftui.html:
Jedoch stirbt fhem mit der letzten Zeile :-(
Das ungefilterte Log sieht dann so aus:
2016.01.02 13:43:34.047 5: MyTestUI: Request to :/TEST/js/widget_famultibutton.js:
2016.01.02 13:43:34.047 5: MyTestUI: handletemplatefile :./www/TEST/js/widget_famultibutton.js:
2016.01.02 13:43:34.075 5: MyTestUI: Request to :/TEST/js/widget_widget.js:
2016.01.02 13:43:34.075 5: MyTestUI: handletemplatefile :./www/TEST/js/widget_widget.js:
2016.01.02 13:43:34.080 0: HMLAN_Parse: HMLAN_03 R:EA11B22 stat:0000 t:52375363 d:FF r:FFBE m:02 A001 A11B22 1C3828 010E
2016.01.02 13:43:34.084 0: HMLAN_Parse: HMLAN_02 R:EA11B22 stat:0000 t:525A9784 d:FF r:FFBB m:02 A001 A11B22 1C3828 010E
2016.01.02 13:43:34.132 5: MyTestUI: Request to :/TEST/hegr.ftui.html:
2016.01.02 13:43:34.133 5: MyTestUI: handletemplatefile :./www/TEST/hegr.ftui.html:
2016.01.02 13:43:34.134 4: MyTestUI: is real template :./www/TEST/hegr.ftui.html:
Undefined subroutine &main::fileparse called at ./FHEM/02_FTUISRV.pm line 330.
Die Zeile 330 sieht so aus:
my ($dum, $curdir) = fileparse( $filename );
Was könnte hier der Grund sein?
Danke und ciao walter
Zitat von: wkarl am 02 Januar 2016, 13:58:44
Die Zeile 330 sieht so aus:
my ($dum, $curdir) = fileparse( $filename );
Was könnte hier der Grund sein?
Sieht so aus als ob das Dateinamenmodul (File::Basename) bei Dir nicht standardmässig geladen ist. OK, das hätte ich gleichexplizit hinzufügen sollen.
Anbei das neue Modul mit der einen Zeile hinzugefügt:
use File::Basename;
Bitte nochmals damit ausprobieren.
Generell ist der Logfile aber schon gut, denn die Anfragen kommen vorbei und das Template wurde auch erkannt, dann sollten auch die Ersetzungen gehen, denn die sahen soweit gut aus.
Danke für die Geduld...
Johannes
Hallo Johannes,
funktioniert jetzt. Super.
Und ne Frage - folgendes Konstrukt wird vermutlich nicht unterstützt?
data-device="<?ftuikey=dev ?>_TC"
Danke und ciao
walter
Klasse, doch auch auch eine solche Umsetzung sollte kein Problem sein. Ich habe zwar keinen Versuch gemacht, aber da keine Vorbedingungen für die Umgebung gelten, sollte auch hier die Umsetzung funktionieren.
Eine Funktionalität, die ich bisher noch nicht umgesetzt habe ist ein IF-Konstrukt, das es erlaubt basierend auf Variableninhalten unterschiedliche Teile auszugeben.
Johannes
Hallo Johannes,
bin nochmal Deine Beschreibung durchgegangen, um sicher zu gehen keinen grundlegenden Fehler zu haben. Aber das Ersetzen klappt nicht so.
Inhalt der Datei, die das Formular aufruft:
<!DOCTYPE html>
<html>
<head>
<title>EG Heizung</title>
</head>
<body>
<div class="gridster">
<ul>
<!-- Menu -->
<!-- Content -->
<li data-row="2" data-col="2" data-sizex="2" data-sizey="3">
<header><font size="+1">Bro</font></header>
<?ftui-inc="hhztemplateHKFH.part" dev="Buero_TC" ?>
</li>
</ul>
</div>
</body>
</html>
Das Formular selber:
<?ftui-header="HKFH" dev ?>
<div class="container">
<div class="container row big top-space">
<div class="col-1-2 left">
<div data-type="label"
data-device="<?ftuikey=dev ?>" data-get="measured-temp" data-unit="%B0C%0A" data-fix="1"
data-limits='[-20,20,24]' data-colors='["skyblue","darkorange","orangered"]'>
</div>
</div>
<div class="col-1-2 right">
<div data-type="label"
data-device="<?ftuikey=dev ?>" data-get="humidity" data-unit="%%0A" data-fix="1"
data-limits='[0,40,60]' data-colors='["skyblue","darkorange","orangered"]'>
</div>
</div>
</div>
</div>
Das gefilterte log:
2016.01.02 16:42:47.692 5: MyTestUI: handletemplatefile :./www/TEST/js/widget_widget.js:
2016.01.02 16:42:47.742 5: MyTestUI: Request to :/TEST/hegr.ftui.html:
2016.01.02 16:42:47.743 5: MyTestUI: handletemplatefile :./www/TEST/hegr.ftui.html:
2016.01.02 16:42:47.744 4: MyTestUI: is real template :./www/TEST/hegr.ftui.html:
2016.01.02 16:42:47.744 4: MyTestUI: look for includes :./www/TEST/hegr.ftui.html:
2016.01.02 16:42:47.745 4: MyTestUI: include found :./www/TEST/hegr.ftui.html: inc :hhztemplateHKFH.part: vals :dev="Buero_TC" :
2016.01.02 16:42:47.745 4: MyTestUI: a key :dev: = :Buero_TC:
2016.01.02 16:42:47.746 4: MyTestUI: start handling include (rec) :./www/TEST/hhztemplateHKFH.part:
2016.01.02 16:42:47.746 5: MyTestUI: handletemplatefile :./www/TEST/hhztemplateHKFH.part:
2016.01.02 16:42:47.747 4: MyTestUI: done handling include (rec) :./www/TEST/hhztemplateHKFH.part: ok
2016.01.02 16:42:47.865 5: MyTestUI: Request to :/TEST/js/widget_label.js:
2016.01.02 16:42:47.865 5: MyTestUI: handletemplatefile :./www/TEST/js/widget_label.js:
Im screenshot siehst Du das Ergebnis.
Wo kann das Problem liegen?
Danke und ciao
walter
Zitat von: wkarl am 02 Januar 2016, 16:54:25
Hallo Johannes,
bin nochmal Deine Beschreibung durchgegangen, um sicher zu gehen keinen grundlegenden Fehler zu haben. Aber das Ersetzen klappt nicht so.
Ich habe es mir gerade angeschaut:
1) Nur Dateien, die den Teil ".ftui." im Dateinamen enthalten werden als templates behandelt und nur darin werden Ersetzungen durchgeführt. Das hat den Sinn, dass der Aufwand für die Suche nach Ersetzungen nur dann durchgeführt wird, wenn das auch notwenidgt ist.
hhztemplateHKFH.part müsste also besser
hhztemplateHKFH.ftui.part heissen
2) In der Datei hhztemplateHKFH.part müsste statt
ftuikey korrekterweise
ftui-key stehen. Alle FTUISRV Schlüsselworte beginnen mit
<?ftui-
Hallo Johannes,
jetzt funktioniert es, Danke.
Zwei Probleme waren der Grund:
- es muss narürlich ftui-key heissen
- in Deiner Beschreibung beinhaltet der Name der .part Datei kein ftui
Ich nehme mal an, dass sowohl die aufrufende Datei als auch die
.part Datei im Namen ein
ftui haben muss. (nicht getestet, keine Zeit wg Schneeschippen)
ciao walter
Hallo Johannes,
nun habe ich das erste Geschoss fertig basierend auf FTUISRV. Du hast einen Super-Job gemacht. Thumbs up.
Ich hätte gerne Dein Modul als Alternative zu der template-Lösung. Wie bekommen wir das realisiert?
Danke für Deine Arbeit und Geduld.
ciao walter
Hallo Johannes, hallo Walter,
Das hört sich ja gut an. Wenn ich mit meiner FTUI mal fertig bin schau ich mir das sicher auch an.
@Johannes, soll das mal über das normale Fhem-Update mit kommen, oder wo findet man dann DIE aktuelle Version.
Grüße an Euch :D
Klaus
Gute Frage ;)
Die aktuelle Version findet sich in github hier:
https://github.com/viegener/Telegram-fhem/blob/master/ftuisrv/02_FTUISRV.pm (https://github.com/viegener/Telegram-fhem/blob/master/ftuisrv/02_FTUISRV.pm)
Das habe ich jetzt auch mal im ersten Post verlinkt. Wenn es mehr Benutzer gibt, wird es auch in die offizielle Verteilung aufgenommen. momentan muss man es noch manuell installieren.
Hi,
bezugnehmend auf meinen Post:
http://forum.fhem.de/index.php/topic,37378.msg395801.html#msg395801 (http://forum.fhem.de/index.php/topic,37378.msg395801.html#msg395801)
Ich versuche auch gerade das Modul einzubinden aber ich bekomme folgenden Fehler:
Undefined subroutine &main::fileparse called at ./FHEM/02_FTUISRV.pm line 330.
Von wo kommt diese Methode "fileparse"?
Fehlt mir hier noch etwas?
Vielen Dank.
Gruß Daniel.
Hallo Daniel,
Sorry war zwei Tage unterwegs und konnte deshalb nicht antworten. Im github
https://github.com/viegener/Telegram-fhem/blob/master/ftuisrv/02_FTUISRV.pm (https://github.com/viegener/Telegram-fhem/blob/master/ftuisrv/02_FTUISRV.pm)
findet sich eine neue Version. Zur Erklärung, das Problem tritt auf, weil bei Dir ein bestimmtes Modul nicht geladen ist, ich habe jetzt dafür gesorgt, dass das Modul für FTUISRV immer geladen wird. Damit sollte es funktionieren.
Gruss,
Johannes
Hallo Johannes,
danke. Das wars.
Gruß Daniel
Jetzt habe ich aber direkt die nächste Frage:
Bei folgender Definition:
<li data-row="1" data-col="2" data-sizex="2" data-sizey="2">
<header>Esszimmer</header>
<?ftui-inc="thermostat.ftui.part" device="1_01_EZ_Heizungsthermostat" ?>
</li>
<li data-row="1" data-col="4" data-sizex="2" data-sizey="2">
<header>Esszimmer</header>
<?ftui-inc="thermostat.ftui.part" device="1_01_EZ_2_Heizungsthermostat" ?>
</li>
<li data-row="1" data-col="6" data-sizex="2" data-sizey="2">
<header>Wohnzimmer</header>
<?ftui-inc="thermostat.ftui.part" device="1_02_WZ_Heizungsthermostat" ?>
</li>
wird mir nur ein Thermostat angezeigt (Siehe Anhang).
Gibt es noch irgendwas zu berücksichtigen?
Zitat von: dancatt am 23 Januar 2016, 15:32:42
wird mir nur ein Thermostat angezeigt (Siehe Anhang).
Gibt es noch irgendwas zu berücksichtigen?
Eigentlich sollte das so gehen, kann es sein, dass es in der .part-Datei ein problem mit nicht geschlossenen Elementen gibt?
kannst Du die Datei mal hier posten, dann kann ich sie mir anschauen?
Zitat von: viegener am 24 Januar 2016, 02:13:48
Eigentlich sollte das so gehen, kann es sein, dass es in der .part-Datei ein problem mit nicht geschlossenen Elementen gibt?
Das wars. Danke.
Hallo,
ich habe jetzt auch mal FTUISRV ausprobiert und es funktioniert prinzipiell. Wurde diese Frage schon beantwortet:
Zitat von: wkarl am 02 Januar 2016, 16:03:45
Und ne Frage - folgendes Konstrukt wird vermutlich nicht unterstützt?
data-device="<?ftuikey=dev ?>_TC"
??
Bei mir funktioniert nämlich folgendes Konstrukt nicht:
<div data-type="label"
data-device="Proplanta.de"
data-get="fc<?ftui-key=number ?>_tempMax"
data-unit="°C "
class="bottom gigantic inline verticalLine">
</div>
Wenn das nicht ginge, müsste ich nämlich statt einem Parameter fünf übergeben :(
Ronny
Hallo Ronny,
das läuft bei mir ohne Probleme.
ciao walter
Zitat von: wkarl am 25 Januar 2016, 08:47:06
Hallo Ronny,
das läuft bei mir ohne Probleme.
ciao walter
Hast du da vielleicht eine Idee, wo mein Fehler liegen könnte? Hier ein Auszug meiner index.ftui.html:
<li data-row="1" data-col="7" data-sizex="4" data-sizey="2" class="halbTransparent">
<header class="headerTransparent">WETTER</header>
<div data-type="swiper" data-height="220px" data-width="500px" class="top-space-2x left-space-2x transparent">
<ul>
<?ftui-inc="templates/wetter.part" fcnum="fc1" ?>
<?ftui-inc="templates/wetter.part" fcnum="fc1" ?>
<?ftui-inc="templates/wetter.part" fcnum="fc2" ?>
<?ftui-inc="templates/wetter.part" fcnum="fc3" ?>
<?ftui-inc="templates/wetter.part" fcnum="fc4" ?>
<?ftui-inc="templates/wetter.part" fcnum="fc5" ?>
<?ftui-inc="templates/wetter.part" fcnum="fc6" ?>
</ul>
</div>
</li>
und hier die wetter.part:
<li class="transparent">
<div>
<div class="left">
<div data-type="label"
data-device="Proplanta.de"
data-get="<?ftui-key=fcnum ?>_tempMax"
data-unit="°C "
class="bottom gigantic inline verticalLine">
</div>
<div class="inline">
<div data-type="label"
data-device="Proplanta.de"
data-get="<?ftui-key=fcnum ?>_weatherDay"
class="large cell">
</div>
<div data-type="weather"
data-device="Proplanta.de"
data-get="<?ftui-key=fcnum ?>_weatherDay"
class="bigplus thin">
</div>
min:
<div data-type="label"
data-device="Proplanta.de"
data-get="<?ftui-key=fcnum ?>_tempMin"
data-unit="%B0C%0A"
class="inline medium">
</div>
</div>
</div>
<div class="row">
</div>
<div class="left">
<div data-type="label"
data-device="Proplanta.de"
data-get="<?ftui-key=fcnum ?>_date"
data-substitution="toDate().eeee()+','"
class="left large cell darker">
</div>
<div data-type="label"
data-device="Proplanta.de"
data-get="<?ftui-key=fcnum ?>_date"
data-substitution="toDate().ddmm()"
class="left large cell darker">
</div>
</div>
</div>
</li>
Ronny
Hallo,
ich habe die Lösung gefunden: die wetter.part muss wetter.ftui.part heißen...
Eine Frage hätte ich dann noch: Wie kann ich FTUISRV (bzw. HTTPSRV) dazu bringen, nicht immer index.html laden zu wollen? Ich möchte die index.ftui.html als Startseite, er hängt aber immer ein #index.html dran :(
Ronny
Zitat von: RoBra81 am 25 Januar 2016, 09:35:21
Hallo,
ich habe die Lösung gefunden: die wetter.part muss wetter.ftui.part heißen...
Eine Frage hätte ich dann noch: Wie kann ich FTUISRV (bzw. HTTPSRV) dazu bringen, nicht immer index.html laden zu wollen? Ich möchte die index.ftui.html als Startseite, er hängt aber immer ein #index.html dran :(
Ronny
Hat sich auch erledigt, es lag am pagetab...
Ist es auch möglich eine part-Datei in einer anderen part-Datei zu inkludieren?
Zitat von: dancatt am 27 Januar 2016, 13:35:11
Ist es auch möglich eine part-Datei in einer anderen part-Datei zu inkludieren?
Ja, solange es eine part-Datei ist funktioniert das und dabei werden auch die Variablen aus der übergeordneten Datei weitergeleitet, also kann man weitere Variablen hinzufügen und die vorherigen aus der umgebenden Datei auch verwenden.
Zitat von: viegener am 01 Januar 2016, 19:48:20
Aus meiner Sicht schon, da der Zusammenbau auf Server-Seite besser geeignet ist um Probleme mit Javascript bei den dynamischen Ladevorgängen zu vermeiden. Für das Javascript kommt dann wenigstens nur 1 Datei heraus. Ausserdem würde ich gerne immer noch eine Seite dynamisch aufbauen können.
Hallo viegener,
ist es denn irgendwie möglich, Werte aus einem Fhem dummy als Variable einzubinden?
Dann könnte man super eine dynamische Formatierungen in Abhängigkeit von Fhem-Werte machen.
Gruß,
Stefan
Zitat von: Haecksler am 07 Februar 2016, 11:34:26
Hallo viegener,
ist es denn irgendwie möglich, Werte aus einem Fhem dummy als Variable einzubinden?
Dann könnte man super eine dynamische Formatierungen in Abhängigkeit von Fhem-Werte machen.
Gruß,
Stefan
Hallo Stefan,
bisher nicht, wenn Du mir das Szenario genauer beschreibst, kann man das vermutlich machen?
Möchtest Du den Wert eines Readings, nur den State oder auch andere Werte einbeziehen?
Allerdings kann das Servermodul natürlich kein Auffrischen der Seite bei Events/Veränderungen am device machen. Das gehört in diesem Fall wieder ins tablet UI.
Gruss,
Johannes
Hallo Johannes,
habe mir eine Wochenansicht der Heizzeiten (siehe Anhang).
Jetzt würde ich noch gerne den aktuellen Tag von semitransparent auf normal umstellen, um diesen hervorzuheben.
Ich könnte über Fhem ein Reading bereitsstellen welches "semitransparent" enthält oder eben nicht.
Gruß,
Stefan
Zitat von: Haecksler am 08 Februar 2016, 12:32:28
Hallo Johannes,
habe mir eine Wochenansicht der Heizzeiten (siehe Anhang).
Jetzt würde ich noch gerne den aktuellen Tag von semitransparent auf normal umstellen, um diesen hervorzuheben.
Ich könnte über Fhem ein Reading bereitsstellen welches "semitransparent" enthält oder eben nicht.
Gruß,
Stefan
Ich habe mal eine quick and Dirty-Lösung gebaut, die befindet sich in Github:
Darin kann man im Header von ftui-part-Dateien auch device-readings als default werte anfordern:
<?ftui-header="EinHeader dev="MeinDevice" dummy="NormalerWert" fhemwert="[eindevice:einreading]" ?>
Damit wird im folgenden für den key
fhemwert das angebebene Reading eingesetzt (wenn es nicht beim include mit einem anderen Wert überschrieben wurde).
Kannst Du mal probieren ob das Deine Anforderung löst?
(Im Prinzip wären hier sogar beliebige perl statements möglich, denn ich habe einfach Rudi's set-logic hierfür verwendet)
Johannes
Hallo Johannes,
wann wandert denn nun das Modul ins SVN?
Das Modul scheint ja zu laufen bei denen die das im Einsatz haben.
Vielen Dank.
Gruß Daniel
Zitat von: viegener am 09 Februar 2016, 01:27:18
Ich habe mal eine quick and Dirty-Lösung gebaut, die befindet sich in Github:
Darin kann man im Header von ftui-part-Dateien auch device-readings als default werte anfordern:
<?ftui-header="EinHeader dev="MeinDevice" dummy="NormalerWert" fhemwert="[eindevice:einreading]" ?>
Damit wird im folgenden für den key fhemwert das angebebene Reading eingesetzt (wenn es nicht beim include mit einem anderen Wert überschrieben wurde).
Kannst Du mal probieren ob das Deine Anforderung löst?
(Im Prinzip wären hier sogar beliebige perl statements möglich, denn ich habe einfach Rudi's set-logic hierfür verwendet)
Johannes
Danke! Werde ich testen, wird aber wahrscheinlich erst am WE passieren...melde mich wieder.
Gruß, Stefan
Zitat von: dancatt am 09 Februar 2016, 07:07:38
Hallo Johannes,
wann wandert denn nun das Modul ins SVN?
Das Modul scheint ja zu laufen bei denen die das im Einsatz haben.
Vielen Dank.
Gruß Daniel
Hallo Daniel,
das Ziel ist immer noch das in den nächsten Wochen freizugeben, ich wollte die neuen Funktionalitäten aber noch explizit von Leuten mit der neuesten Version getestet haben, bevor ich das an alle freigebe. Eine weitere ist gerade hinzugekommen, siehe unten:
Ich habe gerade ins github eine Version 0.2 gestellt, die neben den bereits oben beschriebenen Änderungen eine Validierung für HTML enthält.
Hintergrund: Für das Tablet UI kann es relativ leicht passieren, dass invalides HTML entsteht, weil Tags nicht korrekt geschlossen werden. Dann kann die Darstellung zwar immer noch richtig aussehen, manche Browser sind dann aber pingeliger als andere und ohne Validierungstools sind solche Fehler auch schwer zu finden.
Es gibt deshalb im FTUISRV zwei Attribute um .htm(l) und .part-Dateien entsprechend on the fly zu prüfen.
validateFiles - schaltet die Prüfung für die Originaldateien ein
ValidateResult - schaltet die Prüdung für das geparste Ergebnis vor Übergabe an den Browser ein (Achtung Zeilennummern ändern sich)
Wenn die Werte auf (1 oder 2) gesetzt sind, kostet das natürlich Performance, wenn es zu langsam wird, kann man die Validierung auch nur temporär nach Umbauten einschalten.
Ausserdem enthält die 0.2 natürlich alle vorherigen Erweiterungen --> Header / default values / device Readings
Wenn ich positive Rückmeldung erhalte, würde ich diese Version auch in SVN überstellen.
Hallo Daniel,
habe nun mal folgendes getestet:
<?ftui-inc="templates/templateheizungTest.ftui.part" par01="HeizungZ1Mo" par02="HeizungZ2Mo" par03="HeizungZ3Mo" par04="HeizungZ4Mo" par05="HeizungAuto1_Montag" Tag="Montag" Layout="[HeizungAuto1_Montag:Layout]" Spalte="3"?>
Template sieht wie folgt aus:
<?ftui-header="TemplateHeizung" par01 par02 par03 par04 par05 Tag Layout Spalte>
<li data-row="2" data-col="<?ftui-key=Spalte ?>" data-sizex="1" data-sizey="4" class="<?ftui-key=Layout ?>">
<header><?ftui-key=Tag ?></header>
<div class="inline"><div data-type="range" data-color="green" data-color-low="green" data-color-high="green" data-device="<?ftui-key=par01 ?>" data-width="20" data-height="350" data-limit-low="8" data-limit-high="16" data-low="ZeitBerechnetMin" data-high="ZeitBerechnetMax" data-min="0" data-max="24" class="top-space left-space narrow"></div><br></div>
<div class="inline"><div data-type="range" data-color="orange" data-color-low="orange" data-color-high="orange" data-device="<?ftui-key=par03 ?>" data-width="20" data-height="350" data-limit-low="8" data-limit-high="16" data-low="ZeitBerechnetMin" data-high="ZeitBerechnetMax" data-min="0" data-max="24" class="top-space narrow nolabels"></div><br></div>
<div data-type="popup" data-draggable="true" data-height="480px" data-width="450px">
<div data-type="label" class="container round padding bg-gray semitransparent cell green">Einstellung<br>Heizzeiten</div>
<div class="dialog">
<header>Einstellung Heizzeiten</header>
<div data-type="label" class="cell">Zeit 1 AN</div>
<div class="inline"><div data-type="spinner" data-device="<?ftui-key=par01 ?>" data-cmd="setreading" data-get="Stunde" data-set="Stunde" data-min="0" data-max="23" data-step="1" data-unit=" h" data-background-color="green" class="valueonly"></div></div>
<div class="inline"><div data-type="spinner" data-device="<?ftui-key=par01 ?>" data-cmd="setreading" data-get="Minute" data-set="Minute" data-min="0" data-max="59" data-step="1" data-unit=" min" data-background-color="green" class="valueonly"></div></div>
<div data-type="label" class="cell">Zeit 1 AUS</div>
<div class="inline"><div data-type="spinner" data-device="<?ftui-key=par02 ?>" data-cmd="setreading" data-get="Stunde" data-set="Stunde" data-min="0" data-max="23" data-step="1" data-unit=" h" data-background-color="blue" class="valueonly"></div></div>
<div class="inline"><div data-type="spinner" data-device="<?ftui-key=par02 ?>" data-cmd="setreading" data-get="Minute" data-set="Minute" data-min="0" data-max="59" data-step="1" data-unit=" min" data-background-color="blue" class="valueonly"></div></div>
<div data-type="label" class="cell"><br><br>Zeit 2 AN</div>
<div class="inline"><div data-type="spinner" data-device="<?ftui-key=par03 ?>" data-cmd="setreading" data-get="Stunde" data-set="Stunde" data-min="0" data-max="23" data-step="1" data-unit=" h" data-background-color="green" class="valueonly"></div></div>
<div class="inline"><div data-type="spinner" data-device="<?ftui-key=par03 ?>" data-cmd="setreading" data-get="Minute" data-set="Minute" data-min="0" data-max="59" data-step="1" data-unit=" min" data-background-color="green" class="valueonly"></div></div>
<div data-type="label" class="cell">Zeit 2 AUS</div>
<div class="inline"><div data-type="spinner" data-device="<?ftui-key=par04 ?>" data-cmd="setreading" data-get="Stunde" data-set="Stunde" data-min="0" data-max="23" data-step="1" data-unit=" h" data-background-color="blue" class="valueonly"></div></div>
<div class="inline"><div data-type="spinner" data-device="<?ftui-key=par04 ?>" data-cmd="setreading" data-get="Minute" data-set="Minute" data-min="0" data-max="59" data-step="1" data-unit=" min" data-background-color="blue" class="valueonly"></div></div>
</div></div>
<div data-type="switch" data-device="<?ftui-key=par05 ?>" data-get="disabled" data-set-on="enable" data-set-off="disable" data-get-off="1" data-get-on="0" data-icon="fa-power-off" data-on-background-color="green" data-doubleclick="1000" style="font-size:250%" class="top-space"></div>
</li>
Der Wert vom Reading "[HeizungAuto1_Montag:Layout]" wird leider bei meiner Umsetzung nicht korrekt geladen.
Habe ich wo einen Denkfehler?
Gruß,
Stefan
Zitat von: Haecksler am 14 Februar 2016, 19:06:11
Der Wert vom Reading "[HeizungAuto1_Montag:Layout]" wird leider bei meiner Umsetzung nicht korrekt geladen.
Habe ich wo einen Denkfehler?
Gruß,
Stefan
Die Ersetzung funktioniert nur innerhalb von ftui-header, also müsstest Du den Inhalt für eine Variable im ftui-header angeben,
Johannes
Zitat von: viegener am 15 Februar 2016, 00:40:16
Die Ersetzung funktioniert nur innerhalb von ftui-header, also müsstest Du den Inhalt für eine Variable im ftui-header angeben,
Johannes
Dachte ich mir fast....habe nun für jeden Tag ein Header-Template erstellt...scheint zu funktionieren siehe Screenshot.
Nun sollte der aktuelle Tag immer grünlich eingefärbt sein.
Gruß,
Stefan
Zitat von: Haecksler am 15 Februar 2016, 21:36:00
Dachte ich mir fast....habe nun für jeden Tag ein Header-Template erstellt...scheint zu funktionieren siehe Screenshot.
Nun sollte der aktuelle Tag immer grünlich eingefärbt sein.
Gruß,
Stefan
Danke Dir für's testen!
Ich habe noch eine Erweiterung gemacht, das auch im ftui-inc tag Readings ersetzen werden. Das macht es vermutlich für manche Szenarien einfacher.
Gruss,
Johannes
Hallo Johannes,
habe nun endlich mal gestest, ob das mit dem ftui-inc tag Readings ersetzen funktioniert.. tut es leider nicht.
Habe erst heute die "02_FTUISRV.pm" aus dem 1 Thread geladen...ist das die richtige?
Es gibt aber auch eine gute Nachricht 02_FTUISRV.pm scheint problemlos mit FTUI 2.2 zulaufen.
Gruß,
Stefan
Zitat von: Haecksler am 25 April 2016, 19:20:52
Hallo Johannes,
habe nun endlich mal gestest, ob das mit dem ftui-inc tag Readings ersetzen funktioniert.. tut es leider nicht.
Habe erst heute die "02_FTUISRV.pm" aus dem 1 Thread geladen...ist das die richtige?
Es gibt aber auch eine gute Nachricht 02_FTUISRV.pm scheint problemlos mit FTUI 2.2 zulaufen.
Gruß,
Stefan
Ich habe diese Version erst jetzt im ersten Beitrag hochgeladen.
Die neueste Version findet sich aber immer in github: https://github.com/viegener/Telegram-fhem/tree/master/ftuisrv (https://github.com/viegener/Telegram-fhem/tree/master/ftuisrv)
OK, dann habe ich auch gleich die letzte Version ins SVN hochgeladen, ab morgen gibt es das Modul über den normalen Update.
Ankündigung hier: https://forum.fhem.de/index.php/topic,52655.0.html (https://forum.fhem.de/index.php/topic,52655.0.html)
Danke für die Info. Fügt das Modul auch ein evtl. fehlendes '/' am Ende an die URL, wie man es normalerweise gewöhnt ist?
Zitat von: setstate am 26 April 2016, 10:04:01
Danke für die Info. Fügt das Modul auch ein evtl. fehlendes '/' am Ende an die URL, wie man es normalerweise gewöhnt ist?
Aber sicher, es verhält sich dabei wie HTTPSRV und die damalige Änderung war ja im Zusammenspiel von FHEMWeb und HTTPSRV. Wenn man keine Dateien mit
.ftui. verwendet sollte es sogar keine Unterschiede geben auch performancetechnisch sollte es dann keinen merklichen Unterschied.
Hallo Johannes,
funktioniert jetzt super.
Danke!
Gruß,
Stefan
Hi Johannes,
Solved - siehe unten
ich habe derzeit ein Problem bei dem ich nicht auf die Lösung komme.
Meine Definition deines Moduls ist:
Internals:
CFGFN
DEF ftui ./www/tablet Tablet-UI
NAME TEC_NTABLETUI
NR 242
STATE TEC_NTABLETUI
TYPE FTUISRV
Fhem:
directory ./www/tablet
friendlyname Tablet-UI
infix ftui
Attributes:
validateFiles 2
validateResult 2
verbose 5
(Ich habe es aber auch schon ohne validateFiles oder validateResult probiert, ändert nichts)
Im Log kommt bei einem Seitenaufruf genau nichts an. Was rufe ich auf?
<hostname>:8083/fhem/tablet/index.ftui.html
Bisher hatte das wunderbar geklappt (etwa eine Woche lang). Auch heute morgen (nach einem update) ging es noch und plötzlich bleiben die Templates unersetzt im Quellcode - ich verstehe das noch nicht ganz.
Wenn ich auf dem FHEMWEB device den verbose level hochdrehe, dann kommt das im Log:
2016.06.08 11:34:08 4: WEB_xxx.xxx.xxx.xxx_57122 GET /fhem/tablet/index.ftui.html; BUFLEN:0
2016.06.08 11:34:08 4: WEB_xxx.xxx.xxx.xxx_57122 => 304 Not Modified
(xxx habe ich ersetzt)
Ich habe nun auch schon mal die definition deines Moduls rausgeworfen und neu erstellt - hilft auch nicht :/ Ich bin irgendwie gerade ratlos, was da los sein könnte.
Stand deines Moduls:
# $Id: 02_FTUISRV.pm 11311 2016-04-25 18:36:16Z viegener $
EDIT: Sorry vergiss es... ich hatte eine redirection von /fhem/ftui/index.html und diese hatte ich aus gewohnheit auf /fhem/table/index.ftui.html gesetzt.... maaaann. Das klappt dann nicht.
Viele Grüße, Uli
Hallo Zusammen,
ich versuche das ganze mit einem Circlemenü ans laufen zu bringen, angezeigt wird es mir aber das Device wird nicht anerkannt...
<div class="right inline middle">
<?ftui-inc="cm.part" dev="rollo_ez"?>
</div>
<?ftui-header="Circlemenu" ?>
<div data-type="circlemenu" class="cell" data-device="<?ftui-key=dev ?>" data-direction="right-half" data-circle-radius="90">
<ul>
<li class="circleborder">
<div data-type="label" data-limits='["0|off","[12]*[0-9]","[34][0-9]","[56][0-9]","[78][0-9]","([90][0-9]|100|on)"]' data-colors='["#FFFFFF","#666666","#999999","#BBBBBB","#DDDDDD","#FFFFFF"]' data-device='<?ftui-key=dev ?>' data-background-icon="fa-wrench">
</div>
</li>
<li><div data-type="push" data-cmd="set" data-device="<?ftui-key=dev ?>" data-set-on="on" data-icon="">auf</div></li>
<li><div data-type="push" data-cmd="set" data-device="<?ftui-key=dev ?>" data-set-on="75" data-icon="">75</div></li>
<li><div data-type="push" data-cmd="set" data-device="<?ftui-key=dev ?>" data-set-on="50" data-icon="">50</div></li>
<li><div data-type="push" data-cmd="set" data-device="<?ftui-key=dev ?>" data-set-on="25" data-icon="">25</div></li>
<li><div data-type="push" data-cmd="set" data-device="<?ftui-key=dev ?>" data-set-on="off" data-icon="">zu</div></li>
</ul>
</div>
Weiß einer woran es liegen kann?
Gruß SamNitro
Edit: Habe es hinbekommen, bei mir fehlte .ftui. in der "part" Datei...
Jetzt hatte ich alles schön abgeändert wie im oben beschrieben, und erst jetzt fallt mir auf, dass das Circlemenü nicht mehr von alleine aktualisiert wenn sich der status z.B. manuell ändert.
Wenn ich das ganze wieder zurück ändere ohne ".ftui." und ohne ".part" wird es wie gewohnt sofort aktualisiert...
Mache ich was falsch oder funktioniert das nicht in diesem Modul?
Edit: habe gerade in der Konsole das hier gefunden:
[Log] Error: (longpoll) ReferenceError: Can't find variable: deviceStates (fhem-tablet-ui.js, line 970, x2)
Zitat von: SamNitro am 28 August 2016, 19:19:13
Edit: Habe es hinbekommen, bei mir fehlte .ftui. in der "part" Datei...
Habe gerade im Eingangspost nochmal die notwendigkeit von .ftui. in Formularen deutlicher gemacht.
Zitat von: SamNitro am 03 September 2016, 13:25:33
Jetzt hatte ich alles schön abgeändert wie im oben beschrieben, und erst jetzt fallt mir auf, dass das Circlemenü nicht mehr von alleine aktualisiert wenn sich der status z.B. manuell ändert.
Wenn ich das ganze wieder zurück ändere ohne ".ftui." und ohne ".part" wird es wie gewohnt sofort aktualisiert...
Mache ich was falsch oder funktioniert das nicht in diesem Modul?
Edit: habe gerade in der Konsole das hier gefunden:
[Log] Error: (longpoll) ReferenceError: Can't find variable: deviceStates (fhem-tablet-ui.js, line 970, x2)
Ich kann mir momentan nicht vorstellen, warum longpoll durch das Modul beeinflusst werden sollte. Ich habe trotzdem mal Deine Teile von oben testweise bei mir laufen und ich kann das Problem nicht nachstellen. Kann es sein, dass irgendwo anders ein Problem in den Dateien ist. Du kannst zum Beispiel mal prüfen, ob das erzeugte HTML korrekt ist (Attribut validateResult).
Die Fehlermeldung sieht eher nach Problemen bei der Initialisierung aus (Ladereihenfolge ?)
Sorry Habe gestern Abend noch getestet und herausgefunden welches Modul den Fehler rein bringt, und zwar verwende ich noch ein WeekdayTimer. sobald ich den entferne oder per Pagetab auf eine andere Seite verschiebe aktualisiert er den status wieder...
"warning: wdtimer does not implement update function"
Hier mal die wdt.ftui.part
<!DOCTYPE html>
<div style=""
data-type="wdtimer"
data-device="<?ftui-key=dev ?>"
data-style="round"
data-theme="dark"
data-title="<?ftui-key=titel ?>"
data-savecfg="true"
data-cmdlist='{"Auf":"100","Zu":"0","10%":"10","20%":"20","30%":"30","40%":"40","50%":"50","60%":"60","70%":"70","80%":"80","90%":"90"}'>
<div data-type="button" class="cell small readonly" data-icon="oa-edit_settings" data-background-icon="fa-square-o"
data-on-color="#505050" data-on-background-color="#505050">
</div>
</div>
und die verlinkung dazu:
<?ftui-inc="wdt.ftui.part" dev="timer_rollo_ez" titel="Timer Rollo Esszimmer"?>
@SamNitro: Ich bin mir nicht sicher,was der Doctype Eintrag hier anrichtet, aber im Part sollte er eigentlich nicht benötigt/enthalten sein. Ansonsten sehe ich nachwievor keinen Zusammenhang zum FTUISRV, wenn die resultierende HTML-Datei nach der Verarbeitung valides HTML ist, dann gibt es inhaltlich keinen Unterschied für das tablet UI. Also schau doch mal, ob Deine Version von wdtimer nicht zur tablet ui Version passt?
https://forum.fhem.de/index.php/topic,48106.msg474273.html#msg474273 (https://forum.fhem.de/index.php/topic,48106.msg474273.html#msg474273)
Danke viegener,
habe die andere Version genommen, obwohl da nur Version 1.0 drin steht und ich 1.6 hatte funktioniert es jetzt wenigstens. Er zeigt aber immer noch den Fehler an, was ich aber in erster Linie ja nicht beachten muss... Ich habe FTUI 2.2eval.
Den Doctype habe ich nur in der part Datei damit mein editor mir das direkt im richtigen format anzeigt und das ganze farblich darstellt, es spielt aber keine rolle ob es enthalten ist oder nicht.
Ich habe gerade eine neue Version von FTUISRV ins SVN hochgeladen, hier sind insbesondere neue Konstrukte für Schleifen (mehrfaches Einfügen eines includes / z.B. für mehrere Devices) und if-else-endif (um Blöcke nur unter bestimmten Bedingungen in die Ausgabe aufzunehmen)
Peeerfekt, danke :D
Habe da aber so zwei kleine Fragen, auf die ich keine Lösung ergoogeln konnte.
Ich verwende Deine Includes um templatebasiert HTML zu erzeugen, klappt auch.
Jetzt habe ich ein Template in dem ich Temperatur und ValvePosition ausgeben möchte, bei normalen HK Reglern funktioniert das über das selbe Device (Heizung_Wohnzimmer_Clima liefert sowohl desired-temp als auch ValvePosition). In anderen Räumen habe ich Wandthermostate, hier möchte ich unterschiedliche Devices (Wandthermostat_Wohnzimmer_Climate für desired-temp und Heizung_Wohnzimmer_Clima für ValvePosition) verwenden.
Ich könnte jetzt einfach zwei Devices übergeben, bin aber von Natur aus faul und würde gerne mit ftui-header den Defaultwert für die zweite Variable auf den Wert der ersten Variable setzen.
Im Prinzip sowas: <?ftui-header="part.raumlabel.temperatur.ftui.html" deviceValve="ftui-key=device"?>
Das funktioniert aber nicht ... geht das an sich nicht oder ist meine Syntax falsch?
Wenn es nicht geht, dann übergebe ich halt überall zwei Parameter an das Template.
Dann würde ich gerne einen Block abhängig davon anzeigen ob eine Variable gesetzt ist oder nicht, also im Prinzip ein
<?ftui-if=(deviceValve.length > 0) ?>.
Das geht aber auch nicht, wahrscheinlich weil ich einfach keine Ahnung habe ;D
Zitat von: rhya am 10 Oktober 2016, 10:24:01
Dann würde ich gerne einen Block abhängig davon anzeigen ob eine Variable gesetzt ist oder nicht, also im Prinzip ein
<?ftui-if=(deviceValve.length > 0) ?>.
Das geht aber auch nicht, wahrscheinlich weil ich einfach keine Ahnung habe ;D
Hier erstmal etwas Hilfe für den Block (if)
<?ftui-if=( [eindummy:state:d] ) ?>
...
<?ftui-endif ?>
<?ftui-if=( {(ReadingsNum("eindummy","state",0) )} ) ?>
...
<?ftui-endif ?>
Also entweder als Zugriff auf Readings (in diesem Fall numerisch), wie im ersten Fall. Oder als perl-expression wie im 2.Fall. Die Syntax innerhalb der runden klammern ist auch in der Command-ref bei
set beschrieben. Wenn das Ergebnis des Ausdrucks einen Wert ungleich 0 ergibt, wird der Block in der Ausgabe enthalten sein.
Das mit dem dynamischen Defaultwert muss ich mir anschauen
Zitat von: rhya am 10 Oktober 2016, 10:24:01
Jetzt habe ich ein Template in dem ich Temperatur und ValvePosition ausgeben möchte, bei normalen HK Reglern funktioniert das über das selbe Device (Heizung_Wohnzimmer_Clima liefert sowohl desired-temp als auch ValvePosition). In anderen Räumen habe ich Wandthermostate, hier möchte ich unterschiedliche Devices (Wandthermostat_Wohnzimmer_Climate für desired-temp und Heizung_Wohnzimmer_Clima für ValvePosition) verwenden.
Ich könnte jetzt einfach zwei Devices übergeben, bin aber von Natur aus faul und würde gerne mit ftui-header den Defaultwert für die zweite Variable auf den Wert der ersten Variable setzen.
Im Prinzip sowas: <?ftui-header="part.raumlabel.temperatur.ftui.html" deviceValve="ftui-key=device"?>
Das funktioniert aber nicht ... geht das an sich nicht oder ist meine Syntax falsch?
Wenn es nicht geht, dann übergebe ich halt überall zwei Parameter an das Template.
Ich habe einen ähnlichen Fall, aber habe es nicht in der Doku beschrieben:
Also man kann auch im Header Variableninhalte verwenden, die ersetzt werden bevor die Variablen zugewiesen werden. Allerdings muss dazu der schliessende Teil
?> durch
?\> ersetzt werden, damit das funktioniert. Also für Dein Beispiel:
<?ftui-header="part.raumlabel.temperatur.ftui.html" deviceValve="<ftui-key=device ?\>" ?>
Übrigens: Deine Texte wären durch die Verwendung von Code-Tags leichter lesbar
Huhu und vielen Dank für Dein Feedback. Das mit den Code-Tags versuche ich mir mal anzugewöhnen, bin noch recht neu hier und an sich nicht sehr aktiv in Foren.
Das Problem mit den "variablen Variablen" konnte ich tatsächlich mit
<?ftui-header="part.heizung.ftui.html" deviceValve="<?ftui-key=device ?\>" ?>
lösen. Besten Dank für den Tipp.
Mein IF funktioniert nun ebenfalls mit
<?ftui-if=( {( ReadingsNum("<?ftui-key=deviceValve ?>","ValvePosition", 0) > 30 )} ) ?>
Manmanman, so früh am Morgen und schon zwei Sachen erledigt. Der Wahnsinn :)
edit:
Habe außerdem mit folgendem Code
<?ftui-if=( {(length('<?ftui-key=cssfile ?>') > 0 )} ) ?>
abgeprüft ob eine Variable überhaupt gefüllt ist um davon abhängig etwas zu tun oder zu lassen ;)
Hallo viegener,
gestern über das Modul gestolpert. Genau das hatte ich gesucht. Funktioniert einwandfrei. Top!
Nutze FTUI 2.4.
Was mir aufgefallen ist eine andere Darstellung/Handling des Video widgets. Nutze das ganze mit video.js zum stream abspielen und nun wird der Play Button richtig dargestellt was mit dem Standard server nicht der Fall ist.
Gruß
Eisix
Zitat von: Eisix am 13 Januar 2017, 17:59:26
Hallo viegener,
gestern über das Modul gestolpert. Genau das hatte ich gesucht. Funktioniert einwandfrei. Top!
Nutze FTUI 2.4.
Was mir aufgefallen ist eine andere Darstellung/Handling des Video widgets. Nutze das ganze mit video.js zum stream abspielen und nun wird der Play Button richtig dargestellt was mit dem Standard server nicht der Fall ist.
Gruß
Eisix
Schön das es geht!
Verstehe ich das richtig, dass mit FTUISRV der Button funktioniert, der mit HTTPSRV nicht funktioniert?
Hallo,
habe gerade nochmal getestet und bin zurück zu HTTPSRV.
Hänge mal den Code an dann versteht man besser was ich meine.
<!DOCTYPE html>
<html>
<head>
<link href="node_modules/video.js/dist/alt/video-js-cdn.css" rel="stylesheet">
<script src="node_modules/video.js/dist/video.js"></script>
<script src="node_modules/videojs-contrib-hls.js/node_modules/videojs-contrib-hls/dist/videojs-contrib-hls.js"></script>
</head>
<body>
<header>Kamera1</header>
<video id="my-video" class="video-js" controls preload="auto" width="345" height="200"
poster="http_link/live/snapshot_720.jpg" data-setup="{}">
<source src="http_link/live/files/medium/index.m3u8" type='application/x-mpegURL'>
</video>
</body>
</html>
Damit spiele ich den livestream direkt von Netatmo Kameras ab. Mit HTTPSRV funktioniert das nur mit Fully und Safari, allerdings werden die controls des Players nicht so angezeigt wie sie normalerweise sein sollten nach video-js doku.
Mit FTUISRV funktioniert es auch mit Chrome und Firefox und die controls werden Korrekt angezeigt.
Somit scheint FTUISRV näher am Standard zu sein, zumindest im Video bereich ;).
Gruß
Eisix
Zitat von: Eisix am 13 Januar 2017, 21:57:03
Hallo,
habe gerade nochmal getestet und bin zurück zu HTTPSRV.
Hänge mal den Code an dann versteht man besser was ich meine.
<!DOCTYPE html>
<html>
<head>
<link href="node_modules/video.js/dist/alt/video-js-cdn.css" rel="stylesheet">
<script src="node_modules/video.js/dist/video.js"></script>
<script src="node_modules/videojs-contrib-hls.js/node_modules/videojs-contrib-hls/dist/videojs-contrib-hls.js"></script>
</head>
<body>
<header>Kamera1</header>
<video id="my-video" class="video-js" controls preload="auto" width="345" height="200"
poster="http_link/live/snapshot_720.jpg" data-setup="{}">
<source src="http_link/live/files/medium/index.m3u8" type='application/x-mpegURL'>
</video>
</body>
</html>
Damit spiele ich den livestream direkt von Netatmo Kameras ab. Mit HTTPSRV funktioniert das nur mit Fully und Safari, allerdings werden die controls des Players nicht so angezeigt wie sie normalerweise sein sollten nach video-js doku.
Mit FTUISRV funktioniert es auch mit Chrome und Firefox und die controls werden Korrekt angezeigt.
Somit scheint FTUISRV näher am Standard zu sein, zumindest im Video bereich ;).
Gruß
Eisix
So sehr mir das gefallen würde, aber da FTUISRV vom Grundsatz ein HTTPSRV ist (nur mit zusätzlichen Möglichkeiten) und die iegentlich Abhandlung des http_protokolls sowieso im FHEMWEB liegt muss der Unterschied irgendwo anders liegen (bei Firefox vielleicht caching)?
Hallo,
bin davon ausgegangen das FTUISRV auf HTTPSRV aufbaut deshalb war ich auch so erstaunt über das unterschiedliche Verhalten. Vielleicht hast du durch deine Erweiterungen einen kleinen Bug in HTTPSRV gefixt, ich weiss es nicht.
Wie auch immer, ich habe ein anderes Problem. Ich möchte die data-limits für die Temperaturanzeige dynamisch anpassen. Also eine Berechnung mit der übergebenen Variablen durchführen.
<?ftui-header="Thermostat" EINSCHALTTEMP STELLMOTOR SENSOR LOG MIN="<?ftui-key=EINSCHALTTEMP ?>-3" MED="<?ftui-key=EINSCHALTTEMP ?>-1" MAX="<?ftui-key=EINSCHALTTEMP ?>+2" ?>
Geht das und wenn wie?
Gruß
Eisix
Ja das geht, denn Du kannst ja set-logik verwenden und damit auch Perl-Befehle aufrufen oder direkt perl-code ausführen, ich habe zum Beispiel im Header eine Funktion, die den Aliasnamen eines Devices berechnet:
<?ftui-header="TempHum vertical" thdev thformat thalias="{(getAliasName( '<?ftui-key=thdev ?\>' ) )}" thtemp="temperature" showlabel=0 ?>
Hallo,
finde den Fehler! :)
Im ernst kann mal jemand drüber schauen wo meine Fehler liegen.
Header ftui.html
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" language="JavaScript">
function calcLIMITS (TEMPERATUR, OFFSET)
{
var LIMIT = (TEMPERATUR - (OFFSET));
return LIMIT;
}
</script>
</head>
<body>
Anfang Part file
<?ftui-header="Thermostat" EINSCHALTTEMP STELLMOTOR SENSOR LOG LIMITMIN="{(calcLIMITS('<?ftui-key=EINSCHALTTEMP ?\>',"-3"))}" LIMITMED="{(calcLIMITS('<?ftui-key=EINSCHALTTEMP ?\>',"-1"))}" LIMITMAX="{(calcLIMITS('<?ftui-key=EINSCHALTTEMP ?\>',"1"))}" ?>
<div class="container">
<div class="top">
<div data-type="spinner"
data-device="<?ftui-key=EINSCHALTTEMP ?>"
data-icon-left-color="blue"
data-icon-right-color="red"
data-step="0.5"
data-min="10"
data-max="30"
data-unit="°"
data-height="100%"
class="valueonly col-4-5"
data-text-color="<?ftui-key=STELLMOTOR ?>:stateColor"
></div>
</div>
<div class="cell inline">
<div data-type="popup" data-width="450px" data-height="310px" class="">
<div data-type="label"
data-device="<?ftui-key=SENSOR ?>"
data-get="temperature"
data-limits='[<?ftui-key=LIMITMIN ?>,<?ftui-key=LIMITMED ?>,<?ftui-key=LIMITMAX ?>]'
data-colors='["#6699FF","#21a000","#bb6242"]'
data-unit="%B0C%0A"
class="cell big thick"
data-part="1"
></div>
Funktioniert so nicht ist was an der Übergabe der zwei Werte falsch?
Gruß
Eisix
Zitat von: Eisix am 20 Januar 2017, 15:52:10
Hallo,
finde den Fehler! :)
Im ernst kann mal jemand drüber schauen wo meine Fehler liegen.
Der Fehler ist einfach, Du versuchst aus perl eine Javascript-Funktion aufzurufen, der Teil im FTUI-Header wird in FHEM ausgeführt und es geht wie oben geschrieben um perl-code nicht um JS im HTML-File
Kannst du mir deine Funktion getAliasName als Beispiel schicken. Vielleicht verstehe ich es dann.
Gruß
Eisix
Zitat von: Eisix am 25 Januar 2017, 18:16:38
Kannst du mir deine Funktion getAliasName als Beispiel schicken. Vielleicht verstehe ich es dann.
Gruß
Eisix
Klar die Funktion findest Du unten.
Zur Erklärung nochmal, die FTUISRV-Elemente werden innerhalb auf FHEM ausgeführt und müssen deshalb in FHEM funktionieren also wie Code in myutils aufgebaut sein.
Du hast eine Javascript Funktion in Deinem Code, die läuft im Browser aber eben nicht in FHEM.
Das Konzept ist genauso wie in PHP, da wird der Code auch auf dem Server ausgeführt:
##############################################
# get alias if set or device name
sub getAliasName($) {
my ($sdev) = @_;
my $name = AttrVal( $sdev, "alias", $sdev );
return $name
}
Die Funktion steht bei mir übrigens auch in myutils
Hallo viegener,
dein Satz
Zitat
ich habe zum Beispiel im Header eine Funktion, die den Aliasnamen eines Devices berechnet:
hat mich auf die falsche Bahn gebracht. Du rufst im Header eine Funktion auf und ich dachte die steht im Header.
myutilitys
##############################################
# Temperature offset for Thermostat spinner
##############################################
sub calcLIMITS($$)
{
my ($TEMPERATUR, $OFFSET) = @_;
my $LIMIT = $TEMPERATUR + ($OFFSET);
return $LIMIT;
}
Funktioniert jetzt. Danke.
Gruß
Eisix
Hallo zusammen,
ich bekomme es nicht hin, eine übergebene Variable (hier: icon) an eine weitere part-Datei durchzureichen. Kleines Beispiel zur Erläuterung hier:
<!-- subpage.ftui.part aufrufen, um einen Titel auszugeben und einen Pagebutton zu erzeugen: -->
<?ftui-inc = "subpage.ftui.part" title="Telefon" icon="fa-phone" ?>
subpage.ftui.part
<?ftui-header="subpage" title icon ?>
<div class="medium"><?ftui-key=title?></div> <!-- Titel ausgeben -->
<?ftui-inc = "pagebutton.ftui.part" icon=<?ftui-key=icon ?> url="eineSite.html" ?>
... ...
Ist der obige Ausdruck icon=<?ftui-key=icon ?> richtig?? Ich fürchte nein...
pagebutton.ftui.part
<?ftui-header = "pagebutton" icon url ?>
<div class="pagebutton"
data-icon = "<?ftui-key=icon ?>"
data-url = "<?ftui-key=url ?>"
... ...
</div>
Irgendwie stehe ich gerade auf dem Schlauch. ::)
Danke euch vorab für eure Hilfe!
Sieht so aus, als hätte ich die Ursache gefunden -> der FTUISRV-Code ist offenbar sehr kritisch!
Bei Zuweisungen darf kein Blank vor oder nach dem Gleichheitszeichen stehen!
Im Gegensatz dazu muss vor jedem abschließenden Tag ?> ein Leezeichen stehen.
@Viegener: Siehst du eine Chance, das mit vertretbarem Aufwand zu ändern bzw anzupassen?
@DocCyber: Nein das ist machbar, ich habe mal eine neue Version ins update gestellt, sollte morgen verfügbar sein. An vilen Stellen werden Leerzeichen jetzt akzeptiert und überlesen am Ende muss keines mehr vor dem ? sein. Es wird sicher nicht vollständig tolerant gegenüber fehlenden / zusätzlichen Trennzeichen sein.
Ausserdem ist das neue Attribut templatefile hinzugekommen um Dateien auch ohne .ftui. als templatefiles behandeln zu lassen.
Zitat von: viegener am 08 Februar 2017, 22:17:57
... ich habe mal eine neue Version ins update gestellt, sollte morgen verfügbar sein.
Super - danke!! :)
Hallo zusammen,
Mit ftui-if habe ich Folgendes probiert, aber das Ergebnis ist falsch:
Aufruf:
<?ftui-inc="test.ftui.part" color="blue" ?>
test.ftui.part
<?ftui-header="test" color ?>
<?ftui-if=( <?ftui-key=color ?> eq "red" ) ?>
Richtig
<?ftui-else ?>
Falsch, das ist nicht rot!
<?ftui-endif ?>
Ausgabe: Richtig
Funktioniert das ftui-if - Statement nicht beim Vergleich mit übergebenen Variablen, also mit ftui-key ?? Oder ist der Vergleichsoperator eq hier nicht korrekt?
Doch die Variablenersetzung wird gemacht, aber der Ausdruck wird nicht als perl-Ausdruck evaluiert.
Wenn Du den if so schreibst, müsste es gehen:
<?ftui-if=( {( "<?ftui-key=color ?>" eq "red" )} ) ?>
Dadurch wird der Ausdruck in Perl evaluiert und es kommt entweder 1 oder 0 heraus und dann geht der if auch
Ich gebe zu, dass das in der Doku nicht sehr ausführlich formuliert ist, das ändere ich.
Vielleicht macht es auch Sinn einen ftui-ifeval einzuführen, der den Ausdruck nochmals in Perl evaluiert.
@viegener:
Ja, so geht es!
Danke. :)
Da es durch Veränderungen in FHEM zu Warnungen in fhem.pl kommt
Use of uninitialized value $v in substitution (s///) at fhem.pl line 1061.
Use of uninitialized value $v in concatenation (.) or string at fhem.pl line 1062.
habe ich eine Korrektur an FTUISRV vorgenommen und in SVN eingecheckt, damit diese Warnung nicht entsteht -> kommt mit dem nächsten update
Hallo zusammen,
kann mir jemand sagen, was sich hinter "ftui-loopinc" verbirgt. Ich habe die ref gelesen, aber ehrlich gesagt ist mein Englisch nicht so das Wahre.
Ich möchte einen swiper-widget mit mehreren Rollladen Buttons bauen, wenn in diesem Raum mehrere Rollladen vorhanden sind. Kann ich mit "ftui-loopinc" so eine Liste bauen ?
Die einfachste Erklärung ftui-loopinc ist so ähnlich wie ftui-inc allerdings wird die Datei mehrfach eingebunden. Dazu wird als erste Parameter eine Liste von Werten (z.B. eine Liste von Devicenamen) übergeben.
Beispiel:
<?ftui-loopinc="temphuml.ftui.part" thdev=(list room=TEMP:FILTER=TYPE=LaCrosse) showdes="0" showlabel="1" ?>
Hier wird für jeden device, auf den die Filterkriterien aus dem list-Befehl passen, der Inhalt von temphuml.ftui.part im Ergebnis enthalten sein. Wobei der Inhalt von thdev jeweils einen Wert aus der Liste der Devices annimmt. Die anderen Parameter bleiben wie angegeben.
Ok. Danke.
So ganz bin ich da aber noch nicht durchgestiegen. Konkret möchte ich einen swiper aufbauen, wenn es in meinem Raum mehrere Rollläden gibt. Die <?ftui-if ... <?ftui-endif ?> klappt schon wunderbar. Hier werte ein ein vorhandenes reading aus
<?ftui-if=( {(ReadingsNum("Auto_Roll_Config_du","Anzahl_Roll_<?ftui-key=raum ?>", 1) > 1 )} ) ?>
<div data-type="swiper" data-height="540px" data-width="720px" class="top-space navbuttons nopagination">
<ul>
<li>
<?ftui-endif ?>
Nun möchte ich noch , dass für alle devices mit dem subType "blind" und dem userAttr "Raumname" = "Wohnzimmer" die Datei xy.ftui.part eingefügt wird.
Geht das ?
@derHeimwerker:
- Der erste Schritt ist ein list-Befehl in FHEM, der genau Deine Devices ausgibt
- Statt thdev muss da vermutlich der Parameter stehen, der in xy.ftui.part verwendet wird
- Dann nimmst Du mein Beispiel von oben fügst Deinen FHEM-List Befehl da ein wo der Beispiel list-Befehl steht und xy.ftui.part setzt Du für temphuml.ftui.part ein
- Im hinteren Teil musst Du dann noch die anderen Parameter anpassen (oder entfernen) - also showdes und showlabel - aber das kommt eben auf den Inhalt von xy.ftui.part an
Hallo FHEMisten,
nochmal eine Frage bzgl. Schleife mit ftui-loopinc
Ich würde es sehr gern verwenden, um dynamisch eine Art Tabelle aufzubauen.
Angenommen, ich hätte mehrere Dummy-Devices namens auto_1, auto_2, auto_3, ...auto_n.
Jeder Dummy hat nun bspw. ein Reading namens colours, das eine Liste mehrerer Farben farbe_1, farbe_2, ... farbe_m enthält.
Meine Wunschtabelle in FTUI soll dann etwa so aussehen:
+-----------------------------------------------------------+
| auto_1 |
+-----------------------------------------------------------+
| farbe_1 | farbe_2 | farbe_3 | farbe_4 | farbe_5 |
+===========================================================+
| auto_2 | | | | | |
+-----------------------------------------------------------+
| farbe_1 | farbe_2 | | | | |
+===========================================================+
| auto_3 | | | | |
+-----------------------------------------------------------+
| farbe_1 | farbe_2 | farbe_3 | farbe_4 | |
+===========================================================+
| ... |
+-----------------------------------------------------------+
| ... |
Das Abrufen der Dummys ist mir klar.
Aber wie kann ich mit loopinc über die einzelnen Listenelemente, also z.B. auto_2:colours, iterieren?
Geht das überhaupt?
Danke für eure Hilfe!
@DocCyber: Du kannst für die Schelife ja alle Möglichkeiten von FHEM-Kommandos verwenden. Hier kann auch ein Perlbefehl stehen.
<?ftui-loopinc="test.ftui.part" value=({ return "abc\ndef\nghi"; }) ?>
Hier wird das innere Skript mit den drei Werten "abc", "def" und "ghi" aufgerufen
Zitat von: viegener am 07 September 2017, 23:59:50
... Hier kann auch ein Perlbefehl stehen.
Ach so...! Das probiere ich aus!
Vielen Dank für deine Antwort!
@viegener
Hallo,
aktuell kämpfe ich ein wenig mit den stockenden FTUI-Updates, so dass ich gezwungen bin, immer mehr eigene Modulstände vorzuhalten. Um diese ohne viel Aufwand parallel zum offiziellen Stand halten und gleichzeitig leicht zum Einsatz bringen zu können, habe ich mir überlegt, dass ich eine Einschleusstelle bräuchte, an der die offiziellen Module quasi ausgetauscht werden.
Bei den Umsetzszenarien bin ich zufällig über dieses Modul "gestolpert" und sehe es als äußerst naheliegenden Platz für meine angedachte Lösungsmöglichkeit.
Ich würde gerne ein neues Attribut filenameMap einführen, in dem man Paare von Modulen festhalten kann. Jedes Paar enthält dabei das eigentlich angefragte Modul und das stattdessen auszuliefernde Modul.
Siehst Du Möglichkeiten, eine derartige Funktionalität - (höchstwahrscheinlich) von mir programmiert - offiziell in Dein Modul zu übernehmen?
@OdfFhem: Generell kann ich mir das vorstellen, ich kann das auch nachvollziehen, habe deshalb auf manchen Instanzen meine FTUI-Dateien eingefroren
Um das zu realisieren würde mir aber noch etwas mehr Info fehlen. Was steht genau in filenamemap und wie ist das gewünschte Verhalten.
Beispielfragen
- Nur feste Namen ersetzen oder auch teilnamen/muster
- Nur Datei oder auch Pfadbestandteile
- Nur bei URLanfragen oder soll auch in Dateien etwas ersetzt werden
...
@viegener
Ich habe das versuchsweise schon mal umgesetzt; die Änderungen waren eigentlich sehr überschaubar:
- AttrList um
filenameMap:textField-long erweitert
- FTUISRV_Attr um das Handling für
filenameMap erweitert
- unmittelbar vor Zeile 317 Aufruf der neuen Routine
FTUISRV_filenameMap- neue Routine
FTUISRV_filenameMap ( $hash, $filename ) integriert
Zum Test nutze ich derzeit folgende Attribut-Definition:
attr myFTUISRV filenameMap js/widget_knob.js:js/widget_knob_3rd.js js/widget_label.js:js/widget_label_3rd.js
Es ist also quasi eine Endlosliste von $filename-Paaren (relativer URL-Anteil - bezogen auf infix).
- Nach jetziger Einschätzung reicht es vollkommen aus, sich auf URL-Anfragen zu beschränken
- In Dateien muss aus Sicht von filenameMap nichts ersetzt werden, da der Inhalt der neuen Datei ja unter dem alten Namen ausgeliefert wird. Es ist also nicht notwendig, in Dateien diesbezüglich etwas zu ersetzen.
- Momentan enthält filenameMap feste Namen; bin auch nicht sicher, ob es Bedarf für z.B. reguläre Ausdrücke gibt.
@viegener
Es war niemals meine Absicht und hoffe natürlich auch, dass kein falscher Eindruck entstanden ist: Ich muss für die endgültige Lösung nicht selbst programmieren. Ich habe lediglich für eigene Experimente zunächst einmal eine Q&D-Programmierung vorgenommen - einfach um zu sehen, ob die Idee umgesetzt werden kann.
Für mich ist ausschließlich interessant, dass eine nützlliche Funktionalität an zentraler/passender Stelle untergebracht wird.
Besteht noch Hoffnung für eine Realisierung in Deinem Modul?
Hallo zusammen
Das FTUISRV-Modul finde ich hervorragend und ich nutze es sehr intensiv.
Allerdings stoße ich bei der Übergabe eines Daten-Arrays (wie z.B. data-items für das select-Widget) auf ein Problem:
Das Array wird nicht (korrekt) übergeben.
Ohne FTUISRV ist dies der korrekte Code:
data-type="select" data-device="wbsettings" data-items='["0","1"]' data-alias='["aus","ein"]' data-get="automode" data-set="automode" data-cmd="setreading"
Mein Aufruf mit FTUISRV sieht dann so aus:
<?ftui-inc="_settings.ftui.part" dtype="select" ddevice="wbsettings" dget="automode" dset="automode" dcmd="setreading" ditems='["0","1"]' dalias='["aus","ein"]' ?>
_settings.ftui.part sieht so aus:
<?ftui-header="_settings" dtype ddevice dget dset dcmd ditems dalias ?>
<div data-type='<?ftui-key=dtype ?>'
data-device='<?ftui-key=ddevice ?>'
data-get='<?ftui-key=dget ?>'
data-set='<?ftui-key=dset ?>'
data-cmd='<?ftui-key=dcmd ?>'
data-items='<?ftui-key=ditems ?>'
data-alias='<?ftui-key=dalias ?>' >
</div>
Ich habe schon mit single Quotes(') und double Quotes(") experimentiert, aber egal wie ich es auch versuche:
Die Ersetzung liefert bei data-items stets ein leere Zeichenkette...
Kann mir hier jemand weiterhelfen?
Wie lautet der korrekte Aufruf? Oder geht's nicht? :o
Wie gesagt: bei anderen Widgets habe ich keine Problem, aber mit dem Daten-Array klappt es nicht