FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: franky08 am 06 August 2014, 10:47:48

Titel: [gelöst] 2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: franky08 am 06 August 2014, 10:47:48
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
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: betateilchen am 06 August 2014, 17:38:11
Viel zuviele geschweifte Klammern im Codeblock Deines notify.
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag 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.
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: marvin78 am 06 August 2014, 18:51:27

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");
}
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: Puschel74 am 06 August 2014, 18:53:42
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
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: franky08 am 06 August 2014, 19:00:06
@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
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: Puschel74 am 06 August 2014, 19:53:43
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  :-[
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: marvin78 am 06 August 2014, 20:06:57
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.
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: franky08 am 06 August 2014, 20:08:35
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
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: marvin78 am 06 August 2014, 20:14:13
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).
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: franky08 am 06 August 2014, 20:17:22
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
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: marvin78 am 06 August 2014, 20:18:06
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.
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: franky08 am 06 August 2014, 20:22:12
Du siehst dir Puschels Testumbebung an, deshalb Log3... Um es zu testen, meine originale Utils steht oben im ersten Post, mit Sprachausgabe.
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: Puschel74 am 06 August 2014, 20:23:32
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
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: marvin78 am 06 August 2014, 20:25:06
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).
Titel: Antw:2 Codschnipsel zusammenfügen, Finde den Fehler nicht
Beitrag von: franky08 am 06 August 2014, 20:31:21
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