IPS-Variable in php übernehmen

Hallo,

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?

Danke für helfende Hinweise.

$zustand = GetValue($varid) ist die Lösung :slight_smile:

Aus dem Array rausziehen. z.B. so.

echo $zustand['VariableValue']['ValueFloat'];

Mann, das wars. Danke. Also manchmal …

Aber eine habe ich noch! (wenn ich darf:))

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??

TRIGGER auf Variable

IPS_SetScriptTimer($IPS_SELF, 60 ); // 60SEC:

if($IPS_SENDER == "TimerEvent")
{
   if(GetValue(12345))
    {
       //Mach Krach;
    }
    else
    {
       IPS_SetScriptTimer($IPS_SELF, 0);
    }
}

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 …:smiley:
Ist es richtig, dass das ScriptTimer-Ereignis trotzdem im IPS noch stehen bleibt?

Ja.

Mir fehlt in beiden Scripten der Teil, der den Timer löscht, wenn die Tür widererwarten doch rechtzeitig geschlossen wurde :).

Hallo,

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?

jepp, sonst gibt immer Alarm :D.

Besten Dank.