Push Notifications für Android via NotifiyMyAndroid (NMA)

Hallo Ihr,

da für’s iPhone schon was existiert, aber mir ein solcher Gerätehersteller nicht zusagt, habe ich hier nun zwei Scripte für Android-Benutzer. Es wird zunächst ein Account bei http://notifymyandroid.com und deren App (aus dem Store unter gleichen Namen) benötigt. Hier dann auf der Seite auch gleich einen API-Key generieren und dann in dieses Script hineinkopieren (yourAPIkeyhere ersetzen). Wichtig: die OpenSSL-Extension wird benötigt für sichere https-Übertragung! Wer darauf keinen Wert legt, ändert einfach die https- in http-Pfade.

<?php
class nmaApi
{
    // @const LIB_ERROR_TYPE can be exception or error
   const LIB_ERROR_TYPE = 'error';

   // @const holds the api key verify url
   const LIB_NMA_VERIFY = 'https://www.notifymyandroid.com/publicapi/verify';

   // @const holds the notify url
   const LIB_NMA_NOTIFY = 'https://www.notifymyandroid.com/publicapi/notify';

   // toggles on debugging
   // @var bool
   public $debug = false;
   public $apiCallsRemaining = true;
   public $apiLimitReset = false;
   public $lastStatus = false;
   // @var bool|string
   protected $apiKey = 'yourAPIkeyhere';
   // @var bool|string
   protected $devKey = false;
   protected $error_codes = array(
            200     => 'Notification submitted.',
            400     => 'The data supplied is in the wrong format, invalid length or null.',
            401     => 'None of the API keys provided were valid.',
            402     => 'Maximum number of API calls per hour exceeded.',
            500     => 'Internal server error. Please contact our support if the problem persists.'
   );

   // @param array $options
   function __construct($options = array()){
        if (!isset($options['apikey'])) {
            return $this->error('You must supply a API Key');
        } else {
            $this->apiKey = $options['apikey'];
        };

        if (isset($options['developerkey'])) {
            $this->devKey = $options['developerkey'];
        };

        if (isset($options['debug'])) {
            $this->debug = true;
        };
        return true; // this shuts my ide up
    }

   // @param bool $key [optional] if not set the one used on construct is used
   // @return bool|mixed|SimpleXMLElement|string
    public function verify($key = false)
    {
        $options = array();
        if ($key !== false) {
            $options['apikey'] = $key;
        } else {
            $options['apikey'] = $this->apiKey;
        };
        if ($this->devKey) {
            $options['developerkey'] = $this->devKey;
        };
        return $this->makeApiCall(self::LIB_NMA_VERIFY, $options);
    }

    /**
     * @param string $application
     * @param string $event
     * @param string $description
     * @param int    $priority
     * @param bool   $apiKeys
     * @return bool|mixed|SimpleXMLElement|string
     */
    public function notify($application = '', $event = '', $description = '', $priority = 0, $apiKeys = false)
    {
        if (empty($application) || empty($event) || empty($description)) {
            return $this->error('you must supply a application name, event and long desc');
        };
        $post = array('application' => substr($application, 0, 256),
                      'event'       => substr($event, 0, 1000),
                      'description' => substr($description, 0, 10000),
                      'priority'    => $priority
        );
        if ($this->devKey) {
            $post['developerkey'] = $this->devKey;
        };

        if ($apiKeys !== false) {
            $post['apikey'] = $apiKeys;
        } else {
            $post['apikey'] = $this->apiKey;
        };
        return $this->makeApiCall(self::LIB_NMA_NOTIFY, $post, 'POST');
    }

    /**
     * @param        $url
     * @param null   $params
     * @param string $verb
     * @param string $format
     *
     * @return bool|mixed|SimpleXMLElement|string
     * @throws Exception
     */
    protected function makeApiCall($url, $params = null, $verb = 'GET', $format = 'xml')
    {
        $cparams = array(
            'http' => array(
                'method'        => $verb,
                'ignore_errors' => true
            )
        );
        if ($params !== null && !empty($params)) {
            $params = http_build_query($params);
            if ($verb == 'POST') {
                $cparams['http']['header'] = 'Content-Type: application/x-www-form-urlencoded';
                $cparams['http']['content'] = $params;
            } else {
                $url .= '?' . $params;
            };
        } else {
            return $this->error(
                'this api requires all calls to have params' . $this->debug ? ', you provided: ' . var_dump($params)
                    : ''
            );
        };
        $context = stream_context_create($cparams);
        $fp = fopen($url, 'rb', false, $context);
        if (!$fp) {
            $res = false;
        }
          else {
            if ($this->debug) {
                $meta = stream_get_meta_data($fp);
                $this->error('var dump of http headers' . var_dump($meta['wrapper_data']));
            };
            $res = stream_get_contents($fp);
        };
        if ($res === false) {
            return $this->error("$verb $url failed: $php_errormsg");
        };
        switch ($format) {
            case 'json':
                return $this->error('this api does not support json');
            /*
            * uncomment the below if json is added later
            * $r = json_decode($res);
           if ($r === null) {
               return $this->error("failed to decode $res as json");
           }
           return $r;*/

            case 'xml':
                $r = simplexml_load_string($res);
                if ($r === null) {
                    return $this->error("failed to decode $res as xml");
                }
                return $this->process_xml_return($r);
        }
        return $res;
    }

