[gelöst] 2 Codschnipsel zusammenfügen, Finde den Fehler nicht

Begonnen von franky08, 06 August 2014, 10:47:48

Vorheriges Thema - Nächstes Thema

franky08

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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

betateilchen

Viel zuviele geschweifte Klammern im Codeblock Deines notify.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

franky08

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.
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

marvin78

#3

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");
}

Puschel74

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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

franky08

@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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Puschel74

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  :-[
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

marvin78

#7
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.

franky08

#8
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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

marvin78

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).

franky08

#10
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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

marvin78

#11
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.

franky08

Du siehst dir Puschels Testumbebung an, deshalb Log3... Um es zu testen, meine originale Utils steht oben im ersten Post, mit Sprachausgabe.
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Puschel74

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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

marvin78

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).