Blutzucker Sensordaten to FHEM?

Begonnen von Dracolein, 26 November 2024, 20:48:54

Vorheriges Thema - Nächstes Thema

Dracolein

Bei uns in der Familie hat das Schicksal letztes Wochenende hart zugeschlagen. In Kurzform: Tochter (13) --> nicht mehr ansprechbar --> Notaufnahme --> Blutzucker >1.300 --> Diagnose: Diabetes Typ 1 --> Insulinpflichtig bis an ihr Lebensende.
Während wir unser Schicksal langsam realisieren und erste Schritte in den nächsten Lebensabschnitt machen, versuche ich mich am Feierabend etwas abzulenken und recherchiere als technik-affiner Typ nach Möglichkeiten und Optionen.

Morgen bekommt sie einen Blutzucker-Sensor auf den Arm geklebt, der via Bluetooth Daten an eine Smartphone-App übermittelt. Das System nennt sich "Freestyle Libre", besteht u.a. aus einer App für den Anwender sowie aus einer weiteren App für Angehörige/Eltern, welche Zugriff auf die Anwenderdaten erhalten können.

Google spuckt mir spontan eine Möglichkeit aus, Daten von dieser Schnittstelle für den Home Assistant abzugreifen

https://github.com/gillesvs/librelink/tree/main

In meiner fertigen spielerischen Vision habe ich auf meinem existierenden TabletUI zukünftig eine weitere Seite mit Blutzucker-Daten meiner Tochter. Nun bin ich kein Software-Guy, um aus dieser HA-Lösung ein FHEM-Modul zu bauen. An die jenigen, die den Aufwand eventuell einmal abschätzen könnten: ist das aufwändig, für FHEM eine Lösung nachzubauen?
Angesichts der hohen Anzahl Diabetes-Patienten könnte ein solches Modul vielleicht auch für weitere FHEM-Nutzer von Interesse sein?

Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

passibe

Erstmal dir und deiner Familie viel Kraft mit der Diagnose!

Die einfachste Lösung wäre eine Home Assistant Instanz aufzusetzen und dann die Daten mit MQTT Statestream an FHEM zu übermitteln.
Wie diese Übermittlung funktioniert habe ich vor einiger Zeit hier erklärt: https://forum.fhem.de/index.php?topic=115279.msg1319243#msg1319243 (Der Teil ab "Und das ist jetzt vielleicht offtopic ..." ist, da du nur Home Assistant "auslesen" willst, nicht mehr relevant.)

Helfe dir gerne auch beim Erstellen des MQTT2-Devices, falls es da Probleme gibt.

Hardwaremäßig sollte dein Pi 4 das ohne Probleme schaffen. Mit sowas wie Docker ist die Installation auch in wenigen Minuten gemacht.

Der Vorteil an dieser Lösung ist – auch wenn es nicht FHEM-nativ ist –, dass bei Anpassungen an der API FHEM-seitig nichts nachgezogen werden muss, d.h. du von der eventuell größeren Entwicklerbasis des Home Assistant-Moduls profitierst.

Ansonsten scheint die Art wie das Home Assistant-Modul mit der API interagiert aber relativ unspektakulär zu sein (https://github.com/gillesvs/librelink/blob/main/custom_components/librelink/api.py). Siehe auch die sehr hilfreiche API-Beschreibung hier: https://libreview-unofficial.stoplight.io/docs/libreview-unofficial/8i2x0tc4qumh2-authentication

Du müsstest dir nur z.B. über cURL einen AuthToken generieren und dann könntest du vermutlich schon testweise mit JsonMod loslegen. Wie lange der Token gültig ist, keine Ahnung, das müsstest du dann noch sehen. Und man müsste sich dann überlegen, wie man den Token regelmäßig erneuert. Da haben andere Leute hier, die etwas erfahrener mit JsonMod sind, ggfs. bessere Ideen als ich.

Probier mal (von hier kopiert, aber URL auf api-de.libreview.io angepasst):
curl --request POST \
  --url https://api-de.libreview.io/llu/auth/login \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'product: llu.android' \
  --header 'version: 4.7' \
  --data '{
  "email": "string",
  "password": "string"
}'
Email und Passwort natürlich jeweils befüllen. Das müsste dir den Token zurückgeben.

Ich glaube mit (siehe hier)
curl --request GET \
  --url https://api-de.libreview.io/llu/connections \
  --header 'Accept: application/json, application/xml, multipart/form-data' \
  --header 'Authorization: Bearer 123' \
  --header 'product: llu.android' \
  --header 'version: 4.7'
kannst du die patientID herausfinden (123 natürlich mit dem zuvor generierten Token ersetzen).

Und dann könntest du vermutlich damit
curl --request GET \
  --url https://api-de.libreview.io/llu/connections/{patientId}/logbook \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer 123' \
  --header 'product: llu.android' \
  --header 'version: 4.7'
die jeweiligen Sensorwerte auslesen (diesmal {patientId} und 123 ersetzen).

