DOIF Befehle in zufälliger Reihenfolge abarbeiten

Begonnen von Damu, 16 Dezember 2015, 18:53:57

Vorheriges Thema - Nächstes Thema

Damu

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.

igami

Du könntest es mittels vorangestelltem

sleep {(int(rand(5)))};

vor jedem set lösen.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Ellert

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

Damu

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.

Damian

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

Damu

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

Ellert

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

igami

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")
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Ellert

#8
@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.

igami

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;
  }
}
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Damu

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

igami

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)

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Damu

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




Damu

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.

igami

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;
  }
}
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED