Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
a276f87
Show recovery panel when history list response is unparseable
renjfk Apr 25, 2026
fbdf5ad
Animate loading wave that reveals the cleaning history map
renjfk Apr 26, 2026
942b523
Update all dependencies to latest versions
renjfk Apr 26, 2026
b530949
ci: pin flash tool macOS deployment target to 11.0
renjfk Apr 27, 2026
7f341cc
Fix OTA rejecting valid images on original ESP32 due to chip ID enum …
Apr 25, 2026
790e4cb
feat: rotate cleaning map in history view
renjfk Apr 25, 2026
fe4cadd
feat: generate OpenAPI spec and Markdown API reference per release
renjfk Apr 26, 2026
388c972
refactor: hand-edited OpenAPI YAML as single source of truth
Apr 27, 2026
be2790f
ci: allow legacy peer deps for openapi-typescript on TS6
Apr 27, 2026
1356b14
feat: fallback WiFi access point for browser-based provisioning (#110)
renjfk Apr 27, 2026
20272a0
docs: add manual esptool flashing guide (#111)
renjfk Apr 27, 2026
e582d0b
Fix docs regarding GPIO config (#113)
Jonnyvb Apr 29, 2026
559c0ed
fix S3 flash size (#116)
renjfk May 3, 2026
dfdd98f
ci: fix workflow lint issues
renjfk May 7, 2026
181fa4f
ci: support prerelease dispatch for fork PRs
renjfk May 7, 2026
0379c26
feat: detailed battery information in settings (#121)
renjfk May 14, 2026
09e90b0
chore: bump pinned dependencies across frontend, firmware, and flash
renjfk May 14, 2026
6a1eb27
chore: pin frontend dependency versions
renjfk May 14, 2026
50a7a9e
refactor: simplify battery diagnostics card grid
renjfk May 14, 2026
d05b682
feat: integrate battery diagnostics and new battery calibration feature
druby-luke May 15, 2026
5bca4e1
docs: add troubleshooting steps for PM load fail stuck state (#122)
renjfk May 15, 2026
17887a4
feat: add mDNS local discovery (#123)
renjfk May 15, 2026
bb7b541
feat: expose About metadata in firmware version API
renjfk May 17, 2026
559d9de
feat: add Cloudflare demo mock
renjfk May 17, 2026
d9f74c3
fix: align Cloudflare demo config
renjfk May 17, 2026
5d56b1d
fix: align demo history fixtures
renjfk May 17, 2026
5a9bd58
fix: avoid global timer in demo worker
renjfk May 17, 2026
e6f94d8
fix: align demo firmware version
renjfk May 17, 2026
4f2dc6d
fix: persist demo scenario client-side
renjfk May 17, 2026
3bc08d0
fix: harden demo worker
renjfk May 17, 2026
7a600cd
fix: rate limit demo analytics
renjfk May 17, 2026
cd17822
fix: share polling and add duplicate checks
renjfk May 18, 2026
060d09b
fix: rate limit demo probe paths
renjfk May 18, 2026
76ef8ab
Revert demo probe-path rate limiter; WAF blocks wp-* at edge
renjfk May 18, 2026
1846b26
merge: sync upstream/main (33 commits): battery diagnostics, mDNS, fa…
May 23, 2026
ffc1b29
merge: PR #3 — HA battery diagnostics & new-battery calibration
May 23, 2026
2420117
feat(ha): surface upstream-merge features as HA entities
May 23, 2026
9870ca6
fix(api): add /api/sensors to OpenAPI spec
May 23, 2026
35bc120
docs(readme): document the HA integration
May 23, 2026
a2daebd
docs(readme): foreground the HA-fork framing; normalize to LF
May 23, 2026
cf0d690
style(firmware): clang-format pass on fork-added sources (CI gate)
May 23, 2026
bc85f60
ci: add c6-debug to firmware matrix + artifact upload
May 23, 2026
da6772f
ci: add c6-ota to matrix; upload its firmware.bin as artifact
May 23, 2026
ad3e5d8
build(c6): add -DCORE_DEBUG_LEVEL=0 to ota/release flags
May 23, 2026
e80ffba
build(c6): actually apply CORE_DEBUG_LEVEL=0 + revert local pio cruft
May 23, 2026
7642b41
build(c6): drop tool-esptoolpy override on c6-debug
May 23, 2026
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
261 changes: 136 additions & 125 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,125 +1,136 @@
name: CI

on:
push:
branches: [ main ]
paths-ignore:
- 'custom_components/**'
- '.github/workflows/release.yml'
- '.github/workflows/release-ha.yml'
- '.github/workflows/prerelease.yml'
- '.github/workflows/slash-command.yml'
- '**/*.md'
- 'docs/**'
- 'LICENSE'
- '.gitignore'
- '.gitattributes'
- 'hacs.json'
pull_request:
paths-ignore:
- 'custom_components/**'
- '.github/workflows/release.yml'
- '.github/workflows/release-ha.yml'
- '.github/workflows/prerelease.yml'
- '.github/workflows/slash-command.yml'
- '**/*.md'
- 'docs/**'
- 'LICENSE'
- '.gitignore'
- '.gitattributes'
- 'hacs.json'

permissions:
contents: read

jobs:
firmware:
name: Firmware (${{ matrix.env }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
env: [c3-debug, s3-debug, esp32-debug]
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: frontend/package-lock.json

- name: Build frontend (generates web_assets.h)
run: npm ci && npm run build
working-directory: frontend

- uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Cache PlatformIO
uses: actions/cache@v4
with:
path: |
~/.platformio/platforms
~/.platformio/packages
key: platformio-${{ matrix.env }}-${{ hashFiles('platformio.ini') }}

- name: Install PlatformIO
# intelhex is an unlisted runtime dep of the newer tool-esptoolpy
# bundled with pioarduino 54.x; esptool imports it at module load.
run: pip install platformio intelhex

- name: Build firmware
run: pio run -e ${{ matrix.env }}

- name: Format check (clang-format)
run: python scripts/check_format.py

- name: Static analysis (clang-tidy)
run: pio check -e ${{ matrix.env }} --fail-on-defect=low

frontend:
name: Frontend
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: frontend/package-lock.json

- name: Install dependencies
run: npm ci
working-directory: frontend

- name: Lint and format check
run: npm run check
working-directory: frontend

- name: Build (lint + typecheck + vite + embed)
run: npm run build
working-directory: frontend

flash-tool:
name: Flash Tool
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-go@v5
with:
go-version-file: flash/go.mod

- name: Lint
uses: golangci/golangci-lint-action@v7
with:
version: v2.11.3
args: ./...
working-directory: flash

- name: Build
run: go build -o openneato-flash .
working-directory: flash
name: CI

on:
push:
branches: [ main ]
paths-ignore:
- 'custom_components/**'
- '.github/workflows/release.yml'
- '.github/workflows/release-ha.yml'
- '.github/workflows/prerelease.yml'
- '.github/workflows/slash-command.yml'
- '**/*.md'
- 'docs/**'
- 'LICENSE'
- '.gitignore'
- '.gitattributes'
- 'hacs.json'
pull_request:
paths-ignore:
- 'custom_components/**'
- '.github/workflows/release.yml'
- '.github/workflows/release-ha.yml'
- '.github/workflows/prerelease.yml'
- '.github/workflows/slash-command.yml'
- '**/*.md'
- 'docs/**'
- 'LICENSE'
- '.gitignore'
- '.gitattributes'
- 'hacs.json'

permissions:
contents: read

jobs:
firmware:
name: Firmware (${{ matrix.env }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
env: [c3-debug, c6-debug, c6-ota, s3-debug, esp32-debug]
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: frontend/package-lock.json

- name: Build frontend (generates web_assets.h)
run: npm ci && npm run build
working-directory: frontend

- uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Cache PlatformIO
uses: actions/cache@v4
with:
path: |
~/.platformio/platforms
~/.platformio/packages
key: platformio-${{ matrix.env }}-${{ hashFiles('platformio.ini') }}

- name: Install PlatformIO
# intelhex is an unlisted runtime dep of the newer tool-esptoolpy
# bundled with pioarduino 54.x; esptool imports it at module load.
run: pip install platformio intelhex

- name: Build firmware
run: pio run -e ${{ matrix.env }}

- name: Upload firmware binary
if: matrix.env == 'c6-ota'
uses: actions/upload-artifact@v4
with:
name: firmware-${{ matrix.env }}
path: |
.pio/build/${{ matrix.env }}/firmware.bin
.pio/build/${{ matrix.env }}/partitions.bin
.pio/build/${{ matrix.env }}/bootloader.bin
retention-days: 7

- name: Format check (clang-format)
run: python scripts/check_format.py

- name: Static analysis (clang-tidy)
run: pio check -e ${{ matrix.env }} --fail-on-defect=low

frontend:
name: Frontend
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: frontend/package-lock.json

- name: Install dependencies
run: npm ci
working-directory: frontend

- name: Lint and format check
run: npm run check
working-directory: frontend

- name: Build (lint + typecheck + vite + embed)
run: npm run build
working-directory: frontend

flash-tool:
name: Flash Tool
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-go@v5
with:
go-version-file: flash/go.mod

- name: Lint
uses: golangci/golangci-lint-action@v7
with:
version: v2.11.3
args: ./...
working-directory: flash

- name: Build
run: go build -o openneato-flash .
working-directory: flash
24 changes: 15 additions & 9 deletions .github/workflows/prerelease.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ jobs:
pr_number: ${{ steps.resolve.outputs.pr_number }}
head_sha: ${{ steps.resolve.outputs.head_sha }}
head_ref: ${{ steps.resolve.outputs.head_ref }}
checkout_ref: ${{ steps.resolve.outputs.checkout_ref }}
release_tag: ${{ steps.resolve.outputs.tag }}
version: ${{ steps.resolve.outputs.version }}

Expand All @@ -37,9 +38,11 @@ jobs:
PR_JSON=$(gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json headRefOid,headRefName)
HEAD_SHA=$(echo "$PR_JSON" | jq -r '.headRefOid')
HEAD_REF=$(echo "$PR_JSON" | jq -r '.headRefName')
CHECKOUT_REF="refs/pull/$PR_NUMBER/head"
else
HEAD_SHA="$GITHUB_SHA"
HEAD_REF="$GITHUB_REF_NAME"
CHECKOUT_REF="$GITHUB_SHA"
fi

LATEST_TAG=$(gh release list --repo "$GITHUB_REPOSITORY" \
Expand All @@ -51,15 +54,18 @@ jobs:
if [ -n "$PR_NUMBER" ]; then
TAG="v${BASE}-pr${PR_NUMBER}.${SHORT_SHA}"
else
SAFE_REF=$(echo "$HEAD_REF" | sed 's/[^a-zA-Z0-9._-]/-/g')
SAFE_REF="${HEAD_REF//[^a-zA-Z0-9._-]/-}"
TAG="v${BASE}-${SAFE_REF}.${SHORT_SHA}"
fi

echo "pr_number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
echo "head_sha=$HEAD_SHA" >> "$GITHUB_OUTPUT"
echo "head_ref=$HEAD_REF" >> "$GITHUB_OUTPUT"
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
echo "version=${TAG#v}" >> "$GITHUB_OUTPUT"
{
echo "pr_number=$PR_NUMBER"
echo "head_sha=$HEAD_SHA"
echo "head_ref=$HEAD_REF"
echo "checkout_ref=$CHECKOUT_REF"
echo "tag=$TAG"
echo "version=${TAG#v}"
} >> "$GITHUB_OUTPUT"
echo "Release: $TAG ($HEAD_REF @ $SHORT_SHA)"

prerelease:
Expand All @@ -71,7 +77,7 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ needs.resolve.outputs.head_sha }}
ref: ${{ needs.resolve.outputs.checkout_ref }}
fetch-depth: 0

- name: Create release tag
Expand Down Expand Up @@ -122,10 +128,10 @@ jobs:
env:
FIRMWARE_VERSION: ${{ needs.resolve.outputs.version }}
run: |
for env in $(grep -oE '^\[env:([a-zA-Z0-9_-]+-release)\]' platformio.ini | sed 's/\[env:\(.*\)\]/\1/'); do
while IFS= read -r env; do
echo "Building $env..."
pio run -e "$env"
done
done < <(grep -oE '^\[env:([a-zA-Z0-9_-]+-release)\]' platformio.ini | sed 's/\[env:\(.*\)\]/\1/')

# --- Flash tool + GitHub Release ---

Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ jobs:
run: |
RELEASE_TAG="${{ github.event.inputs.release_tag }}"
VERSION=${RELEASE_TAG#v}
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "Setting version to: $VERSION"

- name: Save release notes
Expand Down Expand Up @@ -98,7 +98,7 @@ jobs:
run: npm ci
working-directory: frontend

- name: Build frontend (lint + typecheck + vite + embed)
- name: Build frontend (lint + codegen + path-sync + typecheck + vite + embed)
run: npm run build
working-directory: frontend

Expand Down Expand Up @@ -128,10 +128,10 @@ jobs:
run: |
# Build all *-release environments; post-build hook packages
# firmware artifacts into each env's build dir for GoReleaser
for env in $(grep -oE '^\[env:([a-zA-Z0-9_-]+-release)\]' platformio.ini | sed 's/\[env:\(.*\)\]/\1/'); do
while IFS= read -r env; do
echo "Building $env..."
pio run -e "$env"
done
done < <(grep -oE '^\[env:([a-zA-Z0-9_-]+-release)\]' platformio.ini | sed 's/\[env:\(.*\)\]/\1/')

# --- Flash tool + GitHub Release ---

Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/slash-command.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,7 @@ jobs:
-f content='rocket' --silent

PR_NUMBER="${{ github.event.issue.number }}"
HEAD_REF=$(gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json headRefName --jq '.headRefName')

gh workflow run prerelease.yml --repo "$GITHUB_REPOSITORY" --ref "$HEAD_REF" \
gh workflow run prerelease.yml --repo "$GITHUB_REPOSITORY" --ref "${{ github.event.repository.default_branch }}" \
-f pr_number="$PR_NUMBER" \
-f comment_id="${{ github.event.comment.id }}"
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
.pio
.cache
__pycache__/
*.pyc
compile_commands.json
firmware/compile_commands.json
firmware/src/web_assets.h
frontend/node_modules
frontend/dist
frontend/mock/build-info.js
frontend/src/types.generated.ts
flash/openneato-flash
release/
dist/
Loading
Loading