{"id":14971651,"url":"https://github.com/tuomas2/automate","last_synced_at":"2026-03-07T23:31:04.089Z","repository":{"id":13845457,"uuid":"16542654","full_name":"tuomas2/automate","owner":"tuomas2","description":"A general purpose Python automatization library with nifty real-time web UI","archived":false,"fork":false,"pushed_at":"2025-10-01T16:36:03.000Z","size":2277,"stargazers_count":30,"open_issues_count":6,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-05T17:50:35.236Z","etag":null,"topics":["android","arduino","django","gpio","home-automation","python","raspberry-pi","virtualwire","web-ui"],"latest_commit_sha":null,"homepage":"http://python-automate.readthedocs.org/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tuomas2.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGES.txt","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2014-02-05T11:17:59.000Z","updated_at":"2025-10-01T16:36:07.000Z","dependencies_parsed_at":"2022-09-26T19:44:26.957Z","dependency_job_id":"990b5352-c2ce-47aa-8b04-76e79d3003e2","html_url":"https://github.com/tuomas2/automate","commit_stats":{"total_commits":660,"total_committers":2,"mean_commits":330.0,"dds":"0.022727272727272707","last_synced_commit":"27717cc197e7b533a78e286493e02f88679c2edd"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/tuomas2/automate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuomas2%2Fautomate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuomas2%2Fautomate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuomas2%2Fautomate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuomas2%2Fautomate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tuomas2","download_url":"https://codeload.github.com/tuomas2/automate/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuomas2%2Fautomate/sbom","scorecard":{"id":902444,"data":{"date":"2025-08-11","repo":{"name":"github.com/tuomas2/automate","commit":"850451691c9ee613586210518d39a1a6cfc2998f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.4,"checks":[{"name":"Maintained","score":5,"reason":"6 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"49 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: PYSEC-2018-6 / GHSA-2f9x-5v75-3qv4","Warn: Project is vulnerable to: PYSEC-2019-17 / GHSA-337x-4q8g-prc5","Warn: Project is vulnerable to: PYSEC-2020-36 / GHSA-3gh2-xw74-jmcw","Warn: Project is vulnerable to: PYSEC-2018-2 / GHSA-5hg3-6c2f-f3wr","Warn: Project is vulnerable to: PYSEC-2021-98 / GHSA-68w8-qjq3-2gfm","Warn: Project is vulnerable to: PYSEC-2019-10 / GHSA-6c7v-2f49-8h26","Warn: Project is vulnerable to: PYSEC-2019-13 / GHSA-6r97-cj55-9hrq","Warn: Project is vulnerable to: PYSEC-2019-79 / GHSA-7rp2-fm2h-wchj","Warn: Project is vulnerable to: GHSA-7xr5-9hcq-chf9","Warn: Project is vulnerable to: GHSA-8x94-hmjh-97hq","Warn: Project is vulnerable to: PYSEC-2019-11 / GHSA-c4qh-4vgv-qc6g","Warn: Project is vulnerable to: PYSEC-2019-12 / GHSA-h5jv-4p7w-64jg","Warn: Project is vulnerable to: PYSEC-2020-35 / GHSA-hmr4-m2h5-33qx","Warn: Project is vulnerable to: PYSEC-2018-5 / GHSA-r28v-mw67-m5p9","Warn: Project is vulnerable to: GHSA-rrqc-c2jx-6jgv","Warn: Project is vulnerable to: PYSEC-2019-14 / GHSA-v9qg-3j8p-r63v","Warn: Project is vulnerable to: PYSEC-2019-16 / GHSA-vfq6-hq5r-27r6","Warn: Project is vulnerable to: PYSEC-2019-18 / GHSA-wh4h-v3f2-r2pp","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-29gw-9793-fvw7","Warn: Project is vulnerable to: PYSEC-2022-12 / GHSA-pq7m-3gw7-gq5x","Warn: Project is vulnerable to: PYSEC-2019-109","Warn: Project is vulnerable to: PYSEC-2019-41 / GHSA-qfc5-mcwq-26q8","Warn: Project is vulnerable to: PYSEC-2020-92 / GHSA-hj5v-574p-mj7c","Warn: Project is vulnerable to: PYSEC-2022-42969","Warn: Project is vulnerable to: PYSEC-2021-140 / GHSA-9w8r-397f-prfh","Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: PYSEC-2021-141 / GHSA-pq64-v7f5-gqh8","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: PYSEC-2018-28 / GHSA-x84v-xcm2-53pg","Warn: Project is vulnerable to: GHSA-753j-mpmx-qq6g","Warn: Project is vulnerable to: GHSA-7cx3-6m66-7c5m","Warn: Project is vulnerable to: GHSA-8w49-h785-mj3c","Warn: Project is vulnerable to: PYSEC-2023-75 / GHSA-hj3f-6gcp-jg8j","Warn: Project is vulnerable to: GHSA-qppv-j76h-2rpx","Warn: Project is vulnerable to: GHSA-w235-7p84-xx57","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: PYSEC-2023-207 / GHSA-gwvm-45gx-3cf8","Warn: Project is vulnerable to: PYSEC-2019-133 / GHSA-mh33-7rrq-662w","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2019-132 / GHSA-r64q-w8jr-g9qp","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f","Warn: Project is vulnerable to: PYSEC-2020-148 / GHSA-wqvq-5m8c-6g24","Warn: Project is vulnerable to: PYSEC-2018-32 / GHSA-www2-v7xj-xrc6","Warn: Project is vulnerable to: PYSEC-2021-108"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-24T16:07:29.803Z","repository_id":13845457,"created_at":"2025-08-24T16:07:29.803Z","updated_at":"2025-08-24T16:07:29.803Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30237329,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T23:24:20.706Z","status":"ssl_error","status_checked_at":"2026-03-07T23:21:10.486Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","arduino","django","gpio","home-automation","python","raspberry-pi","virtualwire","web-ui"],"created_at":"2024-09-24T13:45:36.750Z","updated_at":"2026-03-07T23:31:04.045Z","avatar_url":"https://github.com/tuomas2.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":".. image:: https://travis-ci.org/tuomas2/automate.svg?branch=master\n   :target: https://travis-ci.org/tuomas2/automate\n   :alt: Travis CI Status\n\n.. image:: https://coveralls.io/repos/github/tuomas2/automate/badge.svg?branch=master\n   :target: https://coveralls.io/github/tuomas2/automate?branch=master\n   :alt: Coverage Status\n\n.. image:: https://readthedocs.org/projects/python-automate/badge/?version=master\n   :target: https://readthedocs.org/projects/python-automate/?badge=master\n   :alt: Documentation Status\n\n.. image:: https://img.shields.io/pypi/v/automate.svg\n   :target: https://pypi.python.org/pypi/automate\n\n.. image:: https://img.shields.io/pypi/pyversions/automate.svg\n   :target: https://pypi.python.org/pypi/automate\n\n.. image:: https://img.shields.io/badge/licence-GPL-blue.svg\n   :target: https://github.com/tuomas2/automate/blob/master/LICENSE.txt\n\n\n\nAutomate\n========\n\nScrenshot from Automate Web UI\n------------------------------\n\n.. image:: https://raw.githubusercontent.com/tuomas2/automate/master/docs/source/official_extensions/images/main_view.png\n   :target: http://python-automate.readthedocs.io/en/latest/official_extensions/webui.html\n\nIntroduction\n------------\n\n- Github URL: http://github.com/tuomas2/automate\n- Read full documentation at http://python-automate.readthedocs.org/\n\nAutomate is a general purpose automatization library for Python.\nIts objective is to offer convenient and robust object-oriented programming\nframework for complex state machine systems. Automate can be used to design\ncomplex automation systems, yet it is easy to learn and fun to use. It was\noriginally developed with home robotics/automatization projects in mind,\nbut is quite general in nature and one could find applications from various\nfields that could take advantage of Automate. Automate can be embedded\nin other Python software as a component, which runs its operations in\nits own threads.\n\nHighlights:\n-----------\n\n* Supported hardware:\n\n  * Raspberry Pi GPIO input/output ports\n  * `Arduino support \u003chttp://python-automate.readthedocs.io/en/latest/official_extensions/arduino.html\u003e`_\n    for analog and digital input/output ports and VirtualWire wireless networking\n    with `AutomateFirmata \u003chttps://github.com/tuomas2/AutomateFirmata\u003e`_.\n  * Easy to write extensions to support other hardware\n\n* System state saving and restoring via serialization\n* Intelligent design:\n\n  * Comprehensively tested via ``py.test`` unit/integration tests\n  * Takes advantage of `Traits \u003chttp://traits.readthedocs.org/en/4.6.0/\u003e`_ library, especially its\n    notification system.\n  * `IPython \u003chttp://ipython.org\u003e`_ console to monitor, modify and control system on-the-fly\n  * Versatile function/callable library to write state program logic\n\n* RPC and Websocket interfaces to connect between other applications or other Automate systems.\n* Comprehensive and customizable\n  `Web User Interface \u003chttp://python-automate.readthedocs.io/en/latest/official_extensions/webui.html\u003e`_\n* UML graphs can be drawn automaticlaly of the system (as can be seen in the examples\n  of this documentation)\n\n.. _hello-world:\n\nExample\n-------\n\nLet's take a look at a small Automate program as an example:\n\n.. code-block:: python\n\n    from automate import *\n\n    class MySystem(System):\n        # HW swtich connected Raspberry Pi GPIO port 1\n        hardware_switch = RpioSensor(port=1)\n        # Switch that is controllable, for example, from WEB interface\n        web_switch = UserBoolSensor()\n        # Lamp relay that switches lamp on/off, connected to GPIO port 2\n        lamp = RpioActuator(port=2)\n        # Program that controls the system behaviour\n        program = Program(\n            active_condition=Or('web_switch', 'hardware_switch'),\n            on_activate=SetStatus('lamp', True)\n        )\n\n\n    my_system = MySystem()\n\nThis simple example has two sensors ``hardware_switch``, ``web_switch``, actuator (``lamp``) and a ``program`` that\ncontains logic what to do and when. Here, ``lamp`` is switched on if either ``web_switch`` or ``hardware_switch`` has\nstatus ``True``.\n\nInstalling Automate\n-------------------\n\nAutomate can be installed like ordinary python package. I recommend installation\nin within virtual environment (see `virtualenv \u003chttps://virtualenv.pypa.io/en/latest/\u003e`_).\n\n#. (optional): Create and start using virtualenv::\n\n    mkvirtualenv automate\n    workon automate\n\n\n#. Install from pypi::\n\n    pip install automate\n\nOptionally, you can specify some of the extras, i.e. web, rpc, raspberrypi, arduino::\n\n   pip install automate[web,rpc,raspberrypi,arduino]\n\nor if you want them all::\n\n   pip install automate[all]\n\nLicense\n-------\n\nAutomate is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nAutomate is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with Automate.  If not, see http://www.gnu.org/licenses/.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuomas2%2Fautomate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftuomas2%2Fautomate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuomas2%2Fautomate/lists"}