Commit Graph
4354 Commits
Author SHA1 Message Date
k.rennerandClaude Opus 4.8 011fd02cc7 evcc: add tariffs (grid from HA price, fixed feed-in) + solar forecast
Completes the evcc energy-manager config beyond meters:
- grid tariff: type custom reading the MQTT topic evcc/tariff/gridprice,
  which an HA automation republishes from input_number.strompreis (HA
  stays the single source of truth for the grid price).
- feedin: fixed 0.08 EUR/kWh (from the HA Energy dashboard).
- solar: forecast.solar plane derived from the HA forecast_solar config
  (az 10 evcc / 60 deg tilt / 8.61 kWp at 49.49N, 11.76E).
- sponsor token left as a documented placeholder (not needed until a
  commercial charger loadpoint exists).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 19:34:01 +02:00
k.renner 8463dec39d Merge pull request 'evcc: publish state to MQTT for Home Assistant integration' (#108) from feat/evcc-mqtt-publish into master
Reviewed-on: gitea_admin/homelab#108
2026-07-04 18:56:06 +02:00
k.rennerandClaude Opus 4.8 ee6d55401d evcc: publish state to MQTT for Home Assistant integration
Grants the evcc Mosquitto user readwrite on evcc/# (keeping read
open3e/#) and sets an explicit publish topic (topic: evcc) so evcc
publishes its site state to MQTT. Previously the evcc user was
read-only on open3e/#, so evcc's state publishes were silently dropped
by the broker ACL.

HA reads these evcc/# topics via the full-access homeassistant user; a
packages/evcc.yaml sensor package (in the homeassistant repo) consumes
them, mirroring the open3e package pattern.

Note: applying this restarts the Mosquitto pod once (brief MQTT blip).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 14:53:10 +02:00
k.renner bae76de5d9 Merge pull request 'evcc: use E380 direct meter read for grid power' (#107) from fix/evcc-grid-e380 into master
Reviewed-on: gitea_admin/homelab#107
2026-07-03 23:00:17 +02:00
k.rennerandClaude Opus 4.8 1f95c47e90 evcc: use E380 direct meter read for grid power
Switches the grid meter from the VX3-relayed PCC digest (1603) to the
E380 utility meter read directly via E3onCAN (open3e/e380_0592_GridActivePower,
.Total). That is the household grid truth; the VX3 only relays it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 22:58:40 +02:00
k.renner 8b6d069c2e Merge pull request 'evcc: drop deprecated .k. ingress hostname' (#106) from fix/evcc-drop-k-hostname into master 2026-07-03 22:51:56 +02:00
k.rennerandClaude Opus 4.8 38fb29e52a evcc: drop deprecated .k. ingress hostname
The .k.renner.uno host is migration-era cruft and must not be used
anymore; evcc is served only on evcc.renner.uno.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 22:50:54 +02:00
k.renner bb9c8f1e2f Merge pull request 'evcc: meters-only dry-run reading the VX3 via open3e/MQTT' (#105) from feat/evcc-meters-dry-run into master
Reviewed-on: gitea_admin/homelab#105
2026-07-03 22:40:02 +02:00
k.rennerandClaude Opus 4.8 fa7c5f1dee evcc: meters-only dry-run reading the VX3 via open3e/MQTT
Deploys evcc (evcc.io) as a monitoring-only instance — no charger or
loadpoint yet — to validate the Vitocharge VX3 -> open3e -> MQTT energy
pipeline and get familiar with evcc ahead of a future wallbox.

evcc runs as a plain Deployment (house style, like gatus) with:
  - grid/PV/battery custom MQTT meters + battery SoC, reading the VX3
    open3e datapoints (grid 1603, PV 1690, battery power 1836, SoC 1664)
  - config delivered via a sops-encrypted Secret (mqtt password inline)
  - Traefik ingress on evcc.renner.uno / evcc.k.renner.uno
  - a 1Gi ceph-block PVC for evcc's SQLite state
  - a dedicated Flux Kustomization (clusters/homelab/evcc.yaml)
  - a per-namespace CiliumNetworkPolicy (evcc-ns.yaml)

MQTT: adds a scoped broker user `evcc` (read-only on open3e/#) to the
Mosquitto deployment, plus the reciprocal home-assistant-ns ingress rule
so evcc can reach mosquitto:1883 via ClusterIP. The password is a shared
sops value (evcc namespace + home-assistant namespace).

Note: applying this restarts the Mosquitto pod once (brief MQTT blip for
HA/open3e), because the broker's env/command changes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 22:35:33 +02:00
security-bot d9cd523aca chore(image-automation): bump ghcr.io/home-assistant/home-assistant:2026.7.1
Updates managed by image-automation-controller.
2026-07-03 19:13:34 +00:00
security-bot 45974b5e6e chore(image-automation): bump netbirdio/netbird:v0.74.2-rootless
Updates managed by image-automation-controller.
2026-07-03 15:52:57 +00:00
k.renner 4df748b1b8 Merge pull request 'edge-host: Mischer-Stellung Heizkreise 2/3 (DIDs 476/477)' (#104) from feat/open3e-mixer-position into master
Reviewed-on: gitea_admin/homelab#104
2026-07-03 15:28:24 +02:00
k.rennerandClaude Fable 5 8de80d1812 edge-host: Mischer-Stellung Heizkreise 2/3 pollen (DIDs 476/477)
MixerTwo/ThreeCircuitThreeWayValvePositionPercent (Setpoint/Actual %,
upstream-Dekode für Vitocal 250-A SW 2440, open3e Issue #191) für die
Mischer-Anzeige auf der Heizungsanlage-Karte. Beide DIDs antworten im
-a-Scan; Stock-vcal-Liste enthält sie, kein Overlay nötig.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 14:34:00 +02:00
k.renner ac24589b09 Merge pull request 'edge-host: WP-Leistung (2486-2488) + Batteriemodul-DIDs (vx3-Overlay)' (#103) from feat/open3e-backup-box-did into master
Reviewed-on: gitea_admin/homelab#103
2026-07-03 10:23:50 +02:00
k.rennerandClaude Fable 5 9649e296e6 edge-host: Batteriemodul-DIDs pollen (vx3 dpList-Overlay)
Die Stock-vx3-Datenpunktliste filtert unbekannte DIDs weg — Overlay
files/open3e-vx3plus.py fügt die per-Modul-DIDs mit Master-Codec
wieder hinzu (dpList als Pfad, Open3Eclass unterstützt .py-Dateien).
Gepollt werden 1577-1582 (OperatingData: 8x Temperatur, 15x Zell-
spannung je Modul) und 3085-3090 (Information: Modulspannung u. a.).
Am Bus verifiziert 2026-07-03 (alle 12 DIDs antworten auf 0x6a1).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:06:12 +02:00
k.rennerandClaude Fable 5 3c6b5c0bfb edge-host: vitocal.2486-2488 elektrische WP-Leistung in den Poll-Satz
CurrentElectricalPowerConsumption Kältekreis/Heizstab/System (W) —
gemessene WP-Leistung für die Schema-Karte (Fluss-Richtungen und
Leistungsanzeige am Backup-Strang).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 09:51:31 +02:00
k.renner 90d99b90ca Merge pull request 'edge-host: vx3.2214 BackupBoxConfiguration in den Poll-Satz' (#102) from feat/open3e-backup-box-did into master
Reviewed-on: gitea_admin/homelab#102
2026-07-03 06:30:15 +02:00
k.rennerandClaude Fable 5 0894f48c00 edge-host: vx3.2214 BackupBoxConfiguration in den Poll-Satz
Liefert das Entlade-Limit (SoC-Reserve) der Backup-Box für die
HA-Schema-Karte. Read-only wie der Rest des Satzes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 21:29:57 +02:00
k.renner 4ef5e4d23b Merge pull request 'edge-host: E3onCAN — read the E380 meter directly' (#101) from e380-direct into master
Reviewed-on: gitea_admin/homelab#101
2026-07-02 18:52:16 +02:00
k.rennerandClaude Fable 5 384bd54e8b edge-host: E3onCAN service — read the E380 meter directly
Passive listener (no bus writes, coexists with the single open3e
instance) decoding the E380's own CANopen broadcasts: per-phase active/
reactive power, currents + cosPhi, voltages + grid frequency, and the
meter's cumulated import/export counters — instead of trusting the
VX3's relayed values. Pinned to V0.5.2; ~5 Hz broadcasts throttled to
one MQTT update per DID per 10 s; JSON payloads under the open3e/
prefix with the shared broker user.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 18:46:06 +02:00
k.renner a4e86b43b5 Merge pull request 'retire k8s-edge: cluster cleanup after edge-1 cutover' (#100) from retire-k8s-edge into master
ci/woodpecker/push/deploy-infrastructure Pipeline was successful
ci/woodpecker/manual/deploy-infrastructure Pipeline was successful
Reviewed-on: gitea_admin/homelab#100
2026-07-02 18:22:07 +02:00
k.renner c520752fb8 Merge pull request 'edge-host: containers on host networking — no bridge, no NAT' (#99) from edge-docker-ipv6 into master
Reviewed-on: gitea_admin/homelab#99
2026-07-02 18:21:58 +02:00
k.rennerandClaude Fable 5 b4828b7e6c retire k8s-edge: remove zwave-js/sml2mqtt from cluster, VM 153, node patch
ci/woodpecker/push/deploy-infrastructure Pipeline was successful
The USB cutover to edge-1 is complete and verified (zwave-js serving HA
with 12 nodes via ws://edge-1.iot.renner.uno:3000, sml2mqtt publishing,
open3e polling 66 DIDs). Removes the home-assistant-zwavejs flux
kustomization + app dir, the sml2mqtt manifests, the zwave-js-ui image
automation, opentofu vm_153, the talos k8s-edge patch, and the worker
from bootstrap.sh. Mosquitto users/ACLs stay — edge-1 uses them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 18:17:48 +02:00
k.rennerandClaude Fable 5 d928f9fd9c edge-host: host networking for both containers — no bridge, no NAT
Per review: pass real addresses instead of NAT. zwave-js binds
3000/8091 on the host directly; sml2mqtt is outbound-only; the NAT66
daemon config and compose-network v6 experiment are removed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 18:09:18 +02:00
k.rennerandClaude Fable 5 180d4ac1c0 edge-host: sml2mqtt on host networking (docker NAT66 gap)
Bridge-network IPv6 SYNs to the AAAA-first broker LB leave without
masquerade and die; sml2mqtt is outbound-only, and the host stack
reaches the broker (open3e proves it). Daemon/network v6 kept for
future containers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 18:05:18 +02:00
k.rennerandClaude Fable 5 be3d5d7cb0 edge-host: compose network needs its own enable_ipv6
fixed-cidr-v6 only covers docker0; the compose-created network stayed
v4-only and sml2mqtt kept failing to reach the broker.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 18:00:52 +02:00
k.rennerandClaude Fable 5 c660af4685 edge-host: create /etc/docker before daemon.json (Arch has none)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 17:57:23 +02:00
k.rennerandClaude Fable 5 076008d52d edge-host: enable Docker IPv6 (sml2mqtt broker connect)
mqtt.renner.uno resolves AAAA-first; the default bridge has no IPv6 and
sml2mqtt does not fall back to A records — InitialMqttConnectionFailed
loop after the USB cutover. Same daemon-level IPv6+ULA+NAT66 fix as the
netbird-proxy role.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 17:54:56 +02:00
k.renner d923ef1a80 Merge pull request 'edge-host: open3e round 5 — heating-circuit DIDs (stacked on #97)' (#98) from open3e-round5 into master
Reviewed-on: gitea_admin/homelab#98
2026-07-02 16:39:04 +02:00
k.renner ee9f2cf140 Merge pull request 'edge-host: drop CAN RestartSec — gs_usb can't bus-off-restart' (#97) from fix/can0-restartsec into master
Reviewed-on: gitea_admin/homelab#97
2026-07-02 16:38:58 +02:00
k.rennerandClaude Fable 5 cc3b901e2e edge-host: round 5 — heating-circuit DIDs (66 total)
Adds circuits 2/3 (the configured ones on this Vitocal — Mixer One is
absent): supply temps 286/288, room temps 335/336 (radio room sensor
values as seen by the ECU), circuit pumps 402/403, operation states
1416/1417 (incl. frost-protection program state), DHW setpoint 396.
Closes the last cloud read dependencies (ViCare Vitodens entities are
unused clutter; everything actively referenced becomes local).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 16:30:40 +02:00
k.rennerandClaude Fable 5 f2ed4d4829 edge-host: drop CAN RestartSec — gs_usb can't bus-off-restart
networkd fails the entire can0 configuration on the unsupported option
("Device doesn't support restart from Bus Off") and never raises the
link — found by the reboot test; this, not a socket race, was also the
afternoon's "off (failed)". Bus-off recovery falls to open3e's service
restart loop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 16:10:44 +02:00
security-bot 08ac532d40 chore(image-automation): bump netbirdio/netbird:v0.74.1-rootless
Updates managed by image-automation-controller.
2026-07-02 13:52:30 +00:00
k.renner 6f519c07ac Merge pull request 'netbird: reverse-proxy watchdog (self-heal dead-route 502s)' (#93) from worktree-netbird-proxy-watchdog into master
ci/woodpecker/push/deploy-netbird-proxy Pipeline was successful
ci/woodpecker/push/deploy-netbird-server Pipeline was successful
Reviewed-on: gitea_admin/homelab#93
2026-07-02 15:27:32 +02:00
k.renner abce9c0d96 Merge pull request 'edge-host: open3e round 4 — 57 DIDs + MQTT command channel' (#96) from open3e-round4 into master
Reviewed-on: gitea_admin/homelab#96
2026-07-02 15:20:37 +02:00
k.rennerandClaude Fable 5 92f2ea8fd5 edge-host: round 4 — 57 DIDs + open3e MQTT command channel
Adds VCMU 320/355 circuit temps, heating pump 2791, and DHW quick-mode
state 1007 to the poll set, and enables -l open3e/cmnd on the unit: the
single sanctioned write path (DHW one-time charge via DID 1006, HA MQTT
switch). Still no -w flag, no service 0x77. Already deployed to edge-1.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 15:19:09 +02:00
k.renner dd63f372df Merge pull request 'ansible: edge-host role — bare-metal Arch N100 replaces k8s-edge VM' (#95) from edge-host-arch into master
ci/woodpecker/push/deploy-infrastructure Pipeline was successful
Reviewed-on: gitea_admin/homelab#95
2026-07-02 14:27:49 +02:00
k.rennerandClaude Fable 5 4a49470cd2 edge-host: open3e dir owned by service user (udsoncan log file)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 14:23:26 +02:00
k.rennerandClaude Fable 5 9e03cfa213 edge-host: force can0 up via ActivationPolicy=always-up
networkd applies [CAN] bitrate but does not raise the link by itself;
also make the handler reconfigure after reload (reload alone leaves
existing links untouched).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 14:16:50 +02:00
k.rennerandClaude Fable 5 46152c0bdf edge-host: pip module needs python-packaging on the target
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 14:12:50 +02:00
k.rennerandClaude Fable 5 89da3ef0d4 edge-host: don't abort the play on not-yet-moved USB devices
The cutover order moves devices one at a time; a compose service whose
stick is still on the old VM must not block open3e installation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 14:10:56 +02:00
k.rennerandClaude Fable 5 f8d6025048 edge-host: edge-1 lives on the IoT VLAN — fix inventory FQDN
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 14:07:18 +02:00
k.rennerandClaude Fable 5 244929fff2 edge-host-iso: pin mmc modules into the installed initramfs
mkinitcpio's autodetect missed the eMMC stack in the chroot; the
installed system hung unbootable with root on mmcblk0p2. Pin
sdhci_acpi/sdhci_pci/mmc_block in MODULES and regenerate during install.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 13:48:19 +02:00
k.rennerandClaude Fable 5 ecadc983be edge-host: poll the VCMU (0x68c) refrigerant-circuit ECU — 53 DIDs total
Adds suction/discharge pressure, superheat, EEV positions, fan speeds,
compressor rps, four-way valve + circuit status, evaporator/economizer/
oil temps and defrost energy target, discovered via depictSystem ECU
census + full VCMU DID scan.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 13:37:11 +02:00
k.rennerandClaude Fable 5 ed80d83a73 edge-host-iso: fix eMMC detection on the Wyse 3040
The live env detects the eMMC card (sdhci_acpi) but does not autoload
mmc_block, so /dev/mmcblk0 never appears and edge-install finds no
target. Autoload via modules-load.d, belt-and-braces modprobe in
edge-install, check mmcblk0-2, and fix the lsblk fallback (empty TRAN
column shifted the awk fields).

Diagnosed live over SSH on the actual 3040 (10.2.50.109).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 13:36:08 +02:00
k.rennerandClaude Fable 5 4576c2d13d edge-host: extend open3e datapoint set to 39 DIDs
Adds PV energy counters (1802, Energy dashboard solar slot), battery
power/energy/temperature and dynamic charge limits, heating/DHW energy
split (electric in, thermal out — live COP), compressor modulation and
starts/hours, refrigerant inlet/outlet temps, buffer temp, DHW + valve
states. Selected from the full DID scans (539+189 DPs).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 12:55:14 +02:00
k.rennerandClaude Fable 5 81dc3d0a85 edge-host-iso: headless install support + internal-disk autodetect
Target changed from N100 to a Wyse 3040 (2G RAM / 8G eMMC): default
disk is now autodetected (nvme, else mmcblk0, else first non-USB disk)
and the live environment carries the homelab SSH keys, so the install
runs over SSH without a monitor (firmware boot-order/Secure-Boot still
needs one console visit if not already set).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 12:42:40 +02:00
k.rennerandClaude Fable 5 5586f4bfee edge-host: open3e must publish JSON payloads (-j)
Without -j open3e flattens complex DIDs into per-key subtopics; the HA
package parses value_json on the base topic and receives nothing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 12:38:01 +02:00
k.rennerandClaude Fable 5 dbe8efdc62 images: build edge-host ISO in an archlinux container
mkarchiso against the host repos fails on Manjaro (no archinstall/
reflector, linux is a virtual package) — releng needs real Arch repos.
Split the profile assembly into build-inner.sh and run it in
archlinux:latest (--privileged for pacstrap's bind mounts); verified
build on the Manjaro workstation. gitignore the ISO output dir.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 12:34:13 +02:00
k.rennerandClaude Fable 5 ee98c88ef4 images: add edge-host installer ISO
Releng-based archiso overlay: `edge-install` in the live env wipes the
N100 NVMe and installs the ansible-ready base system (systemd-boot,
networkd DHCP, sshd key-only, docker). Service config stays in the
edge-host ansible role; the ISO only produces the base.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 12:14:36 +02:00