was mache ich falsch ?

Folgenen Script kann ich einmal ausführen, beim nächsten Aufruf kommt die Fehlermeldung:
Notice: Cannot create File: C:\Temp_wz_ist.wav in line 22

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : text_sprech_script.ips.php
Trigger  : 
Interval : 
*/


//Text über das TextToSpeech Modul mit der
// InstanceID 32971 formatiert speichern

$text_soll = GetValueFloat("Bad_unten_Temp_Soll");
$text_soll = sprintf(number_format($text_soll, 1, ".", "." ));
//echo $text_soll
TTS_GenerateFile(32971, "Die Temperatur soll im Wohnzimmer " .$text_soll. " Grad Celsius sein","C:/Temp_wz_soll.WAV",19);
$text_ist = GetValueFloat("Bad_unten_Temp_Ist");
$text_ist = sprintf(number_format($text_ist, 1, ".", "." ));
//echo $text_ist
TTS_GenerateFile(32971, "Die Temperatur ist im Wohnzimmer " .$text_ist. " Grad Celsius","C:/Temp_wz_ist.wav", 19);

// und jetzt aussprechen

DXMedia_Open(15464, "C:/Temp_wz_soll.WAV");
DXMedia_SetVolume(15464, 80);
DXMedia_Play(15464);
  DXMedia_Close(15464);
IPS_Sleep(6000);

DXMedia_Open(15464, "C:/Temp_wz_ist.WAV");
DXMedia_SetVolume(15464, 80);
DXMedia_Play(15464);
  DXMedia_Close(15464);

?>

Weil die .wav datei schon existieren

nach die ausgabe soll


DXMedia_Open(15464, "C:/Temp_wz_soll.WAV");
DXMedia_SetVolume(15464, 80);
DXMedia_Play(15464);
  DXMedia_Close(15464);

//EDIT
unlink("c:/Temp_ws_soll.WAV");
//ENDE EDIT
IPS_Sleep(6000);

DXMedia_Open(15464, "C:/Temp_wz_ist.WAV");
DXMedia_SetVolume(15464, 80);
DXMedia_Play(15464);
  DXMedia_Close(15464);
//EDIT
unlink("c:/Temp_wz_ist.WAV");
//ENDE EDIT


Hab’ Dank GGGss!
Jetzt löscht er das letzte File (C:/Temp_wz_ist.wav) nicht… Warum nicht?
Scheinbar hat das IPsymcon Sytem das File noch in Bearbeitung, ich kann es auch nicht von Hand löschen. PHP ist doch nicht so einfach…

<?

/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Temperaturen_ansagen.ips.php
Trigger  :
Interval :
*/


//Text über das TextToSpeech Modul mit der
// InstanceID 32971 formatiert speichern
$text_soll = GetValueFloat("Bad_unten_Temp_Soll");
$text_soll = sprintf(number_format($text_soll, 1, ".", "." ));
//echo $text_soll
TTS_GenerateFile(32971, "Die Temperatur soll im Wohnzimmer " .$text_soll. " Grad Celsius sein","C:/Temp_wz_soll.wav",19);
$text_ist = GetValueFloat("Bad_unten_Temp_Ist");
$text_ist = sprintf(number_format($text_ist, 1, ".", "." ));
//echo $text_ist
TTS_GenerateFile(32971, "Die Temperatur ist im Wohnzimmer " .$text_ist. " Grad Celsius","C:/Temp_wz_ist.wav", 19);

// und jetzt aussprechen

DXMedia_Open(15464, "C:/Temp_wz_soll.wav");
DXMedia_SetVolume(15464, 80);
DXMedia_Play(15464);
   DXMedia_Close(15464);
IPS_Sleep(6000);

unlink("C:/Temp_wz_soll.wav");
DXMedia_Open(15464, "C:/Temp_wz_ist.wav");
DXMedia_SetVolume(15464, 80);
DXMedia_Play(15464);
  DXMedia_Close(15464);
IPS_Sleep(6000);
unlink("C:/Temp_wz_ist.wav");
?>

Ehhmm … Helmut

Wieso nicht gleich

TTS_SPEAK($iID, "text");

Du möchtest doch nur ne ausgabe haben. Oder machst du noch etwas anders mit die .wav-dateien?

Der grossem umweg ist ok wenn zb. du die tekste uber das telefon ausgegeben sollten. In diesem fall sollen sie ‚vorbereitet‘ werden. mit TTS_SPEAK bekommst du gleich die aussage in die lautsprecher.

Grusse,
Fredje

