Schaltbefehle per E-Mail an IP-Symcon schicken

Das macht aber auch nur Sinn, wenn es Einmal-Passwörter wären z.B. oder sie hätten einen dynamischen Teil der sich irgendwie ändert, alles andere ist auch nicht besser als der Präfix.

Wenn du Lust und Langeweile hast kannst du ja PGP einbauen oder ähnliches, vielleicht tut es ja auch ein einfacher Algorithmus z.B. ein Zahlencode der mit der aktuellen Stunde multipliziert wird oder sowas… wichtig ist doch nur, dass es einfach ist und nicht immer identisch.

Da hab ich paresy bereits Recht gegeben, dass eine Abfrage des Präfix zumindest sicherer ist, als die bloße Abfrage des E-Mail-Absenders! :wink:

Natürlich könnte man weiß Gott welche Algorithmen einbauen, aber wenn ich jedes Mal z.B. h&5$78gZ38ik0 und den IPS-Befehl eingeben müsste, damit etwas passiert, wäre das nicht sehr benutzerfreundlich.
Geschweige denn, wenn sich der Präfix dynamisch ändert und ich erst eine Zahl aus aktuellen Zeitinformationen berechnen muss… :rolleyes:

Aber wie gesagt… Ich finde diese Funktion nicht schlecht! Allerdings möchte ich auch auf die Sicherheitsrisiken, die die Verwendung eines E-Mail-Systems birgt (siehe Spam), hinweisen!

LG,
florida

Ich habe alle $IPS_* mit $_IPS[li] ersetzt.
[/li]
Fehler :

global $_IPS[‚SELF‘];

IPS_SetInfo($vid, „this variable was created by script #$_IPS[‚SELF‘]“);

Das geht so nicht :wink:

So aber:


IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);

paresy

Änderung gemacht, aber jetzt wird es besonders schwierig. Das Script wird trotz der Änderung als fehlerhaft markiert aber es gibt keine Fehlermeldung (Text) mehr :frowning:

Nachdem ich :

$vid = @IPS_GetStatusVariableID($iid, „LastMessage“);

geändert habe in :

$vid = @IPS_GetObjectIDByIdent(„LastMessage“, $iid);

sagt mein IPS Editor das es keine Fehler mehr gibt :slight_smile:

(Habe die Info vom 3.0 Kompatibilität‘ s script)

Wenn ein neues Email ankommt bekomm ich aber immer noch einen Fehler:

                if(IPS_InstanceExists($sendResponse))
                {
                    SMTP_SendMailEx($sendResponse, $mail['SenderAddress'], "IP-Symcon Rückmeldung", $message);
                }

PHP Error: Notice: Undefined Variable: sendResponse

Wo und wie muss diese Variable deklariert werden?


Gruß Rudolf

Sorry mein Fehler - vergesst obrige Nachricht!

$sendResponse = 53615 /*[E-Mail senden (SMTP)]*/  ;

ist versehentlich in einen Bereich /* … */ reingerutscht!

Beitrag löschen kann ich aber nicht!

Hallo zusammen,

Ich möchte dieses Thema noch mal puschen, da es meiner Meinung nach Vorteile bringt einen Plan B zu haben wen gar nix mehr geht.

Zum Thema Sicherheit habe ich mir folgendes überlegt und bitte euch um eure Meinung diesbezüglich.
Ich gebe [b]florida[/b] recht was das Sec Problem angeht.

Daher hier meine Idee:

Eine standardisierte E-Mail Form muss her.

Schaltbefehl: Gewerk,Raum,Schaltbefehl; (Bei mir geht das so)
SID: 89+546#75448484+37377id (nur ein Beispiel)

Nun zum 3 Way Handshake für die SID

  1. Mail, von einer dafür freigegebenen Mail Adresse, mit SID Anforderung schicken (Ähnlich Mobile TAN)
    Beispiel:

Schaltbefehl: Get_SID;
SID: 10 (Gültigkeit der SID in Min)

  1. SID wird von IPS generiert und an die Mailadresse geschickt „SID37634927ß8398“. In diesem Fall ist sie 10 Minuten lang gültig.

  2. Mit der zugesandten SID kann ich nun den Schaltbefehl absetzten

Schaltbefehl: Licht,Wohnen,An;
SID: SID37634927ß8398;

Man kann die Sicherheit noch erhöhen indem ich an die SID einen Modulo anhänge usw.
SID: SID37634927ß839812;

Ja ist umständlich sorgt aber für ein gewisses Maß an Sicherheit.

Gruß Nick

Hallo,

