Alarmanlagen-Forum - Alarmforum - Fachforum für Sicherheitstechnik

Normale Version: externe Einflußnahme z.B. via http(s)-URL
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

nachdem meine Anlage nun läuft und wir uns daran gewöhnen, besteht der Wunsch, die Anlage an das bestehende Heimsystem zu koppeln und einige Daten auszulesen:

- Statusänderungen bei den Sensoren wie z.B. Fensterkontakten
- Scharf-/Unscharfschaltungen
- Alarmierungen

Dabei wäre auch eine Möglichkeit interessant, die Anlage remote zu schalten via URL.

Gibt es soetwas? Oder gibt es sogar eine php-API (habe ich bisher allerdings nicht gefunden)?

Mfg
Andreas.
warum so kompliziert und nicht via Lupus - App?
Weil die Automation (Windows-Dienst) die App leider nicht bedienen kann.Rolleyes Wohl aber http-Request empfangen und lesen kann, über die mit der Anlage kommuniziert werden könnte.
Eigentlich sollte man da mit Wireshark den Daten auf die schliche kommen. Eine Integration in FHEM oder OpenHAB wäre wirklich eine schöne Möglichkeit den Nutzen zu maximieren.

Eigentlich fliegen die Daten ja via AJAX hin und her, man müsste sich die Arbeit machen und das mal analysieren, oder Lupus erkannt hier auch einen Mehrwert und erklärt den Datenaustausch ein wenig.
Hallo,

scheinbar hat die Lupusec eine REST-API. Bin heute morgen zufällig im IP-Symcom-Forum darüber gestolpert:
https://www.symcon.de/forum/threads/2968...s-auslesen

Welches Homeautomation-System benutzt du? Ich werde mir auch eine XT2 zulegen und versuchen, diese mit openHAB zu koppeln.

Gruß!
Konnte schon jemand die Verbindung zwischen Lupusec und openHab herstellen? Per REST API? Binding?
Wenn man es denn unbedingt möchte (will hier keine Diskussion über Sinn oder Unsinn entfalten), funktioniert das gewünschte problemlos über ioBroker...
Hatte schon mal was gefunden und dann runtergebrochen auf eigene Anwendung. Man braucht einen PHP-fähigen Webserver im Intranet (Netzwerk-Festplatte oder so, hier ist es eine Synology)
Darauf folgender Beispielscript löst Regeln in der XT2 aus:
PHP-Code:
<html>

<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<
title>Lupusec XT2 Command Answer</title>
</
head>
<
body>
  
<?
// Dieses Script löst Regeln aus, Aufruf: http://Server-IP/LupusExecute.php?Regel=10

include 'LupusCredentials.php';

/* weitere REST-Befehle:

allg. Infos      /action/welcomeGet
Ereignisliste    /action/recordListGet
div. setzen auch möglich.....

*/

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

// Login
$ch curl_init();
curl_setopt($chCURLOPT_URL,$url);
curl_setopt($chCURLOPT_TIMEOUT5); //timeout after 30 seconds
curl_setopt($chCURLOPT_RETURNTRANSFER,1);
curl_setopt($chCURLOPT_HTTPAUTHCURLAUTH_ANY);
curl_setopt($chCURLOPT_USERPWD"$username:$password");

$result=curl_exec ($ch);
if ( 
$result == false ) {

     echo 
"Anlage ausser Betrieb...";
     die;
}

if ( isset(
$_GET['Regel'])) {
  
$Action $_GET['Regel'];
} else {
  echo 
"Parameter Missing...";
  die;
}    

// Befehl ausführen
$Command "http://".$ip."/action/haExecute?ha=".$Action;  // siehe Lupus-Webseite und dann F12 im Browser

curl_setopt($chCURLOPT_URL,$Command);

$res=curl_exec ($ch);
echo 
"<br/>Result:".$res;

?> 
</body>

</html> 
die Credentials dann noch:
PHP-Code:
<?php
// Variablen definieren
$username     'Admin account name'
$password     'passwort im Klartext';
$ip            'XT2-IP';
$url             'http://'.$ip.'/';
?>

Aufruf: http://Server-IP/LupusExecute.php?Regel=10

Die Authentifizierung ist damit klar, weiteres kann man sogar einfach im Browser in der Entwicklerkonsole auslesen, wenn man die XT2-Webseite benutzt.

Bei bedarf suche ich noch meine Statusanzeige raus (Fenster offen/zu, Batterie,...)

Vielleicht hilft es ja jemnad auch weiter.

Gruß, Christian
Hallo Christian,

das Skript für die Statusanzeige fände ich super...

Viele Grüße
pamp
Ok, hier die Statusanzeige. Auch das ist runtergebrochen direkt auf meine Bedürfnisse. Wer ein bischen PHP/HTML kann, kann sich das natürlich weiter anpassen. (Hint: Credentials wie weiter oben erwähnt)

Code:
<html>
<head>
<META HTTP-EQUIV="refresh" CONTENT="60">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Lupusec XT2 Status</title>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#999999" vlink="#990000" alink="#666666"><!--mstheme--><font face="Arial, Arial, Helvetica">
  
