Doif Anzahl der Wiederholen variabel

Begonnen von NONO87, 26 Januar 2019, 17:08:48

Vorheriges Thema - Nächstes Thema

NONO87

Hallo,

Ich habe schon mehrere Suchbegriffe eingeben, aber noch nicht das richtige gefunden.

Folgendes:

Es soll an einen esp ein Set Befehl x mal gesendet werden. Die x wollte ich in einem dummy schreiben. Wenn dieser Wert sich ändert, dann soll das doif zuerst einen y Befehl der fest eingestellt ist senden.Dann soll der x Set Befehl so oft gesendet werden , bzw geteilt durch zwei, bis der wert x erreicht ist.

Ich hoffe man kann mit Folgen.

Besten Dank schonmal

Ellert

Das müsste im Zusammenspiel mit repeatcmd und repeatsame klappen. In repeatsame müsstest Du die Zahl der Wiederholungen reinschreiben oder die Berechnung direkt im Attribut durchführen, vor der Befehlsausführung.

Alternativ könntest Du Perl-DOIF verwenden, dann könntest Du die Häufigkeit über eine For-Schleife steuern.

NONO87

Ich bin noch nicht so gut im Thema. Wie kann ich denn den Wert dort reinschreiben?

Ellert

Fragst Du jetzt danach wie man ein Attribut setzt?

Wenn nicht, sollte es wie unter wait beschrieben funktionieren.

NONO87

ich bin jetzt einen schritt weiter

({([dummyesp2:test2])})
(attr espdoif repeatsame 0:15:{([dummyesp2:test2])})
(set ESPEasy_ESP_Easy_Indmfo longpulse_ms 4 0 100)
(set ESPEasy_ESP_Easy_Indmfo longpulse_ms 5 0 100)


Nur jetzt führt er alles nacheinader aus. Es sollte aber so sein das er den zweiten commadn erst 15 mal ausführt un dann den letzten x mal ausführt.

Wie mache ich das jetz am besten?

Ellert

#5
Ganze Befehlszweige trennst Du mit : und Befehlssequenzen mit ,
also wenn die Sequenzen einzeln wiederholt werden können dann so ((attr repeatsame 0,15,[dummyesp2:test2])).

das wird aber wahrscheinlich aus einem anderen Grund nicht funktionieren, weil Du das Attribut im gleichen Zweig setzt, es müsste vor der Befehlsausführung gesetzt werden. Du kanns die Berechnung im Attribut selbst durchführen.

Das ist keine DOIF-Syntax ({([dummyesp2:test2])})

Entweder so ([dummyesp2:test2]) oder bei indirekten Zeitangaben so ([[dummyesp2:test2]]), dann muss das Reading eine gültige Zeitangabe enthalten.

Etwa so
([dummyesp2:test2])
  (set ESPEasy_ESP_Easy_Indmfo longpulse_ms 4 0 100)
  (set ESPEasy_ESP_Easy_Indmfo longpulse_ms 5 0 100)

und das Attribut
attr espdoif repeatsame 15,[dummyesp2:test2]

NONO87

ZitatEtwa so
Code: [Auswählen]
([dummyesp2:test2])
  (set ESPEasy_ESP_Easy_Indmfo longpulse_ms 4 0 100)
  (set ESPEasy_ESP_Easy_Indmfo longpulse_ms 5 0 100)
und das Attribut
Code: [Auswählen]
attr espdoif repeatsame 15,[dummyesp2:test2]

Wenn ich das so eingebe, dann führt er beide cmd gleichzeitg aus und auch nur die Anzahl anch dem Komma, also dann in dem fall die variable Zahl.

Ellert

#7
Hast Du repeatcmd gesetzt?

Es kann aber sein, dass es grundsätzlich nicht funktioniert, weil die Wiederholungen und Begrenzungen nicht auf Sequenzen funktionieren, ich habe es nie versucht.

Dann bleibt aus meiner Sicht Perl-DOIF als Möglichkeit.

NONO87

Ich habe meiner Meinung nach alle Möglichkeiten durch. Und es hat  nicht funktioniert,  leider.

Gibt es eine einfache Lösung in Perl für mich?

Ellert

Ja.
Vorbereitend solltest Du Dir mal die Basics in einem Perl-Tutorial ansehen, die Perl-DOIF Beschreibung (fhem_set, set_Exec ) und die Beispiele in der deutschsprachigen Befehlsreferenz.
http://www.perltutorial.org/ (Variablendeklaration, for)

Dürfen die Befehle direkt nacheinander oder zeitversetzt nacheinander ausgeführt werden?


NONO87

Die Befehle dürfen direkt nacheinander folgen. Am Ende hängt ein esp der zwei npn schaltet

Ellert

Dann wird's wahrscheinlich so klappen
defmod multicmd DOIF {\
  fhem_set( "ESPEasy_ESP_Easy_Indmfo longpulse_ms 4 0 100");;\
  for (my $i=0;;$i<[dummyesp2:test2];;$i++){\
    fhem_set( "ESPEasy_ESP_Easy_Indmfo longpulse_ms 5 0 100");;\
  }\
}

Import für "Raw definition".

NONO87


([dummyesp:test])(
{
  fhem_set( "ESPEasy_ESP_Easy_Indmfo longpulse_ms 4 0 100");;
  for (my $i=0;;$i<[dummyesp:test];;$i++){
    fhem_set( "ESPEasy_ESP_Easy_Indmfo longpulse_ms 5 0 100");;
  }
})


Ich habe es jetzt so eingefügt.

Dann kommt der Fehler:
{   fhem_set( "ESPEasy_ESP_Easy_Indmfo longpulse_ms 4 0 100");;   for (my $i=0;;$i<4;;$i++){     fhem_set( "ESPEasy_ESP_Easy_Indmfo longpulse_ms 5 0 100");;   } }: Undefined subroutine &main::fhem_set called at (eval 2577637) line 1.

Ellert

Die Sub gibt es so nur in Perl-DOIF, sonst wahrscheinlich als DOIF::fhem_set(...) oder gleich fhem("set ...").

Performanter ist es nur Per-DOIF zu verwenden, bei  Deiner Definition wird 2x [dummyesp:test] evaluiert und hinter fhem_set() wird weniger evaluiert als hinter fhem().

Bei der Eingabe in den DEF-Editor müssen keine doppelten ; angegeben werden.