Hallo,
irgendwie stecke ich fest, ich habe mir ein Unterprogramm gebaut mit dem mein Wifilight RGBW LED Streifen, wenn er eingeschaltet wird, langsam durchs Farbspektrum läuft, das klappt auch.
Allerdings wird das Programm natürlich nur einmal durchlaufen. Setze ich DOIF auf "do always" läuft das Programm zwar dauernd durch, allerdings auch dann, wenn ich den LED Streifen ausschalte.
Das Unterprogramm ist eine Aneinanderreihung von mehreren "for"-Schleifen.
Mein DOIF sieht so aus:
Zitat([wz.theke] eq "on")
{spektralDurchlauf();}
Wie kann ich das Problem lösen, ich habe mich jetzt schon durch's halbe Internet gelesen, aber irgendwie stehe ich heftigst auf dem Schlauch.
Möglicherweise ist DOIF ja auch gar nicht der richtige Ansatz.
Vielleicht kann mir jemand einen Schubser in die richtige Richtung geben.
gm
Poste mal list von deinem DOIF-Device.
Here it comes:
Internals:
DEF ([wz.theke] eq "on")
{
spektralDurchlauf();
}
FUUID 5c49b404-f33f-f310-d32a-adc91a1a7ec816d3
MODEL FHEM
NAME wz.theke_spektral_lauf
NR 209
NTFY_ORDER 50-wz.theke_spektral_lauf
STATE cmd_1
TYPE DOIF
READINGS:
2019-01-24 19:46:52 Device wz.theke
2019-01-24 18:24:56 cmd 1
2019-01-24 18:24:56 cmd_event wz.theke
2019-01-24 18:24:56 cmd_nr 1
2019-01-24 19:46:52 e_wz.theke_STATE on
2019-01-24 18:21:59 last_cmd cmd_1
2019-01-24 18:24:46 mode enabled
2019-01-24 18:24:56 state cmd_1
Regex:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::InternalDoIf($hash,'wz.theke','STATE') eq "on"
devices:
0 wz.theke
all wz.theke
do:
0:
0 { spektralDurchlauf(); }
1:
helper:
event programm: colorchange 100
globalinit 1
last_timer 0
sleeptimer -1
timerdev wz.theke
timerevent programm: colorchange 100
triggerDev wz.theke
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: wz.theke
state: cmd_1
timerevents:
programm: colorchange 100
timereventsState:
programm: colorchange 100
triggerEvents:
programm: colorchange 100
triggerEventsState:
programm: colorchange 100
internals:
0 wz.theke:STATE
all wz.theke:STATE
itimer:
perlblock:
readings:
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
group Licht
Also, nach dieser Definition kann er im cmd_2-Fall nichts ausführen, weil nichts definiert ist. Und cmd_1 wird nur ausgeführt, wenn die Bedingung wahr ist, das ist so sicher wie das Amen in der Kirche ;)
Jetzt müsste ich nur noch verstehen, was Du mir damit sagen willst. :(
Ich habe mir die DOIF Commandref jetzt schon einige Male durchgelesen, ich fürchte mein "Intellekt" reicht nicht aus um da durchzusteigen. :-\
stochwort: repeatcmd.
Aber: wie machst es wieder aus? Dieses doif macht das nicht.
Gesendet von meinem Doogee S60 mit Tapatalk
Zitat von: grossmaggul am 24 Januar 2019, 22:30:47
Jetzt müsste ich nur noch verstehen, was Du mir damit sagen willst. :(
Ich habe mir die DOIF Commandref jetzt schon einige Male durchgelesen, ich fürchte mein "Intellekt" reicht nicht aus um da durchzusteigen. :-\
Wenn [wz.theke] eq "off" ist, dann kann dieses DOIF deine Funktion nicht ausführen.
Was du noch machen kannst, ist ([wz.theke:state] eq "on") definieren. Dann wird die Bedingung nur geprüft, wenn sich der Status ändert.
ZitatAber: wie machst es wieder aus? Dieses doif macht das nicht.
Ja, das ist ja mein Problem.
Könnte man denn repeatcmd auch ([wz.theke:state] eq "on") übergeben, zumindest habe ich das so verstanden.
ZitatWas du noch machen kannst, ist ([wz.theke:state] eq "on") definieren. Dann wird die Bedingung nur geprüft, wenn sich der Status ändert.
O.K., aber wie sage ich dann dem Unterprogramm es soll seinen Dienst einstellen, das ist doch das Problem, oder?
Also, wenn spektralDurchlauf() aufgerufen wird, dann läuft es durch und beendet sich doch von selbst - hoffe ich.
Du musst nur schauen, dass es nur dann aufgerufen wird, wenn du es willst und sonst nicht.
ZitatAlso, wenn spektralDurchlauf() aufgerufen wird, dann läuft es durch und beendet sich doch von selbst - hoffe ich.
Ja, das tut es und ist eigentlich auch Teil des Problems, es soll ja ständig durchlaufen, bis ich den LED Streifen ausschalte.
ZitatDu musst nur schauen, dass es nur dann aufgerufen wird, wenn du es willst und sonst nicht.
Ja, schon klar, das ist ja mein Problem, ich habe bisher keine Lösung gefunden.:-(
Ich werde es wohl jetzt erstmal so machen, daß ich das Programm über ein at starte alle paar Minuten starte, mal sehen ob ich das wenigstens hinbekomme.
moin,
bevor ich mich damit beschäftige , soll es in jedem fall per DOIF gelöst werden ?
falls nicht , zieg mir doch bitt mal das aufzurufende Unterprogramm 'spektralDurchlauf();'
gruss Byte09
Zitatsoll es in jedem fall per DOIF gelöst werden ?
Nein, das muß nicht, ich bin offen für jede andere Lösung, die funktioniert.
Ich hatte auch schonmal versucht im Unterprogramm eine do/until Schleife zu setzen, dann wird aber bei Ausführung fhem blockiert.:-/
Das Unterprogramm:
###############################################################################
#
# Spektraldurchlauf LED Streifen
#
###############################################################################
sub spektralDurchlauf()
{
my $rot;
my $gruen;
my $blau;
my $rgb;
my $count;
# GELB - Grünwert erhöhen (FF0000 -> FFFF00)
for($count=0;$count<=255;$count++)
{
# Rotwert erhöhen
$gruen = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "FF${gruen}00";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# GRÜN - Rotwert erniedrigen (FFFF00 -> 00FF00)
for($count=255;$count>=0;$count--)
{
# Rotwert verringern
$rot = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "${rot}FF00";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# CYAN - Blauwert erhöhen (00FF00 -> 00FFFF)
for($count=0;$count<=255;$count++)
{
# Blauwert erhöhen
$blau = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "00FF${blau}";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# BLAU - Grünwert verringern (00FFFF -> 0000FF)
for($count=255;$count>=0;$count--)
{
# Grünwert verringern
$gruen = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "00${gruen}FF";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# MAGENTA - Rotwert erhöhen (0000FF -> FF00FF)
for($count=0;$count<=255;$count++)
{
# Rotwert erhöhen
$rot = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "${rot}00FF";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# ROT - Blauwert verringern (FF00FF -> FF0000)
for($count=255;$count>=0;$count--)
{
# Rotwert erhöhen
$blau = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "FF00${blau}";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
Möglicherweise könnte man das effizienter programmieren, ich bin allerdings noch perl Anfänger, deshalb so.:-)
Zitat von: grossmaggul am 25 Januar 2019, 11:22:34
Nein, das muß nicht, ich bin offen für jede andere Lösung, die funktioniert.
Ich hatte auch schonmal versucht im Unterprogramm eine do/until Schleife zu setzen, dann wird aber bei Ausführung fhem blockiert.:-/
Das Unterprogramm:
###############################################################################
#
# Spektraldurchlauf LED Streifen
#
###############################################################################
sub spektralDurchlauf()
{
my $rot;
my $gruen;
my $blau;
my $rgb;
my $count;
# GELB - Grünwert erhöhen (FF0000 -> FFFF00)
for($count=0;$count<=255;$count++)
{
# Rotwert erhöhen
$gruen = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "FF${gruen}00";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# GRÜN - Rotwert erniedrigen (FFFF00 -> 00FF00)
for($count=255;$count>=0;$count--)
{
# Rotwert verringern
$rot = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "${rot}FF00";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# CYAN - Blauwert erhöhen (00FF00 -> 00FFFF)
for($count=0;$count<=255;$count++)
{
# Blauwert erhöhen
$blau = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "00FF${blau}";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# BLAU - Grünwert verringern (00FFFF -> 0000FF)
for($count=255;$count>=0;$count--)
{
# Grünwert verringern
$gruen = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "00${gruen}FF";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# MAGENTA - Rotwert erhöhen (0000FF -> FF00FF)
for($count=0;$count<=255;$count++)
{
# Rotwert erhöhen
$rot = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "${rot}00FF";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# ROT - Blauwert verringern (FF00FF -> FF0000)
for($count=255;$count>=0;$count--)
{
# Rotwert erhöhen
$blau = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "FF00${blau}";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
Möglicherweise könnte man das effizienter programmieren, ich bin allerdings noch perl Anfänger, deshalb so.:-)
hmm, ich habe das gerade mal mit dummys nachgestellt. der aufruf der sub blockiert bei mir bei einmaligem anruf fhem schon für ca. 9 sekunden.
ich schaue mal , wie ich das umsetzen würde. dauert aber einen moment
gruss Byte09
Zitatder aufruf der sub blockiert bei mir bei einmaligem anruf fhem schon für ca. 9 sekunden.
Bei mir nicht, wenn ich es direkt per DOIF starte.
Zitatdauert aber einen moment
Macht nix, ich hab Zeit.;)
Zitat von: grossmaggul am 25 Januar 2019, 11:56:18
Bei mir nicht, wenn ich es direkt per DOIF starte.
Macht nix, ich hab Zeit.;)
also, kann sein , dass ich das jetzt auch nicht optimal angehe, wäre aber mein ansatz - diesen habe ich auch getestet.
die ganze unterroutine würde ich erstmal nonblocking aufrufen. https://wiki.fhem.de/wiki/Blocking_Call (https://wiki.fhem.de/wiki/Blocking_Call)
( edit :
ZitatBei mir nicht, wenn ich es direkt per DOIF starte.
dann tut DIOF das wohl sowieso schon )
in meinem hilfsmodul ( welches auch immer ) würde ich den rückgabewert nutzen , um die routine erneut zu starten , aber nur dann , wenn der state von wz.theke noch on ist.
wie das konkret in einem DOIF umzusetzen ist weiss ich leider nicht , da ich es nicht nutze. wenn du es versuchen willst könnte ich dir das aber in einem MSwitch bauen . Da könntest du in der Ansicht des MSwitches selber relativ gut einsehen , wie es funktioniert.
gruss Byte09
wie wäre es mit:
defmod wz.theke.doif DOIF ([wz.theke] eq "on") {spektralDurchlauf();} DOELSEIF ([wz.theke] eq "off") ()
attr wz.theke.doif DOIF repeatcmd 120
https://fhem.de/commandref_DE.html#DOIF_repeatcmd
Der Spektraldurclauf wird alle 2 min wiederholt bis wz.theke auf off geht.
Moin,
nur mal dumm gefragt. Sollte dann nicht off im DOELSEIF stehen?
LG
Andreas
Zitat von: rischbiter123 am 25 Januar 2019, 12:30:48
nur mal dumm gefragt. Sollte dann nicht off im DOELSEIF stehen?
natürlich. copy&paste plus ein klinnelndes Telefon. ist korrigiert. ;)
Zitatwie wäre es mit:
Ja, das ist gut, damit klappt's, vielen Dank!
Hätte ich aber eigentlich auch selber drauf kommen können, grummel. :D
Einziger Wermutstropfen, das Licht geht natürlich erst aus, wenn die Schleifen durchgelaufen sind, aber damit kann ich leben.
Kannst ja im DOELSEIF Zweig einen Befehl einbauen der direkt abschaltet.
Einfach in die letzte leere Klammer einfügen.
Gesendet von meinem Doogee S60 mit Tapatalk
ZitatEinfach in die letzte leere Klammer einfügen.
Das habe ich gerade probiert, ich habe da (wz.theke set off) eingesetzt, funktioniert aber nicht, die Schleifen werden bis zum Ende durchlaufen und erst dann wird der LED Streifen abgeschaltet.
Ja das kann ja auch nicht gehen. Dachte eher an einen Befehl der die Schleife abbricht.
Oben hast ja den Code gepostet. Da gibt's keinen Weg. Müsstest einbauen.
Poste mal bitte ein list von wz.theke
Was ist es denn für ein Controller?
Gesendet von meinem Doogee S60 mit Tapatalk
ZitatDachte eher an einen Befehl der die Schleife abbricht.
Habe ich mir auch schon Gedanken drüber gemacht, bin da aber zu keinem Ergebnis gekommen. Man müßte ja von FHEM aus in die Schleife eingreifen, da ist mir aber kein Weg bekannt, wie das gehen soll. Man müßte praktisch in jeder for-Schleife einen "Notausgang" haben.
ZitatPoste mal bitte ein list von wz.theke
Was ist es denn für ein Controller?
Ist ein LD382A Controller, ein sogenanntes "Magic UFO".
Internals:
CHANGED
CONNECTION LD382A
DEF RGBW LD382A:192.168.1.203
FUUID 5c45c63f-f33f-f310-d25d-21647dcf6d95fd3d
IP 192.168.1.203
LEDTYPE RGBW
NAME wz.theke
NR 38
NTFY_ORDER 50-wz.theke
PORT 5577
PROTO 1
SLOT 0
STATE on
TYPE WifiLight
READINGS:
2019-01-25 21:13:46 RGB FF0000
2019-01-25 21:13:46 brightness 100
2019-01-25 21:13:46 hue 0
2019-01-25 21:13:46 saturation 100
2019-01-25 21:13:46 state on
helper:
COMMANDSET on off dim dimup dimdown HSV RGB
llLock 0
targetHue 0
targetSat 100
targetTime 1548447226.36354
targetVal 100
COLORMAP:
0
1
2
2
3
4
5
5
6
7
8
8
9
10
11
11
12
13
14
14
15
16
17
17
18
19
20
20
21
22
23
23
24
25
26
26
27
28
29
29
30
31
32
32
33
34
35
35
36
37
38
38
39
40
41
41
42
43
44
44
45
46
47
47
48
49
50
50
51
52
53
53
54
55
56
57
57
58
59
60
60
61
62
63
63
64
65
66
66
67
68
69
70
70
71
72
73
73
74
75
76
76
77
78
79
80
80
81
82
83
83
84
85
86
86
87
88
89
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
154
155
157
158
160
161
163
164
166
167
169
170
172
173
175
176
178
179
181
182
184
185
187
188
190
191
193
194
196
197
198
200
201
203
204
206
207
209
210
212
213
215
216
218
219
221
222
224
225
227
228
230
231
233
234
236
237
239
240
241
241
242
243
243
244
245
245
246
247
247
248
249
249
250
251
251
252
253
253
254
255
255
256
257
257
258
259
259
260
261
261
262
263
263
264
265
265
266
267
267
268
269
269
270
271
271
272
273
273
274
275
275
276
277
277
278
279
279
280
281
283
284
285
287
288
289
291
292
293
295
296
297
299
300
301
303
304
305
307
308
309
311
312
313
315
316
317
319
320
321
323
324
325
327
328
329
331
332
333
335
336
337
339
340
341
343
344
345
347
348
349
351
352
353
355
356
357
359
0
GAMMAMAP:
0
0.0837677640068292
0.243332430098219
0.45405621299892
0.70684316621699
0.996357952001595
1.31896324344069
1.67196720192944
2.05327034060355
2.46117402090514
2.89426612471675
3.35134791378444
3.83138472229589
4.33347131986342
4.85680675751166
5.4006755921087
5.96443354494847
6.54749632988109
7.14933080167485
7.76944783828119
8.40739654243209
9.06275946322968
9.73514861754315
10.4242021465521
11.1295814824596
11.8509689292396
12.5880655825711
13.3405895300298
14.1082742846809
14.8908674144572
15.6881293368749
16.499832254239
17.3257592089163
18.1657032417713
19.0194666396879
19.8868602603794
20.7677029245494
21.6618208669846
22.5690472394153
23.4892216590168
24.4221897972898
25.3678030047821
26.3259179677223
27.2963963931522
28.2791047195789
29.2739138505435
30.2806989088167
31.2993390092098
32.329717048222
33.3717195089492
34.4252362798567
35.4901604861718
36.5663883327847
37.6538189576659
38.7523542949095
39.8618989466026
40.982360062801
42.1136472289627
43.2556723602513
44.4083496021795
45.5715952371095
46.7453275961738
47.9294669762181
49.1239355614018
50.3286573491265
51.5435580799885
52.7685651714775
54.0036076551689
55.2486161171733
56.5035226416311
57.7682607570534
59.0427653853271
60.3269727932157
61.6208205462015
62.9242474645252
64.237193581289
65.5596001025013
66.8914093689478
68.2325648197832
69.583010957744
70.9426933158916
72.3115584257991
73.6895537871024
75.0766278383415
76.4727299290214
77.8778102928286
79.2918200219416
80.7147110423796
82.1464360903337
83.5869486894341
85.0362031289022
86.4941544425471
87.9607583885629
89.4359714300888
90.9197507164941
92.4120540653557
93.9128399450933
95.4220674582326
96.9396963252683
98.4656868690975
100
hlCmdQueue:
llCmdQueue:
Attributes:
DbLogExclude .*
colorCast 0, -15, -29, -29, 0, -20
event-on-change-reading .*
group Licht
icon light_led_stripe_rgb
room 1.1_Wohnzimmer,6.1_Licht
sortby 7
verbose 0
webCmd RGB:on:off
whitePoint 1, 1, 1
widgetOverride RGB:colorpicker,RGB
Ah, OK. Der kann das Spektrum nicht direkt.
Der rgbww hier ausm forum kann das selbst. Da geht das mit dem off dann auch.
Möglichkeit:
In deiner Sub so oft wie möglich abfragen ob das wz.theke off ist und wenn ja dann abbrechen, ausschalten.
Gesendet von meinem Doogee S60 mit Tapatalk
ZitatIn deiner Sub so oft wie möglich abfragen ob das wz.theke off ist und wenn ja dann abbrechen, ausschalten.
Ja, so hatte ich mir das auch gedacht, ich muß mich da aber erstmal schlau machen, wie das genau geht. Ich habe immer ein wenig Schwierigkeiten aus den Perlprogrammen heraus fhem anzusteuern. Wird schon schief gehen.;)
Und natürlich geht es schief...
Ich habe jetzt die sub Routine so umgebaut (die Log Befehle sind nur zum testen), daß in jeder For-Schleife eine if Abfrage auf (wz.theke off) testet und dann soll die Schleife verlassen werden.
###############################################################################
#
# Spektraldurchlauf LED Streifen
#
###############################################################################
sub spektralDurchlauf()
{
my $rot;
my $gruen;
my $blau;
my $rgb;
my $count;
my $theke_status = ReadingsVal("wz.theke","state","");
# GELB - Grünwert erhöhen (FF0000 -> FFFF00)
for($count=0;$count<=255;$count++)
{
# Rotwert erhöhen
$gruen = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "FF${gruen}00";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
if ($theke_status eq "off")
{
Log 1, "gelb";
last;
}
}
# GRÜN - Rotwert erniedrigen (FFFF00 -> 00FF00)
for($count=255;$count>=0;$count--)
{
# Rotwert verringern
$rot = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "${rot}FF00";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
if ($theke_status eq "off")
{
Log 3, "gruen";
last;
}
}
# CYAN - Blauwert erhöhen (00FF00 -> 00FFFF)
for($count=0;$count<=255;$count++)
{
# Blauwert erhöhen
$blau = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "00FF${blau}";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
if ($theke_status eq "off")
{
Log 3, "cyan";
last;
}
}
# BLAU - Grünwert verringern (00FFFF -> 0000FF)
for($count=255;$count>=0;$count--)
{
# Grünwert verringern
$gruen = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "00${gruen}FF";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
if ($theke_status eq "off")
{
Log 3, "blau";
last;
}
}
# MAGENTA - Rotwert erhöhen (0000FF -> FF00FF)
for($count=0;$count<=255;$count++)
{
# Rotwert erhöhen
$rot = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "${rot}00FF";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
if ($theke_status eq "off")
{
Log 3, "magenta";
last;
}
}
# ROT - Blauwert verringern (FF00FF -> FF0000)
for($count=255;$count>=0;$count--)
{
# Rotwert erhöhen
$blau = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "FF00${blau}";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
if ($theke_status eq "off")
{
Log 3, "rot";
last;
}
}
}
Leider funktioniert das aber so nicht, warum ist mir schleierhaft.
Das Programm verlässt weder die Schleife noch kommt irgendeine Logausgabe.
Wenn ich aber in der zugefügten if Abfrage auf "on" teste, dann wird die Schleife verlassen und ich habe einen Logeintrag.
Könnte es damit zusammenhängen, daß die DOIF Abfrage bei "off" in der DOELSEIF Abfrage ist und das Unterprogramm da nicht aufgerufen wird?
Oder was ist der Grund dafür?
Zitat von: grossmaggul am 26 Januar 2019, 01:17:04
Könnte es damit zusammenhängen, daß die DOIF Abfrage bei "off" in der DOELSEIF Abfrage ist und das Unterprogramm da nicht aufgerufen wird?
Oder was ist der Grund dafür?
Natürlich hängt es damit zusammen, DOIF prüft ja nicht ständig seine Bedingungen, sondern nur wenn es durch einen Trigger aufgefordert wird. Rekursionen durch Selbsttriggerung werden zusätzlich vom DOIF unterbunden.
Was ist denn der Sinn des Spektraldurchlaufs?
Wenn der Controller keine "Transitions" beherrscht (das wäre die eleganteste Lösung), dann wären solche Aufgaben eher in einem Modul besser untergebracht, welches nach jedem Befehl die Kontrolle ans FHEM abgibt, sonst, wie schon geschrieben, muss man mit Blocking-Calls arbeiten.
hi ,
ich habe mich jetzt doch nochmal damit beschäftigt. Läuft soweit auch ( auch jederzeit abbrechbar ) , aber ... !
...ich kann es drehen und wenden wie ich will, da werden ja pro durchlauf 765 set-Befehle ausgeführt und das blockiert mein Fhem in jedem Fall spürbar. Aus der BlockingCall direkt kann ich keine set befehle ausführen , denke ich zumindest ( bitte korrigier mich jemand, wenn ich hier falsch liege ) .
d.h - abgesehen davon , das das sowieso - naja zumindest fragwürdig ist - konnte ich es nur halbwegs vernünftig lösen , indem ich zwischen den einzelnen set befehlen mit einer pause von 1 sekunde arbeite - um fhem zumindest die gelegenheit zu geben , andere aktionen auszuführen.
wenn diese pause zwischen den befehlen für dich akzeptabel ist , kann ich dir meine Lösung heute mittag posten.
ich kann auch irgendwie nicht nachvollziehen , wie du es anstellst, das dein fhem bei der sub nicht blockiert?!
ich kann es anstellen wie ich will, ich habe immer entsprechende aussetzer gehabt, auch mit der DOIF-Lösung.
gruss Byte09
Zitat von: DamianNatürlich hängt es damit zusammen,
O.K, dann lag ich ja richtig, ist ja auch schonmal was. ;)
Verstehen tue ich es trotzdem nicht, das Unterprogramm wird doch von DOIF aus aufgerufen und läuft dann durch, wenn man jetzt während eines Durchlaufs die LEDs ausschaltet wird an die LEDs ein off gesendet, das kann man dann auch über den Status des devices überprüfen. Zu der Zeit läuft das Unterprogramm aber immer noch und sollte doch mitbekommen, daß da ein "off" angekommen ist, aber vermutlich stelle ich mir das wieder zu einfach vor.
Zitat von: DamianWenn der Controller keine "Transitions" beherrscht (das wäre die eleganteste Lösung), dann wären solche Aufgaben eher in einem Modul besser untergebracht, welches nach jedem Befehl die Kontrolle ans FHEM abgibt, sonst, wie schon geschrieben, muss man mit Blocking-Calls arbeiten.
Keine Ahnung, ob der Transitions beherrscht, ich weiß ja nicht mal was das ist, geschweige denn wie man die aufruft...
Zitat von: DamianWas ist denn der Sinn des Spektraldurchlaufs?
Muß immer alles einen Sinn haben? ;)
Das ist ein rein optisches Ding, ich habe hier eine Wohnzimmerküche, mit einer Kochinsel und auf der Rückseite der Kochinsel ist hinter Milchplexiglasscheiben die LED Kette angebracht, da mir das zu langweilig war immer nur eine Farbe zu haben, bzw. die hin und wieder zu wechseln hatte ich mir diesen Spektraldurchlauf überlegt, daß das Ganze so schwierig sein würde, hatte ich nicht gedacht. :-[
Zitat von: Byte09ich kann auch irgendwie nicht nachvollziehen , wie du es anstellst, das dein fhem bei der sub nicht blockiert?!
Vielleicht weil bei mir fhem auf potenterer Hardware läuft und nicht auf einem Rapsberry oder ähnlich.
ZitatZitat von: Byte09
ich kann auch irgendwie nicht nachvollziehen , wie du es anstellst, das dein fhem bei der sub nicht blockiert?!
Vielleicht weil bei mir fhem auf potenterer Hardware läuft und nicht auf einem Rapsberry oder ähnlich.
was aber mE nichts daran ändert , das er aus der routine nicht rauskommt. das bedeutet , das er (bildlich) erst alle Befehle der routine auf einen Stapel legt ( somit letztendlich 'blocking' ) und erst dann befehle die von ausserhalb der routine kommen ganz oben auf den stapel legt. abgearbeitet werden die befehle von unten nach oben.
ich denke ganz vereinfacht ausgedrückt - erklärt aber das nun vorhandene problem da der off befehl erst nach ablauf der routine auf den stapel gelegt wird, auch wenn du es ggf. aufgrund potenter hardware optisch so nicht nachvollziehen kannst.
( ich hoffe ich erzähle hier keinen unssinn ;) )
gruss Byte09
edit: ich konnte die pausen auf 0.1 sekunden reduzieren, somit sollte es fließend sein.
das MSwitch ist noch im 'unreinen' und deine subs müssten angepasst werden.
Zitat von: grossmaggul am 26 Januar 2019, 13:42:30
O.K, dann lag ich ja richtig, ist ja auch schonmal was. ;)
Verstehen tue ich es trotzdem nicht, das Unterprogramm wird doch von DOIF aus aufgerufen und läuft dann durch, wenn man jetzt während eines Durchlaufs die LEDs ausschaltet wird an die LEDs ein off gesendet, das kann man dann auch über den Status des devices überprüfen. Zu der Zeit läuft das Unterprogramm aber immer noch und sollte doch mitbekommen, daß da ein "off" angekommen ist, aber vermutlich stelle ich mir das wieder zu einfach vor.
Du kannst ja mal Rekursionen zulassen: https://fhem.de/commandref_DE.html#DOIF_selftrigger
Zitat von: Damian am 26 Januar 2019, 17:03:51
Du kannst ja mal Rekursionen zulassen: https://fhem.de/commandref_DE.html#DOIF_selftrigger
hi damian ,
kannst du mir mal unter die arme greifen ? führt doif die sub ohne unterbrechung aus ? ..... dann versthe ich nicht wie es funktionieren soll, der befehl der letztendlich dass state von "wz..." auf off ändert wird dann m.E. doch erst NACH allen anderen befehlen aus der sub ausgeführt und bleibt somit während des Ausführens der sub auf "on" ?
Oder liege ich hier so falsch ?
gruss Byte09
Zitat von: Byte09 am 26 Januar 2019, 19:23:49
hi damian ,
kannst du mir mal unter die arme greifen ? führt doif die sub ohne unterbrechung aus ? ..... dann versthe ich nicht wie es funktionieren soll, der befehl der letztendlich dass state von "wz..." auf off ändert wird dann m.E. doch erst NACH allen anderen befehlen aus der sub ausgeführt und bleibt somit während des Ausführens der sub auf "on" ?
Oder liege ich hier so falsch ?
gruss Byte09
Ich gehe davon aus, dass das Setzen von off schon zum richtigen Zeitpunkt stattfindet. Nur reagiert DOIF auf das Event "off" bewusst nicht, bis die Ausführung von spektralDurchlauf() beendet ist, um Rekursionen (Endlosschleifen) zu vermeiden. Zitat aus der Commandref zu DOIF:
ZitatStandardmäßig unterbindet das DOIF-Modul Selbsttriggerung. D. h. das Modul reagiert nicht auf Events, die es selbst direkt oder indirekt auslöst. Dadurch werden Endlosschleifen verhindert.
Dieses Verhalten lässt sich mit Attribut selftrigger ändern.
ZitatIch gehe davon aus, dass das Setzen von off schon zum richtigen Zeitpunkt stattfindet. Nur reagiert DOIF auf das Event "off" bewusst nicht, bis die Ausführung von spektralDurchlauf() beendet ist, um Rekursionen (Endlosschleifen) zu vermeiden. Zitat aus der Commandref zu DOIF:
ok , nehme ich so hin , bleibt mir aber völlig unklar ... da das ja im umkehrschluss bedeuten müsste , das fhem selbst dann im grunde weiter funktioniert, wenn ich die sub in eine endlosschleif schicken würde. ???
kurz : mE geht es erst weiter ( auch mit 'set ... off' ), wenn die routine beendet ist und die 'mainLoop' weiterläuft , solange die sub nicht als fork läuft - und somit gehe ich irgendwie nachwievor davon aus, das es so nicht gehen kann, die sub durch eine prüfung des states zu beenden.
PS: lasse mich aber gerne duch eine funktionierende definition überzeugen ( ganz ernst gemeint )
gruss Byte09
Zitat von: Byte09 am 26 Januar 2019, 20:01:06
ok , nehme ich so hin , bleibt mir aber völlig unklar ... da das ja im umkehrschluss bedeuten müsste , das fhem selbst dann im grunde weiter funktioniert, wenn ich die sub in eine endlosschleif schicken würde. ???
kurz : mE geht es erst weiter ( auch mit 'set ... off' ), wenn die routine beendet ist und die 'mainLoop' weiterläuft , solange die sub nicht als fork läuft - und somit gehe ich irgendwie nachwievor davon aus, das es so nicht gehen kann, die sub durch eine prüfung des states zu beenden.
PS: lasse mich aber gerne duch eine funktionierende definition überzeugen ( ganz ernst gemeint )
gruss Byte09
Ich habe es gerade nachgestellt und eine Endlosschleife mit fhem"set bla on" gebaut. Es war nicht möglich irgendwelche Events dem System zu entlocken, man kommt nicht mehr dazwischen, das System ist mit sich selbst beschäftigt - ich musste FHEM killen.
Zitat von: Damian am 26 Januar 2019, 20:29:38
Ich habe es gerade nachgestellt und eine Endlosschleife mit fhem"set bla on" gebaut. Es war nicht möglich irgendwelche Events dem System zu entlocken, man kommt nicht mehr dazwischen, das System ist mit sich selbst beschäftigt - ich musste FHEM killen.
wie dem auch sei , ich habe es wie folgt gelöst:
durch die sub des TE lasse ich die Farwerte anlegen (nonblocking) und übergebe diese daten zurück an das Hilfsmodul.
dieses arbeitet diese werte step bei step ab , im grunde wird für jedes set ein neuer internaltimer gesetzt, daher ist es jederzeit abzubrechen , da di Mainloop immer wieder läuft . Neustart des ganzen vorganges , wenn alle Farbwerte abgearbeitet sind.
das ganze verpackt in ein Hilfsmodul der individuellen ersten wahl - in meinem Fall mein Modul ;).
läuft seit 4 stunden stabil und belastet das system nicht spürbar.
gruss Byte09
Das FHEM-Modul passend zum Controller unterstützt offenbar Farbübergänge (Transitions) siehe https://wiki.fhem.de/wiki/WifiLight
Zur genauen Syntax ggf. im entsprechenden Forumsbereich nachfragen.
Zitat von: grossmaggul am 25 Januar 2019, 11:22:34
Nein, das muß nicht, ich bin offen für jede andere Lösung, die funktioniert.
Ich hatte auch schonmal versucht im Unterprogramm eine do/until Schleife zu setzen, dann wird aber bei Ausführung fhem blockiert.:-/
Das Unterprogramm:
###############################################################################
#
# Spektraldurchlauf LED Streifen
#
###############################################################################
sub spektralDurchlauf()
{
my $rot;
my $gruen;
my $blau;
my $rgb;
my $count;
# GELB - Grünwert erhöhen (FF0000 -> FFFF00)
for($count=0;$count<=255;$count++)
{
# Rotwert erhöhen
$gruen = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "FF${gruen}00";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# GRÜN - Rotwert erniedrigen (FFFF00 -> 00FF00)
for($count=255;$count>=0;$count--)
{
# Rotwert verringern
$rot = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "${rot}FF00";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# CYAN - Blauwert erhöhen (00FF00 -> 00FFFF)
for($count=0;$count<=255;$count++)
{
# Blauwert erhöhen
$blau = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "00FF${blau}";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# BLAU - Grünwert verringern (00FFFF -> 0000FF)
for($count=255;$count>=0;$count--)
{
# Grünwert verringern
$gruen = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "00${gruen}FF";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# MAGENTA - Rotwert erhöhen (0000FF -> FF00FF)
for($count=0;$count<=255;$count++)
{
# Rotwert erhöhen
$rot = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "${rot}00FF";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
# ROT - Blauwert verringern (FF00FF -> FF0000)
for($count=255;$count>=0;$count--)
{
# Rotwert erhöhen
$blau = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb = sprintf "FF00${blau}";
# Farbe in LEDs setzen
fhem("set wz.theke RGB $rgb");
}
Möglicherweise könnte man das effizienter programmieren, ich bin allerdings noch perl Anfänger, deshalb so.:-)
moin,
wenn du magst kannst du das MSwitch mal versuchen:
-MSwitch anlegen :
define NAME MSwitch
- im device auf "get NAME get_config" klicken
- die angezeigte configuration durch die folgende ersetzen
#V 2.10
#VS V2.00
#S .Trigger_time ->
#S .Device_Affected_Details -> FreeCmd-AbsCmd1#[NF]cmd#[NF]cmd#[NF]{;;$hash->{helper}{RUNNING_PID} = BlockingCall('MSwitch_spektralDurchlauf',$hash->{NAME},'MSwitch_spektralDurchlaufend',10,'','');;;}#[NF]{;;BlockingKill($hash->{helper}{RUNNING_PID}) if(defined($hash->{helper}{RUNNING_PID}));;;delete($hash->{helper}{RUNNING_PID});;;fhem("deletereading $SELF todo");;;fhem("deletereading $SELF todoanz");;;fhem("deletereading $SELF todofirst");;;}#[NF]delay1#[NF]delay1#[NF]00:00:00#[NF]00:00:00#[NF][wz.theke:state] eq "on"#[NF]#[NF]0#[NF]0#[NF]1#[NF]0#[NF]#[NF]0#[NF]0#[NF]1#[ND]FreeCmd-AbsCmd2#[NF]cmd#[NF]cmd#[NF]{;;my $test;;;my @test1;;;my $akttodo;;;my $kommand ;;;my $kommand1 ;;;$test = ReadingsVal( '$SELF', 'todo', '' );;;$akttodo = ReadingsVal( '$SELF', 'todofirst', '' );;;@test1 = split(' ',$test); ;;my $farbe = $test1[$akttodo];;;;;# auszufuehrende kommandos;;$kommand = "set wz.theke RGB ".$farbe;;;$kommand1 = "set HUEDevice2 rgb ".$farbe;;;fhem($kommand);;;fhem($kommand1);;;;;#;;;;$akttodo++;;;fhem("setreading $SELF todofirst $akttodo");;;if (ReadingsVal( '$SELF', 'todoanz', '' ) < $akttodo);;{;;fhem("setreading $SELF todofirst 1");;;#fhem("set $SELF exec_cmd_1 ID 1");;;};;}#[NF]#[NF]delay1#[NF]delay1#[NF]00:00:00#[NF]00:00:00#[NF][wz.theke:state] eq "on"#[NF]#[NF]0#[NF]0#[NF]3#[NF]1#[NF]#[NF]0#[NF]0#[NF]1#[ND]MSwitch_Self-AbsCmd1#[NF]no_action#[NF]del_delays#[NF]#[NF]#[NF]delay1#[NF]delay1#[NF]00:00:00#[NF]00:00:00#[NF]#[NF]#[NF]0#[NF]0#[NF]2#[NF]0#[NF]#[NF]0#[NF]0#[NF]1#[ND]MSwitch_Self-AbsCmd2#[NF]exec_cmd_1#[NF]no_action#[NF]ID 1#[NF]#[NF]delay1#[NF]delay1#[NF][$SELF:takt]#[NF]00:00:00#[NF][wz.theke:state] eq "on"#[NF]#[NF]0#[NF]0#[NF]4#[NF]1#[NF]#[NF]0#[NF]0#[NF]1
#S .V_Check -> V2.00
#S .Trigger_condition ->
#S exec_cmd_1 -> ID 1
#S EVTPART3 -> off
#S last_event -> state:off
#S .Device_Events -> no_trigger
#S Trigger_device -> wz.theke
#S .Trigger_cmd_off -> state:off
#S EVTPART1 -> wz.theke
#S EVENT -> state:off
#S last_exec_cmd -> set spektral del_delays
#S .Trigger_off -> no_trigger
#S state -> active
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,MSwitch_Self-AbsCmd1,MSwitch_Self-AbsCmd2
#S .Trigger_cmd_on -> state:on
#S .First_init -> done
#S EVTFULL -> wz.theke:state:off
#S last_cmd -> 2
#S .Trigger_on -> no_trigger
#S takt -> 00:00:02
#S change -> 10
#S .sortby -> priority
#S Trigger_log -> off
#S EVTPART2 -> state
#A MSwitch_Include_Webcmds -> 0
#A MSwitch_Delete_Delays -> 1
#A MSwitch_Include_MSwitchcmds -> 0
#A MSwitch_Inforoom -> MSwitch
#A room -> 1_test
#A MSwitch_Extensions -> 0
#A MSwitch_generate_Events -> 0
#A MSwitch_Debug -> 0
#A MSwitch_Help -> 0
#A MSwitch_Lock_Quickedit -> 1
#A MSwitch_Include_Devicecmds -> 1
#A webCmdLabel -> Takt:Aenderung
#A MSwitch_Expert -> 1
#A setList -> takt:00:00:01,00:00:02,00:00:03,00:00:04,00:00:05 change:1,2,3,4,5,6,7,8,10
#A webCmd -> takt:change
#A MSwitch_Mode -> Notify
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul
#A readingList -> takt change
- auf "save changes" klicken
- die folgenden routinen in die 99myUtils kopieren:
###############################################################################
#
# Spektraldurchlauf LED Streifen
#
###############################################################################
sub MSwitch_spektralDurchlauf($)
{
my ($name) = @_;
my $change = ReadingsVal( $name, 'change', '10' );
my $rot;
my $gruen;
my $blau;
my $rgb;
my $count;
# GELB - Grünwert erhöhen (FF0000 -> FFFF00)
for($count=0;$count<=255;$count=$count + $change )
{
# Rotwert erhöhen
$gruen = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb .= sprintf "FF${gruen}00 ";
}
# GRÜN - Rotwert erniedrigen (FFFF00 -> 00FF00)
for($count=255;$count>=0;$count=$count - $change )
{
# Rotwert verringern
$rot = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb .= sprintf "${rot}FF00 ";
}
# CYAN - Blauwert erhöhen (00FF00 -> 00FFFF)
for($count=0;$count<=255;$count=$count + $change)
{
# Blauwert erhöhen
$blau = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb .= sprintf "00FF${blau} ";
}
# BLAU - Grünwert verringern (00FFFF -> 0000FF)
for($count=255;$count>=0;$count=$count - $change )
{
# Grünwert verringern
$gruen = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb .= sprintf "00${gruen}FF ";
}
# MAGENTA - Rotwert erhöhen (0000FF -> FF00FF)
for($count=0;$count<=255;$count=$count + $change )
{
# Rotwert erhöhen
$rot = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb .= sprintf "${rot}00FF ";
}
# ROT - Blauwert verringern (FF00FF -> FF0000)
for($count=255;$count>=0;$count=$count - $change )
{
# Rotwert erhöhen
$blau = sprintf ("%02x", $count);
#in RGB Wert wandeln
$rgb .= sprintf "FF00${blau} ";
}
# Rückgabe muss ein String aus dem aufrufenden devicenamen und aller zu setzenden Farbwerte sein . als trenner dient das leerzeichen.
return "$name $rgb";
}
sub MSwitch_spektralDurchlaufend($)
{
my ($string) = @_;
return unless(defined($string));
my @a = split(" ",$string);
my $hash = $defs{$a[0]};
delete $hash->{helper}{RUNNING_PID};
my $anz = @a;
$anz=$anz-1;
fhem("setreading ".$hash->{NAME}." todo $string");
fhem("setreading ".$hash->{NAME}." todoanz $anz");
fhem("setreading ".$hash->{NAME}." todofirst 1");
fhem("set ".$hash->{NAME}." exec_cmd_1 ID 1");
}
schauen ob es geht .
gruss Byte09
Hallo,
Zitatwenn du magst kannst du das MSwitch mal versuchen:
Klar mag ich.:-)
Ich habe das jetzt mal eingebaut, es funktioniert eigentlich genauso wie vorher, ausgeschaltet wird aber auch erst, wenn der Spektraldurchlauf beendet ist.
Zitat von: grossmaggul am 27 Januar 2019, 20:19:31
Hallo,
Klar mag ich.:-)
Ich habe das jetzt mal eingebaut, es funktioniert eigentlich genauso wie vorher, ausgeschaltet wird aber auch erst, wenn der Spektraldurchlauf beendet ist.
das kann im grunde nicht sein . schaltet er die led nur nicht aus und stoppt den farbwechsel, oder läuft der farbwechsel auch weiter ?
ggf stimmt dass abschaltevent nicht , das ich da ein falsches vorausgesetzt habe. kannst du mal im eventmonitor schauen , was für ein event generiert wird wenn du ausschaltest ?
das ist ein verhalten , was die konfiguration eigentlich gar nicht hergoebt, da es entweder sofort beendet wrd bei 'off' , ansonsten beendet es sich gar nicht.
bist du sicher , das nicht das doif auch noch im hintergrund werkelt ? ... das klingt mir fast so ?! :-\
gruss Byte09
Zitatdas nicht das doif auch noch im hintergrund werkelt ?
Doch, hatte ich vergessen zu deaktivieren.:-/
Jetzt funktioniert aber irgendwie der Aufruf des Farbwechsels nicht mehr.
Ich verstehe auch nicht was MSwitch eigentlich macht, bzw. wie das aufgerufen wird, soll das einfach loslegen sobald wz.theke auf "on" geht?
Das funktioniert nämlich nicht.:-(
Hier das Event beim Einschalten:
2019-01-27 23:19:38 MSwitch led_kette todo: led_kette FF0000 FF0a00 FF1400 FF1e00 FF2800 FF3200 FF3c00 FF4600 FF5000 FF5a00 FF6400 FF6e00 FF7800 FF8200 FF8c00 FF9600 FFa000 FFaa00 FFb400 FFbe00 FFc800 FFd200 FFdc00 FFe600 FFf000 FFfa00 ffFF00 f5FF00 ebFF00 e1FF00 d7FF00 cdFF00 c3FF00 b9FF00 afFF00 a5FF00 9bFF00 91FF00 87FF00 7dFF00 73FF00 69FF00 5fFF00 55FF00 4bFF00 41FF00 37FF00 2dFF00 23FF00 19FF00 0fFF00 05FF00 00FF00 00FF0a 00FF14 00FF1e 00FF28 00FF32 00FF3c 00FF46 00FF50 00FF5a 00FF64 00FF6e 00FF78 00FF82 00FF8c 00FF96 00FFa0 00FFaa 00FFb4 00FFbe 00FFc8 00FFd2 00FFdc 00FFe6 00FFf0 00FFfa 00ffFF 00f5FF 00ebFF 00e1FF 00d7FF 00cdFF 00c3FF 00b9FF 00afFF 00a5FF 009bFF 0091FF 0087FF 007dFF 0073FF 0069FF 005fFF 0055FF 004bFF 0041FF 0037FF 002dFF 0023FF 0019FF 000fFF 0005FF 0000FF 0a00FF 1400FF 1e00FF 2800FF 3200FF 3c00FF 4600FF 5000FF 5a00FF 6400FF 6e00FF 7800FF 8200FF 8c00FF 9600FF a000FF aa00FF b400FF be00FF c800FF d200FF dc00FF e600FF f000FF fa00FF FF00ff FF00f5 FF00eb FF00e1 FF00d7 FF00cd FF00c3 FF00b9 FF00af FF00a5 FF009b FF0091 FF0087 FF007d FF0073 FF0069 FF005f FF0055 FF004b FF0041 FF0037 FF002d FF0023 FF0019 FF000f FF0005
2019-01-27 23:19:38 MSwitch led_kette todoanz: 156
2019-01-27 23:19:38 MSwitch led_kette todofirst: 1
2019-01-27 23:19:38 MSwitch led_kette exec_cmd_1 ID 1
Und beim Ausschalten:
Zitat2019-01-27 23:20:37 MSwitch led_kette del_delays
2019-01-27 23:20:37 WifiLight wz.theke brightness: 0
2019-01-27 23:20:37 WifiLight wz.theke RGB: 000000
2019-01-27 23:20:37 WifiLight wz.theke off
Und der Auszug aus dem Logfile dazu:
Zitat2019.01.27 23:22:44 3: wz.theke set HSV 120, 100, 100 with ramp: 0, flags:
2019.01.27 23:22:44 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {$hash->{helper}{RUNNING_PID} = BlockingCall('MSwitch_spektralDurchlauf',$hash->{NAME},'MSwitch_spektralDurchlaufend',10,'','');} 6291
2019.01.27 23:22:44 1: error at id call 1: format must be exec_cmd_1 <ID x,z,y>
2019.01.27 23:22:44 3: wz.theke RGBW LD382A set off 0
2019.01.27 23:22:44 3: wz.theke RGBW LD382A dim 0 0
2019.01.27 23:22:44 3: wz.theke set HSV 120, 100, 0 with ramp: 0, flags:
2019.01.27 23:22:44 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {BlockingKill($hash->{helper}{RUNNING_PID}) if(defined($hash->{helper}{RUNNING_PID}));delete($hash->{helper}{RUNNING_PID});fhem("deletereading led_kette todo");fhem("deletereading led_kette todoanz");fhem("deletereading led_kette todofirst");} 6291
2019.01.27 23:22:44 3: deletereading led_kette todo : Deleted reading todo for device led_kette
2019.01.27 23:22:44 3: deletereading led_kette todoanz : Deleted reading todoanz for device led_kette
2019.01.27 23:22:44 3: deletereading led_kette todofirst : Deleted reading todofirst for device led_kette
2019.01.27 23:22:44 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> set MSwitch_Self del_delays 6291
2019.01.27 23:22:47 3: wz.theke set HSV 120, 100, 100 with ramp: 0, flags:
2019.01.27 23:22:47 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {$hash->{helper}{RUNNING_PID} = BlockingCall('MSwitch_spektralDurchlauf',$hash->{NAME},'MSwitch_spektralDurchlaufend',10,'','');} 6291
2019.01.27 23:22:47 1: error at id call 1: format must be exec_cmd_1 <ID x,z,y>
2019.01.27 23:22:54 3: wz.theke RGBW LD382A set off 0
2019.01.27 23:22:54 3: wz.theke RGBW LD382A dim 0 0
2019.01.27 23:22:54 3: wz.theke set HSV 120, 100, 0 with ramp: 0, flags:
2019.01.27 23:22:54 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {BlockingKill($hash->{helper}{RUNNING_PID}) if(defined($hash->{helper}{RUNNING_PID}));delete($hash->{helper}{RUNNING_PID});fhem("deletereading led_kette todo");fhem("deletereading led_kette todoanz");fhem("deletereading led_kette todofirst");} 6291
2019.01.27 23:22:54 3: deletereading led_kette todo : Deleted reading todo for device led_kette
2019.01.27 23:22:54 3: deletereading led_kette todoanz : Deleted reading todoanz for device led_kette
2019.01.27 23:22:54 3: deletereading led_kette todofirst : Deleted reading todofirst for device led_kette
2019.01.27 23:22:54 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> set MSwitch_Self del_delays 6291
2019.01.27 23:22:55 3: wz.theke set HSV 120, 100, 100 with ramp: 0, flags:
2019.01.27 23:22:55 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {$hash->{helper}{RUNNING_PID} = BlockingCall('MSwitch_spektralDurchlauf',$hash->{NAME},'MSwitch_spektralDurchlaufend',10,'','');} 6291
2019.01.27 23:22:55 1: error at id call 1: format must be exec_cmd_1 <ID x,z,y>
2019.01.27 23:22:57 3: wz.theke RGBW LD382A set off 0
2019.01.27 23:22:57 3: wz.theke RGBW LD382A dim 0 0
2019.01.27 23:22:57 3: wz.theke set HSV 120, 100, 0 with ramp: 0, flags:
2019.01.27 23:22:57 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {BlockingKill($hash->{helper}{RUNNING_PID}) if(defined($hash->{helper}{RUNNING_PID}));delete($hash->{helper}{RUNNING_PID});fhem("deletereading led_kette todo");fhem("deletereading led_kette todoanz");fhem("deletereading led_kette todofirst");} 6291
2019.01.27 23:22:57 3: deletereading led_kette todo : Deleted reading todo for device led_kette
2019.01.27 23:22:57 3: deletereading led_kette todoanz : Deleted reading todoanz for device led_kette
2019.01.27 23:22:57 3: deletereading led_kette todofirst : Deleted reading todofirst for device led_kette
2019.01.27 23:22:57 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> set MSwitch_Self del_delays 6291
morgen,
2019.01.27 23:22:55 1: error at id call 1: format must be exec_cmd_1 <ID x,z,y>
... kommt daher, das deine 98:_MSwitch.pm nicht aktuell ist . Daher läuft es auch nicht .Bitte ein Fhemupdate machen , dann sollte es gehen.
Mach das bitte aber erst nach 8 Uhr, ich habe heute Nacht nochmal eine Änderung eingespielt , damit du diese auch mitbekommst.
gruss Byte09
Morgen,
update habe ich gemacht, jetzt klappt das auch, allerdings wenn die wz.theke eingeschaltet wird, wird auch eine meiner HUEs mit eingeschaltet und hat ebenfalls den Spektraldurchlauf.
Ich komme aber nicht dahinter warum nur die eine.
Gibt es eigentlich eine Doku zu MSwitch?
Das hier steht im Eventmonitor und das wird dann auch ständig mit anderen Werten wiederholt:
2019-01-28 09:51:21 MSwitch led_kette todofirst: 47
2019-01-28 09:51:22 HUEDevice HUEDevice2 xy: 0.054,0.9698
2019-01-28 09:51:22 HUEDevice HUEDevice2 reachable: 1
2019-01-28 09:51:22 HUEDevice HUEDevice2 rgb: 41ff00
Im Logfile wird das hier ausgegeben, die letzten 3 Zeilen werden auch da ständig wiederholt:
2019.01.28 09:43:39 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> set MSwitch_Self exec_cmd_1 ID 1 6702
2019.01.28 09:43:39 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {my $test;my @test1;my $akttodo;my $kommand ;my $kommand1 ;$test = ReadingsVal( 'led_kette', 'todo', '' );$akttodo = ReadingsVal( 'led_kette', 'todofirst', '' );@test1 = split(' ',$test); my $farbe = $test1[$akttodo];$kommand = "set wz.theke RGB ".$farbe;$kommand1 = "set HUEDevice2 rgb ".$farbe;fhem($kommand);fhem($kommand1);;$akttodo++;fhem("setreading led_kette todofirst $akttodo");if (ReadingsVal( 'led_kette', 'todoanz', '' ) < $akttodo){fhem("setreading led_kette todofirst 1");}} 6337
2019.01.28 09:43:39 3: wz.theke set HSV 40, 100, 100 with ramp: 0, flags:
2019.01.28 09:43:40 3: wz.theke RGBW LD382A set off 0
2019.01.28 09:43:40 3: wz.theke RGBW LD382A dim 0 0
2019.01.28 09:43:40 3: wz.theke set HSV 40, 100, 0 with ramp: 0, flags:
2019.01.28 09:43:40 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {BlockingKill($hash->{helper}{RUNNING_PID}) if(defined($hash->{helper}{RUNNING_PID}));delete($hash->{helper}{RUNNING_PID});fhem("deletereading led_kette todo");fhem("deletereading led_kette todoanz");fhem("deletereading led_kette todofirst");} 6337
2019.01.28 09:43:40 3: deletereading led_kette todo : Deleted reading todo for device led_kette
2019.01.28 09:43:40 3: deletereading led_kette todoanz : Deleted reading todoanz for device led_kette
2019.01.28 09:43:40 3: deletereading led_kette todofirst : Deleted reading todofirst for device led_kette
2019.01.28 09:43:40 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> set MSwitch_Self del_delays 6337
2019.01.28 09:43:50 3: wz.theke set HSV 120, 100, 100 with ramp: 0, flags:
2019.01.28 09:43:50 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {$hash->{helper}{RUNNING_PID} = BlockingCall('MSwitch_spektralDurchlauf',$hash->{NAME},'MSwitch_spektralDurchlaufend',10,'','');} 6337
2019.01.28 09:43:50 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {my $test;my @test1;my $akttodo;my $kommand ;my $kommand1 ;$test = ReadingsVal( 'led_kette', 'todo', '' );$akttodo = ReadingsVal( 'led_kette', 'todofirst', '' );@test1 = split(' ',$test); my $farbe = $test1[$akttodo];$kommand = "set wz.theke RGB ".$farbe;$kommand1 = "set HUEDevice2 rgb ".$farbe;fhem($kommand);fhem($kommand1);;$akttodo++;fhem("setreading led_kette todofirst $akttodo");if (ReadingsVal( 'led_kette', 'todoanz', '' ) < $akttodo){fhem("setreading led_kette todofirst 1");}} 6337
2019.01.28 09:43:50 3: wz.theke set HSV 0, 100, 100 with ramp: 0, flags:
2019.01.28 09:43:52 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> set MSwitch_Self exec_cmd_1 ID 1 6702
2019.01.28 09:43:52 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {my $test;my @test1;my $akttodo;my $kommand ;my $kommand1 ;$test = ReadingsVal( 'led_kette', 'todo', '' );$akttodo = ReadingsVal( 'led_kette', 'todofirst', '' );@test1 = split(' ',$test); my $farbe = $test1[$akttodo];$kommand = "set wz.theke RGB ".$farbe;$kommand1 = "set HUEDevice2 rgb ".$farbe;fhem($kommand);fhem($kommand1);;$akttodo++;fhem("setreading led_kette todofirst $akttodo");if (ReadingsVal( 'led_kette', 'todoanz', '' ) < $akttodo){fhem("setreading led_kette todofirst 1");}} 6337
2019.01.28 09:43:52 3: wz.theke set HSV 2, 100, 100 with ramp: 0, flags:
2019.01.28 09:43:54 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> set MSwitch_Self exec_cmd_1 ID 1 6702
2019.01.28 09:43:54 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {my $test;my @test1;my $akttodo;my $kommand ;my $kommand1 ;$test = ReadingsVal( 'led_kette', 'todo', '' );$akttodo = ReadingsVal( 'led_kette', 'todofirst', '' );@test1 = split(' ',$test); my $farbe = $test1[$akttodo];$kommand = "set wz.theke RGB ".$farbe;$kommand1 = "set HUEDevice2 rgb ".$farbe;fhem($kommand);fhem($kommand1);;$akttodo++;fhem("setreading led_kette todofirst $akttodo");if (ReadingsVal( 'led_kette', 'todoanz', '' ) < $akttodo){fhem("setreading led_kette todofirst 1");}} 6337
2019.01.28 09:43:54 3: wz.theke set HSV 5, 100, 100 with ramp: 0, flags:
2019.01.28 09:43:57 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> set MSwitch_Self exec_cmd_1 ID 1 6702
2019.01.28 09:43:57 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {my $test;my @test1;my $akttodo;my $kommand ;my $kommand1 ;$test = ReadingsVal( 'led_kette', 'todo', '' );$akttodo = ReadingsVal( 'led_kette', 'todofirst', '' );@test1 = split(' ',$test); my $farbe = $test1[$akttodo];$kommand = "set wz.theke RGB ".$farbe;$kommand1 = "set HUEDevice2 rgb ".$farbe;fhem($kommand);fhem($kommand1);;$akttodo++;fhem("setreading led_kette todofirst $akttodo");if (ReadingsVal( 'led_kette', 'todoanz', '' ) < $akttodo){fhem("setreading led_kette todofirst 1");}} 6337
2019.01.28 09:43:57 3: wz.theke set HSV 7, 100, 100 with ramp: 0, flags:
2019.01.28 09:43:59 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> set MSwitch_Self exec_cmd_1 ID 1 6702
2019.01.28 09:43:59 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {my $test;my @test1;my $akttodo;my $kommand ;my $kommand1 ;$test = ReadingsVal( 'led_kette', 'todo', '' );$akttodo = ReadingsVal( 'led_kette', 'todofirst', '' );@test1 = split(' ',$test); my $farbe = $test1[$akttodo];$kommand = "set wz.theke RGB ".$farbe;$kommand1 = "set HUEDevice2 rgb ".$farbe;fhem($kommand);fhem($kommand1);;$akttodo++;fhem("setreading led_kette todofirst $akttodo");if (ReadingsVal( 'led_kette', 'todoanz', '' ) < $akttodo){fhem("setreading led_kette todofirst 1");}} 6337
2019.01.28 09:43:59 3: wz.theke set HSV 9, 100, 100 with ramp: 0, flags:
2019.01.28 09:44:01 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> set MSwitch_Self exec_cmd_1 ID 1 6702
2019.01.28 09:44:01 3: led_kette MSwitch_Restartcm: Befehlsausfuehrung -> {my $test;my @test1;my $akttodo;my $kommand ;my $kommand1 ;$test = ReadingsVal( 'led_kette', 'todo', '' );$akttodo = ReadingsVal( 'led_kette', 'todofirst', '' );@test1 = split(' ',$test); my $farbe = $test1[$akttodo];$kommand = "set wz.theke RGB ".$farbe;$kommand1 = "set HUEDevice2 rgb ".$farbe;fhem($kommand);fhem($kommand1);;$akttodo++;fhem("setreading led_kette todofirst $akttodo");if (ReadingsVal( 'led_kette', 'todoanz', '' ) < $akttodo){fhem("setreading led_kette todofirst 1");}} 6337
2019.01.28 09:44:01 3: wz.theke set HSV 12, 100, 100 with ramp: 0, flags:
Da ist noch ein Befehl zum testen von mir drinnen .... siehe Bild. Den Befehl zum schalten der hue kannst du dort rausnehmen.
Kurz da mobil
Gruss Byte09
(https://uploads.tapatalk-cdn.com/20190128/95e6a004fb60db7d2bccada9ae87d398.jpg)
Gesendet von meinem SM-G900F mit Tapatalk
Da kommen so sehr viele log ausgaben . Setzt im Device das Attribut verbose mal auf 1 um das etwas einzudämmen.
Mswitch im fhemwiki
https://wiki.fhem.de/wiki/MSwitch (https://wiki.fhem.de/wiki/MSwitch)
Gesendet von meinem SM-G900F mit Tapatalk
Ah, funktioniert jetzt!
Eine dumme Frage noch, was bedeutet "Takt" und "Änderung" genau bzw. was bewirken die?
Zitat von: grossmaggul am 28 Januar 2019, 13:06:53
Ah, funktioniert jetzt!
Eine dumme Frage noch, was bedeutet "Takt" und "Änderung" genau bzw. was bewirken die?
Takt habe ich einfach mal den Abstand zwischen den befehlen benannt . Alle x Sekunden eine farbänderung.
Änderung sind die Schritte in deiner sub , die er immer beim hoch oder runterzählen der farbcodes nimmt . Kannst du im Attribut webcmd laben umbenennen.
"Änderung" greift immer nur einmal beim Start des mswitch es, die Sekunden kannst du während des Laufes ändern.
Gruss Byte09
Gesendet von meinem SM-G900F mit Tapatalk
O.K., alles klar, vielen Dank für Deinen Einsatz!!
Freut mich. In das mswitch einfach mal rein arbeiten falls du es anderweitig nutzt. ( dieses hier ist schon sehr speziell )
Bei Fragen gerne im entsprechenden the melden.
Gruss Byte09
Gesendet von meinem SM-G900F mit Tapatalk
ZitatIn das mswitch einfach mal rein arbeiten falls du es anderweitig nutzt.
Bisher kannte ich das ja noch gar nicht, im Moment fällt mir auch nix ein wofür ich das nocht gebrauchen könnte, aber ich halte es auf jeden Fall mal im Hinterkopf.