hab diese Funktion gerade voller Begeisterung auch für mich entdeckt.
Wollte das Script auf den aktuellen Syntax anpassen, habe jedoch mit folgender Zeile Probleme:
Im Original geht es:

function CreateVariableByName($id, $name, $type)
{
    global $IPS_SELF;

wenn ich es anpasse wie folgt:

function CreateVariableByName($id, $name, $type)
{
    global $_IPS['SELF'];

Gibts ne Fehler Meldung.

Parse error:  syntax error, unexpected '[', expecting ',' or ';' in [Überwachung\Befehl per E-Mail empfangen (IMAP)\eMail-Befehl empfangen] on line 115
Abort Processing during Fatal-Error: syntax error, unexpected '[', expecting ',' or ';'
   Error in Script D:\IP-Symcon\scripts\44935.ips.php on Line 115

Wie muß diese Zeile nun richtig heißen?

Gruß
hardlog

Hi,
kommentiere mal

global $_IPS['SELF'];  

aus.
Wird nicht benötigt, da Systemvariablen auch in Funktionen verfügbar sind…

@paresy
Ein kleiner Fehler: Wenn der Absender nicht erlaubt ist, dann wird $cmd nicht definiert und trotzdem als Mailtext verwendet.

Grüße
galleto

Hallo,
benutzte dieses Script vor Jahren mit Erfolg.:smiley:
Habe es heute (3 Jahre später) wieder aktiviert.
Aber ich bekomme immer nur die Rückmeldung: „IST NICHT BEKANNT“.:eek:
Hab wohl wieder was verpasst :confused:

Gruß aus Bayern
Werner

Hi,

Für mein Secvest Projekt habe ich angefangen dieses Skript zu modifizieren.
Da die Alarmanlage ihren aktiv/inaktiv Status leider im Mail-Body sendet, muss ich dafür noch eine Auswertung hinzufügen.

Leider scheint das Skript gar nicht zu funktionieren. Es wird als Fehlerhaft markiert, obwohl bei der manuellen Ausführung keine Fehler mehr angezeigt werden.

Jemand eine Idee?

<?

$allowedSenders = Array("xxxl@xxx.de"); //Erlaubte Absender!
$sendResponse = 0; //ID einer SMTP Instanz angeben, um Rückmelde-Funktion zu aktivieren
$prefix = "xxx-BV:";

//Hier im switch-case die einzelnen Kommandos einfügen. Wer nicht weiß wie, sollte die PHP Doku zu switch-case lesen
function processCommand($str)
{
getMailtext ($last);
    switch($str)
    {
       case "Status":
          //MXC_SwitchMode(53013 /*[Erdgeschoss\Flur\Deckenlampe]*/, true);
            return true;
    }
    return false; //Fehler zurückschicken!
}



function getMailtext($mailnumber)
{
$mailFull = POP3_GetMailEx($iid, $mailnumber);
$mailTEXT = $mailFull['TEXT'];

echo "Funktion aufgeführt";
echo $mailnumber;
echo $mailFull;
echo $mailTEXT;
}


/*
 * Ab hier nichts mehr ändern!
 *
 */


$iid = IPS_GetParent($_IPS['SELF']);

 if($_IPS['SENDER'] == "Variable")
  {
    $ins = IPS_GetInstance($iid);
    switch($ins['ModuleInfo']['ModuleID'])
    {
     case "{CABFCCA1-FBFF-4AB7-B11B-9879E67E152F}":
       $isIMAP = true;
       break;
     case "{69CA7DBF-5FCE-4FDF-9F36-C05E0136ECFD}":
       $isIMAP = false;
       break;
     default:
         die("Diese Skript muss unterhalb einer POP3 oder IMAP Instanz liegen");
    }

    if($isIMAP)
    {
        $mails = IMAP_GetCachedMails($iid);
    }
    else
    {
        $mails = POP3_GetCachedMails($iid);
    }

    $uid = CreateVariableByName($_IPS['SELF'], "LastRun", 1);
    $last = GetValue($uid);

    //$mails = array_reverse($mails);
    if(sizeof($mails) == 0)
        return;

        $lastmail = $last;
		echo $lastmail;
    foreach($mails as $mail)
    {
        if(($last > 0) && ($mail['Date'] > $last))
        {
           if(substr($mail['Subject'], 0, strlen($prefix)) == $prefix)
           {
            if(in_array($mail['SenderAddress'], $allowedSenders))
            {
               $cmd = substr($mail['Subject'], strlen($prefix)+1);
               echo $cmd;
			   $status = processCommand($cmd);
               if($status)
               {
                  $message = $cmd." ausgeführt!";
                } else {
                  $message = $cmd." ist nicht bekannt!";
                }
                if(IPS_InstanceExists($sendResponse))
                {
                    SMTP_SendMailEx($sendResponse, $mail['SenderAddress'], "IP-Symcon Rückmeldung", $message);
                }
            } else {
                if(IPS_InstanceExists($sendResponse))
                {
                    SMTP_SendMail($sendResponse, "IP-Symcon Rückmeldung", "Unerlaubter Zugriff: ". $mail['SenderAddress'].", Befehl: ".$cmd);
                }
            }
         }
        }
        $lastmail = max($lastmail, $mail['Date']);
    }
    SetValue($uid, $lastmail);
 }


 if($_IPS['SENDER'] == "Execute")
 {
    $vid = @IPS_GetStatusVariableID($iid, "Letzte Nachricht");
   if($vid === false)
      die("Irgendwie fehlt die benötigte StatusVariablen!");
   
   $eid = @IPS_GetEventIDByName("MailUpdate", $_IPS['SELF']);
   if($eid === false)
   {
        $eid = IPS_CreateEvent(0);
        IPS_SetEventTrigger($eid, 1, $vid);
        IPS_SetParent($eid, $_IPS['SELF']);
        IPS_SetName($eid, "MailUpdate");
        IPS_SetEventActive($eid, true);
   }
   IPS_SetHidden($_IPS['SELF'], true);
   echo "Skript erfolgreich installiert!";
 }
 
function CreateVariableByName($id, $name, $type)
{
    //global $_IPS['SELF'];
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']); 
    }
    return $vid;
}

?>

Kann mir keiner helfen?

Kommt denn gar keine Fehlermeldung? Auf die schnelle sehe ich nur das Du ja gar keine SMTP Instanz angeben hast.

Hi Fonzo,

Nein, es kommt eine Fehlermeldung. Das Skript wird nur als „Fehlerhaft“ markiert (Ausrufezeichen).

Das mit der SMTP Instanz habe ich glatt übersehen. Das könnte es ja schon sein. Werde ich heute Abend mal testen.
Wenn das läuft, hoffe ich das der Rest auch erstmal funktioniert. Dann muss ich mich mit den Anpassungen für den Mail-Body befassen.

nope, das war’s nicht.
Hatte es auch so verstanden, dass das optional ist.

Skript wird nachwievor als fehlerhaft angezeigt, ohne errors beim Ausführen.

Habs gefunden.
War noch ein nicht mehr unterstützer Befehl drin. Die Fehlermeldung war mit @ maskiert…

Hier mal das komplette korrigierte Skript kompatible zu 4.2:

<?

$allowedSenders = Array("xxxl@yyy.de", "aaa@bbb.de"); //Erlaubte Absender!
$sendResponse = 0 //ID einer SMTP Instanz angeben, um Rückmelde-Funktion zu aktivieren
$prefix = "xxx";

//Hier im switch-case die einzelnen Kommandos einfügen. Wer nicht weiß wie, sollte die PHP Doku zu switch-case lesen
function processCommand($str)
{
    switch($str)
    {
       case "Status":
          MXC_SwitchMode(53013, true);
            return true;
    }
    return false; //Fehler zurückschicken!
}


/*
 * Ab hier nichts mehr ändern!
 *
 */


$iid = IPS_GetParent($_IPS['SELF']);

 if($_IPS['SENDER'] == "Variable")
   {
    $ins = IPS_GetInstance($iid);
    switch($ins['ModuleInfo']['ModuleID'])
    {
     case "{CABFCCA1-FBFF-4AB7-B11B-9879E67E152F}":
       $isIMAP = true;
       break;
     case "{69CA7DBF-5FCE-4FDF-9F36-C05E0136ECFD}":
       $isIMAP = false;
       break;
     default:
         die("Diese Skript muss unterhalb einer POP3 oder IMAP Instanz liegen");
    }

    if($isIMAP)
    {
        $mails = IMAP_GetCachedMails($iid);
    }
    else
    {
        $mails = POP3_GetCachedMails($iid);
    }

    $uid = CreateVariableByName($_IPS['SELF'], "LastRun", 1);
    $last = GetValue($uid);

    //$mails = array_reverse($mails);
    if(sizeof($mails) == 0)
        return;

        $lastmail = $last;
		echo $lastmail;
    foreach($mails as $mail)
    {
        if(($last > 0) && ($mail['Date'] > $last))
        {
           if(substr($mail['Subject'], 0, strlen($prefix)) == $prefix)
           {
            if(in_array($mail['SenderAddress'], $allowedSenders))
            {
               $cmd = substr($mail['Subject'], strlen($prefix)+1);
               echo $cmd;
			   $status = processCommand($cmd);
               if($status)
               {
                  $message = $cmd." ausgeführt!";
                } else {
                  $message = $cmd." ist nicht bekannt!";
                }
                if(IPS_InstanceExists($sendResponse))
                {
                    SMTP_SendMailEx($sendResponse, $mail['SenderAddress'], "IP-Symcon Rückmeldung", $message);
                }
            } else {
                if(IPS_InstanceExists($sendResponse))
                {
                    SMTP_SendMail($sendResponse, "IP-Symcon Rückmeldung", "Unerlaubter Zugriff: ". $mail['SenderAddress'].", Befehl: ".$cmd);
                }
            }
         }
        }
        $lastmail = max($lastmail, $mail['Date']);
    }
    SetValue($uid, $lastmail);
 }


 if($_IPS['SENDER'] == "Execute")
 {
   $vid = @IPS_GetVariableIDByName("Letzte Nachricht", $iid);
   if($vid === false)
      die("Irgendwie fehlt die benötigte StatusVariablen!");
   
   $eid = @IPS_GetEventIDByName("MailUpdate", $_IPS['SELF']);
   if($eid === false)
   {
        $eid = IPS_CreateEvent(0);
        IPS_SetEventTrigger($eid, 1, $vid);
        IPS_SetParent($eid, $_IPS['SELF']);
        IPS_SetName($eid, "MailUpdate");
        IPS_SetEventActive($eid, true);
   }
   IPS_SetHidden($_IPS['SELF'], true);
   echo "Skript erfolgreich installiert!";
 }
 
function CreateVariableByName($id, $name, $type)
{
    //global $_IPS['SELF'];
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']); 
    }
    return $vid;
}

