Metadata-Version: 2.1
Name: kaithem
Version: 0.86.3
Summary: Home/commercial automation server
License: GPL-3.0-only
Author: Daniel Dunn
Requires-Python: >=3.10.0,<3.13
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Dist: scullery (==0.2.0) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: iot-devices (==0.21.1) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: icemedia (==0.1.8) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: nvrchannel (==0.1.7) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: numpy (==2.1.3) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: cheroot (==10.0.1) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: mako (==1.3.7) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: jinja2 (==3.1.4) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pam (==0.2.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: msgpack (==1.1.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pyyaml (==6.0.2) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: types-pyyaml (==6.0.12.20240917) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pytest (==8.3.4) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: nmcli (==1.4.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: apprise (==1.9.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: ffmpeg-python (==0.2.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: yappi (==1.6.10) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: zeroconf (==0.136.2) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: colorzero (==2.0) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: tinytag (==2.0.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: jsonschema (==4.23.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pint (==0.24.4) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: pyflakes (==3.2.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: python-mpv-jsonipc (==1.2.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: textdistance (==4.6.3) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: toml (==0.10.2) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: vignette (==5.1.1) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: simpleeval (==1.0.3) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: websockets (==13.1) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: zeep (==4.3.1) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: passlib (==1.7.4) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pillow (==11.0.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: evdev (==1.7.1) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: markupsafe (==3.0.2) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: types-requests (==2.32.0.20241016) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: python-dateutil (==2.9.0.post0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: recurrent (==0.4.1) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pygments (==2.18.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pytz (==2024.2) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: ntplib (==0.4.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: holidays (==0.62) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pyserial (==3.5) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pygrep (==0.3) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: python-rtmidi (==1.5.8) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: paho-mqtt (==2.1.0) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: setproctitle (==1.3.4) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: psutil (==6.1.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: netifaces (==0.11.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: jack-client (==0.5.5) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: sf2utils (==1.0.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pynput (==1.7.7) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: scipy (==1.14.1) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: attrs (==24.2.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: beartype (==0.18.5) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: types-jsonschema (==4.23.0.20240813) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: stamina (==24.3.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: stream-zip (==0.0.71) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: argon2-cffi (==23.1.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: msgpack-types (==0.2.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: niquests (==3.11.2) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: quart (==0.19.9) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: hypercorn (==0.17.3) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: structlog (==24.4.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: rich (==13.9.4) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: colorama (==0.4.6) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: starlette (==0.40.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: ephem (==4.1.6) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: opencv-python (==4.10.0.84) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pipewire-python (==0.2.3) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: aioesphomeapi (==24.6.0) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: gpiozero (==2.0.1) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: urwid (==2.6.16) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: yeelight (==0.7.14) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: jaraco-functools (==4.1.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: more-itertools (==10.5.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: python-pam (==2.0.2) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: exceptiongroup (==1.2.2) ; python_full_version >= "3.10.0" and python_version < "3.11"
Requires-Dist: iniconfig (==2.0.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: packaging (==24.2) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pluggy (==1.5.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: tomli (==2.2.1) ; python_full_version >= "3.10.0" and python_version < "3.11"
Requires-Dist: certifi (==2024.8.30) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: click (==8.1.7) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: markdown (==3.7) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: requests (==2.32.3) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: requests-oauthlib (==2.0.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: future (==1.0.0) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: async-timeout (==5.0.1) ; python_version >= "3.10" and python_version < "3.11"
Requires-Dist: ifaddr (==0.2.0) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: setuptools (==75.6.0) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: jsonschema-specifications (==2024.10.1) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: referencing (==0.35.1) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: rpds-py (==0.22.3) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: flexcache (==0.3) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: flexparser (==0.4) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: platformdirs (==4.3.6) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: typing-extensions (==4.12.2) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: python-magic (==0.4.27) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: isodate (==0.7.2) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: lxml (==5.3.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: requests-file (==2.1.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: requests-toolbelt (==1.0.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: urllib3 (==2.2.3) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: six (==1.17.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: parsedatetime (==2.6) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: cffi (==1.17.1) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: pyobjc-framework-applicationservices (==10.3.2) ; python_full_version >= "3.10.0" and python_version < "3.13" and sys_platform == "darwin"
Requires-Dist: pyobjc-framework-quartz (==10.3.2) ; python_full_version >= "3.10.0" and python_version < "3.13" and sys_platform == "darwin"
Requires-Dist: python-xlib (==0.33) ; python_full_version >= "3.10.0" and python_version < "3.13" and sys_platform in "linux"
Requires-Dist: tenacity (==9.0.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pycryptodome (==3.21.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: argon2-cffi-bindings (==21.2.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: charset-normalizer (==3.4.0) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: idna (==3.10) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: kiss-headers (==2.4.3) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: urllib3-future (==2.12.902) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: wassima (==1.1.5) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: aiofiles (==24.1.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: blinker (==1.9.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: flask (==3.1.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: itsdangerous (==2.2.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: werkzeug (==3.1.3) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: h11 (==0.14.0) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: h2 (==4.1.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: priority (==2.0.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: taskgroup (==0.0.0a4) ; python_full_version >= "3.10.0" and python_version < "3.11"
Requires-Dist: uvloop (==0.21.0) ; platform_system != "Windows" and python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: wsproto (==1.2.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: markdown-it-py (==3.0.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: anyio (==4.7.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: aiohappyeyeballs (==2.4.4) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: async-interrupt (==1.2.0) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: chacha20poly1305-reuseable (==0.13.2) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: cryptography (==44.0.0) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: noiseprotocol (==0.3.1) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: protobuf (==5.29.1) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: wcwidth (==0.2.13) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: oauthlib (==3.2.2) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: pycparser (==2.22) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: pyobjc-core (==10.3.2) ; python_full_version >= "3.10.0" and python_version < "3.13" and sys_platform == "darwin"
Requires-Dist: pyobjc-framework-cocoa (==10.3.2) ; python_full_version >= "3.10.0" and python_version < "3.13" and sys_platform == "darwin"
Requires-Dist: pyobjc-framework-coretext (==10.3.2) ; python_full_version >= "3.10.0" and python_version < "3.13" and sys_platform == "darwin"
Requires-Dist: jh2 (==5.0.4) ; python_version >= "3.10" and python_version < "3.13"
Requires-Dist: qh3 (==1.2.1) ; python_version >= "3.10" and (platform_python_implementation == "PyPy" or platform_python_implementation == "CPython") and (platform_system == "Darwin" or platform_system == "Windows" or platform_system == "Linux") and (platform_machine == "x86_64" or platform_machine == "s390x" or platform_machine == "aarch64" or platform_machine == "armv7l" or platform_machine == "ppc64le" or platform_machine == "ppc64" or platform_machine == "AMD64" or platform_machine == "arm64" or platform_machine == "ARM64") and python_version < "3.13" and (python_version < "3.11" or platform_python_implementation == "CPython")
Requires-Dist: hpack (==4.0.0) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: hyperframe (==6.0.1) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: mdurl (==0.1.2) ; python_full_version >= "3.10.0" and python_version < "3.13"
Requires-Dist: sniffio (==1.3.1) ; python_full_version >= "3.10.0" and python_version < "3.13"
Description-Content-Type: text/markdown

![AI generated picture of a tavern](kaithem/data/static/img/nov23-ai-watercolor-tavern.webp)

![Linux](badges/linux.png)
![Python](badges/python.png)
![Ten Year Project](badges/ten-years.png)

![Offline First](badges/offline-first.png)
![GPLv3 Badge](badges/gpl-v3.png)
![Single Board Computer badge](badges/sbc.png)

![Pytest](badges/pytest.png)
![Ruff](badges/ruff.png)
![Poetry](badges/poetry.png)


> Amidst the mists and fiercest frosts,\
> with stoutest wrists and loudest boasts,\
> He thrusts his fists against the posts,\
> And still insists he sees the ghosts.

Kaithem is Linux home/commercial automation server written in pure Python(3.10 and up). Resource usage is low enough to run well on the Raspberry Pi from an SD card

You automate things by directly writing python and HTML via a web IDE, or by using the built-in Chandler module, which is a full web-based lighting aud audio control board with a visual programming language.

## Screenshots 🏕️

![Collage](screenshots/collage.avif)

![Preset Selector](screenshots/preset-selection.avif)

See the barrel.css [demo](https://eternityforest.github.io/barrel.css/) for more themes


## Installation 🌲

>The careful text-books measure\
>  (Let all who build beware!)\
> The load, the shock, the pressure\
>  Material can bear.


First you'll need to get [pipx](https://pipx.pypa.io/stable/installation/) if you haven't yet.

```bash
sudo apt install pipx
python3 -m pipx ensurepath
```

Next you can just install it right from PyPi!
Be aware that pipx takes a while on a raspberry pi.

```bash
pipx install --verbose kaithem

kaithem-scripts root-install-system-dependencies

```

### System Configuration 🛠️

> So, when the buckled girder\
>  Lets down the grinding span,\
> The blame of loss, or murder,\
>  Is laid upon the man.\
>    Not on the Stuff — the Man!

kaithem-scripts provides some helpful utilities to set up the system.

Scripts starting with . need root.

```bash

# Currently, most distros don't have pipewire JACK enabled by default, which
# is needed for the audio mixing features.
kaithem-scripts root-use-pipewire-jack
kaithem-scripts user-restart-pipewire


# This activates a maxvolume service, which sets volume to full at boot.
kaithem-scripts user-max-volume-at-boot

# Linux by default has a LOT of stuff that writes
# excessively to the SD card. On a raspberry pi this
# Should make the system much more reliable without
# making anything work differently, except for putting logs in RAM
kaithem-scripts root-install-sd-protection

# Sets up a collection of misc tweaks that are recommended for kaithem.
kaithem-scripts root-install-linux-tweaks

# Installs Mosquitto and sets it up to allow anonymous clients.
kaithem-scripts root-enable-anon-mqtt

# Installs Mosquitto and sets it up to allow anonymous clients.
kaithem-scripts root-uninstall-bloatware

# Set up the Pi to display the Kaithem homepage(Can configure redirect in settings)
# On boot in a fullscreen kiosk
kaithem-scripts root-install-kiosk

```

## Manual dev install 🖐️

Info for devs here on the wiki (https://github.com/EternityForest/KaithemAutomation/wiki/Development)


Recent Changes 🕗
============
> Good men, the last wave by, crying how bright\
> Their frail deeds might have danced in a green bay,\
> Rage, rage against the dying of the light.

(See [Full Changelog](kaithem/src/docs/changes.md))