    /**
     * @param     $message
     * @param int $type
     *
     * @return bool
     * @throws Exception
     */
    private function error($message, $type = E_USER_NOTICE)
    {
        if (self::LIB_ERROR_TYPE == 'error') {
            trigger_error($message, $type);
            return false;
        } else {
            throw new Exception($message, $type);
        }
    }

    // @param SimpleXMLElement $obj
    // @return bool
    private function process_xml_return(SimpleXMLElement $obj)
   {
       if (isset($obj->success)) {
          $this->lastStatus = $obj->success["@attributes"]['code'];
         $this->apiCallsRemaining = $obj->success["@attributes"]['remaining'];
         $this->apiLimitReset = $obj->success["@attributes"]['resettimer'];
         return true;
      } elseif (isset($obj->error)) {
          if (isset($obj->error["@attributes"])) {
             $this->lastStatus = $obj->error["@attributes"]['code'];
            if (isset($obj->error["@attributes"]['resettimer'])) {
                $this->apiLimitReset = $obj->error["@attributes"]['resettimer'];
            }
         };
         return $this->error($obj->error);
      }
        else {
          return $this->error("unkown error");
      };
   }
}
?>

Quelle des Scriptes: GitHub - snider/php-notifyMyAndroid: a PHP5 lib to use www.notifymyandroid.com
Dieses Script sollte als nmaApi.class.php abgelegt werden.

Zum Senden als Beispiel siehe nächstes Script:

<?php
require 'nmaAPI.class.php';

$nma = new nmaApi(array('apikey' => 'yourAPIkeyhere'));

if($nma->verify())
{
    if($nma->notify('IP-Symcon', 'Info', 'Kinda cool, php to my droid... nice'))
     {
        echo "Notifcation sent!";
    }
}
?>

So viel Spass damit.

Grüße
Kevin

Installiert und funkt auf anhieb, Danke.

Sehr interessant !!!

Frage: Wie sind die Erfahrungswerte bzgl. der Zustellzeiten? Insbesondere wenn das Smartphone im Standby ist.

Ich nutze auch Notifry aber hier sind die Zustellzeiten der Nachrichten leider teilweise recht lange (mehrere Minuten später).

Bis jetzt ca. 10 x getestet seit gestern.
Geschätzte Zustellzeit unter 10 Sekunden.

… und wie lange dauert’s wenn das Mobile im Standby (nach 10min im Stby)???

Mit Notifry kann’s schon mal 5-10min dauern bis die Nachricht ankommt.

sobald ich Zeit hab teste ich mal

Funktioniert pefekt :slight_smile: danke

komischerweise bekomm ich aber keine Meldung wenn ich im WLAN bin, im GPRS/UMTS klappt es sofort…

Kann ich nicht bestätigen

habe 2 Geräte laufen bei beiden wie vor unter 10 Sekunden.

eben getestet ca. 25 x

Habe allerdings die 4,- € für Premium Account ausgegeben.

Hallo ich habe die zwei skripte angelegt aber beim ausführen bekomme ich folgendes:

Warning: require(nmaAPI.class.php): failed to open stream: No such file or directory in C:\IP-Symcon\scripts\43852.ips.php on line 2
[0] in function require in C:\IP-Symcon\scripts\43852.ips.php on line 2

Fatal error: require(): Failed opening required ‚nmaAPI.class.php‘ (include_path=’.;C:\php\pear’) in C:\IP-Symcon\scripts\43852.ips.php on line 2

alles ok funktioniert

Dank dieser super Anleitung habe auch ich es hinbekommen :wink:

Hat jemand schon Erfahrungen im Zusammenhang mit Tasker gemacht? Ich würde den Notify Text gerne als Variable an den tasker übergeben und ihn dann per tts vorlesen lassen.
Alles was ich über Tante Google herausgefunden habe ist: "Es sollte gehen …)

Viele Grüße
Boris

Nutzt jemand den Dienst und hat seit gestern Probleme damit? Ich kann mit IPS keine Nachrichten mehr senden. Und die App meldet nur noch: Internal server error…

Ja. Habe auch probleme.

Server sind anscheinend down.

Ich probiere gerade eine Alternative aus: Pushover: Simple Notifications for Android, iOS, and Desktop
Erste Tests waren erfolgreich! :wink:

  1. Wie lange dauert es bis Nachrichten über Pushover übermittelt werden?
  2. Was passiert bei Pushover wenn das Gerät ausgeschaltet war? Wird die Nachricht so lange gespeichert bis das Gerät wieder online ist?

Nachrichten werden sofort übermittelt. Nach dem Einschalten werden alle verpassten Nachrichten angezeigt.