DOIF: Umstellung von Notify auf DOIF mit attr wait

Begonnen von boeho, 26 September 2017, 18:59:50

Vorheriges Thema - Nächstes Thema

boeho

Hallo,
ich brauche etwas Hilfe. Ich möchte folgendes Skript umstellen und habe 2 probleme dabei.
Ich komme nicht klar mit den Klammern {} für Perl
und möchte die Waitzeit von DOIF auslesen und eine Meldung versenden, in der das Ereignis mit Zeitpunkt angekündigt wird:

define notify_tele_send notify TelegramSend:Jalousie_down {\
Log(3,"=========01 in notify_tele_send:'$EVENT' ========");;\
my $anwesend=Value("JEMAND_ZU_HAUSE");;\
{Log 3,"=== 02 in notify_tele_send anwesend:'$anwesend' ==="};;\
my ($vsec, $vmin, $vhour, $vday, $vmon, $vyear) = localtime(time     +     245   );;\
$vyear=$vyear+1900;;\
$vmon =$vmon+1;;\
$vhour = substr("00".$vhour,-2);;\
$vmin  = substr("00".$vmin,-2);;\
$vsec  = substr("00".$vsec,-2);;\
my $vstamp= "'" . " " . $vhour  . ":" . $vmin  . ":" . $vsec  . "'";;\
{Log 3,"=== 03 in notify_tele_send verzoegert:'$vstamp' ==="};;\
if ($anwesend eq "ja") {\
#Variablen für Zeit- und Datumsangaben in FHEM: $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst, $week, $hms, $hm, $md, $ymd;;\
my $stamp = sprintf '%02d-%02d-%02d %02d:%02d:%02d', $year, $month, $mday, $hour, $min, $sec;;\
{Log 3,"=== 04 in notify_tele_send ddmmyyyy:'$stamp' ==="};;\
fhem("set telebotdevice send \@TB $stamp Jalousien ZU in wenigen Minuten um $vstamp '\/cmd' fuer Hilfe");;\
fhem("set telebotdevice send \@HB $stamp Jalousien ZU in wenigen Minuten um $vstamp '\/cmd' fuer Hilfe");;\
fhem("set DreamBox showText $stamp 3 Die Jalousien schliessen in wenigen Minuten");;\
}\
}


Ich möchte dieZahl 245 durch das entsprechende xx vom 'attr wait xx' ersetzen, wenn das geht.
Wie muss man die Klammern setzen, damit man Variable definieren und benutzen kann, das auch if Befehle funktionieren, ähnlich wie hier im notify.

Schon mal Dank.

Amenophis86

Du willst dieses Script jetzt komplett auf DOIF umstellen? Dann musst du wait nicht auslesen, sondern es einfach nur setzen. Das wait auslesen kommt auf dein wait noch an, dies hat sowohl : als auch , als Trenner. Daher ist die Frage für welchen Befehl du das wait auslesen willst.

Vorschlag:
Poste mal deinen Umbau bzw. dein DOIF hier und wir schauen gemeinsam wo die Probleme liegen, dass dein DOIF so klappt, wie es soll :)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

CoolTux

Warum will man dieses umfangreiche notify in ein DOIF wandeln?

Ich würde aus dem Notify eine Sub in der 99_myUtils machen und die Sub über das Notify aufrufen lassen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Amenophis86

Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

boeho

Ich kann es so lassen, es funktioniert seit einiger Zeit.
Ein Dummy für die Verzögerung geht auch, das macht dann Value().
Vielleicht kann der Entwickler den Wert in ein Reading speichern? Nur so eine Idee.
Für viel mehr reichen meine Perl-Kenntnisse momentan nicht.
Vielen Dank für Eure Antworten.

Amenophis86

Welcher Entwickler soll welchen Wert in ein Reading schreiben?

Alternativ schreib dir einfach selbst ein Reading mit userreadings bzw. dem setreading Befehl
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

boeho

ok, habe mich wohl falsch ausgedrückt.
Ich meine folgendes, vielleicht erklärt das meine Frage besser:
define xx doif (...) (
)
attr xx wait 123

