5 Commits

Author SHA1 Message Date
b61de80e8a ci: Add placeholder appsettings.json and include index page 2025-07-20 23:56:53 +02:00
c53f6a3f77 fix: readme 2025-07-20 20:01:01 +02:00
7fe92790d7 fix: add better description of what this is 2025-07-20 20:00:05 +02:00
3b9d5bc984 fix: download link 2025-07-20 19:45:21 +02:00
a73f171102 fix: minor readme fix 2025-07-20 19:39:31 +02:00
2 changed files with 79 additions and 30 deletions

View File

@@ -3,7 +3,7 @@ name: Build and Deploy
on:
push:
branches:
- master # Change to your default branch if different
- master
workflow_dispatch:
inputs:
environment:
@@ -28,7 +28,7 @@ on:
jobs:
build:
runs-on: self-hosted # Ensure your self-hosted runner is configured
runs-on: self-hosted
environment: ${{ github.event.inputs.environment || 'prod' }}
steps:
- name: Get Current User
@@ -43,7 +43,7 @@ jobs:
- name: Set up .NET
uses: actions/setup-dotnet@v2
with:
dotnet-version: '9.0' # Change to your required .NET version
dotnet-version: '9.0'
- name: Restore .NET Dependencies
run: dotnet restore ./HomeApi.sln
@@ -75,19 +75,36 @@ jobs:
Write-Host "ChromeHeadlessShell not found in published output"
}
# Check wwwroot and manually copy if missing
- name: Ensure wwwroot is Included
run: |
if (-not (Test-Path -Path "./output/dotnet/wwwroot")) {
Write-Host "wwwroot folder not found in published output, manually copying..."
# Check if wwwroot exists in project directory
$sourceWwwroot = "./HomeApi/wwwroot"
if (Test-Path -Path $sourceWwwroot) {
Write-Host "Found wwwroot directory in source, copying..."
New-Item -ItemType Directory -Path "./output/dotnet/wwwroot" -Force
Copy-Item -Path "$sourceWwwroot/*" -Destination "./output/dotnet/wwwroot" -Recurse -Force
} else {
Write-Host "WARNING: Could not find wwwroot in source directory!"
}
}
- name: Generate SemVer version
if: ${{ github.event.inputs.create_release != 'false' }}
id: semver
uses: ietf-tools/semver-action@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
branch: master # ← change to "main" if that's your default
branch: master
patchAll: true
# fallbackTag: v0.0.1 # ← optionally bootstrap from an existing tag
- name: Create GitHub Release
if: ${{ github.event.inputs.create_release != 'false' }}
id: create_release # ← this is required
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -97,6 +114,46 @@ jobs:
draft: false
prerelease: false
- name: Create placeholder appsettings for release
if: ${{ github.event.inputs.create_release != 'false' }}
run: |
$appSettings = @{
Logging = @{
LogLevel = @{
Default = "Information"
"Microsoft.AspNetCore" = "Warning"
}
}
ApiConfiguration = @{
EspConfiguration = @{
InformationBoardImageUrl = "${{ vars.ESP_IMAGE_URL }}"
UpdateIntervalMinutes = [int]"${{ vars.ESP_UPDATE_INTERVAL }}"
BlackTextThreshold = [int]"${{ vars.ESP_BLACK_TEXT_THRESHOLD }}"
EnableDithering = [System.Convert]::ToBoolean("${{ vars.ESP_ENABLE_DITHERING }}")
DitheringStrength = [int]"${{ vars.ESP_DITHERING_STRENGTH }}"
EnhanceContrast = [System.Convert]::ToBoolean("${{ vars.ESP_ENHANCE_CONTRAST }}")
ContrastStrength = [int]"${{ vars.ESP_CONTRAST_STRENGTH }}"
IsHighContrastMode = [System.Convert]::ToBoolean("${{ vars.ESP_HIGH_CONTRAST_MODE }}")
}
Keys = @{
Weather = "SET THIS TO YOUR KEY"
ResRobot = "SET THIS TO YOUR KEY"
}
BaseUrls = @{
Nominatim = "${{ vars.NOMINATIM_URL }}"
Aurora = "${{ vars.AURORA_URL }}"
Weather = "${{ vars.WEATHER_URL }}"
ResRobot = "${{ vars.RES_ROBOT_URL }}"
}
DefaultCity = "CITY ADDRESS"
DefaultStation = "YOUR STATION"
}
AllowedHosts = "*"
}
$appSettings | ConvertTo-Json -Depth 10 | Set-Content -Path "./output/dotnet/appsettings.json"
Write-Host "Created placeholder appsettings.json successfully"
- name: Zip the build for github release
if: ${{ github.event.inputs.create_release != 'false' }}
run: Compress-Archive -Path './output/*' -DestinationPath './output/HomeScreen_Build_${{ steps.semver.outputs.next }}.zip' -CompressionLevel Optimal -Force
@@ -107,7 +164,7 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }} # ← now available
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./output/HomeScreen_Build_${{ steps.semver.outputs.next }}.zip
asset_name: HomeScreen_Build_${{ steps.semver.outputs.next }}.zip
asset_content_type: application/zip
@@ -151,24 +208,6 @@ jobs:
$appSettings | ConvertTo-Json -Depth 10 | Set-Content -Path "./output/dotnet/appsettings.json"
Write-Host "Generated appsettings.json successfully"
# Check wwwroot and manually copy if missing
- name: Ensure wwwroot is Included
run: |
if (-not (Test-Path -Path "./output/dotnet/wwwroot")) {
Write-Host "wwwroot folder not found in published output, manually copying..."
# Check if wwwroot exists in project directory
$sourceWwwroot = "./HomeApi/wwwroot"
if (Test-Path -Path $sourceWwwroot) {
Write-Host "Found wwwroot directory in source, copying..."
New-Item -ItemType Directory -Path "./output/dotnet/wwwroot" -Force
Copy-Item -Path "$sourceWwwroot/*" -Destination "./output/dotnet/wwwroot" -Recurse -Force
} else {
Write-Host "WARNING: Could not find wwwroot in source directory!"
}
}
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
@@ -176,7 +215,7 @@ jobs:
path: ./output/dotnet
deploy:
runs-on: self-hosted # Ensure your self-hosted runner is configured
runs-on: self-hosted
needs: build
environment: ${{ github.event.inputs.environment || 'prod' }}

View File

@@ -5,8 +5,18 @@
[![License](https://img.shields.io/badge/License-GPL-purple)](https://www.gnu.org/licenses/gpl-3.0.en.html)
[![issues - homescreen](https://img.shields.io/github/issues/myxelium/homescreen)](https://github.com/myxelium/homescreen/issues)
[![Build and Deploy](https://github.com/Myxelium/HomeScreen/actions/workflows/build.yml/badge.svg)](https://github.com/Myxelium/HomeScreen/actions/workflows/build.yml)
# This
Core api and [Esp32 (Microcontroller)](https://en.wikipedia.org/wiki/ESP32) code for displaying weather data and public transport information on a e-ink display.
# What why how
This is a project I created that pulls weather data from the internet, transforms it into custom images, and displays them on an e-ink screen powered by an ESP32.
## What This Project Does
I wanted a low-power way to see weather information at a glance, so I built this system that:
- Fetches real-time weather data from online APIs
- Processes and converts the data into visual images (temperature graphs, forecast icons, etc.)
- Sends these images wirelessly to an ESP32 microcontroller
- Displays the information on an energy-efficient e-ink screen
- Updates periodically while consuming minimal power
<img width="800" height="480" alt="image" src="https://github.com/user-attachments/assets/ef5af0c6-ea3a-494d-b2af-3de6e70b3e6a" />
@@ -120,7 +130,7 @@ end
# ESP32 configuration and building
<img width="4096" height="1842" alt="image" src="https://github.com/user-attachments/assets/5acf1b3b-f9bb-48bd-b310-a2852544eaba" />
Best way of getting the ESP32 ready for code upload is to follow this guide [https://web.archive.org/web/20250706150325/https://www.waveshare.com/wiki/E-Paper_ESP32_Driver_Board] (WAVESHARE ESP32 GUIDE).
Best way of getting the ESP32 ready for code upload is to follow this guide [WAVESHARE ESP32 GUIDE](https://web.archive.org/web/20250706150325/https://www.waveshare.com/wiki/E-Paper_ESP32_Driver_Board).
Once you have it ready so you can upload code to it copy my code in: Esp32_Code/INFOSCREEN_WITH_INTERVAL from this repo.
Install following libraries (if more is needed search for them and install them too):
@@ -128,4 +138,4 @@ Install following libraries (if more is needed search for them and install them
* GUI_Paint
* JPEGDEC
You need the Waveshare examples installed since it uses code from them. See above link to find the download.
You need the Waveshare examples installed since it uses code from them download them here [Download](https://files.waveshare.com/upload/5/50/E-Paper_ESP32_Driver_Board_Code.7z) or check above link.