Compare commits

...
Author SHA1 Message Date
Richie 06ee507fa7 fix(register_gitea_runner): update instance directory handling and token retrieval
treefmt / nix fmt (pull_request) Successful in 3s
test ebook search / test-ebook-search (pull_request) Successful in 1m22s
build_systems / prebuild-common-x86-64-v3 (pull_request) Successful in 39s
build_systems / build-brain (pull_request) Failing after 1m50s
build_systems / build-jeeves (pull_request) Successful in 2m20s
build_systems / build-portal-1 (pull_request) Successful in 41s
build_systems / build-rhapsody-in-green (pull_request) Successful in 1m20s
build_systems / build-bob (pull_request) Failing after 14m17s
2026-11-05 21:33:19 -05:00
Richie 385bdd9896 adding wled
treefmt / nix fmt (pull_request) Successful in 3s
treefmt / nix fmt (push) Successful in 4s
build_systems / prebuild-common-x86-64-v3 (pull_request) Successful in 22s
build_systems / prebuild-common-x86-64-v3 (push) Successful in 6s
build_systems / build-portal-1 (pull_request) Successful in 20s
test ebook search / test-ebook-search (pull_request) Successful in 1m8s
test ebook search / test-ebook-search (push) Successful in 1m9s
build_systems / build-rhapsody-in-green (pull_request) Successful in 59s
build_systems / build-jeeves (push) Successful in 1m28s
build_systems / build-portal-1 (push) Successful in 27s
build_systems / build-rhapsody-in-green (push) Successful in 45s
build_systems / build-jeeves (pull_request) Successful in 1m28s
build_systems / build-brain (push) Failing after 4m49s
build_systems / build-bob (push) Failing after 6m2s
build_systems / build-brain (pull_request) Failing after 7m8s
build_systems / build-bob (pull_request) Failing after 2h21m14s
2026-11-04 22:53:55 -05:00
Richie dd17cea068 fixed typo
treefmt / nix fmt (pull_request) Successful in 4s
treefmt / nix fmt (push) Successful in 3s
build_systems / prebuild-common-x86-64-v3 (pull_request) Successful in 25s
build_systems / prebuild-common-x86-64-v3 (push) Successful in 6s
test ebook search / test-ebook-search (push) Successful in 1m9s
build_systems / build-portal-1 (push) Successful in 20s
build_systems / build-bob (push) Successful in 31s
build_systems / build-rhapsody-in-green (pull_request) Successful in 48s
build_systems / build-brain (pull_request) Successful in 54s
build_systems / build-brain (push) Successful in 49s
build_systems / build-jeeves (pull_request) Successful in 1m22s
test ebook search / test-ebook-search (pull_request) Successful in 1m11s
build_systems / build-portal-1 (pull_request) Successful in 22s
build_systems / build-bob (pull_request) Successful in 35s
build_systems / build-rhapsody-in-green (push) Successful in 34s
build_systems / build-jeeves (push) Successful in 1m16s
2026-11-01 22:43:11 -05:00
Richie c9eba7dad6 upgraded van to a MultiPlus-II
treefmt / nix fmt (push) Canceled after 0s
test ebook search / test-ebook-search (push) Canceled after 0s
build_systems / prebuild-common-x86-64-v3 (push) Canceled after 0s
build_systems / build-bob (push) Canceled after 0s
build_systems / build-brain (push) Canceled after 0s
build_systems / build-jeeves (push) Canceled after 0s
build_systems / build-portal-1 (push) Canceled after 0s
build_systems / build-rhapsody-in-green (push) Canceled after 0s
treefmt / nix fmt (pull_request) Canceled after 0s
build_systems / prebuild-common-x86-64-v3 (pull_request) Canceled after 0s
build_systems / build-bob (pull_request) Canceled after 0s
build_systems / build-brain (pull_request) Canceled after 0s
build_systems / build-jeeves (pull_request) Canceled after 0s
build_systems / build-portal-1 (pull_request) Canceled after 0s
build_systems / build-rhapsody-in-green (pull_request) Canceled after 0s
test ebook search / test-ebook-search (pull_request) Canceled after 0s
2026-11-01 22:24:50 -05:00
Richie 16cb668788 feat(libjpeg-turbo): add patch for libjpeg-turbo with custom cmakeFlags
treefmt / nix fmt (pull_request) Successful in 4s
build_systems / prebuild-common-x86-64-v3 (pull_request) Successful in 20s
build_systems / build-portal-1 (pull_request) Successful in 19s
test ebook search / test-ebook-search (pull_request) Successful in 1m8s
build_systems / build-bob (pull_request) Successful in 1m3s
build_systems / build-rhapsody-in-green (pull_request) Successful in 41m35s
build_systems / build-brain (pull_request) Successful in 5h37m45s
build_systems / build-jeeves (pull_request) Successful in 5h37m50s
treefmt / nix fmt (push) Successful in 4s
build_systems / prebuild-common-x86-64-v3 (push) Successful in 5s
build_systems / build-portal-1 (push) Successful in 17s
build_systems / build-bob (push) Successful in 25s
build_systems / build-brain (push) Successful in 33s
build_systems / build-rhapsody-in-green (push) Successful in 35s
test ebook search / test-ebook-search (push) Successful in 1m8s
build_systems / build-jeeves (push) Successful in 1m6s
2026-10-30 23:37:40 -04:00
Richie b57b83594c adding pyproject to cspell
treefmt / nix fmt (pull_request) Successful in 3s
test ebook search / test-ebook-search (pull_request) Successful in 1m9s
build_systems / build-bob (pull_request) Canceled after 0s
build_systems / build-brain (pull_request) Canceled after 0s
build_systems / build-jeeves (pull_request) Canceled after 0s
build_systems / build-portal-1 (pull_request) Canceled after 0s
build_systems / build-rhapsody-in-green (pull_request) Canceled after 0s
build_systems / prebuild-common-x86-64-v3 (pull_request) Canceled after 57m46s
2026-10-29 19:41:33 -04:00
Richie 44c643655d adding alices nix-cache 2026-10-29 19:40:43 -04:00
Richie e1d2951c99 flake update
treefmt / nix fmt (pull_request) Successful in 3s
test ebook search / test-ebook-search (pull_request) Successful in 2m10s
build_systems / build-bob (pull_request) Canceled after 0s
build_systems / build-brain (pull_request) Canceled after 0s
build_systems / build-jeeves (pull_request) Canceled after 0s
build_systems / build-portal-1 (pull_request) Canceled after 0s
build_systems / build-rhapsody-in-green (pull_request) Canceled after 0s
build_systems / prebuild-common-x86-64-v3 (pull_request) Canceled after 9m36s
2026-10-29 19:29:51 -04:00
10 changed files with 661 additions and 230 deletions