<style type="text/css">    
    body  {
        background-color:#ddd;
        font-family: Arial, 'Arial', sans-serif;
    }
    
    .sensortable
    {
        width:100%;
        font-weight:normal;
        font-size:12;
        border: 1px solid black;
    }
    .statustable
    {
        width:100%;
        font-weight:bold;
        font-size:14;
        border: 1px solid black;
    }
    .armtable
    {
        width:100%;
        font-weight:bold;
        font-size:24;
        border: 1px solid black;
        padding: 30px;
    }
    
table {
    border-collapse: collapse;
}

table, th, td {
    border: 0px solid black;
}
th, td {
   padding: 0px 3px 0px 3px;
}
</style>  

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


include 'LupusCredentials.php';

// 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, 5); //timeout after 30 seconds
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");

$result=curl_exec ($ch);

    if ( $result == false ) {

         $bkcolor="red";
         $color="white";
         $Modus = 'Anlage ausser Betrieb';

         $html .= "<table class='statustable'>";
         $html .= "<tr bgcolor='{$bkcolor}' style='font-size:24; color:{$color};'>";
         $html .= "<td align='center' ><b><br/>{$Modus}<br/>&nbsp;</b></td></tr>";      

         $html .= "</table>";

         echo $html;
         die;
    }


// Sensorliste lesen
$sensorliste = "http://".$ip."/action/deviceListGet";

curl_setopt($ch, CURLOPT_URL,$sensorliste);
$result=curl_exec ($ch);

// Umwandeln von JSON in ein Array
$result = str_replace("\t", "", $result);
$json_sens = json_decode($result, true);


$generalstatus = "http://".$ip."/action/panelCondGet";

curl_setopt($ch, CURLOPT_URL,$generalstatus);
$result=curl_exec ($ch);

curl_close ($ch);

$result = str_replace("\t", "", $result);
$json_stat = json_decode($result, true);

$updates = $json_stat['updates'];
$gsm_ok = $updates['sig_gsm_ok'];
$gsm_signal = $updates['sig_gsm'];
if ( $gsm_ok == "1" ) {
    $gsm_ok = 'Ok';
} else  {
    $gsm_ok = 'Fehler!';
    $gsm_signal = "0";
}
if ($gsm_signal == '{WEB_MSG_NA}' ){
    $gsm_ok = 'Fehler 2!';
    $gsm_signal = "0";
}


$Forms = $json_stat['forms'];
$Area1 = $Forms['pcondform1'];

$mode1 = $Area1['mode'];  // Modus: 0 unscharf, 1 scharf, 2 home1, 3 home2, 4 home3



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



// HTML-Ausgabe erstellen
$html = "\n<table class='sensortable'>\n";
$html .= "\n<tr>\n<td><b>Sensor</b></td>\n<td><b>offen</b></td>\n<td><b>Batt.</b></td>\n<td><b>Funk</b></td>\n</tr>\n";

foreach ($sensoren as $sensor)
    {
        $status = @GetTextBetween($sensor['status'], '{WEB_MSG_DC_', '}');
        if ( $status != "" ) {
          $html .= SensorOut( 0, $sensor );
        }
    }
    $html .= "\n</table>\n";
    $html .= "\n<table class='sensortable'>\n";
    $html .= "\n<tr>\n<td><b>Sensor+Batt.</b></td>\n\n<td><b>Funk</b></td>\n<td style='border-left: 1px solid black;' ><b>Sensor+Batt.</b></td>\n\n<td><b>Funk</b></td>\n</tr>\n";

$col = 0;    
foreach ($sensoren as $sensor)
    {
        $status = @GetTextBetween($sensor['status'], '{WEB_MSG_DC_', '}');
        if ( $status == "" ) {
          if ( $col == 0 )  $html .= "\n<tr>";    
          $html .= SensorOut( 1, $sensor );
          if ( $col == 1 )  $html .= "\n</tr>\n";    
          $col = 1- $col;
        }
    }

    $html .= "\n</table>\n";


// Armierung Status
    $bkcolor="lime";
    $color="black";
    $Modus = "unscharf";
    switch ($mode1) {
        case "0":
            $bkcolor="red";
            $color="white";
            $Modus = "unscharf";
        break;
        case "1":
            $bkcolor="lime";
            $color="black";
            $Modus = "SCHARF!";
        break;
        case "2":
            $bkcolor="yellow";
            $color="black";
            $Modus = "Home1";
        break;
        case "3":
            $bkcolor="yellow";
            $color="black";
            $Modus = "Home2";
        break;
        case "4":
            $bkcolor="yellow";
            $color="black";
            $Modus = "Home3";
        break;
    }

    
    

$html .= "\n<table class='armtable'>";
$html .= "\n<tr bgcolor='{$bkcolor}' color:{$color}' style='padding: 10px;'>";
$html .= "\n<td style='padding: 10px;' align='center' ><b>{$Modus}&nbsp;</b></td></tr>";      
$html .= "\n</table>\n";
    
    // GSM-Status
    $html .= "\n<table class='statustable'>";
    $html .= "\n<tr>\n<td><b>Status</b></td>\n<td><b>Wert</b></td>\n</tr>";

    $html .= "\n<tr><td>GSM ok</td>\n<td>" . $gsm_ok . "</td>\n</tr>";      
    $html .= "\n<tr><td>GSM Signal</td>\n<td>" . $gsm_signal . "/9</td>\n</tr>";

    $html .= "\n</table>\n";
    //$html .= "<p></p>";