?>

Ich werde noch wahnsinnig hier.

Ich versuche mit dem Skript die Mails einer ABUS Secvest auszuwerten.
Wenn ich per Outlook eine entsprechend formatierte Mail an die Adresse der Symcon schicke, dann funktioniert das auch leidlich. Sobald aber die Secvest selbst die gleiche Mail direkt an die Symcon schickt, versagt das Skript komplett.

Man könnte meinen der Symcon-POP3 Client ließt die Mails nicht richtig aus.
Wenn ich mir die Mail der Secvest in Webmailer der Mailbox ansehe und mir die Header-Daten anzeigen lasse, so sehe ich das die Felder in der Mail belegt sind. Sie dürften also nicht leer sein.

So sieht das Array einer Mail der Secvest aus:

Array
(
[SenderName] =>
[SenderAddress] =>
[Recipient] =>
[Subject] =>
[Date] => 1492246389
[UID] => 41
[Flags] =>
)

So sieht es in der „Ex-Form“ aus:

Array
(
[ContentType] => text/plain
[CharSet] =>
[Text] => Secvest: Status
10:53 15/04/2017 Ben 001 TB 1 deakt - User1

[SenderName] =&gt; 
[SenderAddress] =&gt; 
[Recipient] =&gt; 
[Subject] =&gt; 
[Date] =&gt; 1492246389
[UID] =&gt; 41
[Flags] =&gt; 

)

