Alarmanlage Lupusec XT2 Plus auslesen

Hallo,

nachdem ich im Forum noch nichts von einer Lupusec-Alarmanlage gelesen hatte, hier ein Betrag zum Auslesen der angelernten Sensoren und deren Stati. Ich hoffe, es funktioniert auch woanders. Rückmeldungen über Fehler oder Erfolge würden mich freuen.

Getriggert wird das Script vorerst manuell oder zyklisch. Mir schwebt eine Anbindung per Contact-ID vor, wobei die Anlage Meldungen an diese(n) Empfänger versendet, wenn was los ist. Das scheint jedoch etwas schwieriger zu sein. Hatte schon mal mit einem UPD-Socket gespielt - will noch nicht so richtig.

<?
// Dieses Script liest die Sensoren und deren Daten aus einer Lupus XT2 Plus aus und stellt die Stati in einer Tabelle im Webfront dar

// Variablen definieren
$username 	= GetValue(35633 /*[Alarmanlage\Daten\Benutzer]*/);
$password 	= GetValue(46457 /*[Alarmanlage\Daten\Passwort]*/);
$ip			= GetValue(55395 /*[Alarmanlage\Daten\IP-Adresse]*/);
$url 			= 'http://'.$ip.'/';
$id_html 	= 44077 /*[Alarmanlage\Sensoren\Sensoren]*/; // String-Variable mit Profil "~HTML-Box" für die Anzeigen im Webfront

// Gerätetypen
$typen 		= array("4" => "Türkontakt", "16" => "Tag Reader", "37" => "Keypad", "46" => "Sirene");

// -----------------------------------------------------------------------------
// ab hier ist nichts mehr anzupassen

// Login
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
//$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$result=curl_exec ($ch);


// Sensorliste lesen
$sensorliste = "http://".$ip."/action/deviceListGet";
curl_setopt($ch, CURLOPT_URL,$sensorliste);
$result=curl_exec ($ch);
//echo $result;
curl_close ($ch);


// Umwandeln von JSON in ein Array
$result = str_replace("	", "", $result);
$json = json_decode($result, true);
//print_r($json);


// jeweilge Zone als Index des neuen Arrays $sensoren verwenden und dieses nach Index (=Zone) sortieren
foreach ($json['senrows'] as $sensor)
	{
	$zone = $sensor['zone'];
   $sensoren[$zone] = $sensor;
	 }
ksort($sensoren);
//print_r($sensoren);


// HTML-Ausgabe erstellen
$html = "<table width='90%' align='left'>"; // Farbe anpassen oder style entfernen
$html .= "<tr><td><b>Area</b></td><td><b>Zone</b></td><td><b>Typ</b></td><td><b>SID</b></td><td><b>Name</b></td><td><b>Zustand</b></td><td><b>Batterie</b></td><td><b>Stärke</b></td></tr>";

foreach ($sensoren as $sensor)
	{
	// Daten aus Array zur besseren Anzeige bearbeiten
	$status = @GetTextBetween($sensor['status'], '{WEB_MSG_DC_', '}');
	$status = str_replace("CLOSE", "Geschlossen", $status);
	$status = str_replace("OPEN", "Geöffnet", $status);
	$rssi = substr($sensor['rssi'], -1);
	$name =  utf8_decode($sensor['name']);
	$battery = str_replace("0", "Schwach", $sensor['battery_ok']);
	$battery = str_replace("1", "OK", $sensor['battery_ok']);
	
	// Zeilen mit Daten befüllen
	$html .= "<tr>";
	$html .= "<td>" . $sensor['area'] . "</td>";		// area
	$html .= "<td>" . $sensor['zone'] . "</td>";		// zone
	$html .= "<td>" . $typen[$sensor['type']] . "</td>";		// typ
	$html .= "<td>" . $sensor['sid'] . "</td>";		// sid
	$html .= "<td>" . $name . "</td>";		// name
	$html .= "<td>" . $status . "</td>";		// status
	$html .= "<td>" . $battery . "</td>";		// battery_ok
	$html .= "<td>" . $rssi . "</td>";		// rssi
	$html .= "</tr>";
	}

$html .= "</table>";
SetValue($id_html ,$html);


// -----------------------------------------------------------------------------
function GetTextBetween($string, $start, $end)
	{
   preg_match_all( "/$start(.*)$end/U", $string, $match );
   return $match[1][0];
	}
?>


Hi,
Funktioniert auch bei meiner xt2.
Danke!

Hoffe ich finde die Zeit bei der Weiterentwicklung zu unterstützen!
Mich würde das schalten noch interessieren !

Stefan

Hallo,
Hab folgende Hardware Sensoren ergänzt

$typen = array(„4“ => „Türkontakt“, „9“ => „IR“, „33“ => „Funk Binaereingang“, „27“ => „PIR Kamera“, „16“ => „Tag Reader“, „37“ => „Keypad“, „46“ => „Sirene“);

Stefan

Hallo,
Hab mich mal hingesetzt:
Was noch fehlt:

  • unterstützung Area2

 <?
// Dieses Script liest die Sensoren und deren Daten aus einer Lupus XT2 Plus aus und stellt die Stati in einer Tabelle im Webfront dar

// Variablen definieren
$username     = GetValue(42666 /*[Hardware\Lupusec V1\Username]*/);
$password     = GetValue(25702 /*[Hardware\Lupusec V1\Passwort]*/);
$ip            = GetValue(40551 /*[Hardware\Lupusec V1\IP]*/);
$url             = 'http://'.$ip.'/';
$id_html     = 56188 /*[Hardware\Lupusec V1\Seonsoren]*/; // String-Variable mit Profil "~HTML-Box" für die Anzeigen im Webfront
$LupuInst = 42578; ## Dummy Modul für die Lupusec, Es muss ein Dummy Modul angelegt werden, darunter werden die Variablen abgelegt. Neue Sensoren werden automatisch hinzugefügt
// Gerätetypen
#$typen         = array("4" => "Türkontakt", "9" => "9", "33" => "33", "27" => "27", "16" => "Tag Reader", "37" => "Keypad", "46" => "Sirene");
$typen = array("4" => "Türkontakt", "9" => "IR", "33" => "Funk Binaereingang", "27" => "PIR Kamera", "16" => "Tag Reader", "37" => "Keypad", "46" => "Sirene");


// -----------------------------------------------------------------------------
// ab hier ist nichts mehr anzupassen

// Login
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
//$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$result=curl_exec ($ch);


// Sensorliste lesen
$sensorliste = "http://".$ip."/action/deviceListGet";
curl_setopt($ch, CURLOPT_URL,$sensorliste);
$result=curl_exec ($ch);
//echo $result;
curl_close ($ch);


// Umwandeln von JSON in ein Array
$result = str_replace("	", "", $result);
$json = json_decode($result, true);
//print_r($json);


// jeweilge Zone als Index des neuen Arrays $sensoren verwenden und dieses nach Index (=Zone) sortieren
foreach ($json['senrows'] as $sensor)
    {
    $zone = $sensor['zone'];
   $sensoren[$zone] = $sensor;
     }
ksort($sensoren);
//print_r($sensoren);


# hier werden pro Sesor eine Statusvariable erzeugt
foreach ($sensoren as $sensor)
    {
    # füllt die Variablen
    $status = @GetTextBetween($sensor['status'], '{WEB_MSG_DC_', '}');
	# initialisiere mit false, fall aktor keinen Status hat
	  $status_bol = false;
  	
	IF ($status == "CLOSE") $status_bol = false;
	IF ($status == "OPEN") 	$status_bol = true;
   $zone = $sensor['zone'];

#echo $sensor;
	 echo "<br>";
	 $name =  utf8_decode($sensor['name']);
	 $zone = $sensor['zone'];
	 $VariableName = "Zone ".$zone.": ".$name;
	 GetSetZone($VariableName, $status_bol, $LupuInst);
	# GetSetZone($zone, $status_bol, $LupuInst);
	}

// HTML-Ausgabe erstellen
$html = "<table width='90%' align='left'>"; // Farbe anpassen oder style entfernen
$html .= "<tr><td><b>Area</b></td><td><b>Zone</b></td><td><b>Typ</b></td><td><b>SID</b></td><td><b>Name</b></td><td><b>Zustand</b></td><td><b>Batterie</b></td><td><b>Stärke</b></td></tr>";

