NEWS
Darstellung einer Pulsoximetriekurve
-
Ein sehr geiles Thema! Gefällt mir, scheinen noch mehr Menschen so verrückt zu sein wie ich.... ;-)
@dragon du kennst noch nicht mein IOBrokerprojekt, das RC Cars-Rennen im Garten misst, über Alexa moderiert und mit Spotify und den coolen Gauge-Meter eine tolle Spielgrafik darstellt. Monitor steht quasi im Garten auf der mobilen Rennstrecke. Ein paar ESPs messen, die IR Codes der eingebaute ESP im Auto von innen an der Ziellinie senden. Der Empfänger ESP schickt die Messdaten via MQTt an den Broker. Mit den lustigen Alexa Emotion-Tags moderiert sie richtig emotional. "Mark, Du lahme Ente. Das geht noch besser, du bist auf dem letzten Platz und hast nur eine Durchschnittsgeschwindogkeit von bla bla. " :-)
Beim Start, Ende und während des Rennens werden coole Sounds und Rennmusik abgespielt. Ace of spades kommt da richtig gut. Hehehe -
@dragon du kennst noch nicht mein IOBrokerprojekt, das RC Cars-Rennen im Garten misst, über Alexa moderiert und mit Spotify und den coolen Gauge-Meter eine tolle Spielgrafik darstellt. Monitor steht quasi im Garten auf der mobilen Rennstrecke. Ein paar ESPs messen, die IR Codes der eingebaute ESP im Auto von innen an der Ziellinie senden. Der Empfänger ESP schickt die Messdaten via MQTt an den Broker. Mit den lustigen Alexa Emotion-Tags moderiert sie richtig emotional. "Mark, Du lahme Ente. Das geht noch besser, du bist auf dem letzten Platz und hast nur eine Durchschnittsgeschwindogkeit von bla bla. " :-)
Beim Start, Ende und während des Rennens werden coole Sounds und Rennmusik abgespielt. Ace of spades kommt da richtig gut. Hehehe -
@ralla66 Du ich hab da noch einen Mix aus 2 Versionen im Code, ist mir gar nicht aufgefallen.
Du kannst diesen ganzen Teil auch löschen, weil ich darüber schon das ganze Array auf einmal via mqtt gesendet habe.
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);ok, zur Darstellung benötige ich ja nur ca 48 Punkte / Bytes pro min für die Pulskurve in Vis.
Dann alle 1,25 sec 1Byte. Der ESP sollte die Bytes langsamer senden, so der Ansatz.
Array hat ja den Nachteil das ich dieses für die Visu wieder zerlegen muß.
Halt der Ansatz das Problem direkt im ESP zu lösen. -
ok, zur Darstellung benötige ich ja nur ca 48 Punkte / Bytes pro min für die Pulskurve in Vis.
Dann alle 1,25 sec 1Byte. Der ESP sollte die Bytes langsamer senden, so der Ansatz.
Array hat ja den Nachteil das ich dieses für die Visu wieder zerlegen muß.
Halt der Ansatz das Problem direkt im ESP zu lösen. -
@ralla66 nicht der ESP Broker definiert das Tempo, es ist der BLE Server, also Dein Pulsoximeter. Wenn du auf dem ESP bremst, gehen dir ja Updates/Bytes verloren.
Oder ich hab Dich falsch verstanden.könntest du bitte ein Codeschnipsel hier einstellen damit ich in den Datenpunkt Wave
die Bytes 41 - 67 schreiben kann.mqttClient.beginMessage(Topic_Wave);
?
mqttClient.endMessage();Dann hätten wir das sauber.
Danke
-
@ralla66 nicht der ESP Broker definiert das Tempo, es ist der BLE Server, also Dein Pulsoximeter. Wenn du auf dem ESP bremst, gehen dir ja Updates/Bytes verloren.
Oder ich hab Dich falsch verstanden.Hast du irgendwelche Informationen zur Key Berechnung aus der Mac Adresse und x Byte bei BLE,
Link oder andere Informationquellen ?
In unserem BLE BlazePod Projekt stecken wir gerade an der Stelle fest das wir
die Verbindung nicht aufrecht erhalten können da wohl der Key fehlt. -
Hast du irgendwelche Informationen zur Key Berechnung aus der Mac Adresse und x Byte bei BLE,
Link oder andere Informationquellen ?
In unserem BLE BlazePod Projekt stecken wir gerade an der Stelle fest das wir
die Verbindung nicht aufrecht erhalten können da wohl der Key fehlt.@ralla66 said in Darstellung einer Pulsoximetriekurve:
BlazePod
Musste erstmal googlen, was ein BlazePod ist :-)
klappt es denn initial und ihr konntet die Bytes identifizieren, die für das Ding bzw. Euch wichtig sind ?
Wenn ja, glaube ich nicht daran, dass die Entwickler die Verbindung im nachhinein kappt, weil ein Key fehlt.Wenn die Werte noch nicht kommen und Ihr wollt herausfinden, was die Original-App und das Teil so austauschen,
lasst es auf einem Android handy im Debug-Modus (muss man am Handy aktivieren) laufen und schließt es mit einem USB-Datenkabel(!) nicht Ladekabel am
PC an. Dort lasst Ihr die Android IDE Entwicklungsumgebung laufen. Man kann da schön sehen, was da so hin und her geht. Ihr könnt auch ein Android virtuel auf dem PC laufen lassen und dort die Andorid App im virtuellen Handy laufen lassen und gleiches sehen.
Wenn Ihr wissst was die App so sendet, damit es die Daten empfängt, die Ihr sucht, wisst Ihr was Ihr per BLE Code auf dem ESP vorab senden müsst, um gleichen Daten zu empfangen. -
@ralla66 said in Darstellung einer Pulsoximetriekurve:
BlazePod
Musste erstmal googlen, was ein BlazePod ist :-)
klappt es denn initial und ihr konntet die Bytes identifizieren, die für das Ding bzw. Euch wichtig sind ?
Wenn ja, glaube ich nicht daran, dass die Entwickler die Verbindung im nachhinein kappt, weil ein Key fehlt.Wenn die Werte noch nicht kommen und Ihr wollt herausfinden, was die Original-App und das Teil so austauschen,
lasst es auf einem Android handy im Debug-Modus (muss man am Handy aktivieren) laufen und schließt es mit einem USB-Datenkabel(!) nicht Ladekabel am
PC an. Dort lasst Ihr die Android IDE Entwicklungsumgebung laufen. Man kann da schön sehen, was da so hin und her geht. Ihr könnt auch ein Android virtuel auf dem PC laufen lassen und dort die Andorid App im virtuellen Handy laufen lassen und gleiches sehen.
Wenn Ihr wissst was die App so sendet, damit es die Daten empfängt, die Ihr sucht, wisst Ihr was Ihr per BLE Code auf dem ESP vorab senden müsst, um gleichen Daten zu empfangen. -
könntest du bitte ein Codeschnipsel hier einstellen damit ich in den Datenpunkt Wave
die Bytes 41 - 67 schreiben kann.mqttClient.beginMessage(Topic_Wave);
?
mqttClient.endMessage();Dann hätten wir das sauber.
Danke
@ralla66 said in Darstellung einer Pulsoximetriekurve:
Hier mal so ein Schnippsel ungetestet geschrieben:
mqttClient.beginMessage(Topic_DataArray); // Hier den Topic nehmen, den Du vorher auch deklariert hast. Wenn das auch bei Dir oben not DataArray heißt, kann das so bleiben. //eben einen String zusammenbasteln, damit nur ein Datenpunkt verwendet wird. Geht sicherlich auch noch eleganter... String sTemp; int iWert; //Hier die Schleife for (int i = 41; i < 68; i++) { iWert = int(data[i],DEC); // nun an der Position das Byte rausziehen. Dieser Code muss ja in der Subroutine stehen, wo auch eine Variable namens Data mit dem gesammten Array übergeben wird. sTemp += iWert; } mqttClient.print(sTemp); // Daten senden mqttClient.endMessage(); // MQTT Klasse mitteilen, dass nun Ende ist. -
@ralla66 said in Darstellung einer Pulsoximetriekurve:
Hier mal so ein Schnippsel ungetestet geschrieben:
mqttClient.beginMessage(Topic_DataArray); // Hier den Topic nehmen, den Du vorher auch deklariert hast. Wenn das auch bei Dir oben not DataArray heißt, kann das so bleiben. //eben einen String zusammenbasteln, damit nur ein Datenpunkt verwendet wird. Geht sicherlich auch noch eleganter... String sTemp; int iWert; //Hier die Schleife for (int i = 41; i < 68; i++) { iWert = int(data[i],DEC); // nun an der Position das Byte rausziehen. Dieser Code muss ja in der Subroutine stehen, wo auch eine Variable namens Data mit dem gesammten Array übergeben wird. sTemp += iWert; } mqttClient.print(sTemp); // Daten senden mqttClient.endMessage(); // MQTT Klasse mitteilen, dass nun Ende ist.Danke,
wird klappen, wenn nicht frage ich mal meinen BlazePod Progger.
Meine Fachabteilung im Freundesteam ist eher für Decoding zuständig :-)
Diese ganzen Tves Chip ( ähnlich ESP ) haben ja auch so ne Verkasperung
wo du aus fernen Ländern einen Zugangskey per Mail bekommst anhand der Mac. -
@alexaxel sagte in Darstellung einer Pulsoximetriekurve:
Hintergrund beim History-Chart
was ist das?
Hintergrund geht immer