So sieht eine Mail aus Outlook aus:

Array
(
[SenderName] => DrFrank
[SenderAddress] => drfrank@aaabbbccc.de
[Recipient] => symcon@aaabbbccc.de
[Subject] => Secvest: Status
[Date] => 1492242091
[UID] => 33
[Flags] =>
)

Return-Path: <xxxxl@aaabbbccc.de>
Received: from ......
FROM: xxxxxl@aaabbbccc.de
TO: symcon@aaabbbccc.de
SUBJECT: Secvest: Status
MIME-Version: 1.0
X-Priority: 1
X-MSMail-Priority: High
Content-Type: text/plain; charset=windows-1252
Date: Sat, 15 Apr 2017 10:43:45 +0200

Der Charset ist hier wohl etwas exotisch (windows-1252). Ich habe mein Symcon unter Ubuntu laufen.
Bei der korrekt verarbeiteten Mails ist der Charset UTF-8.

Moin .
Was möchtest du denn mit der Mail genau auswerten? Ich habe zwar keine Secvest, aber bei mir habe ich das Auslesen mittels Contact-ID over IP gelöst, allerdings ohne Antwort zurück an die AA. Darüber lasse ich mich über einige Events informieren, z.B. (un-)Scharfschalten. Ist ja nur ne Idee. Vorteil ist, dass ich nicht pollen muss, sondern die AA meldet von sich aus. Läuft bei mir seit einem knappen Jahr fehlerfrei.