Schaltbefehle per E-Mail an IP-Symcon schicken

Benötigt werden eine POP3 oder IMAP Instanz unter der ein Skript mit dem nachfolgen Inhalt erstellt wird. Wer Rückmeldungen erhalten will, kann die ID einer SMTP Instanz angeben. Die ID = 0 bedeutet, dass dieses Feature deaktiviert bleibt.

Nach dem Erstellen, ist das Skript einmal auszuführen. Im anhängenden Screenshot ist zu sehen, wie das ganze im Objektbaum im Endeffekt aussehen sollte. :slight_smile:

Der Befehl LICHTAN muss in der Betreffszeile an das POP3/IMAP Konto gesendet werden im Format: IPS LICHTAN.

Allgemein:


IPS BEFEHL


<?

$allowedSenders = Array("hans@wurst.com", "max@mustermann.de"); //Erlaubte Absender!
$sendResponse = 0; //ID einer SMTP Instanz angeben, um Rückmelde-Funktion zu aktivieren
$prefix = "IPS";

//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 "LICHTAN":
	      MXC_SwitchMode(53013 /*[Erdgeschoss\Flur\Deckenlampe]*/, 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;
	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);
			   $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, "LastMessage");
   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;
}

?>

Bildschirmfoto 2011-04-12 um 15.45.07.png

Danke,

das ist mal ne nette zusätzliche Möglichkeit. :loveips:

Coole Sache,
werde ich am WE mal testen :slight_smile:

Noch ein kleiner Bugfix :slight_smile:

paresy

ich hab mich aktuell in ganz andere Themen so vertieft das ich darauf noch gar nicht gekommen bin (auf die Idee meine ich, zum Umsetzen langts bei mir eh nich :D)

ich denbke, ich bau mir das heute Abend mal ein -> das ist auf jeden Fall ne praktische Möglichkeit um z.B. notfalls von Unterwegs per PDA die Heizung anzuwerfen. Klar geht das auch per WFE - mobil und/oder mit PDA aber längst nicht immer praktikabel.

Daher: prima Idee, danke für die Bereitstellung!

Ich habe im Skript oben mal das Prefix ausgelagert. So kann jeder das IPS am Anfang auch gegen WURST ersetzen oder so :slight_smile:

paresy

Eigentlich hatte ich so was schon (von Steiner?) aber das ist schöner an das native Modul gebunden. Leider läuft es nicht richtig. Nach einiger Zeit habe ich im Log:

…fatal error: cannot break/continue 1 level in … on line 56

Ist der Bereich nach //$mails = array_reverse ($mails);
(Was soll eigentlich der Kommentar?)

hab ich auch, und zwar wenn meine Mailbox leer ist.

Ändert es mal so

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

jo, passt, Fehlermeldung taucht nicht mehr auf :wink:

Ist grundsätzlich toll, ABER ist das nicht zu unsicher? (Ich weiß schon, man muss es ja nicht verwenden…)

Schließlich kann ja jeder, z.B. per PHP mail(), E-Mails versenden und jeden beliebigen Absender (E-Mail) angeben! Und somit auch meine E-Mail-Adresse „fälschen“.

Besser wäre, wenn man vielleicht ein Passwort mit der E-Mail übermitteln müsste, damit IPS reagiert.

LG,
florida

hä? … was dann auch jeder mitlesen kann???
:confused::confused::confused:

Du kannst das Prefix in AZ5$$%jj§a!1 ändern. Ich glaub… da kommt keiner drauf :wink:

Das mit dem Absender ist natürlich kein ausreichender Schutz. Aber eine zusätzliche Hürde.
Und das Passwort übermitteln… Da kommt bald der nächste, dass du dann aber bitte alles per SSL übertragen musst.

paresy

Naja, um eine Nachricht von einer „gefakten“ E-Mail-Adresse zu schicken, muss ich nicht den ganzen E-Mail-Verkehr mithören - das sind zwei Paar Schuhe.

Ich muss nur die E-Mail-Adresse des „Opfers“ kennen…

LG,
florida

Wie gesagt… das Prefix ist fast wie ein Kennwort :slight_smile:

@paresy:
Ja, da stimme ich dir zu! :wink:

Klar, ist es weder mit kryptischem Präfix, noch mit Passwort benutzerfreundlich… Leider!

LG,
florida

Für kleine Leitungen reicht eigentlich auch das WebFront Retro. Das gibt es sogar mit SSL und Passwortschutz ;).

Sehr nützliches Tool, kann ich gut gebrauchen. Läuft prima

Herzlichen Dank :slight_smile:

Kann es sein, dass da noch zwei kleine Fehlerchen drin stecken?

Statt

$cmd = substr($mail['Subject'], 4);

sollte

$cmd = substr($mail['Subject'], strlen($prefix)+1);

rein. Und statt

IPS_SetEventTrigger($eid, 0, $vid);

besser

IPS_SetEventTrigger($eid, 1, $vid);

Sonst berücksichtigt er beim extrahieren des Befehls aus dem Subject keine Präfixe mit mehr oder weniger als drei Zeichen und er führt den letzten Email-Befehl immer wieder im Abfrageintervall des Abholens der Emails aus.

Du hast recht. Habe die Änderungen eingefügt. Danke :slight_smile:

paresy