foreach ($sensoren as $sensor)
    {
    // Daten aus Array zur besseren Anzeige bearbeiten
    $status = @GetTextBetween($sensor['status'], '{WEB_MSG_DC_', '}');
    $status = str_replace("CLOSE", "Geschlossen", $status);
    $status = str_replace("OPEN", "Geöffnet", $status);
    $rssi = substr($sensor['rssi'], -1);
    $name =  utf8_decode($sensor['name']);
    $battery = str_replace("0", "Schwach", $sensor['battery_ok']);
    $battery = str_replace("1", "OK", $sensor['battery_ok']);

    // Zeilen mit Daten befüllen
    $html .= "<tr>";
    $html .= "<td>" . $sensor['area'] . "</td>";        // area
    $html .= "<td>" . $sensor['zone'] . "</td>";        // zone
    $html .= "<td>" . $typen[$sensor['type']] . "</td>";        // typ
    $html .= "<td>" . $sensor['sid'] . "</td>";        // sid
    $html .= "<td>" . $name . "</td>";        // name
    $html .= "<td>" . $status . "</td>";        // status
    $html .= "<td>" . $battery . "</td>";        // battery_ok
    $html .= "<td>" . $rssi . "</td>";        // rssi
    $html .= "</tr>";
    }

$html .= "</table>";
SetValue($id_html ,$html);


// -----------------------------------------------------------------------------
function GetTextBetween($string, $start, $end)
    {
   preg_match_all( "/$start(.*)$end/U", $string, $match );
   return $match[1][0];
    }


function GetSetZone($Zone,$State_bol,$LupuInst)
    {
    ##baut den variablennamen zusammen
#	 $ZoneVarName = $Zone;
#	echo $ZoneVarName;
# Sucht nach der Zone und legt falls nciht vorhanden eine Variable an und schreibt $State als Status

		$VariablenID = @IPS_GetVariableIDByName($Zone, $LupuInst);
		if ($VariablenID === false)
	{
   	$VarID_NewZone = IPS_CreateVariable(0);

#function CreateVariableByName($ParentID, $VarName, $VarTyp, $VarProfile = "", $VarActionScript = "") {
		IPS_SetName($VarID_NewZone,$Zone); // Variable benennen#
    	IPS_SetVariableCustomProfile($VarID_NewZone,"Windows");
		IPS_SetInfo($VarID_NewZone, "This variable was created by script #".$_IPS["SELF"]);
		IPS_SetParent($VarID_NewZone, $LupuInst); // Variable einsortieren unter dem Objekt mit der ID "12345"
    	#echo "Variable nicht gefunden!";
    	setValue($VarID_NewZone, $State_bol);
	 }
	else
   # echo "Die Variablen-ID lautet: ". $VariablenID;
		setValue($VariablenID, $State_bol);
}
?>


Schalten wäre genial - da geht bestimmt auch noch was.

Kleine Anpassungen:

[ul]
[li]Umstellung auf https (Bereich „Login“ und „Sensorliste lesen“)
[/li][li]Profil auf Standard-Profil „~Window“ geändert
[/li][li]es werden nur Variablen für Türkontakte angelegt
[/li][li]der Zeitstempel wird in den Namen des Links im WF geschrieben
[/li][li]Erstellung der HTML-Tabelle als Funktion erstellt
[/li][/ul]

<?
// Dieses Script liest die Sensoren und deren Daten aus einer Lupus XT2 Plus aus und stellt die Stati in einer Tabelle im Webfront dar
// Variablen anpassen
// $id_html: String-Variable mit Profil "~HTML-Box" für die Anzeigen im Webfront (ins WF verlinken)
// $LupuInst: Dummy Modul anlegen und die ID hinterlegen; unter diesem Dummy-Modul werden die Variablen = Sensoren (NUR Türkontakte!!!) angelegt. Neue Türkontakte werden automatisch hinzugefügt. (ins WF verlinken)
// $id_wf: ID des Links im Webfront auf das Dummy-Modul $LupuInst

