Skip to content

GSC317: Kompatibler Austausch strukturierter Daten #317

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
251 changes: 251 additions & 0 deletions proposals/317-strukturierte-daten.md
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ManuelB schreibt:

@Johennes grundsätzlich eine sehr gute Idee. Ich denke aber das ein konkretes KIM Dienstkennung-Binding sinnvoll wäre.
z.B. unter Nutzung des jmap Standards: RFC 8621 - The JSON Meta Application Protocol (JMAP) for Mail https://share.google/4ChTrdx7wcD2iFiJL

Damit könnte man KIM Mails in Matrix Events versenden und ein PVS, welches bereits KIM kann, könnte mit relativ wenig Aufwand auch TIM unterstützen.

Killer Feature bei TIM ist, dass der Patient auch seine eigenen Daten bekommen kann.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sehr interessanter Gedanke. An ein Zusammenspiel von KIM und TI-M hatte ich bisher noch nicht gedacht. Eigentlich wollen wir KIM ja eher ablösen aber so eine Integration könnte den Übergang erleichtern.

Jetzt frage ich mich aber ob wir hier wirklich eine Tiefenintegration brauchen. Könnte man KIM-Nachrichten in TI-M nicht einfach als Datei verschicken? Mein KIM-fu ist schwach aber naiv stelle ich mir eine .eml Datei mit message/rfc822 MIME-Type vor. Eventuell müsste man einige Header oder andere Metadaten in den Event-Content duplizieren damit der Empfänger nicht die ganze Datei herunterladen muss um zu verstehen was drin steckt.

