From db5083622d3fd16838b8a77ad6fb4b1d04a69f68 Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Sun, 4 Jan 2026 02:47:58 +0100 Subject: [PATCH 01/20] CI matrix strategy - Node.js: 22, 25 - Python: 3.11, 3.13 and 3.14 --- .github/workflows/build.yml | 21 +++++++---- .github/workflows/tests.yml | 72 ++++++++++++++++++++++++++++++++----- 2 files changed, 79 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 974b2f7e..fdc5bfd9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,11 +27,11 @@ jobs: steps: - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 24 + node-version: 22 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.13 + python-version: 3.11 - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 @@ -76,14 +76,23 @@ jobs: needs: [frekvens-basic, obegransad-basic] runs-on: ubuntu-latest + strategy: + matrix: + include: + - node-version: 22 + python-version: 3.11 + + - node-version: 25 + python-version: 3.13 + steps: - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 24 + node-version: ${{ matrix.node-version }} - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.13 + python-version: ${{ matrix.python-version }} - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 @@ -231,11 +240,11 @@ jobs: steps: - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 24 + node-version: 22 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.13 + python-version: 3.11 - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 245bccf8..9e014fd6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -23,10 +23,17 @@ jobs: name: Animation splitter runs-on: ubuntu-latest + strategy: + matrix: + include: + - python-version: 3.11 + + - python-version: 3.14 + steps: - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.13 + python-version: ${{ matrix.python-version }} - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 @@ -80,10 +87,17 @@ jobs: needs: distributed-display-protocol-streamer runs-on: ubuntu-latest + strategy: + matrix: + include: + - python-version: 3.11 + + - python-version: 3.14 + steps: - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.13 + python-version: ${{ matrix.python-version }} - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 @@ -173,10 +187,17 @@ jobs: name: Distributed Display Protocol streamer runs-on: ubuntu-latest + strategy: + matrix: + include: + - python-version: 3.11 + + - python-version: 3.14 + steps: - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.13 + python-version: ${{ matrix.python-version }} - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 @@ -267,10 +288,17 @@ jobs: needs: art-net-streamer runs-on: ubuntu-latest + strategy: + matrix: + include: + - python-version: 3.11 + + - python-version: 3.14 + steps: - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.13 + python-version: ${{ matrix.python-version }} - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 @@ -360,10 +388,17 @@ jobs: name: Font generator runs-on: ubuntu-latest + strategy: + matrix: + include: + - python-version: 3.11 + + - python-version: 3.14 + steps: - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.13 + python-version: ${{ matrix.python-version }} - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 @@ -380,10 +415,17 @@ jobs: name: Home thermometer demo runs-on: ubuntu-latest + strategy: + matrix: + include: + - python-version: 3.11 + + - python-version: 3.14 + steps: - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.13 + python-version: ${{ matrix.python-version }} - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 @@ -405,10 +447,17 @@ jobs: name: Mode generator runs-on: ubuntu-latest + strategy: + matrix: + include: + - python-version: 3.11 + + - python-version: 3.14 + steps: - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.13 + python-version: ${{ matrix.python-version }} - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 @@ -486,10 +535,17 @@ jobs: name: x509 certificate bundle runs-on: ubuntu-latest + strategy: + matrix: + include: + - python-version: 3.11 + + - python-version: 3.13 + steps: - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.13 + python-version: ${{ matrix.python-version }} - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 From 067992b8256fb0bbcc8a55eb6f0ea2e941c2977f Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Sun, 4 Jan 2026 09:21:17 +0100 Subject: [PATCH 02/20] Refactored all workflows - Added names - Merged steps - Improved matrix --- .github/workflows/build.yml | 185 +++++++++++++-------------- .github/workflows/dependabot-pio.yml | 6 +- .github/workflows/stale.yml | 3 +- .github/workflows/tests.yml | 145 +++++++++++++-------- .github/workflows/wiki.yml | 6 +- 5 files changed, 190 insertions(+), 155 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fdc5bfd9..38d74437 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,25 +19,65 @@ permissions: contents: read jobs: - frekvens-basic: - name: IKEA Frekvens LED multi-use light - basic - needs: obegransad-basic + pio: + name: PlatformIO environments runs-on: ubuntu-latest + outputs: + environments: ${{ steps.pio.outputs.environments }} + steps: + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: 3.13 + + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: Export PlatformIO environments + id: pio + run: | + echo "environments=$(pio project config --json-output \ + | jq -c '[.[] | .[0] | select(startswith("env:")) | sub("^env:"; "")]')" \ + >> "$GITHUB_OUTPUT" + + frekvens: + name: Frekvens + needs: pio + runs-on: ubuntu-latest + + strategy: + max-parallel: 1 + matrix: + pioenv: ${{ fromJson(needs.pio.outputs.environments) }} + toolchain: + - node-version: 22 + python-version: 3.11 + + - node-version: 25 + python-version: 3.13 steps: - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + - name: Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 22 + node-version: ${{ matrix.toolchain.node-version }} - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - python-version: 3.11 + python-version: ${{ matrix.toolchain.python-version }} - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - run: pip install -r .github/platformio/requirements.txt + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt - - run: | + - name: Basic - IKEA Frekvens LED multi-use light + run: | cat < .env EXTENSION_BUTTON='true' EXTENSION_MICROPHONE='true' @@ -55,7 +95,6 @@ jobs: NAME='Frekvens' EOL - - run: | cat < firmware/include/config/secrets.h #pragma once #define PIN_CS 1 @@ -69,36 +108,42 @@ jobs: #define WIFI_SSID "redacted" EOL - - run: pio run - - frekvens-extensive: - name: IKEA Frekvens LED multi-use light - extensive - needs: [frekvens-basic, obegransad-basic] - runs-on: ubuntu-latest - - strategy: - matrix: - include: - - node-version: 22 - python-version: 3.11 + pio run --environment ${{ matrix.pioenv }} - - node-version: 25 - python-version: 3.13 - - steps: - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: ${{ matrix.node-version }} - - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: ${{ matrix.python-version }} + - name: Basic - IKEA Obegränsad LED wall lamp + run: | + cat < .env + EXTENSION_BUTTON='true' + EXTENSION_OTA='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + HOSTNAME='obegransad' + IKEA_OBEGRANSAD='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_LINES='true' + MODE_NOISE='true' + MODE_RAIN='true' + MODE_SCAN='true' + MODE_STARS='true' + NAME='Obegränsad' + EOL - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + cat < firmware/include/config/secrets.h + #pragma once + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW2 5 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + EOL - - run: pip install -r .github/platformio/requirements.txt + pio run --environment ${{ matrix.pioenv }} - - run: | + - name: Extensive - IKEA Frekvens LED multi-use light + run: | cat < .env EXTENSION_ALEXA='true' EXTENSION_BUTTON='true' @@ -119,7 +164,6 @@ jobs: FONT_BRAILLE='true' HOSTNAME='frekvens' IKEA_FREKVENS='true' - IKEA_OBEGRANSAD='false' MODE_ANIMATION='true' MODE_ARROW='true' MODE_ARTNET='true' @@ -174,7 +218,6 @@ jobs: TIME_ZONE='Etc/Universal' EOL - - run: | cat < firmware/include/config/secrets.h #pragma once #define FRAME_RATE 60 @@ -212,16 +255,18 @@ jobs: #define WORLDWEATHERONLINE_KEY "redacted" EOL - - run: pio run + pio run --environment ${{ matrix.pioenv }} - frekvens-spotlight: - name: IKEA Frekvens LED spotlight - ESPHome + ikea-frekvens-led-spotlight: + name: ESPHome - IKEA Frekvens LED spotlight runs-on: ubuntu-latest steps: - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - run: | + - name: secrets.yaml + run: | cat < extra/IKEA-Frekvens-LED-spotlight/secrets.yaml api_key: "redacted" ota_password: "redacted" @@ -229,55 +274,7 @@ jobs: wifi_ssid: "redacted" EOL - - uses: esphome/build-action@f93bda46d83c761cd25bbfdf350cfe508a0a39d5 # v7.1.0 + - name: ESPHome + uses: esphome/build-action@f93bda46d83c761cd25bbfdf350cfe508a0a39d5 # v7.1.0 with: yaml-file: extra/IKEA-Frekvens-LED-spotlight/esphome.yaml - - obegransad-basic: - name: IKEA Obegränsad LED wall lamp - basic - runs-on: ubuntu-latest - - steps: - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: 22 - - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: 3.11 - - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - run: pip install -r .github/platformio/requirements.txt - - - run: | - cat < .env - EXTENSION_BUTTON='true' - EXTENSION_OTA='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - HOSTNAME='obegransad' - IKEA_OBEGRANSAD='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_LINES='true' - MODE_NOISE='true' - MODE_RAIN='true' - MODE_SCAN='true' - MODE_STARS='true' - NAME='Obegränsad' - EOL - - - run: | - cat < firmware/include/config/secrets.h - #pragma once - #define PIN_CS 1 - #define PIN_MOSI 2 - #define PIN_OE 3 - #define PIN_SCLK 4 - #define PIN_SW2 5 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - EOL - - - run: pio run diff --git a/.github/workflows/dependabot-pio.yml b/.github/workflows/dependabot-pio.yml index 5f74adf7..564e7e9b 100644 --- a/.github/workflows/dependabot-pio.yml +++ b/.github/workflows/dependabot-pio.yml @@ -15,8 +15,10 @@ jobs: runs-on: ubuntu-latest name: PlatformIO Dependabot steps: - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - uses: JanPetterMG/platformio_dependabot@d52a00e84a5eac4e52b90ed3b26647496544fae8 # python313 + - name: PlatformIO dependabot + uses: peterus/platformio_dependabot@ee459e446a090c4894b1354a3b85bc064797fd2b # v1.2.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 2cc4bb36..79772889 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -15,7 +15,8 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 + - name: Stale + uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 with: stale-issue-message: No recent activity has been detected on this issue. It's now marked as stale and may be closed soon if no further updates are made. days-before-issue-stale: 60 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9e014fd6..718a552c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -31,15 +31,19 @@ jobs: - python-version: 3.14 steps: - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.python-version }} - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - run: pip install tools/ + - name: Set up Frekvens tools + run: pip install tools/ - - run: | + - name: Animation splitter + run: | cat < Animation.csv 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -75,16 +79,16 @@ jobs: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 EOL - - run: python -m frekvens.AnimationSplitter --input Animation.csv + python -m frekvens.AnimationSplitter --input Animation.csv - - uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 + - name: File existence + uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 with: fail: true files: Animation-1.csv, Animation-2.csv art-net-streamer: name: Art-Net streamer - needs: distributed-display-protocol-streamer runs-on: ubuntu-latest strategy: @@ -95,15 +99,19 @@ jobs: - python-version: 3.14 steps: - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.python-version }} - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - run: pip install tools/ + - name: Set up Frekvens tools + run: pip install tools/ - - run: | + - name: Animation + run: | cat < Animation.csv 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -139,7 +147,6 @@ jobs: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 EOL - - run: | set +e OUTPUT=$(python -m frekvens.ArtNetStreamer --host localhost --input Animation.csv 2>&1) STATUS=$? @@ -151,7 +158,8 @@ jobs: echo "Unexpected error or no error." exit $STATUS - - run: | + - name: Drawing + run: | cat < Drawing.csv 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -171,7 +179,6 @@ jobs: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 EOL - - run: | set +e OUTPUT=$(python -m frekvens.ArtNetStreamer --host localhost --input Drawing.csv 2>&1) STATUS=$? @@ -195,15 +202,19 @@ jobs: - python-version: 3.14 steps: - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.python-version }} - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - run: pip install tools/ + - name: Set up Frekvens tools + run: pip install tools/ - - run: | + - name: Animation + run: | cat < Animation.csv 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -239,7 +250,6 @@ jobs: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 EOL - - run: | set +e OUTPUT=$(python -m frekvens.DistributedDisplayProtocolStreamer --host localhost --input Animation.csv 2>&1) STATUS=$? @@ -251,7 +261,8 @@ jobs: echo "Unexpected error or no error." exit $STATUS - - run: | + - name: Drawing + run: | cat < Drawing.csv 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -271,7 +282,6 @@ jobs: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 EOL - - run: | set +e OUTPUT=$(python -m frekvens.DistributedDisplayProtocolStreamer --host localhost --input Drawing.csv 2>&1) STATUS=$? @@ -285,7 +295,6 @@ jobs: e131-streamer: name: E1.31 streamer - needs: art-net-streamer runs-on: ubuntu-latest strategy: @@ -296,15 +305,19 @@ jobs: - python-version: 3.14 steps: - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.python-version }} - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - run: pip install tools/ + - name: Set up Frekvens tools + run: pip install tools/ - - run: | + - name: Animation + run: | cat < Animation.csv 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -340,7 +353,6 @@ jobs: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 EOL - - run: | set +e OUTPUT=$(python -m frekvens.E131Streamer --host localhost --input Animation.csv 2>&1) STATUS=$? @@ -352,7 +364,8 @@ jobs: echo "Unexpected error or no error." exit $STATUS - - run: | + - name: Drawing + run: | cat < Drawing.csv 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -372,7 +385,6 @@ jobs: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 EOL - - run: | set +e OUTPUT=$(python -m frekvens.E131Streamer --host localhost --input Drawing.csv 2>&1) STATUS=$? @@ -396,17 +408,22 @@ jobs: - python-version: 3.14 steps: - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.python-version }} - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - run: pip install -r extra/Python/requirements.txt + - name: Set up Frekvens extra + run: pip install -r extra/Python/requirements.txt - - run: python extra/Python/FontGenerator.py --input DejaVuSans --size 8 + - name: Font generator + run: python extra/Python/FontGenerator.py --input DejaVuSans --size 8 - - uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 + - name: File existence + uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 with: fail: true files: DejaVuSansFont.cpp, DejaVuSansFont.h @@ -423,15 +440,19 @@ jobs: - python-version: 3.14 steps: - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.python-version }} - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - run: pip install tools/ + - name: Set up Frekvens tools + run: pip install tools/ - - run: | + - name: Home thermometer demo + run: | set +e OUTPUT=$(python -m frekvens.HomeThermometerDemo --host localhost --indoor=22 --outdoor=8 2>&1) STATUS=$? @@ -455,13 +476,16 @@ jobs: - python-version: 3.14 steps: - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.python-version }} - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - run: | + - name: Animation + run: | cat < Animation.csv 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -497,14 +521,16 @@ jobs: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 EOL - - run: python extra/Python/ModeGenerator.py --input Animation.csv + python extra/Python/ModeGenerator.py --input Animation.csv - - uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 + - name: File existence + uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 with: fail: true files: AnimationMode.cpp, AnimationMode.h - - run: | + - name: Drawing + run: | cat < Drawing.csv 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -524,9 +550,10 @@ jobs: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 EOL - - run: python extra/Python/ModeGenerator.py --input Drawing.csv + python extra/Python/ModeGenerator.py --input Drawing.csv - - uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 + - name: File existence + uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 with: fail: true files: DrawingMode.cpp, DrawingMode.h @@ -543,15 +570,20 @@ jobs: - python-version: 3.13 steps: - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.python-version }} - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - run: pip install -r .github/platformio/requirements.txt + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt - - run: | + - name: Weather + continue-on-error: true + run: | cat < .env HOSTNAME='frekvens' IKEA_FREKVENS='true' @@ -564,7 +596,6 @@ jobs: NAME='Frekvens' EOL - - run: | cat < firmware/include/config/secrets.h #pragma once #define GOOGLEWEATHER_KEY "redacted" @@ -580,20 +611,22 @@ jobs: #define WORLDWEATHERONLINE_KEY "redacted" EOL - - run: pio run --environment esp32dev - continue-on-error: true + pio run --environment esp32dev - - uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 + - name: File existence + uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 with: fail: true files: firmware/certs/bundle/ca_roots.pem, firmware/embed/x509_crt_bundle.bin - - run: | + - name: Set up ESP-IDF + run: | git clone --branch release/v5.5 --filter=blob:none --sparse https://github.com/espressif/esp-idf.git cd esp-idf git sparse-checkout add components/mbedtls/esp_crt_bundle - - run: | + - name: Certificate bundle + run: | python esp-idf/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py --input firmware/certs/bundle if cmp x509_crt_bundle firmware/embed/x509_crt_bundle.bin; then echo "Root CA bundles identical." diff --git a/.github/workflows/wiki.yml b/.github/workflows/wiki.yml index 410e27e0..c20b6c4e 100644 --- a/.github/workflows/wiki.yml +++ b/.github/workflows/wiki.yml @@ -15,8 +15,10 @@ jobs: wiki: runs-on: ubuntu-latest steps: - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - uses: Andrew-Chen-Wang/github-wiki-action@6448478bd55f1f3f752c93af8ac03207eccc3213 # v5.0.3 + - name: Wiki + uses: Andrew-Chen-Wang/github-wiki-action@6448478bd55f1f3f752c93af8ac03207eccc3213 # v5.0.3 with: path: docs/wiki From 143fde65cfc92341ec1aca0d89edc67e950b1508 Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Sun, 4 Jan 2026 10:12:36 +0100 Subject: [PATCH 03/20] ESPHome matrix + max-parallel limit --- .github/workflows/build.yml | 22 ------------ .github/workflows/esphome.yml | 67 +++++++++++++++++++++++++++++++++++ .github/workflows/tests.yml | 8 +++++ 3 files changed, 75 insertions(+), 22 deletions(-) create mode 100644 .github/workflows/esphome.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 38d74437..16cf1ff6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -256,25 +256,3 @@ jobs: EOL pio run --environment ${{ matrix.pioenv }} - - ikea-frekvens-led-spotlight: - name: ESPHome - IKEA Frekvens LED spotlight - runs-on: ubuntu-latest - - steps: - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - name: secrets.yaml - run: | - cat < extra/IKEA-Frekvens-LED-spotlight/secrets.yaml - api_key: "redacted" - ota_password: "redacted" - wifi_password: "redacted" - wifi_ssid: "redacted" - EOL - - - name: ESPHome - uses: esphome/build-action@f93bda46d83c761cd25bbfdf350cfe508a0a39d5 # v7.1.0 - with: - yaml-file: extra/IKEA-Frekvens-LED-spotlight/esphome.yaml diff --git a/.github/workflows/esphome.yml b/.github/workflows/esphome.yml new file mode 100644 index 00000000..ff021ba8 --- /dev/null +++ b/.github/workflows/esphome.yml @@ -0,0 +1,67 @@ +name: Build + +on: + merge_group: + types: + - checks_requested + + pull_request: + branches: + - main + + push: + branches: + - main + + workflow_dispatch: + +permissions: + contents: read + +jobs: + yaml: + name: ESPHome minimum version + runs-on: ubuntu-latest + outputs: + version: ${{ steps.yaml.outputs.version }} + steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Export ESPHome minimum version + id: yaml + run: | + echo "version=$(grep " min_version:" "extra/IKEA-Frekvens-LED-spotlight/esphome.yaml" \ + | cut -d '"' -f 2)" \ + >> "$GITHUB_OUTPUT" + + ikea-frekvens-led-spotlight: + name: ESPHome + needs: yaml + runs-on: ubuntu-latest + + strategy: + max-parallel: 1 + matrix: + version: + - ${{ needs.yaml.outputs.version }} + - latest + + steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up ESPHome secrets.yaml + run: | + cat < extra/IKEA-Frekvens-LED-spotlight/secrets.yaml + api_key: "redacted" + ota_password: "redacted" + wifi_password: "redacted" + wifi_ssid: "redacted" + EOL + + - name: IKEA Frekvens LED spotlight + uses: esphome/build-action@f93bda46d83c761cd25bbfdf350cfe508a0a39d5 # v7.1.0 + with: + yaml-file: extra/IKEA-Frekvens-LED-spotlight/esphome.yaml + version: ${{ matrix.version }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 718a552c..a582c432 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -24,6 +24,7 @@ jobs: runs-on: ubuntu-latest strategy: + max-parallel: 1 matrix: include: - python-version: 3.11 @@ -92,6 +93,7 @@ jobs: runs-on: ubuntu-latest strategy: + max-parallel: 1 matrix: include: - python-version: 3.11 @@ -195,6 +197,7 @@ jobs: runs-on: ubuntu-latest strategy: + max-parallel: 1 matrix: include: - python-version: 3.11 @@ -298,6 +301,7 @@ jobs: runs-on: ubuntu-latest strategy: + max-parallel: 1 matrix: include: - python-version: 3.11 @@ -401,6 +405,7 @@ jobs: runs-on: ubuntu-latest strategy: + max-parallel: 1 matrix: include: - python-version: 3.11 @@ -433,6 +438,7 @@ jobs: runs-on: ubuntu-latest strategy: + max-parallel: 1 matrix: include: - python-version: 3.11 @@ -469,6 +475,7 @@ jobs: runs-on: ubuntu-latest strategy: + max-parallel: 1 matrix: include: - python-version: 3.11 @@ -563,6 +570,7 @@ jobs: runs-on: ubuntu-latest strategy: + max-parallel: 1 matrix: include: - python-version: 3.11 From 0e36a775ab3474a98ef2ca8cf082ff9edf26e5bf Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Sun, 4 Jan 2026 10:29:20 +0100 Subject: [PATCH 04/20] Minor adjustments for clarity + revert PlatformIO dependabot --- .github/workflows/dependabot-pio.yml | 2 +- .github/workflows/esphome.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dependabot-pio.yml b/.github/workflows/dependabot-pio.yml index 564e7e9b..b00100b0 100644 --- a/.github/workflows/dependabot-pio.yml +++ b/.github/workflows/dependabot-pio.yml @@ -19,6 +19,6 @@ jobs: uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: PlatformIO dependabot - uses: peterus/platformio_dependabot@ee459e446a090c4894b1354a3b85bc064797fd2b # v1.2.0 + uses: JanPetterMG/platformio_dependabot@d52a00e84a5eac4e52b90ed3b26647496544fae8 # python313 with: github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/esphome.yml b/.github/workflows/esphome.yml index ff021ba8..4edaa55b 100644 --- a/.github/workflows/esphome.yml +++ b/.github/workflows/esphome.yml @@ -1,4 +1,4 @@ -name: Build +name: ESPHome on: merge_group: @@ -35,8 +35,8 @@ jobs: | cut -d '"' -f 2)" \ >> "$GITHUB_OUTPUT" - ikea-frekvens-led-spotlight: - name: ESPHome + frekvens-spotlight: + name: Frekvens spotlight needs: yaml runs-on: ubuntu-latest From 881647c0e904a677a9e77c88ae9571ea64b4422d Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Sun, 4 Jan 2026 18:35:45 +0100 Subject: [PATCH 05/20] Multiple jobs + minor adjustments --- .github/workflows/build.yml | 242 ++++++++++++++++++++++++++++++++-- .github/workflows/esphome.yml | 15 ++- 2 files changed, 236 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 16cf1ff6..9aadb745 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,6 +24,7 @@ jobs: runs-on: ubuntu-latest outputs: environments: ${{ steps.pio.outputs.environments }} + steps: - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 @@ -43,8 +44,156 @@ jobs: | jq -c '[.[] | .[0] | select(startswith("env:")) | sub("^env:"; "")]')" \ >> "$GITHUB_OUTPUT" - frekvens: - name: Frekvens + frekvens-extensive: + name: IKEA Frekvens LED multi-use light - extensive + needs: pio + runs-on: ubuntu-latest + + strategy: + max-parallel: 1 + matrix: + pioenv: ${{ fromJson(needs.pio.outputs.environments) }} + toolchain: + - node-version: 20 + python-version: 3.11 + + - node-version: 25 + python-version: 3.13 + + steps: + - name: Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ matrix.toolchain.node-version }} + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.toolchain.python-version }} + + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: IKEA Frekvens LED multi-use light + run: | + cat < .env + EXTENSION_ALEXA='true' + EXTENSION_BUTTON='true' + EXTENSION_HEAP='true' + EXTENSION_HOMEASSISTANT='true' + EXTENSION_INFRARED='true' + EXTENSION_MESSAGE='true' + EXTENSION_MICROPHONE='true' + EXTENSION_MQTT='true' + EXTENSION_PHOTOCELL='true' + EXTENSION_PLAYLIST='true' + EXTENSION_RESTFUL='true' + EXTENSION_RTC='true' + EXTENSION_SERVERSENTEVENTS='true' + EXTENSION_SIGNAL='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + FONT_BRAILLE='true' + HOSTNAME='frekvens' + IKEA_FREKVENS='true' + MODE_ANIMATION='true' + MODE_ARROW='true' + MODE_ARTNET='true' + MODE_BINARYCLOCK='true' + MODE_BINARYEPOCH='true' + MODE_BLINDS='true' + MODE_BLINK='true' + MODE_BOLDCLOCK='true' + MODE_BREAKOUTCLOCK='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_COUNTDOWN='true' + MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' + MODE_DRAW='true' + MODE_E131='true' + MODE_EQUALIZER='true' + MODE_FIREWORK='true' + MODE_FLIES='true' + MODE_GAMEOFLIFE='true' + MODE_GAMEOFLIFECLOCK='true' + MODE_GLITTER='true' + MODE_GOOGLEWEATHER='true' + MODE_HOMEASSISTANTWEATHER='true' + MODE_HOMETHERMOMETER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_LARGETICKINGCLOCK='true' + MODE_LEAFFALL='true' + MODE_LINES='true' + MODE_METABALLS='true' + MODE_NOISE='true' + MODE_OPENMETEO='true' + MODE_OPENWEATHER='true' + MODE_PINGPONG='true' + MODE_PINGPONGCLOCK='true' + MODE_PIXELSEQUENCE='true' + MODE_RAIN='true' + MODE_RING='true' + MODE_SCAN='true' + MODE_SMALLCLOCK='true' + MODE_SMALLTICKINGCLOCK='true' + MODE_SMOOTHWAVEFORM='true' + MODE_SNAKE='true' + MODE_SNAKECLOCK='true' + MODE_STARS='true' + MODE_TICKER='true' + MODE_WAVEFORM='true' + MODE_WORLDWEATHERONLINE='true' + MODE_WTTRIN='true' + MODE_YR='true' + NAME='Frekvens' + OTA_KEY='redacted' + TIME_ZONE='Etc/Universal' + EOL + + cat < firmware/include/config/secrets.h + #pragma once + #define FRAME_RATE 60 + #define GOOGLEWEATHER_KEY "redacted" + #define HOMEASSISTANT_ENTITY "weather.forecast_home" + #define HOMEASSISTANT_HOST "homeassistant.local" + #define HOMEASSISTANT_KEY "redacted" + #define HOMEASSISTANT_PORT 8123 + #define LATITUDE "0.000" + #define LOCATION "redacted" + #define LONGITUDE "0.000" + #define MQTT_HOST "mqtt.local" + #define MQTT_PORT 1883 + #define MQTT_USER "redacted" + #define MQTT_KEY "redacted" + #define OPENMETEO_KEY "redacted" + #define OPENWEATHER_KEY "redacted" + #define PIN_CS 1 + #define PIN_INT 2 + #define PIN_IR 3 + #define PIN_LDR 4 + #define PIN_MIC 5 + #define PIN_MOSI 6 + #define PIN_OE 7 + #define PIN_SCL 8 + #define PIN_SCLK 9 + #define PIN_SDA 10 + #define PIN_SW1 11 + #define PIN_SW2 12 + #define RTC_DS3232 + #define TEMPERATURE_CELSIUS true + #define WIFI_COUNTRY "01" + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + #define WORLDWEATHERONLINE_KEY "redacted" + EOL + + pio run --environment ${{ matrix.pioenv }} + + frekvens-minimal: + name: IKEA Frekvens LED multi-use light - minimal needs: pio runs-on: ubuntu-latest @@ -53,7 +202,7 @@ jobs: matrix: pioenv: ${{ fromJson(needs.pio.outputs.environments) }} toolchain: - - node-version: 22 + - node-version: 20 python-version: 3.11 - node-version: 25 @@ -76,7 +225,7 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt - - name: Basic - IKEA Frekvens LED multi-use light + - name: IKEA Frekvens LED multi-use light run: | cat < .env EXTENSION_BUTTON='true' @@ -110,7 +259,40 @@ jobs: pio run --environment ${{ matrix.pioenv }} - - name: Basic - IKEA Obegränsad LED wall lamp + obegransad-minimal: + name: IKEA Obegränsad LED wall lamp - minimal + needs: pio + runs-on: ubuntu-latest + + strategy: + max-parallel: 1 + matrix: + pioenv: ${{ fromJson(needs.pio.outputs.environments) }} + toolchain: + - node-version: 20 + python-version: 3.11 + + - node-version: 25 + python-version: 3.13 + + steps: + - name: Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ matrix.toolchain.node-version }} + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.toolchain.python-version }} + + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: IKEA Obegränsad LED wall lamp run: | cat < .env EXTENSION_BUTTON='true' @@ -142,7 +324,40 @@ jobs: pio run --environment ${{ matrix.pioenv }} - - name: Extensive - IKEA Frekvens LED multi-use light + obegransad-extensive: + name: IKEA Obegränsad LED wall lamp - extensive + needs: pio + runs-on: ubuntu-latest + + strategy: + max-parallel: 1 + matrix: + pioenv: ${{ fromJson(needs.pio.outputs.environments) }} + toolchain: + - node-version: 20 + python-version: 3.11 + + - node-version: 25 + python-version: 3.13 + + steps: + - name: Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ matrix.toolchain.node-version }} + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.toolchain.python-version }} + + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: IKEA Obegränsad LED wall lamp run: | cat < .env EXTENSION_ALEXA='true' @@ -162,8 +377,8 @@ jobs: EXTENSION_WEBAPP='true' EXTENSION_WEBSOCKET='true' FONT_BRAILLE='true' - HOSTNAME='frekvens' - IKEA_FREKVENS='true' + HOSTNAME='obegransad' + IKEA_OBEGRANSAD='true' MODE_ANIMATION='true' MODE_ARROW='true' MODE_ARTNET='true' @@ -213,8 +428,8 @@ jobs: MODE_WORLDWEATHERONLINE='true' MODE_WTTRIN='true' MODE_YR='true' - NAME='Frekvens' - OTA_KEY='secret' + NAME='Obegränsad' + OTA_KEY='redacted' TIME_ZONE='Etc/Universal' EOL @@ -245,10 +460,9 @@ jobs: #define PIN_SCL 8 #define PIN_SCLK 9 #define PIN_SDA 10 - #define PIN_SW1 11 - #define PIN_SW2 12 - #define RTC_DS3232 - #define TEMPERATURE_KELVIN true + #define PIN_SW2 11 + #define RTC_DS3231 + #define TEMPERATURE_FAHRENHEIT true #define WIFI_COUNTRY "01" #define WIFI_KEY "redacted" #define WIFI_SSID "redacted" diff --git a/.github/workflows/esphome.yml b/.github/workflows/esphome.yml index 4edaa55b..b3cdb9ee 100644 --- a/.github/workflows/esphome.yml +++ b/.github/workflows/esphome.yml @@ -20,10 +20,11 @@ permissions: jobs: yaml: - name: ESPHome minimum version + name: ESPHome YAML minimum version runs-on: ubuntu-latest outputs: - version: ${{ steps.yaml.outputs.version }} + min-version: ${{ steps.yaml.outputs.min-version }} + steps: - name: Set up Frekvens uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 @@ -31,20 +32,20 @@ jobs: - name: Export ESPHome minimum version id: yaml run: | - echo "version=$(grep " min_version:" "extra/IKEA-Frekvens-LED-spotlight/esphome.yaml" \ + echo "min-version=$(grep " min_version:" "extra/IKEA-Frekvens-LED-spotlight/esphome.yaml" \ | cut -d '"' -f 2)" \ >> "$GITHUB_OUTPUT" frekvens-spotlight: - name: Frekvens spotlight + name: IKEA Frekvens LED spotlight needs: yaml runs-on: ubuntu-latest strategy: max-parallel: 1 matrix: - version: - - ${{ needs.yaml.outputs.version }} + esphome-version: + - ${{ needs.yaml.outputs.min-version }} - latest steps: @@ -64,4 +65,4 @@ jobs: uses: esphome/build-action@f93bda46d83c761cd25bbfdf350cfe508a0a39d5 # v7.1.0 with: yaml-file: extra/IKEA-Frekvens-LED-spotlight/esphome.yaml - version: ${{ matrix.version }} + version: ${{ matrix.esphome-version }} From 9d7ad932c18dcbafacaabee26ad5cebeb142d4ca Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Sun, 4 Jan 2026 19:07:22 +0100 Subject: [PATCH 06/20] Merge minimal and basic + minor adjustments --- .github/workflows/build.yml | 156 +++++++++++----------------------- .github/workflows/esphome.yml | 14 +-- 2 files changed, 55 insertions(+), 115 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9aadb745..7bf6c17f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,7 @@ jobs: name: PlatformIO environments runs-on: ubuntu-latest outputs: - environments: ${{ steps.pio.outputs.environments }} + environments: ${{ steps.ini.outputs.environments }} steps: - name: Set up Python @@ -38,14 +38,14 @@ jobs: run: pip install -r .github/platformio/requirements.txt - name: Export PlatformIO environments - id: pio + id: ini run: | echo "environments=$(pio project config --json-output \ | jq -c '[.[] | .[0] | select(startswith("env:")) | sub("^env:"; "")]')" \ >> "$GITHUB_OUTPUT" - frekvens-extensive: - name: IKEA Frekvens LED multi-use light - extensive + ikea-frekvens-led-multi-use-light: + name: IKEA Frekvens LED multi-use light needs: pio runs-on: ubuntu-latest @@ -77,7 +77,44 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt - - name: IKEA Frekvens LED multi-use light + - name: Build minimal + run: | + cat < .env + EXTENSION_BUTTON='true' + EXTENSION_MICROPHONE='true' + EXTENSION_OTA='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + HOSTNAME='frekvens' + IKEA_FREKVENS='true' + MODE_ARROW='true' + MODE_BLINDS='true' + MODE_EQUALIZER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_RING='true' + MODE_SMOOTHWAVEFORM='true' + NAME='Frekvens' + EOL + + cat < firmware/include/config/secrets.h + #pragma once + #define PIN_CS 1 + #define PIN_MIC 2 + #define PIN_MOSI 3 + #define PIN_OE 4 + #define PIN_SCLK 5 + #define PIN_SW1 6 + #define PIN_SW2 7 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + EOL + + pio run --environment ${{ matrix.pioenv }} + + - name: PlatformIO clean + run: pio run --target clean + + - name: Build extensive run: | cat < .env EXTENSION_ALEXA='true' @@ -192,75 +229,8 @@ jobs: pio run --environment ${{ matrix.pioenv }} - frekvens-minimal: - name: IKEA Frekvens LED multi-use light - minimal - needs: pio - runs-on: ubuntu-latest - - strategy: - max-parallel: 1 - matrix: - pioenv: ${{ fromJson(needs.pio.outputs.environments) }} - toolchain: - - node-version: 20 - python-version: 3.11 - - - node-version: 25 - python-version: 3.13 - - steps: - - name: Set up Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: ${{ matrix.toolchain.node-version }} - - - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: ${{ matrix.toolchain.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - - name: IKEA Frekvens LED multi-use light - run: | - cat < .env - EXTENSION_BUTTON='true' - EXTENSION_MICROPHONE='true' - EXTENSION_OTA='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - HOSTNAME='frekvens' - IKEA_FREKVENS='true' - MODE_ARROW='true' - MODE_BLINDS='true' - MODE_EQUALIZER='true' - MODE_JAGGEDWAVEFORM='true' - MODE_RING='true' - MODE_SMOOTHWAVEFORM='true' - NAME='Frekvens' - EOL - - cat < firmware/include/config/secrets.h - #pragma once - #define PIN_CS 1 - #define PIN_MIC 2 - #define PIN_MOSI 3 - #define PIN_OE 4 - #define PIN_SCLK 5 - #define PIN_SW1 6 - #define PIN_SW2 7 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - EOL - - pio run --environment ${{ matrix.pioenv }} - - obegransad-minimal: - name: IKEA Obegränsad LED wall lamp - minimal + ikea-obegransad-led-wall-lamp: + name: IKEA Obegränsad LED wall lamp needs: pio runs-on: ubuntu-latest @@ -292,7 +262,7 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt - - name: IKEA Obegränsad LED wall lamp + - name: Build minimal run: | cat < .env EXTENSION_BUTTON='true' @@ -324,40 +294,10 @@ jobs: pio run --environment ${{ matrix.pioenv }} - obegransad-extensive: - name: IKEA Obegränsad LED wall lamp - extensive - needs: pio - runs-on: ubuntu-latest - - strategy: - max-parallel: 1 - matrix: - pioenv: ${{ fromJson(needs.pio.outputs.environments) }} - toolchain: - - node-version: 20 - python-version: 3.11 - - - node-version: 25 - python-version: 3.13 - - steps: - - name: Set up Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: ${{ matrix.toolchain.node-version }} - - - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: ${{ matrix.toolchain.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt + - name: PlatformIO clean + run: pio run --target clean - - name: IKEA Obegränsad LED wall lamp + - name: Build extensive run: | cat < .env EXTENSION_ALEXA='true' diff --git a/.github/workflows/esphome.yml b/.github/workflows/esphome.yml index b3cdb9ee..fc8d6bdd 100644 --- a/.github/workflows/esphome.yml +++ b/.github/workflows/esphome.yml @@ -19,11 +19,11 @@ permissions: contents: read jobs: - yaml: - name: ESPHome YAML minimum version + esphome: + name: ESPHome minimum version runs-on: ubuntu-latest outputs: - min-version: ${{ steps.yaml.outputs.min-version }} + min_version: ${{ steps.yaml.outputs.min_version }} steps: - name: Set up Frekvens @@ -32,20 +32,20 @@ jobs: - name: Export ESPHome minimum version id: yaml run: | - echo "min-version=$(grep " min_version:" "extra/IKEA-Frekvens-LED-spotlight/esphome.yaml" \ + echo "min_version=$(grep " min_version:" "extra/IKEA-Frekvens-LED-spotlight/esphome.yaml" \ | cut -d '"' -f 2)" \ >> "$GITHUB_OUTPUT" - frekvens-spotlight: + ikea-frekvens-led-spotlight: name: IKEA Frekvens LED spotlight - needs: yaml + needs: esphome runs-on: ubuntu-latest strategy: max-parallel: 1 matrix: esphome-version: - - ${{ needs.yaml.outputs.min-version }} + - ${{ needs.esphome.outputs.min_version }} - latest steps: From 23da0afd4d0c0bb3d3ad614f289008ec2bce9660 Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Sun, 4 Jan 2026 19:55:03 +0100 Subject: [PATCH 07/20] Refactored config files --- .github/workflows/build.yml | 716 +++++++++++++++++++++--------------- 1 file changed, 415 insertions(+), 301 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7bf6c17f..46230616 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,9 +50,211 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 1 + fail-fast: false matrix: - pioenv: ${{ fromJson(needs.pio.outputs.environments) }} + config: + - name: minimal + env: | + EXTENSION_BUTTON='true' + EXTENSION_OTA='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + HOSTNAME='frekvens' + IKEA_FREKVENS='true' + MODE_ARROW='true' + MODE_BLINDS='true' + MODE_EQUALIZER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_RING='true' + MODE_SMOOTHWAVEFORM='true' + NAME='Frekvens' + secrets: | + #pragma once + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW1 5 + #define PIN_SW2 6 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + + - name: typical + env: | + EXTENSION_BUTTON='true' + EXTENSION_MESSAGE='true' + EXTENSION_MICROPHONE='true' + EXTENSION_PLAYLIST='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + HOSTNAME='frekvens' + IKEA_FREKVENS='true' + MODE_ANIMATION='true' + MODE_ARROW='true' + MODE_BINARYCLOCK='true' + MODE_BINARYEPOCH='true' + MODE_BLINDS='true' + MODE_BLINK='true' + MODE_BOLDCLOCK='true' + MODE_BREAKOUTCLOCK='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_COUNTDOWN='true' + MODE_DRAW='true' + MODE_EQUALIZER='true' + MODE_FIREWORK='true' + MODE_FLIES='true' + MODE_GAMEOFLIFE='true' + MODE_GAMEOFLIFECLOCK='true' + MODE_GLITTER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_LARGETICKINGCLOCK='true' + MODE_LEAFFALL='true' + MODE_LINES='true' + MODE_METABALLS='true' + MODE_NOISE='true' + MODE_PINGPONG='true' + MODE_PINGPONGCLOCK='true' + MODE_PIXELSEQUENCE='true' + MODE_RAIN='true' + MODE_RING='true' + MODE_SCAN='true' + MODE_SMALLCLOCK='true' + MODE_SMALLTICKINGCLOCK='true' + MODE_SMOOTHWAVEFORM='true' + MODE_SNAKE='true' + MODE_SNAKECLOCK='true' + MODE_STARS='true' + MODE_TICKER='true' + MODE_WAVEFORM='true' + MODE_WTTRIN='true' + NAME='Frekvens' + TIME_ZONE='Etc/Universal' + secrets: | + #pragma once + #define LATITUDE "0.000" + #define LONGITUDE "0.000" + #define PIN_CS 1 + #define PIN_MIC 2 + #define PIN_MOSI 3 + #define PIN_OE 4 + #define PIN_SCLK 5 + #define PIN_SW1 6 + #define PIN_SW2 7 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + + - name: extensive + env: | + EXTENSION_ALEXA='true' + EXTENSION_BUTTON='true' + EXTENSION_HEAP='true' + EXTENSION_HOMEASSISTANT='true' + EXTENSION_INFRARED='true' + EXTENSION_MESSAGE='true' + EXTENSION_MICROPHONE='true' + EXTENSION_MQTT='true' + EXTENSION_OTA='true' + EXTENSION_PHOTOCELL='true' + EXTENSION_PLAYLIST='true' + EXTENSION_RESTFUL='true' + EXTENSION_RTC='true' + EXTENSION_SERVERSENTEVENTS='true' + EXTENSION_SIGNAL='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + FONT_BRAILLE='true' + HOSTNAME='frekvens' + IKEA_FREKVENS='true' + MODE_ANIMATION='true' + MODE_ARROW='true' + MODE_ARTNET='true' + MODE_BINARYCLOCK='true' + MODE_BINARYEPOCH='true' + MODE_BLINDS='true' + MODE_BLINK='true' + MODE_BOLDCLOCK='true' + MODE_BREAKOUTCLOCK='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_COUNTDOWN='true' + MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' + MODE_DRAW='true' + MODE_E131='true' + MODE_EQUALIZER='true' + MODE_FIREWORK='true' + MODE_FLIES='true' + MODE_GAMEOFLIFE='true' + MODE_GAMEOFLIFECLOCK='true' + MODE_GLITTER='true' + MODE_GOOGLEWEATHER='true' + MODE_HOMEASSISTANTWEATHER='true' + MODE_HOMETHERMOMETER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_LARGETICKINGCLOCK='true' + MODE_LEAFFALL='true' + MODE_LINES='true' + MODE_METABALLS='true' + MODE_NOISE='true' + MODE_OPENMETEO='true' + MODE_OPENWEATHER='true' + MODE_PINGPONG='true' + MODE_PINGPONGCLOCK='true' + MODE_PIXELSEQUENCE='true' + MODE_RAIN='true' + MODE_RING='true' + MODE_SCAN='true' + MODE_SMALLCLOCK='true' + MODE_SMALLTICKINGCLOCK='true' + MODE_SMOOTHWAVEFORM='true' + MODE_SNAKE='true' + MODE_SNAKECLOCK='true' + MODE_STARS='true' + MODE_TICKER='true' + MODE_WAVEFORM='true' + MODE_WORLDWEATHERONLINE='true' + MODE_WTTRIN='true' + MODE_YR='true' + NAME='Frekvens' + OTA_KEY='redacted' + TIME_ZONE='Etc/Universal' + secrets: | + #pragma once + #define FRAME_RATE 60 + #define GOOGLEWEATHER_KEY "redacted" + #define HOMEASSISTANT_ENTITY "weather.forecast_home" + #define HOMEASSISTANT_HOST "homeassistant.local" + #define HOMEASSISTANT_KEY "redacted" + #define HOMEASSISTANT_PORT 8123 + #define LATITUDE "0.000" + #define LOCATION "redacted" + #define LONGITUDE "0.000" + #define MQTT_HOST "mqtt.local" + #define MQTT_PORT 1883 + #define MQTT_USER "redacted" + #define MQTT_KEY "redacted" + #define OPENMETEO_KEY "redacted" + #define OPENWEATHER_KEY "redacted" + #define PIN_CS 1 + #define PIN_INT 2 + #define PIN_IR 3 + #define PIN_LDR 4 + #define PIN_MIC 5 + #define PIN_MOSI 6 + #define PIN_OE 7 + #define PIN_SCL 8 + #define PIN_SCLK 9 + #define PIN_SDA 10 + #define PIN_SW1 11 + #define PIN_SW2 12 + #define RTC_DS3232 + #define TEMPERATURE_CELSIUS true + #define WIFI_COUNTRY "01" + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + #define WORLDWEATHERONLINE_KEY "redacted" + + environment: ${{ fromJson(needs.pio.outputs.environments) }} toolchain: - node-version: 20 python-version: 3.11 @@ -60,6 +262,8 @@ jobs: - node-version: 25 python-version: 3.13 + max-parallel: 3 + steps: - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -77,157 +281,11 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt - - name: Build minimal - run: | - cat < .env - EXTENSION_BUTTON='true' - EXTENSION_MICROPHONE='true' - EXTENSION_OTA='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - HOSTNAME='frekvens' - IKEA_FREKVENS='true' - MODE_ARROW='true' - MODE_BLINDS='true' - MODE_EQUALIZER='true' - MODE_JAGGEDWAVEFORM='true' - MODE_RING='true' - MODE_SMOOTHWAVEFORM='true' - NAME='Frekvens' - EOL - - cat < firmware/include/config/secrets.h - #pragma once - #define PIN_CS 1 - #define PIN_MIC 2 - #define PIN_MOSI 3 - #define PIN_OE 4 - #define PIN_SCLK 5 - #define PIN_SW1 6 - #define PIN_SW2 7 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - EOL - - pio run --environment ${{ matrix.pioenv }} - - - name: PlatformIO clean - run: pio run --target clean - - - name: Build extensive + - name: Build Frekvens run: | - cat < .env - EXTENSION_ALEXA='true' - EXTENSION_BUTTON='true' - EXTENSION_HEAP='true' - EXTENSION_HOMEASSISTANT='true' - EXTENSION_INFRARED='true' - EXTENSION_MESSAGE='true' - EXTENSION_MICROPHONE='true' - EXTENSION_MQTT='true' - EXTENSION_PHOTOCELL='true' - EXTENSION_PLAYLIST='true' - EXTENSION_RESTFUL='true' - EXTENSION_RTC='true' - EXTENSION_SERVERSENTEVENTS='true' - EXTENSION_SIGNAL='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - FONT_BRAILLE='true' - HOSTNAME='frekvens' - IKEA_FREKVENS='true' - MODE_ANIMATION='true' - MODE_ARROW='true' - MODE_ARTNET='true' - MODE_BINARYCLOCK='true' - MODE_BINARYEPOCH='true' - MODE_BLINDS='true' - MODE_BLINK='true' - MODE_BOLDCLOCK='true' - MODE_BREAKOUTCLOCK='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_COUNTDOWN='true' - MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' - MODE_DRAW='true' - MODE_E131='true' - MODE_EQUALIZER='true' - MODE_FIREWORK='true' - MODE_FLIES='true' - MODE_GAMEOFLIFE='true' - MODE_GAMEOFLIFECLOCK='true' - MODE_GLITTER='true' - MODE_GOOGLEWEATHER='true' - MODE_HOMEASSISTANTWEATHER='true' - MODE_HOMETHERMOMETER='true' - MODE_JAGGEDWAVEFORM='true' - MODE_LARGETICKINGCLOCK='true' - MODE_LEAFFALL='true' - MODE_LINES='true' - MODE_METABALLS='true' - MODE_NOISE='true' - MODE_OPENMETEO='true' - MODE_OPENWEATHER='true' - MODE_PINGPONG='true' - MODE_PINGPONGCLOCK='true' - MODE_PIXELSEQUENCE='true' - MODE_RAIN='true' - MODE_RING='true' - MODE_SCAN='true' - MODE_SMALLCLOCK='true' - MODE_SMALLTICKINGCLOCK='true' - MODE_SMOOTHWAVEFORM='true' - MODE_SNAKE='true' - MODE_SNAKECLOCK='true' - MODE_STARS='true' - MODE_TICKER='true' - MODE_WAVEFORM='true' - MODE_WORLDWEATHERONLINE='true' - MODE_WTTRIN='true' - MODE_YR='true' - NAME='Frekvens' - OTA_KEY='redacted' - TIME_ZONE='Etc/Universal' - EOL - - cat < firmware/include/config/secrets.h - #pragma once - #define FRAME_RATE 60 - #define GOOGLEWEATHER_KEY "redacted" - #define HOMEASSISTANT_ENTITY "weather.forecast_home" - #define HOMEASSISTANT_HOST "homeassistant.local" - #define HOMEASSISTANT_KEY "redacted" - #define HOMEASSISTANT_PORT 8123 - #define LATITUDE "0.000" - #define LOCATION "redacted" - #define LONGITUDE "0.000" - #define MQTT_HOST "mqtt.local" - #define MQTT_PORT 1883 - #define MQTT_USER "redacted" - #define MQTT_KEY "redacted" - #define OPENMETEO_KEY "redacted" - #define OPENWEATHER_KEY "redacted" - #define PIN_CS 1 - #define PIN_INT 2 - #define PIN_IR 3 - #define PIN_LDR 4 - #define PIN_MIC 5 - #define PIN_MOSI 6 - #define PIN_OE 7 - #define PIN_SCL 8 - #define PIN_SCLK 9 - #define PIN_SDA 10 - #define PIN_SW1 11 - #define PIN_SW2 12 - #define RTC_DS3232 - #define TEMPERATURE_CELSIUS true - #define WIFI_COUNTRY "01" - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - #define WORLDWEATHERONLINE_KEY "redacted" - EOL - - pio run --environment ${{ matrix.pioenv }} + printf "%s\n" "${{ matrix.config.env }}" > .env + printf "%s\n" "${{ matrix.config.secrets }}" > firmware/include/config/secrets.h + pio run --environment ${{ matrix.environment }} ikea-obegransad-led-wall-lamp: name: IKEA Obegränsad LED wall lamp @@ -235,9 +293,206 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 1 matrix: - pioenv: ${{ fromJson(needs.pio.outputs.environments) }} + config: + - name: minimal + env: | + EXTENSION_BUTTON='true' + EXTENSION_OTA='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + HOSTNAME='obegransad' + IKEA_OBEGRANSAD='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_LINES='true' + MODE_NOISE='true' + MODE_RAIN='true' + MODE_SCAN='true' + MODE_STARS='true' + NAME='Obegränsad' + secrets: | + #pragma once + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW2 5 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + + - name: typical + env: | + EXTENSION_BUTTON='true' + EXTENSION_MESSAGE='true' + EXTENSION_PLAYLIST='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + HOSTNAME='obegransad' + IKEA_OBEGRANSAD='true' + MODE_ANIMATION='true' + MODE_ARROW='true' + MODE_BINARYCLOCK='true' + MODE_BINARYEPOCH='true' + MODE_BLINDS='true' + MODE_BLINK='true' + MODE_BOLDCLOCK='true' + MODE_BREAKOUTCLOCK='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_COUNTDOWN='true' + MODE_DRAW='true' + MODE_EQUALIZER='true' + MODE_FIREWORK='true' + MODE_FLIES='true' + MODE_GAMEOFLIFE='true' + MODE_GAMEOFLIFECLOCK='true' + MODE_GLITTER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_LARGETICKINGCLOCK='true' + MODE_LEAFFALL='true' + MODE_LINES='true' + MODE_METABALLS='true' + MODE_NOISE='true' + MODE_PINGPONG='true' + MODE_PINGPONGCLOCK='true' + MODE_PIXELSEQUENCE='true' + MODE_RAIN='true' + MODE_RING='true' + MODE_SCAN='true' + MODE_SMALLCLOCK='true' + MODE_SMALLTICKINGCLOCK='true' + MODE_SMOOTHWAVEFORM='true' + MODE_SNAKE='true' + MODE_SNAKECLOCK='true' + MODE_STARS='true' + MODE_TICKER='true' + MODE_WAVEFORM='true' + MODE_WTTRIN='true' + NAME='Obegränsad' + TIME_ZONE='Etc/Universal' + secrets: | + #pragma once + #define LATITUDE "0.000" + #define LONGITUDE "0.000" + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW2 5 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + + - name: extensive + env: | + EXTENSION_ALEXA='true' + EXTENSION_BUTTON='true' + EXTENSION_HEAP='true' + EXTENSION_HOMEASSISTANT='true' + EXTENSION_INFRARED='true' + EXTENSION_MESSAGE='true' + EXTENSION_MICROPHONE='true' + EXTENSION_MQTT='true' + EXTENSION_OTA='true' + EXTENSION_PHOTOCELL='true' + EXTENSION_PLAYLIST='true' + EXTENSION_RESTFUL='true' + EXTENSION_RTC='true' + EXTENSION_SERVERSENTEVENTS='true' + EXTENSION_SIGNAL='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + FONT_BRAILLE='true' + HOSTNAME='obegransad' + IKEA_OBEGRANSAD='true' + MODE_ANIMATION='true' + MODE_ARROW='true' + MODE_ARTNET='true' + MODE_BINARYCLOCK='true' + MODE_BINARYEPOCH='true' + MODE_BLINDS='true' + MODE_BLINK='true' + MODE_BOLDCLOCK='true' + MODE_BREAKOUTCLOCK='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_COUNTDOWN='true' + MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' + MODE_DRAW='true' + MODE_E131='true' + MODE_EQUALIZER='true' + MODE_FIREWORK='true' + MODE_FLIES='true' + MODE_GAMEOFLIFE='true' + MODE_GAMEOFLIFECLOCK='true' + MODE_GLITTER='true' + MODE_GOOGLEWEATHER='true' + MODE_HOMEASSISTANTWEATHER='true' + MODE_HOMETHERMOMETER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_LARGETICKINGCLOCK='true' + MODE_LEAFFALL='true' + MODE_LINES='true' + MODE_METABALLS='true' + MODE_NOISE='true' + MODE_OPENMETEO='true' + MODE_OPENWEATHER='true' + MODE_PINGPONG='true' + MODE_PINGPONGCLOCK='true' + MODE_PIXELSEQUENCE='true' + MODE_RAIN='true' + MODE_RING='true' + MODE_SCAN='true' + MODE_SMALLCLOCK='true' + MODE_SMALLTICKINGCLOCK='true' + MODE_SMOOTHWAVEFORM='true' + MODE_SNAKE='true' + MODE_SNAKECLOCK='true' + MODE_STARS='true' + MODE_TICKER='true' + MODE_WAVEFORM='true' + MODE_WORLDWEATHERONLINE='true' + MODE_WTTRIN='true' + MODE_YR='true' + NAME='Obegränsad' + OTA_KEY='redacted' + TIME_ZONE='Etc/Universal' + secrets: | + #pragma once + #define FRAME_RATE 60 + #define GOOGLEWEATHER_KEY "redacted" + #define HOMEASSISTANT_ENTITY "weather.forecast_home" + #define HOMEASSISTANT_HOST "homeassistant.local" + #define HOMEASSISTANT_KEY "redacted" + #define HOMEASSISTANT_PORT 8123 + #define LATITUDE "0.000" + #define LOCATION "redacted" + #define LONGITUDE "0.000" + #define MQTT_HOST "mqtt.local" + #define MQTT_PORT 1883 + #define MQTT_USER "redacted" + #define MQTT_KEY "redacted" + #define OPENMETEO_KEY "redacted" + #define OPENWEATHER_KEY "redacted" + #define PIN_CS 1 + #define PIN_INT 2 + #define PIN_IR 3 + #define PIN_LDR 4 + #define PIN_MIC 5 + #define PIN_MOSI 6 + #define PIN_OE 7 + #define PIN_SCL 8 + #define PIN_SCLK 9 + #define PIN_SDA 10 + #define PIN_SW2 11 + #define RTC_DS3231 + #define TEMPERATURE_FAHRENHEIT true + #define WIFI_COUNTRY "01" + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + #define WORLDWEATHERONLINE_KEY "redacted" + + environment: ${{ fromJson(needs.pio.outputs.environments) }} toolchain: - node-version: 20 python-version: 3.11 @@ -245,6 +500,8 @@ jobs: - node-version: 25 python-version: 3.13 + max-parallel: 3 + steps: - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -262,151 +519,8 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt - - name: Build minimal - run: | - cat < .env - EXTENSION_BUTTON='true' - EXTENSION_OTA='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - HOSTNAME='obegransad' - IKEA_OBEGRANSAD='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_LINES='true' - MODE_NOISE='true' - MODE_RAIN='true' - MODE_SCAN='true' - MODE_STARS='true' - NAME='Obegränsad' - EOL - - cat < firmware/include/config/secrets.h - #pragma once - #define PIN_CS 1 - #define PIN_MOSI 2 - #define PIN_OE 3 - #define PIN_SCLK 4 - #define PIN_SW2 5 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - EOL - - pio run --environment ${{ matrix.pioenv }} - - - name: PlatformIO clean - run: pio run --target clean - - - name: Build extensive + - name: Build Frekvens run: | - cat < .env - EXTENSION_ALEXA='true' - EXTENSION_BUTTON='true' - EXTENSION_HEAP='true' - EXTENSION_HOMEASSISTANT='true' - EXTENSION_INFRARED='true' - EXTENSION_MESSAGE='true' - EXTENSION_MICROPHONE='true' - EXTENSION_MQTT='true' - EXTENSION_PHOTOCELL='true' - EXTENSION_PLAYLIST='true' - EXTENSION_RESTFUL='true' - EXTENSION_RTC='true' - EXTENSION_SERVERSENTEVENTS='true' - EXTENSION_SIGNAL='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - FONT_BRAILLE='true' - HOSTNAME='obegransad' - IKEA_OBEGRANSAD='true' - MODE_ANIMATION='true' - MODE_ARROW='true' - MODE_ARTNET='true' - MODE_BINARYCLOCK='true' - MODE_BINARYEPOCH='true' - MODE_BLINDS='true' - MODE_BLINK='true' - MODE_BOLDCLOCK='true' - MODE_BREAKOUTCLOCK='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_COUNTDOWN='true' - MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' - MODE_DRAW='true' - MODE_E131='true' - MODE_EQUALIZER='true' - MODE_FIREWORK='true' - MODE_FLIES='true' - MODE_GAMEOFLIFE='true' - MODE_GAMEOFLIFECLOCK='true' - MODE_GLITTER='true' - MODE_GOOGLEWEATHER='true' - MODE_HOMEASSISTANTWEATHER='true' - MODE_HOMETHERMOMETER='true' - MODE_JAGGEDWAVEFORM='true' - MODE_LARGETICKINGCLOCK='true' - MODE_LEAFFALL='true' - MODE_LINES='true' - MODE_METABALLS='true' - MODE_NOISE='true' - MODE_OPENMETEO='true' - MODE_OPENWEATHER='true' - MODE_PINGPONG='true' - MODE_PINGPONGCLOCK='true' - MODE_PIXELSEQUENCE='true' - MODE_RAIN='true' - MODE_RING='true' - MODE_SCAN='true' - MODE_SMALLCLOCK='true' - MODE_SMALLTICKINGCLOCK='true' - MODE_SMOOTHWAVEFORM='true' - MODE_SNAKE='true' - MODE_SNAKECLOCK='true' - MODE_STARS='true' - MODE_TICKER='true' - MODE_WAVEFORM='true' - MODE_WORLDWEATHERONLINE='true' - MODE_WTTRIN='true' - MODE_YR='true' - NAME='Obegränsad' - OTA_KEY='redacted' - TIME_ZONE='Etc/Universal' - EOL - - cat < firmware/include/config/secrets.h - #pragma once - #define FRAME_RATE 60 - #define GOOGLEWEATHER_KEY "redacted" - #define HOMEASSISTANT_ENTITY "weather.forecast_home" - #define HOMEASSISTANT_HOST "homeassistant.local" - #define HOMEASSISTANT_KEY "redacted" - #define HOMEASSISTANT_PORT 8123 - #define LATITUDE "0.000" - #define LOCATION "redacted" - #define LONGITUDE "0.000" - #define MQTT_HOST "mqtt.local" - #define MQTT_PORT 1883 - #define MQTT_USER "redacted" - #define MQTT_KEY "redacted" - #define OPENMETEO_KEY "redacted" - #define OPENWEATHER_KEY "redacted" - #define PIN_CS 1 - #define PIN_INT 2 - #define PIN_IR 3 - #define PIN_LDR 4 - #define PIN_MIC 5 - #define PIN_MOSI 6 - #define PIN_OE 7 - #define PIN_SCL 8 - #define PIN_SCLK 9 - #define PIN_SDA 10 - #define PIN_SW2 11 - #define RTC_DS3231 - #define TEMPERATURE_FAHRENHEIT true - #define WIFI_COUNTRY "01" - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - #define WORLDWEATHERONLINE_KEY "redacted" - EOL - - pio run --environment ${{ matrix.pioenv }} + printf "%s\n" "${{ matrix.config.env }}" > .env + printf "%s\n" "${{ matrix.config.secrets }}" > firmware/include/config/secrets.h + pio run --environment ${{ matrix.environment }} From 80196ad1ea732fb5528ae2b448e0d5417e4b92ba Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Sun, 4 Jan 2026 20:15:36 +0100 Subject: [PATCH 08/20] Reworked config configuration --- .github/workflows/build.yml | 827 +++++++++++++++++++----------------- 1 file changed, 433 insertions(+), 394 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 46230616..34fac600 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -53,206 +53,9 @@ jobs: fail-fast: false matrix: config: + - name: extensive - name: minimal - env: | - EXTENSION_BUTTON='true' - EXTENSION_OTA='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - HOSTNAME='frekvens' - IKEA_FREKVENS='true' - MODE_ARROW='true' - MODE_BLINDS='true' - MODE_EQUALIZER='true' - MODE_JAGGEDWAVEFORM='true' - MODE_RING='true' - MODE_SMOOTHWAVEFORM='true' - NAME='Frekvens' - secrets: | - #pragma once - #define PIN_CS 1 - #define PIN_MOSI 2 - #define PIN_OE 3 - #define PIN_SCLK 4 - #define PIN_SW1 5 - #define PIN_SW2 6 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - - name: typical - env: | - EXTENSION_BUTTON='true' - EXTENSION_MESSAGE='true' - EXTENSION_MICROPHONE='true' - EXTENSION_PLAYLIST='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - HOSTNAME='frekvens' - IKEA_FREKVENS='true' - MODE_ANIMATION='true' - MODE_ARROW='true' - MODE_BINARYCLOCK='true' - MODE_BINARYEPOCH='true' - MODE_BLINDS='true' - MODE_BLINK='true' - MODE_BOLDCLOCK='true' - MODE_BREAKOUTCLOCK='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_COUNTDOWN='true' - MODE_DRAW='true' - MODE_EQUALIZER='true' - MODE_FIREWORK='true' - MODE_FLIES='true' - MODE_GAMEOFLIFE='true' - MODE_GAMEOFLIFECLOCK='true' - MODE_GLITTER='true' - MODE_JAGGEDWAVEFORM='true' - MODE_LARGETICKINGCLOCK='true' - MODE_LEAFFALL='true' - MODE_LINES='true' - MODE_METABALLS='true' - MODE_NOISE='true' - MODE_PINGPONG='true' - MODE_PINGPONGCLOCK='true' - MODE_PIXELSEQUENCE='true' - MODE_RAIN='true' - MODE_RING='true' - MODE_SCAN='true' - MODE_SMALLCLOCK='true' - MODE_SMALLTICKINGCLOCK='true' - MODE_SMOOTHWAVEFORM='true' - MODE_SNAKE='true' - MODE_SNAKECLOCK='true' - MODE_STARS='true' - MODE_TICKER='true' - MODE_WAVEFORM='true' - MODE_WTTRIN='true' - NAME='Frekvens' - TIME_ZONE='Etc/Universal' - secrets: | - #pragma once - #define LATITUDE "0.000" - #define LONGITUDE "0.000" - #define PIN_CS 1 - #define PIN_MIC 2 - #define PIN_MOSI 3 - #define PIN_OE 4 - #define PIN_SCLK 5 - #define PIN_SW1 6 - #define PIN_SW2 7 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - - - name: extensive - env: | - EXTENSION_ALEXA='true' - EXTENSION_BUTTON='true' - EXTENSION_HEAP='true' - EXTENSION_HOMEASSISTANT='true' - EXTENSION_INFRARED='true' - EXTENSION_MESSAGE='true' - EXTENSION_MICROPHONE='true' - EXTENSION_MQTT='true' - EXTENSION_OTA='true' - EXTENSION_PHOTOCELL='true' - EXTENSION_PLAYLIST='true' - EXTENSION_RESTFUL='true' - EXTENSION_RTC='true' - EXTENSION_SERVERSENTEVENTS='true' - EXTENSION_SIGNAL='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - FONT_BRAILLE='true' - HOSTNAME='frekvens' - IKEA_FREKVENS='true' - MODE_ANIMATION='true' - MODE_ARROW='true' - MODE_ARTNET='true' - MODE_BINARYCLOCK='true' - MODE_BINARYEPOCH='true' - MODE_BLINDS='true' - MODE_BLINK='true' - MODE_BOLDCLOCK='true' - MODE_BREAKOUTCLOCK='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_COUNTDOWN='true' - MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' - MODE_DRAW='true' - MODE_E131='true' - MODE_EQUALIZER='true' - MODE_FIREWORK='true' - MODE_FLIES='true' - MODE_GAMEOFLIFE='true' - MODE_GAMEOFLIFECLOCK='true' - MODE_GLITTER='true' - MODE_GOOGLEWEATHER='true' - MODE_HOMEASSISTANTWEATHER='true' - MODE_HOMETHERMOMETER='true' - MODE_JAGGEDWAVEFORM='true' - MODE_LARGETICKINGCLOCK='true' - MODE_LEAFFALL='true' - MODE_LINES='true' - MODE_METABALLS='true' - MODE_NOISE='true' - MODE_OPENMETEO='true' - MODE_OPENWEATHER='true' - MODE_PINGPONG='true' - MODE_PINGPONGCLOCK='true' - MODE_PIXELSEQUENCE='true' - MODE_RAIN='true' - MODE_RING='true' - MODE_SCAN='true' - MODE_SMALLCLOCK='true' - MODE_SMALLTICKINGCLOCK='true' - MODE_SMOOTHWAVEFORM='true' - MODE_SNAKE='true' - MODE_SNAKECLOCK='true' - MODE_STARS='true' - MODE_TICKER='true' - MODE_WAVEFORM='true' - MODE_WORLDWEATHERONLINE='true' - MODE_WTTRIN='true' - MODE_YR='true' - NAME='Frekvens' - OTA_KEY='redacted' - TIME_ZONE='Etc/Universal' - secrets: | - #pragma once - #define FRAME_RATE 60 - #define GOOGLEWEATHER_KEY "redacted" - #define HOMEASSISTANT_ENTITY "weather.forecast_home" - #define HOMEASSISTANT_HOST "homeassistant.local" - #define HOMEASSISTANT_KEY "redacted" - #define HOMEASSISTANT_PORT 8123 - #define LATITUDE "0.000" - #define LOCATION "redacted" - #define LONGITUDE "0.000" - #define MQTT_HOST "mqtt.local" - #define MQTT_PORT 1883 - #define MQTT_USER "redacted" - #define MQTT_KEY "redacted" - #define OPENMETEO_KEY "redacted" - #define OPENWEATHER_KEY "redacted" - #define PIN_CS 1 - #define PIN_INT 2 - #define PIN_IR 3 - #define PIN_LDR 4 - #define PIN_MIC 5 - #define PIN_MOSI 6 - #define PIN_OE 7 - #define PIN_SCL 8 - #define PIN_SCLK 9 - #define PIN_SDA 10 - #define PIN_SW1 11 - #define PIN_SW2 12 - #define RTC_DS3232 - #define TEMPERATURE_CELSIUS true - #define WIFI_COUNTRY "01" - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - #define WORLDWEATHERONLINE_KEY "redacted" environment: ${{ fromJson(needs.pio.outputs.environments) }} toolchain: @@ -262,7 +65,7 @@ jobs: - node-version: 25 python-version: 3.13 - max-parallel: 3 + max-parallel: 1 steps: - name: Set up Node.js @@ -281,6 +84,222 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Minimal + if: matrix.config == 'minimal' + run: | + cat <<'EOL' > .env + EXTENSION_BUTTON='true' + EXTENSION_OTA='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + HOSTNAME='frekvens' + IKEA_FREKVENS='true' + MODE_ARROW='true' + MODE_BLINDS='true' + MODE_EQUALIZER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_RING='true' + MODE_SMOOTHWAVEFORM='true' + NAME='Frekvens' + EOL + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW1 5 + #define PIN_SW2 6 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + EOL + + - name: Typical + if: matrix.config == 'typical' + run: | + cat <<'EOL' > .env + EXTENSION_BUTTON='true' + EXTENSION_MESSAGE='true' + EXTENSION_MICROPHONE='true' + EXTENSION_PLAYLIST='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + HOSTNAME='frekvens' + IKEA_FREKVENS='true' + MODE_ANIMATION='true' + MODE_ARROW='true' + MODE_BINARYCLOCK='true' + MODE_BINARYEPOCH='true' + MODE_BLINDS='true' + MODE_BLINK='true' + MODE_BOLDCLOCK='true' + MODE_BREAKOUTCLOCK='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_COUNTDOWN='true' + MODE_DRAW='true' + MODE_EQUALIZER='true' + MODE_FIREWORK='true' + MODE_FLIES='true' + MODE_GAMEOFLIFE='true' + MODE_GAMEOFLIFECLOCK='true' + MODE_GLITTER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_LARGETICKINGCLOCK='true' + MODE_LEAFFALL='true' + MODE_LINES='true' + MODE_METABALLS='true' + MODE_NOISE='true' + MODE_PINGPONG='true' + MODE_PINGPONGCLOCK='true' + MODE_PIXELSEQUENCE='true' + MODE_RAIN='true' + MODE_RING='true' + MODE_SCAN='true' + MODE_SMALLCLOCK='true' + MODE_SMALLTICKINGCLOCK='true' + MODE_SMOOTHWAVEFORM='true' + MODE_SNAKE='true' + MODE_SNAKECLOCK='true' + MODE_STARS='true' + MODE_TICKER='true' + MODE_WAVEFORM='true' + MODE_WTTRIN='true' + NAME='Frekvens' + TIME_ZONE='Etc/Universal' + EOL + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define LATITUDE "0.000" + #define LONGITUDE "0.000" + #define PIN_CS 1 + #define PIN_MIC 2 + #define PIN_MOSI 3 + #define PIN_OE 4 + #define PIN_SCLK 5 + #define PIN_SW1 6 + #define PIN_SW2 7 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + EOL + + - name: Extensive + if: matrix.config == 'extensive' + run: | + cat <<'EOL' > .env + EXTENSION_ALEXA='true' + EXTENSION_BUTTON='true' + EXTENSION_HEAP='true' + EXTENSION_HOMEASSISTANT='true' + EXTENSION_INFRARED='true' + EXTENSION_MESSAGE='true' + EXTENSION_MICROPHONE='true' + EXTENSION_MQTT='true' + EXTENSION_OTA='true' + EXTENSION_PHOTOCELL='true' + EXTENSION_PLAYLIST='true' + EXTENSION_RESTFUL='true' + EXTENSION_RTC='true' + EXTENSION_SERVERSENTEVENTS='true' + EXTENSION_SIGNAL='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + FONT_BRAILLE='true' + HOSTNAME='frekvens' + IKEA_FREKVENS='true' + MODE_ANIMATION='true' + MODE_ARROW='true' + MODE_ARTNET='true' + MODE_BINARYCLOCK='true' + MODE_BINARYEPOCH='true' + MODE_BLINDS='true' + MODE_BLINK='true' + MODE_BOLDCLOCK='true' + MODE_BREAKOUTCLOCK='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_COUNTDOWN='true' + MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' + MODE_DRAW='true' + MODE_E131='true' + MODE_EQUALIZER='true' + MODE_FIREWORK='true' + MODE_FLIES='true' + MODE_GAMEOFLIFE='true' + MODE_GAMEOFLIFECLOCK='true' + MODE_GLITTER='true' + MODE_GOOGLEWEATHER='true' + MODE_HOMEASSISTANTWEATHER='true' + MODE_HOMETHERMOMETER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_LARGETICKINGCLOCK='true' + MODE_LEAFFALL='true' + MODE_LINES='true' + MODE_METABALLS='true' + MODE_NOISE='true' + MODE_OPENMETEO='true' + MODE_OPENWEATHER='true' + MODE_PINGPONG='true' + MODE_PINGPONGCLOCK='true' + MODE_PIXELSEQUENCE='true' + MODE_RAIN='true' + MODE_RING='true' + MODE_SCAN='true' + MODE_SMALLCLOCK='true' + MODE_SMALLTICKINGCLOCK='true' + MODE_SMOOTHWAVEFORM='true' + MODE_SNAKE='true' + MODE_SNAKECLOCK='true' + MODE_STARS='true' + MODE_TICKER='true' + MODE_WAVEFORM='true' + MODE_WORLDWEATHERONLINE='true' + MODE_WTTRIN='true' + MODE_YR='true' + NAME='Frekvens' + OTA_KEY='redacted' + TIME_ZONE='Etc/Universal' + EOL + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define FRAME_RATE 60 + #define GOOGLEWEATHER_KEY "redacted" + #define HOMEASSISTANT_ENTITY "weather.forecast_home" + #define HOMEASSISTANT_HOST "homeassistant.local" + #define HOMEASSISTANT_KEY "redacted" + #define HOMEASSISTANT_PORT 8123 + #define LATITUDE "0.000" + #define LOCATION "redacted" + #define LONGITUDE "0.000" + #define MQTT_HOST "mqtt.local" + #define MQTT_PORT 1883 + #define MQTT_USER "redacted" + #define MQTT_KEY "redacted" + #define OPENMETEO_KEY "redacted" + #define OPENWEATHER_KEY "redacted" + #define PIN_CS 1 + #define PIN_INT 2 + #define PIN_IR 3 + #define PIN_LDR 4 + #define PIN_MIC 5 + #define PIN_MOSI 6 + #define PIN_OE 7 + #define PIN_SCL 8 + #define PIN_SCLK 9 + #define PIN_SDA 10 + #define PIN_SW1 11 + #define PIN_SW2 12 + #define RTC_DS3232 + #define TEMPERATURE_CELSIUS true + #define WIFI_COUNTRY "01" + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + #define WORLDWEATHERONLINE_KEY "redacted" + EOL + - name: Build Frekvens run: | printf "%s\n" "${{ matrix.config.env }}" > .env @@ -293,204 +312,12 @@ jobs: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: config: + - name: extensive - name: minimal - env: | - EXTENSION_BUTTON='true' - EXTENSION_OTA='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - HOSTNAME='obegransad' - IKEA_OBEGRANSAD='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_LINES='true' - MODE_NOISE='true' - MODE_RAIN='true' - MODE_SCAN='true' - MODE_STARS='true' - NAME='Obegränsad' - secrets: | - #pragma once - #define PIN_CS 1 - #define PIN_MOSI 2 - #define PIN_OE 3 - #define PIN_SCLK 4 - #define PIN_SW2 5 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - - name: typical - env: | - EXTENSION_BUTTON='true' - EXTENSION_MESSAGE='true' - EXTENSION_PLAYLIST='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - HOSTNAME='obegransad' - IKEA_OBEGRANSAD='true' - MODE_ANIMATION='true' - MODE_ARROW='true' - MODE_BINARYCLOCK='true' - MODE_BINARYEPOCH='true' - MODE_BLINDS='true' - MODE_BLINK='true' - MODE_BOLDCLOCK='true' - MODE_BREAKOUTCLOCK='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_COUNTDOWN='true' - MODE_DRAW='true' - MODE_EQUALIZER='true' - MODE_FIREWORK='true' - MODE_FLIES='true' - MODE_GAMEOFLIFE='true' - MODE_GAMEOFLIFECLOCK='true' - MODE_GLITTER='true' - MODE_JAGGEDWAVEFORM='true' - MODE_LARGETICKINGCLOCK='true' - MODE_LEAFFALL='true' - MODE_LINES='true' - MODE_METABALLS='true' - MODE_NOISE='true' - MODE_PINGPONG='true' - MODE_PINGPONGCLOCK='true' - MODE_PIXELSEQUENCE='true' - MODE_RAIN='true' - MODE_RING='true' - MODE_SCAN='true' - MODE_SMALLCLOCK='true' - MODE_SMALLTICKINGCLOCK='true' - MODE_SMOOTHWAVEFORM='true' - MODE_SNAKE='true' - MODE_SNAKECLOCK='true' - MODE_STARS='true' - MODE_TICKER='true' - MODE_WAVEFORM='true' - MODE_WTTRIN='true' - NAME='Obegränsad' - TIME_ZONE='Etc/Universal' - secrets: | - #pragma once - #define LATITUDE "0.000" - #define LONGITUDE "0.000" - #define PIN_CS 1 - #define PIN_MOSI 2 - #define PIN_OE 3 - #define PIN_SCLK 4 - #define PIN_SW2 5 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - - - name: extensive - env: | - EXTENSION_ALEXA='true' - EXTENSION_BUTTON='true' - EXTENSION_HEAP='true' - EXTENSION_HOMEASSISTANT='true' - EXTENSION_INFRARED='true' - EXTENSION_MESSAGE='true' - EXTENSION_MICROPHONE='true' - EXTENSION_MQTT='true' - EXTENSION_OTA='true' - EXTENSION_PHOTOCELL='true' - EXTENSION_PLAYLIST='true' - EXTENSION_RESTFUL='true' - EXTENSION_RTC='true' - EXTENSION_SERVERSENTEVENTS='true' - EXTENSION_SIGNAL='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - FONT_BRAILLE='true' - HOSTNAME='obegransad' - IKEA_OBEGRANSAD='true' - MODE_ANIMATION='true' - MODE_ARROW='true' - MODE_ARTNET='true' - MODE_BINARYCLOCK='true' - MODE_BINARYEPOCH='true' - MODE_BLINDS='true' - MODE_BLINK='true' - MODE_BOLDCLOCK='true' - MODE_BREAKOUTCLOCK='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_COUNTDOWN='true' - MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' - MODE_DRAW='true' - MODE_E131='true' - MODE_EQUALIZER='true' - MODE_FIREWORK='true' - MODE_FLIES='true' - MODE_GAMEOFLIFE='true' - MODE_GAMEOFLIFECLOCK='true' - MODE_GLITTER='true' - MODE_GOOGLEWEATHER='true' - MODE_HOMEASSISTANTWEATHER='true' - MODE_HOMETHERMOMETER='true' - MODE_JAGGEDWAVEFORM='true' - MODE_LARGETICKINGCLOCK='true' - MODE_LEAFFALL='true' - MODE_LINES='true' - MODE_METABALLS='true' - MODE_NOISE='true' - MODE_OPENMETEO='true' - MODE_OPENWEATHER='true' - MODE_PINGPONG='true' - MODE_PINGPONGCLOCK='true' - MODE_PIXELSEQUENCE='true' - MODE_RAIN='true' - MODE_RING='true' - MODE_SCAN='true' - MODE_SMALLCLOCK='true' - MODE_SMALLTICKINGCLOCK='true' - MODE_SMOOTHWAVEFORM='true' - MODE_SNAKE='true' - MODE_SNAKECLOCK='true' - MODE_STARS='true' - MODE_TICKER='true' - MODE_WAVEFORM='true' - MODE_WORLDWEATHERONLINE='true' - MODE_WTTRIN='true' - MODE_YR='true' - NAME='Obegränsad' - OTA_KEY='redacted' - TIME_ZONE='Etc/Universal' - secrets: | - #pragma once - #define FRAME_RATE 60 - #define GOOGLEWEATHER_KEY "redacted" - #define HOMEASSISTANT_ENTITY "weather.forecast_home" - #define HOMEASSISTANT_HOST "homeassistant.local" - #define HOMEASSISTANT_KEY "redacted" - #define HOMEASSISTANT_PORT 8123 - #define LATITUDE "0.000" - #define LOCATION "redacted" - #define LONGITUDE "0.000" - #define MQTT_HOST "mqtt.local" - #define MQTT_PORT 1883 - #define MQTT_USER "redacted" - #define MQTT_KEY "redacted" - #define OPENMETEO_KEY "redacted" - #define OPENWEATHER_KEY "redacted" - #define PIN_CS 1 - #define PIN_INT 2 - #define PIN_IR 3 - #define PIN_LDR 4 - #define PIN_MIC 5 - #define PIN_MOSI 6 - #define PIN_OE 7 - #define PIN_SCL 8 - #define PIN_SCLK 9 - #define PIN_SDA 10 - #define PIN_SW2 11 - #define RTC_DS3231 - #define TEMPERATURE_FAHRENHEIT true - #define WIFI_COUNTRY "01" - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - #define WORLDWEATHERONLINE_KEY "redacted" environment: ${{ fromJson(needs.pio.outputs.environments) }} toolchain: @@ -500,7 +327,7 @@ jobs: - node-version: 25 python-version: 3.13 - max-parallel: 3 + max-parallel: 1 steps: - name: Set up Node.js @@ -519,6 +346,218 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Minimal + if: matrix.config == 'minimal' + run: | + cat <<'EOL' > .env + EXTENSION_BUTTON='true' + EXTENSION_OTA='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + HOSTNAME='obegransad' + IKEA_OBEGRANSAD='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_LINES='true' + MODE_NOISE='true' + MODE_RAIN='true' + MODE_SCAN='true' + MODE_STARS='true' + NAME='Obegränsad' + EOL + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW2 5 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + EOL + + - name: Typical + if: matrix.config == 'typical' + run: | + cat <<'EOL' > .env + EXTENSION_BUTTON='true' + EXTENSION_MESSAGE='true' + EXTENSION_PLAYLIST='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + HOSTNAME='obegransad' + IKEA_OBEGRANSAD='true' + MODE_ANIMATION='true' + MODE_ARROW='true' + MODE_BINARYCLOCK='true' + MODE_BINARYEPOCH='true' + MODE_BLINDS='true' + MODE_BLINK='true' + MODE_BOLDCLOCK='true' + MODE_BREAKOUTCLOCK='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_COUNTDOWN='true' + MODE_DRAW='true' + MODE_EQUALIZER='true' + MODE_FIREWORK='true' + MODE_FLIES='true' + MODE_GAMEOFLIFE='true' + MODE_GAMEOFLIFECLOCK='true' + MODE_GLITTER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_LARGETICKINGCLOCK='true' + MODE_LEAFFALL='true' + MODE_LINES='true' + MODE_METABALLS='true' + MODE_NOISE='true' + MODE_PINGPONG='true' + MODE_PINGPONGCLOCK='true' + MODE_PIXELSEQUENCE='true' + MODE_RAIN='true' + MODE_RING='true' + MODE_SCAN='true' + MODE_SMALLCLOCK='true' + MODE_SMALLTICKINGCLOCK='true' + MODE_SMOOTHWAVEFORM='true' + MODE_SNAKE='true' + MODE_SNAKECLOCK='true' + MODE_STARS='true' + MODE_TICKER='true' + MODE_WAVEFORM='true' + MODE_WTTRIN='true' + NAME='Obegränsad' + TIME_ZONE='Etc/Universal' + EOL + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define LATITUDE "0.000" + #define LONGITUDE "0.000" + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW2 5 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + EOL + + - name: Extensive + if: matrix.config == 'extensive' + run: | + cat <<'EOL' > .env + EXTENSION_ALEXA='true' + EXTENSION_BUTTON='true' + EXTENSION_HEAP='true' + EXTENSION_HOMEASSISTANT='true' + EXTENSION_INFRARED='true' + EXTENSION_MESSAGE='true' + EXTENSION_MICROPHONE='true' + EXTENSION_MQTT='true' + EXTENSION_OTA='true' + EXTENSION_PHOTOCELL='true' + EXTENSION_PLAYLIST='true' + EXTENSION_RESTFUL='true' + EXTENSION_RTC='true' + EXTENSION_SERVERSENTEVENTS='true' + EXTENSION_SIGNAL='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + FONT_BRAILLE='true' + HOSTNAME='obegransad' + IKEA_OBEGRANSAD='true' + MODE_ANIMATION='true' + MODE_ARROW='true' + MODE_ARTNET='true' + MODE_BINARYCLOCK='true' + MODE_BINARYEPOCH='true' + MODE_BLINDS='true' + MODE_BLINK='true' + MODE_BOLDCLOCK='true' + MODE_BREAKOUTCLOCK='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_COUNTDOWN='true' + MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' + MODE_DRAW='true' + MODE_E131='true' + MODE_EQUALIZER='true' + MODE_FIREWORK='true' + MODE_FLIES='true' + MODE_GAMEOFLIFE='true' + MODE_GAMEOFLIFECLOCK='true' + MODE_GLITTER='true' + MODE_GOOGLEWEATHER='true' + MODE_HOMEASSISTANTWEATHER='true' + MODE_HOMETHERMOMETER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_LARGETICKINGCLOCK='true' + MODE_LEAFFALL='true' + MODE_LINES='true' + MODE_METABALLS='true' + MODE_NOISE='true' + MODE_OPENMETEO='true' + MODE_OPENWEATHER='true' + MODE_PINGPONG='true' + MODE_PINGPONGCLOCK='true' + MODE_PIXELSEQUENCE='true' + MODE_RAIN='true' + MODE_RING='true' + MODE_SCAN='true' + MODE_SMALLCLOCK='true' + MODE_SMALLTICKINGCLOCK='true' + MODE_SMOOTHWAVEFORM='true' + MODE_SNAKE='true' + MODE_SNAKECLOCK='true' + MODE_STARS='true' + MODE_TICKER='true' + MODE_WAVEFORM='true' + MODE_WORLDWEATHERONLINE='true' + MODE_WTTRIN='true' + MODE_YR='true' + NAME='Obegränsad' + OTA_KEY='redacted' + TIME_ZONE='Etc/Universal' + EOL + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define FRAME_RATE 60 + #define GOOGLEWEATHER_KEY "redacted" + #define HOMEASSISTANT_ENTITY "weather.forecast_home" + #define HOMEASSISTANT_HOST "homeassistant.local" + #define HOMEASSISTANT_KEY "redacted" + #define HOMEASSISTANT_PORT 8123 + #define LATITUDE "0.000" + #define LOCATION "redacted" + #define LONGITUDE "0.000" + #define MQTT_HOST "mqtt.local" + #define MQTT_PORT 1883 + #define MQTT_USER "redacted" + #define MQTT_KEY "redacted" + #define OPENMETEO_KEY "redacted" + #define OPENWEATHER_KEY "redacted" + #define PIN_CS 1 + #define PIN_INT 2 + #define PIN_IR 3 + #define PIN_LDR 4 + #define PIN_MIC 5 + #define PIN_MOSI 6 + #define PIN_OE 7 + #define PIN_SCL 8 + #define PIN_SCLK 9 + #define PIN_SDA 10 + #define PIN_SW2 11 + #define RTC_DS3231 + #define TEMPERATURE_FAHRENHEIT true + #define WIFI_COUNTRY "01" + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + #define WORLDWEATHERONLINE_KEY "redacted" + EOL + - name: Build Frekvens run: | printf "%s\n" "${{ matrix.config.env }}" > .env From c04e4f6d407e696686b456a6aeeacd6c31fc472b Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Sun, 4 Jan 2026 20:21:16 +0100 Subject: [PATCH 09/20] Fix conditional steps --- .github/workflows/build.yml | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 34fac600..2a7e0668 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -53,9 +53,9 @@ jobs: fail-fast: false matrix: config: - - name: extensive - - name: minimal - - name: typical + - type: extensive + - type: minimal + - type: typical environment: ${{ fromJson(needs.pio.outputs.environments) }} toolchain: @@ -85,7 +85,7 @@ jobs: run: pip install -r .github/platformio/requirements.txt - name: Minimal - if: matrix.config == 'minimal' + if: matrix.config.type == 'minimal' run: | cat <<'EOL' > .env EXTENSION_BUTTON='true' @@ -116,7 +116,7 @@ jobs: EOL - name: Typical - if: matrix.config == 'typical' + if: matrix.config.type == 'typical' run: | cat <<'EOL' > .env EXTENSION_BUTTON='true' @@ -186,7 +186,7 @@ jobs: EOL - name: Extensive - if: matrix.config == 'extensive' + if: matrix.config.type == 'extensive' run: | cat <<'EOL' > .env EXTENSION_ALEXA='true' @@ -301,10 +301,7 @@ jobs: EOL - name: Build Frekvens - run: | - printf "%s\n" "${{ matrix.config.env }}" > .env - printf "%s\n" "${{ matrix.config.secrets }}" > firmware/include/config/secrets.h - pio run --environment ${{ matrix.environment }} + run: pio run --environment ${{ matrix.environment }} ikea-obegransad-led-wall-lamp: name: IKEA Obegränsad LED wall lamp @@ -315,9 +312,9 @@ jobs: fail-fast: false matrix: config: - - name: extensive - - name: minimal - - name: typical + - type: extensive + - type: minimal + - type: typical environment: ${{ fromJson(needs.pio.outputs.environments) }} toolchain: @@ -347,7 +344,7 @@ jobs: run: pip install -r .github/platformio/requirements.txt - name: Minimal - if: matrix.config == 'minimal' + if: matrix.config.type == 'minimal' run: | cat <<'EOL' > .env EXTENSION_BUTTON='true' @@ -378,7 +375,7 @@ jobs: EOL - name: Typical - if: matrix.config == 'typical' + if: matrix.config.type == 'typical' run: | cat <<'EOL' > .env EXTENSION_BUTTON='true' @@ -445,7 +442,7 @@ jobs: EOL - name: Extensive - if: matrix.config == 'extensive' + if: matrix.config.type == 'extensive' run: | cat <<'EOL' > .env EXTENSION_ALEXA='true' @@ -559,7 +556,4 @@ jobs: EOL - name: Build Frekvens - run: | - printf "%s\n" "${{ matrix.config.env }}" > .env - printf "%s\n" "${{ matrix.config.secrets }}" > firmware/include/config/secrets.h - pio run --environment ${{ matrix.environment }} + run: pio run --environment ${{ matrix.environment }} From 2f0d195e551dc55ab1f99e8282036da408db54de Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Mon, 5 Jan 2026 00:52:43 +0100 Subject: [PATCH 10/20] Introduced default environment + remove max-parallel limit --- .github/workflows/build.yml | 93 ++++++++++++++++++++++++++++------- .github/workflows/esphome.yml | 1 - .github/workflows/tests.yml | 8 --- 3 files changed, 75 insertions(+), 27 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2a7e0668..eee03418 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -53,9 +53,10 @@ jobs: fail-fast: false matrix: config: - - type: extensive - - type: minimal - - type: typical + - template: default + - template: extensive + - template: minimal + - template: typical environment: ${{ fromJson(needs.pio.outputs.environments) }} toolchain: @@ -65,8 +66,6 @@ jobs: - node-version: 25 python-version: 3.13 - max-parallel: 1 - steps: - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -84,12 +83,28 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Default + if: matrix.config.template == 'default' + run: | + echo "IKEA_FREKVENS='true'" >> .env + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW1 5 + #define PIN_SW2 6 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + EOL + - name: Minimal - if: matrix.config.type == 'minimal' + if: matrix.config.template == 'minimal' run: | cat <<'EOL' > .env EXTENSION_BUTTON='true' - EXTENSION_OTA='true' EXTENSION_WEBAPP='true' EXTENSION_WEBSOCKET='true' HOSTNAME='frekvens' @@ -116,19 +131,27 @@ jobs: EOL - name: Typical - if: matrix.config.type == 'typical' + if: matrix.config.template == 'typical' run: | cat <<'EOL' > .env + EXTENSION_ALEXA='true' EXTENSION_BUTTON='true' + EXTENSION_HEAP='true' EXTENSION_MESSAGE='true' EXTENSION_MICROPHONE='true' + EXTENSION_OTA='true' EXTENSION_PLAYLIST='true' + EXTENSION_RESTFUL='true' + EXTENSION_SERVERSENTEVENTS='true' + EXTENSION_SIGNAL='true' EXTENSION_WEBAPP='true' EXTENSION_WEBSOCKET='true' + FONT_BRAILLE='true' HOSTNAME='frekvens' IKEA_FREKVENS='true' MODE_ANIMATION='true' MODE_ARROW='true' + MODE_ARTNET='true' MODE_BINARYCLOCK='true' MODE_BINARYEPOCH='true' MODE_BLINDS='true' @@ -138,19 +161,23 @@ jobs: MODE_BRIGHT='true' MODE_CIRCLE='true' MODE_COUNTDOWN='true' + MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' MODE_DRAW='true' + MODE_E131='true' MODE_EQUALIZER='true' MODE_FIREWORK='true' MODE_FLIES='true' MODE_GAMEOFLIFE='true' MODE_GAMEOFLIFECLOCK='true' MODE_GLITTER='true' + MODE_HOMETHERMOMETER='true' MODE_JAGGEDWAVEFORM='true' MODE_LARGETICKINGCLOCK='true' MODE_LEAFFALL='true' MODE_LINES='true' MODE_METABALLS='true' MODE_NOISE='true' + MODE_OPENMETEO='true' MODE_PINGPONG='true' MODE_PINGPONGCLOCK='true' MODE_PIXELSEQUENCE='true' @@ -166,6 +193,7 @@ jobs: MODE_TICKER='true' MODE_WAVEFORM='true' MODE_WTTRIN='true' + MODE_YR='true' NAME='Frekvens' TIME_ZONE='Etc/Universal' EOL @@ -173,6 +201,7 @@ jobs: cat <<'EOL' > firmware/include/config/secrets.h #pragma once #define LATITUDE "0.000" + #define LOCATION "redacted" #define LONGITUDE "0.000" #define PIN_CS 1 #define PIN_MIC 2 @@ -186,7 +215,7 @@ jobs: EOL - name: Extensive - if: matrix.config.type == 'extensive' + if: matrix.config.template == 'extensive' run: | cat <<'EOL' > .env EXTENSION_ALEXA='true' @@ -312,9 +341,10 @@ jobs: fail-fast: false matrix: config: - - type: extensive - - type: minimal - - type: typical + - template: default + - template: extensive + - template: minimal + - template: typical environment: ${{ fromJson(needs.pio.outputs.environments) }} toolchain: @@ -324,8 +354,6 @@ jobs: - node-version: 25 python-version: 3.13 - max-parallel: 1 - steps: - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -343,12 +371,27 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Default + if: matrix.config.template == 'default' + run: | + echo "IKEA_OBEGRANSAD='true'" >> .env + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW2 5 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + EOL + - name: Minimal - if: matrix.config.type == 'minimal' + if: matrix.config.template == 'minimal' run: | cat <<'EOL' > .env EXTENSION_BUTTON='true' - EXTENSION_OTA='true' EXTENSION_WEBAPP='true' EXTENSION_WEBSOCKET='true' HOSTNAME='obegransad' @@ -375,18 +418,26 @@ jobs: EOL - name: Typical - if: matrix.config.type == 'typical' + if: matrix.config.template == 'typical' run: | cat <<'EOL' > .env + EXTENSION_ALEXA='true' EXTENSION_BUTTON='true' + EXTENSION_HEAP='true' EXTENSION_MESSAGE='true' + EXTENSION_OTA='true' EXTENSION_PLAYLIST='true' + EXTENSION_RESTFUL='true' + EXTENSION_SERVERSENTEVENTS='true' + EXTENSION_SIGNAL='true' EXTENSION_WEBAPP='true' EXTENSION_WEBSOCKET='true' + FONT_BRAILLE='true' HOSTNAME='obegransad' IKEA_OBEGRANSAD='true' MODE_ANIMATION='true' MODE_ARROW='true' + MODE_ARTNET='true' MODE_BINARYCLOCK='true' MODE_BINARYEPOCH='true' MODE_BLINDS='true' @@ -396,19 +447,23 @@ jobs: MODE_BRIGHT='true' MODE_CIRCLE='true' MODE_COUNTDOWN='true' + MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' MODE_DRAW='true' + MODE_E131='true' MODE_EQUALIZER='true' MODE_FIREWORK='true' MODE_FLIES='true' MODE_GAMEOFLIFE='true' MODE_GAMEOFLIFECLOCK='true' MODE_GLITTER='true' + MODE_HOMETHERMOMETER='true' MODE_JAGGEDWAVEFORM='true' MODE_LARGETICKINGCLOCK='true' MODE_LEAFFALL='true' MODE_LINES='true' MODE_METABALLS='true' MODE_NOISE='true' + MODE_OPENMETEO='true' MODE_PINGPONG='true' MODE_PINGPONGCLOCK='true' MODE_PIXELSEQUENCE='true' @@ -424,6 +479,7 @@ jobs: MODE_TICKER='true' MODE_WAVEFORM='true' MODE_WTTRIN='true' + MODE_YR='true' NAME='Obegränsad' TIME_ZONE='Etc/Universal' EOL @@ -431,6 +487,7 @@ jobs: cat <<'EOL' > firmware/include/config/secrets.h #pragma once #define LATITUDE "0.000" + #define LOCATION "redacted" #define LONGITUDE "0.000" #define PIN_CS 1 #define PIN_MOSI 2 @@ -442,7 +499,7 @@ jobs: EOL - name: Extensive - if: matrix.config.type == 'extensive' + if: matrix.config.template == 'extensive' run: | cat <<'EOL' > .env EXTENSION_ALEXA='true' diff --git a/.github/workflows/esphome.yml b/.github/workflows/esphome.yml index fc8d6bdd..09114afc 100644 --- a/.github/workflows/esphome.yml +++ b/.github/workflows/esphome.yml @@ -42,7 +42,6 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 1 matrix: esphome-version: - ${{ needs.esphome.outputs.min_version }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a582c432..718a552c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -24,7 +24,6 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 1 matrix: include: - python-version: 3.11 @@ -93,7 +92,6 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 1 matrix: include: - python-version: 3.11 @@ -197,7 +195,6 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 1 matrix: include: - python-version: 3.11 @@ -301,7 +298,6 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 1 matrix: include: - python-version: 3.11 @@ -405,7 +401,6 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 1 matrix: include: - python-version: 3.11 @@ -438,7 +433,6 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 1 matrix: include: - python-version: 3.11 @@ -475,7 +469,6 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 1 matrix: include: - python-version: 3.11 @@ -570,7 +563,6 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 1 matrix: include: - python-version: 3.11 From 3f7a3c52361d0c746e17256338c63fa57bef35cf Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Mon, 5 Jan 2026 01:47:19 +0100 Subject: [PATCH 11/20] Minor fixes + exclude list for 4 MB boards --- .github/workflows/build.yml | 114 +++++++++++++++++++++++++++++------- .github/workflows/tests.yml | 8 --- 2 files changed, 94 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eee03418..87d781e9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -52,13 +52,13 @@ jobs: strategy: fail-fast: false matrix: - config: - - template: default - - template: extensive - - template: minimal - - template: typical - environment: ${{ fromJson(needs.pio.outputs.environments) }} + template: + - minimal + - default + - typical + - extensive + toolchain: - node-version: 20 python-version: 3.11 @@ -66,6 +66,43 @@ jobs: - node-version: 25 python-version: 3.13 + exclude: + - environment: adafruit_qtpy_esp32s2 + template: extensive + + - environment: adafruit_qtpy_esp32s3_n4r2 + template: extensive + + - environment: esp32dev + template: extensive + + - environment: esp32-c3-devkitm-1 + template: extensive + + - environment: esp32-c5-devkitc-1 + template: extensive + + - environment: esp32-c6-devkitm-1 + template: extensive + + - environment: seeed_xiao_esp32c3 + template: extensive + + - environment: seeed_xiao_esp32c6 + template: extensive + + - environment: wemos_d1_mini32 + template: extensive + + - environment: lolin_d32 + template: extensive + + - environment: lolin_d32_pro + template: extensive + + - environment: lolin_s3_mini + template: extensive + steps: - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -84,7 +121,7 @@ jobs: run: pip install -r .github/platformio/requirements.txt - name: Default - if: matrix.config.template == 'default' + if: matrix.template == 'default' run: | echo "IKEA_FREKVENS='true'" >> .env @@ -101,7 +138,7 @@ jobs: EOL - name: Minimal - if: matrix.config.template == 'minimal' + if: matrix.template == 'minimal' run: | cat <<'EOL' > .env EXTENSION_BUTTON='true' @@ -131,7 +168,7 @@ jobs: EOL - name: Typical - if: matrix.config.template == 'typical' + if: matrix.template == 'typical' run: | cat <<'EOL' > .env EXTENSION_ALEXA='true' @@ -215,7 +252,7 @@ jobs: EOL - name: Extensive - if: matrix.config.template == 'extensive' + if: matrix.template == 'extensive' run: | cat <<'EOL' > .env EXTENSION_ALEXA='true' @@ -340,13 +377,13 @@ jobs: strategy: fail-fast: false matrix: - config: - - template: default - - template: extensive - - template: minimal - - template: typical - environment: ${{ fromJson(needs.pio.outputs.environments) }} + template: + - minimal + - default + - typical + - extensive + toolchain: - node-version: 20 python-version: 3.11 @@ -354,6 +391,43 @@ jobs: - node-version: 25 python-version: 3.13 + exclude: + - environment: adafruit_qtpy_esp32s2 + template: extensive + + - environment: adafruit_qtpy_esp32s3_n4r2 + template: extensive + + - environment: esp32dev + template: extensive + + - environment: esp32-c3-devkitm-1 + template: extensive + + - environment: esp32-c5-devkitc-1 + template: extensive + + - environment: esp32-c6-devkitm-1 + template: extensive + + - environment: seeed_xiao_esp32c3 + template: extensive + + - environment: seeed_xiao_esp32c6 + template: extensive + + - environment: wemos_d1_mini32 + template: extensive + + - environment: lolin_d32 + template: extensive + + - environment: lolin_d32_pro + template: extensive + + - environment: lolin_s3_mini + template: extensive + steps: - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -372,7 +446,7 @@ jobs: run: pip install -r .github/platformio/requirements.txt - name: Default - if: matrix.config.template == 'default' + if: matrix.template == 'default' run: | echo "IKEA_OBEGRANSAD='true'" >> .env @@ -388,7 +462,7 @@ jobs: EOL - name: Minimal - if: matrix.config.template == 'minimal' + if: matrix.template == 'minimal' run: | cat <<'EOL' > .env EXTENSION_BUTTON='true' @@ -418,7 +492,7 @@ jobs: EOL - name: Typical - if: matrix.config.template == 'typical' + if: matrix.template == 'typical' run: | cat <<'EOL' > .env EXTENSION_ALEXA='true' @@ -499,7 +573,7 @@ jobs: EOL - name: Extensive - if: matrix.config.template == 'extensive' + if: matrix.template == 'extensive' run: | cat <<'EOL' > .env EXTENSION_ALEXA='true' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 718a552c..74952edd 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -27,7 +27,6 @@ jobs: matrix: include: - python-version: 3.11 - - python-version: 3.14 steps: @@ -95,7 +94,6 @@ jobs: matrix: include: - python-version: 3.11 - - python-version: 3.14 steps: @@ -198,7 +196,6 @@ jobs: matrix: include: - python-version: 3.11 - - python-version: 3.14 steps: @@ -301,7 +298,6 @@ jobs: matrix: include: - python-version: 3.11 - - python-version: 3.14 steps: @@ -404,7 +400,6 @@ jobs: matrix: include: - python-version: 3.11 - - python-version: 3.14 steps: @@ -436,7 +431,6 @@ jobs: matrix: include: - python-version: 3.11 - - python-version: 3.14 steps: @@ -472,7 +466,6 @@ jobs: matrix: include: - python-version: 3.11 - - python-version: 3.14 steps: @@ -566,7 +559,6 @@ jobs: matrix: include: - python-version: 3.11 - - python-version: 3.13 steps: From b7c1f26bc1fea14559e37f95e7121b32f74e2a9e Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Mon, 5 Jan 2026 02:26:16 +0100 Subject: [PATCH 12/20] Minor adjustments for readability and clarity --- .github/workflows/build.yml | 64 +++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 87d781e9..1155f254 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,14 +50,13 @@ jobs: runs-on: ubuntu-latest strategy: - fail-fast: false matrix: environment: ${{ fromJson(needs.pio.outputs.environments) }} template: - - minimal + - extensive - default + - minimal - typical - - extensive toolchain: - node-version: 20 @@ -73,9 +72,6 @@ jobs: - environment: adafruit_qtpy_esp32s3_n4r2 template: extensive - - environment: esp32dev - template: extensive - - environment: esp32-c3-devkitm-1 template: extensive @@ -85,22 +81,25 @@ jobs: - environment: esp32-c6-devkitm-1 template: extensive - - environment: seeed_xiao_esp32c3 + - environment: esp32dev template: extensive - - environment: seeed_xiao_esp32c6 + - environment: lolin_d32 template: extensive - - environment: wemos_d1_mini32 + - environment: lolin_d32_pro template: extensive - - environment: lolin_d32 + - environment: lolin_s3_mini template: extensive - - environment: lolin_d32_pro + - environment: seeed_xiao_esp32c3 template: extensive - - environment: lolin_s3_mini + - environment: seeed_xiao_esp32c6 + template: extensive + + - environment: wemos_d1_mini32 template: extensive steps: @@ -120,7 +119,7 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt - - name: Default + - name: Default configuration template if: matrix.template == 'default' run: | echo "IKEA_FREKVENS='true'" >> .env @@ -137,7 +136,7 @@ jobs: #define WIFI_SSID "redacted" EOL - - name: Minimal + - name: Minimal configuration template if: matrix.template == 'minimal' run: | cat <<'EOL' > .env @@ -167,7 +166,7 @@ jobs: #define WIFI_SSID "redacted" EOL - - name: Typical + - name: Typical configuration template if: matrix.template == 'typical' run: | cat <<'EOL' > .env @@ -232,7 +231,6 @@ jobs: MODE_WTTRIN='true' MODE_YR='true' NAME='Frekvens' - TIME_ZONE='Etc/Universal' EOL cat <<'EOL' > firmware/include/config/secrets.h @@ -251,7 +249,7 @@ jobs: #define WIFI_SSID "redacted" EOL - - name: Extensive + - name: Extensive configuration template if: matrix.template == 'extensive' run: | cat <<'EOL' > .env @@ -375,14 +373,13 @@ jobs: runs-on: ubuntu-latest strategy: - fail-fast: false matrix: environment: ${{ fromJson(needs.pio.outputs.environments) }} template: - - minimal + - extensive - default + - minimal - typical - - extensive toolchain: - node-version: 20 @@ -398,9 +395,6 @@ jobs: - environment: adafruit_qtpy_esp32s3_n4r2 template: extensive - - environment: esp32dev - template: extensive - - environment: esp32-c3-devkitm-1 template: extensive @@ -410,22 +404,25 @@ jobs: - environment: esp32-c6-devkitm-1 template: extensive - - environment: seeed_xiao_esp32c3 + - environment: esp32dev template: extensive - - environment: seeed_xiao_esp32c6 + - environment: lolin_d32 template: extensive - - environment: wemos_d1_mini32 + - environment: lolin_d32_pro template: extensive - - environment: lolin_d32 + - environment: lolin_s3_mini template: extensive - - environment: lolin_d32_pro + - environment: seeed_xiao_esp32c3 template: extensive - - environment: lolin_s3_mini + - environment: seeed_xiao_esp32c6 + template: extensive + + - environment: wemos_d1_mini32 template: extensive steps: @@ -445,7 +442,7 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt - - name: Default + - name: Default configuration template if: matrix.template == 'default' run: | echo "IKEA_OBEGRANSAD='true'" >> .env @@ -461,7 +458,7 @@ jobs: #define WIFI_SSID "redacted" EOL - - name: Minimal + - name: Minimal configuration template if: matrix.template == 'minimal' run: | cat <<'EOL' > .env @@ -491,7 +488,7 @@ jobs: #define WIFI_SSID "redacted" EOL - - name: Typical + - name: Typical configuration template if: matrix.template == 'typical' run: | cat <<'EOL' > .env @@ -555,7 +552,6 @@ jobs: MODE_WTTRIN='true' MODE_YR='true' NAME='Obegränsad' - TIME_ZONE='Etc/Universal' EOL cat <<'EOL' > firmware/include/config/secrets.h @@ -572,7 +568,7 @@ jobs: #define WIFI_SSID "redacted" EOL - - name: Extensive + - name: Extensive configuration template if: matrix.template == 'extensive' run: | cat <<'EOL' > .env From 76f910234f7de22054ec701396854832b7fa23c5 Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Mon, 5 Jan 2026 03:50:08 +0100 Subject: [PATCH 13/20] Workflow split up --- ... => ikea-frekvens-led-multi-use-light.yml} | 424 ++++------------- ...me.yml => ikea-frekvens-led-spotlight.yml} | 6 +- .../ikea-obegransad-led-wall-lamp.yml | 428 ++++++++++++++++++ 3 files changed, 517 insertions(+), 341 deletions(-) rename .github/workflows/{build.yml => ikea-frekvens-led-multi-use-light.yml} (51%) rename .github/workflows/{esphome.yml => ikea-frekvens-led-spotlight.yml} (94%) create mode 100644 .github/workflows/ikea-obegransad-led-wall-lamp.yml diff --git a/.github/workflows/build.yml b/.github/workflows/ikea-frekvens-led-multi-use-light.yml similarity index 51% rename from .github/workflows/build.yml rename to .github/workflows/ikea-frekvens-led-multi-use-light.yml index 1155f254..371205a2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/ikea-frekvens-led-multi-use-light.yml @@ -1,4 +1,4 @@ -name: Build +name: IKEA Frekvens LED multi-use light on: merge_group: @@ -44,20 +44,14 @@ jobs: | jq -c '[.[] | .[0] | select(startswith("env:")) | sub("^env:"; "")]')" \ >> "$GITHUB_OUTPUT" - ikea-frekvens-led-multi-use-light: - name: IKEA Frekvens LED multi-use light + default: + name: Default build needs: pio runs-on: ubuntu-latest strategy: matrix: environment: ${{ fromJson(needs.pio.outputs.environments) }} - template: - - extensive - - default - - minimal - - typical - toolchain: - node-version: 20 python-version: 3.11 @@ -65,43 +59,6 @@ jobs: - node-version: 25 python-version: 3.13 - exclude: - - environment: adafruit_qtpy_esp32s2 - template: extensive - - - environment: adafruit_qtpy_esp32s3_n4r2 - template: extensive - - - environment: esp32-c3-devkitm-1 - template: extensive - - - environment: esp32-c5-devkitc-1 - template: extensive - - - environment: esp32-c6-devkitm-1 - template: extensive - - - environment: esp32dev - template: extensive - - - environment: lolin_d32 - template: extensive - - - environment: lolin_d32_pro - template: extensive - - - environment: lolin_s3_mini - template: extensive - - - environment: seeed_xiao_esp32c3 - template: extensive - - - environment: seeed_xiao_esp32c6 - template: extensive - - - environment: wemos_d1_mini32 - template: extensive - steps: - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -119,8 +76,7 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt - - name: Default configuration template - if: matrix.template == 'default' + - name: PlatformIO build run: | echo "IKEA_FREKVENS='true'" >> .env @@ -136,13 +92,44 @@ jobs: #define WIFI_SSID "redacted" EOL - - name: Minimal configuration template - if: matrix.template == 'minimal' + pio run --environment ${{ matrix.environment }} + + minimal: + name: Minimal build + needs: pio + runs-on: ubuntu-latest + + strategy: + matrix: + environment: ${{ fromJson(needs.pio.outputs.environments) }} + toolchain: + - node-version: 20 + python-version: 3.11 + + - node-version: 25 + python-version: 3.13 + + steps: + - name: Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ matrix.toolchain.node-version }} + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.toolchain.python-version }} + + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: PlatformIO build run: | cat <<'EOL' > .env EXTENSION_BUTTON='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' HOSTNAME='frekvens' IKEA_FREKVENS='true' MODE_ARROW='true' @@ -166,8 +153,41 @@ jobs: #define WIFI_SSID "redacted" EOL - - name: Typical configuration template - if: matrix.template == 'typical' + pio run --environment ${{ matrix.environment }} + + typical: + name: Typical build + needs: pio + runs-on: ubuntu-latest + + strategy: + matrix: + environment: ${{ fromJson(needs.pio.outputs.environments) }} + toolchain: + - node-version: 20 + python-version: 3.11 + + - node-version: 25 + python-version: 3.13 + + steps: + - name: Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ matrix.toolchain.node-version }} + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.toolchain.python-version }} + + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: PlatformIO build run: | cat <<'EOL' > .env EXTENSION_ALEXA='true' @@ -249,138 +269,16 @@ jobs: #define WIFI_SSID "redacted" EOL - - name: Extensive configuration template - if: matrix.template == 'extensive' - run: | - cat <<'EOL' > .env - EXTENSION_ALEXA='true' - EXTENSION_BUTTON='true' - EXTENSION_HEAP='true' - EXTENSION_HOMEASSISTANT='true' - EXTENSION_INFRARED='true' - EXTENSION_MESSAGE='true' - EXTENSION_MICROPHONE='true' - EXTENSION_MQTT='true' - EXTENSION_OTA='true' - EXTENSION_PHOTOCELL='true' - EXTENSION_PLAYLIST='true' - EXTENSION_RESTFUL='true' - EXTENSION_RTC='true' - EXTENSION_SERVERSENTEVENTS='true' - EXTENSION_SIGNAL='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - FONT_BRAILLE='true' - HOSTNAME='frekvens' - IKEA_FREKVENS='true' - MODE_ANIMATION='true' - MODE_ARROW='true' - MODE_ARTNET='true' - MODE_BINARYCLOCK='true' - MODE_BINARYEPOCH='true' - MODE_BLINDS='true' - MODE_BLINK='true' - MODE_BOLDCLOCK='true' - MODE_BREAKOUTCLOCK='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_COUNTDOWN='true' - MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' - MODE_DRAW='true' - MODE_E131='true' - MODE_EQUALIZER='true' - MODE_FIREWORK='true' - MODE_FLIES='true' - MODE_GAMEOFLIFE='true' - MODE_GAMEOFLIFECLOCK='true' - MODE_GLITTER='true' - MODE_GOOGLEWEATHER='true' - MODE_HOMEASSISTANTWEATHER='true' - MODE_HOMETHERMOMETER='true' - MODE_JAGGEDWAVEFORM='true' - MODE_LARGETICKINGCLOCK='true' - MODE_LEAFFALL='true' - MODE_LINES='true' - MODE_METABALLS='true' - MODE_NOISE='true' - MODE_OPENMETEO='true' - MODE_OPENWEATHER='true' - MODE_PINGPONG='true' - MODE_PINGPONGCLOCK='true' - MODE_PIXELSEQUENCE='true' - MODE_RAIN='true' - MODE_RING='true' - MODE_SCAN='true' - MODE_SMALLCLOCK='true' - MODE_SMALLTICKINGCLOCK='true' - MODE_SMOOTHWAVEFORM='true' - MODE_SNAKE='true' - MODE_SNAKECLOCK='true' - MODE_STARS='true' - MODE_TICKER='true' - MODE_WAVEFORM='true' - MODE_WORLDWEATHERONLINE='true' - MODE_WTTRIN='true' - MODE_YR='true' - NAME='Frekvens' - OTA_KEY='redacted' - TIME_ZONE='Etc/Universal' - EOL - - cat <<'EOL' > firmware/include/config/secrets.h - #pragma once - #define FRAME_RATE 60 - #define GOOGLEWEATHER_KEY "redacted" - #define HOMEASSISTANT_ENTITY "weather.forecast_home" - #define HOMEASSISTANT_HOST "homeassistant.local" - #define HOMEASSISTANT_KEY "redacted" - #define HOMEASSISTANT_PORT 8123 - #define LATITUDE "0.000" - #define LOCATION "redacted" - #define LONGITUDE "0.000" - #define MQTT_HOST "mqtt.local" - #define MQTT_PORT 1883 - #define MQTT_USER "redacted" - #define MQTT_KEY "redacted" - #define OPENMETEO_KEY "redacted" - #define OPENWEATHER_KEY "redacted" - #define PIN_CS 1 - #define PIN_INT 2 - #define PIN_IR 3 - #define PIN_LDR 4 - #define PIN_MIC 5 - #define PIN_MOSI 6 - #define PIN_OE 7 - #define PIN_SCL 8 - #define PIN_SCLK 9 - #define PIN_SDA 10 - #define PIN_SW1 11 - #define PIN_SW2 12 - #define RTC_DS3232 - #define TEMPERATURE_CELSIUS true - #define WIFI_COUNTRY "01" - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - #define WORLDWEATHERONLINE_KEY "redacted" - EOL - - - name: Build Frekvens - run: pio run --environment ${{ matrix.environment }} + pio run --environment ${{ matrix.environment }} - ikea-obegransad-led-wall-lamp: - name: IKEA Obegränsad LED wall lamp + extensive: + name: Extensive build needs: pio runs-on: ubuntu-latest strategy: matrix: environment: ${{ fromJson(needs.pio.outputs.environments) }} - template: - - extensive - - default - - minimal - - typical - toolchain: - node-version: 20 python-version: 3.11 @@ -390,40 +288,17 @@ jobs: exclude: - environment: adafruit_qtpy_esp32s2 - template: extensive - - environment: adafruit_qtpy_esp32s3_n4r2 - template: extensive - - environment: esp32-c3-devkitm-1 - template: extensive - - environment: esp32-c5-devkitc-1 - template: extensive - - environment: esp32-c6-devkitm-1 - template: extensive - - environment: esp32dev - template: extensive - - environment: lolin_d32 - template: extensive - - environment: lolin_d32_pro - template: extensive - - environment: lolin_s3_mini - template: extensive - - environment: seeed_xiao_esp32c3 - template: extensive - - environment: seeed_xiao_esp32c6 - template: extensive - - environment: wemos_d1_mini32 - template: extensive steps: - name: Set up Node.js @@ -442,134 +317,7 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt - - name: Default configuration template - if: matrix.template == 'default' - run: | - echo "IKEA_OBEGRANSAD='true'" >> .env - - cat <<'EOL' > firmware/include/config/secrets.h - #pragma once - #define PIN_CS 1 - #define PIN_MOSI 2 - #define PIN_OE 3 - #define PIN_SCLK 4 - #define PIN_SW2 5 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - EOL - - - name: Minimal configuration template - if: matrix.template == 'minimal' - run: | - cat <<'EOL' > .env - EXTENSION_BUTTON='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - HOSTNAME='obegransad' - IKEA_OBEGRANSAD='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_LINES='true' - MODE_NOISE='true' - MODE_RAIN='true' - MODE_SCAN='true' - MODE_STARS='true' - NAME='Obegränsad' - EOL - - cat <<'EOL' > firmware/include/config/secrets.h - #pragma once - #define PIN_CS 1 - #define PIN_MOSI 2 - #define PIN_OE 3 - #define PIN_SCLK 4 - #define PIN_SW2 5 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - EOL - - - name: Typical configuration template - if: matrix.template == 'typical' - run: | - cat <<'EOL' > .env - EXTENSION_ALEXA='true' - EXTENSION_BUTTON='true' - EXTENSION_HEAP='true' - EXTENSION_MESSAGE='true' - EXTENSION_OTA='true' - EXTENSION_PLAYLIST='true' - EXTENSION_RESTFUL='true' - EXTENSION_SERVERSENTEVENTS='true' - EXTENSION_SIGNAL='true' - EXTENSION_WEBAPP='true' - EXTENSION_WEBSOCKET='true' - FONT_BRAILLE='true' - HOSTNAME='obegransad' - IKEA_OBEGRANSAD='true' - MODE_ANIMATION='true' - MODE_ARROW='true' - MODE_ARTNET='true' - MODE_BINARYCLOCK='true' - MODE_BINARYEPOCH='true' - MODE_BLINDS='true' - MODE_BLINK='true' - MODE_BOLDCLOCK='true' - MODE_BREAKOUTCLOCK='true' - MODE_BRIGHT='true' - MODE_CIRCLE='true' - MODE_COUNTDOWN='true' - MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' - MODE_DRAW='true' - MODE_E131='true' - MODE_EQUALIZER='true' - MODE_FIREWORK='true' - MODE_FLIES='true' - MODE_GAMEOFLIFE='true' - MODE_GAMEOFLIFECLOCK='true' - MODE_GLITTER='true' - MODE_HOMETHERMOMETER='true' - MODE_JAGGEDWAVEFORM='true' - MODE_LARGETICKINGCLOCK='true' - MODE_LEAFFALL='true' - MODE_LINES='true' - MODE_METABALLS='true' - MODE_NOISE='true' - MODE_OPENMETEO='true' - MODE_PINGPONG='true' - MODE_PINGPONGCLOCK='true' - MODE_PIXELSEQUENCE='true' - MODE_RAIN='true' - MODE_RING='true' - MODE_SCAN='true' - MODE_SMALLCLOCK='true' - MODE_SMALLTICKINGCLOCK='true' - MODE_SMOOTHWAVEFORM='true' - MODE_SNAKE='true' - MODE_SNAKECLOCK='true' - MODE_STARS='true' - MODE_TICKER='true' - MODE_WAVEFORM='true' - MODE_WTTRIN='true' - MODE_YR='true' - NAME='Obegränsad' - EOL - - cat <<'EOL' > firmware/include/config/secrets.h - #pragma once - #define LATITUDE "0.000" - #define LOCATION "redacted" - #define LONGITUDE "0.000" - #define PIN_CS 1 - #define PIN_MOSI 2 - #define PIN_OE 3 - #define PIN_SCLK 4 - #define PIN_SW2 5 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - EOL - - - name: Extensive configuration template - if: matrix.template == 'extensive' + - name: PlatformIO build run: | cat <<'EOL' > .env EXTENSION_ALEXA='true' @@ -590,8 +338,8 @@ jobs: EXTENSION_WEBAPP='true' EXTENSION_WEBSOCKET='true' FONT_BRAILLE='true' - HOSTNAME='obegransad' - IKEA_OBEGRANSAD='true' + HOSTNAME='frekvens' + IKEA_FREKVENS='true' MODE_ANIMATION='true' MODE_ARROW='true' MODE_ARTNET='true' @@ -641,7 +389,7 @@ jobs: MODE_WORLDWEATHERONLINE='true' MODE_WTTRIN='true' MODE_YR='true' - NAME='Obegränsad' + NAME='Frekvens' OTA_KEY='redacted' TIME_ZONE='Etc/Universal' EOL @@ -673,14 +421,14 @@ jobs: #define PIN_SCL 8 #define PIN_SCLK 9 #define PIN_SDA 10 - #define PIN_SW2 11 - #define RTC_DS3231 - #define TEMPERATURE_FAHRENHEIT true + #define PIN_SW1 11 + #define PIN_SW2 12 + #define RTC_DS3232 + #define TEMPERATURE_CELSIUS true #define WIFI_COUNTRY "01" #define WIFI_KEY "redacted" #define WIFI_SSID "redacted" #define WORLDWEATHERONLINE_KEY "redacted" EOL - - name: Build Frekvens - run: pio run --environment ${{ matrix.environment }} + pio run --environment ${{ matrix.environment }} diff --git a/.github/workflows/esphome.yml b/.github/workflows/ikea-frekvens-led-spotlight.yml similarity index 94% rename from .github/workflows/esphome.yml rename to .github/workflows/ikea-frekvens-led-spotlight.yml index 09114afc..05ec5502 100644 --- a/.github/workflows/esphome.yml +++ b/.github/workflows/ikea-frekvens-led-spotlight.yml @@ -1,4 +1,4 @@ -name: ESPHome +name: IKEA Frekvens LED spotlight on: merge_group: @@ -37,7 +37,7 @@ jobs: >> "$GITHUB_OUTPUT" ikea-frekvens-led-spotlight: - name: IKEA Frekvens LED spotlight + name: ESPHome build needs: esphome runs-on: ubuntu-latest @@ -60,7 +60,7 @@ jobs: wifi_ssid: "redacted" EOL - - name: IKEA Frekvens LED spotlight + - name: ESPHome build uses: esphome/build-action@f93bda46d83c761cd25bbfdf350cfe508a0a39d5 # v7.1.0 with: yaml-file: extra/IKEA-Frekvens-LED-spotlight/esphome.yaml diff --git a/.github/workflows/ikea-obegransad-led-wall-lamp.yml b/.github/workflows/ikea-obegransad-led-wall-lamp.yml new file mode 100644 index 00000000..6b744eeb --- /dev/null +++ b/.github/workflows/ikea-obegransad-led-wall-lamp.yml @@ -0,0 +1,428 @@ +name: IKEA Obegränsad LED wall lamp + +on: + merge_group: + types: + - checks_requested + + pull_request: + branches: + - main + + push: + branches: + - main + + workflow_dispatch: + +permissions: + contents: read + +jobs: + pio: + name: PlatformIO environments + runs-on: ubuntu-latest + outputs: + environments: ${{ steps.ini.outputs.environments }} + + steps: + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: 3.13 + + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: Export PlatformIO environments + id: ini + run: | + echo "environments=$(pio project config --json-output \ + | jq -c '[.[] | .[0] | select(startswith("env:")) | sub("^env:"; "")]')" \ + >> "$GITHUB_OUTPUT" + + default: + name: Default build + needs: pio + runs-on: ubuntu-latest + + strategy: + matrix: + environment: ${{ fromJson(needs.pio.outputs.environments) }} + toolchain: + - node-version: 20 + python-version: 3.11 + + - node-version: 25 + python-version: 3.13 + + steps: + - name: Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ matrix.toolchain.node-version }} + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.toolchain.python-version }} + + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: PlatformIO build + run: | + echo "IKEA_OBEGRANSAD='true'" >> .env + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW2 5 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + EOL + + pio run --environment ${{ matrix.environment }} + + minimal: + name: Minimal build + needs: pio + runs-on: ubuntu-latest + + strategy: + matrix: + environment: ${{ fromJson(needs.pio.outputs.environments) }} + toolchain: + - node-version: 20 + python-version: 3.11 + + - node-version: 25 + python-version: 3.13 + + steps: + - name: Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ matrix.toolchain.node-version }} + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.toolchain.python-version }} + + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: PlatformIO build + run: | + cat <<'EOL' > .env + EXTENSION_BUTTON='true' + HOSTNAME='obegransad' + IKEA_OBEGRANSAD='true' + MODE_CIRCLE='true' + MODE_LINES='true' + MODE_NOISE='true' + MODE_RAIN='true' + MODE_SCAN='true' + MODE_STARS='true' + NAME='Obegränsad' + EOL + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW2 5 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + EOL + + pio run --environment ${{ matrix.environment }} + + typical: + name: Typical build + needs: pio + runs-on: ubuntu-latest + + strategy: + matrix: + environment: ${{ fromJson(needs.pio.outputs.environments) }} + toolchain: + - node-version: 20 + python-version: 3.11 + + - node-version: 25 + python-version: 3.13 + + steps: + - name: Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ matrix.toolchain.node-version }} + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.toolchain.python-version }} + + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: PlatformIO build + run: | + cat <<'EOL' > .env + EXTENSION_ALEXA='true' + EXTENSION_BUTTON='true' + EXTENSION_HEAP='true' + EXTENSION_MESSAGE='true' + EXTENSION_OTA='true' + EXTENSION_PLAYLIST='true' + EXTENSION_RESTFUL='true' + EXTENSION_SERVERSENTEVENTS='true' + EXTENSION_SIGNAL='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + FONT_BRAILLE='true' + HOSTNAME='obegransad' + IKEA_OBEGRANSAD='true' + MODE_ANIMATION='true' + MODE_ARROW='true' + MODE_ARTNET='true' + MODE_BINARYCLOCK='true' + MODE_BINARYEPOCH='true' + MODE_BLINDS='true' + MODE_BLINK='true' + MODE_BOLDCLOCK='true' + MODE_BREAKOUTCLOCK='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_COUNTDOWN='true' + MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' + MODE_DRAW='true' + MODE_E131='true' + MODE_EQUALIZER='true' + MODE_FIREWORK='true' + MODE_FLIES='true' + MODE_GAMEOFLIFE='true' + MODE_GAMEOFLIFECLOCK='true' + MODE_GLITTER='true' + MODE_HOMETHERMOMETER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_LARGETICKINGCLOCK='true' + MODE_LEAFFALL='true' + MODE_LINES='true' + MODE_METABALLS='true' + MODE_NOISE='true' + MODE_OPENMETEO='true' + MODE_PINGPONG='true' + MODE_PINGPONGCLOCK='true' + MODE_PIXELSEQUENCE='true' + MODE_RAIN='true' + MODE_RING='true' + MODE_SCAN='true' + MODE_SMALLCLOCK='true' + MODE_SMALLTICKINGCLOCK='true' + MODE_SMOOTHWAVEFORM='true' + MODE_SNAKE='true' + MODE_SNAKECLOCK='true' + MODE_STARS='true' + MODE_TICKER='true' + MODE_WAVEFORM='true' + MODE_WTTRIN='true' + MODE_YR='true' + NAME='Obegränsad' + EOL + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define LATITUDE "0.000" + #define LOCATION "redacted" + #define LONGITUDE "0.000" + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define PIN_SW2 5 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + EOL + + pio run --environment ${{ matrix.environment }} + + extensive: + name: Extensive build + needs: pio + runs-on: ubuntu-latest + + strategy: + matrix: + environment: ${{ fromJson(needs.pio.outputs.environments) }} + toolchain: + - node-version: 20 + python-version: 3.11 + + - node-version: 25 + python-version: 3.13 + + exclude: + - environment: adafruit_qtpy_esp32s2 + - environment: adafruit_qtpy_esp32s3_n4r2 + - environment: esp32-c3-devkitm-1 + - environment: esp32-c5-devkitc-1 + - environment: esp32-c6-devkitm-1 + - environment: esp32dev + - environment: lolin_d32 + - environment: lolin_d32_pro + - environment: lolin_s3_mini + - environment: seeed_xiao_esp32c3 + - environment: seeed_xiao_esp32c6 + - environment: wemos_d1_mini32 + + steps: + - name: Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ matrix.toolchain.node-version }} + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.toolchain.python-version }} + + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: PlatformIO build + run: | + cat <<'EOL' > .env + EXTENSION_ALEXA='true' + EXTENSION_BUTTON='true' + EXTENSION_HEAP='true' + EXTENSION_HOMEASSISTANT='true' + EXTENSION_INFRARED='true' + EXTENSION_MESSAGE='true' + EXTENSION_MICROPHONE='true' + EXTENSION_MQTT='true' + EXTENSION_OTA='true' + EXTENSION_PHOTOCELL='true' + EXTENSION_PLAYLIST='true' + EXTENSION_RESTFUL='true' + EXTENSION_RTC='true' + EXTENSION_SERVERSENTEVENTS='true' + EXTENSION_SIGNAL='true' + EXTENSION_WEBAPP='true' + EXTENSION_WEBSOCKET='true' + FONT_BRAILLE='true' + HOSTNAME='obegransad' + IKEA_OBEGRANSAD='true' + MODE_ANIMATION='true' + MODE_ARROW='true' + MODE_ARTNET='true' + MODE_BINARYCLOCK='true' + MODE_BINARYEPOCH='true' + MODE_BLINDS='true' + MODE_BLINK='true' + MODE_BOLDCLOCK='true' + MODE_BREAKOUTCLOCK='true' + MODE_BRIGHT='true' + MODE_CIRCLE='true' + MODE_COUNTDOWN='true' + MODE_DISTRIBUTEDDISPLAYPROTOCOL='true' + MODE_DRAW='true' + MODE_E131='true' + MODE_EQUALIZER='true' + MODE_FIREWORK='true' + MODE_FLIES='true' + MODE_GAMEOFLIFE='true' + MODE_GAMEOFLIFECLOCK='true' + MODE_GLITTER='true' + MODE_GOOGLEWEATHER='true' + MODE_HOMEASSISTANTWEATHER='true' + MODE_HOMETHERMOMETER='true' + MODE_JAGGEDWAVEFORM='true' + MODE_LARGETICKINGCLOCK='true' + MODE_LEAFFALL='true' + MODE_LINES='true' + MODE_METABALLS='true' + MODE_NOISE='true' + MODE_OPENMETEO='true' + MODE_OPENWEATHER='true' + MODE_PINGPONG='true' + MODE_PINGPONGCLOCK='true' + MODE_PIXELSEQUENCE='true' + MODE_RAIN='true' + MODE_RING='true' + MODE_SCAN='true' + MODE_SMALLCLOCK='true' + MODE_SMALLTICKINGCLOCK='true' + MODE_SMOOTHWAVEFORM='true' + MODE_SNAKE='true' + MODE_SNAKECLOCK='true' + MODE_STARS='true' + MODE_TICKER='true' + MODE_WAVEFORM='true' + MODE_WORLDWEATHERONLINE='true' + MODE_WTTRIN='true' + MODE_YR='true' + NAME='Obegränsad' + OTA_KEY='redacted' + TIME_ZONE='Etc/Universal' + EOL + + cat <<'EOL' > firmware/include/config/secrets.h + #pragma once + #define FRAME_RATE 60 + #define GOOGLEWEATHER_KEY "redacted" + #define HOMEASSISTANT_ENTITY "weather.forecast_home" + #define HOMEASSISTANT_HOST "homeassistant.local" + #define HOMEASSISTANT_KEY "redacted" + #define HOMEASSISTANT_PORT 8123 + #define LATITUDE "0.000" + #define LOCATION "redacted" + #define LONGITUDE "0.000" + #define MQTT_HOST "mqtt.local" + #define MQTT_PORT 1883 + #define MQTT_USER "redacted" + #define MQTT_KEY "redacted" + #define OPENMETEO_KEY "redacted" + #define OPENWEATHER_KEY "redacted" + #define PIN_CS 1 + #define PIN_INT 2 + #define PIN_IR 3 + #define PIN_LDR 4 + #define PIN_MIC 5 + #define PIN_MOSI 6 + #define PIN_OE 7 + #define PIN_SCL 8 + #define PIN_SCLK 9 + #define PIN_SDA 10 + #define PIN_SW2 11 + #define RTC_DS3231 + #define TEMPERATURE_FAHRENHEIT true + #define WIFI_COUNTRY "01" + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + #define WORLDWEATHERONLINE_KEY "redacted" + EOL + + pio run --environment ${{ matrix.environment }} From a1c4e7eefb8fda1bf8457d4ff685c803fbe940c0 Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Mon, 5 Jan 2026 04:33:31 +0100 Subject: [PATCH 14/20] Remove Node.js from minimal builds + renamed variables --- .../ikea-frekvens-led-multi-use-light.yml | 34 +++++++------------ .../workflows/ikea-frekvens-led-spotlight.yml | 8 ++--- .../ikea-obegransad-led-wall-lamp.yml | 34 +++++++------------ 3 files changed, 30 insertions(+), 46 deletions(-) diff --git a/.github/workflows/ikea-frekvens-led-multi-use-light.yml b/.github/workflows/ikea-frekvens-led-multi-use-light.yml index 371205a2..866793f8 100644 --- a/.github/workflows/ikea-frekvens-led-multi-use-light.yml +++ b/.github/workflows/ikea-frekvens-led-multi-use-light.yml @@ -19,11 +19,11 @@ permissions: contents: read jobs: - pio: + platformio: name: PlatformIO environments runs-on: ubuntu-latest outputs: - environments: ${{ steps.ini.outputs.environments }} + environments: ${{ steps.pio.outputs.environments }} steps: - name: Set up Python @@ -38,7 +38,7 @@ jobs: run: pip install -r .github/platformio/requirements.txt - name: Export PlatformIO environments - id: ini + id: pio run: | echo "environments=$(pio project config --json-output \ | jq -c '[.[] | .[0] | select(startswith("env:")) | sub("^env:"; "")]')" \ @@ -46,12 +46,12 @@ jobs: default: name: Default build - needs: pio + needs: platformio runs-on: ubuntu-latest strategy: matrix: - environment: ${{ fromJson(needs.pio.outputs.environments) }} + environment: ${{ fromJson(needs.platformio.outputs.environments) }} toolchain: - node-version: 20 python-version: 3.11 @@ -96,25 +96,17 @@ jobs: minimal: name: Minimal build - needs: pio + needs: platformio runs-on: ubuntu-latest strategy: matrix: - environment: ${{ fromJson(needs.pio.outputs.environments) }} + environment: ${{ fromJson(needs.platformio.outputs.environments) }} toolchain: - - node-version: 20 - python-version: 3.11 - - - node-version: 25 - python-version: 3.13 + - python-version: 3.11 + - python-version: 3.13 steps: - - name: Set up Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: ${{ matrix.toolchain.node-version }} - - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: @@ -157,12 +149,12 @@ jobs: typical: name: Typical build - needs: pio + needs: platformio runs-on: ubuntu-latest strategy: matrix: - environment: ${{ fromJson(needs.pio.outputs.environments) }} + environment: ${{ fromJson(needs.platformio.outputs.environments) }} toolchain: - node-version: 20 python-version: 3.11 @@ -273,12 +265,12 @@ jobs: extensive: name: Extensive build - needs: pio + needs: platformio runs-on: ubuntu-latest strategy: matrix: - environment: ${{ fromJson(needs.pio.outputs.environments) }} + environment: ${{ fromJson(needs.platformio.outputs.environments) }} toolchain: - node-version: 20 python-version: 3.11 diff --git a/.github/workflows/ikea-frekvens-led-spotlight.yml b/.github/workflows/ikea-frekvens-led-spotlight.yml index 05ec5502..4f784f3f 100644 --- a/.github/workflows/ikea-frekvens-led-spotlight.yml +++ b/.github/workflows/ikea-frekvens-led-spotlight.yml @@ -43,9 +43,9 @@ jobs: strategy: matrix: - esphome-version: - - ${{ needs.esphome.outputs.min_version }} - - latest + toolchain: + - esphome-version: ${{ needs.esphome.outputs.min_version }} + - esphome-version: latest steps: - name: Set up Frekvens @@ -64,4 +64,4 @@ jobs: uses: esphome/build-action@f93bda46d83c761cd25bbfdf350cfe508a0a39d5 # v7.1.0 with: yaml-file: extra/IKEA-Frekvens-LED-spotlight/esphome.yaml - version: ${{ matrix.esphome-version }} + version: ${{ matrix.toolchain.esphome-version }} diff --git a/.github/workflows/ikea-obegransad-led-wall-lamp.yml b/.github/workflows/ikea-obegransad-led-wall-lamp.yml index 6b744eeb..40922385 100644 --- a/.github/workflows/ikea-obegransad-led-wall-lamp.yml +++ b/.github/workflows/ikea-obegransad-led-wall-lamp.yml @@ -19,11 +19,11 @@ permissions: contents: read jobs: - pio: + platformio: name: PlatformIO environments runs-on: ubuntu-latest outputs: - environments: ${{ steps.ini.outputs.environments }} + environments: ${{ steps.pio.outputs.environments }} steps: - name: Set up Python @@ -38,7 +38,7 @@ jobs: run: pip install -r .github/platformio/requirements.txt - name: Export PlatformIO environments - id: ini + id: pio run: | echo "environments=$(pio project config --json-output \ | jq -c '[.[] | .[0] | select(startswith("env:")) | sub("^env:"; "")]')" \ @@ -46,12 +46,12 @@ jobs: default: name: Default build - needs: pio + needs: platformio runs-on: ubuntu-latest strategy: matrix: - environment: ${{ fromJson(needs.pio.outputs.environments) }} + environment: ${{ fromJson(needs.platformio.outputs.environments) }} toolchain: - node-version: 20 python-version: 3.11 @@ -95,25 +95,17 @@ jobs: minimal: name: Minimal build - needs: pio + needs: platformio runs-on: ubuntu-latest strategy: matrix: - environment: ${{ fromJson(needs.pio.outputs.environments) }} + environment: ${{ fromJson(needs.platformio.outputs.environments) }} toolchain: - - node-version: 20 - python-version: 3.11 - - - node-version: 25 - python-version: 3.13 + - python-version: 3.11 + - python-version: 3.13 steps: - - name: Set up Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: ${{ matrix.toolchain.node-version }} - - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: @@ -155,12 +147,12 @@ jobs: typical: name: Typical build - needs: pio + needs: platformio runs-on: ubuntu-latest strategy: matrix: - environment: ${{ fromJson(needs.pio.outputs.environments) }} + environment: ${{ fromJson(needs.platformio.outputs.environments) }} toolchain: - node-version: 20 python-version: 3.11 @@ -268,12 +260,12 @@ jobs: extensive: name: Extensive build - needs: pio + needs: platformio runs-on: ubuntu-latest strategy: matrix: - environment: ${{ fromJson(needs.pio.outputs.environments) }} + environment: ${{ fromJson(needs.platformio.outputs.environments) }} toolchain: - node-version: 20 python-version: 3.11 From 176d9595611561cab8f8b64ef8d00a6088938af2 Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Wed, 7 Jan 2026 11:35:17 +0100 Subject: [PATCH 15/20] Caching + reorganizing --- .github/workflows/generate.yml | 165 +++++ .../ikea-frekvens-led-multi-use-light.yml | 98 ++- .../workflows/ikea-frekvens-led-spotlight.yml | 8 +- .../ikea-obegransad-led-wall-lamp.yml | 98 ++- .github/workflows/miscellaneous.yml | 204 ++++++ .github/workflows/stream.yml | 156 +++++ .github/workflows/tests.yml | 628 ------------------ 7 files changed, 687 insertions(+), 670 deletions(-) create mode 100644 .github/workflows/generate.yml create mode 100644 .github/workflows/miscellaneous.yml create mode 100644 .github/workflows/stream.yml delete mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/generate.yml b/.github/workflows/generate.yml new file mode 100644 index 00000000..ed70a793 --- /dev/null +++ b/.github/workflows/generate.yml @@ -0,0 +1,165 @@ +name: Generate + +on: + merge_group: + types: + - checks_requested + + pull_request: + branches: + - main + + push: + branches: + - main + + workflow_dispatch: + +permissions: + contents: read + +jobs: + font: + name: DejaVuSans font + runs-on: ubuntu-latest + + strategy: + matrix: + include: + - python-version: 3.11 + - python-version: 3.14 + + steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.python-version }} + cache: pip + cache-dependency-path: extra/Python/requirements.txt + + - name: Set up Frekvens extra + run: pip install -r extra/Python/requirements.txt + + - name: Font generator + run: python extra/Python/FontGenerator.py -i DejaVuSans --size 8 + + - name: File existence + uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 + with: + fail: true + files: DejaVuSansFont.cpp, DejaVuSansFont.h + + mode-dynamic: + name: Dynamic mode + runs-on: ubuntu-latest + + strategy: + matrix: + include: + - python-version: 3.11 + - python-version: 3.14 + + steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.python-version }} + + - name: Generate mode + run: | + cat < Animation.csv + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 + 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + EOL + + python extra/Python/ModeGenerator.py -i Animation.csv + + - name: File existence + uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 + with: + fail: true + files: AnimationMode.cpp, AnimationMode.h + + mode-static: + name: Static mode + runs-on: ubuntu-latest + + strategy: + matrix: + include: + - python-version: 3.11 + - python-version: 3.14 + + steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.python-version }} + + - name: Generate mode + run: | + cat < Drawing.csv + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 + 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + EOL + + python extra/Python/ModeGenerator.py -i Drawing.csv + + - name: File existence + uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 + with: + fail: true + files: DrawingMode.cpp, DrawingMode.h diff --git a/.github/workflows/ikea-frekvens-led-multi-use-light.yml b/.github/workflows/ikea-frekvens-led-multi-use-light.yml index 866793f8..a0670334 100644 --- a/.github/workflows/ikea-frekvens-led-multi-use-light.yml +++ b/.github/workflows/ikea-frekvens-led-multi-use-light.yml @@ -26,13 +26,15 @@ jobs: environments: ${{ steps.pio.outputs.environments }} steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: 3.13 - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + cache: pip + cache-dependency-path: .github/platformio/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt @@ -60,22 +62,37 @@ jobs: python-version: 3.13 steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: ${{ matrix.toolchain.node-version }} + cache: npm + cache-dependency-path: webapp/package-lock.json - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.toolchain.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + cache: pip + cache-dependency-path: .github/platformio/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 + with: + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + path: | + .pio/libdeps + .platformio/packages + .platformio/penv/Lib/site-packages + .platformio/platforms + .platformio/tools + - name: PlatformIO build run: | echo "IKEA_FREKVENS='true'" >> .env @@ -92,7 +109,7 @@ jobs: #define WIFI_SSID "redacted" EOL - pio run --environment ${{ matrix.environment }} + pio run -e ${{ matrix.environment }} minimal: name: Minimal build @@ -107,17 +124,30 @@ jobs: - python-version: 3.13 steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.toolchain.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + cache: pip + cache-dependency-path: .github/platformio/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 + with: + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + path: | + .pio/libdeps + .platformio/packages + .platformio/penv/Lib/site-packages + .platformio/platforms + .platformio/tools + - name: PlatformIO build run: | cat <<'EOL' > .env @@ -145,7 +175,7 @@ jobs: #define WIFI_SSID "redacted" EOL - pio run --environment ${{ matrix.environment }} + pio run -e ${{ matrix.environment }} typical: name: Typical build @@ -163,22 +193,37 @@ jobs: python-version: 3.13 steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: ${{ matrix.toolchain.node-version }} + cache: npm + cache-dependency-path: webapp/package-lock.json - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.toolchain.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + cache: pip + cache-dependency-path: .github/platformio/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 + with: + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + path: | + .pio/libdeps + .platformio/packages + .platformio/penv/Lib/site-packages + .platformio/platforms + .platformio/tools + - name: PlatformIO build run: | cat <<'EOL' > .env @@ -261,7 +306,7 @@ jobs: #define WIFI_SSID "redacted" EOL - pio run --environment ${{ matrix.environment }} + pio run -e ${{ matrix.environment }} extensive: name: Extensive build @@ -293,22 +338,37 @@ jobs: - environment: wemos_d1_mini32 steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: ${{ matrix.toolchain.node-version }} + cache: npm + cache-dependency-path: webapp/package-lock.json - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.toolchain.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + cache: pip + cache-dependency-path: .github/platformio/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 + with: + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + path: | + .pio/libdeps + .platformio/packages + .platformio/penv/Lib/site-packages + .platformio/platforms + .platformio/tools + - name: PlatformIO build run: | cat <<'EOL' > .env @@ -423,4 +483,4 @@ jobs: #define WORLDWEATHERONLINE_KEY "redacted" EOL - pio run --environment ${{ matrix.environment }} + pio run -e ${{ matrix.environment }} diff --git a/.github/workflows/ikea-frekvens-led-spotlight.yml b/.github/workflows/ikea-frekvens-led-spotlight.yml index 4f784f3f..cbc19b49 100644 --- a/.github/workflows/ikea-frekvens-led-spotlight.yml +++ b/.github/workflows/ikea-frekvens-led-spotlight.yml @@ -43,9 +43,9 @@ jobs: strategy: matrix: - toolchain: - - esphome-version: ${{ needs.esphome.outputs.min_version }} - - esphome-version: latest + esphome-version: + - ${{ needs.esphome.outputs.min_version }} + - latest steps: - name: Set up Frekvens @@ -63,5 +63,5 @@ jobs: - name: ESPHome build uses: esphome/build-action@f93bda46d83c761cd25bbfdf350cfe508a0a39d5 # v7.1.0 with: + version: ${{ matrix.esphome-version }} yaml-file: extra/IKEA-Frekvens-LED-spotlight/esphome.yaml - version: ${{ matrix.toolchain.esphome-version }} diff --git a/.github/workflows/ikea-obegransad-led-wall-lamp.yml b/.github/workflows/ikea-obegransad-led-wall-lamp.yml index 40922385..208efe31 100644 --- a/.github/workflows/ikea-obegransad-led-wall-lamp.yml +++ b/.github/workflows/ikea-obegransad-led-wall-lamp.yml @@ -26,13 +26,15 @@ jobs: environments: ${{ steps.pio.outputs.environments }} steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: 3.13 - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + cache: pip + cache-dependency-path: .github/platformio/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt @@ -60,22 +62,37 @@ jobs: python-version: 3.13 steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: ${{ matrix.toolchain.node-version }} + cache: npm + cache-dependency-path: webapp/package-lock.json - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.toolchain.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + cache: pip + cache-dependency-path: .github/platformio/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 + with: + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + path: | + .pio/libdeps + .platformio/packages + .platformio/penv/Lib/site-packages + .platformio/platforms + .platformio/tools + - name: PlatformIO build run: | echo "IKEA_OBEGRANSAD='true'" >> .env @@ -91,7 +108,7 @@ jobs: #define WIFI_SSID "redacted" EOL - pio run --environment ${{ matrix.environment }} + pio run -e ${{ matrix.environment }} minimal: name: Minimal build @@ -106,17 +123,30 @@ jobs: - python-version: 3.13 steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.toolchain.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + cache: pip + cache-dependency-path: .github/platformio/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 + with: + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + path: | + .pio/libdeps + .platformio/packages + .platformio/penv/Lib/site-packages + .platformio/platforms + .platformio/tools + - name: PlatformIO build run: | cat <<'EOL' > .env @@ -143,7 +173,7 @@ jobs: #define WIFI_SSID "redacted" EOL - pio run --environment ${{ matrix.environment }} + pio run -e ${{ matrix.environment }} typical: name: Typical build @@ -161,22 +191,37 @@ jobs: python-version: 3.13 steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: ${{ matrix.toolchain.node-version }} + cache: npm + cache-dependency-path: webapp/package-lock.json - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.toolchain.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + cache: pip + cache-dependency-path: .github/platformio/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 + with: + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + path: | + .pio/libdeps + .platformio/packages + .platformio/penv/Lib/site-packages + .platformio/platforms + .platformio/tools + - name: PlatformIO build run: | cat <<'EOL' > .env @@ -256,7 +301,7 @@ jobs: #define WIFI_SSID "redacted" EOL - pio run --environment ${{ matrix.environment }} + pio run -e ${{ matrix.environment }} extensive: name: Extensive build @@ -288,22 +333,37 @@ jobs: - environment: wemos_d1_mini32 steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Set up Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: ${{ matrix.toolchain.node-version }} + cache: npm + cache-dependency-path: webapp/package-lock.json - name: Set up Python uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.toolchain.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + cache: pip + cache-dependency-path: .github/platformio/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 + with: + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + path: | + .pio/libdeps + .platformio/packages + .platformio/penv/Lib/site-packages + .platformio/platforms + .platformio/tools + - name: PlatformIO build run: | cat <<'EOL' > .env @@ -417,4 +477,4 @@ jobs: #define WORLDWEATHERONLINE_KEY "redacted" EOL - pio run --environment ${{ matrix.environment }} + pio run -e ${{ matrix.environment }} diff --git a/.github/workflows/miscellaneous.yml b/.github/workflows/miscellaneous.yml new file mode 100644 index 00000000..264d431d --- /dev/null +++ b/.github/workflows/miscellaneous.yml @@ -0,0 +1,204 @@ +name: Miscellaneous + +on: + merge_group: + types: + - checks_requested + + pull_request: + branches: + - main + + push: + branches: + - main + + workflow_dispatch: + +permissions: + contents: read + +jobs: + animation-splitter: + name: Animation splitter + runs-on: ubuntu-latest + + strategy: + matrix: + include: + - python-version: 3.11 + - python-version: 3.14 + + steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.python-version }} + cache: pip + cache-dependency-path: tools/pyproject.toml + + - name: Set up Frekvens tools + run: pip install tools/ + + - name: Animation splitter + run: | + cat < Animation.csv + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 + 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + EOL + + python -m frekvens.AnimationSplitter -i Animation.csv + + - name: File existence + uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 + with: + fail: true + files: Animation-1.csv, Animation-2.csv + + home-thermometer-demo: + name: Home thermometer demo + runs-on: ubuntu-latest + + strategy: + matrix: + include: + - python-version: 3.11 + - python-version: 3.14 + + steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.python-version }} + cache: pip + cache-dependency-path: tools/pyproject.toml + + - name: Set up Frekvens tools + run: pip install tools/ + + - name: Home thermometer demo + run: | + set +e + OUTPUT=$(python -m frekvens.HomeThermometerDemo --host localhost --indoor=22 --outdoor=8 2>&1) + STATUS=$? + echo "$OUTPUT" + if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then + echo "Expected ConnectError occurred." + exit 0 + fi + echo "Unexpected error or no error." + exit $STATUS + + x509_crt_bundle: + name: x509 certificate bundle + runs-on: ubuntu-latest + + strategy: + matrix: + include: + - python-version: 3.11 + - python-version: 3.13 + + steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.python-version }} + cache: pip + cache-dependency-path: tools/pyproject.toml + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: PlatformIO build + continue-on-error: true + run: | + cat < .env + HOSTNAME='frekvens' + IKEA_FREKVENS='true' + MODE_GOOGLEWEATHER='true' + MODE_OPENMETEO='true' + MODE_OPENWEATHER='true' + MODE_WORLDWEATHERONLINE='true' + MODE_WTTRIN='true' + MODE_YR='true' + NAME='Frekvens' + EOL + + cat < firmware/include/config/secrets.h + #pragma once + #define GOOGLEWEATHER_KEY "redacted" + #define LATITUDE "0.000" + #define LONGITUDE "0.000" + #define OPENWEATHER_KEY "redacted" + #define PIN_CS 1 + #define PIN_MOSI 2 + #define PIN_OE 3 + #define PIN_SCLK 4 + #define WIFI_KEY "redacted" + #define WIFI_SSID "redacted" + #define WORLDWEATHERONLINE_KEY "redacted" + EOL + + pio run -e esp32dev + + - name: File existence + uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 + with: + fail: true + files: firmware/certs/bundle/ca_roots.pem, firmware/embed/x509_crt_bundle.bin + + - name: Set up ESP-IDF + run: | + git clone -b release/v5.5 --filter=blob:none --sparse https://github.com/espressif/esp-idf.git + cd esp-idf + git sparse-checkout add components/mbedtls/esp_crt_bundle + + - name: Certificate bundle + run: | + python esp-idf/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py --i firmware/certs/bundle + if cmp x509_crt_bundle firmware/embed/x509_crt_bundle.bin; then + echo "Root CA bundles identical." + exit 0 + fi + echo "Unexpected error or file mismatch." + exit 1 diff --git a/.github/workflows/stream.yml b/.github/workflows/stream.yml new file mode 100644 index 00000000..5a384eee --- /dev/null +++ b/.github/workflows/stream.yml @@ -0,0 +1,156 @@ +name: Stream + +on: + merge_group: + types: + - checks_requested + + pull_request: + branches: + - main + + push: + branches: + - main + + workflow_dispatch: + +permissions: + contents: read + +jobs: + animation: + name: Animation streamer + runs-on: ubuntu-latest + + strategy: + matrix: + module: + - frekvens.ArtNetStreamer + - frekvens.DistributedDisplayProtocolStreamer + - frekvens.E131Streamer + toolchain: + - python-version: 3.11 + - python-version: 3.14 + + steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.toolchain.python-version }} + cache: pip + cache-dependency-path: tools/pyproject.toml + + - name: Set up Frekvens tools + run: pip install tools/ + + - name: Frekvens stream + run: | + cat < Animation.csv + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 + 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + EOL + + set +e + OUTPUT=$(python -m ${{ matrix.module }} --host localhost -i Animation.csv 2>&1) + STATUS=$? + echo "$OUTPUT" + if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then + echo "Expected ConnectError occurred." + exit 0 + fi + echo "Unexpected error or no error." + exit $STATUS + + drawing: + name: Drawing streamer + runs-on: ubuntu-latest + + strategy: + matrix: + module: + - frekvens.ArtNetStreamer + - frekvens.DistributedDisplayProtocolStreamer + - frekvens.E131Streamer + toolchain: + - python-version: 3.11 + - python-version: 3.14 + + steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.toolchain.python-version }} + cache: pip + cache-dependency-path: tools/pyproject.toml + + - name: Set up Frekvens tools + run: pip install tools/ + + - name: Frekvens stream + run: | + cat < Drawing.csv + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 + 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 + 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 + 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + EOL + + set +e + OUTPUT=$(python -m ${{ matrix.module }} --host localhost -i Drawing.csv 2>&1) + STATUS=$? + echo "$OUTPUT" + if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then + echo "Expected ConnectError occurred." + exit 0 + fi + echo "Unexpected error or no error." + exit $STATUS diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml deleted file mode 100644 index 74952edd..00000000 --- a/.github/workflows/tests.yml +++ /dev/null @@ -1,628 +0,0 @@ -name: Tests - -on: - merge_group: - types: - - checks_requested - - pull_request: - branches: - - main - - push: - branches: - - main - - workflow_dispatch: - -permissions: - contents: read - -jobs: - animation-splitter: - name: Animation splitter - runs-on: ubuntu-latest - - strategy: - matrix: - include: - - python-version: 3.11 - - python-version: 3.14 - - steps: - - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: ${{ matrix.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - name: Set up Frekvens tools - run: pip install tools/ - - - name: Animation splitter - run: | - cat < Animation.csv - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 - 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - EOL - - python -m frekvens.AnimationSplitter --input Animation.csv - - - name: File existence - uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 - with: - fail: true - files: Animation-1.csv, Animation-2.csv - - art-net-streamer: - name: Art-Net streamer - runs-on: ubuntu-latest - - strategy: - matrix: - include: - - python-version: 3.11 - - python-version: 3.14 - - steps: - - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: ${{ matrix.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - name: Set up Frekvens tools - run: pip install tools/ - - - name: Animation - run: | - cat < Animation.csv - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 - 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - EOL - - set +e - OUTPUT=$(python -m frekvens.ArtNetStreamer --host localhost --input Animation.csv 2>&1) - STATUS=$? - echo "$OUTPUT" - if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then - echo "Expected ConnectError occurred." - exit 0 - fi - echo "Unexpected error or no error." - exit $STATUS - - - name: Drawing - run: | - cat < Drawing.csv - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 - 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - EOL - - set +e - OUTPUT=$(python -m frekvens.ArtNetStreamer --host localhost --input Drawing.csv 2>&1) - STATUS=$? - echo "$OUTPUT" - if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then - echo "Expected ConnectError occurred." - exit 0 - fi - echo "Unexpected error or no error." - exit $STATUS - - distributed-display-protocol-streamer: - name: Distributed Display Protocol streamer - runs-on: ubuntu-latest - - strategy: - matrix: - include: - - python-version: 3.11 - - python-version: 3.14 - - steps: - - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: ${{ matrix.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - name: Set up Frekvens tools - run: pip install tools/ - - - name: Animation - run: | - cat < Animation.csv - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 - 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - EOL - - set +e - OUTPUT=$(python -m frekvens.DistributedDisplayProtocolStreamer --host localhost --input Animation.csv 2>&1) - STATUS=$? - echo "$OUTPUT" - if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then - echo "Expected ConnectError occurred." - exit 0 - fi - echo "Unexpected error or no error." - exit $STATUS - - - name: Drawing - run: | - cat < Drawing.csv - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 - 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - EOL - - set +e - OUTPUT=$(python -m frekvens.DistributedDisplayProtocolStreamer --host localhost --input Drawing.csv 2>&1) - STATUS=$? - echo "$OUTPUT" - if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then - echo "Expected ConnectError occurred." - exit 0 - fi - echo "Unexpected error or no error." - exit $STATUS - - e131-streamer: - name: E1.31 streamer - runs-on: ubuntu-latest - - strategy: - matrix: - include: - - python-version: 3.11 - - python-version: 3.14 - - steps: - - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: ${{ matrix.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - name: Set up Frekvens tools - run: pip install tools/ - - - name: Animation - run: | - cat < Animation.csv - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 - 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - EOL - - set +e - OUTPUT=$(python -m frekvens.E131Streamer --host localhost --input Animation.csv 2>&1) - STATUS=$? - echo "$OUTPUT" - if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then - echo "Expected ConnectError occurred." - exit 0 - fi - echo "Unexpected error or no error." - exit $STATUS - - - name: Drawing - run: | - cat < Drawing.csv - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 - 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - EOL - - set +e - OUTPUT=$(python -m frekvens.E131Streamer --host localhost --input Drawing.csv 2>&1) - STATUS=$? - echo "$OUTPUT" - if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then - echo "Expected ConnectError occurred." - exit 0 - fi - echo "Unexpected error or no error." - exit $STATUS - - font-generator: - name: Font generator - runs-on: ubuntu-latest - - strategy: - matrix: - include: - - python-version: 3.11 - - python-version: 3.14 - - steps: - - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: ${{ matrix.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - name: Set up Frekvens extra - run: pip install -r extra/Python/requirements.txt - - - name: Font generator - run: python extra/Python/FontGenerator.py --input DejaVuSans --size 8 - - - name: File existence - uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 - with: - fail: true - files: DejaVuSansFont.cpp, DejaVuSansFont.h - - home-thermometer-demo: - name: Home thermometer demo - runs-on: ubuntu-latest - - strategy: - matrix: - include: - - python-version: 3.11 - - python-version: 3.14 - - steps: - - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: ${{ matrix.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - name: Set up Frekvens tools - run: pip install tools/ - - - name: Home thermometer demo - run: | - set +e - OUTPUT=$(python -m frekvens.HomeThermometerDemo --host localhost --indoor=22 --outdoor=8 2>&1) - STATUS=$? - echo "$OUTPUT" - if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then - echo "Expected ConnectError occurred." - exit 0 - fi - echo "Unexpected error or no error." - exit $STATUS - - mode-generator-animation: - name: Mode generator - runs-on: ubuntu-latest - - strategy: - matrix: - include: - - python-version: 3.11 - - python-version: 3.14 - - steps: - - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: ${{ matrix.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - name: Animation - run: | - cat < Animation.csv - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 - 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - EOL - - python extra/Python/ModeGenerator.py --input Animation.csv - - - name: File existence - uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 - with: - fail: true - files: AnimationMode.cpp, AnimationMode.h - - - name: Drawing - run: | - cat < Drawing.csv - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0 - 0,0,0,255,255,255,0,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0 - 0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0 - 0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - EOL - - python extra/Python/ModeGenerator.py --input Drawing.csv - - - name: File existence - uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 - with: - fail: true - files: DrawingMode.cpp, DrawingMode.h - - x509_crt_bundle: - name: x509 certificate bundle - runs-on: ubuntu-latest - - strategy: - matrix: - include: - - python-version: 3.11 - - python-version: 3.13 - - steps: - - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: ${{ matrix.python-version }} - - - name: Set up Frekvens - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - - name: Weather - continue-on-error: true - run: | - cat < .env - HOSTNAME='frekvens' - IKEA_FREKVENS='true' - MODE_GOOGLEWEATHER='true' - MODE_OPENMETEO='true' - MODE_OPENWEATHER='true' - MODE_WORLDWEATHERONLINE='true' - MODE_WTTRIN='true' - MODE_YR='true' - NAME='Frekvens' - EOL - - cat < firmware/include/config/secrets.h - #pragma once - #define GOOGLEWEATHER_KEY "redacted" - #define LATITUDE "0.000" - #define LONGITUDE "0.000" - #define OPENWEATHER_KEY "redacted" - #define PIN_CS 1 - #define PIN_MOSI 2 - #define PIN_OE 3 - #define PIN_SCLK 4 - #define WIFI_KEY "redacted" - #define WIFI_SSID "redacted" - #define WORLDWEATHERONLINE_KEY "redacted" - EOL - - pio run --environment esp32dev - - - name: File existence - uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 - with: - fail: true - files: firmware/certs/bundle/ca_roots.pem, firmware/embed/x509_crt_bundle.bin - - - name: Set up ESP-IDF - run: | - git clone --branch release/v5.5 --filter=blob:none --sparse https://github.com/espressif/esp-idf.git - cd esp-idf - git sparse-checkout add components/mbedtls/esp_crt_bundle - - - name: Certificate bundle - run: | - python esp-idf/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py --input firmware/certs/bundle - if cmp x509_crt_bundle firmware/embed/x509_crt_bundle.bin; then - echo "Root CA bundles identical." - exit 0 - fi - echo "Unexpected error or file mismatch." - exit 1 From 9800aa54666cb21ea9b69192fe9123bd426ca485 Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Wed, 7 Jan 2026 11:58:06 +0100 Subject: [PATCH 16/20] PlatformIO cache path tuning --- .../workflows/ikea-frekvens-led-multi-use-light.yml | 12 ++++++++---- .github/workflows/ikea-obegransad-led-wall-lamp.yml | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ikea-frekvens-led-multi-use-light.yml b/.github/workflows/ikea-frekvens-led-multi-use-light.yml index a0670334..53755b12 100644 --- a/.github/workflows/ikea-frekvens-led-multi-use-light.yml +++ b/.github/workflows/ikea-frekvens-led-multi-use-light.yml @@ -87,7 +87,8 @@ jobs: with: key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} path: | - .pio/libdeps + .platformio/.cache/downloads + .platformio/.cache/http .platformio/packages .platformio/penv/Lib/site-packages .platformio/platforms @@ -142,7 +143,8 @@ jobs: with: key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} path: | - .pio/libdeps + .platformio/.cache/downloads + .platformio/.cache/http .platformio/packages .platformio/penv/Lib/site-packages .platformio/platforms @@ -218,7 +220,8 @@ jobs: with: key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} path: | - .pio/libdeps + .platformio/.cache/downloads + .platformio/.cache/http .platformio/packages .platformio/penv/Lib/site-packages .platformio/platforms @@ -363,7 +366,8 @@ jobs: with: key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} path: | - .pio/libdeps + .platformio/.cache/downloads + .platformio/.cache/http .platformio/packages .platformio/penv/Lib/site-packages .platformio/platforms diff --git a/.github/workflows/ikea-obegransad-led-wall-lamp.yml b/.github/workflows/ikea-obegransad-led-wall-lamp.yml index 208efe31..5c50f1a2 100644 --- a/.github/workflows/ikea-obegransad-led-wall-lamp.yml +++ b/.github/workflows/ikea-obegransad-led-wall-lamp.yml @@ -87,7 +87,8 @@ jobs: with: key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} path: | - .pio/libdeps + .platformio/.cache/downloads + .platformio/.cache/http .platformio/packages .platformio/penv/Lib/site-packages .platformio/platforms @@ -141,7 +142,8 @@ jobs: with: key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} path: | - .pio/libdeps + .platformio/.cache/downloads + .platformio/.cache/http .platformio/packages .platformio/penv/Lib/site-packages .platformio/platforms @@ -216,7 +218,8 @@ jobs: with: key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} path: | - .pio/libdeps + .platformio/.cache/downloads + .platformio/.cache/http .platformio/packages .platformio/penv/Lib/site-packages .platformio/platforms @@ -358,7 +361,8 @@ jobs: with: key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} path: | - .pio/libdeps + .platformio/.cache/downloads + .platformio/.cache/http .platformio/packages .platformio/penv/Lib/site-packages .platformio/platforms From f43847550183f40002314e42a6c6c335f64c9960 Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Wed, 7 Jan 2026 12:48:55 +0100 Subject: [PATCH 17/20] Cache tuning --- .../ikea-frekvens-led-multi-use-light.yml | 40 ++++++++----------- .../ikea-obegransad-led-wall-lamp.yml | 40 ++++++++----------- .github/workflows/miscellaneous.yml | 12 +++++- .github/workflows/stream.yml | 4 +- 4 files changed, 45 insertions(+), 51 deletions(-) diff --git a/.github/workflows/ikea-frekvens-led-multi-use-light.yml b/.github/workflows/ikea-frekvens-led-multi-use-light.yml index 53755b12..45c50c49 100644 --- a/.github/workflows/ikea-frekvens-led-multi-use-light.yml +++ b/.github/workflows/ikea-frekvens-led-multi-use-light.yml @@ -77,7 +77,9 @@ jobs: with: python-version: ${{ matrix.toolchain.python-version }} cache: pip - cache-dependency-path: .github/platformio/requirements.txt + cache-dependency-path: | + .github/platformio/requirements.txt + scripts/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt @@ -85,14 +87,10 @@ jobs: - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - .platformio/packages - .platformio/penv/Lib/site-packages - .platformio/platforms - .platformio/tools - name: PlatformIO build run: | @@ -133,7 +131,9 @@ jobs: with: python-version: ${{ matrix.toolchain.python-version }} cache: pip - cache-dependency-path: .github/platformio/requirements.txt + cache-dependency-path: | + .github/platformio/requirements.txt + scripts/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt @@ -141,14 +141,10 @@ jobs: - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - .platformio/packages - .platformio/penv/Lib/site-packages - .platformio/platforms - .platformio/tools - name: PlatformIO build run: | @@ -210,7 +206,9 @@ jobs: with: python-version: ${{ matrix.toolchain.python-version }} cache: pip - cache-dependency-path: .github/platformio/requirements.txt + cache-dependency-path: | + .github/platformio/requirements.txt + scripts/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt @@ -218,14 +216,10 @@ jobs: - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - .platformio/packages - .platformio/penv/Lib/site-packages - .platformio/platforms - .platformio/tools - name: PlatformIO build run: | @@ -356,7 +350,9 @@ jobs: with: python-version: ${{ matrix.toolchain.python-version }} cache: pip - cache-dependency-path: .github/platformio/requirements.txt + cache-dependency-path: | + .github/platformio/requirements.txt + scripts/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt @@ -364,14 +360,10 @@ jobs: - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - .platformio/packages - .platformio/penv/Lib/site-packages - .platformio/platforms - .platformio/tools - name: PlatformIO build run: | diff --git a/.github/workflows/ikea-obegransad-led-wall-lamp.yml b/.github/workflows/ikea-obegransad-led-wall-lamp.yml index 5c50f1a2..3436cafe 100644 --- a/.github/workflows/ikea-obegransad-led-wall-lamp.yml +++ b/.github/workflows/ikea-obegransad-led-wall-lamp.yml @@ -77,7 +77,9 @@ jobs: with: python-version: ${{ matrix.toolchain.python-version }} cache: pip - cache-dependency-path: .github/platformio/requirements.txt + cache-dependency-path: | + .github/platformio/requirements.txt + scripts/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt @@ -85,14 +87,10 @@ jobs: - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - .platformio/packages - .platformio/penv/Lib/site-packages - .platformio/platforms - .platformio/tools - name: PlatformIO build run: | @@ -132,7 +130,9 @@ jobs: with: python-version: ${{ matrix.toolchain.python-version }} cache: pip - cache-dependency-path: .github/platformio/requirements.txt + cache-dependency-path: | + .github/platformio/requirements.txt + scripts/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt @@ -140,14 +140,10 @@ jobs: - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - .platformio/packages - .platformio/penv/Lib/site-packages - .platformio/platforms - .platformio/tools - name: PlatformIO build run: | @@ -208,7 +204,9 @@ jobs: with: python-version: ${{ matrix.toolchain.python-version }} cache: pip - cache-dependency-path: .github/platformio/requirements.txt + cache-dependency-path: | + .github/platformio/requirements.txt + scripts/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt @@ -216,14 +214,10 @@ jobs: - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - .platformio/packages - .platformio/penv/Lib/site-packages - .platformio/platforms - .platformio/tools - name: PlatformIO build run: | @@ -351,7 +345,9 @@ jobs: with: python-version: ${{ matrix.toolchain.python-version }} cache: pip - cache-dependency-path: .github/platformio/requirements.txt + cache-dependency-path: | + .github/platformio/requirements.txt + scripts/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt @@ -359,14 +355,10 @@ jobs: - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.toolchain.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - .platformio/packages - .platformio/penv/Lib/site-packages - .platformio/platforms - .platformio/tools - name: PlatformIO build run: | diff --git a/.github/workflows/miscellaneous.yml b/.github/workflows/miscellaneous.yml index 264d431d..a496891a 100644 --- a/.github/workflows/miscellaneous.yml +++ b/.github/workflows/miscellaneous.yml @@ -144,11 +144,21 @@ jobs: with: python-version: ${{ matrix.python-version }} cache: pip - cache-dependency-path: tools/pyproject.toml + cache-dependency-path: | + .github/platformio/requirements.txt + scripts/requirements.txt - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 + with: + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + path: | + .platformio/.cache/downloads + .platformio/.cache/http + - name: PlatformIO build continue-on-error: true run: | diff --git a/.github/workflows/stream.yml b/.github/workflows/stream.yml index 5a384eee..d2f64ea8 100644 --- a/.github/workflows/stream.yml +++ b/.github/workflows/stream.yml @@ -20,7 +20,7 @@ permissions: jobs: animation: - name: Animation streamer + name: Animation runs-on: ubuntu-latest strategy: @@ -96,7 +96,7 @@ jobs: exit $STATUS drawing: - name: Drawing streamer + name: Drawing runs-on: ubuntu-latest strategy: From 172fe6c85eb12b107d4009fffb59bb49d06fc553 Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Wed, 7 Jan 2026 13:34:50 +0100 Subject: [PATCH 18/20] Cache tuning + reorder steps --- .../ikea-frekvens-led-multi-use-light.yml | 32 +++++++++---------- .../ikea-obegransad-led-wall-lamp.yml | 32 +++++++++---------- .github/workflows/miscellaneous.yml | 8 ++--- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/.github/workflows/ikea-frekvens-led-multi-use-light.yml b/.github/workflows/ikea-frekvens-led-multi-use-light.yml index 45c50c49..4547a5d1 100644 --- a/.github/workflows/ikea-frekvens-led-multi-use-light.yml +++ b/.github/workflows/ikea-frekvens-led-multi-use-light.yml @@ -81,17 +81,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: PlatformIO build run: | echo "IKEA_FREKVENS='true'" >> .env @@ -135,17 +135,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: PlatformIO build run: | cat <<'EOL' > .env @@ -210,17 +210,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: PlatformIO build run: | cat <<'EOL' > .env @@ -354,17 +354,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: PlatformIO build run: | cat <<'EOL' > .env diff --git a/.github/workflows/ikea-obegransad-led-wall-lamp.yml b/.github/workflows/ikea-obegransad-led-wall-lamp.yml index 3436cafe..ede764aa 100644 --- a/.github/workflows/ikea-obegransad-led-wall-lamp.yml +++ b/.github/workflows/ikea-obegransad-led-wall-lamp.yml @@ -81,17 +81,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: PlatformIO build run: | echo "IKEA_OBEGRANSAD='true'" >> .env @@ -134,17 +134,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: PlatformIO build run: | cat <<'EOL' > .env @@ -208,17 +208,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: PlatformIO build run: | cat <<'EOL' > .env @@ -349,17 +349,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: PlatformIO build run: | cat <<'EOL' > .env diff --git a/.github/workflows/miscellaneous.yml b/.github/workflows/miscellaneous.yml index a496891a..f4507c41 100644 --- a/.github/workflows/miscellaneous.yml +++ b/.github/workflows/miscellaneous.yml @@ -148,17 +148,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ matrix.python-version }}-${{ hashFiles('.github/platformio/requirements.txt', 'scripts/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: PlatformIO build continue-on-error: true run: | From 5095de5cee0607d21d9c02231f35dc901fd5becf Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Thu, 8 Jan 2026 15:46:58 +0100 Subject: [PATCH 19/20] PlatformIO cache optimizations + minor bash script refactoring --- .../ikea-frekvens-led-multi-use-light.yml | 46 +++++++-------- .../workflows/ikea-frekvens-led-spotlight.yml | 12 ++-- .../ikea-obegransad-led-wall-lamp.yml | 48 +++++++-------- .github/workflows/miscellaneous.yml | 59 +++++++++++-------- .github/workflows/stream.yml | 28 ++------- 5 files changed, 92 insertions(+), 101 deletions(-) diff --git a/.github/workflows/ikea-frekvens-led-multi-use-light.yml b/.github/workflows/ikea-frekvens-led-multi-use-light.yml index 4547a5d1..7b6717f9 100644 --- a/.github/workflows/ikea-frekvens-led-multi-use-light.yml +++ b/.github/workflows/ikea-frekvens-led-multi-use-light.yml @@ -20,10 +20,11 @@ permissions: jobs: platformio: - name: PlatformIO environments + name: PlatformIO variable extract runs-on: ubuntu-latest outputs: - environments: ${{ steps.pio.outputs.environments }} + environments: ${{ steps.print.outputs.environments }} + version: ${{ steps.print.outputs.version }} steps: - name: Set up Frekvens @@ -39,12 +40,11 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt - - name: Export PlatformIO environments - id: pio + - name: PlatformIO extract + id: print run: | - echo "environments=$(pio project config --json-output \ - | jq -c '[.[] | .[0] | select(startswith("env:")) | sub("^env:"; "")]')" \ - >> "$GITHUB_OUTPUT" + echo "environments=$(pio project config --json-output | jq -c '[.[] | .[0] | select(startswith("env:")) | sub("^env:"; "")]')" >> "$GITHUB_OUTPUT" + echo "version=$(pio --version | awk '{print $NF}')" >> "$GITHUB_OUTPUT" default: name: Default build @@ -81,17 +81,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ needs.platformio.outputs.version }}-${{ hashFiles('platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: PlatformIO build run: | echo "IKEA_FREKVENS='true'" >> .env @@ -135,17 +135,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ needs.platformio.outputs.version }}-${{ hashFiles('platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: PlatformIO build run: | cat <<'EOL' > .env @@ -210,17 +210,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ needs.platformio.outputs.version }}-${{ hashFiles('platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: PlatformIO build run: | cat <<'EOL' > .env @@ -354,17 +354,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ needs.platformio.outputs.version }}-${{ hashFiles('platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: PlatformIO build run: | cat <<'EOL' > .env diff --git a/.github/workflows/ikea-frekvens-led-spotlight.yml b/.github/workflows/ikea-frekvens-led-spotlight.yml index cbc19b49..010ce82f 100644 --- a/.github/workflows/ikea-frekvens-led-spotlight.yml +++ b/.github/workflows/ikea-frekvens-led-spotlight.yml @@ -20,21 +20,19 @@ permissions: jobs: esphome: - name: ESPHome minimum version + name: ESPHome minimum version extract runs-on: ubuntu-latest outputs: - min_version: ${{ steps.yaml.outputs.min_version }} + min_version: ${{ steps.print.outputs.min_version }} steps: - name: Set up Frekvens uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - name: Export ESPHome minimum version - id: yaml + - name: Extract ESPHome minimum version + id: print run: | - echo "min_version=$(grep " min_version:" "extra/IKEA-Frekvens-LED-spotlight/esphome.yaml" \ - | cut -d '"' -f 2)" \ - >> "$GITHUB_OUTPUT" + echo "min_version=$(grep " min_version:" "extra/IKEA-Frekvens-LED-spotlight/esphome.yaml" | cut -d '"' -f 2)" >> "$GITHUB_OUTPUT" ikea-frekvens-led-spotlight: name: ESPHome build diff --git a/.github/workflows/ikea-obegransad-led-wall-lamp.yml b/.github/workflows/ikea-obegransad-led-wall-lamp.yml index ede764aa..5ee5a929 100644 --- a/.github/workflows/ikea-obegransad-led-wall-lamp.yml +++ b/.github/workflows/ikea-obegransad-led-wall-lamp.yml @@ -20,10 +20,11 @@ permissions: jobs: platformio: - name: PlatformIO environments + name: PlatformIO variable extract runs-on: ubuntu-latest outputs: - environments: ${{ steps.pio.outputs.environments }} + environments: ${{ steps.print.outputs.environments }} + version: ${{ steps.print.outputs.version }} steps: - name: Set up Frekvens @@ -39,12 +40,11 @@ jobs: - name: Set up PlatformIO run: pip install -r .github/platformio/requirements.txt - - name: Export PlatformIO environments - id: pio + - name: PlatformIO extract + id: print run: | - echo "environments=$(pio project config --json-output \ - | jq -c '[.[] | .[0] | select(startswith("env:")) | sub("^env:"; "")]')" \ - >> "$GITHUB_OUTPUT" + echo "environments=$(pio project config --json-output | jq -c '[.[] | .[0] | select(startswith("env:")) | sub("^env:"; "")]')" >> "$GITHUB_OUTPUT" + echo "version=$(pio --version | awk '{print $NF}')" >> "$GITHUB_OUTPUT" default: name: Default build @@ -81,17 +81,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ needs.platformio.outputs.version }}-${{ hashFiles('platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: PlatformIO build run: | echo "IKEA_OBEGRANSAD='true'" >> .env @@ -134,17 +134,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ needs.platformio.outputs.version }}-${{ hashFiles('platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: PlatformIO build run: | cat <<'EOL' > .env @@ -208,17 +208,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ needs.platformio.outputs.version }}-${{ hashFiles('platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: PlatformIO build run: | cat <<'EOL' > .env @@ -349,18 +349,18 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ needs.platformio.outputs.version }}-${{ hashFiles('platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - - name: PlatformIO build + - name: PlatformIO build' run: | cat <<'EOL' > .env EXTENSION_ALEXA='true' diff --git a/.github/workflows/miscellaneous.yml b/.github/workflows/miscellaneous.yml index f4507c41..c4fd03aa 100644 --- a/.github/workflows/miscellaneous.yml +++ b/.github/workflows/miscellaneous.yml @@ -19,6 +19,31 @@ permissions: contents: read jobs: + platformio: + name: PlatformIO version extract + runs-on: ubuntu-latest + outputs: + environments: ${{ steps.print.outputs.environments }} + version: ${{ steps.print.outputs.version }} + + steps: + - name: Set up Frekvens + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: 3.13 + cache: pip + cache-dependency-path: .github/platformio/requirements.txt + + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + + - name: PlatformIO extract + id: print + run: echo "version=$(pio --version | awk '{print $NF}')" >> "$GITHUB_OUTPUT" + animation-splitter: name: Animation splitter runs-on: ubuntu-latest @@ -113,20 +138,11 @@ jobs: run: pip install tools/ - name: Home thermometer demo - run: | - set +e - OUTPUT=$(python -m frekvens.HomeThermometerDemo --host localhost --indoor=22 --outdoor=8 2>&1) - STATUS=$? - echo "$OUTPUT" - if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then - echo "Expected ConnectError occurred." - exit 0 - fi - echo "Unexpected error or no error." - exit $STATUS + run: python -m frekvens.HomeThermometerDemo --host localhost --indoor=22 --outdoor=8 2>&1 | grep "httpx.ConnectError" x509_crt_bundle: name: x509 certificate bundle + needs: platformio runs-on: ubuntu-latest strategy: @@ -148,17 +164,17 @@ jobs: .github/platformio/requirements.txt scripts/requirements.txt + - name: Set up PlatformIO + run: pip install -r .github/platformio/requirements.txt + - name: Set up Cache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: - key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/platformio/requirements.txt', 'platformio.ini') }} + key: platformio-cache-${{ runner.os }}-${{ runner.arch }}-${{ needs.platformio.outputs.version }}-${{ hashFiles('platformio.ini') }} path: | .platformio/.cache/downloads .platformio/.cache/http - - name: Set up PlatformIO - run: pip install -r .github/platformio/requirements.txt - - name: PlatformIO build continue-on-error: true run: | @@ -199,16 +215,11 @@ jobs: - name: Set up ESP-IDF run: | - git clone -b release/v5.5 --filter=blob:none --sparse https://github.com/espressif/esp-idf.git - cd esp-idf + git clone -b release/v5.5 --filter=blob:none --sparse https://github.com/espressif/esp-idf.git && \ + cd esp-idf && \ git sparse-checkout add components/mbedtls/esp_crt_bundle - name: Certificate bundle run: | - python esp-idf/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py --i firmware/certs/bundle - if cmp x509_crt_bundle firmware/embed/x509_crt_bundle.bin; then - echo "Root CA bundles identical." - exit 0 - fi - echo "Unexpected error or file mismatch." - exit 1 + python esp-idf/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py --i firmware/certs/bundle && \ + cmp x509_crt_bundle firmware/embed/x509_crt_bundle.bin diff --git a/.github/workflows/stream.yml b/.github/workflows/stream.yml index d2f64ea8..065b2d57 100644 --- a/.github/workflows/stream.yml +++ b/.github/workflows/stream.yml @@ -26,9 +26,9 @@ jobs: strategy: matrix: module: - - frekvens.ArtNetStreamer - - frekvens.DistributedDisplayProtocolStreamer - - frekvens.E131Streamer + - ArtNetStreamer + - DistributedDisplayProtocolStreamer + - E131Streamer toolchain: - python-version: 3.11 - python-version: 3.14 @@ -84,16 +84,7 @@ jobs: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 EOL - set +e - OUTPUT=$(python -m ${{ matrix.module }} --host localhost -i Animation.csv 2>&1) - STATUS=$? - echo "$OUTPUT" - if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then - echo "Expected ConnectError occurred." - exit 0 - fi - echo "Unexpected error or no error." - exit $STATUS + python -m frekvens.${{ matrix.module }} --host localhost -i Animation.csv 2>&1 | grep "httpx.ConnectError" drawing: name: Drawing @@ -144,13 +135,4 @@ jobs: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 EOL - set +e - OUTPUT=$(python -m ${{ matrix.module }} --host localhost -i Drawing.csv 2>&1) - STATUS=$? - echo "$OUTPUT" - if echo "$OUTPUT" | grep -q "httpx.ConnectError"; then - echo "Expected ConnectError occurred." - exit 0 - fi - echo "Unexpected error or no error." - exit $STATUS + python -m frekvens.${{ matrix.module }} --host localhost -i Drawing.csv 2>&1 | grep "httpx.ConnectError" From 42243b559bbc343e47e5174950231b64506c40cf Mon Sep 17 00:00:00 2001 From: Jan-Petter Gundersen Date: Thu, 8 Jan 2026 17:18:30 +0100 Subject: [PATCH 20/20] Fix streaming tests + switch to peterus/platformio_dependabot --- .github/workflows/{dependabot-pio.yml => platformio.yml} | 6 +++--- .github/workflows/stream.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) rename .github/workflows/{dependabot-pio.yml => platformio.yml} (70%) diff --git a/.github/workflows/dependabot-pio.yml b/.github/workflows/platformio.yml similarity index 70% rename from .github/workflows/dependabot-pio.yml rename to .github/workflows/platformio.yml index b00100b0..ae64db39 100644 --- a/.github/workflows/dependabot-pio.yml +++ b/.github/workflows/platformio.yml @@ -1,4 +1,4 @@ -name: PlatformIO Dependabot +name: PlatformIO on: schedule: @@ -13,12 +13,12 @@ permissions: jobs: dependabot: runs-on: ubuntu-latest - name: PlatformIO Dependabot + name: Dependabot steps: - name: Set up Frekvens uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: PlatformIO dependabot - uses: JanPetterMG/platformio_dependabot@d52a00e84a5eac4e52b90ed3b26647496544fae8 # python313 + uses: peterus/platformio_dependabot@ee459e446a090c4894b1354a3b85bc064797fd2b # v1.2.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/stream.yml b/.github/workflows/stream.yml index 065b2d57..bf1ce9f3 100644 --- a/.github/workflows/stream.yml +++ b/.github/workflows/stream.yml @@ -93,9 +93,9 @@ jobs: strategy: matrix: module: - - frekvens.ArtNetStreamer - - frekvens.DistributedDisplayProtocolStreamer - - frekvens.E131Streamer + - ArtNetStreamer + - DistributedDisplayProtocolStreamer + - E131Streamer toolchain: - python-version: 3.11 - python-version: 3.14