[//]: # (title: Platypush 1.0 is out) [//]: # (description: It's software maturity time) [//]: # (image: https://platypush-static.s3.nl-ams.scw.cloud/images/release-1.0.png) [//]: # (author: Fabio Manganiello ) [//]: # (published: 2024-05-26) It's been [10 months](https://pypi.org/project/platypush/#history) and [1049 commits](https://git.platypush.tech/platypush/platypush/commits/branch/master) since the latest release of Platypush, 7 years since [the first commit](https://git.platypush.tech/platypush/platypush/commit/0b0d94fee3ab20e7f488072f624b4f33c527947a), and 10 years since the first release of its ancestor, [`evesp`](https://github.com/blacklight/evesp). The past few months have been quite hectic and I have nearly rewritten the whole codebase, but I feel like the software is now at a stage where it's mature and stable enough to be used by a larger audience. The changelog [is quite big](https://git.platypush.tech/platypush/platypush/src/branch/master/CHANGELOG.md#1-0-0-2024-05-26), but it doesn't even cover all the changes, as many integrations have been completely rewritten. Let's go over some of the changes in the 1.0 release. ## All backends are gone or turned into plugins Probably the most confusing feature of Platypush was the separation between backends and plugins. This was a quirk of the original implementation, where plugins were pretty much stateless collections of actions and backends were background tasks that monitored a certain integration for new events. It ended up in a state where users had to write the same configuration twice (e.g. one section for `light.hue` and one for `backend.light.hue`), and/or where me as a developer had to maintain tight dependencies between integrations in order for them to share configuration. Those times are now gone. Backends should only do what backends are supposed to do - i.e. listen for external messages and dispatch them to the application. So the only ones that are still there are: - [`backend.http`](https://docs.platypush.tech/platypush/backend/http.html) - the core Web server. - [`backend.nodered`](https://docs.platypush.tech/platypush/backend/nodered.html), to listen for messages from a Node-RED instance. - [`backend.redis`](https://docs.platypush.tech/platypush/backend/redis.html), used internally to dispatch messages across components, and it can also be used by external scripts to dispatch application messages on localhost bypassing the HTTP layer. - [`backend.tcp`](https://docs.platypush.tech/platypush/backend/tcp.html), the legacy (and insecure) raw TCP listener. Besides them, all the other backends have now been merged into their respective plugins, so no more need for dual configuration. If the former backend had a logic that polled at regular intervals, then you can disable polling in the plugin by setting `poll_interval` to `null` in the plugin configuration, so you can still use the plugin as a stateless entity if you wish so. This is a quite big breaking change, so you may probably want to check out the [plugins reference on the documentation](https://docs.platypush.tech) to check for any configuration changes. ## Better Docker support There's now an official [`docker-compose.yml`](https://git.platypush.tech/platypush/platypush/src/branch/master/docker-compose.yml), as well as multiple Dockerfiles that support [Alpine](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/alpine.Dockerfile), [Debian](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/debian.Dockerfile), [Ubuntu](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/ubuntu.Dockerfile) and [Fedora](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/fedora.Dockerfile) base images. The `platydock` and `platyvenv` scripts have also been rewritten. They are now much more stable and smarter in installing any extra required dependency. ## Official packages for several package managers [Official packages](https://git.platypush.tech/platypush/platypush#system-package-manager-installation) have been added for [Debian](https://git.platypush.tech/platypush/platypush#debian-ubuntu) and [Fedora](https://git.platypush.tech/platypush/platypush#fedora), on top of those available for [Arch Linux](https://aur.archlinux.org/packages/platypush). Official Ubuntu packages are [also on their way](https://git.platypush.tech/platypush/platypush/issues/368). ## Better `pip` extras installation Users previously had to dig through the `setup.py` file to get the `pip` extras supported by specific integrations. Not anymore. Extra dependencies are now dynamically parsed from the integrations' `manifest.json`, so you can install them simply via `pip install 'platypush[plugin1,plugin2,...]'`. For example, `pip install 'platypush[light.hue,music.mpd]'` to install the dependencies required by the `light.hue` and `music.mpd` plugins. ## A more intuitive way of creating custom Python scripts ### Simpler directory structure Custom scripts are loaded as Python modules. This means that you need an `__init__.py` in each folder that hosts some Platypush custom scripts. Earlier users were required to manually create that file, but that's no longer the case. You can simply drop a `.py` file in any place under your scripts directory, with your procedures, event hooks, crons etc., and Platypush will automatically pick it up. ### Simpler API Earlier scripts relied on an API like this: ``` from platypush.message.event.something import SomeEvent from platypush.event.hook import hook from platypush.procedure import procedure from platypush.utils import run @procedure def my_proc(**context): ... @hook(SomeEvent) def event_hook(event, **context): my_proc() ``` While this API is still supported, a new simplified version is now available too: ``` from platypush import procedure, when, run from platypush.events.something import SomeEvent # Note that custom procedure name overrides are now available, albeit optional @procedure('this_is_my_proc') # Arguments are no longer a requirement, either in procedure or hooks def my_proc(): ... @when(SomeEvent) # You can also omit event here if you don't need it def event_hook(event): # Procedures can also be called directly via `run` run('procedure.this_is_my_proc') ``` ## Greatly improved documentation The [official documentation](https://docs.platypush.tech) has been greatly expanded, and it now includes all the wiki content too as well as a better UI for the available integrations (and also a filter bar). The documentation pages of the integrations have also been greatly improved to include ready-to-paste configuration snippets, installation commands for several package managers and a dynamically generated list of supported events and actions. ## Removed all the custom `Response` objects Removed all `Response` objects outside of the root type. They are now all replaced by Marshmallow schemas with the structure automatically generated in the documentation. ## Some new cool integrations are in The [`alarm`](https://git.platypush.tech/platypush/platypush/issues/340) plugin has been completely rewritten and paired to a powerful UI that allows you to set alarms as procedures. The old [`stt.picovoice.*`](https://git.platypush.tech/platypush/platypush/issues/304) have been replaced by a new [`assistant.picovoice`](https://docs.platypush.tech/platypush/plugins/assistant.picovoice.html) integration that provides all the features for a full-featured voice assistant. The [`youtube`](https://docs.platypush.tech/platypush/plugins/youtube.html) plugin has been rewritten too, it now relies on `yt-dlp` and it uses Piped instances instead of the (brittle and unstable) YouTube API. It's also been paired with a new UI that makes it easy to navigate your feeds, subscriptions and playlists. There's a new [`music.mopidy`](https://docs.platypush.tech/platypush/plugins/music.mopidy.html) integration too, which takes some parts of the old `music.mopidy` backend and add a full plugin around it which is 100% compatible with the API of the [`music.mpd`](https://docs.platypush.tech/platypush/plugins/music.mpd.html) plugin, on top of a new UI for it. This makes it easier to switch between `mpd` and `mopidy` implementations for your music servers, and also leverage the asynchronous nature of Mopidy's Web socket API to get real time events without polling. The `camera.pi` integration has been moved to [`camera.pi.legacy`](https://docs.platypush.tech/platypush/plugins/camera.pi.legacy.html) following the deprecation of the previous `picamera` library. [`camera.pi`](https://docs.platypush.tech/platypush/plugins/camera.pi.html) is now a new integration based on the recent `picamera2` module. A new [`openai`](https://docs.platypush.tech/platypush/plugins/openai.html) integration is now also available, making easy to programmatically get AI predictions anywhere. This can be particularly useful when paired with SST/TTS integrations like PicoVoice - you can implement custom voice assistants that use PicoVoice's libraries to do the speech/text conversion, and leverage ChatGPT's APIs to get plausible answers. ## Some old stuff is out `google.fit` has been removed, as Google announced the deprecation of the API (which has already experienced stability issues for a while anyway). Same for `weather.darksky`, which has been purchased by Apple, which readily killed their amazing API. In turn, the `weather.openweathermap` integration has been empowered and it's compatible with the API of the former Darksky integration. The `wiimote` integration is also out. The underlying `cwiid` library hasn't been updated in years, and it keeps struggling with Python 3 too. Same fate goes for `stt.deepvoice`. DeepVoice was a very promising project from Mozilla to democratize speech-to-text, but it seems to be now abandoned, hasn't seen an update in years, and given Mozilla's financial woes it's unlikely to be resurrected any time soon. I hope that the progress on the PicoVoice integration side will make up the loss of the DeepSpeech integration. ## And there's more to come There's a new [voice integration based on Whisper/GPT-4o](https://git.platypush.tech/platypush/platypush/issues/384) in the works too. A [dark theme for the UI](https://git.platypush.tech/platypush/platypush/issues/376). A new [Hue backend](https://git.platypush.tech/platypush/platypush/issues/282) that can make Platypush emulate the API of a Philips Hue bridge and control devices from the Hue app or any compatible clients. [Support for more native entities from more plugins](https://git.platypush.tech/platypush/platypush/milestone/4), so you can use the global entities view also to view cameras, control media players and run custom procedures. And there are two big features in the work to support [entity groups](https://git.platypush.tech/platypush/platypush/issues/244) and [entity scenes](https://git.platypush.tech/platypush/platypush/issues/245). These may not be must-have features anymore, now that all things can be customized with procedures, but it could greatly help those who come from other platforms and are used to these abstractions. And if you have more requests or questions, feel free to [open a ticket](https://git.platypush.tech/platypush/platypush/issues), [a PR](https://git.platypush.tech/platypush/platypush/pulls) or [ask on the Lemmy server](https://lemmy.platypush.tech/c/platypush).