Was genau hattest du dir bei JMAP vorgestellt?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kann man auch über message/rfc822 machen. Grundsätzlich bin ich leidenschaftslos über das Format, wie man es überträgt. Ich halte es nur für wichtig, dass man bereits bestehende Systeme mitdenkt z.B. laufen so gut wie alle eAUs in Deutschland über KIM (circa 500.000 am Tag) und auch alle Arztbriefe. Ein Gateway zwischen KIM und TIM wäre super cool. E-Mail an [maitrx-id]@kim-to-tim.telematik und es wird die KIM E-Mail per TI-M an die Matrix Id zugestellt. Optimalerweise gibt es das auch in die Rückrichtung.
JMap hätten den Vorteil, dass es JSON ist und somit deutlich besser in den Matrix Stack passen würde. Es gibt auch automatische Translator von Mime to JMAP (https://github.com/josephg/mime-to-jmap).

Es ist sehr unwahrscheinlich, dass so ein großes System wie KIM kurzfristig (in den nächsten 10 Jahren) abgelöst wird.

image

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Es ist sehr unwahrscheinlich, dass so ein großes System wie KIM kurzfristig (in den nächsten 10 Jahren) abgelöst wird.

Ja, richtig. Es war mehr die Hoffnung, die aus mir sprach. 😅

Ich finde die Idee einer KIM-Bridge super spannend. Das ganze ist aber etwas tangential zu diesem Proposal hier. Wir können den hier eingeführten Verarbeitungsstatus wahrscheinlich auch verwenden um KIM-Nachrichten in Matrix zu verschicken. Ich sehe momentan aber nicht so richtig wie das Design einer Bridge dieses Proposal hier beeinflussen könnte. Deshalb habe ich das Thema mal hierhin ausgelagert: #318

Ich lasse diesen Thread aber erstmal noch offen.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@detlefhuehnlein schreibt:

Guten Morgen @Johennes, @ManuelB, @TimoFrank, @spilikin, @NilsLieberknecht etc.

herzlichen Dank für die großartige Initiative!

Da der grundsätzliche Ansatz strukturierte Daten über Matrix-basierte Systeme auszutauschen auch in zahlreichen weiteren Anwendungsfällen jenseits der Gesundheitstelematik, wie z.B. ZaPuk, genutzt werden kann, möchte ich hier gern für eine möglichst generische, standardkonforme und langfristig international tragfähige Lösung werben.

Letztlich handelt es sich hier nach meinem Verständnis um den Austausch von Metadaten über die Fähigkeiten von Clients (vgl. RFC 7591 und matrix#4.10.4.1). Deshalb sollte man hier aus meiner Sicht in matrix#4.10.4.1 die bereits in RFC 7591 vorgesehenen Parameter software_id und software_version nachziehen und um weitere relevante Parameter ergänzen, die die technischen Fähigkeiten des Clients (z.B. type für die unterstützten Event-Types ) beschreiben. Damit alles seine "gematische Ordnung" hat, darf hier natürlich der Parameter software_type für den Produkttyp nicht fehlen. ;-)

Die Payloads der Events, von denen es langfristig viele geben kann, sollte man sauber in JSON oder JSON-LD spezifizieren und in einem geeigneten kuratierten "Katalog" (bzw. einem Directory wie z.B. VZD-FHIR) ablegen. Wir haben uns hier in TEAM-X bereits einige Gedanken gemacht, welche Events und Datenstrukturen hier möglicherweise sinnvoll sein könnten und bringen diese gern bei Bedarf in die weitere Diskussion ein. Hierbei sollte man vor Augen haben, dass es sich bei einem Teil der Events am Ende um "elektronische Attributbescheinigungen" im Sinne von Art. 3 (44) der eIDAS-Verordnung (EU) No. 910/2014 handeln könnte und es auf Europäischer Ebene einen Katalog von Attributen gemäß Art. 45e und zugehörige "Rulebooks" für die Ausstellung solcher Attributbescheinigungen geben wird. Darüber hinaus ist perspektivisch natürlich auch der EHDS zu beachten, bei dem Datensätze aller Voraussicht nach als (dcat:resources) beschrieben und katalogisiert werden.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Vielen Dank für das Feedback. Ich hab den Beitrag in einen Kommentar auf der Datei kopiert weil wir so einen eigenen Thread zur Diskussion erhalten.

Letztlich handelt es sich hier nach meinem Verständnis um den Austausch von Metadaten über die Fähigkeiten von Clients [...]

Ich glaube das ist ein überlappendes Thema, trifft so aber nicht 100%ig auf dieses Proposal zu.

Scope dieses Proposals

Der Verarbeitungsstatus aus diesem Proposal soll den Erfolg / Misserfolg bei der Verarbeitung eines konkreten Matrix-Events beschreiben. Dazu gehört einerseits die Fähigkeit den Event-Typ verstehen zu können aber andererseits auch die Auswertung der konkreten Daten im Event.

Wenn man sich konzeptionell den Absender als Client und den Empfänger als Server vorstellt, ist das gesendete Matrix-Event das HTTP-Request und der Verarbeitungsstatus die HTTP-Response.

Client Capability Negotiation

Für den Austausch von Metadaten über die Fähigkeiten von Clients, haben wir aufbauened auf diesem Proposal MSC4301 veröffentlicht. Hiermit könnten Clients adhoc die Fähigkeiten anderer Clients abfragen.

Deshalb sollte man hier aus meiner Sicht in matrix#4.10.4.1 die bereits in RFC 7591 vorgesehenen Parameter software_id und software_version nachziehen und um weitere relevante Parameter ergänzen, die die technischen Fähigkeiten des Clients (z.B. type für die unterstützten Event-Types ) beschreiben.

Die Fähigkeiten in die OAuth Client Metadaten aufzunehmen ist eine interessante Idee. Dadurch wären die Informationen statisch und könnten auch abgefragt werden, ohne dass beide Clients online sind. Man müsste sich hier noch überlegen wie diese Daten zwischen Clients transportiert werden. Können Clients die Registrierungsmetadaten anderer Clients direkt und vollständig abrufen? Oder gibt es einen Endpunkt in der CS-API, mit dem der Server Teile der Metadaten bereitstellt und dabei Zugriffsrechte durchsetzt (z. B. Abfrage nur bei gemeinsamen Räumen erlaubt)?

Event-Verzeichnis

Die Payloads der Events, von denen es langfristig viele geben kann, sollte man sauber in JSON oder JSON-LD spezifizieren und in einem geeigneten kuratierten "Katalog" (bzw. einem Directory wie z.B. VZD-FHIR) ablegen. Wir haben uns hier in TEAM-X bereits einige Gedanken gemacht, welche Events und Datenstrukturen hier möglicherweise sinnvoll sein könnten und bringen diese gern bei Bedarf in die weitere Diskussion ein. Hierbei sollte man vor Augen haben, dass es sich bei einem Teil der Events am Ende um "elektronische Attributbescheinigungen" im Sinne von Art. 3 (44) der eIDAS-Verordnung (EU) No. 910/2014 handeln könnte und es auf Europäischer Ebene einen Katalog von Attributen gemäß Art. 45e und zugehörige "Rulebooks" für die Ausstellung solcher Attributbescheinigungen geben wird. Darüber hinaus ist perspektivisch natürlich auch der EHDS zu beachten, bei dem Datensätze aller Voraussicht nach als (dcat:resources) beschrieben und katalogisiert werden.

Das sind sehr interessante Punkte. Zur Struktur eines Event-Verzeichnisses haben wir uns bisher erst wenige Gedanken gemacht. Das verwandte Verzeichnis der Dienstkennungen in KIM z. B. finde ich nur bedingt hilfreich weil dort nur IDs aber keine Schemainformationen dokumentiert werden.

Naiv hatte ich mir bisher vorgestellt, dass wir die Events einfach per JSON Schema dokumentieren und in einem GitHub Repository sammeln. Führt ein Hersteller neue Typen ein und möchte anderen Herstellern ermöglichen diese zu behandeln, könnte dann einfach ein Pull Request erstellt werden. Vielleicht reicht das mit Blick auf eIDAS und EHDS aber nicht aus.

Original file line number Diff line number Diff line change
@@ -0,0 +1,251 @@
# GSC317: Kompatibler Austausch strukturierter Daten

Matrix unterstützt neben den eingebauten Events auch den Austausch proprietärer Events. Solche
Event-Typen müssen gemäß [Spezifikation] mit einem rDNS-Präfix beginnen um Kollisionen untereinander
und mit den standardisierten `m.*` Events zu vermeiden. TI-M Hersteller können daher schon heute
eigene Event-Typen für den Austausch strukturierter Daten verwenden und damit spezialisierte
Anwendungsfälle bedienen. Ebenso ist es möglich strukturierte Daten als Datei über den eingebauten
`m.file` Message-Type mit entsprechendem MIME-Type zu versenden.

Hierbei ergeben sich allerdings folgende Probleme:

1. Kompatibilität – Während Clients desselben Herstellers in der Regel dieselben proprietären
Inhalte unterstützen sollten, kann das für Clients verschiedener Hersteller nicht angenommen
werden. Zusätzlich beinhaltet Matrix aktuell keine Mechanismen, mit denen sich feststellen ließe
welche Event-Typen Clients unterstützen oder ob ein gesendetes Event vom Empfänger verstanden
wurde. Im schlimmsten Fall wird ein unbekanntes Event beim Empfänger überhaupt nicht angezeigt
oder verarbeitet, ohne dass der Absender Kenntnis davon erlangt. Das kann besonders dann fatal
sein, wenn automatisierte Systeme als TI-M Clients auftreten.
2. Discoverability – Um zu verhindern, dass verschiedene Hersteller vergleichbare Probleme mehrfach
lösen wäre es wünschenswert eine zentrale Übersicht ähnlich zu den [Dienstkennungen] von KIM zu
haben.

Dieses Proposal befasst sich mit Punkt 1 und beschreibt ein Verfahren, mit dem TI-M Clients Events
mit proprietären Inhalten kompatibel austauschen können.

## Änderungsvorschlag

Zentrales Instrument dieses Proposals ist [MSC4300]. Dieses MSC definiert einen Mechanismus, mit dem
Absender den Verarbeitungsstatus eines Events von Empfängern anfordern können. Hierzu wird auf dem
betroffenen Event ein `de.gematik.msc4300.request.status` Content-Block gesetzt, welcher die
absendende Device-ID und eine optionale Lebensdauer enthält.

``` json5
{
"event_id": "$1",
"type": "<Event-Typ>",
"content": {
<Event-Inhalt>
// Anfrage des Verarbeitungsstatus
"de.gematik.msc4300.request.status": {
"from_device": "RJYKSTBOIE",
"lifetime": 90_000, // 90s
}
},
...
}
```

Der Content-Block zur Anfrage des Verarbeitungsstatus ist modular und kann auf beliebigen
Event-Typen verwendet werden. Eine Verpflichtung hierzu besteht für TI-M Clients jedoch nicht. Die
gematik stellt hier lediglich die nötige Infrastruktur bereit, damit diese Anfragen bei Bedarf und
in spezilisierten Anwendungsfällen verwendet werden können um Kompatibilität zu gewährleisten.

Damit diese Funktion sinnvoll nutzbar ist, ist es allerdings erforderlich, dass *empfangene*
Anfragen beantwortet werden. Daher werden alle TI-M Clients hierzu verpflichtet.

**A_1 - Antwort auf Anfragen zum Verarbeitungsstatus von Events**

TI-M Clients MÜSSEN Anfragen zum Verarbeitungsstatus von Events gemäß [MSC4300] beantworten. Enthält
ein Event einen `de.gematik.msc4300.request.status` Content-Block, so MUSS der empfangende Client
mit einem `de.gematik.msc4300.response.status` Event antworten sofern die `lifetime` der Anfrage
noch nicht verstrichen ist. **\[\<=\]**

Absendene Clients sollten Anfragen zum Verarbeitungsstatus nicht mit jedem beliebigen Event
verschicken sondern nur in Fällen, in denen die Kenntnis des Verarbeitungsstatus essenziell ist.
Dies wird üblicherweise nur bei proprietären Events oder Dateien mit speziellem Inhalt der Fall
sein. So wäre es z. B. unsinnig den Verarbeitungsstatus von reinen Text- oder Bild-Nachrichten zu
Copy link

@NilsLieberknecht NilsLieberknecht Jun 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Johennes wieso unsinnig? So könnte einfach abgefragt werden, ob eine Nachricht beim Empfänger eingegangen ist. Dies ist heute nicht "einfach" möglichl

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Guter Punkt. Ich glaube wir haben hier eventuell zwei leicht verschiedene Probleme im Sinn.

In deinem Fall geht es um Bestätigungen für den reinen Empfang von Nachrichten auf Clients. Also Nachricht angekommen und konnte entschlüsselt werden.

Was ich mit dem Verarbeitungsstatus hier im Sinn hatte geht darüber hinaus und soll beschreiben ob der Client mit den entschlüsselten Daten auch etwas anfangen konnte.

Jetzt könnte man diesen Verarbeitungsstatus natürlich prinzipiell auch für reine Empfangsbestätigungen verwenden. Im Einzelfall fände ich das ok. Für einen massenhaften Einsatz auf jedem Event ist die Statusabfrage aber eventuell zu schwergewichtig denn jede Status-Antwort ist ja ein neues Event im Raum. Dafür gäbe es alernativ die "Delivery Receipts" aus MSC4089, die auf der leichtgewichtigeren Receipt-Infrastruktur aufbauen.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Finde ich auch gut. Sollten wir nur berücksichtigen in Zukunft :)

erfragen, da alle TI-M Clients diese Nachrichten ohnehin unterstützen sollten. Werden andererseits
komplexere Inhalte wie z. B. serialisierte FHIR-Resourcen versendet, kann es sinnvoll sein, den
Verarbeitungsstatus anzufragen um sicherzustellen, dass der empfangende Client die Inhalte
verstanden hat.

Für Mitarbeiter im Gesundheitswesen kann es hilfreich sein unbekannte Events bei Bedarf manuell
weiterzuverarbeiten, z. B. indem die Inhalte in ein PVS oder anderes Drittsystem exportiert werden.
Dazu ist es erforderlich, dass solche Events angezeigt und mit der Möglichkeit zur Einsicht der
Rohdaten versehen werden.

**A_2 - Anzeige und Rohdaten von unbekannten proprietären Events**

TI-M Pro Clients MÜSSEN ihnen unbekannte proprietäre Events (also solche, deren Typ nicht mit `m.`
beginnt) darstellen und dem Nutzer die Möglichkeit bieten die Rohdaten des Events anzuzeigen.
**\[\<=\]**

*Offene Frage: Wäre es hilfreich die generelle Unterstützung eines Event-Typs schon vor dem Versand
mittels [MSC4301] anfragen zu können? Was wären konkrete Anwendungsfälle dafür?*

*Offene Frage: Viele Probleme des medizinischen Bereichs sind bereits mit FHIR modelliert worden. In
Matrix können FHIR-Dateien schon heute über den `m.file` Message-Type mit dem MIME-Type
`application/fhir+json` bzw. `application/fhir+xml` versendet werden. Wie schmerzhaft ist hierbei
der Umweg über eine Datei? Wäre es hilfreich, die Daten mittels [MSC4302] inline in Events versenden
zu können oder den Typ der enthaltenen Resourcen auch ohne Download erkennen zu können?*

### Beispiel

Dr. Alice und Patient Bob befinden sich in einem Matrix-Raum. Alice ist mit nur einem Client `A`
verbunden wohingegen Bob auf zwei Geräten `B1` und `B2` angemeldet ist. Alice schickt Bob einen
Anamnese-Fragebogen als FHIR [`Questionnaire`] in einer XML-Datei. Da Alice sicher gehen möchte,
dass Bob den Fragebogen auf seinem Client ausfüllen kann, fragt sie zusammen mit dem Event auch
dessen Verarbeitungsstatus an.

``` json5
{
"event_id": "$1",
"type": "m.room.message",
"sender": "@dr.alice:alice.com",
"content": {
// Fragebogen
"msgtype": "m.file",
"body": "Bitten füllen sie diesen Fragebogen aus, danke.",
"filename": "questionnaire.xml",
"info": {
"mimetype": "application/fhir+xml",
...
},
// Anfrage des Verarbeitungsstatus
"de.gematik.msc4300.request.status": {
"from_device": "A",
"lifetime": 600_000, // 10min
}
...
},
...
}
```

Bobs Client `B1` ist eine ältere Version und unterstützt das Ausfüllen von FHIR [`Questionnaire`]s
nicht. Er unterstützt aber den allgemeinen Download von Dateien. Da dies bei FHIR-XML-Dokumenten
eine u. U. starke Einschränkung für den Nutzer bedeuten kann, antwortet er mit einer Warnung:

``` json5
{
"type": "de.gematik.msc4300.response.status",
"sender": "@bob:bob.com",
"content": {
"m.response.status": {
"from_device": "B1",
"status": "success",
"messages": [{
"type": "warning",
"m.text": [{ "body": "Unbekannte FHIR-Datei wird nur zum Download angeboten" }]
}]
},
"m.relates_to": {
"event_id": "$1",
"rel_type": "m.reference",
},
}
}
```

Bobs Client `B2` ist eine neuere Version und unterstützt das Ausfüllen von FHIR [`Questionnaire`]s
nativ. Er antwortet daher mit einer Erfolgsmeldung ohne Warnung.

``` json5
{
"type": "de.gematik.msc4300.response.status",
"sender": "@bob:bob.com",
"content": {
"m.response.status": {
"from_device": "B2",
"status": "success",
},
"m.relates_to": {
"event_id": "$1",
"rel_type": "m.reference",
},
}
}
```

Alices Client kann nun erkennen, dass beide von Bobs Geräten den Fragebogen empfangen haben und ein
Gerät in der Lage ist ihn auszufüllen. Sie kann daher sicher sein, dass Bob den Fragebogen
bearbeiten kann.

Bob füllt den Fragebogen auf seinem Gerät `B2` aus und sendet eine [`QuestionnaireResponse`] als
FHIR-Datei zurück. Um sicherzugehen, dass Alice, seine Antwort erhält und versteht, fragt er nun
seinerseits den Verarbeitungsstatus des Events an.

``` json5
{
"event_id": "$2",
"type": "m.room.message",
"sender": "@bob:bob.com",
"content": {
// Ausgefüllter Fragebogen
"msgtype": "m.file",
"filename": "questionnaire_response.xml",
"info": {
"mimetype": "application/fhir+xml",
...
},
// Anfrage des Verarbeitungsstatus
"de.gematik.msc4300.request.status": {
"from_device": "B2",
"lifetime": 600_000, // 10min
}
...
},
...
}
```

Alice Client empfängt den ausgefüllten Fragebogen, validiert den Inhalt und bietet ihn Alice zur
Weiterverarbeitung an bevor eine Erfolgsmeldung zurück gesendet wird.

``` json5
{
"type": "de.gematik.msc4300.response.status",
"sender": "@dr.alice:alice.com",
"content": {
"m.response.status": {
"from_device": "A",
"status": "success",
},
"m.relates_to": {
"event_id": "$2",
"rel_type": "m.reference",
},
}
}
```

Bob kann nun sicher sein, dass sein ausgefüllter Fragebogen empfangen und verstanden wurde.

## Sicherheit und Datenschutz

Die verpflichtende Antwort auf Abfragen zum Verarbeitungsstatus gibt den Online-Status des
Empfängers gegenüber dem Absender preis. Zur Mitigierung dieses Problems können Clients ihre Antwort
im Rahmen der `lifetime` von Anfragen verzögern.

In Räumen mit mehreren Teilnehmern wird der Online-Status nicht nur dem Absender sondern allen
Raumteilnehmern offengelegt. Dieses Problem erscheint vernachlässigbar, da der Regelfall in TI-M die
direkte Kommunikation sein wird. Zudem ließe sich der Verarbeitungsstatus wie in [MSC4300]
angedeutet in Zukunft auch per To-Device-Message kommunizieren.

## Kompatibilität & Migration

Clients, die dieses Proposal nicht implementieren werden Anfragen und Antworten zum
Verarbeitungsstatus ignorieren.

## Alternativen

Keine.

[Spezifikation]: https://spec.matrix.org/v1.14/appendices/#common-namespaced-identifier-grammar
[Dienstkennungen]: https://fachportal.gematik.de/toolkit/dienstkennung-kim-kom-le
[MSC4300]: https://github.com/matrix-org/matrix-spec-proposals/pull/4300
[MSC4301]: https://github.com/matrix-org/matrix-spec-proposals/pull/4301
[MSC4302]: https://github.com/matrix-org/matrix-spec-proposals/pull/4302
[`Questionnaire`]: https://build.fhir.org/questionnaire-definitions.html
[`QuestionnaireResponse`]: https://build.fhir.org/questionnaireresponse.html