Hallo, ich habe 2 notifys die ich gerne zusammenfügen möchte. Leider stimmt die Syntax nicht. Jeder Teil funktioniert für sich alleine problemlos. Der erste Teil ist ein notify, getriggert von einem Bewegungsmelder und ruft eine sub {date_time} auf.
1.Teil (Ansage von Datum und Zeit)
BM_WZ:motion:.on.* {
{date_time};
{fhem("attr Guten_Morgen disable 1")}
}
Die sub:
##############################################
package main;
use strict;
use warnings;
use POSIX;
use CGI::Carp qw(fatalsToBrowser);
sub
myoutdateUtils_Initialize($$)
{
my ($hash) = @_;
}
sub date_time()
{
my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat,
$Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
my $CTIME_String = localtime(time);
$Monat += 1;
$Jahrestag += 1;
$Jahr += 1900;
my @Wochentage = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);
my @Monatsnamen = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);
my $datum_2 = sprintf("Hallo,guten Tag, heute ist %s der %2d. %s %04d",
$Wochentage[$Wochentag],
$Monatstag,
$Monatsnamen[$Monat-1],
$Jahr,
);
my $zeit_1 = sprintf("Es ist %02d:%02d Uhr",
$Stunden,
$Minuten,
);
#return $datum_2;
#my ($datum_2) = @_;
fhem "set androidTablet ttsSay $datum_2, $zeit_1";
#return $datum_2;
}
1;
Die sub gibt das aktuelle Datum und die Zeit mittels ttsSay auf dem Tablet aus und funktioniert.
Der 2.Teil gibt die aktuelle Temperatur vom Garten ebenfalls auf dem Tablet aus, funktioniert auch problemlos.
2.Teil (Temperaturansage Garten):
{say ("Die aktuelle Temperatur im Garten beträgt " . ReadingsVal("Temperatur_Garten","temperature","Fehler")." Grad") }
{say} ist ebenfalls eine sub
sub say($)
{
my ($msg) = @_;
fhem "set androidTablet ttsSay $msg";
}
Funktioniert alleine ebenfalls.
Wenn ich aus beiden Schnipseln folgendes mache, funktioniert nur der 1. Teil aber der 2. wird nicht ausgeführt:
Teil 1 und 2 zusammen:
BM_WZ:motion:.on.* {
{date_time};
{fhem("attr Guten_Morgen disable 1")};
{say ("Die aktuelle Temperatur im Garten beträgt " . ReadingsVal("Temperatur_Garten","temperature","Fehler")." Grad") }
}
Wo liegt mein Denkfehler?
VG
Frank
Viel zuviele geschweifte Klammern im Codeblock Deines notify.
hallo betateilchen, ich habe jetzt etliche Varianten, mit Klammern, ohne Klammern, die beiden Codeteile getauscht und alles Mögliche versucht. Es wird immer nur der 1. Abschnitt und der Teil mit dem disable ausgeführt, der 3. Teil nicht. Im Log (verbose 5) findet sich auch nichts.
Log
2014.08.06 18:33:39.043 5: Triggering test_say_nfy
2014.08.06 18:33:39.044 4: test_say_nfy exec {{say ("Die aktuelle Temperatur im Garten beträgt " . ReadingsVal("Temperatur_Garten","temperature","Fehler")." Grad") };;
{fhem("attr test_say_nfy disable 1")};;
{date_time}
}
Dabei wird alles bis auf {date_time} ausgeführt, tausche ich die Reihenfolge {date_time} als ersten Teil und say... an 3. Stelle, wird {date_time} ausgeführt und der say... Teil nicht mehr.
Langsam gehen mir die Ideen aus.
BM_WZ:motion:.on.* {
my $temp=ReadingsVal('Temperatur_Garten','temperature','Fehler');
date_time;
fhem("attr Guten_Morgen disable 1");
say ("Die aktuelle Temperatur im Garten beträgt $temp Grad");
}
Hallo,
wozu soll das
BM_WZ:motion:.on.* BM_WZ:motion:.on.* {
gut sein?
Einmal genügt doch oder nicht?
BM_WZ:motion:.on.* {
Grüße
@Puschel
Ist beim copy&paste passiert, steht nur einmal drinne
@marvin78
Geht leider auch nicht, auf die Idee dem Reading einen String zuzuweisen war ich auch schon gekommen.
VG
Frank
Hallo,
sorry aber so ganz schlau werde ich aus dem nicht:
Zitat von: franky08 am 06 August 2014, 18:38:56
hallo betateilchen, ich habe jetzt etliche Varianten, mit Klammern, ohne Klammern, die beiden Codeteile getauscht und alles Mögliche versucht. Es wird immer nur der 1. Abschnitt und der Teil mit dem disable ausgeführt, der 3. Teil nicht. Im Log (verbose 5) findet sich auch nichts.
Log
2014.08.06 18:33:39.043 5: Triggering test_say_nfy
2014.08.06 18:33:39.044 4: test_say_nfy exec {{say ("Die aktuelle Temperatur im Garten beträgt " . ReadingsVal("Temperatur_Garten","temperature","Fehler")." Grad") };;
{fhem("attr test_say_nfy disable 1")};;
{date_time}
}
Dabei wird alles bis auf {date_time} ausgeführt, tausche ich die Reihenfolge {date_time} als ersten Teil und say... an 3. Stelle, wird {date_time} ausgeführt und der say... Teil nicht mehr.
Langsam gehen mir die Ideen aus.
Was tauscht du wann wo und was geht dann vorher und dann nichtmehr?
Grüße
P.S.: Sorry aber ich bin nicht so helle wie andere das ich das auf Anhieb kapier.
Das:
define n_Testdummy notify EG_Schalter:.* {
if ($EVENT eq "Test_1") {
date_time;
}
}
mit diesem Teil in der 99_MyUtils.pm
sub date_time() {
my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat,
$Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
my $CTIME_String = localtime(time);
$Monat += 1;
$Jahrestag += 1;
$Jahr += 1900;
my @Wochentage = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);
my @Monatsnamen = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);
my $datum_2 = sprintf("Hallo,guten Tag, heute ist %s der %2d. %s %04d",
$Wochentage[$Wochentag],
$Monatstag,
$Monatsnamen[$Monat-1],
$Jahr,
);
my $zeit_1 = sprintf("Es ist %02d:%02d Uhr",
$Stunden,
$Minuten,
);
#return $datum_2;
#my ($datum_2) = @_;
fhem Log(3,"$datum_2, $zeit_1");
#return $datum_2;
}
liefert im Log das:
Zitat2014.08.06 19:47:01 3: Hallo,guten Tag, heute ist Mittwoch der 6. August 2014, Es ist 19:47 Uhr
Use of uninitialized value $cmd in pattern match (m//) at fhem.pl line 821.
Zumindest bei mir - ja, ich hab mir die Zeit genommen und deine Codes in meine Testumgebung eingebaut und umgebaut.
Ich versteh den Teil von dir aber leider immer noch nicht - sorry :-[
Ersetze mal
fhem Log(3,"$datum_2, $zeit_1");
durch
Log 3, $datum_2.", ".$zeit_1;
P.S.: Mein Code oben kommt aus dem DEF Bereich im Frontend.
Hallo Puschel
Use of uninitialized value $cmd in pattern match (m//) at fhem.pl line 821.
wurde heute im Forum schon erwähnt. Ich habe diese Fehlermeldung nicht (letztes update am WE)
Mit getauscht meine ich das das gesamte notify ja aus 3 Teilen besteht, einmal {date_time) welches die sub aufruft und die Sprachausgabe von Datum/Zeit macht. Dann der 2. Teil say... welcher die sub say aufruft und die aktuelle Temperatur als Sprachausgabe macht und der 3. Teil attr......disable 1, welcher nach Ausführung das notify deaktiviert.
Ausgeführt wird
immer nur eine sub also say, wenn es an erster Stelle im notify steht oder {date_time} wenn es an erster Stelle im notify steht. Das attr.....disable 1 wird hingegen
immer ausgeführt.
Obwohl laut Log alles aufgerufen wird!
ZitatLog
Code: [Auswählen]
2014.08.06 18:33:39.043 5: Triggering test_say_nfy
2014.08.06 18:33:39.044 4: test_say_nfy exec {{say ("Die aktuelle Temperatur im Garten beträgt " . ReadingsVal("Temperatur_Garten","temperature","Fehler")." Grad") };;
{fhem("attr test_say_nfy disable 1")};;
{date_time}
}
VG
Frank
Du hast aber immernoch zu viele Klammern drin und auch zu viele ;; (zumindest sieht es so aus / im DEF-Bereich müssen ; nicht generell verdoppelt werden).
Das hier:
BM_WZ:motion:.on.* {
my $temp=ReadingsVal('Temperatur_Garten','temperature','Fehler');
date_time;
fhem("attr Guten_Morgen disable 1");
say ("Die aktuelle Temperatur im Garten beträgt $temp Grad");
}
sollte in Kombination mit der Änderung in der date_time sub:
ZitatErsetze mal
Code: [Auswählen]
fhem Log(3,"$datum_2, $zeit_1");
durch
Code: [Auswählen]
Log 3, $datum_2.", ".$zeit_1;
funktioneren (falls der Rest der sub korrekt ist).
Das ist aus dem Log, also so, wie es in der fhem.cfg steht, deshalb die doppeltem;;
PS. Bei solchen kniffligen Sachen arbeite ich immer in der DEF, spart schonmal etliche / Fehler
Ich sehe auch die Sprachausgabe in date_time nicht.
Zwei Sprachausgaben hintereinander können oft ohnehin nicht verarbeitet werden. Man sollte den gesamten Text in einer unterbringen um Timeouts zu vermeiden.
Du siehst dir Puschels Testumbebung an, deshalb Log3... Um es zu testen, meine originale Utils steht oben im ersten Post, mit Sprachausgabe.
Hallo,
sorry aber wenn ich Codes poste mit define vorne dran kommen die immer aus notepad++
Eingefügt werden die dann über die Befehlszeile und nur per DEF bearbeitet.
Grüße
Das ändert nichts an meiner Aussage hier:
ZitatZwei Sprachausgaben hintereinander können oft ohnehin nicht verarbeitet werden. Man sollte den gesamten Text in einer unterbringen um Timeouts zu vermeiden.
Versuche den gesamten Text in EINER Sprachausgabe unterzubringen (Bspw alles in der sub date_time in einer Variable $text zusammenfassen und dann ausgeben).
Habe jetzt alles in folgende sub gepackt und das funktioniert sofort, hätte ich gleich machen sollen ???
Die neue Utils:
##############################################
package main;
use strict;
use warnings;
use POSIX;
use CGI::Carp qw(fatalsToBrowser);
sub
myoutdateUtils_Initialize($$)
{
my ($hash) = @_;
}
sub date_time()
{
my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat,
$Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
my $CTIME_String = localtime(time);
$Monat += 1;
$Jahrestag += 1;
$Jahr += 1900;
my @Wochentage = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);
my @Monatsnamen = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);
my $datum_2 = sprintf("Hallo,guten Tag, heute ist %s der %2d. %s %04d",
$Wochentage[$Wochentag],
$Monatstag,
$Monatsnamen[$Monat-1],
$Jahr,
);
my $zeit_1 = sprintf("Es ist %02d:%02d Uhr",
$Stunden,
$Minuten,
);
my $temp=ReadingsVal('Temperatur_Garten','temperature','Fehler');
#return $datum_2;
#my ($datum_2) = @_;
fhem "set androidTablet ttsSay $datum_2, $zeit_1, Die aktuelle Temperatur im Garten beträgt $temp Grad";
#return $datum_2;
}
1;
Denke auch das es ein Timing Problem mit 2 hintereinander aufgerufenen Textausgaben war