// -----------------------------------------------------------------------------
// Variablen definieren
$username 	= GetValue(35633 /*[Alarmanlage\Daten\Benutzer]*/);
$password 	= GetValue(46457 /*[Alarmanlage\Daten\Passwort]*/);
$ip			= GetValue(55395 /*[Alarmanlage\Daten\IP-Adresse]*/);
$url 			= 'https://'.$ip.'/';
$id_html 	= 44077 /*[Alarmanlage\Sensoren\Alle Sensoren - Tabelle\Sensoren]*/; // String-Variable mit Profil "~HTML-Box" für die Anzeigen im Webfront
$LupuInst = 30713 /*[Alarmanlage\Sensoren\Tür-/Fensterkontakte]*/; ## Dummy Modul für die Lupusec, Es muss ein Dummy Modul angelegt werden, darunter werden die Variablen abgelegt. Neue Sensoren werden automatisch hinzugefügt
$id_wf = 56541 /*[Webfront\Home\Sicherheit\Alarmanlage\Tür-/Fensterkontakte - Stand: 19.12.2015 22:10]*/ ;

// Gerätetypen
$typen = array("4" => "Türkontakt", "9" => "IR", "33" => "Funk Binaereingang", "27" => "PIR Kamera", "16" => "Tag Reader", "37" => "Keypad", "46" => "Sirene");



// -----------------------------------------------------------------------------
// ab hier ist nichts mehr anzupassen

// Login
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_exec ($ch);

// Sensorliste lesen
$sensorliste = "https://".$ip."/action/deviceListGet";
curl_setopt($ch, CURLOPT_URL,$sensorliste);
$result=curl_exec ($ch);
//echo $result;
curl_close ($ch);


// Umwandeln von JSON in ein Array
$result = str_replace("	", "", $result);
$json = json_decode($result, true);
//print_r($json);


// jeweilge Zone als Index des neuen Arrays $sensoren verwenden und dieses nach Index (=Zone) sortieren
foreach ($json['senrows'] as $sensor)
    {
    $zone = $sensor['zone'];
   $sensoren[$zone] = $sensor;
     }
ksort($sensoren);
//print_r($sensoren);


// -----------------------------------------------------------------------------

IPS_SetName($id_wf, IPS_GetName($LupuInst)." - Stand: ".date("d.m.Y H:i"));

# hier wird pro Sensor eine Statusvariable erzeugt
foreach ($sensoren as $sensor)
    {
    # füllt die Variablen
    $status = @GetTextBetween($sensor['status'], '{WEB_MSG_DC_', '}');
    # initialisiere mit false, fall aktor keinen Status hat
	$status_bol = false;

	IF ($status == "CLOSE") $status_bol = false;
	IF ($status == "OPEN")     $status_bol = true;
	$zone = $sensor['zone'];
	$name =  utf8_decode($sensor['name']);
	$zone = $sensor['zone'];
	$VariableName = "Zone ".$zone.": ".$name;
	$typ = $sensor['type'];
	GetSetZone($VariableName, $status_bol, $LupuInst, $typ);
   }


// -----------------------------------------------------------------------------

// HTML-Ausgabe im Webfront erstellen
$html = CreateHtml($sensoren, $typen);
SetValue($id_html ,$html);


// -----------------------------------------------------------------------------
// Funktionen

function GetTextBetween($string, $start, $end)
    {
   preg_match_all( "/$start(.*)$end/U", $string, $match );
   return $match[1][0];
    }

// -----------------------------------------------------------------------------

function GetSetZone($Zone,$State_bol,$LupuInst, $typ)
    {
    ##baut den variablennamen zusammen
	#     $ZoneVarName = $Zone;
	#    echo $ZoneVarName;
	# Sucht nach der Zone und legt falls nciht vorhanden eine Variable an und schreibt $State als Status

	if ($typ == 4) // nur eine Variable anlegen, wenn der Sensor = Type 4 ist (-> Türkontakt)
	   {
		$VariablenID = @IPS_GetVariableIDByName($Zone, $LupuInst);
		if ($VariablenID === false)
			{
	      $VarID_NewZone = IPS_CreateVariable(0);
			#function CreateVariableByName($ParentID, $VarName, $VarTyp, $VarProfile = "", $VarActionScript = "") {
	     IPS_SetName($VarID_NewZone,$Zone); // Variable benennen#
	     IPS_SetVariableCustomProfile($VarID_NewZone,"~Window");
	     IPS_SetInfo($VarID_NewZone, "This variable was created by script #".$_IPS["SELF"]);
	     IPS_SetParent($VarID_NewZone, $LupuInst); // Variable einsortieren unter dem Objekt mit der ID "12345"
	     #echo "Variable nicht gefunden!";
	     setValue($VarID_NewZone, $State_bol);
	     }
	    else
			{
			# echo "Die Variablen-ID lautet: ". $VariablenID;
	      setValue($VariablenID, $State_bol);
	      }
		 }
	}


