stehe gerade etwas auf dem Schlauch: ich möchte den Zustand eines Homematic Tür-/Fensterkontaktes in eine mysql-DB schreiben… Dazu brauche ich den Wert der Variablen STATE im php.
$zustand = IPS_…;
IPS-GetVariable(varid) ergibt ein array, ich brauche nur den Wert. Habe ich eine Anweisung übersehen?
Ich möchte den Türkontakt überwachen. Wenn die Tür länger als 60 sek. offen ist, soll eine wav abgespielt werden. Das Abspielen habe ich schon - derzeit allerdings gleich nachdem die Tür aufgeht. Mit IPS_sleep soll doof sein, eine Lösung irgendwie mittels TIMER-Ereignis ist besser??
Danke, habe das mittels Hilfe und „Forumabgucken“ so gelöst - ist Deinem ja sehr ähnlich:
<?
if($IPS_SENDER == "TimerEvent")
{
//Zielrufnummer festlegen
$rufnummer = "10";
$isdn = 59389 /*[Gefrierschrank\ISDN Module]*/ ;
$dir=IPS_GetKernelDir();
//$file = $dir."\wave\gefrierschrank.wav";
$file = $dir."\wave\gesamt1.wav";
$conn = ISDN_Connect($isdn, $rufnummer);
do {
IPS_Sleep(500);
$callinfo = ISDN_GetConnectionInfo($isdn, $conn);
}
while ( $callinfo["State"] != "4") ; // warten, bis abgenommen wurde
$len = ISDN_PlayWave($isdn, $conn, $file); // Spieldauer in ms
IPS_Sleep($len+500); // warten bis abgespielt
ISDN_StopPlay($isdn, $conn);
ISDN_Disconnect($isdn, $conn);
//ScriptTimer wieder löschen
IPS_SetScriptTimer($IPS_SELF,0);
}
else
{
//Befehle, die DIREKT nach Aufruf des Scriptes (Tür wurde geöffnet) ausgeführt werden sollen
IPS_SetScriptTimer($IPS_SELF,60);
}
?>
Scheint zu laufen. Mal sehen, was die Kinder sagen, wenn sie sich ein Eis nehmen und die Tür nicht dicht machen …
Ist es richtig, dass das ScriptTimer-Ereignis trotzdem im IPS noch stehen bleibt?
welche beiden Scripte meinst Du?
Habe doch den ScriptTimer wieder 0 gesetzt, wenn die Meldung abgespielt wurde -ahhhhh:
<?
$akt_zustand = GetValue(45455 /*[Gefrierschrank\Gefrierschrank Türkontakt\STATE]*/);
if($IPS_SENDER == "TimerEvent" and $akt_zustand == TRUE)
{
//Zielrufnummer festlegen
$rufnummer = "10";
$isdn = 59382 /*[Gefrierschrank\ISDN Module]*/ ;
$dir=IPS_GetKernelDir();
//$file = $dir."\wave\gefrierschrank.wav";
$file = $dir."\wave\gesamt1.wav";
$conn = ISDN_Connect($isdn, $rufnummer);
do {
IPS_Sleep(500);
$callinfo = ISDN_GetConnectionInfo($isdn, $conn);
}
while ( $callinfo["State"] != "4") ; // warten, bis abgenommen wurde
$len = ISDN_PlayWave($isdn, $conn, $file); // Spieldauer in ms
IPS_Sleep($len+500); // warten bis abgespielt
ISDN_StopPlay($isdn, $conn);
ISDN_Disconnect($isdn, $conn);
//ScriptTimer wieder löschen
IPS_SetScriptTimer($IPS_SELF,0);
}
else
{
//Befehle, die DIREKT nach Aufruf des Scriptes (Tür wurde geöffnet) ausgeführt werden sollen
if ($akt_zustand == false)
{
IPS_SetScriptTimer($IPS_SELF,0);
}
else
{
IPS_SetScriptTimer($IPS_SELF,10);
}
}
?>
Wenn die Tür zwischen Auslösen (also Öffnen - STATE=TRUE) und zweitem Start des Scriptes per ScriptTimer wieder geschlossen wurde (STATE=FALSE), sollte der zusätzliche Vergleich mit der STATE-Variable den vermissten Erfolg bringen? Kann es leider im Moment nicht live testen. Meinst Du das?