echo $html;

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
function SensorOut( $SnsTyp, $sensor )
{
    $html = '';
    $fault = 0;    
    // Daten aus Array zur besseren Anzeige bearbeiten
    $status = @GetTextBetween($sensor['status'], '{WEB_MSG_DC_', '}');
    $status = str_replace("CLOSE", "nein", $status);
    $status = str_replace("OPEN", "ja", $status);
    if ($sensor['rssi']=='{WEB_MSG_NA}') {
        $rssi="n/a";
        $fault = 1;
    } else {
        $rssi = substr($sensor['rssi'], -1);
    }

    $name =  $sensor['name'];
    $battery = $sensor['battery_ok'];
    $battery = str_replace("1", "OK",      $battery );
    $battery = str_replace("0", "Schwach", $battery );
    
    
    if ($fault==1) {
        $battery = "unbek.";
        $status  = "unbek.";
    }


    
    $bkcolor="gray";
    $color="black";
    if ( strcasecmp($status, "nein"   )== 0 ) { SetColors( 2, $bkcolor, $color );}
    if (( strcasecmp($status, "ja" )== 0 ) or ( $fault == 1 )) { SetColors( 0, $bkcolor, $color );}
    
    if ( $SnsTyp == 1 ) {
        if ( $battery == "OK" ) {
            SetColors( 2, $bkcolor, $color );
        } else {
          SetColors( 0, $bkcolor, $color );
        }
        $html .= "\n<td  style='border-left: 1px solid black;' bgcolor='{$bkcolor}' style='color:{$color};'><b>" . $name . "</b></td>";        // battery_ok
    } else  {
    
    
        // SensorName
        $html .= "\n<tr bgcolor='{$bkcolor}' style='color:{$color};'>";
        $html .= "\n<td><b>" . $name . "</b></td>";        // name
        
        //Sensor Status
        $html .= "\n<td align='center' >" . $status . "</td>";        // status


        // Batterie
        if ( strcasecmp($battery, "OK" )== 0 )      
          SetColors( 2, $bkcolor, $color );
        else
          SetColors( 0, $bkcolor, $color );

        $html .= "\n<td align='center' bgcolor='{$bkcolor}' style='color:{$color};'>" . $battery . "</td>";        // battery_ok
    }

// Funkleistung
    SetColors( 2, $bkcolor, $color );
    
    if ( strcasecmp($rssi, "5" )== 0 )  SetColors( 1, $bkcolor, $color );
    if ( strcasecmp($rssi, "4" )== 0 )  SetColors( 1, $bkcolor, $color );
    if ( strcasecmp($rssi, "3" )== 0 )  SetColors( 0, $bkcolor, $color );
    if ( strcasecmp($rssi, "2" )== 0 )  SetColors( 0, $bkcolor, $color );
    if ( strcasecmp($rssi, "1" )== 0 )  SetColors( 0, $bkcolor, $color );
    if ( strcasecmp($rssi, "0" )== 0 )  SetColors( 0, $bkcolor, $color );
    if ( $fault == 1 )  SetColors( 0, $bkcolor, $color );
    

    $html .= "\n<td align='center' bgcolor='{$bkcolor}' style='color:{$color};'>";
    if ( $fault==1)  {
        $html .= "n/a";
    }else{
        $html .= "{$rssi}/9";
    }
    $html .="\n</td>";        // rssi
    if ( $SnsTyp <> 1 ) {
      $html .= "\n</tr>\n";
    }
    return $html;
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
function SetColors( $level, &$backcolor, &$forecolor )
{
  switch ($level) {
      case 1:
        $backcolor="yellow";
        $forecolor="black";
      break;
      case 2:
        $backcolor="lime";
        $forecolor="black";
      break;
      default:
//      case 0:
        $backcolor="red";
        $forecolor="white";
      break;
  }
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
function GetTextBetween($string, $start, $end)
    {
   preg_match_all( "/$start(.*)$end/U", $string, $match );
   return $match[1][0];
    }
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
?>

</font></body>

</html>

Viel Spaß beim Weiterbasteln

Gruß, Christian
Super - Vielen Dank!
Ich sende per Action URL an den JBMedia Lichtmanager Air den Status meiner Türen und der Alarmanlage.
Kann dann damit z.B. verhindern, dass die Rollläden vom Lichtmanager bei geöffneten Türen runterfahren um nicht ausgesperrt zu werden. Der Lichmanager würde sonst per Sonnenuntergangszeit die Rollläden runterfahren.
Auch eine einfache Leuchte z.B. für den Status Scharf/unscharf ist per Schaltsteckdose für kleines Geld so möglich.

Werde als nächstes die Rolläden hochfahren bei Rauchmeldung um Fluchtwege zu öffnen.
Referenz-URLs