Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Off Topic
  4. Darstellung einer Pulsoximetriekurve

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    491

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.6k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.6k

Darstellung einer Pulsoximetriekurve

Geplant Angeheftet Gesperrt Verschoben Off Topic
61 Beiträge 5 Kommentatoren 7.9k Aufrufe 4 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • AlexAxelA Offline
    AlexAxelA Offline
    AlexAxel
    schrieb am zuletzt editiert von
    #1

    Hallo Leute, ich brauche mal Euer Wissen / Eure Hilfe bei einem Problemchen:

    Ich habe ein fertiges Pulsoximeter via ESP32/Bluetooth/Wifi und MQTT Protokoll angezapft und somit eine "Brücke" gebastelt,um die Werte als Datenpunkte darzustellen. Das klappt soweit auch sehr gut:

    Bildschirmfoto vom 2023-12-24 11-18-46.png

    Nun arbeite ich daran, die Blutdruckkurve, die das Gerät darstellt und als CustomCaracteristics bereit stellt. Naja kurz gesagt ich habe ein Array von ca. 30 bytes, die eine kleine Kurve mit einem Wertebereich von 0-255 darstellen. Also die Daten habe ich auch.

    Meine Defizite liegen eher woanders. Ich finde einfach keine Lösung die Daten schön darzustellen. Habe schon 2 Anätze, die nicht funktionieren:

    1. Schleife in JS bauen, die jedes Byte nacheinander in ein Datenpunkt schreibt und das Livechart schaut auf diesen. Leider sagt der Scripteditor, dass ich den Datenpunkt zu häufig aktualisiere. (ca 1000 mal pro Minute). Das Array wird ca. in 0,5 Sekunden intervall über MQTT geupdated.

    2. Ich erzeuge keine unnötige Umrechnung mit neuen Datenpunkten, sondern nehme gleich das Array und zeichne mit dem HTML objekt und JS die Kurve mit senkrechten Linien selber und rotiere dann die aktuellen Werte. Ich habe angefangen Linien mal zeitlich einzeln darzustellen. ChatGTP hat mir dabei geholfen:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Vertical Lines Animation</title>
    </head>
    <body>
        <canvas id="myCanvas" width="200" height="200"></canvas>
    
        <script>
            // JavaScript-Funktion zum Zeichnen von 10 roten senkrechten Linien im Abstand von 10 Pixeln
            function drawVerticalLines() {
                // Canvas-Element und 2D-Kontext abrufen
                var canvas = document.getElementById("myCanvas");
                var ctx = canvas.getContext("2d");
    
                // Anzahl der Linien und der Abstand zwischen den Linien
                var numLines = 10;
                var lineSpacing = 10;
    
                // Funktion zum Zeichnen einer Linie
                function drawLine(x) {
                    ctx.beginPath();
                    ctx.moveTo(x, 0);
                    ctx.lineTo(x, canvas.height);
                    ctx.strokeStyle = "red";
                    ctx.stroke();
                }
    
                // Funktion zum animierten Zeichnen der Linien
                function drawLinesSequentially(index) {
                    if (index < numLines) {
                        var x = index * (lineSpacing + 1); // 1 Pixel Lücke zwischen den Linien
                        drawLine(x);
                        setTimeout(function () {
                            drawLinesSequentially(index + 1);
                        }, 1000); // Eine Sekunde Verzögerung zwischen den Linien
                    }
                }
    
                // Starte die Animation
                drawLinesSequentially(0);
            }
    
            // Die Funktion aufrufen, wenn die Seite geladen ist
            window.onload = drawVerticalLines;
        </script>
    </body>
    </html>
    
    

    Leider werden die Striche nicht zeitlich dargestellt.
    Das unglaubliche: Lade ich den gleichen Code auf eine offline HTML Seite vom Desktop, funktioniert es. Ich habe das Gefühl, dass Animationen in HTML mit SetTimeout im IO Broker nicht funktionieren.

    Habt Ihr eine Lösung ? Gerne auch ganz andere Alternativen. Letztendlich soll die View so eine Kurve darstellen, wie ungefähr hier:
    Bildschirmfoto vom 2023-12-24 11-31-23.png

    (Hinweis, ich baue kein Medizinprodukt. Es ist einfach hilfreich im Haushalt, wenn überall Tablets an der Wand hängen und Alexa, ein paar Meldungen macht, wenn der Fingersensor ab und ein paar Werte zu hoch oder niedrig sind. Das Gerät selber hat auch eigene Warnfunktionen).

    Vielen Dank Euch allen !!!

    VG
    Alex

    HomoranH AlexAxelA 2 Antworten Letzte Antwort
    0
    • AlexAxelA AlexAxel

      Hallo Leute, ich brauche mal Euer Wissen / Eure Hilfe bei einem Problemchen:

      Ich habe ein fertiges Pulsoximeter via ESP32/Bluetooth/Wifi und MQTT Protokoll angezapft und somit eine "Brücke" gebastelt,um die Werte als Datenpunkte darzustellen. Das klappt soweit auch sehr gut:

      Bildschirmfoto vom 2023-12-24 11-18-46.png

      Nun arbeite ich daran, die Blutdruckkurve, die das Gerät darstellt und als CustomCaracteristics bereit stellt. Naja kurz gesagt ich habe ein Array von ca. 30 bytes, die eine kleine Kurve mit einem Wertebereich von 0-255 darstellen. Also die Daten habe ich auch.

      Meine Defizite liegen eher woanders. Ich finde einfach keine Lösung die Daten schön darzustellen. Habe schon 2 Anätze, die nicht funktionieren:

      1. Schleife in JS bauen, die jedes Byte nacheinander in ein Datenpunkt schreibt und das Livechart schaut auf diesen. Leider sagt der Scripteditor, dass ich den Datenpunkt zu häufig aktualisiere. (ca 1000 mal pro Minute). Das Array wird ca. in 0,5 Sekunden intervall über MQTT geupdated.

      2. Ich erzeuge keine unnötige Umrechnung mit neuen Datenpunkten, sondern nehme gleich das Array und zeichne mit dem HTML objekt und JS die Kurve mit senkrechten Linien selber und rotiere dann die aktuellen Werte. Ich habe angefangen Linien mal zeitlich einzeln darzustellen. ChatGTP hat mir dabei geholfen:

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Vertical Lines Animation</title>
      </head>
      <body>
          <canvas id="myCanvas" width="200" height="200"></canvas>
      
          <script>
              // JavaScript-Funktion zum Zeichnen von 10 roten senkrechten Linien im Abstand von 10 Pixeln
              function drawVerticalLines() {
                  // Canvas-Element und 2D-Kontext abrufen
                  var canvas = document.getElementById("myCanvas");
                  var ctx = canvas.getContext("2d");
      
                  // Anzahl der Linien und der Abstand zwischen den Linien
                  var numLines = 10;
                  var lineSpacing = 10;
      
                  // Funktion zum Zeichnen einer Linie
                  function drawLine(x) {
                      ctx.beginPath();
                      ctx.moveTo(x, 0);
                      ctx.lineTo(x, canvas.height);
                      ctx.strokeStyle = "red";
                      ctx.stroke();
                  }
      
                  // Funktion zum animierten Zeichnen der Linien
                  function drawLinesSequentially(index) {
                      if (index < numLines) {
                          var x = index * (lineSpacing + 1); // 1 Pixel Lücke zwischen den Linien
                          drawLine(x);
                          setTimeout(function () {
                              drawLinesSequentially(index + 1);
                          }, 1000); // Eine Sekunde Verzögerung zwischen den Linien
                      }
                  }
      
                  // Starte die Animation
                  drawLinesSequentially(0);
              }
      
              // Die Funktion aufrufen, wenn die Seite geladen ist
              window.onload = drawVerticalLines;
          </script>
      </body>
      </html>
      
      

      Leider werden die Striche nicht zeitlich dargestellt.
      Das unglaubliche: Lade ich den gleichen Code auf eine offline HTML Seite vom Desktop, funktioniert es. Ich habe das Gefühl, dass Animationen in HTML mit SetTimeout im IO Broker nicht funktionieren.

      Habt Ihr eine Lösung ? Gerne auch ganz andere Alternativen. Letztendlich soll die View so eine Kurve darstellen, wie ungefähr hier:
      Bildschirmfoto vom 2023-12-24 11-31-23.png

      (Hinweis, ich baue kein Medizinprodukt. Es ist einfach hilfreich im Haushalt, wenn überall Tablets an der Wand hängen und Alexa, ein paar Meldungen macht, wenn der Fingersensor ab und ein paar Werte zu hoch oder niedrig sind. Das Gerät selber hat auch eigene Warnfunktionen).

      Vielen Dank Euch allen !!!

      VG
      Alex

      HomoranH Nicht stören
      HomoranH Nicht stören
      Homoran
      Global Moderator Administrators
      schrieb am zuletzt editiert von
      #2

      @alexaxel sagte in Darstellung einer Pulsoximetriekurve:

      Ich habe ein fertiges Pulsoximeter via ESP32/Bluetooth/Wifi und MQTT Protokoll angezapft und somit eine "Brücke" gebastelt,um die Werte als Datenpunkte darzustellen. Das klappt soweit auch sehr gut:

      haben wollen!
      Dann schieb ich deinen Thread auch dahin wo er hingehört :grin:

      kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

      der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

      AlexAxelA 1 Antwort Letzte Antwort
      0
      • HomoranH Homoran

        @alexaxel sagte in Darstellung einer Pulsoximetriekurve:

        Ich habe ein fertiges Pulsoximeter via ESP32/Bluetooth/Wifi und MQTT Protokoll angezapft und somit eine "Brücke" gebastelt,um die Werte als Datenpunkte darzustellen. Das klappt soweit auch sehr gut:

        haben wollen!
        Dann schieb ich deinen Thread auch dahin wo er hingehört :grin:

        AlexAxelA Offline
        AlexAxelA Offline
        AlexAxel
        schrieb am zuletzt editiert von
        #3

        @homoran Das ist nett, ich habs nicht so mit Foren :-D. Den Service nehme ich gern in Anspruch!

        So hier die Anleitung für Dich und für alle anderen, die sowas auch nachbauen wollen:

        Man Kaufe so einen ESP32 mit Wifi und BLE. Ich habe eine der heiß Lolin32 Lite, kostet 8 Euro oder so.
        Dann installiert man auf Linux oder Win die Entwicklungsumgebung von Arduino ("Arduino IDE"). Richtet diese ein und sucht sich sein passendes Board aus.
        USB verbinden und diesen Sketch für sich anpassen und hochladen: (OK schon etwas verkürzt . Man muss sich schon etwas mit Arduino Zeugs beschäftigen. Aber da gibt es ja etliche Videos.
        Der Code ist übrigens nicht zu 100% von mir. Sind Bausteine von diversen Beispiel-Sketche, die einmal das Thema Wifi, BLE und MQTT behandeln. Quasi alles nur zusammengeklebt.

        Ich empfehle dringend einen BLE Scanner auf dem Handy mal vorab zu installieren. Ihr solltet quasi schon mal ohne IOBroker in der Lage sein, Eure Daten zu finden.
        Die billigen Fingerpulsoximeter haben es so nicht mit Sicherheit. Ihr könnt die Daten in Klartext meist empfangen.

        //Für MQTT Kommunikation
        #include <ArduinoMqttClient.h>
        
        //Wifi Libs
        #include <WiFi.h>
        #include <WiFiMulti.h>
        
        WiFiMulti WiFiMulti;
        WiFiClient wifiClient;
        MqttClient mqttClient(wifiClient);
        
        //BLE Libs
        #include <ArduinoBLE.h>
        
        //Ein paar Customs-Settings
        const char broker[] = "192.168.1.75"; //Eure IOBroker IP muss hier rein
        int        port     = 1883;
        const char Topic_SPo2[]  = "ESP-Oximeter/SPo2"; //Sauerstoffwert
        const char Topic_RP[]  = "ESP-Oximeter/RP"; //puls
        const char Topic_unbekannt1[]  = "ESP-Oximeter/unbekannt1"; // Erste Zahl, die den sogenannten PI-Wert darsgtellt
        const char Topic_unbekannt2[]  = "ESP-Oximeter/unbekannt2"; // zweite Zahl
        const char Topic_DataArray[64]  = "ESP-Oximeter/DataArray"; // 64 Bytes für die Wave-Kurve, hier kann man dann die 4 Takte des Herzens visualisieren.
        
        
        void setup() {
        
          //für LED Kontrolle, LED soll Statusanzeige sein, falls mal was nicht klappt
          pinMode(LED_BUILTIN, OUTPUT);
        
          Serial.begin(9600);
          delay(10);
        
          // We start by connecting to a WiFi network
          //einen passenden hostnamen für das Netzwerk hinterlassen, sonst Chaos auf der Fritzbox.
          WiFiMulti.addAP("EURER WIFI Name", "WIFI Passwort");
          WiFi.setHostname("ESP32-Oximeter-Broker"); //So steht Euer ESP dann bei  FB oder sonstiger Router eindeutig in der Netzwerkliste
        
          Serial.println();
          Serial.println();
          Serial.print("Suche WiFi... ");
        
          while(WiFiMulti.run() != WL_CONNECTED) {
              Serial.print(".");
         
              delay(500);
          }
        
          //so ab hier sind wir schon mal mit Wifi verbunden
          Serial.println("");
          Serial.println("WiFi verbunden");
          Serial.println("IP address: ");
          Serial.println(WiFi.localIP());
        
          //LED mal anmachen
          Serial.println("LED: AN ");
          digitalWrite(LED_BUILTIN, HIGH); 
        
          //-------------------   MQTT Connection ---------------------------
          //Jetzt nach dem Wifi verbunden, den MQTT Broker auf dem IOBroker verbinden
          Serial.print("So wir probieren mal den MQTT Broker zu finden: ");
          Serial.println(broker);
        
          // Pass und USername stehen in der Instanz des MQTT Adapters auf IOBroker
          mqttClient.setUsernamePassword("Username", "Passwort");
        
          if (!mqttClient.connect(broker, port)) {
            Serial.print("Bei MQTT ist irgendwas schiefgelaufen. Error code = ");
            Serial.println(mqttClient.connectError());
        
            while (1);
          }
        
          Serial.println("Wir sind mit dem MQTT-Broker verbunden! Supi!");
          Serial.println();
        
          //-------------------   Bluetooth Scan ---------------------------
        
          while (!Serial);
        
          // BLE Initialisieren
          if (!BLE.begin()) {
            Serial.println("starting Bluetooth® Low Energy module failed!");
        
            while (1);
          }
        
          Serial.println("Scanne nun die BT-Umgebung");
          Serial.println("Das Oximeter sollte eingeschaltet sein");
        
          // starte BLE scan
          BLE.scan();
        }
        
        //-------------------  LOOP ---------------------------
        
        void loop() {
          // Mal schauen, ob ein paar Geräte gefunden werden konnten
          BLEDevice peripheral = BLE.available();
        
          if (peripheral) {
            // Jo, welche gefunden, na dann mal im Serial-Monitor mal ausdrucken
            Serial.print("Found ");
            Serial.print(peripheral.address());
            Serial.print(" '");
            Serial.print(peripheral.localName());
            Serial.print("' ");
            Serial.print(peripheral.advertisedServiceUuid());
            Serial.println();
        
            //Nach dem Oximter schauen, OXIMETER ist der Name, meines Pulsoximeters. Je nach Hersteller natürlich anders. Guckt mit dem Handy einfach nach.
            if (peripheral.localName() == "OXIMETER") {
              // Da ist meins !!  
              BLE.stopScan();
        
                //LED mal anmachen
                Serial.println("LED: AN ");
                digitalWrite(LED_BUILTIN, HIGH); 
                
              //Los verbinde Dich...
              monitorSensorTagButtons(peripheral);
        
              // Wieder scan, wenn die Verbindung verloren gegangen ist
              BLE.scan();
            }
          }
        }
        
        void monitorSensorTagButtons(BLEDevice peripheral) {
          // Auf gehts, das Device ist an und wir haben es per Scan gefunden. Auf und verbinden,,,
        
          Serial.println("Verbinde ...");
          if (peripheral.connect()) {
            Serial.println("Juhu Verbunden...");
          } else {
            Serial.println("Verbindung fehlgeschlagen! Evtl. mal alle Wifi-Geräte zuhause auf 5GHz umstellen. BLE läuft auch auf 2,4 Ghz");
            return;
          }
        
          // discover peripheral attributes
          Serial.println("Hab folgenden service gefunden: 0xffe0 ..."); //FFe0 ist ein typischer servicename. Ihr seht mit einem BLE Scanner, welchen Service ihr suchen müsst.
          if (peripheral.discoverService("ffe0")) {
            Serial.println("Service entdeckt");
          } else {
            Serial.println("Kann den Service auf dem BLE Gerät nicht finden.");
            peripheral.disconnect();
        
            while (1);
            return;
          }
        
          // So jetzt mal die Werte anfragen... Erstmal sagen, was wir haben wollen:
          BLECharacteristic simpleKeyCharacteristic = peripheral.characteristic("ffe1"); // bei meinem Gerät wird unter ffe1 sauerstoff, Puls und andere werte sekündlich gestreamt
        
          // subscribe mal meinen key charateristic
          Serial.println("Subscribing to simple key characteristic ...");
          if (!simpleKeyCharacteristic) {
            Serial.println("no simple key characteristic found!");
            peripheral.disconnect();
            return;
          } else if (!simpleKeyCharacteristic.canSubscribe()) {
            Serial.println("simple key characteristic is not subscribable!");
            peripheral.disconnect();
            return;
          } else if (!simpleKeyCharacteristic.subscribe()) {
            Serial.println("subscription failed!");
            peripheral.disconnect();
            return;
          } else {
            Serial.println("Subscribed");
            
          }
        
          while (peripheral.connected()) {
            // so wir sind mit dem gerät verbunden 
        
            // mal prüfen, ob der Wert aktualisiert wurde
            if (simpleKeyCharacteristic.valueUpdated()) {
              // jau, da ist was neues  angekommen
        
              byte value = 0;
              
              Serial.println();
              simpleKeyCharacteristic.readValue(value);
              printData(simpleKeyCharacteristic.value(), simpleKeyCharacteristic.valueLength());
          
            }
          }
        
          // falls wir hier ankommen, wurde das Ding getrennt
          Serial.println("Pulsoximeter wurde getrennt!");
        }
        
        
        
        void printData(const unsigned char data[], int length) {
          
          // Diese Sub-Routine nimmt nun die Daten auf.
        
          // in meinem Fall picke ich mir Byte 4 und 5 für SPo2 und Puls.
          // Byte 6 und 7 sind die PI-werte, da bastle ich noch rum, daher als Unbekannt markiert.
        
          // ansonsten das ganze array auch noch mal als Datenpunkt über den MQTT Broker rübermöppeln.
        
          // Jetzt die Daten an MQTT senden
          mqttClient.beginMessage(Topic_SPo2);
          mqttClient.print(data[4], DEC);
          mqttClient.endMessage();
        
          mqttClient.beginMessage(Topic_RP);
          mqttClient.print(data[5],DEC);
          mqttClient.endMessage();
          
          mqttClient.beginMessage(Topic_unbekannt1);
          mqttClient.print(data[6],DEC);
          mqttClient.endMessage();
        
          mqttClient.beginMessage(Topic_unbekannt2);
          mqttClient.print(data[7],DEC);
          mqttClient.endMessage();
          
        
          mqttClient.beginMessage(Topic_DataArray);
        
          //eben einen String zusammenbasteln, damit nur ein Datenpunkt verwendet wird. Geht sicherlich auch noch eleganter...
          String sTemp;
          int iWert;
        
          for (int i = 0; i < length; i++) {
            //dbSerialPrint((char)message[i]);
            iWert = int(data[i],DEC);
            sTemp += sChar + ",";
          }
          mqttClient.print(sTemp);
        
          mqttClient.endMessage();
        }
        
        Ralla66R 1 Antwort Letzte Antwort
        0
        • AlexAxelA AlexAxel

          @homoran Das ist nett, ich habs nicht so mit Foren :-D. Den Service nehme ich gern in Anspruch!

          So hier die Anleitung für Dich und für alle anderen, die sowas auch nachbauen wollen:

          Man Kaufe so einen ESP32 mit Wifi und BLE. Ich habe eine der heiß Lolin32 Lite, kostet 8 Euro oder so.
          Dann installiert man auf Linux oder Win die Entwicklungsumgebung von Arduino ("Arduino IDE"). Richtet diese ein und sucht sich sein passendes Board aus.
          USB verbinden und diesen Sketch für sich anpassen und hochladen: (OK schon etwas verkürzt . Man muss sich schon etwas mit Arduino Zeugs beschäftigen. Aber da gibt es ja etliche Videos.
          Der Code ist übrigens nicht zu 100% von mir. Sind Bausteine von diversen Beispiel-Sketche, die einmal das Thema Wifi, BLE und MQTT behandeln. Quasi alles nur zusammengeklebt.

          Ich empfehle dringend einen BLE Scanner auf dem Handy mal vorab zu installieren. Ihr solltet quasi schon mal ohne IOBroker in der Lage sein, Eure Daten zu finden.
          Die billigen Fingerpulsoximeter haben es so nicht mit Sicherheit. Ihr könnt die Daten in Klartext meist empfangen.

          //Für MQTT Kommunikation
          #include <ArduinoMqttClient.h>
          
          //Wifi Libs
          #include <WiFi.h>
          #include <WiFiMulti.h>
          
          WiFiMulti WiFiMulti;
          WiFiClient wifiClient;
          MqttClient mqttClient(wifiClient);
          
          //BLE Libs
          #include <ArduinoBLE.h>
          
          //Ein paar Customs-Settings
          const char broker[] = "192.168.1.75"; //Eure IOBroker IP muss hier rein
          int        port     = 1883;
          const char Topic_SPo2[]  = "ESP-Oximeter/SPo2"; //Sauerstoffwert
          const char Topic_RP[]  = "ESP-Oximeter/RP"; //puls
          const char Topic_unbekannt1[]  = "ESP-Oximeter/unbekannt1"; // Erste Zahl, die den sogenannten PI-Wert darsgtellt
          const char Topic_unbekannt2[]  = "ESP-Oximeter/unbekannt2"; // zweite Zahl
          const char Topic_DataArray[64]  = "ESP-Oximeter/DataArray"; // 64 Bytes für die Wave-Kurve, hier kann man dann die 4 Takte des Herzens visualisieren.
          
          
          void setup() {
          
            //für LED Kontrolle, LED soll Statusanzeige sein, falls mal was nicht klappt
            pinMode(LED_BUILTIN, OUTPUT);
          
            Serial.begin(9600);
            delay(10);
          
            // We start by connecting to a WiFi network
            //einen passenden hostnamen für das Netzwerk hinterlassen, sonst Chaos auf der Fritzbox.
            WiFiMulti.addAP("EURER WIFI Name", "WIFI Passwort");
            WiFi.setHostname("ESP32-Oximeter-Broker"); //So steht Euer ESP dann bei  FB oder sonstiger Router eindeutig in der Netzwerkliste
          
            Serial.println();
            Serial.println();
            Serial.print("Suche WiFi... ");
          
            while(WiFiMulti.run() != WL_CONNECTED) {
                Serial.print(".");
           
                delay(500);
            }
          
            //so ab hier sind wir schon mal mit Wifi verbunden
            Serial.println("");
            Serial.println("WiFi verbunden");
            Serial.println("IP address: ");
            Serial.println(WiFi.localIP());
          
            //LED mal anmachen
            Serial.println("LED: AN ");
            digitalWrite(LED_BUILTIN, HIGH); 
          
            //-------------------   MQTT Connection ---------------------------
            //Jetzt nach dem Wifi verbunden, den MQTT Broker auf dem IOBroker verbinden
            Serial.print("So wir probieren mal den MQTT Broker zu finden: ");
            Serial.println(broker);
          
            // Pass und USername stehen in der Instanz des MQTT Adapters auf IOBroker
            mqttClient.setUsernamePassword("Username", "Passwort");
          
            if (!mqttClient.connect(broker, port)) {
              Serial.print("Bei MQTT ist irgendwas schiefgelaufen. Error code = ");
              Serial.println(mqttClient.connectError());
          
              while (1);
            }
          
            Serial.println("Wir sind mit dem MQTT-Broker verbunden! Supi!");
            Serial.println();
          
            //-------------------   Bluetooth Scan ---------------------------
          
            while (!Serial);
          
            // BLE Initialisieren
            if (!BLE.begin()) {
              Serial.println("starting Bluetooth® Low Energy module failed!");
          
              while (1);
            }
          
            Serial.println("Scanne nun die BT-Umgebung");
            Serial.println("Das Oximeter sollte eingeschaltet sein");
          
            // starte BLE scan
            BLE.scan();
          }
          
          //-------------------  LOOP ---------------------------
          
          void loop() {
            // Mal schauen, ob ein paar Geräte gefunden werden konnten
            BLEDevice peripheral = BLE.available();
          
            if (peripheral) {
              // Jo, welche gefunden, na dann mal im Serial-Monitor mal ausdrucken
              Serial.print("Found ");
              Serial.print(peripheral.address());
              Serial.print(" '");
              Serial.print(peripheral.localName());
              Serial.print("' ");
              Serial.print(peripheral.advertisedServiceUuid());
              Serial.println();
          
              //Nach dem Oximter schauen, OXIMETER ist der Name, meines Pulsoximeters. Je nach Hersteller natürlich anders. Guckt mit dem Handy einfach nach.
              if (peripheral.localName() == "OXIMETER") {
                // Da ist meins !!  
                BLE.stopScan();
          
                  //LED mal anmachen
                  Serial.println("LED: AN ");
                  digitalWrite(LED_BUILTIN, HIGH); 
                  
                //Los verbinde Dich...
                monitorSensorTagButtons(peripheral);
          
                // Wieder scan, wenn die Verbindung verloren gegangen ist
                BLE.scan();
              }
            }
          }
          
          void monitorSensorTagButtons(BLEDevice peripheral) {
            // Auf gehts, das Device ist an und wir haben es per Scan gefunden. Auf und verbinden,,,
          
            Serial.println("Verbinde ...");
            if (peripheral.connect()) {
              Serial.println("Juhu Verbunden...");
            } else {
              Serial.println("Verbindung fehlgeschlagen! Evtl. mal alle Wifi-Geräte zuhause auf 5GHz umstellen. BLE läuft auch auf 2,4 Ghz");
              return;
            }
          
            // discover peripheral attributes
            Serial.println("Hab folgenden service gefunden: 0xffe0 ..."); //FFe0 ist ein typischer servicename. Ihr seht mit einem BLE Scanner, welchen Service ihr suchen müsst.
            if (peripheral.discoverService("ffe0")) {
              Serial.println("Service entdeckt");
            } else {
              Serial.println("Kann den Service auf dem BLE Gerät nicht finden.");
              peripheral.disconnect();
          
              while (1);
              return;
            }
          
            // So jetzt mal die Werte anfragen... Erstmal sagen, was wir haben wollen:
            BLECharacteristic simpleKeyCharacteristic = peripheral.characteristic("ffe1"); // bei meinem Gerät wird unter ffe1 sauerstoff, Puls und andere werte sekündlich gestreamt
          
            // subscribe mal meinen key charateristic
            Serial.println("Subscribing to simple key characteristic ...");
            if (!simpleKeyCharacteristic) {
              Serial.println("no simple key characteristic found!");
              peripheral.disconnect();
              return;
            } else if (!simpleKeyCharacteristic.canSubscribe()) {
              Serial.println("simple key characteristic is not subscribable!");
              peripheral.disconnect();
              return;
            } else if (!simpleKeyCharacteristic.subscribe()) {
              Serial.println("subscription failed!");
              peripheral.disconnect();
              return;
            } else {
              Serial.println("Subscribed");
              
            }
          
            while (peripheral.connected()) {
              // so wir sind mit dem gerät verbunden 
          
              // mal prüfen, ob der Wert aktualisiert wurde
              if (simpleKeyCharacteristic.valueUpdated()) {
                // jau, da ist was neues  angekommen
          
                byte value = 0;
                
                Serial.println();
                simpleKeyCharacteristic.readValue(value);
                printData(simpleKeyCharacteristic.value(), simpleKeyCharacteristic.valueLength());
            
              }
            }
          
            // falls wir hier ankommen, wurde das Ding getrennt
            Serial.println("Pulsoximeter wurde getrennt!");
          }
          
          
          
          void printData(const unsigned char data[], int length) {
            
            // Diese Sub-Routine nimmt nun die Daten auf.
          
            // in meinem Fall picke ich mir Byte 4 und 5 für SPo2 und Puls.
            // Byte 6 und 7 sind die PI-werte, da bastle ich noch rum, daher als Unbekannt markiert.
          
            // ansonsten das ganze array auch noch mal als Datenpunkt über den MQTT Broker rübermöppeln.
          
            // Jetzt die Daten an MQTT senden
            mqttClient.beginMessage(Topic_SPo2);
            mqttClient.print(data[4], DEC);
            mqttClient.endMessage();
          
            mqttClient.beginMessage(Topic_RP);
            mqttClient.print(data[5],DEC);
            mqttClient.endMessage();
            
            mqttClient.beginMessage(Topic_unbekannt1);
            mqttClient.print(data[6],DEC);
            mqttClient.endMessage();
          
            mqttClient.beginMessage(Topic_unbekannt2);
            mqttClient.print(data[7],DEC);
            mqttClient.endMessage();
            
          
            mqttClient.beginMessage(Topic_DataArray);
          
            //eben einen String zusammenbasteln, damit nur ein Datenpunkt verwendet wird. Geht sicherlich auch noch eleganter...
            String sTemp;
            int iWert;
          
            for (int i = 0; i < length; i++) {
              //dbSerialPrint((char)message[i]);
              iWert = int(data[i],DEC);
              sTemp += sChar + ",";
            }
            mqttClient.print(sTemp);
          
            mqttClient.endMessage();
          }
          
          Ralla66R Offline
          Ralla66R Offline
          Ralla66
          Most Active
          schrieb am zuletzt editiert von Ralla66
          #4

          @alexaxel

          schreibe mal bitte welches fertige Pulsoximeter du hast.

          Danke

          AlexAxelA 1 Antwort Letzte Antwort
          0
          • Ralla66R Ralla66

            @alexaxel

            schreibe mal bitte welches fertige Pulsoximeter du hast.

            Danke

            AlexAxelA Offline
            AlexAxelA Offline
            AlexAxel
            schrieb am zuletzt editiert von
            #5

            @ralla66
            Also der Code oben passt zum Pulsoximeter namens Health Tree, aber auch das Pulox PA 200 für 20 Euro geht damit, da stehen halt die Werte an anderer Stelle, aber das Pronzip ist das gleiche.

            Ich hoffe, das geht in Ordnung, wenn ich hier mal 2 Links von Amazon reinpacke, nur mal die Geräte zu zeigen. Verdiene nix daran. Aber nochmal es geht mit jedem billigen 10 Euro Noname Ding aus China.

            PULOX:
            https://amzn.eu/d/7P7BI9b

            Health Tree
            https://amzn.eu/d/bOoKl3Y

            Nur die Geräte von Breuer und von einem Hersteller, der so ein Armband mit einem Silikonfingersensor anbietet, sind etwas komplexer anzubinden. Für Anfänger rate ich bei diesen Geräten erstmal ab.
            Mann muss vorher bei denen ein Key immer sekündlich auf das Gerät senden, sonst kommt da nix. Wer von der Materie hier mehr versteht, kann über die Android(!) IDE den Traffic zwischen offizieller App udn Device mitlesen und den diesen Key auslesen.

            Ralla66R 1 Antwort Letzte Antwort
            0
            • AlexAxelA AlexAxel

              @ralla66
              Also der Code oben passt zum Pulsoximeter namens Health Tree, aber auch das Pulox PA 200 für 20 Euro geht damit, da stehen halt die Werte an anderer Stelle, aber das Pronzip ist das gleiche.

              Ich hoffe, das geht in Ordnung, wenn ich hier mal 2 Links von Amazon reinpacke, nur mal die Geräte zu zeigen. Verdiene nix daran. Aber nochmal es geht mit jedem billigen 10 Euro Noname Ding aus China.

              PULOX:
              https://amzn.eu/d/7P7BI9b

              Health Tree
              https://amzn.eu/d/bOoKl3Y

              Nur die Geräte von Breuer und von einem Hersteller, der so ein Armband mit einem Silikonfingersensor anbietet, sind etwas komplexer anzubinden. Für Anfänger rate ich bei diesen Geräten erstmal ab.
              Mann muss vorher bei denen ein Key immer sekündlich auf das Gerät senden, sonst kommt da nix. Wer von der Materie hier mehr versteht, kann über die Android(!) IDE den Traffic zwischen offizieller App udn Device mitlesen und den diesen Key auslesen.

              Ralla66R Offline
              Ralla66R Offline
              Ralla66
              Most Active
              schrieb am zuletzt editiert von
              #6

              @alexaxel

              Danke für die Informationen, hast du einen Link des Codes mit der Key Routine ?
              Spiele dann mal mit.

              @Homoran ,
              würde da gerne per Tasmota ESP32 und BLE mitspielen. Wie sollen die Daten in den IO kommen ?
              Per Json ,Mqtt, was ist hier am besten ? Der Pulox PA 200 hat ja kein BLE müssten ja dann zum testen
              das gleiche Produkt haben. Hier die Frage dann welcher.

              HomoranH AlexAxelA 2 Antworten Letzte Antwort
              0
              • Ralla66R Ralla66

                @alexaxel

                Danke für die Informationen, hast du einen Link des Codes mit der Key Routine ?
                Spiele dann mal mit.

                @Homoran ,
                würde da gerne per Tasmota ESP32 und BLE mitspielen. Wie sollen die Daten in den IO kommen ?
                Per Json ,Mqtt, was ist hier am besten ? Der Pulox PA 200 hat ja kein BLE müssten ja dann zum testen
                das gleiche Produkt haben. Hier die Frage dann welcher.

                HomoranH Nicht stören
                HomoranH Nicht stören
                Homoran
                Global Moderator Administrators
                schrieb am zuletzt editiert von
                #7

                @ralla66 ich hab auch nur ein Lidl 20€ Pulsoximeter.
                und letzte Woche meinen ersten ESP8266 gekauft.
                war quasi geschenkt, weil ich dadurch keinen Versand mehr bezahlen musste.

                Will mich da irgendwann reinarbeiten

                kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                Ralla66R AlexAxelA 2 Antworten Letzte Antwort
                0
                • HomoranH Homoran

                  @ralla66 ich hab auch nur ein Lidl 20€ Pulsoximeter.
                  und letzte Woche meinen ersten ESP8266 gekauft.
                  war quasi geschenkt, weil ich dadurch keinen Versand mehr bezahlen musste.

                  Will mich da irgendwann reinarbeiten

                  Ralla66R Offline
                  Ralla66R Offline
                  Ralla66
                  Most Active
                  schrieb am zuletzt editiert von
                  #8

                  @homoran

                  dann ist zuerst die Schnittstelle zu prüfen, welche sind da ?
                  BLE oder Kabel USB ? Denke mal BLE.

                  HomoranH 1 Antwort Letzte Antwort
                  0
                  • Ralla66R Ralla66

                    @homoran

                    dann ist zuerst die Schnittstelle zu prüfen, welche sind da ?
                    BLE oder Kabel USB ? Denke mal BLE.

                    HomoranH Nicht stören
                    HomoranH Nicht stören
                    Homoran
                    Global Moderator Administrators
                    schrieb am zuletzt editiert von
                    #9

                    @ralla66 Danke, aber so weit bin ich noch nicht.
                    Hab noch andere (nicht iob) Baustellen. bei iob aber auch

                    kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                    der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                    1 Antwort Letzte Antwort
                    0
                    • Ralla66R Ralla66

                      @alexaxel

                      Danke für die Informationen, hast du einen Link des Codes mit der Key Routine ?
                      Spiele dann mal mit.

                      @Homoran ,
                      würde da gerne per Tasmota ESP32 und BLE mitspielen. Wie sollen die Daten in den IO kommen ?
                      Per Json ,Mqtt, was ist hier am besten ? Der Pulox PA 200 hat ja kein BLE müssten ja dann zum testen
                      das gleiche Produkt haben. Hier die Frage dann welcher.

                      AlexAxelA Offline
                      AlexAxelA Offline
                      AlexAxel
                      schrieb am zuletzt editiert von
                      #10

                      @ralla66 sorry, ich hab so viele hier von den Dingern rumliegen. Das Pulox in der Version hat wirklich kein BT, da habe ich quatsch erzählt und mich mit so einem 10euro Ding vertan :
                      20231225_152234.jpg

                      Wenn ihr schon ein Gerät habt, kauft erstmal nix. Installiert Euch einen BLE scanner, wie der für Android nRF:
                      Screenshot_20231225_155420_One UI Home.jpg

                      Scannt mit dem Handy das Pulsoximeter. Ich hab das mal für Euch hier noch mal gescreenshotet:
                      Screenshot_20231225_152350_nRF Connect.jpg

                      Sobald per scan gefunden, probiert mal die Characteristiks aus und schaut wie hier z.b. ob ihr Daten empfängt. Die Original App des Geräts braucht ihr natürlich dafür nicht.
                      Wenn Daten kommen, dann sieht das ungefähr so aus:
                      Screenshot_20231225_152434_nRF Connect.jpg

                      Per USB Kabel braucht man da erstmal nix machen.
                      Ihr brauch eine USB Verbindjng nur beim hochladen des Codes auf dem ESP.

                      1 Antwort Letzte Antwort
                      0
                      • HomoranH Homoran

                        @ralla66 ich hab auch nur ein Lidl 20€ Pulsoximeter.
                        und letzte Woche meinen ersten ESP8266 gekauft.
                        war quasi geschenkt, weil ich dadurch keinen Versand mehr bezahlen musste.

                        Will mich da irgendwann reinarbeiten

                        AlexAxelA Offline
                        AlexAxelA Offline
                        AlexAxel
                        schrieb am zuletzt editiert von
                        #11

                        @homoran scan doch mal mit nRF Connect wenn du ein Android Handy zur Hand hast. Gibt sicher auch was für Apples.

                        HomoranH 1 Antwort Letzte Antwort
                        0
                        • AlexAxelA AlexAxel

                          @homoran scan doch mal mit nRF Connect wenn du ein Android Handy zur Hand hast. Gibt sicher auch was für Apples.

                          HomoranH Nicht stören
                          HomoranH Nicht stören
                          Homoran
                          Global Moderator Administrators
                          schrieb am zuletzt editiert von
                          #12

                          @alexaxel sagte in Darstellung einer Pulsoximetriekurve:

                          @homoran scan doch mal mit nRF Connect wenn du ein Android Handy zur Hand hast. Gibt sicher auch was für Apples.

                          da müsste doch dann ein BT Logo drauf sein.
                          ist es nicht

                          20231225_161206.jpg

                          @Ralla66 auf dem ESP auch nicht, ist ein ESP8266-12F

                          kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                          AlexAxelA 1 Antwort Letzte Antwort
                          0
                          • HomoranH Homoran

                            @alexaxel sagte in Darstellung einer Pulsoximetriekurve:

                            @homoran scan doch mal mit nRF Connect wenn du ein Android Handy zur Hand hast. Gibt sicher auch was für Apples.

                            da müsste doch dann ein BT Logo drauf sein.
                            ist es nicht

                            20231225_161206.jpg

                            @Ralla66 auf dem ESP auch nicht, ist ein ESP8266-12F

                            AlexAxelA Offline
                            AlexAxelA Offline
                            AlexAxel
                            schrieb am zuletzt editiert von
                            #13

                            @homoran ja BT müssen beide schon haben. Also der ESP und das Pulsoximeter. :grinning:

                            Ich habe gerade über den Hersteller meineS BT Geräts, das auf den der Arduino Code abgestimmt ist, diese günstige Variante für 20 Euro gefunden:

                            https://amzn.eu/d/dexSJNY

                            Die verwenden die gleiche App, wie bei meinem Gerät.
                            Ich gehe davon aus, dass Ihr damit sicher genauso an die Werte kommt.

                            Ralla66R 1 Antwort Letzte Antwort
                            1
                            • AlexAxelA AlexAxel

                              @homoran ja BT müssen beide schon haben. Also der ESP und das Pulsoximeter. :grinning:

                              Ich habe gerade über den Hersteller meineS BT Geräts, das auf den der Arduino Code abgestimmt ist, diese günstige Variante für 20 Euro gefunden:

                              https://amzn.eu/d/dexSJNY

                              Die verwenden die gleiche App, wie bei meinem Gerät.
                              Ich gehe davon aus, dass Ihr damit sicher genauso an die Werte kommt.

                              Ralla66R Offline
                              Ralla66R Offline
                              Ralla66
                              Most Active
                              schrieb am zuletzt editiert von
                              #14

                              @alexaxel

                              bestellt ist nun, lade bitte mal den Arduino Code hier ein oder verlinke den mal.
                              Mqtt, Wlan usw ist ja per ESP kein Problem, BLE ist neu für mich.
                              Muß mich das erst einarbeiten. NRF sollte ja ein spezielles BLE Protokoll sein.

                              AlexAxelA 2 Antworten Letzte Antwort
                              0
                              • Ralla66R Ralla66

                                @alexaxel

                                bestellt ist nun, lade bitte mal den Arduino Code hier ein oder verlinke den mal.
                                Mqtt, Wlan usw ist ja per ESP kein Problem, BLE ist neu für mich.
                                Muß mich das erst einarbeiten. NRF sollte ja ein spezielles BLE Protokoll sein.

                                AlexAxelA Offline
                                AlexAxelA Offline
                                AlexAxel
                                schrieb am zuletzt editiert von
                                #15

                                @ralla66 hatte ich schon. Schau mal, der Code ist weiter oben schon gepostet.

                                Ralla66R 1 Antwort Letzte Antwort
                                0
                                • Ralla66R Ralla66

                                  @alexaxel

                                  bestellt ist nun, lade bitte mal den Arduino Code hier ein oder verlinke den mal.
                                  Mqtt, Wlan usw ist ja per ESP kein Problem, BLE ist neu für mich.
                                  Muß mich das erst einarbeiten. NRF sollte ja ein spezielles BLE Protokoll sein.

                                  AlexAxelA Offline
                                  AlexAxelA Offline
                                  AlexAxel
                                  schrieb am zuletzt editiert von
                                  #16

                                  @ralla66 nRF Connect ist eine Testapp von Nordic, das sind die Lizenzgeber und Patentbesitzer von Bluetoith.

                                  1 Antwort Letzte Antwort
                                  0
                                  • AlexAxelA AlexAxel

                                    @ralla66 hatte ich schon. Schau mal, der Code ist weiter oben schon gepostet.

                                    Ralla66R Offline
                                    Ralla66R Offline
                                    Ralla66
                                    Most Active
                                    schrieb am zuletzt editiert von
                                    #17

                                    @alexaxel

                                    wäre halt die Quelle vom BLE Code interessant gewesen.
                                    Nordic nRF ist mir nicht ganz unbekannt vom Hoymiles Projekt.
                                    Ein Freund ist da gerade mit Developer Kit unterwegs, so richtig tief mit Assembler dran.
                                    Dann warte ich mal aufs Paket und belese mich zu ESP BLE Stoff.

                                    AlexAxelA 1 Antwort Letzte Antwort
                                    0
                                    • Ralla66R Ralla66

                                      @alexaxel

                                      wäre halt die Quelle vom BLE Code interessant gewesen.
                                      Nordic nRF ist mir nicht ganz unbekannt vom Hoymiles Projekt.
                                      Ein Freund ist da gerade mit Developer Kit unterwegs, so richtig tief mit Assembler dran.
                                      Dann warte ich mal aufs Paket und belese mich zu ESP BLE Stoff.

                                      AlexAxelA Offline
                                      AlexAxelA Offline
                                      AlexAxel
                                      schrieb am zuletzt editiert von
                                      #18

                                      @ralla66 Also alles zusammen kommt von mir. Aber basierend auf Beispielcodes die in der arduino IDE sind, wenn man das passende Board auswählt. Wenn man die ESP32 Bibliothek auswählt, hat man automatisch themensortierte Beispiele auf den Rechner.

                                      Ralla66R 1 Antwort Letzte Antwort
                                      0
                                      • AlexAxelA AlexAxel

                                        @ralla66 Also alles zusammen kommt von mir. Aber basierend auf Beispielcodes die in der arduino IDE sind, wenn man das passende Board auswählt. Wenn man die ESP32 Bibliothek auswählt, hat man automatisch themensortierte Beispiele auf den Rechner.

                                        Ralla66R Offline
                                        Ralla66R Offline
                                        Ralla66
                                        Most Active
                                        schrieb am zuletzt editiert von
                                        #19

                                        @alexaxel

                                        Gerät sollte ja Freitag da sein, dann schau ich mal was so geht.
                                        Eingerichtet ist alles soweit an Tools, ESP ist mal mit Tasmota BLE geflasht,
                                        mal sehen was da geht. Werde mal einen BLE nRF Sniffer besorgen das soll ja mit
                                        Wireshark Plugin gehen.
                                        Rund um den Key wären Infos gut, hast du da Bilder der IDE da ?

                                        AlexAxelA 1 Antwort Letzte Antwort
                                        0
                                        • AlexAxelA Offline
                                          AlexAxelA Offline
                                          AlexAxel
                                          schrieb am zuletzt editiert von
                                          #20

                                          Wäre geil, wenn jemand auch noch nen Tipp für mein eigentliches Thema hätte. :grin:
                                          Ich glaube, dass die geladenen Seiten in Vis keine Timeouts zulassen. So dass man eine Animation einbauen kann und das livechart eben mit den vielen Werten in sekundenintervallen nicht zurechtkommt.

                                          Ralla66R 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          773

                                          Online

                                          32.5k

                                          Benutzer

                                          81.8k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe