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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>