Hallo
Ich suche eine Möglichkeit Dummys in zufälliger Reienfolge automatisch zu schalten.
Ich habe 3 und 3 Dummys.
Zitatdefine Test_Dummy_1 Dummy
define Stop_Test_Dummy_1 Dummy
define Stop_Test_Dummy_2 Dummy
define Stop_Test_Dummy_3 Dummy
Drei davon werden mit einem DOIF gesteuert
Eines ist der Auslöser dazu.
Zitatdefine Test_Stop_DOIF DOIF
([Test_Dummy_1:state]) (set Stop_Test_Dummy_[123] on) (set Stop_Test_Dummy_1 off) (set Stop_Test_Dummy_2 off) (set Stop_Test_Dummy_3 off)
attr Test_Stop_DOIF do resetwait
attr Test_Stop_DOIF wait 0,5,5,5
So werden die Befehle nacheinander abgearbeitet.
Ich möchte aber nur das der erste Befehl gemacht wird und der Rest in zufälliger Reienfolge.
Im Moment sind es nur Drei Dummys später werden es dann aber mehr, die ich in zufälliger Reienfolge Steuern möchte.
Du könntest es mittels vorangestelltem
sleep {(int(rand(5)))};
vor jedem set lösen.
Das würde ich mit einer Funktion in der 99_myUtils.pm lösen.
Als Pseudocode:
Array[<alle Dummies>]
Solange das Array Elemente enthält
Ziehe und entferne ein zufälliges Arrayelement aus Array
set <Inhalt gezogenes Arrayelement> off
Danke für die Antwort.
ZitatArray[<alle Dummies>]
Solange das Array Elemente enthält
Ziehe und entferne ein zufälliges Arrayelement aus Array
set <Inhalt gezogenes Arrayelement> off
Da verstehe ich im Moment leider nicht.
Zitat von: Damu am 16 Dezember 2015, 18:53:57
Hallo
Ich suche eine Möglichkeit Dummys in zufälliger Reienfolge automatisch zu schalten.
Ich habe 3 und 3 Dummys.
Drei davon werden mit einem DOIF gesteuert
Eines ist der Auslöser dazu.
So werden die Befehle nacheinander abgearbeitet.
Ich möchte aber nur das der erste Befehl gemacht wird und der Rest in zufälliger Reienfolge.
Im Moment sind es nur Drei Dummys später werden es dann aber mehr, die ich in zufälliger Reienfolge Steuern möchte.
Das könntest du mit mehreren DOIFs machen:
define Test_Stop_DOIF DOIF ([Test_Dummy_1:state]) (set Stop_Test_Dummy_[123] on, set Dummy_trigger on)
define Test_Stop_1 DOIF ([Dummy_trigger:?]) (set Stop_Test_Dummy_1 off)
attr Test_Stop_1 wait rand(10)
attr Test_Stop_1 do always
define Test_Stop_2 DOIF ([Dummy_trigger:?]) (set Stop_Test_Dummy_2 off)
attr Test_Stop_2 wait rand(10)
attr Test_Stop_2 do always
usw.
Gruß
Damian
ZitatArray[<alle Dummies>]
Solange das Array Elemente enthält
Ziehe und entferne ein zufälliges Arrayelement aus Array
set <Inhalt gezogenes Arrayelement> off[/quote
Ich denke ich weiss wie das gemeint ist.
Eine Liste mit allen Möglichkeiten erstellend:
Zitat1= $a=1,$b=2,$c=3
2=$a=1,$b=3,$c=2
...............
...............
Die Zufallszahlen gibt dann die Zeile welche den Dummy mit der Verzögerung füllt.
Gibt es da Beispiele wie das umgesetzt wird?
Die anderen beiden Methoden hab ich beide getestet.
Gehen beide aber eben manchmal gehen zwei Dummy miteinander aus.
Danke für die Hilfe.
Ich dachte eher an ein Array mit Dummynamen aus dem Du zufällig Namen ziehst und einen set Befehl mit dem Dummynamen ausführst. Und das solange bis kein Name mehr im Array ist.
my @DN = ("Dummy_1", Dummy_2", ...)
und dann eine Ziehung ohne zurücklegen, wie hier http://perl-howto.de/2008/06/zufallszahlen-pseudo-random-nu.html (http://perl-howto.de/2008/06/zufallszahlen-pseudo-random-nu.html)
So könnte die Sub aussehen:
sub random($) {
my @devices = split(" ", shift);
foreach (@devies){
my $sleep = rand(10);
fhem("sleep $sleep;; set $_ off");
}
}
Aufrum im DOIF dann
random("dummy1 dummy2 dummy3")
@igami: Wenn von 10 Namen einer zufällig 2 x gezogen wird, dann wird 1 Dummy nicht geschaltet. Das kannst Du nur durch "ziehen und nicht zurücklegen" sicherstellen.
Edit: Es geht nicht um zufällige Zeitabstände sondern um zufällige Reihenfolge, insofern trifft das Geschriebene nicht auf Dein Beispiel zu.
ZitatIch suche eine Möglichkeit Dummys in zufälliger Reienfolge automatisch zu schalten.
stimmt, dann eben
sub random($) {
my @devices = split(" ", shift);
my $count = int(@devices);
for(my $i = 0; $i < $count ; $i++) {
my $rnd = int(rand(@devices));
my $sleep = 3 * $i;
fhem("sleep $sleep; set $devices[$rnd ] off");
splice @devices, $rnd, 1;
}
}
Hallo
Danke für die Autworten.
Krieg das Beispiel aber leider nicht zum laufen.
Zitatrandom("dummy1 dummy2 dummy3"): Unknown command random("dummy1, try help
Hab die Fehlermeldung weg.
Beim Aufruf der sub stürzt mein Fhem aber ab.
Schade.
Hallo Damu,
Zitat
Perlbefehle müssen zusätzlich in geschweifte Klammern gesetzt werden: ... ({system ("wmail Peter is at home")})
hatte ich vergessen.
Habe grad ein DOIF mit folgender DEF geschrieben und funktioniert wie erwartet
([dummy1] eq "off")
({random("dummy2 dummy3 dummy4")})
DOELSEIF([dummy1] eq "on")
(set dummy[2-4] on)
Hallo
Hab es nun auch hingekriegt.
Vielen Dank, geht genial.
Gibt mir im Log aber immer eine Fehlermeldung im Log:
Zitat2015.12.29 17:17:05 5: Cmd: >{randomon("D_Store1 D_Store2 D_Store3 D_Store4 D_Store5")}<
2015.12.29 17:17:05 5: Cmd: >sleep 0<
2015.12.29 17:17:05 4: sleeping for 0
2015.12.29 17:17:05 1: WARNING: sleep without additional commands is deprecated and blocks FHEM
Hallo
Ich hab den Code mal so geändert das es mir keine Fehlermeldung mehr gibt.
sub random($) {
my @devices = split(" ", shift);
my $count = int(@devices);
for(my $i = 0; $i < $count ; $i++) {
my $rnd = int(rand(@devices));
my $sleep = 3 * $i + 1;
fhem("sleep $sleep; set $devices[$rnd ] off");
splice @devices, $rnd, 1;
}
}
So geht es 1 Sek bis der 1 Dummy ausschaltet, 3+1=4 Sek bis der 2 Dummy aus geht, 3+3+1=7 Sek bis der 3 Dummy aus geht.
In habe mir auch eine sub "randomon", zum einschalten und ein randomoff", zum auschalten gemacht.
Da hab ich 65 Sekunden Verzögerung eingetragen.
Somit gehen bei mir die Storen mit einer verzögerung von 65 Sek zufällig nacheinander am abend Ab und am morgen Auf.
Vielen dank an "igami" für die Sub.
Du könntest on/off auch noch als argument übergeben, dann brauchst du nur eine sub
sub random($$) {
my @devices = split(" ", shift);
my $command = shift;
my $count = int(@devices);
for(my $i = 0; $i < $count ; $i++) {
my $rnd = int(rand(@devices));
my $sleep = 3 * $i + 1;
fhem("sleep $sleep; set $devices[$rnd ] $command");
splice @devices, $rnd, 1;
}
}
ZitatDu könntest on/off auch noch als argument übergeben, dann brauchst du nur eine sub
Wie sieht dann die Befehlszeile aus?
Zitat({random("dummy2 dummy3 dummy4:on")})
??
Die sieht dann so aus
{random("dummy2 dummy3 dummy4", "on")}