function CreateHtml($sensoren, $typen)
	{
	// HTML-Ausgabe erstellen und zurückgeben

	$html = "<table width='90%' align='left'>"; // Farbe anpassen oder style entfernen
	$html .= "<tr><td><b>Area</b></td><td><b>Zone</b></td><td><b>Typ</b></td><td><b>SID</b></td><td><b>Name</b></td><td><b>Zustand</b></td><td><b>Batterie</b></td><td><b>Stärke</b></td></tr>";

	foreach ($sensoren as $sensor)
	    {
	    // Daten aus Array zur besseren Anzeige bearbeiten
	    $status = @GetTextBetween($sensor['status'], '{WEB_MSG_DC_', '}');
	    $status = str_replace("CLOSE", "Geschlossen", $status);
	    $status = str_replace("OPEN", "Geöffnet", $status);
	    $rssi = substr($sensor['rssi'], -1);
	    $name =  utf8_decode($sensor['name']);
	    $battery = str_replace("0", "Schwach", $sensor['battery_ok']);
	    $battery = str_replace("1", "OK", $sensor['battery_ok']);

	    // Zeilen mit Daten befüllen
	    $html .= "<tr>";
	    $html .= "<td>" . $sensor['area'] . "</td>";        // area
	    $html .= "<td>" . $sensor['zone'] . "</td>";        // zone
	    $html .= "<td>" . $typen[$sensor['type']] . "</td>";        // typ
	    $html .= "<td>" . $sensor['sid'] . "</td>";        // sid
	    $html .= "<td>" . $name . "</td>";        // name
	    $html .= "<td>" . $status . "</td>";        // status
	    $html .= "<td>" . $battery . "</td>";        // battery_ok
	    $html .= "<td>" . $rssi . "</td>";        // rssi
	    $html .= "</tr>";
	    }

	$html .= "</table>";
	return $html;
 	}


?>

… ist geglückt!

Habe mal den Namen eines Sensors erfolgreich geändert.

<?
// Sensorname in "Testname mit Leerzeichen" ändern

// -----------------------------------------------------------------------------
// Variablen definieren
$username 	= GetValue(35633 /*[Alarmanlage\Daten\Benutzer]*/);
$password 	= GetValue(46457 /*[Alarmanlage\Daten\Passwort]*/);
$ip			= GetValue(55395 /*[Alarmanlage\Daten\IP-Adresse]*/);
$url_base 			= 'https://'.$ip.'/';

// Login
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_URL, $url_base);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_exec ($ch);


// Sensorname in "Testname mit Leerzeichen" ändern
// für Sensor mit der ID "RF:020fa379" -> RF%3A020fa379