-
@homoran wie hast du das hinbekommen. Mir reicht ja transparent oder schwarz. Wenn ich background setze, sieht das so aus:


@alexaxel sagte in Darstellung einer Pulsoximetriekurve:
Mir reicht ja transparent
dann schreib das dahin :grin:
oderclearEDIT:
Blödsinn, nicht im iFrame widget, sondern im Flot

deswegen fragte ich ja was das "history Widget" sein soll
-
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:

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:
-
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.
-
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:

(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:warning: Ich möchte alle Mitlesenden und Begeisternden IOBler noch einmal deutlich daraufhinweisen, dass dies nur für private Zwecke eingesetzt werden darf.
Ein Produkt, dass für professionelle medizinische Zwecke bestimmt ist, muss dem Medizinprodukte-Gesetzt entsprechen! Die Anforderungen an eine MPG-konforme Lösung ist weit mehr als das bisschen basteln und coden. Also unsere Basteleien bitte nicht im professionellen Bereich, wie in der Pflege und oder in Einrichtungen verwenden! ... und für den privaten Gebrauch immer einen Plan B haben. So alarmiert bei mir immer noch das MPG-Konforme Pulsoximeter mit seinem eigenen Alarmlautsprecher.
So... das lag mir noch am Herzen... Ich wünsche allen ein Frohen Neues 2024 !! Alex:-)
-
-
@alexaxel sagte in Darstellung einer Pulsoximetriekurve:
Mir reicht ja transparent
dann schreib das dahin :grin:
oderclearEDIT:
Blödsinn, nicht im iFrame widget, sondern im Flot

