[Gelöst] structure und dynamisches async_delay

Begonnen von daedalus0815, 02 Oktober 2017, 10:06:10

Vorheriges Thema - Nächstes Thema

daedalus0815

Hallo liebe FHEM-Fans !

...das ist mein erster Beitrag....ich hoffe, hier keine Eulen nach Athen zu tragen.

Allgemeines:
Seit 2 Jahren setze ich FHEM ein und realisierte damit bisher die Steuerung von:
Luft-Entfeuchter mit dewpoint, Heizungspumpen, Alarmanlage mit email, Garagentor, Beleuchtungsszenarien ....
......alles mit Raspi u. ZWAVE-Modul und Steckdosen/Unterputzschaltern.....ich bin begeistert, einfach super !!
Mit Floorplan klappt's auch mit dem WAF ...alles sehr smart....
Bisher habe ich in euren Foren sehr viel lernen dürfen !!... und der Lernaufwand hat sich wirklich gelohnt !
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Jetzt zu meinem STRUCTURE - Problemchen.....:
    FHEM-Latest Revision: 15154

Ich benutzte bisher async_delay mit "int(rand(60))" ......und erhalte nun mit letztem Update folgende Fehlermeldungen:

PERL WARNING: Argument "(20+int(rand(30)) )" isn't numeric in addition (+) at ./FHEM/98_structure.pm line 442, <FH> line 11645.
PERL WARNING: Argument "(20+int(rand(30)) )" isn't numeric in addition (+) at ./FHEM/98_structure.pm line 460, <FH> line 11645.

DANKE

rudolfkoenig

https://fhem.de/commandref.html#async_delay:
Zitatasync_delay
If this attribute is defined, unfiltered set commands will not be executed in the clients immediately. Instead, they are added to a queue to be executed later. The set command returns immediately, whereas the clients will be set timer-driven, one at a time. The delay between two timercalls is given by the value of async_delay (in seconds) and may be 0 for fastest possible execution.

Von einer Ausfuehrung des Arguments als perl Expression war da nie die rede.
-> es werden nur Zahlen (gerne mit Nachkommastellen) erwartet, und als Sekunde interpretiert.

daedalus0815

Danke für die unmittelbare Info & Arbeit !

Ich bin mittlerweile auf LightScene aufmerksam geworden, dort wird mein "30+int(rand(60)) -Verhalten" scheinbar unterstützt.

Viele Grüße

daedalus0815

Hallo FHEM-Gemeinde,
.....wenn ich doch noch zu meinem Ziel komme, teile ich ja auch gerne.

Nicht elegant, aber vielleicht hat einer ja ein ähnliches Problem mit anderen Attributen....

Ich habe es leider nicht geschafft, asyn_delay DIREKT mit den Ergebnissen meiner Funktion zu
bedaten, aber  eine  "...duch die Brust ins Auge" - Lösung gefunden.

Mit LightScene bin ich leider doch nicht zufrieden, wegen on-for-timer etc.....
-------------------------------------------------------------------------------------------------------------

.....mein Workaround:


1........:

In 99_myUtils.pm folgende Funktion aufnehmen und neu einlesen "reload 99_myUtils.pm" oder "shutdown restart"....:


# Zufälligen Offset auf gegebene Sekunden addieren
# zur Realisierung von async_delay=30+int(rand(40)) bei structure

sub
sek_random_offset{

  # Start-Sekunden in Variable holen (i.B.30)
  my ($sekunden) = shift;

  # Sekunden-Offset (in Sekunden) in Variable holen (i.B.40)
  my ($offsetsekunden) = shift;

  my ($t) = 0;
  $t = int(rand($offsetsekunden)) + $sekunden;

  # Rückgabe....
  return $t;
};




2.....:

Dann ein DOIF definieren, um async_delay meiner Frühstücks-Struktur zu manipulieren...

defmod Fruestueck_mydelay_di DOIF
([Fruehstueck:"off"] or [$SELF:"on"])
( setreading $SELF mydelay  {(sek_random_offset(30,60))}   )  ## async_delay - Wert lokal erzeugen...
( attr Fruehstueck async_delay [$SELF:mydelay]    )                 ## ...und Wert extern überführen
DOELSE
()

mit....:
attr Fruestueck_mydelay_di do always
attr Fruestueck_mydelay_di webCmd on off



=> Was passiert hier...:
Wenn alle meine Frühstückslampen OFF werden, wird im o.e. DOIF
, also in Fruestueck_mydelay_di, unter dem mydelay-Readings
ein zufällige Zahl zwischen 30....90 (90=30+60) erzeugt und abgelegt,
die dann folgend in meine Zielstruktur Fruehstueck überführt wird.


FHEM,  einfach toll  :)