Statusmeldungen per Mail und Push versenden

Im folgenden Beispiel wird gezeigt, wie man von vielen unterschiedlichen Geräten Statusmeldungen per Mail oder Push-Notification in nur einem Skript versendet.
Die Meldungen können z.B. von verschieden Küchengeräten wie Herd, Backofen, Geschirrspüler oder Gefrierschrank stammen (Hausautomationssysteme wie Miele@home unterstützen dies).
Man bekommt dann auf dem Smartphone eine Meldung wie: ‚Waschmaschine‘ - ‚Ende‘
Weitere Anwendungen sind die Überwachung von Temperaturen oder der Batteriekapazität von Rauchmeldern und Informationen über der noch geöffneten Fernster beim Verlassen der Wohnung.

Die zu überwachende Variable des weiweiligen Geräts (Aktor) muss dem folgendes Skript als ‚Ausgelöstes Ereignis‘ hinzugefügt werden. Der ‚Auslöser‘ kann je nach Anwendungsfall variieren – meistens ist er ‚Bei Variablenänderung‘.
(in dem unten gezeigten Beispiel ist der Name des übergeordneten Objekts: ‚Heißluft‘ mit der $parentID: 13933)

Weitere Hinweise können hier entnommen werden:
http://www.ip-symcon.de/service/dokumentation/konzepte/skripte/systemvariablen/
http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/objektverwaltung/ips-getobject/

MST


<?
// bitte folgende IDs anpassen:
$id_mail = 16134;
$id_push = 25678;

// Skript nur ausführen, wenn es von einer Variablen getriggert wird
if ($_IPS['SENDER'] == "Variable")
{
	// ID der Variablen, die dieses Skript triggert
	// Erklärung der Ssystemvariablen:
	// http://www.ip-symcon.de/service/dokumentation/konzepte/skripte/systemvariablen/
	$id = ($_IPS['VARIABLE']);

	// ID des übergeordneten Objekt herausfinden
	$parentID = IPS_GetParent($id);
	// um dann anschließend mit Hilfe der ID den
	
	// Name des Objekts herausfinden
	$aktorInstanz = IPS_GetObject($parentID);
	$aktorName = $aktorInstanz['ObjectName'];      //Kategorie

	// Beispiel: der Name eines übergeordneten Objekts einer Variablen 'Status' kann z.B. 'Stehlampe' sein

	// Melde-Texte erzeugen
	$status = GetValue($id);
	$meldung = "Neuer Status: " . $status;

	$betreff = "Gerät : " . $aktorName;

	// Nachricht versenden als E-Mail
	SMTP_SendMail($id_mail, $betreff, $meldung);
	// und- oder PushNotification
	WFC_PushNotification($id_push, $betreff, $meldung, "Speaker", 0);
}
?>

…und jetzt fehlt nur noch die Notification fürs Handy :wink:

$betreff = "Gerät : " . $aktor;

müsste wohl

$betreff = "Gerät : " . $aktorName;

heißen.

wenn man lesen kann

WFC_PushNotification($id_push, $betreff, $meldung, „Speaker“, 0);

ist doch enthalten

ups…das Push habe ich wohl überlesen…:o

@Uwe,

ja, danke - geändert.

MST

Hallo

Bekomme nicht den ganzen Text von der Auslösung nur 1 oder 0 ???

Übermittlung als Push und email funktioniert nur das der Text fehlt

Hallo,
versuche mal: GetValueFormatted()

Hi Micha,

spiele gerade nit den notification (hatte vorher noch keinen Bedarf).

Sind echt gelungen :).

Danke dafür …

Habe nur eine Frage zu dem Script da dort Homematic Devices Heißluftherd etc eingetragen sind - wo gibt es denn die Geräte ?

Schönes Ding, genau was ich suchte - kann mir noch jemand bitte sagen wie ich das Doppelpunkt : in der Meldung weg bekomme?

In moment sieht meine Meldung so aus:

!ACHTUNG! Garten Tür: wurde geöffnet

Hallo,

