Package: smarthomeconnect
Smart Home ConnectSmart Home Connect(SHC) is yet another Python home automation framework—in line withHome Assistant,SmartHome.py,SmartHomeNGand probably many more.
Its purpose is to connect "smart home" devices via different communication protocols, provide means for creating automation rules/scripts and a web interface for controling the devices via browser.In contrast to most other home automation frameworks, SHC is completely based on Python's asynchronous coroutines (asyncio) and configured via pure Python scripts instead of YAML files or a fancy web engineering tool.
Its configuration is based on instantiatingConnectableobjects (like state variables, User Interface Buttons, KNX Group Addresses, etc.) and interconnecting them with simple Read/Subscribe patterns.
Thus, it is quite simple but really powerful, allowing on-the-fly type conversion, expressions for calculating derived values, handling stateless events, ….
Read more about SHC's base conceptsin the documentation.FeaturesinterfacesKNX bus via KNXDDMX (via Enttec DMX USB Pro and compatible interfaces)HTTP/REST API + websocket APISHC client (connecting to another SHC instance via websocket API)MIDI (esp. for Hardware MIDI controllers)MQTTTasmota(currently: relais, RGB+CCW lights, IR receiver, power sensors; more features will be added on demand)PulseaudioTelegram Botwebsocket-based web user interface (usingaiohttp,Jinja2andSemantic UI)widgets: buttons, text display, text/number inputs, dropdowns, images with placeable buttons, charts, etc., …configuration of data points/variables and automation rules in plain Pythonfull power of Python + intuitive representation and interconnection of different interfacestype checking and extensible type conversion systemconnecting objects via Python expressionschronological and periodic timers for triggering rulesLogging/Persistence (no really stable in API yet)to MySQLRoadmapStabilize logging APILogging to Influx-DBMore web widgetsGaugestimeline/"stripe" chartsGetting started(Optional) Create a virtual environment to keep your Python package repositories clean:python3-mvirtualenv-ppython3venv
.venv/bin/activateRead more about virtual environmentsin the offical Python docs.Install thesmarthomeconnectPython distribution from PyPI:pip3installsmarthomeconnectIt will be only install smarthomeconnect and the dependencies of its core features.
Additional depdencies are required for certain interface modules and can be installed via pip's/setuptool's 'extras' feature.
SeeDepdencies sectionof this readme for a complete list.
If you install SHC from a source distribution (in contrast to a "binary" package, such as a "wheel" package from PyPI), you'll need NodeJS and npm installed on your machine, which are used to download the web UI assets during the Python package building process.Create a Python script (let's call itmy_home_automation.py) which imports and starts Smart Home Connect:#!/usr/bin/env python3importshc# TODO add interfaces and Variablesshc.main()When running this script (python3 my_home_authomation.py), SHC should start up and run idle until you terminate it (e.g. with Ctrl+C).
See the code below for an example with the Web UI and the KNX interface.Read about the basic concepts of SHC and available interfaces in theSHC documentation.
Extend your script to create interfaces and Variables,connectconnectable objects, define logic handlers and let them be triggered.Simple Usage Exampleimportdatetimeimportshcimportshc.webimportshc.web.widgetsimportshc.interfaces.knx# Configure interfacesknx_connection=shc.interfaces.knx.KNXConnector()web_interface=shc.web.WebServer("localhost",8080,"index")web_index_page=web_interface.page('index')# Simple On/Off Variable, connected to KNX Group Address (initialized per Group Read telegram),# with a switch widget in the web user interfaceceiling_lights=shc.Variable(bool,"ceiling lights")\.connect(knx_connection.group(shc.interfaces.knx.KNXGAD(1,2,3),dpt="1",init=True))web_index_page.add_item(shc.web.widgets.Switch("Ceiling Lights").connect(ceiling_lights))# Store timestamp of last change of the ceiling lights in a Variable (via logic handler) and show# it in the web user interfaceceiling_lights_last_change=shc.Variable(datetime.datetime,"ceiling lights last change",initial_value=datetime.datetime.fromtimestamp(0))@ceiling_lights.trigger@shc.handler()asyncdefupdate_lastchange():awaitceiling_lights_last_change.write(datetime.datetime.now())web_index_page.add_item(shc.web.widgets.TextDisplay(datetime.datetime,"{:%c}","Last Change of Ceiling Lights").connect(ceiling_lights_last_change))# close shutters via button in the web user interface (stateless event, so no Variable required)web_index_page.add_item(shc.web.widgets.ButtonGroup("Shutters",[shc.web.widgets.StatelessButton(shc.interfaces.knx.KNXUpDown.DOWN,shc.web.widgets.icon("arrow down")).connect(knx_connection.group(shc.interfaces.knx.KNXGAD(3,2,1),dpt="1.008"))]))# use expression syntax to switch on fan when temperature is over 25 degreestemperature=shc.Variable(float,"temperature")\.connect(knx_connection.group(shc.interfaces.knx.KNXGAD(0,0,1),dpt="9",init=True))fan=shc.Variable(bool,"fan")\.connect(knx_connection.group(shc.interfaces.knx.KNXGAD(0,0,2),dpt="1"))\.connect(temperature.EX>25.0)# Start up SHCshc.main()LicenseSmart Home Connect is published under the terms of the Apache License 2.0.It's bundled with multiple third party works:“Prism”– Subtle Patterns by Toptal Designers (Creative Commons BY-SA 3.0)SeeLICENSEandNOTICEfile for further information.DependenciesSHC depends on the following Python packages:aiohttpand its dependencies (Apache License 2.0, MIT License, Python Software Foundation License, LGPL 2.1, 3-Clause BSD License)jinja2andMarkupSafe(BSD-3-Clause License)Additional dependencies are required for some of SHC's interfaces.
They can be installed automatically via pip, by specifying the relevant 'extras' flag, e.g.pip install smarthomeconnect[mysql]for mysql logging support.Logging via MySQL[mysql]:aiomysqlandPyMySQL(MIT License)KNX interface[knx]:knxdclient(Apache License 2.0)DMX interface[dmx]:pyserial-asyncio&pySerial(BSD-3-Clause License)MIDI interface[midi]:mido(MIT License)python-rtmidi(MIT License) incl. RTMidi (modified MIT License)MQTT interface[mqtt]:paho-mqtt(Eclipse Public License v1.0orEclipse Distribution License v1.0)asyncio-mqtt(BSD-3-Clause License)Pulseaudio interface[pulse]:pulsectlandpulsectl-asyncio(MIT License)Telegram Bot interface[telegram]:aiogram(MIT License) + its dependencies (BSD-3-Clause License + MPL 2.0)file-based persistence storage[file_persistence]:aiofile&caio(Apache License 2.0)In addition, the following Javascript libraries from NPM are required for the web UI frontend.
They are not included in this repository or in source distribution packages of SHC.
Instead they are downloaded and packed during Python package build and bundled in the "binary" Python packages (including "wheel" packages) of SHC:Fomantic UI CSS framework(MIT License)jQuery(MIT License)iro.js(Mozilla Public License 2.0)Chart.js(MIT License)DevelopmentFeel free to open an issue on GitHub if you miss a feature or find an unexpected behaviour or bug.
Please, consult thedocumentationon the relevant topic and search the GitHub issues for existing reports of the issue first.If you want to help with the development ofSmart Home Connect, your Pull Requests are always appreciated.Development setupSetting up a dev environment for SHC is simple:
Clone the git repository and install the development dependencies, listed inrequirements.txt(+ thepython-rtmidimodule if you want to run the MIDI tests).
These include all dependencies of smarthomeconnect with all extras:gitclonehttps://github.com/mhthies/smarthomeconnectcdsmarthomeconnect
pip3install-rrequirements.txt
pip3installpython-rtmidiYou may want to use a virtual environment to avoid messing up your Python packages.Web UI Frontend AssetsAdditionally, you'll need NodeJS and NPM on your machine for downloading and packing the web UI frontend asset  files.
Use the following commands to download all frontend dependencies from NPM and package them into/shc/web/static(using Parcel.js):npminstall
npmrunbuildWhen working on the web UI source files themselves (which are located inweb_ui_src), you'll probably want to run Parcel.js in monitor mode, providing automatic re-packing and reload on every change:npxparcelweb_ui_src/main.js--dist-dirshc/web/static/pack--public-url./Tests and Code StylePlease make sure that all the unittests are passing, when submitting a Pull Request:python3-munittestThe web tests require Firefox andgeckodriverto be installed on your system and the frontend assets.Additionally, I'd like to keep the test coverage on a high level.
To check it, you may want to determine it locally, using thecoveragetool:coveragerun-munittest
coveragehtml# open htmlcov/index.htmlWe also enforce static type correctness with MyPy and Python codestyle rules with flake8.
To run the static type checks and codestyle checks locally, simply install MyPy and flake8 and execute themypyandflake8commands in the shc project repository.All these checks are also performed by the GitHub Actions CI for Pull Requests and the master branch.