Jo, haste recht.
Zum ISDN-Text-Ausgabe wollte ich aber auch noch kommen, deshalb habe ich mir die Beispiele von der Telefonansage angesehen.
Sowieso, das Problem der Speicherung und Löschen besteht noch …
Funktioniert es denn bei jemand anderen?

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Temp_ansagen_Wohnzimmer.ips.php
Trigger  : 
Interval : 
*/


$text_ist = GetValueFloat("Bad_unten_Temp_Ist");
$text_ist = sprintf(number_format($text_ist, 1, ".", "." ));
//echo $text_ist
TTS_GenerateFile(32971, "Die Temperatur ist im Wohnzimmer " .$text_ist. " Grad Celsius","C:/Temp_wz_ist.wav", 19);

DXMedia_Open(15464, "C:/Temp_wz_ist.wav");
DXMedia_SetVolume(15464, 80);
DXMedia_Play(15464);
DXMedia_Close(15464);
unlink("C:/Temp_wz_ist.wav");

?>

Ich habe mal den Teil allein als Script aufgeschrieben. Lasse ich den nur einmal ausführen, kann ich keine Soundausgabe mehr, von egal welchem Script aufrufen ! Wenn ich dann IPsymcon beende, wird das File im Moment des Beendens automatisch gelöscht !!
Ich habe nicht so die PHP-Erfahrung.

Der „Text vorsprechen“ Code:

<?
/*
*******************************
 IP-SYNCOM Event Scripting
*******************************
*/

//File: test.ips.php
$text_ist = GetValueFloat("Bad_unten_Temp_Ist");
$text_ist = sprintf(number_format($text_ist, 1, ".", "." ));
echo   "Wohnzimmer Isttemperatur: ". $text_ist ;
TTS_SPEAK(32971,"Die Solltemperatur ist im Wohnzimmer "  .$text_ist."Grad Celsius");
$text_soll = GetValueFloat("Bad_unten_Temp_Soll");
$text_soll = sprintf(number_format($text_soll, 1, ".", "." ));
//echo    "  Wohnzimmer Solltemperatur: ".  $text_soll ;
TTS_SPEAK(32971,"Die Isttemperatur ist im Wohnzimmer "  .$text_soll."Grad Celsius");
?>

Es muss an DX_Media liegen, der lässt das File nicht mehr los, und zwar den letzen den er bearbeitet hat !
Könnte das mal jemand bei sich ausprobieren ? Scheint ein Bug zu sein :confused: ?

Habe zusätzlich folgenden PHP Code eingefügt und ausprobiert.
Meldung: " Die Datei wurde gelöscht"

$datei = "C:/Temp_wz_ist.wav";
if(@unlink($datei))
  echo "Die Datei $datei wurde gelöscht!";
else
  echo "Konnte die Datei $datei nicht löschen!";

Hallo Helmut,

hast Du schon eine Lösung für Dein Problem?. Ich hab einen ähnlichen Effekt.

Bin gerade dabei einen kleinen Anrufmonitor zu basteln. Nach einem Anruf soll ein Script den Anrufernamen aus einer Textdatei fischen und mir ansagen. Wenn kein Anrufer gefunden wurde sagt er halt die Nummer, oder anonym an. Ich arbeite nur mit TTS_Speak. Es werden keine Files gespeichert. Trotzdem kommt es vor, dass die Soundausgabe abschmiert. Dann mus ich IPSYMCON runterfahren und neu starten. Die Soundausgabe in Windows geht noch.

Ich hab das Gefühl, das das nur passiert, wenn die Sounds kurz hintereinander aufgerufen werden. Wenn ich mir beim Testen viel Zeit lasse, passiert das nicht. Aber was ist, wenn sich aufgrund eines Timers z.B. zwei Scripte mit Soundausgabe kreuzen?
Ich lass mir auch alle Alarmmeldungen über den Sound ausgeben.

Ich hoffe das IPS-Team hat eine Lösung

schönen Sonntag
Norman

es gibt probleme mit der timing weil IPS nicht weiss wann die sound-ausgabe fertig ist. Also eine datei löschen wenn der noch spielt … das geht nicht! per ‚wait‘ soll das ausfuhren des scripts angehalten werden, aber da können script-timeouts auftreten wenn ein script langer wie 10s braucht.

Wieso macht ihr keine einzelne kombinierte, aber grossere, .wav-datei?
und wenn das script ausgefuhrt wird, sollte als erste die alte datei geloscht werden?