ich habe in dem script meine email ID und die Push ID geändert.
Dann habe ich das Script an die Variable Status einer Squeezebox gehängt.
Bekomme aber weder mail noch Push.

Welcher Schritt fehlt mir?

Oliver

Hallo,

mail bekomme ich nun bei variablen Änderung. :slight_smile:

wenn ich in die Pushsafer Notification ID gehe und eine Testpush schicke klappt alles einwandfrei.
Aus der Variablen heraus kommt keine PUSH??

#############################################################
<?
// bitte folgende IDs anpassen:
$id_mail = 24813 /[#Zusatzmodule\Mail\E-Mail, Send (SMTP)]/;
$id_push = 57588 /[Pushsafer Notification]/;

// Skript nur ausführen, wenn es von einer Variablen getriggert wird
if ($_IPS[‚SENDER‘] == „Variable“)
{
// ID der Variablen, die dieses Skript triggert
// Erklärung der Ssystemvariablen:
// Systemvariablen — IP-Symcon :: Automatisierungssoftware
$id = ($_IPS[‚VARIABLE‘]);

// ID des übergeordneten Objekt herausfinden
$parentID = IPS_GetParent($id);
// um dann anschließend mit Hilfe der ID den

// Name des Objekts herausfinden
$aktorInstanz = IPS_GetObject($parentID);
$aktorName = $aktorInstanz['ObjectName'];      //Kategorie

// Beispiel: der Name eines übergeordneten Objekts einer Variablen 'Status' kann z.B. 'Stehlampe' sein

// Melde-Texte erzeugen
$status = GetValue($id);
$meldung = "Neuer Status: " . $status;

$betreff = "Gerät : " . $aktorName;

// Nachricht versenden als E-Mail
SMTP_SendMail($id_mail, $betreff, $meldung);
// und- oder PushNotification
WFC_PushNotification($id_push, $betreff, $meldung, "Speaker", 0);

}
?>
#############################################################

Oliver

Hallo,

Push Meldung nun auch hinbekommen

hat sich also erledigt

Gruß

Oliver

Hallo Oliver,

Du könntest uns allen Deine erfolgreiche Lösung auch zur Verfügung stellen.
Und Du könntest dazu auch den PHP Code aus der Menüleiste nehmen. Dann ist er leichter zu lesen.

Grüße, Gerhard

Hallo,

Momentan probiere ich einfach verschiedene Sachen und versuche zu lernen.
Ich habe an eine Variable ein Ereignis bei Variablenänderung gehängt und da den Code eingetragen.

so sieht mein Script nun aus

<?
// bitte folgende IDs anpassen:
$id_mail = 24813 /*[#Zusatzmodule\Mail\E-Mail, Send (SMTP)]*/;
$id_push = 57588 /*[Pushsafer Notification]*/;

// Skript nur ausführen, wenn es von einer Variablen getriggert wird
if ($_IPS['SENDER'] == "Variable")
{
    // ID der Variablen, die dieses Skript triggert
    // Erklärung der Ssystemvariablen:
    // http://www.ip-symcon.de/service/dokumentation/konzepte/skripte/systemvariablen/
    $id = ($_IPS['VARIABLE']);

    // ID des übergeordneten Objekt herausfinden
    $parentID = IPS_GetParent($id);
    // um dann anschließend mit Hilfe der ID den
    
    // Name des Objekts herausfinden
    $aktorInstanz = IPS_GetObject($parentID);
    $aktorName = $aktorInstanz['ObjectName'];      //Kategorie

    // Beispiel: der Name eines übergeordneten Objekts einer Variablen 'Status' kann z.B. 'Stehlampe' sein

    // Melde-Texte erzeugen
    $status = GetValue($id);
    $meldung = "Neuer Status: " . $status;

    $betreff = "Gerät : " . $aktorName;

    // Nachricht versenden als E-Mail
    SMTP_SendMail($id_mail, $betreff, $meldung);
    // und- oder PushNotification
    Pushsafer_SendMessage($id_push, "ALARM");
}

	Pushsafer_SendMessage(57588 /*[Pushsafer Notification]*/, "ALARM");


?> 

Fehler war, dass unter als Push Server noch WFC_PushNotification stand, ich aber oben auf Pushsafer Notification verwiesen habe.
mit WFC_PushNotification hab ich, ausser einer „Test“ Pushmeldung noch nicht geschafft, über das Script eine Nachricht zu bekommen. Das werde ich gleich als eigene Antwort hier mal beschreiben.

Gruß

Oliver

Hallo,

WFC_PushNotification hab nun auch hinbekommen . Anfängerfehler „;“ :smiley:

  1. Müllkalender *.ICS von meinem Entsorger heruntergelden und auf dem Raspi unter dem Ordner /Backup als Muell.ics abgelegt.
  2. Variable als Stringvariable angelegt.
  3. Script kopiert von „D.Voss“ und die Bezeichnungen aus meinem ICS angepasst. ID für Variable und Push geändert.
  4. In dem Script gibt es als Tonne Vier eine Erinnerung am 31.12 und 01.01. die neue ICS zu besorgen. Da musste ich das Datum ändern
  5. Da kommt jetzt noch ein Ereignis hin, dass das Script täglich um 18 Uhr läuft, wenn ich mal bis dahin nicht an die Tonne gedacht hab.

Ich hänge einige Screen Shots an, was ich eingerichtet habe.
zu Bild 1 : Ich habe einen Müllkalender eingerichtet, dazu eine Variable für das Webfront
wenn ich das Script starte wird die Variable befüllt ==> Anzeige funktioniert
zu Bild 2: Notifications ist eingerichtet
zu Bild 3: für zwei Webfront IDs steht mein Handy drin. Von hier hab ich Button Testnachricht gedrückt, die
kam auf meinem Handy an
zu Bild 4: Variable und Webfront ID im Script eingetragen
zu Bild 5: Eintrag WFC
zu Bild 6: Webfront

Script:

 <?
//******************************************************************
// Urheber dieser Version ist 'mesa' Stand 20.05.2016
// https://www.symcon.de/forum/threads/31601-M%C3%BCll-Reminder-Bring-den-M%C3%BCll-raus%21?highlight=m%FCllplan

// überarbeitet von mir D.Voss, da ich mehr als 3 Tonnen habe und die Beschreibungen der Behälter anders sind.
// Danke an 'mesa' ich hätte die Berechnungen in PHP so nicht hinbekommen, lesen, verstehen sowie copy & paste
// sind mir nicht fremd - also auf gehts...

// Meine Umgebung ein Rpi2, der seit Ende 2015 im Livebetrieb ist
// Fragen zu dem eigentlichen Script "Urheber" kann mesa bestimmt besser beantworten

// Danke mesa coole Sache

//******************************************************************

    setlocale(LC_ALL, "");

    // Einfache String-Variable, speichert Text wie diesen: "Nächste Leerung am Freitag morgen: Wertstoff - gelbe Tonne"
    // Die String Variable muss selbst angelegt werden, siehe Zeile "$nächste_termin" und "$webfront_id" anpassen
        // Eingabe nötig
    // Dieses Script muss mit einem Timer versehen werden, um es jeden Tag um z.B. 18:00 zu starten,
    // Ziel ist es dann eine Pushnachricht zu senden um am Abend noch den Müll raus zu bringen
    // mein Beispiel 4 Tonnen oder die 4. Tonne als Erinnerung zu nutzen 
    // z.B. am Jahresende oder Quartalsweise um neue Termine einzutragen
    // 1 Wertstoff Tonne
    // 2 Altpapier Tonne
    // 3 Restabfall Tonne
    // 4 Bioabfall > oder neue Termine eingeben erinnern

// Was habe ich geleistet - nicht viel
// anpassen der Variablen damit diese mit meinen Beschreibungen der Entsorgungstonnen zusammen passen
// und eine zusätzliche Tonne "4" 
// natürlich noch die "IF" abfragen bei denen ich erst ein wenig geschwitzt habe - in der Hoffnung das
// ein Fehler nicht dabei ist. 

// Link zu meinem Entsorger (also eurem Entsorger)
// Link - jedes Jahr vergessen also hier speichern - https://www.meinentsorger.de/info-service.htm

//******************************************************************
//
// Vielen Dank erstmal an den urspruenglichen Verfasser mesa...!
// 
// Aenderung fuer das Einlesen einer ICal Datei die von der Hildesheimer Abfallentsorgung (ZAH) angeboten wird.
// Dadurch entfällt die jaehrliche Eingabe der ca. 60 Termine im Jahr in dieses Script...
//
// - Dazu auf die Seite 'https://www.zah-hildesheim.de/Termine/abholtage' gehen
// - Den Ort, Ortsteil und die Strasse auswaehlen
// - Ueber das iCal Icon einen Download anstossen
// - Und die heruntergeladene Datei in das Verzeichnis ablegen das in $icsdatei angegeben ist
//
//******************************************************************

// Eingabe nötig
// Termin "Nächste Leerung" als Stringvariable anlegen
// kann dann im Webfront angezeigt werden
//******************************************************************
    $nächste_termin = 37133 /*[#Zusatzmodule\Müllkalender\Müllkalender]*/;        // Bitte eigene Werte eintragen*
//******************************************************************

// Eingabe nötig
// Webfront ID zur Pushnachrichten Übertagung
//******************************************************************
    $webfront_id = 41910 /*[WebFront]*//*[Pushsafer Notification]*/;           // Bitte eigene Werte eintragen*
//******************************************************************

// In diesem Script sind folgende Namen hinterlegt
// Tonne 1  > Wertstoff
// Tonne 2  > Bioabfall
// Tonne 3  > Restabfall
// Tonne 4  > Problemmüll

//
// Die folgende .ics Datei kann man unter xxxxxxxxxxx herunterladen
//
$icsdatei = "/backup/muell.ics";

$zeilen = file( $icsdatei, FILE_IGNORE_NEW_LINES );

if( $zeilen === false ) 
{
    IPS_LogMessage( "Die Abfuhrkalender Datei wurde nicht gefunden!", $icsdatei );
    return false;         
}
    
//
// Durchlaufen des Arrays und erzeugen der Datetime Objekte in den entsprechenden Arrays
//
$icssuchbegriff1 = "Biomüll";                              // Suchbegriff fuer Tonne 1 -> Wertstoff
$icssuchbegriff2 = "Gelbe und Blaue Tonne";                    // Suchbegriff fuer Tonne 2 -> Bioabfall
$icssuchbegriff3 = "Restmüll";                // Suchbegriff fuer Tonne 3 -> Restabfall
$icssuchbegriff4 = "";                        // Suchbegriff fuer Tonne 3 -> Restabfall
$zeitpunkt = "";

$NameT1 = "Papier + gelber Sack";
$tonne1 = array();
$NameT2 = "Biomüll";
$tonne2 = array();
$NameT3 = "Restmüll";
$tonne3 = array();

foreach ($zeilen as $zeile) {



    if( stristr( $zeile, "DTSTART" ) === False )
    {
    }
    else
    {
        //
        // Datum extrahieren aus...
        // Beispielzeile: DTSTART;TZID=Germany/Berlin:20171110T070000
        // das gesuchte Datum befindet sich direkt hinter dem Doppelpunkt
        // im Format JJJJMMTT
        //
        $zeitpunkt = substr( $zeile, strpos( $zeile, ":") + 1, 8 );
        $zeitpunkt = substr( $zeitpunkt, 0, 4 ) . "-" . substr( $zeitpunkt, 4, 2 ) . "-" . substr( $zeitpunkt, 6, 2 );
    }

    if( stristr( $zeile, "SUMMARY" ) === False )
    {
    }
    else
    {
        //
        // Abfall Art extrahieren aus...
        // Beispielzeile: SUMMARY:Abfuhr Biomüll
        //
        if( stristr( $zeile, $icssuchbegriff1 ) === False )
        {
        }
        else
        {
            //
            // Tonne 1
            //
            $tonne1[] = new DateTime( $zeitpunkt );
        }
        
        if( stristr( $zeile, $icssuchbegriff2 ) === False )
        {
        }
        else
        {
            //
            // Tonne 2
            //
            $tonne2[] = new DateTime( $zeitpunkt );
        }
                
        if( stristr( $zeile, $icssuchbegriff3 ) === False )
        {
        }
        else
        {
            //
            // Tonne 3
            //
            $tonne3[] = new DateTime( $zeitpunkt );
        }
            
    }
    
    
}


// wenn nur 3 Tonnen vorhanden sind kann dies genutzt werden um eine Meldung "neue Werte eintragen"
// per Pushnachricht zu melden, hier als Beispiel 31.12. und 1.1.
// Es müssen zwei Werte eingetragen sein.
// Eingabe nötig bzw. anpassen
$NameT4 = "Neue Müllkalender Datei herunterladen !"; // oder "neue Werte eintragen"
    $tonne4 =
    [
        new DateTime("2019-01-01"),
        new DateTime("2018-12-31")
    ];

    
    $today = new DateTime();

    $next_tonne1 = "";
    $next_tonne2 = "";
    $next_tonne3 = "";
    $next_tonne4 = "";

    $i=-1;
    foreach ($tonne1 as &$d) {
        $i++;
        $diff = $today->diff($d);
        if((int)$diff->format("%r%a") >= 0){
            $next_tonne1 = $tonne1[$i];
            break;
        }
    }

    $i=-1;
    foreach ($tonne2 as &$d) {
        $i++;
        $diff = $today->diff($d);
        if((int)$diff->format("%r%a") >= 0){
            $next_tonne2 = $tonne2[$i];
            break;
        }
    }

    $i=-1;
    foreach ($tonne3 as &$d) {
       $i++;
        $diff = $today->diff($d);
        if((int)$diff->format("%r%a") >= 0){
            $next_tonne3 = $tonne3[$i];
            break;
        }
    }

    $i=-1;
    foreach ($tonne4 as &$d) {
        $i++;
        $diff = $today->diff($d);
        if((int)$diff->format("%r%a") >= 0){
            $next_tonne4 = $tonne4[$i];
            break;
        }
    }

    $diff_tonne1 = $today->diff($next_tonne1, false);
    $diff_tonne2 = $today->diff($next_tonne2, false);
    $diff_tonne3 = $today->diff($next_tonne3, false);
    $diff_tonne4 = $today->diff($next_tonne4, false);

    $diff_tonne1_in_tagen = (int)$diff_tonne1->format("%r%a");
    $diff_tonne2_in_tagen = (int)$diff_tonne2->format("%r%a");
    $diff_tonne3_in_tagen = (int)$diff_tonne3->format("%r%a");
    $diff_tonne4_in_tagen = (int)$diff_tonne4->format("%r%a");

   $wasJunkDayToday = false;
   if($next_tonne1->format('Y-m-d') == $today->format('Y-m-d')) $wasJunkDayToday = true;
   if($next_tonne2->format('Y-m-d') == $today->format('Y-m-d')) $wasJunkDayToday = true;
   if($next_tonne3->format('Y-m-d') == $today->format('Y-m-d')) $wasJunkDayToday = true;
   if($next_tonne4->format('Y-m-d') == $today->format('Y-m-d')) $wasJunkDayToday = true;

//    echo "Today is " . $today->format("y-m-d") ."
";
//    echo "Next Tonne 1 in ". $diff_tonne1_in_tagen ."
";
//    echo "Next Tonne 2 in ". $diff_tonne2_in_tagen ."
";
//    echo "Next Tonne 3 in ". $diff_tonne3_in_tagen ."
";
//    echo "Next Tonne 4 in ". $diff_tonne4_in_tagen ."
";
//    echo "Was junk day today (this morning): " . ($wasJunkDayToday ? "yes
" : "no
");

    //kleinstes Datum ist nächste Leerung
    $next_leerung_in_tagen = min($diff_tonne1_in_tagen, $diff_tonne2_in_tagen, $diff_tonne3_in_tagen, $diff_tonne4_in_tagen);
    if($next_leerung_in_tagen == 0){
       $txt_leerung_tage = 7;
    }

//    echo "next = " .$next_leerung_in_tagen ."
";

    $result = '"Error..."';
    if($next_leerung_in_tagen == $diff_tonne1_in_tagen){
        $result = "Nächste Leerung am ". strftime("%A", $next_tonne1->getTimestamp()) . " morgen: " . $NameT1;
        if($next_leerung_in_tagen == $diff_tonne2_in_tagen){
           $result .= " & " . $NameT2;
        }
        if($next_leerung_in_tagen == $diff_tonne3_in_tagen){
           $result .= " & " . $NameT3;
        }
        if($next_leerung_in_tagen == $diff_tonne4_in_tagen){
           $result .= " & " . $NameT4;
        }

    }else    if($next_leerung_in_tagen == $diff_tonne4_in_tagen){
        $result = "Nächste Leerung am " . strftime("%A", $next_tonne4->getTimestamp()) . " morgen: " . $NameT4;

        if($next_leerung_in_tagen == $diff_tonne3_in_tagen){
           $result .= " & " . $NameT3;
        }
        if($next_leerung_in_tagen == $diff_tonne2_in_tagen){
           $result .= " & " . $NameT2;
        }

    }else    if($next_leerung_in_tagen == $diff_tonne3_in_tagen){
        $result = "Nächste Leerung am ". strftime("%A", $next_tonne3->getTimestamp()) . " morgen: " . $NameT3;

        if($next_leerung_in_tagen == $diff_tonne2_in_tagen){
           $result .= " & " . $NameT2;
        }
     }else    if($next_leerung_in_tagen == $diff_tonne2_in_tagen){
        $result = "Nächste Leerung am ". strftime("%A", $next_tonne2->getTimestamp()) . " morgen: " . $NameT2;
    }

// echo $result. "
";
    
SetValue($nächste_termin, $result);

    //push notification
    if($next_leerung_in_tagen == 0){
       $notification = '"Müll Skript fehlerhaft"';
        if($next_leerung_in_tagen == $diff_tonne1_in_tagen){

            $notification = $NameT1;
            if($next_leerung_in_tagen == $diff_tonne2_in_tagen){
               $notification .= " & " . $NameT2;
            }
            if($next_leerung_in_tagen == $diff_tonne3_in_tagen){
               $notification .= " & " . $NameT3;
            }
            if($next_leerung_in_tagen == $diff_tonne4_in_tagen){
               $notification .= " & " . $NameT4;
            }

        }else    if($next_leerung_in_tagen == $diff_tonne4_in_tagen){

            $notification = $NameT4;
            if($next_leerung_in_tagen == $diff_tonne3_in_tagen){
               $notification .= " & " . $NameT3;
            }
            if($next_leerung_in_tagen == $diff_tonne2_in_tagen){
               $notification .= " & " . $NameT2;
            }

        }else    if($next_leerung_in_tagen == $diff_tonne3_in_tagen){

            $notification = $NameT3;
            if($next_leerung_in_tagen == $diff_tonne2_in_tagen){
               $notification .= " & " . $NameT2;
            }
            }else    if($next_leerung_in_tagen == $diff_tonne2_in_tagen){

            $notification = $NameT2;
        }

//Meldung nur abschicken, wenn Leerung "morgen" stattfindet. "Heute um 19:00" ist zu spät, denn es wird immer morgens geleert.
        if($wasJunkDayToday == false){
		
		     
            
			WFC_PushNotification($webfront_id, 'Müllabfuhr! - ', 'Morgen wird '. $notification . ' geleert.', 'trickling', 0);
			
// echo 'Zum Müllen gehen! - ', 'Morgen wird die '. $notification . ' geleert.';
        }
    } 


?>

6.JPG