[gelöst] DOIF - Wiederholung eines Unterprogramms

Begonnen von grossmaggul, 24 Januar 2019, 18:36:52

Vorheriges Thema - Nächstes Thema

Frank_Huber

#15
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.

rischbiter123

Moin,

nur mal dumm gefragt. Sollte dann nicht off im DOELSEIF stehen?

LG

Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

Frank_Huber

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. ;)

grossmaggul

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.
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Frank_Huber

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


grossmaggul

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.
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Frank_Huber

#21
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

grossmaggul

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
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Frank_Huber

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


grossmaggul

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.;)
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

grossmaggul

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?
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Byte09

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

grossmaggul

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.
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Byte09

#29
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.