FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: boeho am 26 September 2017, 18:59:50

Titel: DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: boeho am 26 September 2017, 18:59:50
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.
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: Amenophis86 am 27 September 2017, 06:49:20
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 :)
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: CoolTux am 27 September 2017, 06:55:14
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.
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: Amenophis86 am 27 September 2017, 07:57:49
Oder einfach so lassen, wenn es klappt :)
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: boeho am 27 September 2017, 10:11:43
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.
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: Amenophis86 am 27 September 2017, 10:45:11
Welcher Entwickler soll welchen Wert in ein Reading schreiben?

Alternativ schreib dir einfach selbst ein Reading mit userreadings bzw. dem setreading Befehl
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: boeho am 27 September 2017, 12:11:00
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?
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: Amenophis86 am 27 September 2017, 12:52:01
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)
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: Wzut am 27 September 2017, 12:59:44
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)
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: Amenophis86 am 27 September 2017, 13:54:54
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.
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: boeho am 27 September 2017, 14:17:46
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??
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: Amenophis86 am 27 September 2017, 14:40:27
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.
Titel: Antw:DOIF: Umstellung von Notify auf DOIF mit attr wait
Beitrag von: boeho am 27 September 2017, 14:52:48
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.