CarbCam – Kohlenhydrate direkt in den AAPS 3.4.x.x und iAPS Bolus-Wizard übernehmen

Kohlenhydrate aus CarbCam direkt in den AAPS 3.4.x.x/aaps4/iAPS Bolus-Wizard übernehmen

Stand: AAPS 3.4.2.2 branch. AAPS 4 (DEV), iAPS


Worum geht’s

Wer Kohlenhydrate per Foto schätzt (CarbCam) oder aus einer Lebensmittel-Datenbank zieht, muss den Wert bisher abtippen oder über Nightscout-Treatments umweglos hineinpumpen. Beides ist umständlich. Der hier beschriebene Patch fügt AAPS einen kleinen, definierten Eingang hinzu:

Eine andere App wie z.b. CarbCam sendet einen Android Intent an AAPS mit Aktion info.nightscout.androidaps.action.OPEN_BOLUS_WIZARD und einem Carbs-Wert. AAPS öffnet daraufhin denselben Bolus-Wizard wie bei manueller Eingabe, mit dem Carbs-Feld bereits ausgefüllt. Der Benutzer prüft, drückt OK, sieht den Standard-AAPS-Bestätigungsdialog und gibt den Bolus frei. Es gibt keine Möglichkeit, Insulin ohne Bestätigung abzugeben.

CarbCam (de.be10.carbcam)
    │
    │  Intent: OPEN_BOLUS_WIZARD
    │  extras: carbs=42, notes="Pizza Margherita"
    ▼
WizardLaunchActivity (exported, Caller-Whitelist)
    │
    │  prüft: callingPackage, Range 1–80
    │  leitet weiter: open_wizard_carbs, open_wizard_notes
    ▼
MainActivity (singleTask)
    │
    │  liest Extras, zeigt WizardDialog
    ▼
WizardDialog (Standard-Bolus-Wizard, vorbefüllt)
    │
    │  Benutzer bestätigt
    ▼
AAPS-Standard-Bestätigungsdialog → Bolus

Sicherheits-Design

Vier Schichten, alle aktiv:

  1. Whitelist — Nur explizit erlaubte Caller-Packages (z.B. de.be10.carbcam) können den Wizard öffnen. Andere Apps werden vom Launcher kommentarlos abgewiesen.
  2. Range-Check — Carbs außerhalb 1–80 g werden verworfen. Wer mehr braucht, hebt den Wert anschließend im Wizard manuell an.
  3. Kein automatischer Bolus — Der Patch öffnet nur den Wizard. Der Benutzer durchläuft denselben Bestätigungsflow wie bei manueller Eingabe.
  4. Source-Anzeige — Der source-Parameter erscheint im Wizard-Notes-Feld („via CarbCam“), wird aber nicht als Vertrauensbeweis gewertet.

Voraussetzungen

  • AAPS 3.4.2.2 branch, lokal oder GitHub geklont und mit Android Studio oder BrowserBuild baubar
  • Kotlin/Android Grundkenntnisse (vi reicht zum Editieren)

WICHTIG! Falls du eigene Anpassungen in AAPS gemacht hast, können die Zeilennummer anders sein.

 

Patchfiles für iaps (ungetestet), AndroidAPS 3.4.2.2 und AAPS DEV 4:

https://github.com/zehnBE/aaps3.4.2.2-carbcam-patches/blob/main/README.md

 

 

Patch — 5 Änderungen

1. Neue Datei anlegen

Datei: app/src/main/kotlin/app/aaps/activities/WizardLaunchActivity.kt

mit folgendem Inhalt:

package app.aaps.activities

import android.content.Intent
import android.os.Bundle
import app.aaps.MainActivity
import app.aaps.plugins.configuration.activities.DaggerAppCompatActivityWithResult

class WizardLaunchActivity : DaggerAppCompatActivityWithResult() {

    companion object {
        const val EXTRA_CARBS = "carbs"
        const val EXTRA_NOTES = "notes"
        const val EXTRA_SOURCE = "source"

        // Whitelist: nur CarbCam darf den Wizard externe öffnen
        private val ALLOWED_CALLERS = setOf(
            "de.be10.carbcam",
            "de.be10.carbcam.debug"
        )
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val caller = callingPackage ?: referrer?.host
        if (caller !in ALLOWED_CALLERS) {
            finish()
            return
        }

        val carbs = intent.getIntExtra(EXTRA_CARBS, 0)
        val notes = intent.getStringExtra(EXTRA_NOTES) ?: ""

        if (carbs <= 0 || carbs > 80) {
            finish()
            return
        }

        startActivity(Intent(this, MainActivity::class.java).apply {
            addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT or Intent.FLAG_ACTIVITY_SINGLE_TOP)
            putExtra("open_wizard_carbs", carbs)
            putExtra("open_wizard_notes", notes)
        })
        finish()
    }
}

 

 

2. AndroidManifest.xml ergänzen

Datei: app/src/main/AndroidManifest.xml

Innerhalb des <application>-Blocks, neben den anderen Activities:

<activity
    android:name="app.aaps.activities.WizardLaunchActivity"
    android:exported="true"
    android:excludeFromRecents="true"
    android:launchMode="singleInstance"
    android:theme="@style/AppTheme.NoActionBar">
    <intent-filter>
        <action android:name="info.nightscout.androidaps.action.OPEN_BOLUS_WIZARD" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

exported="true" ist nötig, weil eine andere App die Activity ansprechen können muss. excludeFromRecents und singleInstance sorgen dafür, dass die Launcher-Activity im Recents-Switcher nicht auftaucht und keine eigene Task-History anlegt.

 

3. Dagger-Registrierung

Datei: app/src/main/kotlin/app/aaps/di/ActivitiesModule.kt

Import ergänzen:

import app.aaps.activities.WizardLaunchActivity

Innerhalb der ActivitiesModule-Klasse eine Zeile dazu:

@ContributesAndroidInjector
abstract fun contributesWizardLaunchActivity(): WizardLaunchActivity

Ohne diesen Eintrag bekommt die Activity beim Start IllegalArgumentException: No injector factory bound for Class.

 

4. MainActivity erweitern

Datei: app/src/main/kotlin/app/aaps/MainActivity.kt

Am Ende von onCreate() einfügen:

handleExternalWizardIntent(intent)

Neue Override und private Methode in derselben Klasse ergänzen:

override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    setIntent(intent)
    handleExternalWizardIntent(intent)
}

private fun handleExternalWizardIntent(intent: Intent?) {
    val carbs = intent?.getIntExtra("open_wizard_carbs", 0) ?: 0
    if (carbs <= 0) return

    val notes = intent.getStringExtra("open_wizard_notes") ?: ""

    // Extras "verbrauchen", damit sie beim nächsten Lifecycle nicht erneut feuern
    intent.removeExtra("open_wizard_carbs")
    intent.removeExtra("open_wizard_notes")

    val wizard = app.aaps.ui.dialogs.WizardDialog()
    wizard.arguments = Bundle().apply {
        putDouble("carbs_input", carbs.toDouble())
        putString("notes_input", notes)
    }
    wizard.show(supportFragmentManager, "WizardDialog")
}

Den vollqualifizierten Pfad app.aaps.ui.dialogs.WizardDialog nicht durch app.aaps.plugins.main.dialogs.WizardDialog ersetzen — der WizardDialog im aktuellen dev-Branch liegt im Modul :ui, nicht in :plugins:main.

 

5. WizardDialog argumentfähig machen (optional)

Datei: ui/src/main/kotlin/app/aaps/ui/dialogs/WizardDialog.kt

Wenn der Wizard die Carbs aus den arguments lesen soll (sonst öffnet er sich leer), in onViewCreated den Aufruf binding.carbsInput.setParams(...) ergänzen:

val initialCarbs = savedInstanceState?.getDouble("carbs_input")
    ?: arguments?.getDouble("carbs_input", 0.0)?.takeIf { it > 0.0 }
    ?: 0.0

binding.carbsInput.setParams(
    initialCarbs,
    0.0,
    maxCarbs.toDouble(),
    1.0,
    DecimalFormat("0"),
    false,
    binding.okcancel.ok,
    textWatcher
)

 

 

Alternativ per patch file:

Eine PatchFile um aaps3.4.2.2, AndroidAPS4 (dev) und Iphone iAPS für CarbCam kompatible zu machen gibt es hier:

https://github.com/zehnBE/aaps3.4.2.2-carbcam-patches/

Anzuwenden mit:

git am pfad/zur/datei\0001-xxxxxxxxxx.patch

 

Bauen

Wie sonst auch, die App AndroidAPS bauen und auf dem Handy aktualisieren.
Dann kannst du per CarbCam die ermittelten Kohlenhydrate an AAPS an den Boluzwizard senden lassen, spritzen und danach in CarbCam die Daten speichern.

Den AAPS-Package-Namen an die jeweilige Variante anpassen — Stock-info.nightscout.androidaps, .full, .pumpcontrol oder der individuelle Build mit eigener applicationId.

 

 

[UPDATE]

Im Repro sind auch die Patchfiles für iPhone Loop, iAPS (da übernimmt es auch fett, eiweiss usw.), trio….:

 

aaps3.4.2.2-carbcam-patches

To Patch aaps3.4.2.2 that it allowed external carbs directly in BolusWizard from CarbCam: https://CarbCam.app

Details: https://ns.10be.de/blog/2026/06/01/carbcam-kohlenhydrate-direkt-in-den-aaps-bolus-wizard-uebernehmen

iphone iAPS Patches:

To Patch iAPS that it allowed external carbs directly in BolusWizard from CarbCam: https://github.com/zehnBE/aaps3.4.2.2-carbcam-patches/blob/main/0001-iaps-carbcam-integration.patch

iphone Loop Patches:

To Patch iphone Loop to allow carbs directly from CarbCam.app: https://github.com/zehnBE/aaps3.4.2.2-carbcam-patches/blob/main/0001-loop-carbcam-integration.patch

iphone trio Patches:

To Patch trio that it allowed eternal carbs directly into Boluswizard from CarbCam.app: https://github.com/zehnBE/aaps3.4.2.2-carbcam-patches/blob/main/0001-trio-carbcam-integration.patch

AAPS 4 (DEV) Stand 7734facd Milos Kozak m.kozak@sysop.cz on 01.06.2026 at 23:02

https://github.com/zehnBE/aaps3.4.2.2-carbcam-patches/blob/main/0001-aaps-v4-carbcam-integration.patch

 

aktuelles Diabetes Setup (Libre3, Omnipod) und Wegovy

Seit einigen Jahren bin ich nun auf dem Omnipod mit dem Libre3 unterwegs und mit dem Dash läuft es von der technischen Seite her eigentlich richtig gut (Verbindung aaps etc).

Problem damals war, dass ich nicht zu viel Insulin auf einmal abgeben durfte, sonst war die Setzstelle gefühlt bis zum Ende des Pods kaputt und wirkte sehr schlecht.

Daher gab es oft bei vielen Kohlenhydraten immer Insulin per Einwegspritze dazu.

 

Vor ca. 3 Jahren ging aber mein Gewicht deutlich nach oben und stieg immer weiter, sowie dass ich morgens aufwachte und vor Hunger fast kotzen musste. Nach der Mahlzeit hielt es keine zwei Stunden an, dann hat mein Magen wieder vor Hunger gegrummelt als ob ich zwei Tage lang nichts gegessen hätte.

Die Ernährung im Vergleich zu früher war ja schon ausgewogener und vor allem viel Gesünder (ja, deutlich, deutlich, deutlich gesünder und besser), trotzdem stieg das Gewicht und das krasse Hungergefühl immer weiter.

Daher hab ich dann mit meiner Ärztin es besprochen und den Griff zur Spritze gewagt. Krass:

Gewicht 2021 bis 2026 (ohne Klamotten und Durchschnitt)

Man sieht, wie das Gewicht gefallen ist, da einfach der Hunger weg war und man morgens ohne Übelkeit vor Hunger aufgewacht ist.

Die Spritze hab ich am Anfang noch wöchentlich genommen, aber dann gewartet bis der Hunger wieder kam. So hab ich sie nur alle 2-3 Wochen genommen. Jetzt ist der Abstand ähnlich aber mit niedrigerer Dosis.

 

Aktuell nehme ich daher nur 8 Klicks jede Woche, dass es „stabil“ im Körper ist.

 

Allerdings gibt es auch einen Nachteil, meine Muskeln sind weg. Früher war ich stark wie ein Bär und jetzt nur noch wie ein Hase 😉

Hier sieht es ja noch gut aus, aber das täuscht:

 

 

Muskelanteil in Prozent
Muskelanteil in Prozent

 

Weil die Muskelmasse selbst ist auch drastisch gesunken wie das Fett:

 

Aber nun ja, daran muss man jetzt arbeiten und deutlich mehr Muskeln wieder aufbauen, was nicht wirklich klappt, wenn einem der der Nightscout Server Dienst in Atem und ohne Schlaf wach hält.

Schlaf
wenig Energie
normale Energie

 

Nun ist aber endlich, endlich alles durch, bis auf ein paar Fehler hier und dort, die aber immer wieder Aufmerksamkeit wollen, läuft es nun extrem schnell und gut. Ich bin da schon richtig stolz drauf, auch wenn es mit viel Hilfe war und extrem anstrengende Monate waren.

 

Zurück zum Thema, Abnehmspritze

Seit das Gewicht weg ist, ist mein „schwerer“ DiabeTIS 😉 wirklich schwerer einzustellen, da das Insulin besser wirkt. Früher konnte ich x Einheiten spritzen und wusste, wenn der Loop abstellt, dann passt das zu 95%. Jetzt heißt es: der Loop ist schon seit einer Stunde aus und noch xIOB -> Zucker nehmen.

Oder so Sachen, dass er normal ist und man vor dem Spazierengehen TempTarget nach oben (sport) gesetzt hat, wusste ich, ich brauch sehr wahrscheinlich kein Zucker. Jetzt heißt es TT früh setzen und Zucker mitnehmen 🙁

Das Blöde ist auch, dass es mit der Unregelmäßigkeit der Spritze nicht einfacher macht, da vom Gefühl her immer ein paar Tage nach dem Spritzen ich wieder empfindlicher bin und dann eine Woche später wieder statt 75% eher 85% bräuchte.

Daher nun auch stabil jede Woche 8 Klicks.

 

Das war auch ein weiterer Grund die App CarbCam zu bauen, damit ich besser kcal, KH usw. sehe und diese besser tracken und in Verbindung mit Nightscout auch überprüfen ob mein Bolus Insulin korrekt war.

 

Das andere ist, dass mir der Pod seit ein paar Monaten extrem schmerzt und ich blaue Flecke und Blutergüsse danach immer habe. Und das alles nur weil das Gewicht und die Muskeln weniger sind?

Dies war nun auch ein weiterer Grund sich mal das Medtrum-System anzuschauen und 30 Tage zu testen.

 

So, für dieses bisschen Text hat es fast zwei Monate gedauert 🙂