$edit = $url_base."/action/deviceEditPost";
curl_setopt($ch, CURLOPT_URL,$edit);
curl_setopt($ch, CURLOPT_POSTFIELDS, ("id=RF%3A020fa379&sname=Testname+mit+Leerzeichen&sarea=1&szone=1&schar_latch_rpt=1&sresp_panic=10&sresp_fire=12&sresp_medical=7&sresp_emergency=11&sresp_arm=0&sresp_home=0&sresp_disarm=0&sresp_switch_on=0&sresp_switch_off=0&sresp_button_1=0&sresp_button_2=0&sresp_button_3=0&sresp_button_4=0&sresp_mode_0=0&sresp_entry_0=0&sresp_exit_0=5&sresp_mode_1=5&sresp_entry_1=5&sresp_exit_1=5&sresp_mode_2=5&sresp_entry_2=5&sresp_exit_2=5&sresp_mode_3=5&sresp_entry_3=5&sresp_exit_3=5&sresp_mode_4=5&sresp_entry_4=5&sresp_exit_4=5&sresp_trigger=0&sresp_trigger2=0&sresp_restore=0"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
echo $result;
curl_close($ch);

?>

Wird mit einem

{
  "result" : 1,
  "message" : "{WEB_MSG_SUBMIT_SUCCESS}"
}

quittiert.

Nun kann ich die Anlage auch schalten::slight_smile:

<?
// Mit diesem Script kann man die Anlage (un-)scharf schalten
// mode=0 -> unscharf
// mode=1 -> scharf


// -----------------------------------------------------------------------------
// Variablen definieren
$username 	= GetValue(35633 /*[Alarmanlage\Daten\Benutzer]*/);
$password 	= GetValue(46457 /*[Alarmanlage\Daten\Passwort]*/);
$ip			= GetValue(55395 /*[Alarmanlage\Daten\IP-Adresse]*/);
$url_base 			= 'https://'.$ip.'/';


// Login
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_URL, $url_base);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_exec ($ch);


// Area 1 schalten
$edit = $url_base."/action/panelCondPost";
curl_setopt($ch, CURLOPT_URL,$edit);
curl_setopt($ch, CURLOPT_POSTFIELDS, ("area=1&mode=1"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
echo $result;
curl_close($ch);


?>

Danke, funktioniert auch bei mir!
Ergänzung: Mode=2 entspricht Hone 1

Hallo zusammen!

durch Zufall bin ich auf diesen Thread gestoßen. Verstehe ich das richtig, dass die Lupusec XT2 eine REST-Schnittstelle hat, die man per JSON abfragen kann? Das wäre super, da ich ebenfalls vorhabe, mir eine Lupusec XT2 zuzulegen. In Der Doku habe ich darüber nichts gefunden.

Gruß,
thoern

Naja Schnittstelle. … Ich versuche nur ein paar Sachen auszulesen, die ich in IPS weiter verwenden kann wie die Tür- und Fensterkontakte der Lupusec. Nun auch ohne ständig zu pollen, sondern nur bei Statusänderung in der AA, wenn z.B. jemand die Tür aufmacht wird das an IPS gesendet und dort der Status aktualisiert. Ist zwar eher eine Krückenlösung (via Contact-ID und Automations-Regeln auf der Lupusec), aber diese funktioniert und meine Zwecke sind (vorläufig) erfüllt. Klappt mit ein paar Sekunden Verzögerung ganz gut.

Wie hast du hinbekommen mittels contact id Nachrichten an ips zu senden?

Gesendet von iPhone mit Tapatalk

Hallo,

ich habe auch eine Lupusec XT1 Alarmanlage und möchte gern die Contact-ID Nachrichten mit IPS auswerten! Der Empfang mittels eines Serversocket in IPS klappt auch nur leider kann ich die Bestätigung zur Anlage nicht senden.

Woher weiß IPS wenn ich den Befehl

SSCK_SendText($ID,$Text);

ausführe wohin (Ziel-IP) die Daten gesendet werden?

MfG Tommy

Moin,

Wie hast du hinbekommen mittels contact id Nachrichten an ips zu senden?

in Kurzform:

[ul]
[li]in der AA unter Einstellungen -> Contact-ID eine Reporting-URL eingetragen , z.B. ip://1234@192.168.10.20:4711/CID (die 1234 ist egal, Haupsache vierstellig)[/li][li]habe bei mir alle Ereignisse ausgewählt[/li][li]im IPS einen Server-Socket erstellen mit Port 4711 (den aus der AA)[/li][li]ein Script erstellen (s.u.)[/li][li]eine Reg-Var anlegen für den Socket und mit dem Script verbinden[/li][/ul]

RegVar-Script (String-Variable anlegen -> hier 39290)

<?
$id_satz = 39290 /*[Alarmanlage\Contact_ID\Datensatz]*/;

$datensatz = $_IPS['VALUE'];
$datensatz = str_replace('[', '', $datensatz);
$datensatz = str_replace(' ', '', $datensatz);

$satz = substr($datensatz, 0, 15);
SetValue($id_satz, $satz);

?>

Damit wird der ankommende Satz aufbereitet, so dass nur nur Ziffern enthalten sind. Durch weitere Zerlegung kann man dann weitere Infos daraus gewinnen, wie den auslösenden Benutzer, das Event, die Area.

Beispiel 1: 123418160200000

[ul]
[li]1234 - ist immer gleich, entspricht bei Aufschaltung bei einem Wachdienst der Kundennummer[/li][li]18 - Nachrichtentyp ist Contact-ID[/li][li]1602 - zyklische Alive-Statusmeldung (AA lebt noch)[/li][li]00 - Area (hier keine spezielle)[/li][li]000 - Benutzer System[/li][/ul]

Beispiel 2: 123418340701002

[ul]
[li]1234 - ist immer gleich, entspricht bei Aufschaltung bei einem Wachdienst der Kundennummer[/li][li]18 - Nachrichtentyp ist Contact-ID[/li][li]3407 - Scharfschaltung[/li][li]01 - Area 1[/li][li]002 - Benutzer 2 (in der AA unter Home -> Pin-Codes)[/li][/ul]

Beispiel 3: 123418140702006

[ul]
[li]1234 - ist immer gleich, entspricht bei Aufschaltung bei einem Wachdienst der Kundennummer[/li][li]18 - ist immer gleich, Nachrichtentyp ist Contact-ID[/li][li]1407 - Unscharfschaltung[/li][li]02 - Area 2[/li][li]006 - Benutzer 6 (in der AA unter Home -> Pin-Codes)[/li][/ul]

Beispiel 4: 123418176000000

[ul]
[li]1234 - ist immer gleich, entspricht bei Aufschaltung bei einem Wachdienst der Kundennummer[/li][li]18 - ist immer gleich, Nachrichtentyp ist Contact-ID[/li][li]1760 - Automationsregel wurde ausgeführt[/li][li]00 - Area (hier keine spezielle)[/li][li]000 - Benutzer System[/li][/ul]

Als weitere Aktionen generiere ich mir Push-Nachrichten mit den gewonnenen Infos und setze eine Statusvariable im IPS für die entsprechende Area auf true/false.

… nur leider kann ich die Bestätigung zur Anlage nicht senden …

Das habe ich auch noch nicht herausgefunden. Ist für meine Zwecke auch egal, da ich nur unterbinden wollte, dass IPS zyklisch die Anlage abfragt. Mittels der obigen Lösung meldet sich die AA, wenn etwas passiert. Im Log der AA sammeln sich daher Fehlermeldungen, dass die Contact-ID-Meldungen nicht bestätigt wurden.

Eine Übersicht als Leitfaden für die Codes im Anhang.

List-of-Contact-ID-codes.pdf (259 KB)

<?

$username = GetValue(35633 /*[Alarmanlage\Basisdaten\Benutzer]*/);
$password = GetValue(46457 /*[Alarmanlage\Basisdaten\Passwort]*/);
$url_base = 'https://'.GetValue(55395 /*[Alarmanlage\Basisdaten\IP-Adresse]*/).'/';
$area = 1;

// Login
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_URL, $url_base);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_exec ($ch);


$ergebnis = $url_base."/action/userCodeGet?area={$area}";
curl_setopt($ch, CURLOPT_URL,$ergebnis);
$result=curl_exec ($ch);
//echo $result;
curl_close ($ch);

$result = str_replace("	", "", $result);
$json = json_decode($result, true);
//print_r($json);


for ($i=1; $i<11; $i++)
	{
	$users[$i] = array(
	'code' => $json['forms']['ucform']['code_'.$i],
 	'name' => $json['forms']['ucform']['name_'.$i],
	'valid' => $json['forms']['ucform']['valid_'.$i],
	'arm' => $json['forms']['ucform']['can_arm_'.$i],
	'disarm' => $json['forms']['ucform']['can_disarm_'.$i],
	'melden' => $json['forms']['ucform']['latch_'.$i]);
	}
	
print_r($users);
?>

Hi,
kann man aus der Lupusec XT2 Plus auch die Ereignisse, Benachrichtigungen und systemlogs anzeigen lassen?

Geht. Im Bereich „URLs“ die gewünschte Anzeige aktivieren.

<?

$username 	= GetValue(35633 /*[IPS - Zentrale Angaben\Basisdaten\Alarmanlage\Benutzer]*/);
$password 	= GetValue(46457 /*[IPS - Zentrale Angaben\Basisdaten\Alarmanlage\Passwort]*/);
$ip         = GetValue(55395 /*[IPS - Zentrale Angaben\Basisdaten\Alarmanlage\IP-Adresse]*/);
$url_base 	= 'https://'.$ip.'/';


// -----------------------------------------------------------------------------
// Login
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_URL, $url_base);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_exec ($ch);

// -----------------------------------------------------------------------------
// URLs

//URL für Systemereignisse:
$ereignisse = $url_base."/action/loggerListGet";

// URL für Ereignissmeldungen
//$ereignisse = $url_base."/action/logsGet";

// URL für gemeldete Ereignisse
//$ereignisse = $url_base."/action/reportEventListGet";

// -----------------------------------------------------------------------------

curl_setopt($ch, CURLOPT_URL, $ereignisse);
$result = curl_exec ($ch);
//echo $result;
curl_close ($ch);


$result = str_replace("	", "", $result);
$json = json_decode($result, true);
print_r($json);

?>

Ich habe das gestern mal bei der Secvest versucht. Sie unterstützt Contact-ID oder IP im Prinzip.

Habe nur einen Symcon UDP Socket auf den, in der Secevst konfigurierten Port, lauschen lassen und dann geschaut ob im Debug des Sockets was ankommt. Das war leider nicht der Fall. Außerdem hat die Secvest einen Fehler angezeigt, wohl durch die ausbleibenden ACKs begründet. Wenn ich das nicht gelöst bekomme, kann ich diesen Hack leider nicht verwenden, da anstehende Fehler das Scharfschalten verhindern.

Das mit der Register-Variable kapiere ich übrigens leider auch nicht. Habe auch schon im Forum gesucht und leider keine verständliche Anleitung gefunden wie man die anlegt. Liegt es vielleicht and er fehlenden Variable, dass ich im Debug nichts sehe?

Bin unter Linux. Ich gehe davon aus, dass wenn ich einen Port in einer APP öffne, dieser Port auch (automatisch?) durch die Firewall erreichbar ist.

Also zu lösende Probleme in der Zusammenfassung:
1.) Keine Daten im Debug des Sockets

  • Fehlende Registervariable?
  • Linux Firewall?
  • Contact-ID ist nicht UDP?

