# ozx-68102/xiaomilog2battery architecture

> Architecture diagram of the GitHub repository ozx-68102/xiaomilog2battery, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ozx-68102/xiaomilog2battery
- Repository: https://github.com/ozx-68102/xiaomilog2battery

## Overview

XiaomiLog2Battery is a Dash application for extracting battery-health metrics from Xiaomi bugreport ZIPs, storing them locally, and exploring them in charts and reports. The main workflow is upload → extract → parse and validate → save or append → visualize. The README also documents model reporting and configurable local-time display. Some page and callback source was not sampled, so uncertain page-level wiring is omitted; unsampled features are represented only where their paths are present in the tree.

Main entry points: [`app.py`](https://github.com/ozx-68102/xiaomilog2battery/blob/main/app.py) (Dash application), [`utils/pipelines.py`](https://github.com/ozx-68102/xiaomilog2battery/blob/main/utils/pipelines.py) (Analysis pipeline), [`pages/graphs.py`](https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/graphs.py) (Battery graphs), [`pages/reports.py`](https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/reports.py) (Detailed reports)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Dash interface"]
  node_uploads["Upload page<br/>[uploads.py]"]
  node_processing_page["Processing page<br/>[processing.py]"]
  node_graphs["Battery graphs<br/>[graphs.py]"]
  node_reports["Detailed reports<br/>[reports.py]"]
  node_settings["Timezone settings<br/>[settings.py]"]
  node_home["Home page<br/>[home.py]"]
end

subgraph group_processing["Log processing"]
  node_pipeline["Analysis pipeline<br/>[pipelines.py]"]
  node_extractor["ZIP extractor"]
  node_parser["Battery log parser<br/>[parser.py]"]
end

subgraph group_data["Analysis and storage"]
  node_parsed["Parsed battery records"]
  node_services["Data services<br/>[data_services.py]"]
  node_results["Results persistence"]
  node_sqlite[("SQLite database<br/>[connect.py]")]
  node_visualizer["Visualization service<br/>[visualizer.py]"]
end

subgraph group_runtime["Application state"]
  node_app["Dash application<br/>[app.py]"]
  node_zipfiles["Uploaded ZIPs"]
  node_logs["Extracted text logs"]
  node_timezone["Browser timezone state<br/>[app.py]"]
end

node_user(("User"))

node_user -->|"uploads ZIPs"| node_uploads
node_user -->|"starts processing"| node_processing_page
node_user -->|"views trends"| node_graphs
node_user -->|"inspects records"| node_reports
node_user -->|"sets timezone"| node_settings
node_app -->|"routes pages"| node_uploads
node_app -->|"routes pages"| node_processing_page
node_app -->|"routes pages"| node_graphs
node_app -->|"routes pages"| node_reports
node_app -->|"routes pages"| node_settings
node_app -->|"routes pages"| node_home
node_uploads -->|"stores uploads"| node_zipfiles
node_processing_page -->|"starts pipeline"| node_pipeline
node_pipeline -->|"reads ZIPs"| node_zipfiles
node_pipeline -->|"calls extraction"| node_extractor
node_extractor -->|"writes logs"| node_logs
node_pipeline -->|"calls parsing"| node_parser
node_parser -->|"reads logs"| node_logs
node_parser -->|"returns records"| node_parsed
node_pipeline -->|"saves records"| node_services
node_services -->|"validates and writes"| node_results
node_results -->|"reads and writes"| node_sqlite
node_graphs -->|"requests analysis data"| node_services
node_reports -->|"requests report data"| node_services
node_reports -->|"reads timezone"| node_timezone
node_settings -->|"updates preference"| node_timezone
node_graphs -->|"uses chart logic"| node_visualizer

click node_app "https://github.com/ozx-68102/xiaomilog2battery/blob/main/app.py"
click node_uploads "https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/uploads.py"
click node_processing_page "https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/processing.py"
click node_pipeline "https://github.com/ozx-68102/xiaomilog2battery/blob/main/utils/pipelines.py"
click node_extractor "https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/processing/battery_processor.py"
click node_parser "https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/analysis/parser.py"
click node_services "https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/analysis/data_services.py"
click node_results "https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/persistence/analysis_results.py"
click node_sqlite "https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/persistence/connect.py"
click node_graphs "https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/graphs.py"
click node_reports "https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/reports.py"
click node_settings "https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/settings.py"
click node_timezone "https://github.com/ozx-68102/xiaomilog2battery/blob/main/app.py"
click node_home "https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/home.py"
click node_visualizer "https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/analysis/visualizer.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_uploads,node_processing_page,node_graphs,node_reports,node_settings,node_home,node_user toneBlue
class node_pipeline,node_extractor,node_parser toneAmber
class node_parsed,node_services,node_results,node_sqlite,node_visualizer toneMint
class node_app,node_zipfiles,node_logs,node_timezone toneRose
```

## Components

### Dash interface

- [Upload page](https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/uploads.py): `pages/uploads.py`
- [Processing page](https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/processing.py): `pages/processing.py`
- [Battery graphs](https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/graphs.py): `pages/graphs.py`
- [Detailed reports](https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/reports.py): `pages/reports.py`
- [Timezone settings](https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/settings.py): `pages/settings.py`
- [Home page](https://github.com/ozx-68102/xiaomilog2battery/blob/main/pages/home.py): `pages/home.py`

### Log processing

- [Analysis pipeline](https://github.com/ozx-68102/xiaomilog2battery/blob/main/utils/pipelines.py): `utils/pipelines.py`
- [ZIP extractor](https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/processing/battery_processor.py): `src/processing/battery_processor.py`
- [Battery log parser](https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/analysis/parser.py): `src/analysis/parser.py`

### Analysis and storage

- **Parsed battery records**
- [Data services](https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/analysis/data_services.py): `src/analysis/data_services.py`
- [Results persistence](https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/persistence/analysis_results.py): `src/persistence/analysis_results.py`
- [SQLite database](https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/persistence/connect.py): `src/persistence/connect.py`
- [Visualization service](https://github.com/ozx-68102/xiaomilog2battery/blob/main/src/analysis/visualizer.py): `src/analysis/visualizer.py`

### Application state

- [Dash application](https://github.com/ozx-68102/xiaomilog2battery/blob/main/app.py): `app.py`
- **Uploaded ZIPs**
- **Extracted text logs**
- [Browser timezone state](https://github.com/ozx-68102/xiaomilog2battery/blob/main/app.py): `app.py`

### Other components

- **User**

## Connections

- User → Upload page: uploads ZIPs
- User → Processing page: starts processing
- User → Battery graphs: views trends
- User → Detailed reports: inspects records
- User → Timezone settings: sets timezone
- Dash application → Upload page: routes pages
- Dash application → Processing page: routes pages
- Dash application → Battery graphs: routes pages
- Dash application → Detailed reports: routes pages
- Dash application → Timezone settings: routes pages
- Dash application → Home page: routes pages
- Upload page → Uploaded ZIPs: stores uploads
- Processing page → Analysis pipeline: starts pipeline
- Analysis pipeline → Uploaded ZIPs: reads ZIPs
- Analysis pipeline → ZIP extractor: calls extraction
- ZIP extractor → Extracted text logs: writes logs
- Analysis pipeline → Battery log parser: calls parsing
- Battery log parser → Extracted text logs: reads logs
- Battery log parser → Parsed battery records: returns records
- Analysis pipeline → Data services: saves records
- Data services → Results persistence: validates and writes
- Results persistence → SQLite database: reads and writes
- Battery graphs → Data services: requests analysis data
- Detailed reports → Data services: requests report data
- Detailed reports → Browser timezone state: reads timezone
- Timezone settings → Browser timezone state: updates preference
- Battery graphs → Visualization service: uses chart logic