Die URL aus diesem letzten cURL-Kommando (https://api-de.libreview.io/llu/connections/{patientId}/logbook) wäre dann auch diejenige, die du JsonMod füttern müsstest (zusammen mit den vier Headern natürlich).
Dann bleibt eigentlich nur noch die Frage, wie man den Token regelmäßig aktualisiert, aber vielleicht reicht dafür ja ein at o.ä. aus, der den ersten Endpoint regelmäßig aufruft und den Token irgendwo (sicher? sind ja immerhin Gesundheitsdaten) speichert.

Hoffe das hilft schonmal ein bisschen.

betateilchen

Die Beschreibung von passible klingt nach einem ähnlichen Prinzip wie die Sache mit den Notdienstapotheken

  • Token finden
  • Daten mit Token abrufen

Die PatientId sollte sich hoffentlich nicht regelmäßig ändern, sodaß man das Herausfinden vermutlich nur einmal machen muss.

Die Frage nach Aktualisierung und Ablage des Token ist im Prinzip auch schon beantwortet, dafür hat FHEM einen keystore und für JsonMod kann man dann einen Platzhalter für den Token in der URL angeben.

Man muss beobachten, wie lange ein Token gültig bleibt und dann eine regelmäßige Aktualisierung einbauen, das geht am einfachsten mit einem at.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dracolein

Hi zusammen,

HomeAssistant habe ich in einem Docker Container auf meiner Synology hinbekommen, die Web-GUI läuft. Habe folglich den sog. "HACS" (Home Assistant Community... Dingens) ebenfalls installieren können und das oben verlinkte Github-Paket auffinden und installieren können. Leider ergibt die GUI-geführte Konfiguration (bestehend aus lediglich einer Popup-Abfrage zu Username, PW, Land) nach erfolgter Durchführung nur noch eine Fehlermeldung, die auch innerhalb Github aktuell diskutiert wird. Also augenscheinlich klappt da etwas derzeit wohl nicht so ganz.

Ich habe andere Wege gesucht. Es gibt ein großes DIY gehostetes Projekt namens "Nightscout", was ebenso auf Docker läuft und zusätzlich eine mongoDB erfordert. Beides habe ich gestern stundenlang erfolglos versucht, zum laufen zu kriegen. Die mongoDB läuft, Nightscout läuft, aber Nightscout kann sich bei mongoDB nicht einloggen. Ich habe auch unter zuhilfenahme von KI rumprobiert und versucht zu debuggen, aber nö. Erstmal nicht.

Ich werde mal weiter forschen, was es so gibt. Definitiv fehlen mir die Prog-Skills
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

passibe

Scheint aber gefixt zu sein: https://github.com/PTST/LibreView-HomeAssistant/issues/30

Hast du Version 1.1.1? Was für eine Fehlermeldung bekommst du in Home Assistant?

Und bezgl. Mongo DB: Klingt nach einem trivialen Docker-Networking-Problem o.ä. ... Wenn du mir dein compose file hier postest (+ Log-Auszüge/Fehlermeldungen), kann ich mir das gerne mal anschauen.

LG

Dracolein

#5
Laut Screenshot ist es sogar 1.2.3 ?

Du darfst diesen Dateianhang nicht ansehen.

Ich sehe grade, Dein Link ist ein völlig anderes Projekt dazu, interessant.
Leider finde ich es unter "HACS" mittels "durchsuchen" nicht

edit:
hat funktioniert. ich konnte Dein verlinktes Projekt in HA integrieren und sehe nun auf dem HA-Dashboard ihren aktuellen Blutzuckerwert, geil.
Next goal: HA --> MQTT --> FHEM
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Dracolein

Inzwischen konnte ich in HA die MQTT Schnittstelle aktivieren und scheinbar auch mein MQTT2_FHEM_Server richtig konfigurieren.
In FHEM wurde automatisch ein MQTT2_DEVICE Device angelegt, dessen Inhalt mir jedoch noch schleierhaft ist.
Morgen gehts weiter
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Dracolein

Das Echtzeit- #Diabetes -Dashboard für FTUI3 (TabletUI) macht Fortschritte.  Inwischen sind Grenzbereiche skizziert und erste Kennzahlen werden automatisch berechnet.

Du darfst diesen Dateianhang nicht ansehen.

RawCode:

defmod MQTT2_40bm4L3mCLNbhkfewP2874 MQTT2_DEVICE 40bm4L3mCLNbhkfewP2874
attr MQTT2_40bm4L3mCLNbhkfewP2874 alias MQTT_BlutzuckerfromHA
attr MQTT2_40bm4L3mCLNbhkfewP2874 event-min-interval .*:300
attr MQTT2_40bm4L3mCLNbhkfewP2874 readingList 40bm4L3mCLNbhkfewP2874:fhem/sensor/libreview_glucose:.* libreview_glucose
attr MQTT2_40bm4L3mCLNbhkfewP2874 room MQTT
attr MQTT2_40bm4L3mCLNbhkfewP2874 stateFormat libreview_glucose
attr MQTT2_40bm4L3mCLNbhkfewP2874 userReadings glucose_max_today {\
    my $current = ReadingsVal($name, "libreview_glucose", 0);; \
    my $date = localtime->strftime("%Y-%m-%d");; \
    my $max = ReadingsVal($name, "glucose_max_today", 0);; \
    my $max_date = ReadingsTimestamp($name, "glucose_max_today", "1970-01-01");; \
    if ($max_date =~ /^$date/ && $current > $max) { \
      return $current;; \
    } elsif ($max_date !~ /^$date/) { \
      return $current;; \
    } else { \
      return $max;; \
    } \
  },\
  glucose_min_today {\
    my $current = ReadingsVal($name, "libreview_glucose", 0);; \
    my $date = localtime->strftime("%Y-%m-%d");; \
    my $min = ReadingsVal($name, "glucose_min_today", 9999);; \
    my $min_date = ReadingsTimestamp($name, "glucose_min_today", "1970-01-01");; \
    if ($min_date =~ /^$date/ && $current < $min) { \
      return $current;; \
    } elsif ($min_date !~ /^$date/) { \
      return $current;; \
    } else { \
      return $min;; \
    } \
  },\
    glucose_in_range_percent {\
    my $date = localtime->strftime("%Y-%m-%d");; \
    my $logfile = "/synology/raspiaufds/Log_Blutzucker_T-" . localtime->strftime("%Y-%m-%d") . ".log";; \
    my $count_in_range = 0;; \
    my $total_count = 0;; \
    \
    if (open(my $fh, "<", $logfile)) { \
      while (my $line = <$fh>) { \
        if ($line =~ /^$date.*libreview_glucose: (\d+)/) { \
          my $value = $1;; \
          $total_count++;; \
          if ($value >= 90 && $value <= 140) { \
            $count_in_range++;; \
          } \
        } \
      } \
      close($fh);; \
    } \
    return $total_count > 0 ? int(($count_in_range / $total_count) * 100) : 0;; \
  }




Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Dracolein

GMI, "Glucose Management Indicator" auf Basis der letzten 14 Tagesdurchschnitts-Blutzuckerwerte habe ich auch etwas gebaut. Ein at-Device berechnet 1x täglich nachts den Wert auf genannter Basis. Dazu durchsucht es eine Filelog-Datei und benutzt zur Berechnung jeweils die 14 aktuellsten Daten.
(Quelle: https://diabetesjournals.org/care/article/41/11/2275/36593/Glucose-Management-Indicator-GMI-A-New-Term-for )

defmod at_glucose_GMI14tage_berechnung at *00:05:00 {
    my $total_sum = 0;;
    my $count = 0;;

    ## Gehe durch die letzten 14 Tage
    for my $day_offset (1..14) {
        my $date = (localtime(time - $day_offset * 86400))->strftime("%Y");;  ## Datum für die letzten 14 Tage (nur Jahr)
        my $date_file = "/synology/raspiaufds/Log_Blutzucker_Tagesdurchschnitt-" . $date . ".log";;  ## Dateipfad

        if (-e $date_file) {
            open my $fh, '<', $date_file or next;;
            while (my $line = <$fh>) {
                ## Debug: Zeige jede Zeile, die aus der Datei gelesen wird
                ##Log 3, "Zeile: $line";;

                if ($line =~ /^(\d{4}-\d{2}-\d{2})_\d{2}:\d{2}:\d{2} .* glucose_tagesdurchschnitt_\d+:\s*(\d+)/) {
                    my $line_date = $1;; 
                    my $glucose_value = $2;;

                    ## Prüfen, ob das Datum in den letzten 14 Tagen liegt
                    my $now = time();;
                    my $line_time = timelocal(0, 0, 0, substr($line_date, 8, 2), substr($line_date, 5, 2) - 1, substr($line_date, 0, 4));;
                    if (($now - $line_time) <= (14 * 86400)) {
                        $total_sum += $glucose_value;;
                        $count++;;
                    }
                }
            }
            close $fh;;
        } else {
            ## Log 3, "Datei nicht gefunden: $date_file";;
        }
    }

    ## Berechnung des GMI
    if ($count > 0) {
        my $avg_value = $total_sum / $count;;
        my $GMI = 3.31 + 0.02392 * $avg_value;;
        fhem("setreading MQTT2_homeassistant_mqtt glucose_GMI_14_days $GMI");;
    } else {
        ## Falls keine Werte vorhanden sind, setze einen Platzhalter oder berechne den GMI mit einem Basiswert
        my $default_GMI = 3.31;; ## Basiswert, falls keine Daten vorhanden sind
        fhem("setreading MQTT2_homeassistant_mqtt glucose_GMI_14_days $default_GMI");;
    }
}

Vielleicht braucht es irgendwann mal jemand als Idee oder ähnliches :-)
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;