Rainer-Rebhan

Push Nachrichten senden mit PUSHOVER

Arduino und das WiFi Modul ESP8266 sendet Push-Nachrichten

Arduino - Hardware und Programmierung

Neben einer Email oder SMS kann man sich Informationen auch über sog. Push-Nachrichten auf das Mobiltelefon senden lassen. Es gibt, unter anderen, hier für den Nachrichtendienst PUSHOVER. Ich habe das einmal getestet und bin begeistert - die gesendete Nachricht kommt praktisch ohne Verzögerung an. Ich sende Nachrichten aus meinen Arduino-Projekten auf mein Mobiltelefon. Es funktioniert aber auch aus vielen anderen Anwendungen heraus auf das Mobiltelefon und auf einen Desktop-Rechner. Hier zeige ich einmal wie man mit dem ESP8266 -WiFi-Shield und einem Arduino-Sketch eine Push-Nachricht auf das Mobiltelefon versendet.

Das ist notwendig:

Die Hardware besteht bei mir aus einem Arduino Mega (funktioniert auch mit dem UNO) mit einem ESP8266 Shield (das Shield ist hier beschrieben ). Die notwendige eigene Software ist der unten stehende Arduino-Sketch und ein PHP-Skript auf einem Server. Dann benötigt man noch die Anmeldung am Nachrichtendienst PUSHOVER und die Installation der APP Pushover auf dem Mobiltelefon.

Pushover

Zur Nutzung des Nachrichtendienst Pushover muss man sich zunächst dort anmelden und die entsprechende APP (Android, iOS, Desktop) installieren. Nach einer Woche kann man die APP, für eine weitere Nutzung, für einige €'s kaufen, was sich aus meiner Sicht lohnt. Nach der Anmeldung sind weitere Informationen über den Empfänger der Nachricht (Device Clients) notwendig. Ist alles richtig angelegt kann man direkt von der Installationsseite eine Testnachricht senden. Bei der Einrichtung des eigenen Accounts und des Endgerätes erhält man 2 wichtige Schlüssel-Infos ( User-Key und APP-Token) die man sich unbedingt speichern sollte. Den User-Key erhält man sofort nach der Anmeldung, den APP-Token nach der Einrichtung des eigenen Gerätes auf dem die Push-Nachricht gesendet wird. Beide Key's werden im PHP-Skript benötigt. Darüber hinaus lassen sich die unterschiedlichsten Endgeräte angeben. Pushover hat eine ausführlich beschriebene API, bietet neben anderen Features (z.B. EMail) eine Hilfe-FAQ und ein Forum.

PHP-Skripte auf einem Web-Server

Die zu sendende Push-Nachricht muss, mit noch weiteren Informationen, über HTTPS an den Pushover-Server gesendet werden, das lässt sich nicht direkt über einen Arduino Sketch machen. Deshalb benötigt man einen "Zwischenschritt" mittels eines (Web) Servers auf dem PHP-Skripte laufen. I.d. Regel ermöglichen das alle Web-Hosting-Server. Hat man Zugriff auf einen Web-Server, dann läd man die beiden PHP-Skripte die von Chris Schalenborgh entwickelt wurden, einfach hoch. Hier die beiden geänderten PHP-Skipte zum Download. Im PHP-Skript (pushme.php) können verschiedene Eigenschaften für die Push-Nachricht eingestellt werden. Weitere Infos stehen in den PHP-Kommentaren.

Link-Informationen


Arduino Sketch Pushover