deswegen fragte ich ja was das "history Widget" sein soll
-
@homoran Achso du nimmst ein ganz anderes Objekt. Ich hab das hier genommen. Live History Chart:

Kann Flot auch in Echtzeit die Kurve so schnell zeichnen, dass 2 Kurven pro sekunde gezeichnet werden und diese nach links scrollen ?
@alexaxel sagte in Darstellung einer Pulsoximetriekurve:
Kann Flot auch in Echtzeit die Kurve so schnell zeichnen, dass 2 Kurven pro sekunde gezeichnet werden und diese nach links scrollen ?
hab ich noch nie probiert.
So schnell steigt der Rheinpegel nichtallerdings wird bei der Datenrate die History DB sehr schnell sehr groß
-
@alexaxel sagte in Darstellung einer Pulsoximetriekurve:
Kann Flot auch in Echtzeit die Kurve so schnell zeichnen, dass 2 Kurven pro sekunde gezeichnet werden und diese nach links scrollen ?
hab ich noch nie probiert.
So schnell steigt der Rheinpegel nichtallerdings wird bei der Datenrate die History DB sehr schnell sehr groß
@homoran sagte in Darstellung einer Pulsoximetriekurve:
allerdings wird bei der Datenrate die History DB sehr schnell sehr groß
so war auch mein Gedanke und viel Traffic erzeugt der eigentlich nicht notwendig ist.
Da wir ja nicht im medizinischen Bereich sind sollten weniger Byte in der Datenübertragung
reichen. -
@homoran sagte in Darstellung einer Pulsoximetriekurve:
allerdings wird bei der Datenrate die History DB sehr schnell sehr groß
so war auch mein Gedanke und viel Traffic erzeugt der eigentlich nicht notwendig ist.
Da wir ja nicht im medizinischen Bereich sind sollten weniger Byte in der Datenübertragung
reichen.@ralla66 bleibt außerdem die Frage, ob eine lange Vorhaltezeit notwendig ist.
Wenn ich nur eine Nacht monitoren will, reicht ein Tag.
Das ist dann auch nicht wirklich kritisch. -
@ralla66 bleibt außerdem die Frage, ob eine lange Vorhaltezeit notwendig ist.
Wenn ich nur eine Nacht monitoren will, reicht ein Tag.
Das ist dann auch nicht wirklich kritisch.@homoran Ich schreibe nur die Frequenz und den O2 Wert in einer externen SQL DB. Das History Chart schaut aber nur auf einem anderen DP, der gar nicht historisch weggeschrieben wird. Das sind also flüchtige Kurvendaten. Quasi immer der Punkt der gemalten Live-Kurve der 4 Takte des Herzens.