Textfelder und Klapmenüs

Begonnen von Elektrolurch, 06 August 2013, 15:22:17

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo,
nachdem ich erst vor einigen wenigen Wochen angefangen habe, ist jetzt doch schon eine Menge perl-Code zusammengekommen - und es funktioniert auch alles. Nun gehts nach dem ersten Bauabschnitt zur Verschönerung. Einen slider fürs Dimmen habe ich schon gefunden, bzw. den nutze ich auch fürs Einstellen der Zeit eines Treppenhauslichtautomaten. Aber was ich partout nicht finden kann, sind Klappmenüs für einzelne Objekte und/oder Textfelder  fürs Setzen von Werten. Ich denke, dass es so etwas geben muss... aber wo sind die in der Commandref beschrieben?

Elektrolurch
configDB und Windows befreite Zone!

UliM

Hi,
schau mal nach setList.
Gruß, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Tobias

zeig mal den Slider (und den downloadlink) ;)
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Elektrolurch

@Tobias: hier der Code
attr Mz_Deckenfluter eventMap /on:ein/off:aus/
attr Mz_Deckenfluter group Beleuchtung
attr Mz_Deckenfluter model fs20di
attr Mz_Deckenfluter room MarinasZimmer
attr Mz_Deckenfluter setList dim:slider,0,6.25,100
attr Mz_Deckenfluter webCmd ein:dim:aus

# die zwei letzten Zeilen hätte ich ganz gerne einmal softwaretechn. von jemanden ordentlich erklärt bekommen. Sie funktionieren, aber ich verstehe nicht warum. Da hilft auch keine CommandRef.

@Uli:
Also, in der akt. CommandRef kommt setList genau zweimal vor:

Zitat:
The first specified command is looked up in the "set device ?" list (see the setList attribute for dummy devices). If there it contains some known modifiers (colon, followed by a comma separated list), then a different widget will be displayed:
▪if the modifier is ":time", then a javascript driven timepicker is displayed.
▪if the modifier is of the form ":slider,<min>,<step>,<max>", then a javascript driven slider is displayed
▪else a dropdown with all the modifier values is displayed
If the command is state, then the value will be used as a command.
Examples for the modifier:
define d1 dummy
attr d1 webCmd state
attr d1 setList state:on,off
define d2 dummy
attr d2 webCmd state
attr d2 setList state:slider,0,1,10
define d3 dummy
attr d3 webCmd state
attr d3 setList state:time
Note: this is an attribute for the displayed device, not for the FHEMWEB instance.



Der Hinweis auf das drop-down Menü ist etwas versteckt. Auch muss man wohl erst einmal wissen, dass wohl in jedem device auch ein dummy steckt oder verstehe ich dann den Hinweis nicht richtig?
Das steht leider auch nirgendswo richtig erklärt.

Und wie bekommt man ein Textfeld für eine freie Eingabe?

Elektrolurch


configDB und Windows befreite Zone!

justme1968

Zitatattr Mz_Deckenfluter setList dim:slider,0,6.25,100
damit sagst du das das kommando dim mit einem slider dargestellt wird der werte von 0 bis 100 in stufen von 6.25 annehmen kann.

Zitatattr Mz_Deckenfluter webCmd ein:dim:aus
damit sagst du das in der raum übersicht für das device die kommandos ein, dim und aus dargestellt werden sollen und dim wie oben definiert dargestellt werden soll.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo,
das ist mir schon klar. Aber die Übersetzung auf Programmebene verstehe ich nicht.
dim
+ Java Script für den Slider müssen ja auf den Wert zusammen zu: " "dim 65" (z.B.) zusammengeführt werden, damit dann in webCmd die Sequenz off:dim:on zu der Sequenz off:dim 65:on ersetzt wird. Das ist leider nirgends wo richtig erklärt. Steckt da eine $_, die in der CommandRef nicht dokumentiert ist?
Ich möchte eigentlich folgendes machen: <off> <slider für dimmer> <on> <schlummer> <klappmenü für Zeit für den ramp-down>
Um so etwas zu realisieren, möchte ich gerne die Mechanismen dahinter verstehen.
Wäre das z.B. so: setList schlummer rampdown 00:05:00,rampdown 00:10:00,rampdown 00:20:00
 -> das müsste ja ein Klappmenü ergeben, da mit Komma getrennt.

