diff -pruN 3.0.8-2/.gitignore 3.0.10-1/.gitignore
--- 3.0.8-2/.gitignore	2024-11-03 00:45:19.000000000 +0000
+++ 3.0.10-1/.gitignore	1970-01-01 00:00:00.000000000 +0000
@@ -1,188 +0,0 @@
-# Created by https://www.gitignore.io/api/python,pycharm,windows
-
-### PyCharm ###
-# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
-# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
-
-.idea/*
-
-# User-specific stuff:
-.idea/**/workspace.xml
-.idea/**/tasks.xml
-.idea/dictionaries
-
-# Sensitive or high-churn files:
-.idea/**/dataSources/
-.idea/**/dataSources.ids
-.idea/**/dataSources.xml
-.idea/**/dataSources.local.xml
-.idea/**/sqlDataSources.xml
-.idea/**/dynamic.xml
-.idea/**/uiDesigner.xml
-
-# Gradle:
-.idea/**/gradle.xml
-.idea/**/libraries
-
-# CMake
-cmake-build-debug/
-
-# Mongo Explorer plugin:
-.idea/**/mongoSettings.xml
-
-## File-based project format:
-*.iws
-
-## Plugin-specific files:
-
-# IntelliJ
-/out/
-
-# mpeltonen/sbt-idea plugin
-.idea_modules/
-
-# JIRA plugin
-atlassian-ide-plugin.xml
-
-# Cursive Clojure plugin
-.idea/replstate.xml
-
-# Crashlytics plugin (for Android Studio and IntelliJ)
-com_crashlytics_export_strings.xml
-crashlytics.properties
-crashlytics-build.properties
-fabric.properties
-
-### PyCharm Patch ###
-# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
-
-# *.iml
-# modules.xml
-# .idea/misc.xml
-# *.ipr
-
-# Sonarlint plugin
-.idea/sonarlint
-
-### Python ###
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-env/
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-
-# PyInstaller
-#  Usually these files are written by a python script from a template
-#  before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*,cover
-.hypothesis/
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-local_settings.py
-
-# Flask stuff:
-instance/
-.webassets-cache
-
-# Scrapy stuff:
-.scrapy
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-target/
-
-# Jupyter Notebook
-.ipynb_checkpoints
-
-# pyenv
-.python-version
-
-# celery beat schedule file
-celerybeat-schedule
-
-# SageMath parsed files
-*.sage.py
-
-# dotenv
-.env
-
-# virtualenv
-.venv
-venv/
-ENV/
-
-# Spyder project settings
-.spyderproject
-.spyproject
-
-# Rope project settings
-.ropeproject
-
-# mkdocs documentation
-/site
-
-### Windows ###
-# Windows thumbnail cache files
-Thumbs.db
-ehthumbs.db
-ehthumbs_vista.db
-
-# Folder config file
-Desktop.ini
-
-# Recycle Bin used on file shares
-$RECYCLE.BIN/
-
-# Windows Installer files
-*.cab
-*.msi
-*.msm
-*.msp
-
-# Windows shortcuts
-*.lnk
-
-# End of https://www.gitignore.io/api/python,pycharm,windows
\ No newline at end of file
diff -pruN 3.0.8-2/.gitlab-ci.yml 3.0.10-1/.gitlab-ci.yml
--- 3.0.8-2/.gitlab-ci.yml	2024-11-03 00:45:19.000000000 +0000
+++ 3.0.10-1/.gitlab-ci.yml	1970-01-01 00:00:00.000000000 +0000
@@ -1,48 +0,0 @@
-# Verify that dependencies resolve
-install:
-  stage: test
-  image: python:3
-  script:
-    - pip3 install -r requirements.txt
-    - pip3 install -r requirements_tests.txt
-    - python3 -m pytest tests/test_init.py
-
-code-style:
-  stage: test
-  image: python:3
-  script:
-    - pip3 install -r requirements_tests.txt
-    - ruff check doorbirdpy tests
-
-# PyPI template
-.pypi:
-  stage: deploy
-  image: python:3
-  before_script:
-    # Install build and distribution tools
-    - python3 -m pip install --user --upgrade setuptools wheel
-    # Build the package
-    - python3 setup.py sdist bdist_wheel
-    # Prepare to upload to PyPI
-    - python3 -m pip install --user --upgrade twine
-  artifacts:
-    paths:
-      - dist/
-      
-# Upload dev builds to TestPyPI
-testpypi:
-  extends: .pypi
-  only:
-    - dev@klikini/doorbirdpy
-  script:
-    # Upload to TestPyPI
-    - python3 -m twine upload --repository-url https://test.pypi.org/legacy/ -u __token__ dist/*
-
-# Upload master builds to PyPI
-realpypi:
-  extends: .pypi
-  only:
-    - master@klikini/doorbirdpy
-  script:
-    # Upload to PyPI
-    - python3 -m twine upload -u __token__ dist/*
diff -pruN 3.0.8-2/CONTRIBUTING.md 3.0.10-1/CONTRIBUTING.md
--- 3.0.8-2/CONTRIBUTING.md	2024-11-03 00:45:19.000000000 +0000
+++ 3.0.10-1/CONTRIBUTING.md	1970-01-01 00:00:00.000000000 +0000
@@ -1,9 +0,0 @@
-Contributions are welcome, including bug fixes and new features within
-scope, and especially updates to ensure compatibility with new DoorBird
-API versions. 
-
-# Code style
-
-![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)
-
-Line length: 120 characters
diff -pruN 3.0.8-2/DoorBirdPy.egg-info/PKG-INFO 3.0.10-1/DoorBirdPy.egg-info/PKG-INFO
--- 3.0.8-2/DoorBirdPy.egg-info/PKG-INFO	1970-01-01 00:00:00.000000000 +0000
+++ 3.0.10-1/DoorBirdPy.egg-info/PKG-INFO	2025-08-26 21:03:39.000000000 +0000
@@ -0,0 +1,28 @@
+Metadata-Version: 2.4
+Name: DoorBirdPy
+Version: 3.0.10
+Summary: Python wrapper for the DoorBird LAN API
+Home-page: https://gitlab.com/klikini/doorbirdpy
+Download-URL: https://gitlab.com/klikini/doorbirdpy/-/archive/master/doorbirdpy-master.zip
+Author: Andy Castille
+Author-email: andy@robiotic.net
+Maintainer: J. Nick Koston
+Maintainer-email: nick@koston.org
+License: MIT
+Platform: Cross Platform
+Requires-Python: >=3.9
+License-File: LICENSE.txt
+Requires-Dist: aiohttp
+Requires-Dist: tenacity>=9
+Dynamic: author
+Dynamic: author-email
+Dynamic: download-url
+Dynamic: home-page
+Dynamic: license
+Dynamic: license-file
+Dynamic: maintainer
+Dynamic: maintainer-email
+Dynamic: platform
+Dynamic: requires-dist
+Dynamic: requires-python
+Dynamic: summary
diff -pruN 3.0.8-2/DoorBirdPy.egg-info/SOURCES.txt 3.0.10-1/DoorBirdPy.egg-info/SOURCES.txt
--- 3.0.8-2/DoorBirdPy.egg-info/SOURCES.txt	1970-01-01 00:00:00.000000000 +0000
+++ 3.0.10-1/DoorBirdPy.egg-info/SOURCES.txt	2025-08-26 21:03:39.000000000 +0000
@@ -0,0 +1,12 @@
+LICENSE.txt
+README.md
+setup.py
+DoorBirdPy.egg-info/PKG-INFO
+DoorBirdPy.egg-info/SOURCES.txt
+DoorBirdPy.egg-info/dependency_links.txt
+DoorBirdPy.egg-info/requires.txt
+DoorBirdPy.egg-info/top_level.txt
+doorbirdpy/__init__.py
+doorbirdpy/py.typed
+doorbirdpy/schedule_entry.py
+tests/test_init.py
\ No newline at end of file
diff -pruN 3.0.8-2/DoorBirdPy.egg-info/dependency_links.txt 3.0.10-1/DoorBirdPy.egg-info/dependency_links.txt
--- 3.0.8-2/DoorBirdPy.egg-info/dependency_links.txt	1970-01-01 00:00:00.000000000 +0000
+++ 3.0.10-1/DoorBirdPy.egg-info/dependency_links.txt	2025-08-26 21:03:39.000000000 +0000
@@ -0,0 +1 @@
+
diff -pruN 3.0.8-2/DoorBirdPy.egg-info/requires.txt 3.0.10-1/DoorBirdPy.egg-info/requires.txt
--- 3.0.8-2/DoorBirdPy.egg-info/requires.txt	1970-01-01 00:00:00.000000000 +0000
+++ 3.0.10-1/DoorBirdPy.egg-info/requires.txt	2025-08-26 21:03:39.000000000 +0000
@@ -0,0 +1,2 @@
+aiohttp
+tenacity>=9
diff -pruN 3.0.8-2/DoorBirdPy.egg-info/top_level.txt 3.0.10-1/DoorBirdPy.egg-info/top_level.txt
--- 3.0.8-2/DoorBirdPy.egg-info/top_level.txt	1970-01-01 00:00:00.000000000 +0000
+++ 3.0.10-1/DoorBirdPy.egg-info/top_level.txt	2025-08-26 21:03:39.000000000 +0000
@@ -0,0 +1 @@
+doorbirdpy
diff -pruN 3.0.8-2/PKG-INFO 3.0.10-1/PKG-INFO
--- 3.0.8-2/PKG-INFO	1970-01-01 00:00:00.000000000 +0000
+++ 3.0.10-1/PKG-INFO	2025-08-26 21:03:39.698757400 +0000
@@ -0,0 +1,28 @@
+Metadata-Version: 2.4
+Name: DoorBirdPy
+Version: 3.0.10
+Summary: Python wrapper for the DoorBird LAN API
+Home-page: https://gitlab.com/klikini/doorbirdpy
+Download-URL: https://gitlab.com/klikini/doorbirdpy/-/archive/master/doorbirdpy-master.zip
+Author: Andy Castille
+Author-email: andy@robiotic.net
+Maintainer: J. Nick Koston
+Maintainer-email: nick@koston.org
+License: MIT
+Platform: Cross Platform
+Requires-Python: >=3.9
+License-File: LICENSE.txt
+Requires-Dist: aiohttp
+Requires-Dist: tenacity>=9
+Dynamic: author
+Dynamic: author-email
+Dynamic: download-url
+Dynamic: home-page
+Dynamic: license
+Dynamic: license-file
+Dynamic: maintainer
+Dynamic: maintainer-email
+Dynamic: platform
+Dynamic: requires-dist
+Dynamic: requires-python
+Dynamic: summary
diff -pruN 3.0.8-2/debian/changelog 3.0.10-1/debian/changelog
--- 3.0.8-2/debian/changelog	2025-02-15 19:15:44.000000000 +0000
+++ 3.0.10-1/debian/changelog	2025-10-03 07:44:14.000000000 +0000
@@ -1,3 +1,15 @@
+doorbirdpy (3.0.10-1) unstable; urgency=medium
+
+  * New upstream release.
+  * Remove 'Rules-Requires-Root: no', now the default.
+  * Update Standards-Version.
+  * Switch to autopkgtest-pkg-pybuild.
+  * Skip tests that need JSON test files that missing from PyPI.
+  * Update debian/watch to format version 5.
+  * Add debian/salsa-ci.yml.
+
+ -- Edward Betts <edward@4angle.com>  Fri, 03 Oct 2025 08:44:14 +0100
+
 doorbirdpy (3.0.8-2) unstable; urgency=medium
 
   * Source-only upload to allow package to migrate to testing.
diff -pruN 3.0.8-2/debian/control 3.0.10-1/debian/control
--- 3.0.8-2/debian/control	2025-02-15 19:14:24.000000000 +0000
+++ 3.0.10-1/debian/control	2025-10-03 07:44:14.000000000 +0000
@@ -16,11 +16,11 @@ Build-Depends-Indep:
  python3-pytest <!nocheck>,
  python3-pytest-asyncio <!nocheck>,
  python3-tenacity <!nocheck>,
-Rules-Requires-Root: no
-Standards-Version: 4.7.0
+Standards-Version: 4.7.2
 Homepage: https://gitlab.com/klikini/doorbirdpy
 Vcs-Browser: https://salsa.debian.org/homeassistant-team/deps/doorbirdpy
 Vcs-Git: https://salsa.debian.org/homeassistant-team/deps/doorbirdpy.git
+Testsuite: autopkgtest-pkg-pybuild
 
 Package: python3-doorbirdpy
 Architecture: all
diff -pruN 3.0.8-2/debian/rules 3.0.10-1/debian/rules
--- 3.0.8-2/debian/rules	2025-02-15 19:14:24.000000000 +0000
+++ 3.0.10-1/debian/rules	2025-10-03 07:44:14.000000000 +0000
@@ -1,3 +1,4 @@
 #!/usr/bin/make -f
+export PYBUILD_TEST_ARGS=-k "not test_ready and not test_schedule and not test_get_schedule_entry and not test_change_schedule_entry and not test_info"
 %:
 	dh $@ --buildsystem=pybuild
diff -pruN 3.0.8-2/debian/salsa-ci.yml 3.0.10-1/debian/salsa-ci.yml
--- 3.0.8-2/debian/salsa-ci.yml	1970-01-01 00:00:00.000000000 +0000
+++ 3.0.10-1/debian/salsa-ci.yml	2025-10-03 07:44:14.000000000 +0000
@@ -0,0 +1,3 @@
+---
+include:
+  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml
diff -pruN 3.0.8-2/debian/tests/control 3.0.10-1/debian/tests/control
--- 3.0.8-2/debian/tests/control	2025-02-15 19:14:24.000000000 +0000
+++ 3.0.10-1/debian/tests/control	1970-01-01 00:00:00.000000000 +0000
@@ -1,8 +0,0 @@
-Tests:
- run-tests,
-Depends:
- python3-aioresponses,
- python3-all,
- python3-pytest,
- python3-pytest-asyncio,
- @,
diff -pruN 3.0.8-2/debian/tests/run-tests 3.0.10-1/debian/tests/run-tests
--- 3.0.8-2/debian/tests/run-tests	2025-02-15 19:14:24.000000000 +0000
+++ 3.0.10-1/debian/tests/run-tests	1970-01-01 00:00:00.000000000 +0000
@@ -1,6 +0,0 @@
-#!/bin/sh
-set -e
-cp -r test* "$AUTOPKGTEST_TMP/" && cd "$AUTOPKGTEST_TMP"
-for py in $(py3versions -s); do
-$py -Wd -m pytest -v --asyncio-mode=auto -x 2>&1
-done
diff -pruN 3.0.8-2/debian/watch 3.0.10-1/debian/watch
--- 3.0.8-2/debian/watch	2025-02-15 19:14:24.000000000 +0000
+++ 3.0.10-1/debian/watch	2025-10-03 07:44:14.000000000 +0000
@@ -1,2 +1,4 @@
-version=4
-https://pypi.debian.net/DoorBirdPy/doorbirdpy-(.+)\.tar\.gz
+Version: 5
+
+Source: https://pypi.python.org/packages/source/D/DoorBirdPy/
+Matching-Pattern: doorbirdpy-@ANY_VERSION@@ARCHIVE_EXT@
diff -pruN 3.0.8-2/requirements.txt 3.0.10-1/requirements.txt
--- 3.0.8-2/requirements.txt	2024-11-03 00:45:19.000000000 +0000
+++ 3.0.10-1/requirements.txt	1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-aiohttp
-tenacity==9.0.0
\ No newline at end of file
diff -pruN 3.0.8-2/requirements_tests.txt 3.0.10-1/requirements_tests.txt
--- 3.0.8-2/requirements_tests.txt	2024-11-03 00:45:19.000000000 +0000
+++ 3.0.10-1/requirements_tests.txt	1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-ruff
-pytest
-pytest-asyncio
-aioresponses
\ No newline at end of file
diff -pruN 3.0.8-2/setup.cfg 3.0.10-1/setup.cfg
--- 3.0.8-2/setup.cfg	1970-01-01 00:00:00.000000000 +0000
+++ 3.0.10-1/setup.cfg	2025-08-26 21:03:39.698757400 +0000
@@ -0,0 +1,4 @@
+[egg_info]
+tag_build = 
+tag_date = 0
+
diff -pruN 3.0.8-2/setup.py 3.0.10-1/setup.py
--- 3.0.8-2/setup.py	2024-11-03 00:45:19.000000000 +0000
+++ 3.0.10-1/setup.py	2025-08-26 21:03:36.000000000 +0000
@@ -3,13 +3,16 @@ from setuptools import setup
 
 setup(
     name="DoorBirdPy",
-    version="3.0.8",
+    version="3.0.10",
     author="Andy Castille",
     author_email="andy@robiotic.net",
     maintainer="J. Nick Koston",
     maintainer_email="nick@koston.org",
     packages=["doorbirdpy"],
-    install_requires=["aiohttp"],
+    install_requires=[
+        "aiohttp",
+        "tenacity>=9",
+    ],
     url="https://gitlab.com/klikini/doorbirdpy",
     download_url="https://gitlab.com/klikini/doorbirdpy/-/archive/master/doorbirdpy-master.zip",
     license="MIT",
diff -pruN 3.0.8-2/tests/info.json 3.0.10-1/tests/info.json
--- 3.0.8-2/tests/info.json	2024-11-03 00:45:19.000000000 +0000
+++ 3.0.10-1/tests/info.json	1970-01-01 00:00:00.000000000 +0000
@@ -1,23 +0,0 @@
-{
-	"BHA": {
-		"RETURNCODE": "1",
-		"VERSION": [
-			{
-				"FIRMWARE": "000125",
-				"BUILD_NUMBER": "15870439",
-				"WIFI_MAC_ADDR": "1234ABCD",
-				"RELAYS": [
-					"1",
-					"2",
-					"ghchdi@1",
-					"ghchdi@2",
-					"ghchdi@3",
-					"ghdwkh@1",
-					"ghdwkh@2",
-					"ghdwkh@3"
-				],
-				"DEVICE-TYPE": "DoorBird D2101V"
-			}
-		]
-	}
-}
diff -pruN 3.0.8-2/tests/schedule.json 3.0.10-1/tests/schedule.json
--- 3.0.8-2/tests/schedule.json	2024-11-03 00:45:19.000000000 +0000
+++ 3.0.10-1/tests/schedule.json	1970-01-01 00:00:00.000000000 +0000
@@ -1,67 +0,0 @@
-[
-	{
-		"input": "doorbell",
-		"param": "1",
-		"output": [
-			{
-				"event": "notify",
-				"param": "",
-				"schedule": {
-					"weekdays": [
-						{
-							"to": "107999",
-							"from": "108000"
-						}
-					]
-				}
-			},
-			{
-				"event": "http",
-				"param": "0",
-				"schedule": {
-					"weekdays": [
-						{
-							"to": "107999",
-							"from": "108000"
-						}
-					]
-				}
-			}
-		]
-	},
-	{
-		"input": "motion",
-		"param": "",
-		"output": [
-			{
-				"event": "notify",
-				"param": "",
-				"schedule": {
-					"weekdays": [
-						{
-							"to": "107999",
-							"from": "108000"
-						}
-					]
-				}
-			},
-			{
-				"event": "http",
-				"param": "5",
-				"schedule": {
-					"weekdays": [
-						{
-							"to": "107999",
-							"from": "108000"
-						}
-					]
-				}
-			}
-		]
-	},
-	{
-		"input": "relay",
-		"param": "1",
-		"output": []
-	}
-]
diff -pruN 3.0.8-2/tests/schedule_get_entry.json 3.0.10-1/tests/schedule_get_entry.json
--- 3.0.8-2/tests/schedule_get_entry.json	2024-11-03 00:45:19.000000000 +0000
+++ 3.0.10-1/tests/schedule_get_entry.json	1970-01-01 00:00:00.000000000 +0000
@@ -1,67 +0,0 @@
-[
-	{
-		"input": "doorbell",
-		"param": "1",
-		"output": [
-			{
-				"event": "notify",
-				"param": "",
-				"schedule": {
-					"weekdays": [
-						{
-							"to": "107999",
-							"from": "108000"
-						}
-					]
-				}
-			},
-			{
-				"event": "http",
-				"param": "0",
-				"schedule": {
-					"weekdays": [
-						{
-							"to": "107999",
-							"from": "108000"
-						}
-					]
-				}
-			}
-		]
-	},
-	{
-		"input": "motion",
-		"param": "",
-		"output": [
-			{
-				"event": "notify",
-				"param": "",
-				"schedule": {
-					"weekdays": [
-						{
-							"to": "107999",
-							"from": "108000"
-						}
-					]
-				}
-			},
-			{
-				"event": "http",
-				"param": "5",
-				"schedule": {
-					"weekdays": [
-						{
-							"to": "107999",
-							"from": "108000"
-						}
-					]
-				}
-			}
-		]
-	},
-	{
-		"input": "relay",
-		"param": "1",
-		"output": []
-	}
-]