Nun möchte ich nicht in allen Notify oder .pm  die Zahl 123 ändern (bei Bedarf), sondern mit irgendeinem Befehl den Wert ermitteln für xx.
Ich habe keine Ahnung wie, aber gehen müsste es doch?

Amenophis86

setz den Wert in ein Device deiner Wahl mittels
setreading <device> <NameFürDasReading> <Wert>

das kannste in ein Dummy oder jedes andere Device deiner Wahl schreiben. Ausgelesen wird dann ganz normal in Perl mittels
ReadingsVal("<device>","<NameDesReadings>","<defaultWert>") oder mittels
[<device>:<NameDesReadings>] in DOIF bzw. da wo setmagic geht (https://fhem.de/commandref_DE.html#set)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Wzut

Zitat von: boeho am 27 September 2017, 12:11:00
define xx doif (...) (
)
attr xx wait 123

Nun möchte ich nicht in allen Notify oder .pm  die Zahl 123 ändern (bei Bedarf), sondern mit irgendeinem Befehl den Wert ermitteln für xx.
Ich habe keine Ahnung wie, aber gehen müsste es doch?

my $wait = AttrVal("xx","wait",0);
wobei xx der Name deines DOIF ist und die 0 der defaultwert wenn attr xx wait gar nicht definiert ist.
um bei deinem notify zu bleiben ersetze in deinem notify die +245 durch + AttrVal("xx","wait",0)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Amenophis86

Habe mir jetzt nochmal deinen ersten Post angesehen, du möchtest also NUR den Wert aus einem DOIF in das Perl Script einbauen und nicht das Ganze Ding in ein DOIF umbauen?

Wenn dem so sein sollte, dann so, wie von Wzut geschrieben. Aber beachte, dass das attr wait dann auch nur 245 sein darf und nicht anders gesetzt. Das Attr wait kann ja für mehrere Ausführungen gelten und kann dann mal schnell "245:0,1" oder so aussehen, je nachdem, wie du das attr gesetzt hast.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

boeho

An Wzut (Antwort #9): Perfekt, es geht und habe jetzt wieder etwas begriffen, was in der commandref steht. Danke

An Amenophis86 (Antwort #10): Ursprünglich wollte ich das Notify auf DOIF umstellen - auch um etwas zu lernen und probieren.
ZitatAber beachte, dass das attr wait dann auch nur 245 sein darf und nicht anders gesetzt. Das Attr wait kann ja für mehrere Ausführungen gelten und kann dann mal schnell "245:0,1" oder so aussehen, je nachdem, wie du das attr gesetzt hast.
ich denke, das kann es nur einmal geben. Es ist doch eine Kombination 'Device und WAIT'. Oder verstehe ich etwas nicht richtig??

Amenophis86

Es ist richtig, dass es das attr pro Device nur einmal geben kann. Aber wenn du in einem DOIF mehrere Ausführungsteile hast zB:

DOIF (wenn...)
(dann1...)
(dann2...)
DOELSEIF (wenn...)
(dann3...)
DOELSE
(dann4...)


Dann kann dein wait wie folgt aussehen:
attr <device> wait 0,10:15:1

=> dann1 sofort ausführen, dann2 nach 10 sek ausführen, dann3 nach 15 sek ausführen, dann4 nach 1 sek ausführen.

Sollte dein wait attr nun so aussehen im DOIF und du es in dein Perl mittels AttrVal() abfragst bekommst du als Antwort natürlich auch "0,10:15:1".

Das Ganze war nur als Info gedacht und dürfte in deinem Fall ja nicht sein, wenn du nur 254 im wait attr eingibst.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

boeho

Da haben wir wohl das gleiche gemeint. ich habs nur falsch verstanden. Die Zeile mit dem device namen und dem wait gibt es nur einmal.
Es kann aber auch noch zusätzlich ein Split notwendig werden.
Ok. Dank an alle und auch für die schnelle Hilfe.