Skip to main content

Automated Supervisory Optimization (ASO) for BACnet building automation systems (BAS) and HVAC supervisory control

Project description

Easy ASO

Discord CI MIT License Development Status Python PyPI

Easy-to-follow Automated Supervisory Optimization (ASO) event-driven logic combined with an asyncio-first supervisory layer for BACnet building automation — lightweight BAS orchestration at the IoT edge with one BACnet/IP core, small agents, JSON-RPC, and room to grow without a full platform stack.


Install from PyPI

pip install easy-aso

Online Documentation

This application is part of a broader ecosystem that together forms the Open FDD AFDD Stack, enabling a fully orchestrated, edge-deployable analytics and optimization platform for building automation systems.

  • 🔗 DIY BACnet Server Lightweight BACnet server with JSON-RPC and MQTT support for IoT integrations. Documentation · GitHub

  • 📖 Open FDD AFDD Stack Full AFDD framework with Docker bootstrap, API services, drivers, and React web UI. Documentation · GitHub

  • 📘 Open FDD Fault Detection Engine Core rules engine with RuleRunner, YAML-based fault logic, and pandas workflows. Documentation · GitHub · PyPI

  • ⚙️ easy-aso Framework Lightweight framework for Automated Supervisory Optimization (ASO) algorithms at the IoT edge. Documentation · GitHub · PyPI


ASO made easy

Subclass EasyASO and implement on_start, on_step, and on_stop — same pattern for reads, writes, and releasing overrides:

import asyncio

from easy_aso import EasyASO


class CustomHvacAso(EasyASO):
    async def on_start(self):
        print("Custom ASO is deploying! Let's do something!")

    async def on_step(self):
        # BACnet read request
        sensor = await self.bacnet_read("192.168.0.122", "analog-input,1")

        # Custom step logic - BACnet write request
        override_valve = sensor + 5.0
        await self.bacnet_write("192.168.0.122", "analog-output,2", override_valve)

        print("Executing step actions... The system is being optimized!")
        await asyncio.sleep(60)

    async def on_stop(self):
        # Custom stop logic - BACnet release request
        await self.bacnet_write("192.168.0.122", "analog-output,2", "null")
        print("Executing stop actions... The system is released back to normal!")

Local security bootstrap

Generate local bearer tokens (diy JSON-RPC + supervisor API):

./scripts/bootstrap-secrets.sh
set -a && . ./.env.local && set +a
.\scripts\bootstrap-secrets.ps1
Get-Content .env.local | ForEach-Object { if ($_ -match '^(.*?)=(.*)$') { Set-Item -Path Env:\$($matches[1]) -Value $matches[2] } }

Then run your stack with:

  • BACNET_RPC_API_KEY for outbound calls to diy-bacnet-server JSON-RPC
  • SUPERVISOR_API_KEY for optional inbound auth on easy_aso.supervisor.app

Optional supervisor (Open-FDD-friendly default port):

pip install "easy-aso[platform]"
easy-aso-supervisor --host 0.0.0.0 --port 18090

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

easy_aso-0.1.8.tar.gz (61.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

easy_aso-0.1.8-py3-none-any.whl (44.6 kB view details)

Uploaded Python 3

File details

Details for the file easy_aso-0.1.8.tar.gz.

File metadata

  • Download URL: easy_aso-0.1.8.tar.gz
  • Upload date:
  • Size: 61.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for easy_aso-0.1.8.tar.gz
Algorithm Hash digest
SHA256 91747a8a9036bc9e1b308a15b17a37613ec09f903c4ae969a2e600722674538b
MD5 de1169705a57c1fe54d3bd6cbfbd644c
BLAKE2b-256 ce4ea59674381c1307503767abbfa6f5a1c9f57611dd5800b692f06bb3f2e975

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_aso-0.1.8.tar.gz:

Publisher: publish-pypi.yml on bbartling/easy-aso

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_aso-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: easy_aso-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 44.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for easy_aso-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 a466b618e2b0a54e4e900fb1d6b5277fb17445264d611ed51527c1cbb5300e95
MD5 ef88b12b8ccd3fbb24bfb4181536db7d
BLAKE2b-256 394187e10c3107090e9d09965b69dad4632c53b01edafcfd6697e0b0c572fd62

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_aso-0.1.8-py3-none-any.whl:

Publisher: publish-pypi.yml on bbartling/easy-aso

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page