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 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 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 ID (dezimal) ausgeliefert. FĂŒr die Öffnung und Schieß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

Über mich

Schon in jungen Jahren war ich fasziniert von den Möglichkeiten, die Computer und Technik bieten. In dieser Zeit brachte ich mir das Programmieren selbst bei und konfigurierte Betriebssysteme und Software bis spÀt in die Nacht.

Im Studium erweiterte und vertiefte ich mein Wissen. ZunÀchst in Bonn, wo ich Physik studierte. Die Physik ist ideal, um analytisches Denken zu erlernen und lösungsorientiertes Handeln zu verinnerlichen.
Dabei kam der Wunsch auf, praxisnÀheres Wissen zu erlangen und mich wieder stÀrker auf den Bereich Technik und IT zu fokussieren. Deshalb setzte ich mein Studium in Bochum fort, wo ich IT-Sicherheit studierte und mit dem Master of Science abschloss.

Seitdem entwickle ich IT-Lösungen und Internet-of-Things-Anwendungen und berate Kunden im Bereich IT-Sicherheit und Netzwerke. Schauen Sie sich doch einmal meine Dienstleistungspalette an!



Kontakt

E-Mail kontakt (a) rudo.info
PGP-SchlĂŒssel   939E96E995890F9C
Telefon+49 1590 18 222 97

Sie erreichen mich am besten per E-Mail oder ĂŒber das Kontaktformular. Schildern Sie darin bitte kurz Ihr Anliegen und ich werde mich schnellstmöglich bei Ihnen melden. Da ich unterschiedlich in meine Projekte eingebunden bin, schwankt meine telefonische Erreichbarkeit entsprechend.

Ich freue mich von Ihnen zu hören!
Ihr Thomas Rudolph

Kontaktformular



Ihr Name

Ihre E-Mail-Adresse

Leer lassen


Ihre Nachricht

Ihre Anfrage wird verschlĂŒsselt an den Webserver geschickt. Sie erklĂ€ren sich damit einverstanden, dass Ihre Angaben zur Beantwortung Ihrer Anfrage von mir verwendet werden dĂŒrfen.

Ich stimme den DatenschutzerklÀrungen zu.


     
Impressum, Schlichtungsstelle und DatenschutzerklĂ€rung