Die Verbindung zum Internet erfolgt über das ESP8266 Shield. Die PHP-Skripte auf dem WEB-Server werden über einen POST-Request mit der Push-Nachricht angesprochen. Die Strings für den Post-Request sind im Programmspeicher abgelegt. Über den Arduino-Debug-Monitor sind die Echos der PHP-Skripte gut zu verfolgen.
/* Pushover Test Arduino IDE 1.6.4 */ #include "WiFiEsp.h" char ssid[] = "xxxxxxxxxxxxxxxx"; // your network SSID (name) char passw[] = "yyyyyyyyyyyyyyyy"; // your network password int wifi_status = WL_IDLE_STATUS; // the Wifi status //---------PHP Server Request Strings--------------------------------------- #define prog_char char const PROGMEM prog_char post_header[] = "POST /pushover/pushme.php HTTP/1.1\r\n"; //PHP-Skripte Ordner const PROGMEM prog_char post_host [] = "HOST: www.zzzzzzzzzzzzzzz.de\r\n"; //your Webserver-Name/Ordner const PROGMEM prog_char post_user [] = "User-Agent: ArduinoWiFi/1.1\r\n"; const PROGMEM prog_char post_conn [] = "Connection: close\r\n"; const PROGMEM prog_char post_contt [] = "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n"; const PROGMEM prog_char post_contl [] = "Content-Length: "; const char* const PHP_Content[] PROGMEM = {post_header, post_host, post_user, post_conn, post_contt, post_contl}; #define POST_REQ_HEADER 0 #define POST_REQ_HOST 1 #define POST_REQ_USER 2 #define POST_REQ_CONN 3 #define POST_REQ_CONTT 4 #define POST_REQ_CONTL 5 //---------String Buffer------------------------------------------------------ #define STRINGBUFF_SIZE 120 char stringbuffer[STRINGBUFF_SIZE]; //---------WEB Server--------------------------------------------------------- #define WEBSERVER_PORT 80 WiFiEspServer WEBserver(WEBSERVER_PORT); String WEBhttpString = ""; boolean WebReqEnde = false; boolean GETokay = false; //---------PHP Server Skript------------------------------------------------- #define PHP_DATEN_VAR "pushinfo=" WiFiEspClient PHPclient; char PHPServerName[] = "www.zzzzzzzzzzzzz.de"; char PHP_REQChar; int PHP_REQ_String_Laenge = 0; boolean PushReq_okay = false; String DatenString_Push = "Das ist meine Push-Nachricht"; // <-------------------- hier die eigene Push Nachricht //----------------------------------------------------------------------------- void CheckFreeRam() { int RAM = freeRam(); if(RAM < 1000){String ram = String(RAM); Serial.println(F("RAM < 1000"));} } int freeRam() { extern int __heap_start, *__brkval; int v; return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); } //------------------------------------------------------------------------------ int inByte = 0; // Zum Testen über Konsole //------------------------------------------------------------------------------ //-----------------Arduino WIFi Modul---------------------------------------------------- void Start_WiFI_Verbindung() { while (wifi_status != WL_CONNECTED) { Serial.print(F("... verbinden mit ")); Serial.println(ssid); wifi_status = WiFi.begin(ssid, passw); } } void ShowWifiData() { IPAddress ip = WiFi.localIP(); Serial.print(F("\n\rIP Address: ")); Serial.println(ip); byte mac[6]; WiFi.macAddress(mac); Serial.print(F("MAC Address: ")); Serial.print(mac[5],HEX); Serial.print(":"); Serial.print(mac[4],HEX); Serial.print(":"); Serial.print(mac[3],HEX); Serial.print(":"); Serial.print(mac[2],HEX); Serial.print(":"); Serial.print(mac[1],HEX); Serial.print(":"); Serial.println(mac[0],HEX); } void ShowCurrentNet() { Serial.print(F("SSID: ")); Serial.println(WiFi.SSID()); byte bssid[6]; WiFi.BSSID(bssid); Serial.print("BSSID: "); Serial.print(bssid[5],HEX); Serial.print(":"); Serial.print(bssid[4],HEX); Serial.print(":"); Serial.print(bssid[3],HEX); Serial.print(":"); Serial.print(bssid[2],HEX); Serial.print(":"); Serial.print(bssid[1],HEX); Serial.print(":"); Serial.println(bssid[0],HEX); long rssi = WiFi.RSSI(); Serial.print(F("WLan Signal Staerke(RSSI):")); Serial.println(rssi); } //####################################################################################### //-------Request zum PHP Server für EMail------------------------------------------------ void PhpContentPrint(int posi) { strcpy_P(stringbuffer,(char*)pgm_read_word(&(PHP_Content[posi]))); PHPclient.print(stringbuffer); } void RequestToPHPserver() { PHPclient.stop(); DatenString_Push = PHP_DATEN_VAR + DatenString_Push; int DSL = DatenString_Push.length(); PushReq_okay = true; Serial.print("\n\rPushText: "); Serial.print(DatenString_Push); Serial.print(" StringL: "); Serial.println(DSL); memset(stringbuffer,0,STRINGBUFF_SIZE); if (PHPclient.connect(PHPServerName, 80)) { Serial.print(F("\n\rsende Req PHP...")); PhpContentPrint(POST_REQ_HEADER); PhpContentPrint(POST_REQ_HOST); PhpContentPrint(POST_REQ_USER); PhpContentPrint(POST_REQ_CONN); PhpContentPrint(POST_REQ_CONTT); PhpContentPrint(POST_REQ_CONTL); PHPclient.println(DSL); PHPclient.println(); PHPclient.println(DatenString_Push); PHPclient.println(); Serial.println(F("ende")); }else{ Serial.println("Keine Verbindung zum Server"); PHPclient.stop(); } } //-----------------Eingabe--------------------------------------------- void Eingabe_Auswahl() { if(Serial.available() > 0) { inByte = Serial.read(); if(inByte == 35) //-#- { RequestToPHPserver(); } if(inByte == 116) //-t- { } if(inByte == 119) //-w- { } if(inByte == 100) //-d- { } if(inByte == 43) //- + - { ShowWifiData(); ShowCurrentNet(); } } } //########################################################################## void setup() { Serial.begin(19200); Serial.println(F("-----------------Pushover Test--------------------")); Serial.println(F("MEGA-Board + WiFi8266-Modul")); Serial.println(F("--------------------------------------------------")); Serial.println(F("Eingabe # fuer Post-Request Pushover")); Serial.println(F("Eingabe + fuer WiFi Infos")); Serial.println(F("--------------------------------------------------")); Serial3.begin(115200); // initialize serial for ESP module WiFi.init(&Serial3); // initialize ESP module Start_WiFI_Verbindung(); Serial.print(F("Firmware Version= ")); Serial.println(WiFi.firmwareVersion()); Serial.print(F("Netzwerk= ")); Serial.println(WiFi.SSID()); Serial.print(F("IP Address= ")); Serial.println(WiFi.localIP()); Serial.print(F("RAM = ")); Serial.println(freeRam()); } //------------------------------------------------------------------------------------ void loop() { Eingabe_Auswahl(); WiFiEspClient WEBclient = WEBserver.available(); if (WEBclient) { //Serial.println("Web-Req..."); WEBhttpString = ""; boolean LeerZeile = false; WebReqEnde = true; //ein HTTP Request endet mit einer leeren Zeile while (WEBclient.connected()) { if (WEBclient.available()) { char c = WEBclient.read(); WEBhttpString += c; //if (WEBhttpString.length() < 100) WEBhttpString += c; Serial.write(c); //if(c == '\n' && LeerZeile) {WebReqEnde = true; break;} //if(c == '\r'){LeerZeile = true;}else{LeerZeile = false;} } }//while Web connected } //------------------------------------------------------------------------------------ }
nach oben zurueck weiter