Sorry, ich hatte keine Zeit das weiter zu untersuchen. Im Moment wird es auch nichts. Zeitmangel…:frowning:
Also das Löschen vor dem Aufrufen könnte helfen, müsste man probieren…

Hallo Leute,

möchte an der Stelle gleich mal eine Frage stellen, ist zwar ein bisschen off topic aber was solls.
Bei mir funzt TTS_Speak gar nicht. Was mache ich da falsch??

-Text to speech in Windows funktioniert,
-Habe eine Instanz für Text to speech in IPS angelegt, meine geliebte LH Anna ausgewählt und im Testfenster probiert, auch das geht.
-dann im Script für einen FS20 UTS folgende Zeile eingefügt:


...
if (getValueBoolean("Partyraum.Thermostat_Boiler.Status")==True) {
    TTS_Speak(53833, "Frostgefahr im Partyraum!");
    FS20_SwitchDuration(46023, True, 480);
...

hmmm, wo ist mein Denkfehler?
Die Instanz-ID von TTS_Speak ist die, der TTS Instanz die ich im Instance-Window angelegt habe.

Vielleicht hat ja jemand mal einen Tip für einen Anfänger.

Viele Grüße aus dem sonnigen Land BRB

Mario

(P.S.: Windows XP Prof - SP2)

kein Denkfehler, sondern ein Schreibfehler:
„getValueBoolean“ muss heißen „GetValueBoolean“ : ein großes G am Anfang

@ Retiarius:

Oh je :eek: , kaum macht man es richtig schon funktioniert es. Danke Dir.

Sorry komme aus der VB Umgebung, da hat mon so seine Probleme, meistens fehlt so eine dämliche Klammer oder ein Semikolon aber diesmal …
P.S. an die php-Entwickler: Wie kann man nur so Kleinlich sein!

Also viele Grüße

Mario

Hallo Helmut,

hab bei mir das selbe Problem.:mad:
Nachdem ich mich erfolglos mit TTS_Speak herumgeschlagen habe siehe
http://www.ipsymcon.de/forum/showthread.php?t=695 bin ich zu Deiner Variante
(Erstellen mit TTS_GenerateFile und abspielen mit DXMedia) übergegangen.

Leider musste auch ich feststellen, dass es hier Probleme mit dem Erzeugen der Datei gibt, da DXMedia daran festhält.

Hab hier einen kleinen Workarround:

Erzeuge eine Datei mit einem Leerzeichen und lass DXMedia diese nach Deiner eigentlichen Sprachausgabe abspielen.
Damit ist Deine ursprüngliche Datei zum überschreiben frei :wink:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Guten_Morgen.ips.php
Trigger  : 
Interval : 
*/

$Temp = GetValueFloat("Aussen.Temperature");
$Temp = sprintf(number_format($Temp, 1, ",","." ));
$speak = "Guten Morgen meine Liebe. Wir haben heute eine Außentemperatur von: "
          .$Temp." Grad Celsius";

if ($Temp > 23){
   $speak = $speak." Heute könnte es sehr warm werden.";
  }

if ($Temp >= 18 and $Temp <= 23){
   $speak = $speak." Es empfiehlt sich leichte Kleidung zu tragen!";
  }
if ($Temp >= 9 and $Temp < 18){
   $speak = $speak." Es wird langsam kälter!";
  }
if ($Temp >= 2 and $Temp < 9){
   $speak = $speak." Zieh Dich warm an, damit Du nicht frierst!";
  }
if ($Temp < 2){
   $speak = $speak." Pelzmantel, Handschuhe Schal mitnehmen. Es könnte sein Du musst Eis kratzen.";
  }
$speak = $speak." Die Zeit. Es ist ".date("H")." Uhr und ".date("i")." Minuten";

echo $speak;

//Ein File mit der aktuelle Sprachansage erzeugen
TTS_GenerateFile(31742,$speak,"C:/system/Guten_morgen.wav",19);
//Sound spielen
DXMedia_Open(55684, "C:/system/Guten_morgen.wav");
DXMedia_Play(55684);
//warten bis Datei fertig abgespielt wurde
IPS_Sleep(16000);
//unlink.wav ist eine Datei mit Leerzeichen (kein Sound)
//dient nur dazu den Zeiger von der eigenlichen Soundausgabe
//zu nehmen, um neuen Sound speichern zu können
DXMedia_Open(55684, "C:/system/unlink.wav");
DXMedia_Play(55684);
DXMedia_Close(55684);

?>

Hallo Norman,
vielen Dank für den Tip, werde ich bei Gelegenheit ausprobieren.:slight_smile: