{
  "schema_version": 1,
  "project": "K5",
  "project_version": "1.13.0",
  "checked_on": "2026-11-04",
  "responsibility": "Felix Schreiber",
  "purpose": "Privates, lesendes Energie-Monitoring; keine wissenschaftlich validierte Studie",
  "inventory_scope": "Dokumentierte direkte Laufzeit, Datenquellen und Recherchebezüge; keine vollständige Betriebssystem-SBOM oder abgeschlossene Herkunftsprüfung sämtlicher historischer Snippets",
  "software": [
    {
      "name": "Python",
      "version": "3.13.5",
      "role": "Backend, Datenabruf und Berechnungen; überwiegend Standardbibliothek",
      "license": "PSF-2.0; zusätzliche Hinweise für enthaltene Komponenten",
      "url": "https://www.python.org/",
      "license_url": "https://docs.python.org/3.13/license.html",
      "relationship": "runtime"
    },
    {
      "name": "SQLite",
      "version": "3.46.1",
      "role": "Lokale Messdatenbanken und Sitzungsverwaltung",
      "license": "Public Domain (SQLite-Kern)",
      "url": "https://sqlite.org/",
      "license_url": "https://sqlite.org/copyright.html",
      "relationship": "runtime_via_python"
    },
    {
      "name": "OpenSSL",
      "version": "3.5.7",
      "role": "TLS und kryptografische Funktionen über Python",
      "license": "Apache-2.0",
      "url": "https://openssl-library.org/",
      "license_url": "https://openssl-library.org/source/license/index.html",
      "relationship": "runtime_via_python"
    },
    {
      "name": "cloudflared",
      "version": "2026.10.7",
      "role": "Verschlüsselter Tunnel für den externen Browserzugang",
      "license": "Apache-2.0; weitere Abhängigkeiten haben eigene Hinweise",
      "url": "https://github.com/cloudflare/cloudflared",
      "license_url": "https://github.com/cloudflare/cloudflared/blob/2026.10.7/LICENSE",
      "relationship": "separate_runtime_program"
    },
    {
      "name": "Raspbian GNU/Linux",
      "version": "13 (trixie)",
      "role": "Betriebssystem; unter anderem systemd und OpenSSH für Betrieb und Wartung",
      "license": "Unterschiedliche Paketlizenzen",
      "url": "https://www.raspbian.org/",
      "license_url": "https://www.debian.org/legal/licenses/",
      "relationship": "operating_system"
    }
  ],
  "data_sources": [
    {
      "name": "Solar Manager",
      "role": "PV, Hausverbrauch, Netz- und Batterieflüsse sowie Gerätehistorien",
      "kind": "Messdaten über externe Schnittstelle",
      "url": "https://solarmanager.zohodesk.com/portal/de/kb/articles/api"
    },
    {
      "name": "Bosch Home Comfort / K40 / HomeCom",
      "role": "Wärmepumpen-, Hydraulik- und freigegebene Regelungswerte",
      "kind": "Geräte- und Cloud-Schnittstellen",
      "url": "https://github.com/bosch-home-comfort/api-docs"
    },
    {
      "name": "Bosch Smart Home",
      "role": "Heizkörperthermostate und Raumklima",
      "kind": "Lokale Geräte-Schnittstelle",
      "url": "https://github.com/BoschSmartHome/bosch-shc-api-docs"
    },
    {
      "name": "Shelly",
      "role": "Einzelne elektrische Verbraucher",
      "kind": "Lokale Geräte-Schnittstellen",
      "url": "https://shelly-api-docs.shelly.cloud/"
    },
    {
      "name": "Tibber",
      "role": "Strompreise und Verbrauchsdaten; Rechnungen getrennt berücksichtigt",
      "kind": "Externe Schnittstellen",
      "url": "https://developer.tibber.com/"
    },
    {
      "name": "inexogy",
      "role": "Kumulierte Netz-Zählerstände; zeitverzögerte Historie",
      "kind": "Externe Zähler-Schnittstelle, keine unabhängige Live-Leistungsmessung",
      "url": "https://www.inexogy.com/"
    },
    {
      "name": "Home Connect",
      "role": "Betriebszustände und Ereignisse des Geschirrspülers",
      "kind": "Externe Geräte-Schnittstelle",
      "url": "https://api-docs.home-connect.com/"
    },
    {
      "name": "Open-Meteo / Deutscher Wetterdienst",
      "role": "ICON-Wettermodelle, Ensemble und archivierte Wetterprognosen",
      "kind": "Modellierte Wetterdaten, keine eigene Wetterstation",
      "url": "https://open-meteo.com/",
      "license": "CC BY 4.0 für API-Daten; Herkunftsbedingungen beachten",
      "license_url": "https://creativecommons.org/licenses/by/4.0/",
      "source_url": "https://open-meteo.com/en/licence",
      "modification": "Stundenwerte werden aggregiert und für eine standortspezifische PV-Ertragsschätzung verarbeitet."
    },
    {
      "name": "Umweltbundesamt",
      "role": "Nationaler PV-Nettovermeidungsfaktor für 2024 als Rechenannahme",
      "kind": "Publizierter Modellfaktor",
      "url": "https://www.umweltbundesamt.de/system/files/medien/11850/publikationen/2026-01/11_2026_CC.pdf#page=52"
    }
  ],
  "research_references": [
    {
      "name": "Soardiac / ha-solarmanager",
      "url": "https://github.com/Soardiac/ha-solarmanager",
      "role": "Recherche zur Solar-Manager-Anbindung"
    },
    {
      "name": "serbanb11 / bosch-homecom-hass",
      "url": "https://github.com/serbanb11/bosch-homecom-hass",
      "role": "Recherche zu HomeCom und erreichbaren Gerätewerten"
    },
    {
      "name": "EMS-ESP32",
      "url": "https://github.com/emsesp/EMS-ESP32",
      "role": "Recherche zu möglichen EMS-Zugängen; nicht als EMS-Gateway in K5 installiert"
    },
    {
      "name": "wlcrs / huawei_solar",
      "url": "https://github.com/wlcrs/huawei_solar",
      "role": "Recherche zu Huawei-Schnittstellen; keine unabhängig bestätigte direkte K5-Anbindung daraus"
    }
  ],
  "design_reference": {
    "name": "Solar Manager",
    "role": "Gestalterisches Vorbild für Stromfluss und Gerätefarben; getrennt von einer Codeübernahme zu betrachten",
    "url": "https://www.solarmanager.ch/"
  },
  "methods": [
    {
      "name": "Messwerte und Zeit",
      "description": "Quellenzeit und Empfangszeit werden getrennt geführt. Die fünfsekündige Bildschirmaktualisierung erhöht nicht die tatsächliche Messfrequenz. Fehlende oder ungültige Werte werden nicht als Null ausgegeben."
    },
    {
      "name": "Energie und Leistung",
      "description": "Intervallenergie in Wh wird durch die Intervalldauer in Stunden geteilt, um eine mittlere Leistung in W zu erhalten. Tagesenergie ist die Summe vorhandener Intervalle in kWh. Kumulative Zählerstände werden getrennt differenziert; Rücksetzungen und Datenlücken sind zu berücksichtigen."
    },
    {
      "name": "Stromfluss",
      "description": "Die Herkunftsaufteilung wird aus zeitgleichen Gesamtwerten berechnet: PV deckt zuerst den Hausverbrauch, verbleibende PV-Leistung lädt die Batterie; weiterer Ladebedarf wird dem Netz zugerechnet. Das sind keine separat gemessenen Leitungsflüsse. „Andere“ ist ein berechneter Rest; überlappende Messungen dürfen nicht addiert werden."
    },
    {
      "name": "PV-Prognose",
      "description": "Stündliche Open-Meteo-/DWD-ICON-Daten werden mit vergangenen PV-Erträgen abgeglichen. Die Anpassung nutzt bis zu 42 vollständige Tage; der rollierende Rücktest verwendet jeweils nur frühere Tage. Die Spanne kombiniert Wettervarianten und bisherige Abweichungen und ist keine statistisch garantierte Eintrittswahrscheinlichkeit."
    },
    {
      "name": "CO₂-Schätzung",
      "description": "Gemeldete PV-Erzeugung × 0,68474 kg CO₂e/kWh nach UBA-Nettofaktor 2024. Das ist eine modellierte nationale Vermeidungswirkung, keine Messung des lokalen Strommixes und keine vollständige Hausbilanz. Eigenverbrauch, Einspeisung und Batterieentladung erhalten keine zusätzliche zweite Gutschrift."
    },
    {
      "name": "Tarifvergleich",
      "description": "Belegte Rechnungen und modellierte Fortschreibungen bleiben unterscheidbar. Der Vergleich bezieht sich auf denselben Netzbezug und berücksichtigt dokumentierte Grund-, Mess- und Einmalkosten sowie ausgewiesene Annahmen. Ein Arbeitskostenvergleich allein ist keine Gesamtersparnis."
    },
    {
      "name": "Heizung und Raumklima",
      "description": "Vorlauf und Rücklauf sind nur bei gleicher hydraulischer Messgrenze und passender Zeit vergleichbar. Die Sensorzuordnung ist teilweise noch offen. Interne Wärme-Strom-Quotienten sind keine normgerecht gemessene JAZ. Heizkörperfühler sind keine unabhängigen Referenz-Raumthermometer."
    }
  ],
  "development": {
    "ai_assistance": "OpenAI Codex unterstützte Programmierung, Recherche und Auswertung. Das ist keine Zusicherung der Fehlerfreiheit oder der vollständigen Herkunftszuordnung.",
    "verification": "Automatisierte Funktions- und Zugriffstests sowie Darstellungsprüfungen in WebKit; keine unabhängige wissenschaftliche Begutachtung."
  },
  "open_questions": [
    "Historische Codeausschnitte und einzelne SVG-Symbole sind noch nicht lückenlos einer Herkunft und gegebenenfalls einer Fremdlizenz zugeordnet.",
    "Die Liste bildet direkte Bestandteile ab, nicht alle transitiven Abhängigkeiten von Python, cloudflared oder dem Betriebssystem."
  ],
  "source_release": {
    "public_release_available": false,
    "project_license": null,
    "url": null,
    "status": "Eine veröffentlichte, vollständig lizenzgeprüfte Quellcodefassung ist noch nicht freigegeben.",
    "private_data_policy": "Private Messreihen, Anmeldedaten, Schlüssel und originale Hausunterlagen werden nicht mit dieser Übersicht veröffentlicht."
  }
}