und dannn:
webCmd off:dim:on:schlummer

?
Dann sollte ja bei Schlummer ein Klappmenü erscheinen. Mit den Zeiten ist natürlich noch etwas Useranfrendly. Da müsste im Menü so etwas stehen: "Schlummern 15 Minuten".

Elektrolurch
configDB und Windows befreite Zone!

justme1968

also dein menü bekommst du wenn du rampdown in der setList als rampdown:05,10,20 angibst und dann bei webCmd nur rampdown.

vor dem doppelpunkt steht das kommando und danach die möglichen werte mit komma getrennt.

das set wird dann aus dem kommando und dem wert zusammen gebaut.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo,

leider kommt da kein Menü, sondern nur ein Link für das "Schlummern", der dann in "ramp-aus-time" übersetzt wird.
Beleuchtung
Deckenfluter
ramp-aus-time
ein
0
aus
schlummern

Da wo die 0 ist, ist der slider fürs dimmen. Das geht alles.
Code:
attr Mz_Deckenfluter alias Deckenfluter
attr Mz_Deckenfluter eventMap /on:ein/off:aus/ramp-off-time:schlummern/
attr Mz_Deckenfluter group Beleuchtung
attr Mz_Deckenfluter model fs20di
attr Mz_Deckenfluter room MarinasZimmer
attr Mz_Deckenfluter setList schlummern:05,10,20
attr Mz_Deckenfluter webCmd ein:dim:aus:schlummern


Elektrolurch

configDB und Windows befreite Zone!

justme1968

bitte nimm mal statt schlummern direkt ramp-off-time in der setList und im webCmd bzw versuch es erst mal ohne die eventMap.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,
so hatte ich es natürlich auch zuerst gemacht: statt schlummern -> ramp-off-time.
Aber da gab es statt des Klappmenüs, wie es ja mit der Def. im setList und den Komma getrennten Werten hätte erscheinen müssen, nur einen Link "ramp-off-time". Wenn man den drückte, dann wurde der Status durch das eventmapping off:aus in "ramp-aus-time" übersetzt und angezeigt. Die Lampe macht da nichts, da es ja keine Zeitangabe gibt.
Daher habe ich das mapping von schlummern nach ramp-off-time definiert, wenn mann jetzt "schlummern" klickt, wird der Status mit "ramp-aus-time" angezeigt, quasi zweimal übersetzt. fhem bringt keine Fehlermeldung. Das würde es ja machen, wenn man ein unbekanntes Kommando an eine fs20 senden wollte.
Also:
1. Warum kein Klappmenü, obwohl es eine Werteliste für setList gibt?
2. Schönheitsfehler: Wie kriegt man das hin, dass der Status richtig angezeigt wird?

Elektrolurch
configDB und Windows befreite Zone!

justme1968

setList gibt es nur für dummys. du versuchts aber glaube ich gerade es für ein 'echtes' fs20 device zu verwenden.

ich fürchte das was du möchtest geht zur zeit so nicht weil du die liste der kommandos die ein device bereit stellt nicht ändern kannst. das geht nur bei einem dummy den du ja selbst unter kontrolle hast.

mir fällt jetzt nur ein einen dummy zu bauen der alles macht was du möchtest und den per notify an das echte device zu koppeln.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Jusme,

aber attr setList dim:Slider...
und attr webCmd aus:dim:ein
funktioniert doch für eine fs20.
Und das Kommando "ramp-off-time" gibt es doch auch für eine fs20.
Also, warum geht es für dim mit slider? Die erste Frage war ja: Warum kommt mit setList ramp-off-time:05,10,20 kein Klappmenü? Das hat doch zunächst einmal nichts mit der fs20 zu tun.

Elektrolurch
configDB und Windows befreite Zone!

justme1968

dein setList geht schon schief. wenn du suchst wirst du einen fehler dafür finden.

das dim geht deshalb weil das fs20fi device dim selber schon mit einem slider definiert.

gib mal 'set Mz_Deckenfluter ?' ein diese liste ist die die du bei den webCmd verwenden kannst. nicht mehr.

bei einem dummy baust du sozusagen genau diese liste mit dem setList selber zusammen. das geht aber nur für dummys.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

Unknown argument ?, choose one of dim06% dim100% dim12% dim18% dim25% dim31% dim37% dim43% dim50% dim56% dim62% dim68% dim75% dim81% dim87% dim93% dimdown dimup dimupdown off off-for-timer on on-100-for-timer-prev on-for-timer on-old-for-timer on-old-for-timer-prev on-till ramp-off-time ramp-on-time reset sendstate timer toggle dim:slider,0,6.25,100 blink intervals off-till

Da gibt's doch ramp-off-time. Warum sollte ich das nicht in einer webCmd verwenden können?
Mit setList möchte ich ja nur noch den Zeitwert dahinter hängen. Wie das mit dem "dim" und dem slider auch geht.
Ich sehe da nicht, wo da die Einschränkung liegen soll

Elektrolurch
configDB und Windows befreite Zone!

justme1968

du kannst diese liste nicht verändern! der modulautor bestimmt was es für kommandos gibt und du kannst es nicht änderen.

nur bei dummys kannst du die liste selber bestimmen und das machst du mit setList. das geht aber NUR bei dummys.

das dim geht weil es der modulautor schon so vorgesehen hat. in der dritten zeile steht dim:slider,0,6.25,100.

ramp-off-time steht in der liste ohne zusätzliche parameter. du kannst keine anängen. du kannst es natürlich als teil von webCmd verwenden. aber nicht so wie du es möchtest als menü sondern nur z.b. so: attr <device> eventMap /ramp-off-time 05:aus-05/ramp-off-time 10:aus-10/ramp-off-time 20:aus-20
attr <device> webCmd aus-05:aus-10:aus-20
also nicht als menü sondern nur als direkten link.

das menü geht nur wenn es der modulautor so vorgesehen hat. oder beim dummy. da bist du sozusagen selber autor.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

justme1968

schau mal hier: Link. vielleicht findet sich eine lösung.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

das funktioniert, allerdings mit einem kleinen Schönheitsfehler.
Lampe aus, dann sieht des so aus:
Deckenfluter  aus ein <slider für dim> 10 aus <Klappmenü> 05 set
Das Klappmenü enthält die drei Werte.
Wählt man einen aus, z.B. 20,  und drückt set, dann siehts so aus:
Deckenfluter ramp-aus-time 20 ein <slider> 20 aus <Klappmenü> 05 set
Schönheitsfehler: Der Status "ramp-off-time 20" wird durch das eventMapping zu "ramp-aus-time 20" und merkwürdigerweise nimmt der Slider für den Dimmer auch den Wert 20 an.
Ergänzung: Der Befehl "ramp-off-time" startet nicht das dim-down, sondern setzt nur die Zeit für die Rampe. Daher wird der Status "ramp-off-time" auch nur einmal nach dem Setzen angezeigt und nicht mehr, wenn die rampe durch einmaliges Drücken der aus-Taste gestartet wird. ok. Passt also so.

Schön wäre es noch, wenn man einen Webcode vor das Klappmenü setzen könnte, wie z.B. <Schlummerzeit in sek.>, da habe ich aber nichts gefunden.
Auch denke ich daran, so etwas für die desired-temperature in Räumen zu verwenden. Vmtl. kommt man aber dann nicht um einen dummy herum....???

Code:
attr Mz_Deckenfluter eventMap /on:ein/off:aus/ramp-off-time:ramp-off-time:10,60,600,1800/
attr Mz_Deckenfluter group Beleuchtung
attr Mz_Deckenfluter model fs20di
attr Mz_Deckenfluter room MarinasZimmer
attr Mz_Deckenfluter webCmd ein:dim:aus:ramp-off-time

Gruß

Elektrolurch


configDB und Windows befreite Zone!

justme1968

für textfelder habe ich eben hier: Link eine implementierung gepostet.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

danke, dass Du da an mich gedacht hast. Bin leider erst heute dazu gekommen, es einzubauen.
Das Textfeld erscheint auch und ich kann da einen Wert eingeben. Der landet aber nicht im state von dem dummy:


define Abwesend_bis dummy
attr Abwesend_bis alias Abwesend bis
attr Abwesend_bis group Automatik
attr Abwesend_bis room Automation
attr Abwesend_bis setList text:textField  Eingabefeld
attr Abwesend_bis webCmd text:Eingabefeld

der state ist:
   STATE      Eingabefeld
Leider verstehe ich auch nicht so ganz Dein Beispiel.
Kannst Du mir da mal auf die Sprünge helfen?

Danke

Elektrolurch
configDB und Windows befreite Zone!

justme1968

wenn du willst das es in state landet musst du es auch angeben. du hast text angegeben dann ladet es in einem reading text.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

text in state umgewandelt.
setList state:textField

webCmd state

Jetzt bekommt state aber gar keinen Wert....

Elektrolurch
configDB und Windows befreite Zone!

justme1968

define Abwesend_bis dummy
attr Abwesend_bis alias Abwesend bis
attr Abwesend_bis group Automatik
attr Abwesend_bis room Automation
attr Abwesend_bis setList state:textField
attr Abwesend_bis webCmd state

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

genauso hatte ich es ja schon abgeändert:
setList state:textField
webCmd state

Klappt aber nicht, Ergenis ist:

(Spalte1( Abwesend bis
(Spalte 2) textField
(Spalte 3( state: <textField> "textField" steht im Textfeld. Gebe ich etwas ein, z.B. ein Datum und bestätige das mit <Return>, dann wird die Seite neu aufgebaut, aber es steht da immer noch "textField".
Strange.

Elektrolurch

state:textField
configDB und Windows befreite Zone!

justme1968

drück mal nicht return sondern klicke nach der eingabe mal irgendwo anders auf der seite.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

mit Klicken klappts. Klicken ist aber (s.u.) nicht so mein Ding, brauche die Tastatur. Kann man das auch irgendwie mit der Eingabetaste abschliessen?

Abwesend bis
15.12.2014
state:15.12.2014
Und wie krige ich das "state:" noch weg? Bisserl unschön, für den unbedarften User.

Elektrolurch
configDB und Windows befreite Zone!

justme1968

das es mit return nicht geht schaue ich mir an. eventuell liegt das auch am browser.

nimm statt state ein 'richtiges' reading. da kannst du dir auch einen sprechenden namen überlgen. z.b. Datum.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

dann wären wir ja wieder bei dem reading "text" (bzw. dann "Datum", was gut klingt).
ok.
Dann muss ich aber mal nachfragen, wie ich das darstelle:
Bislang habe ich da für die Abwesenheits-Steuerung der Heizung zwei dummys definiert:
Abwesend mit Klappmenü und Werten: Nein,Party,Urlaub
Abwesend_bis: für Datum und/oder Uhrzeit

Beide stelle ich in einer Group dar.

Wenn ich jetzt auf Abwesend_bis verzichte und stattdessen ein reading (Datum) in Abwesend anlege, wie kann ich das denn dann darstellen?
setLis zweimal definieren geht ja nicht.
und webCMD müsste ja einmal für "state" und einmal für "Datum" sein.

So was habe ich auch im Forum noch nicht gesehen.
Oder brauche ich doch zwei dummys?

Elektrolurch
configDB und Windows befreite Zone!

justme1968

du brauchst nur einen dummy mit zwei readings. sobald der wert gesetzt wird wird ganz normal ein event erzeugt wie  bei allen anderen readings auch. schau mal im envent viewer oder mit inform timer. da kannst du dich per notify dran hängen. wenn du den wert abfragen willst geht es auch wie bei jedem anderen reading mit ReadingsVal(...).

setList definierst du ein einziges ma mit state und mit datuml:define Abwesend dummy
attr Abwesend setList state:Nein,Pary,Urlaub Datum:textField
attr Abwesend webCmd state:Datum

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

super, klappt. Da kann ich mir noch ein paar dummys sparen und ev. das noch dynamisch machen, d.h. wenn bspw. "Abwesend" von "Nein" auf etwas anders geht, in dem notify für state dann erst das webCMD von "state" auf "state:Datum" setzen und vice-versa. Müsste doch gehen?

Ich hatte schon mal versucht, bei einem FS20 Dimmer mehrere Kommandos (slider und Klappmenü) in eine Zeile zu schreiben, da die aber wohl beide auf "state" gehen, klappte das wohl nicht.
Nochmals danke für die Hilfe.

Elektrolurch
configDB und Windows befreite Zone!

Elektrolurch

Hallo Andre,

zum textField habe ich noch eine Frage:
Jetzt habe ich ein shutdown -. restart durchgeführt und bekomme folgende Fehlermeldung bzgl. des Textfeldes:

reload: Error:Modul 99_myUtils deactivated:
 Global symbol "$FW_ME" requires explicit package name at FHEM/FW_textField.pm line 23, <$fh> line 6.
Compilation failed in require at ./FHEM/99_myUtils.pm line 9, <$fh> line 6.
BEGIN failed--compilation aborted at ./FHEM/99_myUtils.pm line 9, <$fh> line 6.



Die FW_textField habe ich am 21.9. ins FHEM - Verzeichnis kopiert.
In der 99_myutils sthet am Anfang:

use FritzBoxUtils;
use FW_textField;


und in der
sub
myUtils_Initialize($$)
{

...
$data{webCmdFn}{textField}="FW_textFieldFN";

...

Kein update zwischendurch...

Eine Idee?

Elektrolurch
 
configDB und Windows befreite Zone!

justme1968

mach mal ein update. inzwischen hat rudi die textfelder ganz normal mit eingecheckt. d.h. du kannst das FW_textField.pm löschen und alles was du selber an initialisierung hast auch wieder entfernen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

dass das notify für die Kombi state und textField nicht mehr kam, war strange.
Ich habe einen zweiten identischen dummy zu Abwesend angelegt und da gings. Dann habe ich den "Abwesend" gelöscht und den zweiten dummy in "Abwesend" umbenannt.
Und jetzt läuft es.
Aber mir ist noch aufgefallen, dass das Textfeld das "+" Zeichen verschluckt. Wollte da zwei Eingabemöglichkeiten für das Urlaubsende zulassen: einmal mit +Tage und andernfalls mit absolutem Datum.
Frage jetzt mit split ab, wieviel Zahlengruppen da sind, bei einer Zahl ist es die Anzahl der zu addierenden Tage, bei zwei oder drei das Datum.
Dabei ist mir noch aufgefallen, wenn ich aus dem zu addirenden TAg das Endedatum errechne und es mit setreading in das Textfeld zurückschreibe, dass der Bildschirm nicht automatisch aktualisiert wird.
Beim set - Befehl wird sofort der neue Wert angezeigt, aber das Datum ist ja ein userreading und ich kann es ja nur mit setreading schreiben. Workaround?

Gruß


Elektrolurch

configDB und Windows befreite Zone!

justme1968

das + verschwindet weil irgendjemand denkt das ist eine zahl und positive vorzeichen werden weggelassen. ich hab aber auf die schnelle keine idee wie man das ändern kann.

eigentlich sollte das textfeld auch aktualisiert werden wenn du den wert per setreading änderst. ich habe das gerade bei mir probiert und es geht.

hat du longpoll aktiv?

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

es war auf meiner todo-Liste leider nach hinten gerutscht. Das mit dem Fokus vom den textField klappt noch nicht so ganz.
Insbesondere wenn ich fhem vom Nokia-Handy aufrufe:
1. Navigiere mit den Pfeiltasten zum Textfeld
2. klicke hinein und gebe in der erscheinenden Box den Text ein, z.B. das Urlaubsende für den Abwesendheitsschalter.
3. Bestätige die Eingabe, auf dem Scrreen steht auch das Datum im Textfeld.
4. Wenn ich dann auf den dahinter stehenden Link "set" klicke, wird das alte Datum, was da mal vorher stand, verarbeitet.

Am PC, z.B. mit Firefox, wird der eingegebene Inhalt im Textfeld beim Klicken an einer anderen Bildschirmstelle übernommen, wie z.B. auf den "set" - Link.
Jetzt ist es so, dass auf dem Nokia - Handy auf allen Webseiten die o.g. Texteingabe immer funktioniert, nur nicht im "textField".
Könntest Du ev. noch mal das mit dem Fokus Dir anschauen? Wäre nett....

Gruß


Elektrolurch
configDB und Windows befreite Zone!