Habe mir mal den Spaß gemacht das hier auszuprobieren:
defmod di_timer DOIF (["$SELF:Timer"]) { ## Änderung am wiget\
if ("$EVENT"=~/^Timer (.*)\|(.*)\|(.*)$/) {\
fhem "setreading $SELF Timer $1|$2|$3";;\
fhem "setreading $SELF T_day $1";;\
fhem "setreading $SELF T_time $2";;\
fhem "setreading $SELF T_mode $3";;\
}\
}\
DOELSEIF (["$SELF:^T_"]) ## Änderung an Readings\
(setreading $SELF Timer [$SELF:T_day]|[$SELF:T_time]|[$SELF:T_mode])\
DOELSEIF ([[$SELF:T_time]|[$SELF:T_day]] and [?$SELF:T_mode] eq "enabled") ## Timerdefinition\
(set bla on)\
attr di_timer do always
attr di_timer setList Timer:uzsuTimerEntry
attr di_timer state [$SELF:Timer]
attr di_timer wait 0.1
attr di_timer webCmd Timer
Ich musste es allerdings kurz mit wait verzögern, da offenbar FHEM in zweiter Rekursion das Setzen des Timers verhindert.
Edit: Ich habe etwas aufgeräumt
da hab ich ja was angerichtet - jetzt kriegt er auch noch nen kindlichen spieltrieb *bg*
nö, im ernst ... das macht schon was her. und schon killed man wieder einen nicht mehr benötigten dummy mehr.
und es läuft --> guckst du anhang
Zitat von: the ratman am 24 März 2017, 18:18:33
da hab ich ja was angerichtet - jetzt kriegt er auch noch nen kindlichen spieltrieb *bg*
nö, im ernst ... das macht schon was her. und schon killed man wieder einen nicht mehr benötigten dummy mehr.
und es läuft --> guckst du anhang
und der Trick ist, dass man im Gegensatz zu einer dummy-Lösung von außen die Readings mit "setreading di_timer time/day/time_mode" setzen kann und der Timer wird korrekt gesetzt und die Ansicht aktualisiert.
naja, bei mir setzt er time_mode richtig mit "setreading DOIF_Timer time_mode disabled"
aber der button und alles andere bleibt wieder auf enabled *g*
hatte das auch gleich probieren müssen und mich erst mal gefreut ...
Zitat von: the ratman am 24 März 2017, 18:43:35
naja, bei mir setzt er time_mode richtig mit "setreading DOIF_Timer time_mode disabled"
aber der button und alles andere bleibt wieder auf enabled *g*
hatte das auch gleich probieren müssen und mich erst mal gefreut ...
Das Ding hat wohl seine eigenen Zustände, an die man vermutlich nicht dran kommt. Kann man überhaupt die Auswahl-Zeiten anpassen?
Besser fände ich einzelne wiget-Elemente, die an ein Reading gekoppelt wären z. B. eine Auswahlbox zum ankreuzen (hier für Wochentage). Ich sehe schon, ich werde mir das Thema "DOIF-gerechte wigets" auch noch vornehmen müssen :)
gäbs ja sogar --> https://forum.fhem.de/index.php/topic,32660.0.html
hab das meiste ausprobiert und rennt. ich glaub der radiobutton-widget wollte nicht bei mir, der rest war aber o.k.
sehr interessieren könnte dich da auch der datetime.https://forum.fhem.de/index.php/topic,35736.0.html der poppt dir im inline-modus ne datums- und zeitauswahl auf.
beispiele siehe anhang ...
allerdings würd ich mir, wenn ich du wäre und das ganze einbinden wollen würde, das ganze genauer ansehen.
ich denke, die widgets waren irgendwann mal ein schnellschuß. teilweise wirds echt unbrauchbar - siehe z.b. die regler für den rgb colorpicker. der mag nicht immer machen, was er soll.
ja, aber die Dinger erzeugen nach meinem Verständnis "nur" Ereignisse und lassen sich von außen wohl nicht setzen. Sinnvoll finde ich eben eine Kopplung an etwas (z. B. ein Reading), wenn man das setzt, soll der Zustand automatisch im wiget übernommen werden, ohne jedes mal sich selbst kümmern zu müssen.
Wenn ich was anpacken würde, dann müsste es universell sein und nicht nur für eine uzsu gut sein.
ich würd in dem fall eher auch an verschönern und den waf denken *g*
was du willst, is mir klar. allerdings - wie geschrieben - würd ich mir da lieber was eigenes basteln.
vielleicht findet man ja wenigstens fertigs java-zeugs dafür im netz
Zitat von: the ratman am 24 März 2017, 20:39:06
ich würd in dem fall eher auch an verschönern und den waf denken *g*
was du willst, is mir klar. allerdings - wie geschrieben - würd ich mir da lieber was eigenes basteln. ich trau den widgets nicht so wirklich.
was ich aber glaube gelesen zu haben, das die tablet-ui leute diese widgets nur in ihre verzeichnisse schieben müssen. nachdem die sicher besser gewartet wären ... vielleicht kann man die ganzen tabletui-widgets für uns mißbrauchen?
Klar, deswegen habe ich mich da immer rausgehalten, das Einzige, was ich bisher aus Not gemacht habe, ist das column-Attribut in fhemweb. Es gibt sicherlich schon zig Lösungen zu dem Thema, die alle ihre Vor- und Nachteile haben.
ich wette, dir wird was einfallen.
der weg - zumindest für leute wie mich ohne programmierkenntnisse - war ja schon ab dem doif der richtige.
es ist so ne erleichterung, nicht 1oo at's, notifys und dummys verwenden zu müssen ...
wie bei jedem anderen fhemweb widget wird auch bei den uzsu widgets der dargestellte status angepasst/übernommen wenn man das zugehörige reading von außen setzt. egal ob dummy oder doif.
das einzige problem mit den uzsu widgets ist der style der noch nicht in fhemweb integriert ist. d.h. man muss ihn sich selber auf der jQuery seite generieren damit es so wie im ersten post ausschaut.
Zitat von: justme1968 am 24 März 2017, 21:01:23
wie bei jedem anderen fhemweb widget wird auch bei den uzsu widgets der dargestellte status angepasst/übernommen wenn man das zugehörige reading von außen setzt. egal ob dummy oder doif.
Dann stimmt da was nicht, wenn man in dem Bespiel aus dem erst Posts das Reading time_mode auf enabled setzt wird der Status des DOIF-Moduls entsprechend durch die state-Definition angepasst, aber das wiget interessiert sich nicht dafür und bleibt im alten Zustand.
und im event monitor ist das zugehörige event zu sehen ?
Zitat von: justme1968 am 24 März 2017, 21:19:41
und im event monitor ist das zugehörige event zu sehen ?
Events (Filter: di_timer.*) FHEM log ResetCreate/Modify Device
2017-03-24 21:21:20.002 DOIF di_timer time_mode: enabled
2017-03-24 21:21:20.002 DOIF di_timer Di,Do,So|02:00|enabled
ich würde ja sagen
das ist kein event auf ein reading mit namen Timer sondern für state. in setList und webCmd verwendest du aber Timer als reding und kommando namen.
wenn das reading in state landet muss auch setList und webCmd auf state konfiguriert werden. das ist allgemein in fhemweb so:
- damit die longpoll aktualisierung im frontend funktioniert muss das reading für das eine setList oder ein widgetOverride konfiguriert wird gleiche sein wie das reading des events.
- damit beim seiten aufbau das widget den aktuellen wert anzeigt muss das kommando den gleichen namen haben wie das reading
das ist bei allen widgets so. egal ob slider, dropdown, uzsu, ...
ps: ich kann das beispiel von oben nicht probieren weil ich das hier bekomme:reload 98_DOIF.pm
Global symbol "$lastWarningMsg" requires explicit package name at ./FHEM/98_DOIF.pm line 1088.
Global symbol "$lastWarningMsg" requires explicit package name at ./FHEM/98_DOIF.pm line 1095.
Global symbol "$lastWarningMsg" requires explicit package name at ./FHEM/98_DOIF.pm line 1096.
Global symbol "$lastWarningMsg" requires explicit package name at ./FHEM/98_DOIF.pm line 1097.
Global symbol "$lastWarningMsg" requires explicit package name at ./FHEM/98_DOIF.pm line 1101.
Zitat von: justme1968 am 24 März 2017, 21:32:03
das ist kein event auf ein reading mit namen Timer sondern für state. in setList und webCmd verwendest du aber Timer als reding und kommando namen.
OK. Ich habe das Beispiel angepasst, jetzt funktioniert´s. Allerdings ist der Code mit Kanonen auf Spatzen. Man merkt, dass DOIF dafür noch nicht gut angepasst ist.
P.S. Du verwendest nicht die aktuelle fhem.pl
Ich habe das Beispiel im ersten Post etwas aufgeräumt und minimal kommentiert.
Ich habe die Namensgebung vereinheitlicht. Die heißen jetzt T_time, T_day, T_mode. Die sollten angelegt werden sobald du das wiget bedient hast.
habs grad nochmal probiert - mysteriös
dein original funzt, benennt man es aber um, geht nix mehr. (rename di_timer DOIF_Timer)
müssen name und das reading "device" zusammen passen?
nachtrag:
hab ich recht
zurückbenennen des doif, schon geht wieder alles - sowas hat ich auch noch nie (rename DOIF_Timer di_timer)
Zitat von: the ratman am 25 März 2017, 16:08:21
habs grad nochmal probiert - mysteriös
dein original funzt, benennt man es aber um, geht nix mehr. (rename di_timer DOIF_Timer)
müssen name und das reading "device" zusammen passen?
nachtrag:
hab ich recht
zurückbenennen des doif, schon geht wieder alles - sowas hat ich auch noch nie (rename DOIF_Timer di_timer)
Durch die $SELF-Angaben ist wohl zum Teil noch der alte Name drin. Einmal über DEF in die Definition gehen und mit modify bestätigen, dann sollte alles wieder sauber initialisiert sein.
warscheinlich bist eh schon drüber gestolpert, aber wenn nicht:
der "neue" knob http://anthonyterrien.com/demo/knob/ - schau dir mal die demos an.
und nachdem der zum unsrigen kompatibel sein soll und der jetzige schon brav von aussen daten frisst, scheint mir der arbeitssaufwand für progger nicht grade groß ...
und vom selben onkel ... DAS wär sicher brauchbar http://anthonyterrien.com/demo/kontrol/
ich stell mir diesen "eq" grad wieder umgedreht als echt-anzeige bestimmter daten vor - das muß fetzen! *g*
ah, sorry nachtrag - hier saugbar: https://github.com/aterrien/jQuery-Kontrol
Zitat von: the ratman am 26 März 2017, 12:00:03
warscheinlich bist eh schon drüber gestolpert, aber wenn nicht:
der "neue" knob http://anthonyterrien.com/demo/knob/ - schau dir mal die demos an.
und nachdem der zum unsrigen kompatibel sein soll und der jetzige schon brav von aussen daten frisst, scheint mir der arbeitssaufwand für progger nicht grade groß ...
und vom selben onkel ... DAS wär sicher brauchbar http://anthonyterrien.com/demo/kontrol/
ich stell mir diesen "eq" grad wieder umgedreht als echt-anzeige bestimmter daten vor - das muß fetzen! *g*
ah, sorry nachtrag - hier saugbar: https://github.com/aterrien/jQuery-Kontrol
ja, ist was für die Zukunft, erst mal sind andere Dinge auf der DOIF-todo-Liste und es gibt noch eine Welt außer FHEM ;)
Zitates gibt noch eine Welt außer FHEM
LÜGENPRESSE !
Zitat von: Damian am 24 März 2017, 17:37:54
Habe mir mal den Spaß gemacht das hier auszuprobieren:
defmod di_timer DOIF (["$SELF:Timer"]) { ## Änderung am wiget\
if ("$EVENT"=~/^Timer (.*)\|(.*)\|(.*)$/) {\
fhem "setreading $SELF Timer $1|$2|$3";;\
fhem "setreading $SELF T_day $1";;\
fhem "setreading $SELF T_time $2";;\
fhem "setreading $SELF T_mode $3";;\
}\
}\
DOELSEIF (["$SELF:^T_"]) ## Änderung an Readings\
(setreading $SELF Timer [$SELF:T_day]|[$SELF:T_time]|[$SELF:T_mode])\
DOELSEIF ([[$SELF:T_time]|[$SELF:T_day]] and [?$SELF:T_mode] eq "enabled") ## Timerdefinition\
(set bla on)\
attr di_timer do always
attr di_timer setList Timer:uzsuTimerEntry
attr di_timer state [$SELF:Timer]
attr di_timer wait 0.1
attr di_timer webCmd Timer
Ich musste es allerdings kurz mit wait verzögern, da offenbar FHEM in zweiter Rekursion das Setzen des Timers verhindert.
Edit: Ich habe etwas aufgeräumt
Hallo Damian,
vielen Dank für die Inspiration.
Ich bin nämlich auf der Suche nach einer Möglichkeit eine Wochentagsauswahl durchzuführen.
Da ich auch sonst mit DOIF arbeite, dachte ich, wäre dies genau richtig.
Allerdings funktioniert dein Beispiel nicht, bzw. weiß ich nicht, wie das Beispiel anpassen muß, damit es keinen Fehler generiert.
Weiterhin habe ich die Frage, ob man nur volle Stunden eingeben kann, oder ob auch Minuten gehen?
Vielen Dank und bis denn
SouzA
Und gibt es eine Möglichkeit die Minuten
Die "Inspiration" ist mit drei Jahre schon etwas angestaubt. :D
Es fehlte in der Definition ein Doppelpunkt. Es muss heißen:
Zitatif ("$EVENT"=~/^Timer: (.*)\|(.*)\|(.*)$/) {\
Zitat von: Damian am 27 Juni 2020, 09:32:34
Die "Inspiration" ist mit drei Jahre schon etwas angestaubt. :D
Es fehlte in der Definition ein Doppelpunkt. Es muss heißen:
Vielen Dank für deine Antwort...
Aber:
Ich bin zu doof für deine Inspiration.
Internals:
CFGFN
DEF (["$SELF:Timer"])
{ ## Änderung am wiget
if ("$EVENT"=~/^Timer: (.*)\|(.*)\|(.*)$/)
{
fhem "setreading $SELF Timer $1|$2|$3";;
fhem "setreading $SELF T_day $1";;
fhem "setreading $SELF T_time $2";;
fhem "setreading $SELF T_mode $3";;
}
}
DOELSEIF
(["$SELF:^T_"]) ## Änderung an Readings
(setreading $SELF Timer [$SELF:T_day]|[$SELF:T_time]|[$SELF:T_mode])
DOELSEIF
([[$SELF:T_time]|[$SELF:T_day]] and [?$SELF:T_mode] eq "enabled") ## Timerdefinition
(set bla on)
DOIFDEV ^global$|di_Wochentag|^di_Wochentag$
FUUID 5ef70290-f33f-7c83-21e3-2cf7ba61386d1b77
MODEL FHEM
NAME di_Wochentag
NR 60618
NTFY_ORDER 50-di_Wochentag
STATE
TYPE DOIF
VERSION 22195 2020-06-18 16:38:55
READINGS:
2020-06-27 10:36:39 cmd 1
2020-06-27 10:36:39 cmd_event di_Wochentag
2020-06-27 10:36:39 cmd_nr 1
2020-06-27 10:36:28 mode enabled
2020-06-27 10:36:39 state
2020-06-27 10:36:28 timer_01_c03 error: Wrong timespec : either HH:MM:SS or {perlcode}
2020-06-27 10:36:39 wait_timer no timer
Regex:
STATE:
di_Wochentag:
STATE:
Timer ^di_Wochentag$:^Timer:
accu:
cond:
:
0:
"di_Wochentag:Timer" di_Wochentag:Timer
1:
"di_Wochentag:^T_" di_Wochentag:^T_
itimer:
di_Wochentag:
itimer:
T_time ^di_Wochentag$:^T_time:
attr:
cmdState:
wait:
0:
0.1
waitdel:
condition:
0 ::EventDoIf('di_Wochentag',$hash,'Timer',0)
1 ::EventDoIf('di_Wochentag',$hash,'^T_',0)
2 ::DOIF_time_once($hash,0,$wday,"[di_Wochentag:T_day]") and ::ReadingValDoIf($hash,'di_Wochentag','T_mode') eq "enabled"
days:
0 [di_Wochentag:T_day]
do:
0:
0 { if ("$EVENT"=~/^Timer: (.*)\|(.*)\|(.*)$/) { fhem "setreading di_Wochentag Timer $1|$2|$3";; fhem "setreading di_Wochentag T_day $1";; fhem "setreading di_Wochentag T_time $2";; fhem "setreading di_Wochentag T_mode $3";; } }
1:
0 setreading di_Wochentag Timer [di_Wochentag:T_day]|[di_Wochentag:T_time]|[di_Wochentag:T_mode]
2:
0 set bla on
3:
helper:
DEVFILTER ^global$|di_Wochentag|^di_Wochentag$
NOTIFYDEV global|.*di_Wochentag.*|di_Wochentag
event Timer ,|null|enabled
globalinit 1
last_timer 1
sleepdevice di_Wochentag
sleepsubtimer -1
sleeptimer -1
timerdev di_Wochentag
timerevent Timer ,|null|enabled
triggerDev di_Wochentag
timerevents:
Timer ,|null|enabled
wait_timer: 27.06.2020 10:36:39 cmd_1 di_Wochentag
timereventsState:
Timer ,|null|enabled
wait_timer: 27.06.2020 10:36:39 cmd_1 di_Wochentag
triggerEvents:
Timer ,|null|enabled
wait_timer: 27.06.2020 10:36:39 cmd_1 di_Wochentag
triggerEventsState:
Timer ,|null|enabled
wait_timer: 27.06.2020 10:36:39 cmd_1 di_Wochentag
internals:
localtime:
readings:
time:
0 [di_Wochentag:T_time]
timeCond:
0 2
timer:
0 0
timers:
2 0
trigger:
uiState:
uiTable:
Attributes:
do always
setList Timer:uzsuTimerEntry
state [$SELF:Timer]
wait 0.1
webCmd Timer
ergibt
timer_01_c03
error: Wrong timespec : either HH:MM:SS or {perlcode}
Die Buttons können gedrückt werden, bleiben aber nicht aktiv. Enabled bleibt auch nicht aktiv.
Oder habe ich grundlegend etwas falsch verstanden und man kann
nur mit diesem Code
keinen Wochenplaner machen?
Thx und bis denn
SouzA
Die Sache mit dem Doppelpunkt habe ich eingebaut als ich noch das Attribut readingList gesetzt hatte, das war aber überflüssig.
Es liegt am uzsuTimerEntry-Widget.
Solange du keine Zeit auswählst, kommt bei Zeit null und dann funktioniert es nicht.
hier also meine funktionierende Lösung ohne Doppelpunkt und ohne readingList wie im ersten Post mit ausgewählter Zeit:
defmod di_timer DOIF (["$SELF:Timer"]) { ## Änderung am wiget\
if ("$EVENT"=~/^Timer (.*)\|(.*)\|(.*)$/) {\
fhem "setreading $SELF Timer $1|$2|$3";;\
fhem "setreading $SELF T_day $1";;\
fhem "setreading $SELF T_time $2";;\
fhem "setreading $SELF T_mode $3";;\
}\
}\
DOELSEIF (["$SELF:^T_"]) ## Änderung an Readings\
(setreading $SELF Timer [$SELF:T_day]|[$SELF:T_time]|[$SELF:T_mode])\
DOELSEIF ([[$SELF:T_time]|[$SELF:T_day]] and [?$SELF:T_mode] eq "enabled") ## Timerdefinition\
(set bla on)\
attr di_timer do always
attr di_timer setList Timer:uzsuTimerEntry
attr di_timer state [$SELF:Timer]
attr di_timer wait 0.1
attr di_timer webCmd Timer
setstate di_timer Mi,Sa|04:00|disabled
setstate di_timer 2020-06-27 10:50:45 T_day Mi,Sa
setstate di_timer 2020-06-27 10:50:45 T_mode disabled
setstate di_timer 2020-06-27 10:50:45 T_time 04:00
setstate di_timer 2020-06-27 10:50:45 Timer Mi,Sa|04:00|disabled
setstate di_timer 2020-06-27 10:50:45 cmd 1
Hi,
danke, das funktioniert ja schonmal super.
Hast du eine Ahnung, wie man jetzt noch Minuten einstellen könnte?
Thx und bis denn
SouzA
Edit: oder ohne Zeit im DOIF. Die Zeit kann man zur Not ja über nen Dummy extern machen...
Ich werde demnächst diverse Anwendungsbeispiele zur Steuerung und Visualisierung über uiTable veröffentlichen.