Thomas Rudolph  •  IT-Sicherheit   •  Internet of Things   •  IT-Lösungen


  Menü:
  🏠     Start
  💻     IT-Lösungen & Digitalisierung
  〰     Sensoren & Internet of Things
  🔒     IT-Sicherheit
  📈     Datenanalyse & Karten
  👨     Portfolio
  📝     Artikel & Anleitungen
  🙋️     Über mich


Gotify mit dem ESP8266/ESP32/Arduino ansprechen

(Please find this text in English here)


Stand: 2020-02-11

Worum geht es?

Gotify ist ein in Go geschriebener und unter Linux lauffähiger Dienst, der Push-Nachrichten an Mobiltelefone und Browser sendet. Es handelt sich um ein Open-Source-Projekt, das selbst gehostet werden muss. Ideal eignet sich also ein Einplatinencomputer wie der Raspberry Pi, der sowieso schon existiert, bereits andere Aufgaben übernimmt und offene Ports ins Internet besitzt. Gotify bringt einen eigenen Webserver mit und per HTTP-REST-API lassen sich schließlich die Push-Nachrichten generieren.

Beispielsweise können also Alarme (Temperaturen, geöffnete Türen, ...) per Gotify an das eigene Mobiltelefon weitergeleitet werden. Angenehmerweise gibt es die zugehörige App googlefrei im F-Droid.

Nachteil ist, dass es keine Gotify-Dienste im Netz gibt. Der cloud-gewöhnte Nutzer geht leer aus und muss den Server selbst aufsetzen. Vergleichbare Dienste existieren, wollen aber Geld sehen oder sind nur mit Google-Konto zu nutzen.


Das Problem

Ich benötigte bei meinem Test mehrere Anläufe, um vom ESP8266 aus per HTTP-POST mit Gotify in Verbindung zu treten, denn Gotify ist ein wenig pingelig, was die JSON-Formatierung der Nachrichten angeht. Daher findet Ihr hier einen ganz schnellen Proof-of-Concept, wie so eine Kommunikation funktioniert. Ausgelöst wird die Meldung an Gotify von einem mit einem RXB6-Funkmodul empfangenen ASK-modulierten Signal eines Türsensors (433 MHz). Für alle anderen Anwendungen könnt Ihr natürlich den RXB6-Kram rausschmeißen, also alles mit RCSwitch und mySwitch. Die Gotify-Kommunikation findet ausschließlich in void post statt.


Ein paar Worte zum RXB6-Funkmodul

Jedes Modul wird mit eigenen, festen und maximal siebestelligen (dezimal) ID ausgeliefert. Für die Öffnung und Schließung des Sensors wird eine unterschliedliche ID gesendet. Der beim Schließen gesendete Wert liegt nach meiner Beobachtung stets um den Wert 4 unter dem, der beim Öffnen gesendet wird. Die Reichweite des Moduls ist freilich eingeschränkt. Ganz grob gesagt reicht das Signal hinter eine Wand mehr als WLAN. Im Gebäude ist zuverlässiger Empfang nur bis etwa 20 Meter Entfernung gegeben. Im Freien sicherlich deutlich weiter, das habe ich jedoch nicht getestet. Auch sollte die Verwendung einer guten Antenne auf Empfängerseite die Reichweite vergrößern können.


Code

/*
  simple example for receiving. Modification by Thomas Rudolph.
  Source: https://github.com/sui77/rc-switch/
*/
#include <RCSwitch.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>


RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  Serial.println("\r\nMoin!");
  
  mySwitch.enableReceive(4);
  wifiInit();
}

void wifiInit() {
  WiFi.mode(WIFI_STA);
  WiFi.begin("yourSSID","yourWiFiKey");
  Serial.print("Verbinde mit WLAN ");

  uint8_t temp = 0;

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    temp++;
    if (temp % 7 == 0) Serial.print(".");
    if (temp > 100) ESP.restart(); // reboot if no connection can be established
  }
  Serial.println(WiFi.localIP());
}

void post(bool status) {
  HTTPClient http;
  http.begin("http://yourgotifyserver:90/message?token=yourgotifytoken");

  http.addHeader("Content-Type", "application/json");
  
  uint16_t httpResponseCode;

  if (status) httpResponseCode =
    http.POST("{\"message\": \"ist offen\",\"title\": \"Tür\",\"priority\": 5}");
  if (!status) httpResponseCode =
    http.POST("{\"message\": \"ist zu\",\"title\": \"Tür\"}");

  if(httpResponseCode>0) {

    String response = http.getString();

    Serial.println(httpResponseCode);
    Serial.println(response);

  } else {

    Serial.print("Error on sending POST: ");
    Serial.println(httpResponseCode);
  }

  http.end();
}


void loop() {
  if (mySwitch.available()) {
    
    Serial.print("Received ");
    Serial.print( mySwitch.getReceivedValue() );
    Serial.print(" / ");
    Serial.print( mySwitch.getReceivedBitlength() );
    Serial.print("bit ");
    Serial.print("Protocol: ");
    Serial.println( mySwitch.getReceivedProtocol() );

    if (mySwitch.getReceivedValue() == 4410158) post(1);
    if (mySwitch.getReceivedValue() == 4410154) post(0);

    mySwitch.resetAvailable();
    delay(1000);
  }
}

Gotify Web-Oberfläche
Website des Gotify-Webservers


   Sie sehen das eingeschränkte Design für einfache Browser. Zurück zur normalen Ansicht.
Impressum, Schlichtungsstelle und Datenschutzerklärung