2.) Alarmanlage geht auf Error

  • Vielleicht reicht des ein Art ACK auf den Socket zu senden, nachdem Daten empfangen wurden?

Ich hoffe jemand kann mir etwas weiterhelfen.

Ob Daten ankommen kannst Du z.B. mit Packet Sender ausprobieren indem Du an den Raspberry mit dem UDP Socket was schickst dann sollte das auch im Debug Fenster zu sehen sein.

Die Register Variable ist nur der Puffer der das dann weiterreicht. Siehe RegisterVariable

Genau wie Fonzo sagt:
erstmal muss was ankommen im Debug-Fenster im IPS. Und nimm mal den Server-Socket im IPS. Dafür muss die Contact-ID-URL in der Secvest natürlich auf die IP vom IPS verweisen. Den Port muss du auch angeben und in der Firewall freischalten/duchreichen.

Wenn dem so ist, speicherst du diese Meldungen in der RegisterVariable. Diese ist quasi nur der Pförtner, der alle Meldungen annimmt und zwischenspeichert.

Bemerkung:
Bei der Lupusec kann ich trotz solcher Fehlermeldungen scharfschalten, daher brauche ich auch nicht zwangsweise eine Rückantwort basteln. Die Verwendung von Contact-ID over IP ist für mich eh nur eine Krücke, um dem ewigen Pollen aus dem Wege zu gehen. Allerdings geht das für die wichtigsten Dinge ganz gut. Wenn z.B. ein Fenster geöffnet wird, gibt es nur eine allgemeine Meldung („Automationsbefehl“) ohne Hinweis auf Verursachersensor. Das muss ich dann als Reaktion auf diese Meldung bewußt von IPS auslesen, welches Fenster gerade offen ist. Aber das soll mit einer Action-URL demnächst besser gehen. Muss noch die aktuelle 2.17F einspielen und testen. Bislang ging nur ein Parameter als Übergabe.

Kleines Update:
Register Variable habe ich dank wupperi hinbekommen. Mir war nicht klar, dass das ein Modul ist, obwohl es in der Anleitung ja so genannt wird. Was sie macht war mir klar, nur nicht wie mal sie einrichtet :slight_smile:

Die Linux Firewall auf dem Symcon Service war sowieso aus, daran kann es also nicht liegen.

Werde mal den Vorschlag testen den Server Socket zu verwenden, anstatt des UDP Sockets. Dann sehe ich hoffentlich mehr.

Das doofe ist, dass die Secvest Software alles andere als Bugfrei ist und damit auch als Fehlerursache in Frage kommen kann.