No files matched your search

@@ -2,6 +2,7 @@ _final: prev:
(import ./abseil { inherit prev; })
// {
gnutls = import ./gnutls { inherit (prev) gnutls; };
libjpeg_turbo = import ./libjpeg-turbo { inherit (prev) lib libjpeg_turbo stdenv; };
prometheus = import ./prometheus { inherit (prev) prometheus; };
zopfli = import ./zopfli { inherit (prev) zopfli; };
@@ -0,0 +1,15 @@
{
lib,
libjpeg_turbo,
stdenv,
}:
libjpeg_turbo.overrideAttrs (old: {
# This overlay also reaches pkgsi686Linux. Its 12-bit floating-point code
# uses x87, while x86-64-v3 uses FMA. Keep the tests enabled for both.
cmakeFlags =
(old.cmakeFlags or [ ])
++ lib.optional (
stdenv.hostPlatform.isx86_64 && (stdenv.hostPlatform.gcc.arch or null) == "x86-64-v3"
) "-DFLOATTEST12=fp-contract"
++ lib.optional stdenv.hostPlatform.isi686 "-DFLOATTEST12=387";
})
Generated
+21 -21
View File
@@ -7,11 +7,11 @@
]
},
"locked": {
"lastModified": 1789770686,
"narHash": "sha256-uZkBR7yHdIKUFB5SZdfgh1qkGfI3XmYmI/lTiquxbck=",
"lastModified": 1792526520,
"narHash": "sha256-3hSJlv8mUVnZPMWK2+CM7a9O+nR6Z4mCh27NfLCmTPc=",
"owner": "nix-community",
"repo": "disko",
"rev": "725ea35e410ad83be4931d1bff7e090eacaf3563",
"rev": "cedd626e11b635470fa6f9fdb8ad79b0075dd7f9",
"type": "github"
},
"original": {
@@ -45,11 +45,11 @@
]
},
"locked": {
"lastModified": 1791293500,
"narHash": "sha256-3hwJd2/vG/VYV1P/g7oDgdbNsWODhN5F//Od+hPMm2k=",
"lastModified": 1793193205,
"narHash": "sha256-X6xa6sGA7RnJQuZGbFMC+K+KToWAlBDCCjJXfTwEPsw=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "0e11b7bcba1d74ef8ea10bfdfb1e1a5811a21087",
"rev": "095fef2f265c3c0da4fe315efba8f8a04495ab34",
"type": "github"
},
"original": {
@@ -67,11 +67,11 @@
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1791127101,
"narHash": "sha256-SmrBBhcv9iNHA2vlafi7Zpe8bkcsMjVNSmCCVf5/jrQ=",
"lastModified": 1793017781,
"narHash": "sha256-YRem1WRn//ruQ7QukBCjpn/Uwmd17vGLml8w3i+Swd8=",
"owner": "LLukas22",
"repo": "Jellyswarrm",
"rev": "0b4301c6c74efff9c3634296913032579c98faf6",
"rev": "90cca4fe7e6f855453866b71ca5b38773342a0c4",
"type": "github"
},
"original": {
@@ -85,11 +85,11 @@
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1791128201,
"narHash": "sha256-rlsYY/Dg/LhbIj51Aa6TLvRpZeb3KZgUTd7llQ5XcJE=",
"lastModified": 1793236063,
"narHash": "sha256-jGFe4xdrCw6xpgH2zgKwslACyt/NGuPwGILPEMFxmcQ=",
"owner": "nixos",
"repo": "nixos-hardware",
"rev": "31cc5f4d9b9ba601071e8b8504601b9b176e2756",
"rev": "b6754c901c21478fd8450d62101e712b2a4f0d75",
"type": "github"
},
"original": {
@@ -114,11 +114,11 @@
},
"nixpkgs-master": {
"locked": {
"lastModified": 1791296764,
"narHash": "sha256-N2b6Uxdr1MFhscEPqDyntTTtGZASgq3XYE0ujRzfeNI=",
"lastModified": 1793315900,
"narHash": "sha256-z5lZoCwheBzMgRtfYlGLMhmPwhv1Rty16Kf269n8ctc=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "a15afac8691bd24f746255ffbd76306693e4cf7a",
"rev": "db379a58acfef9783b46ffde2957dac397c92b85",
"type": "github"
},
"original": {
@@ -146,11 +146,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1791260994,
"narHash": "sha256-Miqqk/ammqnTUxaoCyvtwoPeLbI1ksFyLxi/CazZpWY=",
"lastModified": 1793110635,
"narHash": "sha256-dhoW6VgFWlaodSY5jrBn+CF2FLmaUvDVgM7+C7T2+NM=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "151fa4e8ddfdd8dd25d945ad94ed54a13de9f6e4",
"rev": "31ecbaca1bdefa45dffc409f0250bd8039ea0010",
"type": "github"
},
"original": {
@@ -201,11 +201,11 @@
]
},
"locked": {
"lastModified": 1791103873,
"narHash": "sha256-nFxM+pKoZ8LJAEnUXARyCaOAloWgaW9kZQOSjWzKcTE=",
"lastModified": 1793052255,
"narHash": "sha256-Y/JIHTnMlOabDfyaSBubWGLDIVGihLEUuoMhFvQKaDo=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "dcd241ba97088c22569d1573286e1b9daad340c0",
"rev": "60182817ee048ac94b4c68ea76d5ef2e8aac730d",
"type": "github"
},
"original": {
+2
View File
@@ -5,11 +5,13 @@
extra-substituters = [
"https://cache.nixos.org/?priority=2&want-mass-query=true"
"https://nix-community.cachix.org/?priority=10&want-mass-query=true"
"https://attic.nayeonie.com/nix-cache/?priority=10&want-mass-query=true"
];
extra-trusted-public-keys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" # cspell:disable-line
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" # cspell:disable-line
"cache-nix-dot:Od9KN34LXc6Lu7y1ozzV1kIXZa8coClozgth/SYE7dU=" # cspell:disable-line
"nix-cache:grGRsHhqNDhkEuTODvHJXYmoCClntC+U8XAJQzwMaZM=" # cspell:disable-line
];
};
@@ -82,6 +82,8 @@
extraComponents = [
"isal"
"modbus" # for victron modbus integration
"template" # MultiPlus mode selector, input current limit and derived sensors
"wled"
];
customComponents = with pkgs.x86-v1.home-assistant-custom-components; [
garmin_connect
@@ -1,122 +0,0 @@
title: Van Overview
views:
- title: Overview
path: overview
type: sections
sections:
# Battery Status Section
- type: grid
title: Battery Status
cards:
- type: gauge
entity: sensor.jk0_soc
name: Battery 0
min: 0
max: 100
severity:
green: 50
yellow: 20
red: 0
needle: true
- type: gauge
entity: sensor.jk1_soc
name: Battery 1
min: 0
max: 100
severity:
green: 50
yellow: 20
red: 0
needle: true
- type: entity
entity: sensor.jk0_total_voltage
name: Batt 0 Voltage
- type: entity
entity: sensor.jk1_total_voltage
name: Batt 1 Voltage
# Solar Production Section
- type: grid
title: Solar Production
cards:
- type: gauge
entity: sensor.solar_wattage
name: Solar Now
min: 0
max: 400
severity:
green: 100
yellow: 50
red: 0
needle: true
- type: entity
entity: sensor.solar_yield_today
name: Today's Yield
- type: entity
entity: sensor.estimated_energy_production_today
name: Forecast Today
- type: entity
entity: sensor.estimated_energy_production_tomorrow
name: Forecast Tomorrow
# Environment Section
- type: grid
title: Van Environment
cards:
- type: entity
entity: sensor.environment_temperature
name: Inside Temp
- type: entity
entity: sensor.environment_humidity
name: Inside Humidity
- type: entity
entity: sensor.current_weather_temperature
name: Outside Temp
- type: entity
entity: sensor.current_weather_humidity
name: Outside Humidity
- type: entity
entity: sensor.current_weather_condition
name: Weather
# Charger Status Section
- type: grid
title: Charger
cards:
- type: entity
entity: sensor.charger_dc_wattage
name: Charging Power
- type: entity
entity: sensor.charger_charge_state
name: Charge State
- type: entity
entity: sensor.charger_dc_wattage_daily
name: Charged Today
# Location Section
- type: grid
title: Location
cards:
- type: entity
entity: sensor.gps_location
name: Current Location
- type: entity
entity: sensor.gps_speed
name: Speed
- type: entity
entity: binary_sensor.gps_fix_available
name: GPS Fix
@@ -220,10 +220,120 @@ modbus:
state_class: measurement
unique_id: gps_altitude_id_1
# ---- CHARGER (Unit ID 223) ----
- name: Charger Output 1 Voltage
slave: 223
address: 2307
# ---- MULTIPLUS-II (VE.Bus, Cerbo GX unit ID 227) ----
# Confirmed on this GX: one AC phase, AC input 1, 30 A shore-power plug.
# Register map: https://www.victronenergy.com/upload/documents/CCGX-Modbus-TCP-register-list-3.81.xlsx
# Victron's scale column is a divisor: AC power registers use 0.1,
# so Home Assistant must multiply their signed raw values by 10.
# Change the unit ID anchor here if the GX service mapping changes.
- name: MultiPlus AC Input Voltage
unique_id: multiplus_ac_input_voltage
slave: &multiplus_unit_id 227
address: 3
input_type: holding
data_type: uint16
scale: 0.1
precision: 1
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
scan_interval: 10
- name: MultiPlus AC Input Current
unique_id: multiplus_ac_input_current
slave: *multiplus_unit_id
address: 6
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "A"
device_class: current
state_class: measurement
scan_interval: 10
- name: MultiPlus AC Input Frequency
unique_id: multiplus_ac_input_frequency
slave: *multiplus_unit_id
address: 9
input_type: holding
data_type: int16
scale: 0.01
precision: 2
unit_of_measurement: "Hz"
device_class: frequency
state_class: measurement
scan_interval: 10
- name: MultiPlus AC Input Power
unique_id: multiplus_ac_input_power
slave: *multiplus_unit_id
address: 12
input_type: holding
data_type: int16
scale: 10
precision: 0
unit_of_measurement: "W"
device_class: power
state_class: measurement
scan_interval: 10
- name: MultiPlus AC Output Voltage
unique_id: multiplus_ac_output_voltage
slave: *multiplus_unit_id
address: 15
input_type: holding
data_type: uint16
scale: 0.1
precision: 1
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
scan_interval: 10
- name: MultiPlus AC Output Current
unique_id: multiplus_ac_output_current
slave: *multiplus_unit_id
address: 18
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "A"
device_class: current
state_class: measurement
scan_interval: 10
- name: MultiPlus AC Output Frequency
unique_id: multiplus_ac_output_frequency
slave: *multiplus_unit_id
address: 21
input_type: holding
data_type: int16
scale: 0.01
precision: 2
unit_of_measurement: "Hz"
device_class: frequency
state_class: measurement
scan_interval: 10
- name: MultiPlus AC Output Power
unique_id: multiplus_ac_output_power
slave: *multiplus_unit_id
address: 23
input_type: holding
data_type: int16
scale: 10
precision: 0
unit_of_measurement: "W"
device_class: power
state_class: measurement
scan_interval: 10
- name: MultiPlus Battery Voltage
unique_id: multiplus_battery_voltage
slave: *multiplus_unit_id
address: 26
input_type: holding
data_type: uint16
scale: 0.01
@@ -231,11 +341,12 @@ modbus:
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
unique_id: charger_output_1_voltage
scan_interval: 10
- name: Charger Output 1 Current
slave: 223
address: 2308
- name: MultiPlus Battery Current
unique_id: multiplus_battery_current
slave: *multiplus_unit_id
address: 27
input_type: holding
data_type: int16
scale: 0.1
@@ -243,11 +354,12 @@ modbus:
unit_of_measurement: "A"
device_class: current
state_class: measurement
unique_id: charger_output_1_current
scan_interval: 10
- name: Charger Output 1 Temperature
slave: 223
address: 2309
- name: MultiPlus Battery Temperature
unique_id: multiplus_battery_temperature
slave: *multiplus_unit_id
address: 61
input_type: holding
data_type: int16
scale: 0.1
@@ -255,11 +367,23 @@ modbus:
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
unique_id: charger_output_1_temperature
- name: Charger AC Current
slave: 223
address: 2314
- name: MultiPlus State of Charge
unique_id: multiplus_state_of_charge
slave: *multiplus_unit_id
address: 30
input_type: holding
data_type: uint16
scale: 0.1
precision: 1
unit_of_measurement: "%"
device_class: battery
state_class: measurement
- name: MultiPlus AC Input Current Limit Readback
unique_id: multiplus_ac_input_current_limit_readback
slave: *multiplus_unit_id
address: 22
input_type: holding
data_type: int16
scale: 0.1
@@ -267,73 +391,272 @@ modbus:
unit_of_measurement: "A"
device_class: current
state_class: measurement
unique_id: charger_ac_current
scan_interval: 10
- name: Charger AC Current Limit
slave: 223
address: 2316
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "A"
device_class: current
state_class: measurement
unique_id: charger_ac_current_limit
- name: Charger On Off Raw
slave: 223
address: 2317
- name: MultiPlus Mode Raw
unique_id: multiplus_mode_raw
slave: *multiplus_unit_id
address: 33
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: charger_on_off_raw
scan_interval: 10
- name: Charger Charge State Raw
slave: 223
address: 2318
- name: MultiPlus State Raw
unique_id: multiplus_state_raw
slave: *multiplus_unit_id
address: 31
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: charger_charge_state_raw
scan_interval: 10
- name: Charger Error Code
slave: 223
address: 2319
- name: MultiPlus Charge State Raw
unique_id: multiplus_charge_state_raw
slave: *multiplus_unit_id
address: 95
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: charger_error_code
scan_interval: 10
- name: Charger Relay State
slave: 223
address: 2320
- name: MultiPlus Active Input Raw
unique_id: multiplus_active_input_raw
slave: *multiplus_unit_id
address: 29
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: charger_relay_state
scan_interval: 10
- name: Charger Low Voltage Alarm
slave: 223
address: 2321
- name: MultiPlus Phase Count
unique_id: multiplus_phase_count
slave: *multiplus_unit_id
address: 28
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: charger_low_voltage_alarm
- name: Charger High Voltage Alarm
slave: 223
address: 2322
- name: MultiPlus VE Bus Error
unique_id: multiplus_ve_bus_error
slave: *multiplus_unit_id
address: 32
input_type: holding
data_type: uint16
- name: MultiPlus High Temperature Alarm Raw
unique_id: multiplus_high_temperature_alarm_raw
slave: *multiplus_unit_id
address: 34
input_type: holding
data_type: uint16
- name: MultiPlus Low Battery Alarm Raw
unique_id: multiplus_low_battery_alarm_raw
slave: *multiplus_unit_id
address: 35
input_type: holding
data_type: uint16
- name: MultiPlus Overload Alarm Raw
unique_id: multiplus_overload_alarm_raw
slave: *multiplus_unit_id
address: 36
input_type: holding
data_type: uint16
- name: MultiPlus Ripple Alarm Raw
unique_id: multiplus_ripple_alarm_raw
slave: *multiplus_unit_id
address: 47
input_type: holding
data_type: uint16
- name: MultiPlus Temperature Sensor Alarm Raw
unique_id: multiplus_temperature_sensor_alarm_raw
slave: *multiplus_unit_id
address: 42
input_type: holding
data_type: uint16
- name: MultiPlus Voltage Sensor Alarm Raw
unique_id: multiplus_voltage_sensor_alarm_raw
slave: *multiplus_unit_id
address: 43
input_type: holding
data_type: uint16
- name: MultiPlus Grid Lost Alarm Raw
unique_id: multiplus_grid_lost_alarm_raw
slave: *multiplus_unit_id
address: 64
input_type: holding
data_type: uint16
- name: MultiPlus BMS Pre Alarm Raw
unique_id: multiplus_bms_pre_alarm_raw
slave: *multiplus_unit_id
address: 94
input_type: holding
data_type: uint16
- name: MultiPlus BMS Allows Charging Raw
unique_id: multiplus_bms_allows_charging_raw
slave: *multiplus_unit_id
address: 57
input_type: holding
data_type: uint16
- name: MultiPlus BMS Allows Discharging Raw
unique_id: multiplus_bms_allows_discharging_raw
slave: *multiplus_unit_id
address: 58
input_type: holding
data_type: uint16
- name: MultiPlus BMS Expected Raw
unique_id: multiplus_bms_expected_raw
slave: *multiplus_unit_id
address: 59
input_type: holding
data_type: uint16
- name: MultiPlus BMS Error
unique_id: multiplus_bms_error
slave: *multiplus_unit_id
address: 60
input_type: holding
data_type: uint16
- name: MultiPlus AC Input Ignored Raw
unique_id: multiplus_ac_input_ignored_raw
slave: *multiplus_unit_id
address: 69
input_type: holding
data_type: uint16
- name: MultiPlus AC Input to Output Energy
unique_id: multiplus_ac_input_to_output_energy
slave: *multiplus_unit_id
address: 74
input_type: holding
data_type: uint32
scale: 0.01
precision: 2
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
# Hardware counters reset on Multi/GX restart; total_increasing handles this.
- name: MultiPlus AC Input to Battery Energy
unique_id: multiplus_ac_input_to_battery_energy
slave: *multiplus_unit_id
address: 76
input_type: holding
data_type: uint32
scale: 0.01
precision: 2
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
- name: MultiPlus AC Output to Input Energy
unique_id: multiplus_ac_output_to_input_energy
slave: *multiplus_unit_id
address: 82
input_type: holding
data_type: uint32
scale: 0.01
precision: 2
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
- name: MultiPlus Battery to AC Input Energy
unique_id: multiplus_battery_to_ac_input_energy
slave: *multiplus_unit_id
address: 86
input_type: holding
data_type: uint32
scale: 0.01
precision: 2
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
- name: MultiPlus Battery to AC Output Energy
unique_id: multiplus_battery_to_ac_output_energy
slave: *multiplus_unit_id
address: 90
input_type: holding
data_type: uint32
scale: 0.01
precision: 2
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
- name: MultiPlus AC Output to Battery Energy
unique_id: multiplus_ac_output_to_battery_energy
slave: *multiplus_unit_id
address: 92
input_type: holding
data_type: uint32
scale: 0.01
precision: 2
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
- name: MultiPlus PowerAssist Boost Factor
unique_id: multiplus_powerassist_boost_factor
slave: *multiplus_unit_id
address: 106
input_type: holding
data_type: uint16
scale: 0.01
precision: 2
state_class: measurement
- name: MultiPlus Configured Output Voltage
unique_id: multiplus_configured_output_voltage
slave: *multiplus_unit_id
address: 107
input_type: holding
data_type: uint16
scale: 0.01
precision: 2
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
- name: MultiPlus PowerAssist Enabled Raw
unique_id: multiplus_powerassist_enabled_raw
slave: *multiplus_unit_id
address: 108
input_type: holding
data_type: uint16
- name: MultiPlus UPS Function Raw
unique_id: multiplus_ups_function_raw
slave: *multiplus_unit_id
address: 109
input_type: holding
data_type: uint16
- name: MultiPlus Weak AC Input Raw
unique_id: multiplus_weak_ac_input_raw
slave: *multiplus_unit_id
address: 129
input_type: holding
data_type: uint16
- name: MultiPlus Nominal Inverter Power
unique_id: multiplus_nominal_inverter_power
slave: *multiplus_unit_id
address: 130
input_type: holding
data_type: uint32
scale: 1
precision: 0
unit_of_measurement: "W"
device_class: power
state_class: measurement
unique_id: charger_high_voltage_alarm
template:
- sensor:
@@ -439,34 +762,208 @@ template:
{{ v100 }}
{% endif %}
- name: Charger On Off
- name: MultiPlus State
unique_id: multiplus_state
availability: "{{ is_number(states('sensor.multiplus_state_raw')) }}"
state: >-
{% set v = states('sensor.charger_on_off_raw')|int %}
{{ {0:'Off',1:'On',2:'Error',3:'Unavailable'}.get(v, 'Unknown') }}
- name: Charger Charge State
state: >-
{% set v = states('sensor.charger_charge_state_raw')|int %}
{% set v = states('sensor.multiplus_state_raw') | int(-1) %}
{{ {
0:'Off',1:'Low Power',2:'Fault',3:'Bulk',4:'Absorption',5:'Float',
6:'Storage',7:'Equalize/Manual',8:'External Control'
}.get(v,'Unknown') }}
0:'Off',1:'Low power',2:'Fault',3:'Bulk',4:'Absorption',5:'Float',
6:'Storage',7:'Equalize',8:'Pass-through',9:'Inverting',
10:'PowerAssist',11:'Power supply',244:'Sustain',252:'External control'
}.get(v, 'Unknown') }}
# Keep the existing charger entities and energy history.
- name: Charger Charge State
availability: "{{ is_number(states('sensor.multiplus_charge_state_raw')) }}"
state: >-
{% set v = states('sensor.multiplus_charge_state_raw') | int(-1) %}
{{ {
0:'Initialising',1:'Bulk',2:'Absorption',3:'Float',4:'Storage',
5:'Absorption repeat',6:'Forced absorption',7:'Equalize',
8:'Bulk stopped',9:'Unknown'
}.get(v, 'Unknown') }}
- name: MultiPlus Active Input
unique_id: multiplus_active_input
availability: "{{ is_number(states('sensor.multiplus_active_input_raw')) }}"
state: >-
{{ {0:'AC input 1',1:'AC input 2',240:'Disconnected'}
.get(states('sensor.multiplus_active_input_raw') | int(-1), 'Unknown') }}
# VE.Bus DC current is positive while charging and negative while inverting.
- name: MultiPlus DC Power
unique_id: multiplus_dc_power
unit_of_measurement: "W"
device_class: power
state_class: measurement
availability: >-
{{ is_number(states('sensor.multiplus_battery_voltage'))
and is_number(states('sensor.multiplus_battery_current')) }}
state: >-
{{ (states('sensor.multiplus_battery_voltage') | float(0)
* states('sensor.multiplus_battery_current') | float(0)) | round(1) }}
- name: "Charger DC Wattage"
unique_id: charger_dc_wattage
unit_of_measurement: "W"
device_class: power
state_class: measurement
availability: "{{ is_number(states('sensor.multiplus_dc_power')) }}"
state: >-
{% set v = states('sensor.charger_output_1_voltage')|float(0) %}
{% set a = states('sensor.charger_output_1_current')|float(0) %}
{{ (v * a) | round(1) }}
{{ [states('sensor.multiplus_dc_power') | float(0), 0] | max }}
- name: MultiPlus Inverter DC Power
unique_id: multiplus_inverter_dc_power
unit_of_measurement: "W"
device_class: power
state_class: measurement
availability: "{{ is_number(states('sensor.multiplus_dc_power')) }}"
state: >-
{{ [0 - states('sensor.multiplus_dc_power') | float(0), 0] | max }}
- binary_sensor:
- name: Charger Low Voltage Alarm Active
state: "{{ states('sensor.charger_low_voltage_alarm')|int == 2 }}"
- name: Charger High Voltage Alarm Active
state: "{{ states('sensor.charger_high_voltage_alarm')|int == 2 }}"
- name: MultiPlus AC Input Connected
unique_id: multiplus_ac_input_connected
device_class: power
# Register 29 identifies the selected input; it alone does not establish
# that the Multi is using AC. Keep the entity ID, but report active use.
availability: >-
{{ states('sensor.multiplus_active_input_raw') | int(-1) in [0, 1, 240]
and states('sensor.multiplus_mode_raw') | int(-1) in [1, 2, 3, 4]
and states('sensor.multiplus_state_raw') | int(-1)
in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 244, 252] }}
state: >-
{{ states('sensor.multiplus_active_input_raw') | int(-1) in [0, 1]
and states('sensor.multiplus_mode_raw') | int(-1) in [1, 2, 3]
and states('sensor.multiplus_state_raw') | int(-1)
in [3, 4, 5, 6, 7, 8, 10, 11, 244, 252] }}
- name: MultiPlus High Temperature Alarm
unique_id: multiplus_high_temperature_alarm
device_class: problem
availability: >-
{{ states('sensor.multiplus_high_temperature_alarm_raw') | int(-1) in [0, 1, 2] }}
state: "{{ states('sensor.multiplus_high_temperature_alarm_raw') | int(0) > 0 }}"
- name: MultiPlus Low Battery Alarm
unique_id: multiplus_low_battery_alarm
device_class: problem
availability: >-
{{ states('sensor.multiplus_low_battery_alarm_raw') | int(-1) in [0, 1, 2] }}
state: "{{ states('sensor.multiplus_low_battery_alarm_raw') | int(0) > 0 }}"
- name: MultiPlus Overload Alarm
unique_id: multiplus_overload_alarm
device_class: problem
availability: >-
{{ states('sensor.multiplus_overload_alarm_raw') | int(-1) in [0, 1, 2] }}
state: "{{ states('sensor.multiplus_overload_alarm_raw') | int(0) > 0 }}"
- name: MultiPlus Ripple Alarm
unique_id: multiplus_ripple_alarm
device_class: problem
availability: >-
{{ states('sensor.multiplus_ripple_alarm_raw') | int(-1) in [0, 1, 2] }}
state: "{{ states('sensor.multiplus_ripple_alarm_raw') | int(0) > 0 }}"
- name: MultiPlus Temperature Sensor Alarm
unique_id: multiplus_temperature_sensor_alarm
device_class: problem
availability: >-
{{ states('sensor.multiplus_temperature_sensor_alarm_raw') | int(-1) in [0, 1, 2] }}
state: "{{ states('sensor.multiplus_temperature_sensor_alarm_raw') | int(0) > 0 }}"
- name: MultiPlus Voltage Sensor Alarm
unique_id: multiplus_voltage_sensor_alarm
device_class: problem
availability: >-
{{ states('sensor.multiplus_voltage_sensor_alarm_raw') | int(-1) in [0, 1, 2] }}
state: "{{ states('sensor.multiplus_voltage_sensor_alarm_raw') | int(0) > 0 }}"
- name: MultiPlus Grid Lost Alarm
unique_id: multiplus_grid_lost_alarm
device_class: problem
availability: >-
{{ states('sensor.multiplus_grid_lost_alarm_raw') | int(-1) in [0, 2] }}
state: "{{ is_state('sensor.multiplus_grid_lost_alarm_raw', '2') }}"
- name: MultiPlus PowerAssist Enabled
unique_id: multiplus_powerassist_enabled
availability: >-
{{ states('sensor.multiplus_powerassist_enabled_raw') | int(-1) in [0, 1] }}
state: "{{ is_state('sensor.multiplus_powerassist_enabled_raw', '1') }}"
- name: MultiPlus UPS Enabled
unique_id: multiplus_ups_enabled
availability: >-
{{ states('sensor.multiplus_ups_function_raw') | int(-1) in [0, 1] }}
# Victron register 109 uses 0 for enabled and 1 for disabled.
state: "{{ is_state('sensor.multiplus_ups_function_raw', '0') }}"
# These controls read their state from the Multi; they never write on startup.
# GX/Digital Multi Control/VE.Bus BMS settings can restrict remote control.
- select:
- name: MultiPlus Mode
unique_id: multiplus_mode
icon: mdi:power-settings
availability: >-
{{ states('sensor.multiplus_mode_raw') | int(-1) in [1, 2, 3, 4] }}
state: >-
{{ {1:'Charger only',2:'Inverter only',3:'On',4:'Off'}
.get(states('sensor.multiplus_mode_raw') | int(-1), 'Unknown') }}
options: "{{ ['On', 'Charger only', 'Inverter only', 'Off'] }}"
select_option:
- condition: template
value_template: >-
{{ states('sensor.multiplus_mode_raw') | int(-1) in [1, 2, 3, 4]
and option in ['On', 'Charger only', 'Inverter only', 'Off'] }}
- action: modbus.write_register
data:
hub: victron_gx
slave: *multiplus_unit_id
address: 33
value: "{{ {'Charger only':1,'Inverter only':2,'On':3,'Off':4}[option] }}"
- delay:
seconds: 2
- action: homeassistant.update_entity
target:
entity_id:
- sensor.multiplus_mode_raw
- sensor.multiplus_state_raw
- sensor.multiplus_active_input_raw
- number:
- name: MultiPlus AC Input Current Limit
unique_id: multiplus_ac_input_current_limit
icon: mdi:current-ac
device_class: current
unit_of_measurement: "A"
min: 0
# Van shore-power plug rating; this is a UI bound, not a startup setting.
max: 30
step: 0.1
availability: >-
{{ is_number(states('sensor.multiplus_ac_input_current_limit_readback'))
and states('sensor.multiplus_ac_input_current_limit_readback') | float(-1) >= 0 }}
state: "{{ states('sensor.multiplus_ac_input_current_limit_readback') | float(0) }}"
set_value:
- condition: template
value_template: >-
{{ is_number(states('sensor.multiplus_ac_input_current_limit_readback'))
and is_number(value) and 0 <= value | float(-1) <= 30 }}
- action: modbus.write_register
data:
hub: victron_gx
slave: *multiplus_unit_id
address: 22
# Register 22 is in tenths of an amp: 10.8 A -> 108.
value: "{{ (value | float * 10) | round(0) | int }}"
- delay:
seconds: 2
- action: homeassistant.update_entity
target:
entity_id: sensor.multiplus_ac_input_current_limit_readback
sensor:
- platform: integration
@@ -496,6 +993,16 @@ sensor:
max_sub_interval:
minutes: 5
- platform: integration
source: sensor.multiplus_inverter_dc_power
name: MultiPlus Inverter DC Energy
unique_id: multiplus_inverter_dc_energy
unit_prefix: k
round: 2
method: trapezoidal
max_sub_interval:
minutes: 5
utility_meter:
dc_load_energy_daily:
source: sensor.dc_system_energy
@@ -520,3 +1027,11 @@ utility_meter:
charger_dc_wattage_monthly:
source: sensor.dc_charger_energy
cycle: monthly
multiplus_inverter_dc_energy_daily:
source: sensor.multiplus_inverter_dc_energy
cycle: daily
multiplus_inverter_dc_energy_monthly:
source: sensor.multiplus_inverter_dc_energy
cycle: monthly
@@ -1,21 +1,38 @@
#!/usr/bin/env bash
legacy_instance_dir="$STATE_DIRECTORY/$(hostname)"
instance_dir="$STATE_DIRECTORY/$1"
# Newer runner modules export INSTANCE_DIR and multiple colon-separated state paths.
instance_dir="${INSTANCE_DIR:-${STATE_DIRECTORY%%:*}/$1}"
legacy_instance_dir="$(dirname "$instance_dir")/$(hostname)"
runner_url="$2"
runner_config_file="$3"
shift 3
runner_labels="$(IFS=,; printf '%s' "$*")"
if [ ! -e "$instance_dir" ] && [ -d "$legacy_instance_dir" ]; then
mv "$legacy_instance_dir" "$instance_dir"
if [ "$legacy_instance_dir" != "$instance_dir" ] && [ -d "$legacy_instance_dir" ]; then
# systemd may have already created an empty instance directory.
if [ ! -e "$instance_dir" ] || rmdir "$instance_dir" 2>/dev/null; then
mv "$legacy_instance_dir" "$instance_dir"
fi
fi
mkdir -vp "$instance_dir"
cd "$instance_dir" || exit 1
# Newer modules use LoadCredential; older ones export TOKEN via EnvironmentFile.
runner_token="${TOKEN:-}"
if [ -n "${CREDENTIALS_DIRECTORY:-}" ]; then
runner_token="$(cat "$CREDENTIALS_DIRECTORY/token")"
# Keep accepting the legacy TOKEN= format as well as a raw token.
while IFS= read -r token_line; do
if [[ "$token_line" =~ ^[[:space:]]*TOKEN= ]]; then
runner_token="${token_line#*=}"
fi
done <<< "$runner_token"
fi
: "${runner_token:?Runner registration token is missing}"
token_hash_file="$instance_dir/.token-hash"
token_hash_current="$(printf '%s' "$TOKEN" | sha256sum | cut -d' ' -f1)"
token_hash_current="$(printf '%s' "$runner_token" | sha256sum | cut -d' ' -f1)"
token_hash_stored="$(cat "$token_hash_file" 2>/dev/null || echo "")"
labels_file="$instance_dir/.labels"
labels_wanted="$(printf '%s\n' "$@" | sort)"
@@ -26,7 +43,7 @@ if [ ! -e "$instance_dir/.runner" ] || [ "$labels_wanted" != "$labels_current" ]
gitea-runner register --no-interactive \
--instance "$runner_url" \
--token "$TOKEN" \
--token "$runner_token" \
--name "jeeves-$(hostname)" \
--labels "$runner_labels" \
--config "$runner_config_file"
+1 -1
View File
@@ -32,7 +32,7 @@ defaults
#Application Setup
frontend ContentSwitching
bind [::]:80 v4v6
bind [::]:443 v4v6 ssl crt /var/lib/acme/audiobookshelf.tmmworkshop.com/full.pem crt /var/lib/acme/cache.tmmworkshop.com/full.pem crt /var/lib/acme/gems.tmmworkshop.com/full.pem crt /var/lib/acme/jellyfin.tmmworkshop.com/full.pem crt /var/lib/acme/share.tmmworkshop.com/full.pem crt /var/lib/acme/gitea.tmmworkshop.com/full.pem crt
bind [::]:443 v4v6 ssl crt /var/lib/acme/audiobookshelf.tmmworkshop.com/full.pem crt /var/lib/acme/cache.tmmworkshop.com/full.pem crt /var/lib/acme/gems.tmmworkshop.com/full.pem crt /var/lib/acme/jellyfin.tmmworkshop.com/full.pem crt /var/lib/acme/share.tmmworkshop.com/full.pem crt /var/lib/acme/gitea.tmmworkshop.com/full.pem
mode http
# ACME challenge routing (must be first)
@@ -82,6 +82,7 @@
"Michal",
"Nornsight",
"pydantic",
"pyproject",
"sandboxing",
"syncthing",
"vllm",