Wenn wir das Problem mit den gesperrten Wav’s nicht lösen können, evtl. hat ja jemand eine Idee für einen Workaround. Eine maßgebliche Anforderung ist es das keine Clouddienste verwendet werden können (also AWS ect.). Das muss alles lokal passieren.
Ziel ist es ein Monitoring zu installieren das bei einem Geräteproblem einen Anruf tätigt und durchsagt welches Gerät das Problem hat.
PRTG überwacht die Geräte, über das PRTG Modul ist der Status auch in Symcon verfügbar. Sobald es zu einem Problem kommt, wird folgendes Script getriggert:
<?php
include_once "Standard.ips.php";
check_timer(false,15460); //Scripttimer löschen
check_timer(true,15460,120); //Scripttimer auf x Sekunden setzen
$liste_prtg_objekte = IPS_GetChildrenIDs(55186); //Root bzw. hier sind alle PRTG Objekte drin
foreach($liste_prtg_objekte as $nr => $ebene0){ //alle PRTG-Objekte durchgehen Ebene0
$liste_prtg_objekt = IPS_GetChildrenIDs($ebene0);
foreach($liste_prtg_objekt as $nr => $ebene1){ //alle PRTG-Objekte durchgehen Ebene1
$liste_prtg_sensor = IPS_GetChildrenIDs($ebene1);
foreach($liste_prtg_sensor as $nr => $ebene2){ //alle PRTG-Objekte durchgehen Ebene2
if(IPS_GetName($ebene2)== "Sensoren Fehlerhaft"){
if(GetValueInteger($ebene2)>0){
$Verursacher=IPS_GetName($ebene0);
tts_generate('<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="de-DE">Hallo, leider wurde für folgendes Gerät ein Fehler gemeldet '.$Verursacher.'. Ich wiederhole den Gerätenamen <prosody rate="-50.00%"><say-as interpret-as="characters">'.$Verursacher.'</say-as></prosody></speak>'); //Legt eine Wav mit gesprochenem Text ab
ips_sleep(5000);
IPS_RunScriptEx(37978,array("Verursacher" => IPS_GetName($ebene0))); //Anruf triggern und Verursachername übergeben
return; //Script abbrechen um keine weiteren Anrufe auszulösen
}
}
}
}
}
?>
Die Funktion tts_generate enthält folgendes:
function tts_generate($ansagetext)
{
$datei = fopen(IPS_GetKernelDir() . "webfront\user\Sprachausgabe\Textausgabe.txt","w+");
$ansagetext=iconv("UTF-8", "ISO-8859-1", $ansagetext);
fwrite($datei, $ansagetext);
rewind($datei);
fclose($datei);
IPS_ExecuteEx(IPS_GetKernelDir() . "webfront\user\Sprachausgabe\generate_wave.bat","",false,true,-1);
}
Das heißt sobald das Anruf/Callscript aufgerufen wird liegt bereits eine Wav mit Ansagetext vor die nur noch abgespielt werden muss.
Die generate_wave.bat sieht so aus:
@echo off
C:\Windows\syswow64\cscript.exe "C:\Program Files\Jampal\ptts.vbs" -u C:\ProgramData\Symcon\webfront\user\Sprachausgabe\Textausgabe.txt -s 8000 -c 1 -r -0 -w C:\ProgramData\Symcon\webfront\user\Sprachausgabe\WaveOut98.wav -voice "Microsoft Hedda Desktop"
So und am Ende kommt das Call-Script was nun anruft und die Wave abspielt:
<?php
include_once "Standard.ips.php";
$anzahl_bisheriger_anrufe=getvalue(30449); //soll verhindern das dieses Script Telefonterror auslösen kann
if($anzahl_bisheriger_anrufe >= 5){return;} //nach 5 Anrufen ist Schluss (braucht noch einen Timer der die Variable zurück setzt)
setvalue(30449,$anzahl_bisheriger_anrufe+1); //Anruf hochzählen
check_timer(false,15460); //normalen Aufruftimer löschen
check_timer(true,15460,1800); // Aufruftimer für Prüfscript auf höheren Wert setzen (also eine Pause in der erstmal nicht geprüft wird) 1800s=30min
//$Verursacher=$_IPS['Verursacher']; //Wird aus dem Script "PRTGObjekte nach fehlerhaften Sensoren durchsuchen" geliefert
//$Verursacher="P.S.T.R.F.8.1.9"; //Nur zum Test, wenn dieses Script manuell ausgeführt wird
//IPS_Sleep(5000); //gib dem TTS-Generator 5s Zeit die Wav zu erstellen
$id = VOIP_Connect(56647, "+49123456789");
for($i = 0; $i <= 30; $i++) {
IPS_Sleep(1000);
$c = VOIP_GetConnection(56647, $id);
if($c['Connected']) {
IPS_Sleep(1000);
VOIP_PlayWave(56647, $id, IPS_GetKernelDir() . "/webfront/user/Sprachausgabe/WaveOut98.wav");
IPS_Sleep(20000);
break;
}
}
unlink(IPS_GetKernelDir() . "\webfront\user\Sprachausgabe\WaveOut98.wav");
VOIP_Disconnect(56647, $id);
?>
So und alles scheitert daran das die erstellte Wav von Voip_PlayWave dauerhaft blockiert wird. Nachfolgend kann die weder gelöscht, noch durch eine neue Ansage überschrieben werden bis ich Symcon neu starte. Vielleicht hat ja jemand eine Idee wie man es lösen könnte ohne Wav’s zu generieren.