Merge master into staging-next

This commit is contained in:
nixpkgs-ci[bot]
2026-04-03 06:27:42 +00:00
committed by GitHub
85 changed files with 1374 additions and 421 deletions
+5
View File
@@ -975,6 +975,11 @@ lib.mapAttrs mkLicense (
fullName = "libtiff License";
};
liliq-p-11 = {
spdxId = "LiLiQ-P-1.1";
fullName = "Licence Libre du Québec Permissive version 1.1";
};
llgpl21 = {
fullName = "Lisp LGPL; GNU Lesser General Public License version 2.1 with Franz Inc. preamble for clarification of LGPL terms in context of Lisp";
url = "https://opensource.franz.com/preamble.html";
+5 -6
View File
@@ -77,11 +77,10 @@ in
# configure the recorder component to use the postgresql db
recorder.db_url = "postgresql://@/hass";
# we can't load default_config, because the updater requires
# network access and would cause an error, so load frontend
# here explicitly.
# https://www.home-assistant.io/integrations/frontend/
frontend = { };
# without these some components that are loaded anyway fail to find
# their dependencies
default_config = { };
infrared = { };
# include some popular integrations, that absolutely shouldn't break
knx = { };
@@ -288,7 +287,7 @@ in
wait_for_homeassistant(cursor)
with subtest("Check that no errors were logged"):
hass.fail("journalctl -u home-assistant -o cat | grep -q ERROR")
hass.fail("journalctl -u home-assistant -o cat | grep -q 'ERROR ('")
with subtest("Check systemd unit hardening"):
hass.log(hass.succeed("systemctl cat home-assistant.service"))
@@ -1130,13 +1130,13 @@
"vendorHash": "sha256-33NOGIvqLpgndG68GxAeoiISjWV7ApR4jmvqyZHjPKo="
},
"rootlyhq_rootly": {
"hash": "sha256-iNWJBv9idm0BUIeP7HScQP8MtWdyJCUF4p1EdRvgE98=",
"hash": "sha256-OTXTCAeKsDtjtOqM6gP2/D1D5ZNblqf/1VtnZoEYNNI=",
"homepage": "https://registry.terraform.io/providers/rootlyhq/rootly",
"owner": "rootlyhq",
"repo": "terraform-provider-rootly",
"rev": "v5.7.0",
"rev": "v5.10.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-UyfCHBSdGKCulExhUdYfvEab8cVjaHGDfgslRS0d1Co="
"vendorHash": "sha256-b4hzgQeuOZ5mruSZGIR9iImiVhmLnFlFSQr1RUTDx8E="
},
"rundeck_rundeck": {
"hash": "sha256-g8unbz8+UGLiAOJju6E2bLkygvZgHkv173PdMDefmrc=",
+30
View File
@@ -0,0 +1,30 @@
{
lib,
rustPlatform,
fetchFromCodeberg,
nix-update-script,
}:
rustPlatform.buildRustPackage rec {
pname = "convoyeur";
version = "0.1.1";
src = fetchFromCodeberg {
owner = "classabbyamp";
repo = "convoyeur";
tag = "v${version}";
hash = "sha256-gfOmi3yyGEjGPooWocCBIO5wR5hKgz4HmbJBiIMh4RE=";
};
cargoHash = "sha256-rMRKTaKleO5QNeLM0jAOJ2kCKGfJxQWACWTqU8A8wt8=";
passthru.updateScript = nix-update-script { };
meta = {
description = "IRCv3 FILEHOST extension adapter to external file upload services";
homepage = "https://codeberg.org/classabbyamp/convoyeur";
mainProgram = "convoyeur";
license = lib.licenses.liliq-p-11;
maintainers = with lib.maintainers; [ lenny ];
};
}
@@ -27,19 +27,19 @@
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "deadlock-mod-manager";
version = "0.16.0";
version = "0.17.0";
src = fetchFromGitHub {
owner = "deadlock-mod-manager";
repo = "deadlock-mod-manager";
tag = "v${finalAttrs.version}";
hash = "sha256-rsOaCgP7ub4FkTkg1VWPZyf+N2I0qM0DCIIqBpJZCVg=";
hash = "sha256-8Z2w/92P/3PpFDcT1rhO3X4gyoV+l9uLb4jZ4Ixz6ck=";
};
cargoRoot = "apps/desktop";
buildAndTestSubdir = finalAttrs.cargoRoot;
cargoHash = "sha256-aUtJzgjc9reFxUVMRwqCd2lNMRALlfMkfIRN4QT3g+E=";
cargoHash = "sha256-MQog4ro5NWXmyS5aPZBb7K4LwfIDzxdhGZjWlh5LelE=";
nativeBuildInputs = [
rustPlatform.cargoSetupHook
@@ -79,7 +79,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
pnpm = pnpm_9;
fetcherVersion = 2;
sourceRoot = "source";
hash = "sha256-oQxW0q+myMllwLQd+GRXXvnce+bYtwTLEEwFU0nupv4=";
hash = "sha256-vZvQrKiuKlwY2+QCpsG2nm8uA0hmX0MOk603EcKbyOg=";
};
patches = [
+3 -3
View File
@@ -12,7 +12,7 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "dprint";
version = "0.53.0";
version = "0.53.2";
# Prefer repository rather than crate here
# - They have Cargo.lock in the repository
@@ -21,10 +21,10 @@ rustPlatform.buildRustPackage (finalAttrs: {
owner = "dprint";
repo = "dprint";
tag = finalAttrs.version;
hash = "sha256-4LtE/r/qUiZb4bOph/XEx+U0g11fvyX/nKZh8Ikt0SQ=";
hash = "sha256-n2nb8+Iplm9AMlyxCfRjGmuES1FvYIVgcilSg7LcjiM=";
};
cargoHash = "sha256-BV+hyiuIvn811E1y0IWOTkjtEpH/l6drWHXeMIXeOWk=";
cargoHash = "sha256-FTD8rCdMC1W+1SE5ezAz3rLNc6UErGbN0/5uiPCABuk=";
nativeBuildInputs = [ installShellFiles ];
@@ -7,16 +7,16 @@
buildNpmPackage (finalAttrs: {
pname = "freifunk-meshviewer";
version = "13.0.0";
version = "13.1.0";
src = fetchFromGitHub {
owner = "freifunk";
repo = "meshviewer";
tag = "v${finalAttrs.version}";
sha256 = "sha256-KMI2pKzGSsSOB1XzAd8Jv1YLJWK/RUiZJv/kOs+Mpbo=";
sha256 = "sha256-u9lX7B402KFOHyaReyg3f5rDYDshbO/lyMYo7XxgJR8=";
};
npmDepsHash = "sha256-EI0A4s86moYerWvZHPLnyy2O87ZskiP/tr8rAGO8MbE=";
npmDepsHash = "sha256-BaFtFdOu+WArH75nPtasSpecdGjMxTchFcF+K7krNpM=";
installPhase = ''
mkdir -p $out/share/freifunk-meshviewer/
+2 -2
View File
@@ -25,13 +25,13 @@ let
in
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "gogh";
version = "364";
version = "365";
src = fetchFromGitHub {
owner = "Gogh-Co";
repo = "Gogh";
tag = "v${finalAttrs.version}";
hash = "sha256-DVaUmpXWGb+bIdGZqXbiAsiuGTrwvPJdxCyA4g82LFA=";
hash = "sha256-qK3E7ceeVqBgJ8rSotfH3K9WpxE5dS/h4a7Ml5qwlS0=";
};
postPatch = ''
+1 -2
View File
@@ -9,7 +9,6 @@
nodejs_22,
makeWrapper,
versionCheckHook,
nix-update-script,
rolldown,
installShellFiles,
version ? "2026.3.12",
@@ -100,7 +99,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
nativeInstallCheckInputs = [ versionCheckHook ];
doInstallCheck = true;
passthru.updateScript = nix-update-script { };
passthru.updateScript = ./update.sh;
meta = {
description = "Self-hosted, open-source AI assistant/agent";
+8
View File
@@ -0,0 +1,8 @@
#!/usr/bin/env nix-shell
#!nix-shell -I nixpkgs=./. -i bash -p nix-update
#shellcheck shell=bash
set -euo pipefail
export NIXPKGS_ALLOW_INSECURE=1 # package has knownVulnerabilities
nix-update "$UPDATE_NIX_ATTR_PATH"
+16 -2
View File
@@ -2,6 +2,7 @@
lib,
stdenv,
fetchFromGitLab,
fetchpatch,
writeText,
replaceVars,
meson,
@@ -19,6 +20,7 @@
systemd,
xkeyboard-config,
fontconfig,
systemdSupport ? lib.meta.availableOn stdenv.hostPlatform systemd,
}:
stdenv.mkDerivation (finalAttrs: {
@@ -47,6 +49,13 @@ stdenv.mkDerivation (finalAttrs: {
(replaceVars ./fix-paths.patch {
fcmatch = "${fontconfig}/bin/fc-match";
})
# fix build without udev, see https://gitlab.freedesktop.org/plymouth/plymouth/-/merge_requests/382 - drop on next release
(fetchpatch {
name = "fix-build-without-udev.patch";
url = "https://gitlab.freedesktop.org/plymouth/plymouth/-/commit/f1ce78764482699b28f60c89af1a071ea0ae13ca.patch";
hash = "sha256-t5xt/scO8mVwESU8pFPTSXILd0FhmG/XRZ8O/4baQB8=";
})
];
strictDeps = true;
@@ -67,8 +76,10 @@ stdenv.mkDerivation (finalAttrs: {
libpng
libxkbcommon
pango
systemd
xkeyboard-config
]
++ lib.optionals systemdSupport [
systemd
];
mesonFlags =
@@ -87,9 +98,12 @@ stdenv.mkDerivation (finalAttrs: {
"-Dbackground-start-color-stop=0x000000"
"-Dbackground-end-color-stop=0x000000"
"-Drelease-file=/etc/os-release"
"-Dudev=enabled"
"-Dudev=${if systemdSupport then "enabled" else "disabled"}"
"-Drunstatedir=/run"
"-Druntime-plugins=true"
"-Dsystemd-integration=${lib.boolToString systemdSupport}"
]
++ lib.optionals systemdSupport [
"--cross-file=${crossFile}"
];
+3 -3
View File
@@ -9,16 +9,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "rwpspread";
version = "0.5.0";
version = "0.5.1";
src = fetchFromGitHub {
owner = "0xk1f0";
repo = "rwpspread";
rev = "v${finalAttrs.version}";
hash = "sha256-lp9XvILpvNZtffJLyDUCo5Xyor4X4bwsfxAIqS8Hf7M=";
hash = "sha256-SWykTlj51lrPz7c9TfNOhMEZcpi8NMLDx50ZqnNlfsU=";
};
cargoHash = "sha256-aGy29kGwCKHBNzszYR+w+1m8gZ/lFd0MOlFHtDDzjj4=";
cargoHash = "sha256-vrCxtbhCFtHRvqwDow7njz/V2QWzs7p/28MTZL4XsBc=";
nativeBuildInputs = [ pkg-config ];
+3 -3
View File
@@ -12,18 +12,18 @@
buildGoModule (finalAttrs: {
pname = "shellhub-agent";
version = "0.22.0";
version = "0.24.0";
src = fetchFromGitHub {
owner = "shellhub-io";
repo = "shellhub";
rev = "v${finalAttrs.version}";
hash = "sha256-Ngb6n1P5Bb11et5x1mTF4rQjx/TdfE93nLc2NRz4aSg=";
hash = "sha256-NV2VA/rquf0TwTAsaAA6TIHp1BwD+5jE8uOZg7tW/kI=";
};
modRoot = "./agent";
vendorHash = "sha256-FlbSHLkJlOdbgfS+B5f8GLihw2KNQCh3G8kt8E+eb3w=";
vendorHash = "sha256-dloFaS/BUnyd9kHB0d2vsibkgFlQwTBkgRBOiBbq2ZY=";
ldflags = [
"-s"
+2 -2
View File
@@ -23,13 +23,13 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "vicinae";
version = "0.20.8";
version = "0.20.9";
src = fetchFromGitHub {
owner = "vicinaehq";
repo = "vicinae";
tag = "v${finalAttrs.version}";
hash = "sha256-G+ibcIvOaPE3qot4zLmHUo7cmNFNU1kw2Zhn08D26Ts=";
hash = "sha256-ax517n+zbfOvr2H+QfyqAq/6Ad3Qu3CnlaI4q6JfrXk=";
};
apiDeps = fetchNpmDeps {
@@ -1,26 +1,29 @@
{
lib,
buildPythonPackage,
fetchPypi,
fetchFromGitHub,
setuptools,
wheel,
setuptools-scm,
aiocoap,
pycryptodomex,
pytestCheckHook,
}:
buildPythonPackage rec {
pname = "aioairctrl";
version = "0.2.6";
version = "0.3.1";
pyproject = true;
src = fetchPypi {
inherit pname version;
hash = "sha256-mQNgkgQ83GOSc0g0ATctlr4ZeB7g8iGd4qTZfyoO8DM=";
src = fetchFromGitHub {
owner = "kongo09";
repo = "aioairctrl";
tag = "v${version}";
hash = "sha256-Ea5OMbpwDubhnpY5K0CVXZneEGtNWkqkQQ7JwVa/JNU=";
};
build-system = [
setuptools
wheel
setuptools-scm
];
dependencies = [
@@ -30,9 +33,12 @@ buildPythonPackage rec {
pythonImportsCheck = [ "aioairctrl" ];
doCheck = false; # no tests
nativeCheckInputs = [
pytestCheckHook
];
meta = {
changelog = "https://github.com/kongo09/aioairctrl/releases/tag/${src.tag}";
description = "Library for controlling Philips air purifiers (using encrypted CoAP)";
homepage = "https://github.com/kongo09/aioairctrl";
license = lib.licenses.mit;
@@ -16,14 +16,14 @@
buildPythonPackage rec {
pname = "aioamazondevices";
version = "13.0.1";
version = "13.3.2";
pyproject = true;
src = fetchFromGitHub {
owner = "chemelli74";
repo = "aioamazondevices";
tag = "v${version}";
hash = "sha256-FCHANMtOMGiV+RqAXRUHpax2UH4xwLRHaJzWvXwZC7U=";
hash = "sha256-DaQbcWnE/Ij8NpBJ7d0YjWQwKn+mxNw4P4RPT0Lmfs8=";
};
build-system = [ poetry-core ];
@@ -26,14 +26,14 @@
buildPythonPackage (finalAttrs: {
pname = "aioesphomeapi";
version = "44.2.0";
version = "44.8.0";
pyproject = true;
src = fetchFromGitHub {
owner = "esphome";
repo = "aioesphomeapi";
tag = "v${finalAttrs.version}";
hash = "sha256-YJhNHNeY6952XrNthhLEzo/GVkKQC5QOcvTpAVbgRic=";
hash = "sha256-8vc9efKFXTQ1or4uAIMo7ElHc7gaaxKheWGb2RcppbQ=";
};
build-system = [
@@ -10,29 +10,26 @@
pytest-cov-stub,
pytest-timeout,
pytestCheckHook,
pythonOlder,
setuptools,
yarl,
}:
buildPythonPackage rec {
pname = "aiohasupervisor";
version = "0.3.3";
version = "0.4.3";
pyproject = true;
disabled = pythonOlder "3.12";
src = fetchFromGitHub {
owner = "home-assistant-libs";
repo = "python-supervisor-client";
tag = version;
hash = "sha256-v6w+g1M3VR/an3a5MfWf8fDCHNzRC4+05L7GW45PzWU=";
hash = "sha256-h22y62f+pdoHYKqPeKNGFkVS7/IMWbxaAoDLomwAB40=";
};
postPatch = ''
substituteInPlace pyproject.toml \
--replace-fail 'version = "0.0.0"' 'version = "${version}"' \
--replace-fail "setuptools>=68.0,<80.10" "setuptools"
--replace-fail "setuptools>=68.0,<82.1" "setuptools"
'';
build-system = [ setuptools ];
@@ -11,14 +11,14 @@
buildPythonPackage (finalAttrs: {
pname = "aiohomematic-config";
version = "2026.3.2";
version = "2026.3.5";
pyproject = true;
src = fetchFromGitHub {
owner = "sukramj";
repo = "aiohomematic-config";
tag = finalAttrs.version;
hash = "sha256-0TfRaTL+oxukl4nMPTxrtLMqCxAOcAW/brXxCeP9NB4=";
hash = "sha256-OGpGtF+BH+WWIGGfpS6myJ7fPi1wuWYjeSS9y9LhXGY=";
};
build-system = [ setuptools ];
@@ -18,7 +18,7 @@
buildPythonPackage rec {
pname = "aiohomematic";
version = "2026.3.8";
version = "2026.3.23";
pyproject = true;
disabled = pythonOlder "3.14";
@@ -27,7 +27,7 @@ buildPythonPackage rec {
owner = "SukramJ";
repo = "aiohomematic";
tag = version;
hash = "sha256-uVG8rMxgb5JwNy9r9jT17BIZFxGn5rxtzRtQV6Mfxkk=";
hash = "sha256-zbXz/pg5CB8YLs6oF3Nv8gVimc/jQu3pHRpD/y3Wp5Q=";
};
build-system = [ setuptools ];
@@ -17,14 +17,14 @@
buildPythonPackage (finalAttrs: {
pname = "aiomealie";
version = "1.2.1";
version = "1.2.2";
pyproject = true;
src = fetchFromGitHub {
owner = "joostlek";
repo = "python-mealie";
tag = "v${finalAttrs.version}";
hash = "sha256-TwzE5GAP4DNxj3DZdu83eSobcYYbrOn9tPb+8904a/8=";
hash = "sha256-2244R2r+b08UG58Amd94Dsn6d59oAiJLL6jOd4ZOqro=";
};
build-system = [ poetry-core ];
@@ -1,31 +1,41 @@
{
lib,
aiohttp,
aioresponses,
buildPythonPackage,
fetchFromGitHub,
mashumaro,
pytest-asyncio,
pytestCheckHook,
setuptools,
}:
buildPythonPackage rec {
pname = "aiotedee";
version = "0.2.27";
version = "0.3.0";
pyproject = true;
src = fetchFromGitHub {
owner = "zweckj";
repo = "aiotedee";
tag = "v${version}";
hash = "sha256-yN5v/kZ3oX3HYqgQR33gyCkGkHaAdPpP1Q9Q0eavJJs=";
hash = "sha256-0+wUQRsMb9y8XUwwUX3exIzkaAFLYNUpsAr0MgnkMIo=";
};
build-system = [ setuptools ];
dependencies = [ aiohttp ];
dependencies = [
aiohttp
mashumaro
];
pythonImportsCheck = [ "aiotedee" ];
# Module has no tests
doCheck = false;
nativeCheckInputs = [
aioresponses
pytest-asyncio
pytestCheckHook
];
meta = {
description = "Module to interact with Tedee locks";
@@ -1,82 +0,0 @@
{
lib,
buildPythonPackage,
fetchFromGitHub,
pbr,
httpx,
pillow,
pycryptodome,
pyjwt,
pytest-asyncio,
pytestCheckHook,
python,
respx,
setuptools,
time-machine,
tzdata,
}:
buildPythonPackage rec {
pname = "bimmer-connected";
version = "0.17.4";
pyproject = true;
src = fetchFromGitHub {
owner = "bimmerconnected";
repo = "bimmer_connected";
tag = version;
hash = "sha256-wNrUZepfkEFPvU3HWop9JAjCHlK3v+xTuAUIZ0P4YtA=";
};
build-system = [
pbr
setuptools
];
env.PBR_VERSION = version;
dependencies = [
httpx
pycryptodome
pyjwt
];
optional-dependencies = {
china = [ pillow ];
};
postInstall = ''
cp -R bimmer_connected/tests/responses $out/${python.sitePackages}/bimmer_connected/tests/
'';
nativeCheckInputs = [
pytest-asyncio
pytestCheckHook
respx
time-machine
]
++ lib.concatAttrValues optional-dependencies;
disabledTests = [
# presumably regressed in pytest-asyncio 0.23.0
"test_get_remote_position_too_old"
];
preCheck = ''
export TZDIR=${tzdata}/${python.sitePackages}/tzdata/zoneinfo
export PATH=$out/bin:$PATH
'';
pythonImportsCheck = [ "bimmer_connected" ];
meta = {
changelog = "https://github.com/bimmerconnected/bimmer_connected/releases/tag/${version}";
description = "Library to read data from the BMW Connected Drive portal";
mainProgram = "bimmerconnected";
homepage = "https://github.com/bimmerconnected/bimmer_connected";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ dotlambda ];
# https://github.com/bimmerconnected/bimmer_connected#library-not-working-anymore-due-to-changes-at-bmw-side
broken = true;
};
}
@@ -19,14 +19,14 @@
buildPythonPackage (finalAttrs: {
pname = "bleak-esphome";
version = "3.6.0";
version = "3.7.1";
pyproject = true;
src = fetchFromGitHub {
owner = "bluetooth-devices";
repo = "bleak-esphome";
tag = "v${finalAttrs.version}";
hash = "sha256-XZ/JjrHJ8Zd1t2Ahi0Jc7S/bkXMIBHfDTVanoGemtI0=";
hash = "sha256-drNMU0Ka5e3uQ9UHXP5O+I4l4jOxUdq2Bf0WcsGk9IM=";
};
postPatch = ''
@@ -14,14 +14,14 @@
buildPythonPackage rec {
pname = "bleak-retry-connector";
version = "4.5.0";
version = "4.6.0";
pyproject = true;
src = fetchFromGitHub {
owner = "Bluetooth-Devices";
repo = "bleak-retry-connector";
tag = "v${version}";
hash = "sha256-aGk5wNrQ8ti2qu1FxmOqPtDpivm5DRaKvwzDNz9rFmQ=";
hash = "sha256-wUfIP0UHL60AAq38j4Kc2enTccdhT7aaSrXWJ1y5+7I=";
};
build-system = [ poetry-core ];
@@ -5,7 +5,6 @@
python,
runCommand,
fetchFromGitHub,
fetchpatch,
configargparse,
acme,
configobj,
@@ -25,25 +24,17 @@
buildPythonPackage rec {
pname = "certbot";
version = "5.3.1";
version = "5.4.0";
pyproject = true;
src = fetchFromGitHub {
owner = "certbot";
repo = "certbot";
tag = "v${version}";
hash = "sha256-u9qzZFhvIapXQwxehvMieCV+4uigteSOeHVw7ycMCEU=";
hash = "sha256-Tu46Wybod89TiwsVccNuQcweWoeQE1wbH+pDWNC9+kE=";
};
patches = [
(fetchpatch {
name = "fix-test_rollback_too_many.patch";
url = "https://github.com/certbot/certbot/commit/4c61a450d4a843c66baab6d5d9a42ce0554e99d7.patch";
hash = "sha256-PSh2JXoEWNUrqxNh8X5QchyIP8KRHT60T/cLax6VRWo=";
})
];
postPatch = "cd certbot"; # using sourceRoot would interfere with patches
sourceRoot = "${src.name}/certbot";
build-system = [ setuptools ];
@@ -22,7 +22,7 @@
buildPythonPackage (finalAttrs: {
pname = "deebot-client";
version = "18.0.0";
version = "18.1.0";
pyproject = true;
disabled = pythonOlder "3.13";
@@ -31,12 +31,12 @@ buildPythonPackage (finalAttrs: {
owner = "DeebotUniverse";
repo = "client.py";
tag = finalAttrs.version;
hash = "sha256-ZKLA8RbYsysY+pAT9K6z2yThWo2YeM6TLqLBMuo+/GQ=";
hash = "sha256-+URVdNcuV7H/vrYw+8fq6IdZ9OSZsbqDEZSd8s5XKyA=";
};
cargoDeps = rustPlatform.fetchCargoVendor {
inherit (finalAttrs) pname version src;
hash = "sha256-UcgQKv8YhsWdOzKQ7K3HTX/FmopQen7HQ/Jyuj+hePI=";
hash = "sha256-umCaUmtlKPs/sxdZ0BdA9pbg5gy4aOQl3uSAioD1gXs=";
};
nativeBuildInputs = [
@@ -0,0 +1,51 @@
{
buildPythonPackage,
fetchFromGitHub,
fetchpatch,
lib,
pyserial-asyncio-fast,
pytest-asyncio,
pytestCheckHook,
pythonOlder,
setuptools,
}:
buildPythonPackage (finalAttrs: {
pname = "enocean-async";
version = "0.4.2";
pyproject = true;
disabled = pythonOlder "3.14";
src = fetchFromGitHub {
owner = "henningkerstan";
repo = "enocean-async";
tag = "v${finalAttrs.version}";
hash = "sha256-VBBZwNPBgJ9rXUaAVtRzgdebeDtfJCt7R1zOu3Eom80=";
};
build-system = [ setuptools ];
dependencies = [
pyserial-asyncio-fast
];
pythonImportsCheck = [ "enocean_async" ];
nativeCheckInputs = [
pytest-asyncio
pytestCheckHook
];
disabledTestPaths = [
# tests have broken imports, fixed in 0.12.4
"tests/test_eep.py"
];
meta = {
changelog = "https://github.com/henningkerstan/enocean-async/blob/${finalAttrs.src.tag}/CHANGELOG.md";
description = "Async implementation of the EnOcean Serial Protocol Version 3";
license = lib.licenses.asl20;
maintainers = [ lib.maintainers.dotlambda ];
};
})
@@ -1,63 +0,0 @@
{
lib,
buildPythonPackage,
fetchFromGitHub,
fetchpatch2,
# build-system
setuptools,
# dependencies
beautifulsoup4,
pyserial,
# tests
pytestCheckHook,
}:
buildPythonPackage rec {
pname = "enocean";
version = "0.60.1";
pyproject = true;
src = fetchFromGitHub {
owner = "kipe";
repo = "enocean";
tag = version;
hash = "sha256-S62YvRP1bvEzzzMd/jMjIdHAZsUImF9EQhsrPPzebDE=";
};
patches = [
(fetchpatch2 {
name = "replace-nose-with-pytest.patch";
url = "https://github.com/kipe/enocean/commit/e5ca3b70f0920f129219c980ad549d7f3a4576de.patch";
hash = "sha256-cDBvI0I4W5YkGTpg+rKy08TUAmKlhKa/5+Muou9iArs=";
})
];
build-system = [ setuptools ];
pythonRemoveDeps = [ "enum-compat" ];
dependencies = [
beautifulsoup4
pyserial
];
nativeCheckInputs = [ pytestCheckHook ];
pythonImportsCheck = [
"enocean.communicators"
"enocean.protocol.packet"
"enocean.utils"
];
meta = {
changelog = "https://github.com/kipe/enocean/releases/tag/${version}";
description = "EnOcean serial protocol implementation";
mainProgram = "enocean_example.py";
homepage = "https://github.com/kipe/enocean";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ dotlambda ];
};
}
@@ -9,10 +9,10 @@
debugpy,
fetchFromGitHub,
hatchling,
keyring,
pytest-asyncio,
pytest-freezer,
pytestCheckHook,
pythonOlder,
pyyaml,
syrupy,
voluptuous,
@@ -20,16 +20,14 @@
buildPythonPackage (finalAttrs: {
pname = "evohome-async";
version = "1.1.3";
version = "1.2.0";
pyproject = true;
disabled = pythonOlder "3.12";
src = fetchFromGitHub {
owner = "zxdavb";
repo = "evohome-async";
tag = "v${finalAttrs.version}";
hash = "sha256-Xc5GWbKqgcIIHKBvcAIS8zL9rZeEDEkwHOhhUdnImbE=";
hash = "sha256-CbC5ms3YcNB6n5UmCHfHKTtyJau68m8QZ5UwRyiR9MM=";
};
build-system = [ hatchling ];
@@ -45,6 +43,7 @@ buildPythonPackage (finalAttrs: {
aiofiles
asyncclick
debugpy
keyring
];
};
@@ -13,14 +13,14 @@
buildPythonPackage rec {
pname = "fnv-hash-fast";
version = "1.6.0";
version = "2.0.2";
pyproject = true;
src = fetchFromGitHub {
owner = "bdraco";
repo = "fnv-hash-fast";
tag = "v${version}";
hash = "sha256-1o/SwX9N+wBNVkihUuCYrJAEH28FxhKEhyOEK7tK1XE=";
hash = "sha256-wfiOI23LzdoTYl5/Wr/+3qvcJ3ce9ZrfETQXX1g6eIU=";
};
build-system = [
@@ -31,8 +31,6 @@ buildPythonPackage rec {
dependencies = [ fnvhash ];
pythonRelaxDeps = [ "fnvhash" ];
pythonImportsCheck = [ "fnv_hash_fast" ];
nativeCheckInputs = [
@@ -1,29 +1,29 @@
{
lib,
asyncclick,
bleak,
bleak-retry-connector,
bleak,
buildPythonPackage,
fetchFromGitHub,
poetry-core,
pytest-asyncio,
pytestCheckHook,
setuptools,
tzlocal,
}:
buildPythonPackage rec {
buildPythonPackage (finalAttrs: {
pname = "gardena-bluetooth";
version = "1.6.0";
version = "2.1.0";
pyproject = true;
src = fetchFromGitHub {
owner = "elupus";
repo = "gardena-bluetooth";
tag = version;
hash = "sha256-L726A0o9TIxFjHOxx0e42RIj4XMOdeZTJE2gWo6OhG4=";
tag = finalAttrs.version;
hash = "sha256-H02Uq/n2iWAtrO/Reg+yWkFxVkLJWUhq3frc50EF4fo=";
};
build-system = [ poetry-core ];
build-system = [ setuptools ];
dependencies = [
bleak
@@ -45,8 +45,8 @@ buildPythonPackage rec {
meta = {
description = "Module for interacting with Gardena Bluetooth";
homepage = "https://github.com/elupus/gardena-bluetooth";
changelog = "https://github.com/elupus/gardena-bluetooth/releases/tag/${version}";
changelog = "https://github.com/elupus/gardena-bluetooth/releases/tag/${finalAttrs.src.tag}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ fab ];
};
}
})
@@ -8,14 +8,14 @@
buildPythonPackage (finalAttrs: {
pname = "growattserver";
version = "2.0.0";
version = "1.9.0";
pyproject = true;
src = fetchFromGitHub {
owner = "indykoning";
repo = "PyPi_GrowattServer";
tag = finalAttrs.version;
hash = "sha256-HsBNxE1iHdZbyzGF1rKqiftDXKbOXy8Wf2rQ17kWz6k=";
hash = "sha256-CTIc+LROas7RGf9BzGl8hasS512LsNXcDnzLu0DD+Bk=";
};
build-system = [ setuptools ];
@@ -20,14 +20,14 @@
buildPythonPackage rec {
pname = "habluetooth";
version = "5.8.0";
version = "5.11.2";
pyproject = true;
src = fetchFromGitHub {
owner = "Bluetooth-Devices";
repo = "habluetooth";
tag = "v${version}";
hash = "sha256-VbD4fAOZtDtPIGGYb3ISP7c9YLBXAXeOIICqf9Pm5ho=";
hash = "sha256-/5oJOSNP3vbmX7V8m6LLomNAvRzV2hM0vMCbwjFBmbg=";
};
build-system = [
@@ -2,7 +2,6 @@
lib,
acme,
aiohttp,
async-timeout,
atomicwrites-homeassistant,
attrs,
buildPythonPackage,
@@ -32,16 +31,16 @@
buildPythonPackage (finalAttrs: {
pname = "hass-nabucasa";
version = "1.15.0";
version = "2.2.0";
pyproject = true;
disabled = pythonOlder "3.13";
disabled = pythonOlder "3.14";
src = fetchFromGitHub {
owner = "nabucasa";
repo = "hass-nabucasa";
tag = finalAttrs.version;
hash = "sha256-WwpCAIfl/2fp01v9Rq4tQW70aoVlvhEJl31XQTAENmA=";
hash = "sha256-+HRyXdl/gw/dhZ+T3peinD5FMm0O/M87Uu/wyLU1eJs=";
};
postPatch = ''
@@ -54,7 +53,6 @@ buildPythonPackage (finalAttrs: {
dependencies = [
acme
aiohttp
async-timeout
atomicwrites-homeassistant
attrs
ciso8601
@@ -13,13 +13,13 @@
buildPythonPackage rec {
pname = "home-connect-async";
version = "0.8.3";
version = "0.8.5";
pyproject = true;
src = fetchPypi {
pname = "home_connect_async";
inherit version;
hash = "sha256-G+mHXNbqU0pgqpvGfKmn6CrwZOhRG76m57eHimgN17s=";
hash = "sha256-LiBBE9AiyMWipQKtHsOZ5rfqOgB75flrJYtU1oAw+hs=";
};
build-system = [
@@ -0,0 +1,36 @@
{
buildPythonPackage,
fetchFromGitHub,
lib,
pytestCheckHook,
setuptools,
}:
buildPythonPackage (finalAttrs: {
pname = "infrared-protocols";
version = "1.1.0";
pyproject = true;
src = fetchFromGitHub {
owner = "home-assistant-libs";
repo = "infrared-protocols";
tag = finalAttrs.version;
hash = "sha256-Sw9N8vdmdR13itUtx3Vcmc0DJN8IcIub+mzEWms/fpE=";
};
build-system = [ setuptools ];
pythonImportsCheck = [ "infrared_protocols" ];
nativeCheckInputs = [
pytestCheckHook
];
meta = {
changelog = "https://github.com/home-assistant-libs/infrared-protocols/releases/tag/${finalAttrs.src.tag}";
description = "Library to decode and encode infrared signals";
homepage = "https://github.com/home-assistant-libs/infrared-protocols";
license = lib.licenses.mit;
maintainers = [ lib.maintainers.dotlambda ];
};
})
@@ -7,14 +7,14 @@
buildPythonPackage rec {
pname = "knx-frontend";
version = "2026.3.2.183756";
version = "2026.3.28.223133";
pyproject = true;
# TODO: source build, uses yarn.lock
src = fetchPypi {
pname = "knx_frontend";
inherit version;
hash = "sha256-OaY14AY3iaAbs8EDCLDI1LmwjtOcz1NBBWhZEU2apjI=";
hash = "sha256-U/lHc4SZcUEG1yq2sMkSzM9n/n6TuNhbx4U2ZmMqAY0=";
};
build-system = [ setuptools ];
@@ -9,14 +9,14 @@
buildPythonPackage rec {
pname = "librehardwaremonitor-api";
version = "1.10.1";
version = "1.11.1";
pyproject = true;
src = fetchFromGitHub {
owner = "Sab44";
repo = "librehardwaremonitor-api";
tag = "v${version}";
hash = "sha256-l9xfO6PzJSYCoZWLdYpeZFpVK0x3ysvS+VM/9BPKlFs=";
hash = "sha256-GAJgLrfYhkdafk0DSgcNgXQ2vjtBf/kOEkkRw7i9rlE=";
};
build-system = [ hatchling ];
@@ -0,0 +1,28 @@
diff --git a/motionblindsble/device.py b/motionblindsble/device.py
index 9c6ecf9..0d9affc 100644
--- a/motionblindsble/device.py
+++ b/motionblindsble/device.py
@@ -11,6 +11,8 @@ from asyncio import (
TimerHandle,
create_task,
get_event_loop,
+ new_event_loop,
+ set_event_loop,
sleep,
wait,
)
@@ -248,7 +250,13 @@ class ConnectionQueue:
)
return device._create_task(target=device.establish_connection())
_LOGGER.debug("(%s) Connecting", device.ble_device.address)
- return get_event_loop().create_task(device.establish_connection())
+ try:
+ loop = get_event_loop()
+ except RuntimeError:
+ loop = new_event_loop()
+ set_event_loop(loop)
+
+ return loop.create_task(device.establish_connection())
async def wait_for_connection(self, device: MotionDevice) -> bool:
"""Wait for a connection, return True to last caller if connected."""
@@ -22,6 +22,11 @@ buildPythonPackage rec {
hash = "sha256-1dA3YTjoAhe+p5vk6Xb42a+rE63m2mn5iHhVV/6tlQ0=";
};
patches = [
# https://github.com/LennP/motionblindsble/pull/3
./asyncio-compat.patch
];
postPatch = ''
substituteInPlace setup.py \
--replace-fail "{{VERSION_PLACEHOLDER}}" "${version}"
@@ -23,6 +23,10 @@ buildPythonPackage rec {
build-system = [ poetry-core ];
pythonRelaxDeps = [
"pycountry"
];
dependencies = [
pycountry
pyrate-limiter
@@ -10,7 +10,6 @@
pyserial,
pyserial-asyncio-fast,
pytestCheckHook,
pythonAtLeast,
setuptools,
voluptuous,
}:
@@ -27,6 +26,11 @@ buildPythonPackage rec {
hash = "sha256-iC0qeiTHtrdzQtJ3R01nJDCfdBKBg0jw1v49ZII24/4=";
};
patches = [
# https://github.com/pyinsteon/pyinsteon/pull/440
./python-3.14.diff
];
build-system = [ setuptools ];
dependencies = [
@@ -0,0 +1,693 @@
commit d9866fc537a16fc7d8f8c6116eae78a77679efbd
Author: Sandro Jäckel <sandro.jaeckel@gmail.com>
Date: Wed, 1 Apr 2026 23:12:22 +0200
Fix Python 3.14 support
diff --git a/pyinsteon/tools/tools_base.py b/pyinsteon/tools/tools_base.py
index 01a6101..6ad4cb3 100644
--- a/pyinsteon/tools/tools_base.py
+++ b/pyinsteon/tools/tools_base.py
@@ -19,7 +19,7 @@
from ..constants import RelayMode, ThermostatMode, ToggleMode
from ..x10_address import X10Address
from .log_filter import NoStdoutFilter, StdoutFilter, StripPrefixFilter
-from .utils import patch_stdin_stdout, set_loop, stdio
+from .utils import patch_stdin_stdout, stdio
_LOGGING = logging.getLogger(__name__)
LOG_FILE_NAME = "pyinsteon_tools.log"
@@ -272,7 +272,6 @@ def start(cls):
)
args = parser.parse_args()
- set_loop()
loop = asyncio.get_event_loop()
intro = [
diff --git a/pyinsteon/tools/utils.py b/pyinsteon/tools/utils.py
index daed401..263c4a5 100644
--- a/pyinsteon/tools/utils.py
+++ b/pyinsteon/tools/utils.py
@@ -1,7 +1,7 @@
"""Utilities for the tools commands."""
import asyncio
-from asyncio.events import BaseDefaultEventLoopPolicy
+from asyncio import DefaultEventLoopPolicy
import os
import sys
@@ -81,21 +81,3 @@ async def drain(self):
return await loop.run_in_executor(None, sys.stdout.writelines, data)
return Win32StdinReader(), Win32StdoutWriter()
-
-
-def set_loop() -> None:
- """Attempt to use different loop."""
- if sys.platform == "win32":
- if hasattr(asyncio, "WindowsProactorEventLoopPolicy"):
- # pylint: disable=no-member
- policy = asyncio.WindowsProactorEventLoopPolicy()
- else:
-
- class ProactorPolicy(BaseDefaultEventLoopPolicy):
- """Event loop policy to create proactor loops."""
-
- _loop_factory = asyncio.ProactorEventLoop
-
- policy = ProactorPolicy()
-
- asyncio.set_event_loop_policy(policy)
diff --git a/tests/test_managers/test_device_link_manager.py b/tests/test_managers/test_device_link_manager.py
index 1eca93d..7db9d25 100644
--- a/tests/test_managers/test_device_link_manager.py
+++ b/tests/test_managers/test_device_link_manager.py
@@ -24,7 +24,7 @@ def _reset_devices(addresses):
device.async_status = AsyncMock()
device.aldb.clear_pending()
device.aldb.async_write = AsyncMock()
- device.aldb.async_write.call_count = 0
+ device.aldb.async_write.reset_mock()
device.aldb.clear = Mock()
device.async_status.return_value = ResponseStatus.SUCCESS
@@ -73,7 +73,7 @@ async def test_device_links_broadcast(self):
topic = "1a1a1a.1.on.all_link_broadcast"
topic_item = TopicItem(topic, cmd_kwargs(0x11, 0xFF, None, "00.00.01"), 0)
- devices["3c3c3c"].async_status.call_count = 0
+ devices["3c3c3c"].async_status.reset_mock()
send_topics([topic_item])
await asyncio.sleep(0.2)
assert devices["3c3c3c"].async_status.call_count == 1
@@ -89,7 +89,7 @@ async def test_device_links_cleanup(self):
):
topic = "1a1a1a.1.off.all_link_cleanup"
topic_item = TopicItem(topic, cmd_kwargs(0x11, 0xFF, None, "11.11.11"), 0)
- devices["3c3c3c"].async_status.call_count = 0
+ devices["3c3c3c"].async_status.reset_mock()
send_topics([topic_item])
await asyncio.sleep(0.2)
assert devices["3c3c3c"].async_status.call_count == 1
@@ -108,7 +108,7 @@ async def test_device_links_dedup(self):
topic_cleanup_item = TopicItem(
topic_cleanup, cmd_kwargs(0x11, 0xFF, None, "11.11.11"), 0.2
)
- devices["3c3c3c"].async_status.call_count = 0
+ devices["3c3c3c"].async_status.reset_mock()
send_topics([topic_broadcast_item, topic_cleanup_item])
await asyncio.sleep(1)
assert devices["3c3c3c"].async_status.call_count == 1
@@ -250,7 +250,7 @@ async def test_device_links_broadcast_no_response(self):
topic = "1a1a1a.1.off.all_link_broadcast"
topic_item = TopicItem(topic, cmd_kwargs(0x11, 0xFF, None, "00.00.01"), 0)
- devices["3c3c3c"].async_status.call_count = 0
+ devices["3c3c3c"].async_status.reset_mock()
devices["3c3c3c"].async_status.return_value = ResponseStatus.FAILURE
send_topics([topic_item])
await asyncio.sleep(0.2)
diff --git a/tests/test_managers/test_link_manager.py b/tests/test_managers/test_link_manager.py
index cd2e602..8104617 100644
--- a/tests/test_managers/test_link_manager.py
+++ b/tests/test_managers/test_link_manager.py
@@ -23,7 +23,7 @@ def _reset_devices(addresses):
device.async_status = AsyncMock()
device.aldb.clear_pending()
device.aldb.async_write = AsyncMock()
- device.aldb.async_write.call_count = 0
+ device.aldb.async_write.reset_mock()
device.aldb.clear = Mock()
device.async_status.return_value = ResponseStatus.SUCCESS
diff --git a/tests/test_managers/test_scene_manager.py b/tests/test_managers/test_scene_manager.py
index 9371fdf..d816cfb 100644
--- a/tests/test_managers/test_scene_manager.py
+++ b/tests/test_managers/test_scene_manager.py
@@ -37,7 +37,7 @@ def _reset_devices(addresses):
device = devices[addr]
device.aldb.clear_pending()
device.aldb.async_write = AsyncMock(return_value=(0, 0))
- device.aldb.async_write.call_count = 0
+ device.aldb.async_write.reset_mock()
device.aldb.clear = Mock()
diff --git a/tests/test_tools/test_advanced.py b/tests/test_tools/test_advanced.py
index 9ebe6ee..2cc2e46 100644
--- a/tests/test_tools/test_advanced.py
+++ b/tests/test_tools/test_advanced.py
@@ -131,7 +131,7 @@ async def test_enter_linking_mode(self):
inputs,
allow_logging=True,
)
- mock_enter_linking_mode.call_count = 0
+ mock_enter_linking_mode.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_enter_linking_mode.call_count == 1
mock_enter_linking_mode.assert_called_with(
@@ -147,7 +147,7 @@ async def test_enter_linking_mode(self):
inputs,
allow_logging=True,
)
- mock_enter_linking_mode.call_count = 0
+ mock_enter_linking_mode.reset_mock()
stdout.buffer = []
remove_log_file(curr_dir)
await cmd_mgr.async_cmdloop("")
@@ -170,7 +170,7 @@ async def test_enter_linking_mode(self):
cmd_mgr, _, stdout = self.setup_cmd_tool(
AdvancedTools, inputs, allow_logging=True
)
- mock_enter_linking_mode.call_count = 0
+ mock_enter_linking_mode.reset_mock()
stdout.buffer = []
remove_log_file(curr_dir)
await cmd_mgr.async_cmdloop("")
@@ -199,7 +199,7 @@ async def test_enter_linking_mode(self):
AdvancedTools,
inputs,
)
- mock_enter_linking_mode.call_count = 0
+ mock_enter_linking_mode.reset_mock()
stdout.buffer = []
remove_log_file(curr_dir)
await cmd_mgr.async_cmdloop("")
@@ -228,7 +228,7 @@ async def test_enter_linking_mode(self):
AdvancedTools,
inputs,
)
- mock_enter_linking_mode.call_count = 0
+ mock_enter_linking_mode.reset_mock()
stdout.buffer = []
remove_log_file(curr_dir)
await cmd_mgr.async_cmdloop("")
@@ -275,8 +275,8 @@ async def test_remove_link(self):
inputs,
allow_logging=True,
)
- good_device.aldb.remove.call_count = 0
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.remove.reset_mock()
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert good_device.aldb.remove.call_count == 1
assert good_device.aldb.async_write.call_count == 1
@@ -291,8 +291,8 @@ async def test_remove_link(self):
inputs,
allow_logging=True,
)
- good_device.aldb.remove.call_count = 0
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.remove.reset_mock()
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert good_device.aldb.remove.call_count == 0
assert good_device.aldb.async_write.call_count == 0
@@ -306,8 +306,8 @@ async def test_remove_link(self):
inputs,
allow_logging=True,
)
- good_device.aldb.remove.call_count = 0
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.remove.reset_mock()
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert good_device.aldb.remove.call_count == 0
assert good_device.aldb.async_write.call_count == 0
@@ -321,8 +321,8 @@ async def test_remove_link(self):
inputs,
allow_logging=True,
)
- good_device.aldb.remove.call_count = 0
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.remove.reset_mock()
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert good_device.aldb.remove.call_count == 0
assert good_device.aldb.async_write.call_count == 0
@@ -336,8 +336,8 @@ async def test_remove_link(self):
inputs,
allow_logging=True,
)
- good_device.aldb.remove.call_count = 0
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.remove.reset_mock()
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert good_device.aldb.remove.call_count == 0
assert good_device.aldb.async_write.call_count == 0
@@ -349,8 +349,8 @@ async def test_remove_link(self):
inputs,
allow_logging=True,
)
- good_device.aldb.remove.call_count = 0
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.remove.reset_mock()
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert good_device.aldb.remove.call_count == 0
assert good_device.aldb.async_write.call_count == 0
@@ -364,8 +364,8 @@ async def test_remove_link(self):
inputs,
allow_logging=True,
)
- good_device.aldb.remove.call_count = 0
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.remove.reset_mock()
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert good_device.aldb.remove.call_count == 0
assert good_device.aldb.async_write.call_count == 0
@@ -383,8 +383,8 @@ async def test_remove_link(self):
inputs,
allow_logging=True,
)
- good_device.aldb.remove.call_count = 0
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.remove.reset_mock()
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert good_device.aldb.remove.call_count == 1
assert good_device.aldb.async_write.call_count == 1
@@ -402,8 +402,8 @@ async def test_remove_link(self):
inputs,
allow_logging=True,
)
- good_device.aldb.remove.call_count = 0
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.remove.reset_mock()
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert good_device.aldb.remove.call_count == 0
assert good_device.aldb.async_write.call_count == 0
@@ -422,8 +422,8 @@ async def test_remove_link(self):
)
battery_device.aldb.load_saved_records(ALDBStatus.LOADED, records)
- battery_device.aldb.remove.call_count = 0
- battery_device.aldb.async_write.call_count = 0
+ battery_device.aldb.remove.reset_mock()
+ battery_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert battery_device.aldb.remove.call_count == 1
assert battery_device.aldb.async_write.call_count == 1
@@ -884,7 +884,7 @@ async def test_add_link(self):
)
good_device.aldb.load_saved_records(ALDBStatus.LOADED, records)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert len(good_device.aldb.pending_changes) == 0
assert good_device.aldb.async_write.call_count == 0
@@ -904,7 +904,7 @@ async def test_add_link(self):
)
good_device.aldb.load_saved_records(ALDBStatus.LOADED, records)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert len(good_device.aldb.pending_changes) == 0
@@ -923,7 +923,7 @@ async def test_add_link(self):
)
good_device.aldb.load_saved_records(ALDBStatus.LOADED, records)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert len(good_device.aldb.pending_changes) == 0
@@ -942,7 +942,7 @@ async def test_add_link(self):
)
good_device.aldb.load_saved_records(ALDBStatus.LOADED, records)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert len(good_device.aldb.pending_changes) == 0
assert good_device.aldb.async_write.call_count == 0
@@ -969,7 +969,7 @@ async def test_add_link(self):
)
good_device.aldb.load_saved_records(ALDBStatus.LOADED, records)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert len(good_device.aldb.pending_changes) == 0
assert good_device.aldb.async_write.call_count == 0
@@ -996,7 +996,7 @@ async def test_add_link(self):
)
good_device.aldb.load_saved_records(ALDBStatus.LOADED, records)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert len(good_device.aldb.pending_changes) == 0
assert good_device.aldb.async_write.call_count == 0
@@ -1022,7 +1022,7 @@ async def test_add_link(self):
)
good_device.aldb.load_saved_records(ALDBStatus.LOADED, records)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert len(good_device.aldb.pending_changes) == 0
assert good_device.aldb.async_write.call_count == 0
@@ -1048,7 +1048,7 @@ async def test_add_link(self):
)
good_device.aldb.load_saved_records(ALDBStatus.EMPTY, {})
good_device.aldb.async_write = AsyncMock(return_value=(0, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop()
assert len(good_device.aldb.pending_changes) == 0
assert good_device.aldb.async_write.call_count == 0
@@ -1154,7 +1154,7 @@ async def test_cancel_linking_mode(self):
inputs,
allow_logging=True,
)
- mock_cancel_linking_mode.call_count = 0
+ mock_cancel_linking_mode.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_cancel_linking_mode.call_count == 1
@@ -1356,7 +1356,7 @@ def create_random_arg_str(
)
good_device.aldb.load_saved_records(ALDBStatus.LOADED, records)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop("")
assert good_device.aldb.async_write.call_count == 1
@@ -1373,7 +1373,7 @@ def create_random_arg_str(
)
good_device.aldb.load_saved_records(ALDBStatus.LOADED, records)
good_device.aldb.async_write = AsyncMock(return_value=(0, 1))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop("")
assert good_device.aldb.async_write.call_count == 1
@@ -1389,7 +1389,7 @@ def create_random_arg_str(
allow_logging=True,
)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop("")
assert good_device.aldb.async_write.call_count == 0
@@ -1405,7 +1405,7 @@ def create_random_arg_str(
allow_logging=True,
)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop("")
assert good_device.aldb.async_write.call_count == 0
@@ -1421,7 +1421,7 @@ def create_random_arg_str(
allow_logging=True,
)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop("")
assert good_device.aldb.async_write.call_count == 0
@@ -1437,7 +1437,7 @@ def create_random_arg_str(
allow_logging=True,
)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop("")
assert good_device.aldb.async_write.call_count == 0
@@ -1453,7 +1453,7 @@ def create_random_arg_str(
allow_logging=True,
)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop("")
assert good_device.aldb.async_write.call_count == 0
@@ -1473,7 +1473,7 @@ def create_random_arg_str(
allow_logging=True,
)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop("")
assert good_device.aldb.async_write.call_count == 0
@@ -1493,7 +1493,7 @@ def create_random_arg_str(
allow_logging=True,
)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop("")
assert good_device.aldb.async_write.call_count == 0
@@ -1515,7 +1515,7 @@ def create_random_arg_str(
)
battery_device.aldb.load_saved_records(ALDBStatus.LOADED, records)
battery_device.aldb.async_write = AsyncMock(return_value=(0, 0))
- battery_device.aldb.async_write.call_count = 0
+ battery_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop("")
assert battery_device.aldb.async_write.call_count == 1
@@ -1532,6 +1532,6 @@ def create_random_arg_str(
)
good_device.aldb.load_saved_records(ALDBStatus.PARTIAL, records)
good_device.aldb.async_write = AsyncMock(return_value=(1, 0))
- good_device.aldb.async_write.call_count = 0
+ good_device.aldb.async_write.reset_mock()
await cmd_mgr.async_cmdloop("")
assert good_device.aldb.async_write.call_count == 0
diff --git a/tests/test_tools/test_aldb.py b/tests/test_tools/test_aldb.py
index 5edd9d6..207babd 100644
--- a/tests/test_tools/test_aldb.py
+++ b/tests/test_tools/test_aldb.py
@@ -130,7 +130,7 @@ async def test_add_device_to_scene(self):
"exit",
],
)
- mock_async_link_devices.call_count = 0
+ mock_async_link_devices.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_async_link_devices.call_count == 1
if device.cat == DeviceCategory.DIMMABLE_LIGHTING_CONTROL:
@@ -153,7 +153,7 @@ async def test_add_device_to_scene(self):
"exit",
],
)
- mock_async_link_devices.call_count = 0
+ mock_async_link_devices.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_async_link_devices.call_count == 1
if device.cat == DeviceCategory.DIMMABLE_LIGHTING_CONTROL:
@@ -190,7 +190,7 @@ async def test_add_device_to_scene(self):
"exit",
],
)
- mock_async_link_devices.call_count = 0
+ mock_async_link_devices.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_async_link_devices.call_count == 1
if device.cat == DeviceCategory.DIMMABLE_LIGHTING_CONTROL:
@@ -228,7 +228,7 @@ async def test_add_device_to_scene(self):
"exit",
],
)
- mock_async_link_devices.call_count = 0
+ mock_async_link_devices.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_async_link_devices.call_count == 1
if device.cat == DeviceCategory.DIMMABLE_LIGHTING_CONTROL:
@@ -262,7 +262,7 @@ async def test_add_device_to_scene(self):
"exit",
],
)
- mock_async_link_devices.call_count = 0
+ mock_async_link_devices.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_async_link_devices.call_count == 0
@@ -275,7 +275,7 @@ async def test_add_device_to_scene(self):
"exit",
],
)
- mock_async_link_devices.call_count = 0
+ mock_async_link_devices.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_async_link_devices.call_count == 0
@@ -287,7 +287,7 @@ async def test_add_device_to_scene(self):
"exit",
],
)
- mock_async_link_devices.call_count = 0
+ mock_async_link_devices.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_async_link_devices.call_count == 0
@@ -299,7 +299,7 @@ async def test_add_device_to_scene(self):
"exit",
],
)
- mock_async_link_devices.call_count = 0
+ mock_async_link_devices.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_async_link_devices.call_count == 0
@@ -311,7 +311,7 @@ async def test_add_device_to_scene(self):
"exit",
],
)
- mock_async_link_devices.call_count = 0
+ mock_async_link_devices.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_async_link_devices.call_count == 0
@@ -496,7 +496,7 @@ def __init__(self):
cmd_mgr, _, _ = self.setup_cmd_tool(
ToolsAldb, [f"{command} {mock_device.address} y", "exit"]
)
- mock_device.aldb.async_load.call_count = 0
+ mock_device.aldb.async_load.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_device.aldb.async_load.call_count == 1 # no retry
@@ -504,7 +504,7 @@ def __init__(self):
cmd_mgr, _, _ = self.setup_cmd_tool(
ToolsAldb, [f"load_aldb {devices.modem.address}", "exit"]
)
- devices.modem.aldb.async_load.call_count = 0
+ devices.modem.aldb.async_load.reset_mock()
await cmd_mgr.async_cmdloop("")
assert devices.modem.aldb.async_load.call_count == 1
devices.modem.aldb.async_load.assert_called_with()
diff --git a/tests/test_tools/test_commands.py b/tests/test_tools/test_commands.py
index e9ac640..91cdea6 100644
--- a/tests/test_tools/test_commands.py
+++ b/tests/test_tools/test_commands.py
@@ -221,8 +221,8 @@ async def test_scene_on_off(self):
"exit",
],
)
- mock_trigger_scene_on.call_count = 0
- mock_trigger_scene_off.call_count = 0
+ mock_trigger_scene_on.reset_mock()
+ mock_trigger_scene_off.reset_mock()
await cmd_mgr.async_cmdloop("")
if cmd == "scene_on":
assert mock_trigger_scene_on.call_count == 1
@@ -241,8 +241,8 @@ async def test_scene_on_off(self):
"exit",
],
)
- mock_trigger_scene_on.call_count = 0
- mock_trigger_scene_off.call_count = 0
+ mock_trigger_scene_on.reset_mock()
+ mock_trigger_scene_off.reset_mock()
await cmd_mgr.async_cmdloop("")
if cmd == "scene_on":
assert mock_trigger_scene_on.call_count == 1
@@ -263,8 +263,8 @@ async def test_scene_on_off(self):
device_01.async_on = AsyncMock()
device_01.async_off = AsyncMock()
stdout.buffer = []
- mock_trigger_scene_on.call_count = 0
- mock_trigger_scene_off.call_count = 0
+ mock_trigger_scene_on.reset_mock()
+ mock_trigger_scene_off.reset_mock()
await cmd_mgr.async_cmdloop("")
buffer = clean_buffer(stdout.buffer)
assert buffer[2] == "Scene number is required\n"
@@ -472,7 +472,7 @@ async def mock_missing_arg(on_level: int, group: int = 0, fast: bool = False):
"exit",
],
)
- mock_method.call_count = 0
+ mock_method.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_method.call_count == 1
mock_method.assert_called_with(on_level=255, group=0, fast=False)
@@ -491,7 +491,7 @@ async def mock_missing_arg(on_level: int, group: int = 0, fast: bool = False):
"exit",
],
)
- mock_method.call_count = 0
+ mock_method.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_method.call_count == 1
mock_method.assert_called_with(on_level=on_level, group=0, fast=False)
@@ -509,7 +509,7 @@ async def mock_missing_arg(on_level: int, group: int = 0, fast: bool = False):
"exit",
],
)
- mock_method.call_count = 0
+ mock_method.reset_mock()
await cmd_mgr.async_cmdloop("")
assert mock_method.call_count == 1
mock_method.assert_called_with(on_level=255, group=0, fast=True)
@@ -568,7 +568,7 @@ async def mock_missing_arg(on_level: int, group: int = 0, fast: bool = False):
"exit",
],
)
- mock_method.call_count = 0
+ mock_method.reset_mock()
stdout.buffer = []
await cmd_mgr.async_cmdloop("")
buffer = clean_buffer(stdout.buffer)
diff --git a/tests/test_tools/test_main.py b/tests/test_tools/test_main.py
index 0f8b038..e6b562e 100644
--- a/tests/test_tools/test_main.py
+++ b/tests/test_tools/test_main.py
@@ -978,7 +978,7 @@ async def test_remove_device(self):
await cmd_mgr.async_cmdloop()
assert mock_unlink_devices.call_count == 3
- mock_unlink_devices.call_count = 0
+ mock_unlink_devices.reset_mock()
# Remove known device using command line mode
cmd_mgr, _, _ = self.setup_cmd_tool(
InsteonCmd, [f"remove_device {str(good_address)}", 1, "exit"]
@@ -987,7 +987,7 @@ async def test_remove_device(self):
assert mock_unlink_devices.call_count == 0
assert devices.async_remove_device.call_count == 1
- mock_unlink_devices.call_count = 0
+ mock_unlink_devices.reset_mock()
# Remove known device using input mode
cmd_mgr, _, _ = self.setup_cmd_tool(
InsteonCmd, ["remove_device", str(good_address), 1, "exit"]
@@ -996,8 +996,8 @@ async def test_remove_device(self):
assert mock_unlink_devices.call_count == 0
assert devices.async_remove_device.call_count == 2
- mock_unlink_devices.call_count = 0
- # Remove known device using bakcground mode
+ mock_unlink_devices.reset_mock()
+ # Remove known device using background mode
cmd_mgr, _, _ = self.setup_cmd_tool(
InsteonCmd, [f"remove_device -b {str(good_address)}", 1, "exit"]
)
@@ -1005,7 +1005,7 @@ async def test_remove_device(self):
assert mock_unlink_devices.call_count == 0
assert devices.async_remove_device.call_count == 3
- mock_unlink_devices.call_count = 0
+ mock_unlink_devices.reset_mock()
# Remove known device using command line mode with force
cmd_mgr, _, _ = self.setup_cmd_tool(
InsteonCmd, [f"remove_device {str(good_address)} f", 1, "exit"]
@@ -12,14 +12,14 @@
buildPythonPackage (finalAttrs: {
pname = "pyintelliclima";
version = "0.2.2";
version = "0.3.1";
pyproject = true;
src = fetchFromGitHub {
owner = "dvdinth";
repo = "pyintelliclima";
tag = "v${finalAttrs.version}";
hash = "sha256-gfOfEc39o4JAdvr6GI9ly5AuRV+sseCvWY/jNAh1A5M=";
hash = "sha256-EHcnrynvNIfo31vZyh8tS/5JfFuEQGVlYzu4XyD3XCI=";
};
pythonRelaxDeps = [ "dacite" ];
@@ -11,14 +11,14 @@
buildPythonPackage (finalAttrs: {
pname = "pyliebherrhomeapi";
version = "0.3.0";
version = "0.4.1";
pyproject = true;
src = fetchFromGitHub {
owner = "mettolen";
repo = "pyliebherrhomeapi";
tag = finalAttrs.version;
hash = "sha256-J+s9oRKK2DWZV05M1bvDEBqczaJXuif4t3eOJUgrAu0=";
hash = "sha256-f0+2gqNLeyLP6rOAWay+T04ry21SPA79pm+prG7kJtc=";
};
build-system = [ setuptools ];
@@ -16,14 +16,14 @@
buildPythonPackage rec {
pname = "pylitterbot";
version = "2025.1.0";
version = "2025.2.0";
pyproject = true;
src = fetchFromGitHub {
owner = "natekspencer";
repo = "pylitterbot";
tag = version;
hash = "sha256-pQnrmH/mfh7cwEnL/qoG3dN638HsP9w5zK0CgarGstE=";
hash = "sha256-o5A4AWil6FeHjUBgbHaA010kszhuncHHzf8+CH4QL0c=";
};
build-system = [
@@ -15,7 +15,7 @@
buildPythonPackage rec {
pname = "pyloadapi";
version = "1.4.2";
version = "2.0.0";
pyproject = true;
disabled = pythonOlder "3.12";
@@ -24,7 +24,7 @@ buildPythonPackage rec {
owner = "tr4nt0r";
repo = "pyloadapi";
tag = "v${version}";
hash = "sha256-DkYbQB91KYskfm2yDVmR0/MJiixC2C5miHpTq7RpVBU=";
hash = "sha256-+fGrXKS7jomYMJOPneKyAV/nrvqBFrqh3ds4R46lQ48=";
};
build-system = [
@@ -1,35 +1,50 @@
{
lib,
buildPythonPackage,
fetchPypi,
fetchFromGitHub,
pytestCheckHook,
setuptools,
telnetlib3,
}:
buildPythonPackage rec {
pname = "pylutron";
version = "0.2.18";
version = "0.4.0";
pyproject = true;
src = fetchPypi {
inherit pname version;
hash = "sha256-7ZnNfa4POUTMi9sDGMyR6gu9Xpg+j/JmyWVnBBSnRSE=";
src = fetchFromGitHub {
owner = "thecynic";
repo = "pylutron";
tag = version;
hash = "sha256-y5RDwlIxmwzKihTDFZKoOJL+TPJbY05MKPUMs2hBWiw=";
};
postPatch = ''
substituteInPlace setup.py \
--replace-fail TEMPLATE_VERSION ${version}
'';
build-system = [ setuptools ];
# Project has no tests
doCheck = false;
dependencies = [
telnetlib3
];
pythonImportsCheck = [ "pylutron" ];
nativeCheckInputs = [
pytestCheckHook
];
enabledTestPaths = [
"tests"
];
meta = {
description = "Python library for controlling a Lutron RadioRA 2 system";
homepage = "https://github.com/thecynic/pylutron";
changelog = "https://github.com/thecynic/pylutron/releases/tag/${version}";
license = with lib.licenses; [
mit
psfl
];
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ fab ];
};
}
@@ -22,21 +22,16 @@
buildPythonPackage rec {
pname = "pyrate-limiter";
version = "4.0.2";
version = "4.1.0";
pyproject = true;
src = fetchFromGitHub {
owner = "vutran1710";
repo = "PyrateLimiter";
tag = "v${version}";
hash = "sha256-xWxe70J69g9Tq35GjdJeT7MjUdoSEGj8w1cIKvLxJss=";
hash = "sha256-2gWbabdRqwWiC4xbMx/VGBwwMcygVMKJswXgd4Ia+xE=";
};
postPatch = ''
# tests cause too many connections to the postgres server and crash/timeout
sed -i "/create_postgres_bucket,/d" tests/conftest.py
'';
build-system = [
hatchling
uv-dynamic-versioning
@@ -60,12 +55,13 @@ buildPythonPackage rec {
];
nativeCheckInputs = [
filelock
pytestCheckHook
pytest-asyncio
pytest-xdist
redis
redisTestHook
]
++ lib.concatAttrValues optional-dependencies;
];
disabledTestPaths = [
# Slow: > 1.5 seconds/test run standalone on a fast machine
@@ -14,14 +14,14 @@
buildPythonPackage (finalAttrs: {
pname = "pyswitchbot";
version = "1.0.0";
version = "2.0.0";
pyproject = true;
src = fetchFromGitHub {
owner = "Danielhiversen";
repo = "pySwitchbot";
tag = finalAttrs.version;
hash = "sha256-O8bdWAAtNfLo7WBgvKMm0LXCzpFz1MUqAbBJlyUBcPs=";
hash = "sha256-1DJ7mo1L75PPoVivngJPdbEWFTF36KLShkr3V1/rLDY=";
};
build-system = [ setuptools ];
@@ -19,14 +19,14 @@
buildPythonPackage (finalAttrs: {
pname = "python-bsblan";
version = "5.1.2";
version = "5.1.3";
pyproject = true;
src = fetchFromGitHub {
owner = "liudger";
repo = "python-bsblan";
tag = "v${finalAttrs.version}";
hash = "sha256-P7c+5x5wQaWfNeeYKkylhV2AQESp40duSQfwsTDVW6M=";
hash = "sha256-2Rynat0eXAWzlCBUJAvKrAFPLl74FMr2r1KtKPBlwYw=";
};
postPatch = ''
@@ -23,14 +23,14 @@
buildPythonPackage (finalAttrs: {
pname = "python-roborock";
version = "4.18.1";
version = "5.0.0";
pyproject = true;
src = fetchFromGitHub {
owner = "Python-roborock";
repo = "python-roborock";
tag = "v${finalAttrs.version}";
hash = "sha256-5ckpRKwrLkjIAUJiXIRN2N9268pzjEjwVPVK/wSolgE=";
hash = "sha256-Lzr+OBbOjsLpkUsFYNJ37teegWjicUAoW9Jvw3hOvGE=";
};
pythonRelaxDeps = [ "pycryptodome" ];
@@ -3,32 +3,39 @@
buildPythonPackage,
fetchFromGitHub,
setuptools,
click,
setuptools-scm,
cryptography,
pytest-asyncio,
pytest-cov-stub,
pytestCheckHook,
}:
buildPythonPackage rec {
pname = "satel-integra";
version = "0.3.7";
version = "1.0.0";
pyproject = true;
src = fetchFromGitHub {
owner = "c-soft";
repo = "satel_integra";
tag = version;
hash = "sha256-nCFb8NaZQ6TO4aXCSpbbHGkJr3nJVkt1R4hi9mts070=";
hash = "sha256-KMbNa/XSyLF1rAB5qm/Sw2GLgigNGaj8g94Np9FSvhY=";
};
postPatch = ''
substituteInPlace setup.py \
--replace "'pytest-runner'," ""
'';
build-system = [
setuptools
setuptools-scm
];
build-system = [ setuptools ];
dependencies = [
cryptography
];
dependencies = [ click ];
nativeCheckInputs = [ pytestCheckHook ];
nativeCheckInputs = [
pytest-asyncio
pytest-cov-stub
pytestCheckHook
];
pythonImportsCheck = [ "satel_integra" ];
@@ -15,14 +15,14 @@
buildPythonPackage rec {
pname = "sense-energy";
version = "0.13.8";
version = "0.14.0";
pyproject = true;
src = fetchFromGitHub {
owner = "scottbonline";
repo = "sense";
tag = version;
hash = "sha256-hIE7wjKP+JcXQZ1lGbKCaKKK2ZlCF5BbJu3H7gqrsKU=";
hash = "sha256-he/Ti15H2JBngvNCBSwJQWa0LBIBFa+x38TW9g2CQ44=";
};
postPatch = ''
@@ -1,29 +1,45 @@
{
lib,
aiohttp,
aioresponses,
buildPythonPackage,
fetchFromGitHub,
poetry-core,
pycryptodome,
pytest-asyncio,
pytest-cov-stub,
pytest-freezer,
pytestCheckHook,
syrupy,
}:
buildPythonPackage (finalAttrs: {
pname = "switchbot-api";
version = "2.10.0";
version = "2.11.0";
pyproject = true;
src = fetchFromGitHub {
owner = "SeraphicCorp";
repo = "py-switchbot-api";
tag = "v${finalAttrs.version}";
hash = "sha256-s6ezIkW36eIaxqedOfIk4KNhCwjXPFkc49qqK2p2eGw=";
hash = "sha256-n2KAKILbywObqxG/lDNHkXWVCcrEJAaqv6xBDH8ed/Q=";
};
build-system = [ poetry-core ];
dependencies = [ aiohttp ];
dependencies = [
aiohttp
pycryptodome
];
# Module has no tests
doCheck = false;
nativeCheckInputs = [
aioresponses
pytest-asyncio
pytest-cov-stub
pytest-freezer
pytestCheckHook
syrupy
];
pythonImportsCheck = [ "switchbot_api" ];
@@ -0,0 +1,69 @@
{
addBinToPathHook,
blessed,
buildPythonPackage,
fetchFromGitHub,
hatchling,
lib,
pexpect,
prettytable,
pytest-asyncio,
pytest-cov-stub,
pytest-timeout,
pytest-xdist,
pytestCheckHook,
trustme,
wcwidth,
}:
buildPythonPackage (finalAttrs: {
pname = "telnetlib3";
version = "4.0.1";
pyproject = true;
src = fetchFromGitHub {
owner = "jquast";
repo = "telnetlib3";
tag = finalAttrs.version;
hash = "sha256-dKvdg+1l7qRyc7COR0U6SKbrp5uJRtc4wsDPQEAkXZ8=";
};
build-system = [ hatchling ];
pythonRelaxDeps = [
"wcwidth"
];
dependencies = [
blessed
wcwidth
];
optional-dependencies = {
extras = [
prettytable
# FIXME package ucs-detect
];
};
pythonImportsCheck = [ "telnetlib3" ];
nativeCheckInputs = [
addBinToPathHook
pexpect
pytest-asyncio
pytest-cov-stub
pytest-timeout
pytest-xdist
pytestCheckHook
trustme
];
meta = {
changelog = "https://github.com/jquast/telnetlib3/blob/${finalAttrs.src.tag}/docs/history.rst";
description = "Feature-rich Telnet Server, Client, and Protocol library for Python";
homepage = "https://github.com/jquast/telnetlib3";
license = lib.licenses.isc;
maintainers = [ lib.maintainers.dotlambda ];
};
})
@@ -14,26 +14,26 @@
crc,
gpiod,
pyserial-asyncio-fast,
tqdm,
typing-extensions,
zigpy,
# tests
aioresponses,
pytestCheckHook,
pytest-asyncio,
pytest-mock,
pytest-timeout,
}:
buildPythonPackage rec {
pname = "universal-silabs-flasher";
version = "0.1.3";
version = "1.0.3";
pyproject = true;
src = fetchFromGitHub {
owner = "NabuCasa";
repo = "universal-silabs-flasher";
tag = "v${version}";
hash = "sha256-VBMxm953xp0qt4MIfOSjFNQu2jOh52uQ9Zz94NWy3dY=";
hash = "sha256-6rdWi+un85YWSann2zHFFnWvAZF6V8wXBP1VunaiZMo=";
};
postPatch = ''
@@ -50,16 +50,16 @@ buildPythonPackage rec {
coloredlogs
crc
pyserial-asyncio-fast
tqdm
typing-extensions
zigpy
]
++ lib.optionals (stdenv.hostPlatform.isLinux) [ gpiod ];
nativeCheckInputs = [
aioresponses
pytestCheckHook
pytest-asyncio
pytest-mock
pytest-timeout
];
disabledTests = [
@@ -10,14 +10,14 @@
buildPythonPackage rec {
pname = "victron-ble-ha-parser";
version = "0.4.10";
version = "0.6.3";
pyproject = true;
src = fetchFromGitHub {
owner = "rajlaud";
repo = "victron-ble-ha-parser";
tag = "v${version}";
hash = "sha256-mvQrY1f3Da621yMgTzxduZQ0pxCJN6j7+6pgFwgl4Rs=";
hash = "sha256-wSkTIX1TTP2geU7bgsdJj6Nv5SIGgd6k84G7tRCo3O0=";
};
build-system = [ setuptools ];
@@ -15,14 +15,14 @@
buildPythonPackage (finalAttrs: {
pname = "yalexs-ble";
version = "3.2.8";
version = "3.3.0";
pyproject = true;
src = fetchFromGitHub {
owner = "Yale-Libs";
repo = "yalexs-ble";
tag = "v${finalAttrs.version}";
hash = "sha256-Aq0tZp5h3vDxxoPYefSCoTqJV8dZYvMbITd3icdIMf8=";
hash = "sha256-K6DZ1fjXDp6IjTfW2BTc83HR6xi5i0hFn4NOteJaGMU=";
};
build-system = [ poetry-core ];
@@ -10,14 +10,14 @@
buildPythonPackage rec {
pname = "yoto-api";
version = "2.1.2";
version = "2.2.3";
pyproject = true;
src = fetchFromGitHub {
owner = "cdnninja";
repo = "yoto_api";
tag = "v${version}";
hash = "sha256-bRJjDgmMLJcmWyyxTg0BLjBukGi8JX9WWz9IoUl9Fcw=";
hash = "sha256-+xe/ghVmWs39MfR+v76M1AhTMB5LHAA8ChSHzVY8S3w=";
};
build-system = [ setuptools ];
@@ -13,7 +13,7 @@
buildPythonPackage rec {
pname = "zha-quirks";
version = "1.0.1";
version = "1.1.1";
pyproject = true;
disabled = pythonOlder "3.12";
@@ -22,7 +22,7 @@ buildPythonPackage rec {
owner = "zigpy";
repo = "zha-device-handlers";
tag = version;
hash = "sha256-u57Bv3oK0yAQLijlEG18brCfJXZghaA9OhbcGJ+GtCk=";
hash = "sha256-GxNxc+cu3wBjz/1VF2+0DJ/PBTLlJKm0ncgzeaw5Fxw=";
};
postPatch = ''
@@ -59,7 +59,7 @@ buildPythonPackage rec {
meta = {
description = "ZHA Device Handlers are custom quirks implementations for Zigpy";
homepage = "https://github.com/dmulcahey/zha-device-handlers";
homepage = "https://github.com/zigpy/zha-device-handlers";
changelog = "https://github.com/zigpy/zha-device-handlers/releases/tag/${src.tag}";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ fab ];
@@ -23,7 +23,7 @@
buildPythonPackage rec {
pname = "zha";
version = "1.0.2";
version = "1.1.1";
pyproject = true;
disabled = pythonOlder "3.12";
@@ -32,7 +32,7 @@ buildPythonPackage rec {
owner = "zigpy";
repo = "zha";
tag = version;
hash = "sha256-ps3Qq1iGB9uPXe8CWDGLbST90EIAmszT0nuh0AvUjKg=";
hash = "sha256-hr+FeBVQ1yqQGOhhTBd4c1g6OEntGaPPuHt1/nD+HKE=";
};
postPatch = ''
@@ -24,14 +24,14 @@
buildPythonPackage rec {
pname = "zigpy";
version = "1.1.1";
version = "1.2.2";
pyproject = true;
src = fetchFromGitHub {
owner = "zigpy";
repo = "zigpy";
tag = version;
hash = "sha256-/KbWpXo+IsK2AdPN18aNorVtvcFHFx/Igg/0Mn8NsRM=";
hash = "sha256-xCgQJYZJTjt81RC6rLb5hEyauJD3qxMK5TXTxTgXwT4=";
};
postPatch = ''
@@ -2,7 +2,7 @@
# Do not edit!
{
version = "2026.3.4";
version = "2026.4.0";
components = {
"3_day_blinds" =
ps: with ps; [
@@ -504,6 +504,9 @@
"automation" =
ps: with ps; [
];
"autoskope" =
ps: with ps; [
]; # missing inputs: autoskope_client
"avea" =
ps: with ps; [
avea
@@ -587,6 +590,9 @@
ps: with ps; [
mozart-api
];
"battery" =
ps: with ps; [
];
"bauknecht" =
ps: with ps; [
];
@@ -742,12 +748,8 @@
zeroconf
];
"bmw_connected_drive" =
ps:
with ps;
[
bimmer-connected
]
++ bimmer-connected.optional-dependencies.china;
ps: with ps; [
];
"bond" =
ps: with ps; [
bond-async
@@ -883,6 +885,32 @@
ha-ffmpeg
py-canary
];
"casper_glow" =
ps: with ps; [
aioesphomeapi
aiohasupervisor
aioruuvigateway
aioshelly
aiousbwatcher
bleak
bleak-esphome
bleak-retry-connector
bluetooth-adapters
bluetooth-auto-recovery
bluetooth-data-tools
dbus-fast
esphome-dashboard-api
ha-ffmpeg
habluetooth
hassil
home-assistant-intents
ifaddr
mutagen
pymicro-vad
pyserial
pyspeex-noise
zeroconf
]; # missing inputs: pycasperglow
"cast" =
ps: with ps; [
aiohasupervisor
@@ -920,6 +948,9 @@
ps: with ps; [
pychannels
];
"chess_com" =
ps: with ps; [
]; # missing inputs: chess-com-api
"cisco_ios" =
ps: with ps; [
pexpect
@@ -1299,6 +1330,9 @@
pillow
pydoods
];
"door" =
ps: with ps; [
];
"doorbird" =
ps: with ps; [
doorbirdpy
@@ -1365,13 +1399,6 @@
"duckdns" =
ps: with ps; [
];
"duke_energy" =
ps: with ps; [
aiodukeenergy
fnv-hash-fast
psutil-home-assistant
sqlalchemy
];
"dunehd" =
ps: with ps; [
pdunehd
@@ -1566,7 +1593,7 @@
"enocean" =
ps: with ps; [
aiousbwatcher
enocean
enocean-async
pyserial
];
"enphase_envoy" =
@@ -1946,6 +1973,9 @@
ps: with ps; [
pyfreedompro
];
"freshr" =
ps: with ps; [
]; # missing inputs: pyfreshr
"fressnapf_tracker" =
ps: with ps; [
fressnapftracker
@@ -2009,6 +2039,9 @@
"garadget" =
ps: with ps; [
];
"garage_door" =
ps: with ps; [
];
"garages_amsterdam" =
ps: with ps; [
odp-amsterdam
@@ -2040,6 +2073,9 @@
pyspeex-noise
zeroconf
];
"gate" =
ps: with ps; [
];
"gaviota" =
ps: with ps; [
];
@@ -2495,7 +2531,7 @@
pyqrcode
pyturbojpeg
zeroconf
];
]; # missing inputs: homekit-audio-proxy
"homekit_controller" =
ps: with ps; [
aioesphomeapi
@@ -2557,6 +2593,9 @@
ps: with ps; [
python-hpilo
];
"hr_energy_qube" =
ps: with ps; [
]; # missing inputs: python-qube-heatpump
"html5" =
ps: with ps; [
py-vapid
@@ -2608,6 +2647,9 @@
"humidifier" =
ps: with ps; [
];
"humidity" =
ps: with ps; [
];
"hunterdouglas_powerview" =
ps: with ps; [
aiopvapi
@@ -2768,6 +2810,9 @@
defusedxml
ihcsdk
];
"illuminance" =
ps: with ps; [
];
"image" =
ps: with ps; [
];
@@ -2844,6 +2889,10 @@
influxdb
influxdb-client
];
"infrared" =
ps: with ps; [
infrared-protocols
];
"inkbird" =
ps: with ps; [
aioesphomeapi
@@ -3404,6 +3453,10 @@
"levoit" =
ps: with ps; [
];
"lg_infrared" =
ps: with ps; [
infrared-protocols
];
"lg_netcast" =
ps: with ps; [
ifaddr
@@ -3421,6 +3474,9 @@
ps: with ps; [
librehardwaremonitor-api
];
"lichess" =
ps: with ps; [
]; # missing inputs: aiolichess
"lidarr" =
ps: with ps; [
aiopyarr
@@ -3526,6 +3582,9 @@
"logger" =
ps: with ps; [
];
"lojack" =
ps: with ps; [
]; # missing inputs: lojack-api
"london_air" =
ps: with ps; [
];
@@ -3830,9 +3889,6 @@
ps: with ps; [
mcstatus
];
"mini_connected" =
ps: with ps; [
];
"minio" =
ps: with ps; [
minio
@@ -3907,6 +3963,9 @@
ps: with ps; [
moehlenhoff-alpha2
];
"moisture" =
ps: with ps; [
];
"mold_indicator" =
ps: with ps; [
];
@@ -3955,6 +4014,9 @@
pyspeex-noise
zeroconf
];
"motion" =
ps: with ps; [
];
"motion_blinds" =
ps: with ps; [
ifaddr
@@ -4325,6 +4387,9 @@
ps: with ps; [
pyobihai
];
"occupancy" =
ps: with ps; [
];
"octoprint" =
ps: with ps; [
pyoctoprintapi
@@ -4420,7 +4485,7 @@
ha-ffmpeg
onvif-zeep-async
wsdiscovery
];
]; # missing inputs: onvif_parsers
"open_meteo" =
ps: with ps; [
open-meteo
@@ -4449,6 +4514,32 @@
"openalpr_cloud" =
ps: with ps; [
];
"opendisplay" =
ps: with ps; [
aioesphomeapi
aiohasupervisor
aioruuvigateway
aioshelly
aiousbwatcher
bleak
bleak-esphome
bleak-retry-connector
bluetooth-adapters
bluetooth-auto-recovery
bluetooth-data-tools
dbus-fast
esphome-dashboard-api
ha-ffmpeg
habluetooth
hassil
home-assistant-intents
ifaddr
mutagen
pymicro-vad
pyserial
pyspeex-noise
zeroconf
]; # missing inputs: py-opendisplay
"openerz" =
ps: with ps; [
openerz-api
@@ -4797,6 +4888,9 @@
"portlandgeneral" =
ps: with ps; [
];
"power" =
ps: with ps; [
];
"powerfox" =
ps: with ps; [
powerfox
@@ -5828,6 +5922,9 @@
ps: with ps; [
solarlog-cli
];
"solarman" =
ps: with ps; [
]; # missing inputs: solarman-opendata
"solax" =
ps: with ps; [
solax
@@ -6203,6 +6300,9 @@
ps: with ps; [
temperusb
];
"temperature" =
ps: with ps; [
];
"template" =
ps: with ps; [
];
@@ -6451,7 +6551,7 @@
++ python-kasa.optional-dependencies.speedups;
"tplink_lte" =
ps: with ps; [
]; # missing inputs: tp-connected
];
"tplink_omada" =
ps: with ps; [
tplink-omada-client
@@ -6521,6 +6621,9 @@
ps: with ps; [
triggercmd
];
"trmnl" =
ps: with ps; [
]; # missing inputs: trmnl
"tts" =
ps: with ps; [
ha-ffmpeg
@@ -6588,6 +6691,9 @@
ps: with ps; [
aiounifi
];
"unifi_access" =
ps: with ps; [
]; # missing inputs: py-unifi-access
"unifi_direct" =
ps: with ps; [
unifi-ap
@@ -6930,10 +7036,16 @@
ps: with ps; [
wiffi
];
"wiim" =
ps: with ps; [
]; # missing inputs: wiim
"wilight" =
ps: with ps; [
pywilight
];
"window" =
ps: with ps; [
];
"wirelesstag" =
ps: with ps; [
wirelesstagpy
@@ -7338,6 +7450,7 @@
"baf"
"balboa"
"bang_olufsen"
"battery"
"bayesian"
"binary_sensor"
"blackbird"
@@ -7407,6 +7520,7 @@
"deako"
"debugpy"
"deconz"
"decora_wifi"
"default_config"
"deluge"
"demo"
@@ -7429,6 +7543,7 @@
"dlna_dmr"
"dlna_dms"
"dnsip"
"door"
"doorbird"
"dormakaba_dkey"
"downloader"
@@ -7438,7 +7553,6 @@
"dsmr"
"dsmr_reader"
"duckdns"
"duke_energy"
"dunehd"
"duotecno"
"dwd_weather_warnings"
@@ -7539,8 +7653,10 @@
"fujitsu_fglair"
"fully_kiosk"
"fyta"
"garage_door"
"garages_amsterdam"
"gardena_bluetooth"
"gate"
"gdacs"
"generic"
"generic_hygrostat"
@@ -7617,7 +7733,6 @@
"homeassistant_sky_connect"
"homeassistant_yellow"
"homee"
"homekit"
"homekit_controller"
"homematic"
"homematicip_cloud"
@@ -7632,6 +7747,7 @@
"hue_ble"
"huisbaasje"
"humidifier"
"humidity"
"hunterdouglas_powerview"
"husqvarna_automower"
"husqvarna_automower_ble"
@@ -7649,6 +7765,7 @@
"ifttt"
"igloohome"
"ign_sismologia"
"illuminance"
"image"
"image_processing"
"image_upload"
@@ -7661,6 +7778,7 @@
"indevolt"
"inels"
"influxdb"
"infrared"
"inkbird"
"input_boolean"
"input_button"
@@ -7726,6 +7844,7 @@
"led_ble"
"lektrico"
"letpot"
"lg_infrared"
"lg_netcast"
"lg_soundbar"
"lg_thinq"
@@ -7807,12 +7926,14 @@
"modem_callerid"
"modern_forms"
"moehlenhoff_alpha2"
"moisture"
"mold_indicator"
"monarch_money"
"monoprice"
"monzo"
"moon"
"mopeka"
"motion"
"motion_blinds"
"motionblinds_ble"
"motioneye"
@@ -7879,6 +8000,7 @@
"nyt_games"
"nzbget"
"obihai"
"occupancy"
"octoprint"
"ohme"
"ollama"
@@ -7890,7 +8012,6 @@
"onedrive_for_business"
"onewire"
"onkyo"
"onvif"
"open_meteo"
"open_router"
"openai_conversation"
@@ -7909,6 +8030,7 @@
"opnsense"
"opower"
"oralb"
"orvibo"
"osoenergy"
"otbr"
"otp"
@@ -7945,6 +8067,7 @@
"pooldose"
"poolsense"
"portainer"
"power"
"powerfox"
"powerfox_local"
"powerwall"
@@ -8156,6 +8279,7 @@
"tellduslive"
"teltonika"
"temper"
"temperature"
"template"
"tesla_fleet"
"tesla_wall_connector"
@@ -8183,8 +8307,10 @@
"tomorrowio"
"toon"
"totalconnect"
"touchline"
"touchline_sl"
"tplink"
"tplink_lte"
"tplink_omada"
"traccar"
"traccar_server"
@@ -8275,6 +8401,7 @@
"whois"
"wiffi"
"wilight"
"window"
"withings"
"wiz"
"wled"
@@ -10,13 +10,13 @@
buildHomeAssistantComponent rec {
owner = "thomasloven";
domain = "browser_mod";
version = "2.10.0";
version = "2.10.2";
src = fetchFromGitHub {
inherit owner;
repo = "hass-browser_mod";
tag = "v${version}";
hash = "sha256-83cwjgS4JsqZrf8sNXz6wjJOF5pGrmOZko+UfMgn70Q=";
hash = "sha256-GUYQlydFxifMR/ASJCTIfMBKh3lrB8lNDqJvHa/eVHs=";
};
nativeBuildInputs = [
@@ -27,7 +27,7 @@ buildHomeAssistantComponent rec {
npmDeps = fetchNpmDeps {
inherit src;
hash = "sha256-JFfoqhFt1JEM4SsRkJg13QRPsjukUPs5iKpSx6Nvgzs=";
hash = "sha256-ZLWBi1EmqC1MD0O4ZQpie6IRHl6S+qGHhwonvjKGCqo=";
};
npmBuildScript = "build";
@@ -10,13 +10,13 @@
buildHomeAssistantComponent rec {
owner = "NewsGuyTor";
domain = "fellow";
version = "1.3.2";
version = "1.3.3";
src = fetchFromGitHub {
owner = "NewsGuyTor";
repo = "FellowAiden-HomeAssistant";
tag = "v${version}";
hash = "sha256-qJizRqHcYQxcONke/++Hjh6yzHNCxfytvAJYXJWoHu8=";
hash = "sha256-n1D/kP1vxc+/kgZGwl+5nLD6IzERmMXeiQjSKZGiqvc=";
};
passthru.updateScript = unstableGitUpdater { };
@@ -8,13 +8,13 @@
buildHomeAssistantComponent rec {
owner = "homeassistant-ai";
domain = "ha_mcp_tools";
version = "6.7.1";
version = "7.2.0";
src = fetchFromGitHub {
owner = "homeassistant-ai";
repo = "ha-mcp";
tag = "v${version}";
hash = "sha256-CQbjPEtCos0Fi6aAaIWSRMCUQKmjYviYkvJZzbCZg6Y=";
hash = "sha256-1SiWrrUSMU/Pe3vXZIPdUwpVhZM41avmjhO+PFLWmUE=";
};
passthru.updateScript = nix-update-script {
@@ -8,13 +8,13 @@
buildHomeAssistantComponent rec {
owner = "ekutner";
domain = "home_connect_alt";
version = "1.3.4";
version = "1.3.6";
src = fetchFromGitHub {
owner = "ekutner";
repo = "home-connect-hass";
tag = version;
hash = "sha256-X6yRoEJAmBDQzEo8WeEOMFZHJ6OOpw+XUKi+iHHOgOw=";
hash = "sha256-Zi3l4bRS8O+jyrxaY8BB1XCbU9FEQSDMNE9b5DH8oCs=";
};
dependencies = [ home-connect-async ];
@@ -14,13 +14,13 @@
buildHomeAssistantComponent rec {
owner = "SukramJ";
domain = "homematicip_local";
version = "2.4.1";
version = "2.5.0";
src = fetchFromGitHub {
owner = "SukramJ";
repo = "custom_homematic";
tag = version;
hash = "sha256-Hl3nvTEf70SNS0qPatddCO5MEhZfAnMONoT7ghH2U00=";
hash = "sha256-ncD72aL5+SI2CDnAHvHqbJffnEApomjC2k88VIQH9O8=";
};
postPatch = ''
@@ -15,13 +15,13 @@
buildHomeAssistantComponent rec {
owner = "amitfin";
domain = "oref_alert";
version = "6.14.0";
version = "6.15.2";
src = fetchFromGitHub {
owner = "amitfin";
repo = "oref_alert";
tag = "v${version}";
hash = "sha256-g3Ae2AwdhcBv9v3aFjFAqxCPYVBFtQxsbtVAEOL2A60=";
hash = "sha256-2JWvTbnG8PNLLzTGAyz/u7oVCC3reHWYn9utawxIp1s=";
};
# Do not publish cards, currently broken, attempting to write to nix store.
@@ -10,13 +10,13 @@
buildHomeAssistantComponent rec {
owner = "kongo09";
domain = "philips_airpurifier_coap";
version = "0.35.0";
version = "0.36.2";
src = fetchFromGitHub {
inherit owner;
repo = "philips-airpurifier-coap";
rev = "v${version}";
hash = "sha256-PE2FmeqxX0xFlkHC8oZ09md5lBXgpkdlwIRhCVHm4+k=";
hash = "sha256-aVCfUuwPW+0L+OuOoLV0cPezZVKHtO39p/TK/gy2jdg=";
};
dependencies = [
@@ -8,13 +8,13 @@
buildHomeAssistantComponent rec {
owner = "marq24";
domain = "tibber_local";
version = "2026.3.4";
version = "2026.3.5";
src = fetchFromGitHub {
inherit owner;
repo = "ha-tibber-pulse-local";
tag = version;
sha256 = "sha256-XYcTQESAV50GX99QRWrmb57fEHOnpQuMlE/VpGlTPrQ=";
hash = "sha256-vQT0Ul4/QLQhuROENWXjSLVcml5BRWvqNIWdOLXN9dk=";
};
dependencies = [
@@ -11,13 +11,13 @@
buildHomeAssistantComponent rec {
owner = "make-all";
domain = "tuya_local";
version = "2026.3.2";
version = "2026.3.3";
src = fetchFromGitHub {
inherit owner;
repo = "tuya-local";
tag = version;
hash = "sha256-UBVbPaRra8NDG/YotZfBg31ZNKO16XogrW1ECDo0DdA=";
hash = "sha256-cQA2lv8O/17GHLKjJktC4ox1ZEtW7ngS1X+zeJgUeHc=";
};
dependencies = [
@@ -10,13 +10,13 @@
buildHomeAssistantComponent rec {
owner = "jmcollin78";
domain = "versatile_thermostat";
version = "9.3.1";
version = "9.3.2";
src = fetchFromGitHub {
inherit owner;
repo = domain;
tag = version;
hash = "sha256-BdGMF4f6OfG+y6RrN7r7/GjY8OD+4eQM9syuxGI0IiI=";
hash = "sha256-fHmCakDFD6na3IQcQCX2g9XYIIJp0DTaZ9qEcSgw+78=";
};
dependencies = [
@@ -14,13 +14,13 @@
buildHomeAssistantComponent rec {
owner = "mampfes";
domain = "waste_collection_schedule";
version = "2.11.0";
version = "2.12.1";
src = fetchFromGitHub {
inherit owner;
repo = "hacs_waste_collection_schedule";
tag = version;
hash = "sha256-+yt6kjUV+fqbOa7jj603XdGX7XtI8mXnCnmUjYFNA7c=";
hash = "sha256-mR8UCDQDQBMYCxIA8DKLhD+u9utfMx+woS5L2E7mxXM=";
};
dependencies = [
@@ -8,13 +8,13 @@
buildHomeAssistantComponent rec {
owner = "cdnninja";
domain = "yoto";
version = "3.0.4";
version = "3.1.0";
src = fetchFromGitHub {
owner = "cdnninja";
repo = "yoto_ha";
tag = "v${version}";
hash = "sha256-lVd5Yko9oPCcsSORYe3d8UbOOYEcqvxU37gm/NthptI=";
hash = "sha256-b2V2nHH3E0z1AE9C3m5/fXITmWusoyx0rcTIF1nD57U=";
};
dependencies = [
+5 -4
View File
@@ -253,13 +253,13 @@ let
extraBuildInputs = extraPackages python.pkgs;
# Don't forget to run update-component-packages.py after updating
hassVersion = "2026.3.4";
hassVersion = "2026.4.0";
in
python.pkgs.buildPythonApplication rec {
pname = "homeassistant";
version =
assert (componentPackages.version == hassVersion);
#assert (componentPackages.version == hassVersion);
hassVersion;
pyproject = true;
@@ -274,13 +274,13 @@ python.pkgs.buildPythonApplication rec {
owner = "home-assistant";
repo = "core";
tag = version;
hash = "sha256-FONng6GaitzvGyXthBSPK8MioQeoDu8IRoAbXXOaS4Q=";
hash = "sha256-K/PK2i8yOqLm/GJNz5LZG8DZRKXziPzDPaguIMcKMpY=";
};
# Secondary source is pypi sdist for translations
sdist = fetchPypi {
inherit pname version;
hash = "sha256-aK0RMnL54uwak9JCNB79iU6D+HUPRSW4a/BqKqpe8cg=";
hash = "sha256-rSckOYhEYZnmZNCfajGW3b52SMMnXvvSP+O/3jw/GuU=";
};
build-system = with python.pkgs; [
@@ -416,6 +416,7 @@ python.pkgs.buildPythonApplication rec {
"assist_pipeline"
"frontend"
"hue"
"infrared"
"mobile_app"
];
+2 -2
View File
@@ -8,7 +8,7 @@ buildPythonPackage rec {
# the frontend version corresponding to a specific home-assistant version can be found here
# https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/frontend/manifest.json
pname = "home-assistant-frontend";
version = "20260312.1";
version = "20260325.5";
format = "wheel";
src = fetchPypi {
@@ -17,7 +17,7 @@ buildPythonPackage rec {
pname = "home_assistant_frontend";
dist = "py3";
python = "py3";
hash = "sha256-WYQ0tXOFWL4D4HS1/LAx+xHCNp0oyRIIfbALe1xQMLI=";
hash = "sha256-JRQrocKeC2vYsYBYk6KLbuAZADL/57T7egLHZF/v8UI=";
};
# there is nothing to strip in this package
+2 -2
View File
@@ -21,7 +21,7 @@
buildPythonPackage rec {
pname = "home-assistant-intents";
version = "2026.3.3";
version = "2026.3.24";
pyproject = true;
src = fetchFromGitHub {
@@ -29,7 +29,7 @@ buildPythonPackage rec {
repo = "intents-package";
tag = version;
fetchSubmodules = true;
hash = "sha256-jueZ+GmoVcQcvCYsKQVqKdPVl4U32stcwv0N4QTspoE=";
hash = "sha256-nwKMg5O/QnYFFviwg1vC++NoQfMpHHK0WoJaxa1xDwE=";
};
build-system = [
@@ -18,7 +18,7 @@
buildPythonPackage rec {
pname = "pytest-homeassistant-custom-component";
version = "0.13.320";
version = "0.13.321";
pyproject = true;
disabled = pythonOlder "3.13";
@@ -27,7 +27,7 @@ buildPythonPackage rec {
owner = "MatthewFlamm";
repo = "pytest-homeassistant-custom-component";
tag = version;
hash = "sha256-VweH6SWDYO9m0g2MS8awK00DwiflfPpyLep79U60uWw=";
hash = "sha256-slmIxLRbicyzYhnYmefLnPcqq//wRjmJ5xGeJBYxacQ=";
};
build-system = [ setuptools ];
+2 -2
View File
@@ -10,7 +10,7 @@
buildPythonPackage rec {
pname = "homeassistant-stubs";
version = "2026.3.4";
version = "2026.4.0";
pyproject = true;
disabled = python.version != home-assistant.python.version;
@@ -19,7 +19,7 @@ buildPythonPackage rec {
owner = "KapJI";
repo = "homeassistant-stubs";
tag = version;
hash = "sha256-yqp/KNhMIfFTlXYWv8lgALNB6soaHOyZvA1gFExYowo=";
hash = "sha256-uD9+WkhRwwr5l4pKpg7GosTsLqgGCTQA6u3mN+XBhio=";
};
build-system = [
+14 -26
View File
@@ -39,7 +39,7 @@ let
];
emulated_kasa = getComponentDeps "camera" ++ getComponentDeps "conversation";
environment_canada = getComponentDeps "camera";
esphome = getComponentDeps "camera";
esphome = getComponentDeps "camera" ++ getComponentDeps "infrared";
fan = getComponentDeps "conversation";
fish_audio = getComponentDeps "tts";
foscam = getComponentDeps "camera";
@@ -60,7 +60,7 @@ let
ibeacon-ble
];
gpslogger = getComponentDeps "assist_pipeline" ++ getComponentDeps "camera";
group = getComponentDeps "camera" ++ getComponentDeps "conversation";
group = getComponentDeps "camera" ++ getComponentDeps "conversation" ++ getComponentDeps "infrared";
hassio = getComponentDeps "frontend" ++ getComponentDeps "homeassistant_yellow";
hikvision = getComponentDeps "camera";
homeassistant = getComponentDeps "camera" ++ getComponentDeps "conversation";
@@ -77,6 +77,7 @@ let
image_processing = getComponentDeps "conversation";
intelliclima = getComponentDeps "intellifire";
intent = getComponentDeps "conversation";
kitchen_sink = getComponentDeps "infrared";
light = getComponentDeps "conversation";
local_file = getComponentDeps "camera";
locative = getComponentDeps "assist_pipeline" ++ getComponentDeps "camera";
@@ -204,19 +205,6 @@ let
# sandbox doesn't grant access to /sys/class/power_supply
"tests/components/systemmonitor/test_config_flow.py::test_add_and_remove_processes"
];
trane = [
# TraneConfigFlow doesn't support step reauth
"tests/components/trane/test_init.py::test_setup_auth_error"
];
tuya = [
# entity ordering in diagnostics is non-deterministic; fixed upstream in
# https://github.com/home-assistant/core/pull/164819 (landing in HA 2026.4)
"tests/components/tuya/test_diagnostics.py"
];
youtube = [
# outdated snapshot
"tests/components/youtube/test_sensor.py::test_sensor"
];
};
extraDisabledTests = {
@@ -224,12 +212,14 @@ let
# intent fixture mismatch
"test_error_no_device_on_floor"
];
homewizard = [
# Messages don't match expected due to a change in Homewizard's outputs
"test_identify_button"
"test_number_entities"
"test_select_request_error"
"test_switch_entities"
ecovacs = [
# Translation not found for vacuum
"test_raise_segment_changed_issue"
];
roborock = [
# Translation not found for vacuum
"test_clean_segments_mixed_maps"
"test_segments_changed_issue"
];
sensor = [
# Failed: Translation not found for sensor
@@ -246,11 +236,9 @@ let
# tries to retrieve file from github
"test_non_text_stdout_capture"
];
tuya = [
# snapshot mismatches: PyPI sdist translations differ from strings.json
# ("Power-on behavior" vs "Power on behavior"); expected to resolve in HA 2026.4
"test_device_diagnostics[tdq_9htyiowaf5rtdhrv]"
"test_platform_setup_and_discovery"
vacuum = [
# Translation not found for vacuum
"test_segments_changed_issue"
];
zeroconf = [
# multicast socket bind, not possible in the sandbox
+2
View File
@@ -106,6 +106,7 @@ mapAliases {
beancount_docverif = throw "'beancount_docverif' has been renamed to/replaced by 'beancount-docverif'"; # Converted to throw 2025-10-29
beets-stable = lib.warn "beets-stable was aliased to beets, since upstream releases are frequent nowadays" self.beets; # added 2025-10-16
beets-unstable = lib.warn "beets-unstable was aliased to beets, since upstream releases are frequent nowadays" self.beets; # added 2025-10-16
bimmer-connected = throw "'bimmer-connected' was removed because BMW started blocking third parties"; # added 2026-03-30
bip_utils = throw "'bip_utils' has been renamed to/replaced by 'bip-utils'"; # Converted to throw 2025-10-29
bjoern = throw "'bjoern' has been removed, as the upstream repository was unmaintained and it was using libraries with severe security issues."; # Added 2025-09-01
bkcharts = throw "'bkcharts' has been removed as the upstream repository was archived in 2018"; # added 2025-08-26
@@ -188,6 +189,7 @@ mapAliases {
elegy = throw "elegy has been removed because it has transitively been marked as broken since 2023."; # Added 2025-10-11
email_validator = throw "'email_validator' has been renamed to/replaced by 'email-validator'"; # Converted to throw 2025-10-29
embreex = throw "embreex has been removed, as it required embree2"; # added 2025-09-14
enocean = throw "'enocean' was removed because Home Assistant switched to 'enocean-async'"; # added 2026-03-31
eris = throw "eris has been removed due to a hostile upstream moving tags and breaking src FODs"; # Added 2025-09-01
et_xmlfile = throw "'et_xmlfile' has been renamed to/replaced by 'et-xmlfile'"; # Converted to throw 2025-10-29
ev3dev2 = throw "'ev3dev2' has been renamed to/replaced by 'python-ev3dev2'"; # Converted to throw 2025-10-29
+5 -3
View File
@@ -2034,8 +2034,6 @@ self: super: with self; {
billiard = callPackage ../development/python-modules/billiard { };
bimmer-connected = callPackage ../development/python-modules/bimmer-connected { };
binance-connector = callPackage ../development/python-modules/binance-connector { };
binary = callPackage ../development/python-modules/binary { };
@@ -5014,7 +5012,7 @@ self: super: with self; {
enlighten = callPackage ../development/python-modules/enlighten { };
enocean = callPackage ../development/python-modules/enocean { };
enocean-async = callPackage ../development/python-modules/enocean-async { };
enochecker-core = callPackage ../development/python-modules/enochecker-core { };
@@ -7529,6 +7527,8 @@ self: super: with self; {
inform = callPackage ../development/python-modules/inform { };
infrared-protocols = callPackage ../development/python-modules/infrared-protocols { };
ingredient-parser-nlp = callPackage ../development/python-modules/ingredient-parser-nlp { };
iniconfig = callPackage ../development/python-modules/iniconfig { };
@@ -18996,6 +18996,8 @@ self: super: with self; {
tellduslive = callPackage ../development/python-modules/tellduslive { };
telnetlib3 = callPackage ../development/python-modules/telnetlib3 { };
teltasync = callPackage ../development/python-modules/teltasync { };
temescal = callPackage ../development/python-modules/temescal { };