{"id":32992094,"url":"https://github.com/agmangas/wot-py","last_synced_at":"2026-01-14T08:52:39.647Z","repository":{"id":37602641,"uuid":"170722066","full_name":"agmangas/wot-py","owner":"agmangas","description":"wotpy is an experimental asynchronous implementation of a W3C Web of Things runtime","archived":false,"fork":false,"pushed_at":"2025-09-04T15:38:55.000Z","size":6862,"stargazers_count":45,"open_issues_count":12,"forks_count":16,"subscribers_count":6,"default_branch":"develop","last_synced_at":"2025-11-18T04:02:55.481Z","etag":null,"topics":["asyncio","iot","python","web-of-things","wot"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/agmangas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2019-02-14T16:27:32.000Z","updated_at":"2025-04-13T15:57:24.000Z","dependencies_parsed_at":"2023-01-21T12:49:09.224Z","dependency_job_id":"137cf814-8d37-4b2b-8da7-8dd809ecd9d1","html_url":"https://github.com/agmangas/wot-py","commit_stats":{"total_commits":748,"total_committers":9,"mean_commits":83.11111111111111,"dds":0.09224598930481287,"last_synced_commit":"ab14570927ccb1fcda5e7ffc415fda3c1ef2d00d"},"previous_names":[],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/agmangas/wot-py","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agmangas%2Fwot-py","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agmangas%2Fwot-py/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agmangas%2Fwot-py/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agmangas%2Fwot-py/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/agmangas","download_url":"https://codeload.github.com/agmangas/wot-py/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agmangas%2Fwot-py/sbom","scorecard":{"id":170710,"data":{"date":"2025-08-11","repo":{"name":"github.com/agmangas/wot-py","commit":"2edb728be306afe5e5afff9bedb0b33713f0011f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","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":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/publish.yaml:1","Warn: no topLevel permission defined: .github/workflows/test-wot-py.yaml:1","Info: no jobLevel write permissions found"],"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":"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":"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":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yaml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/agmangas/wot-py/publish.yaml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yaml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/agmangas/wot-py/publish.yaml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yaml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/agmangas/wot-py/publish.yaml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-wot-py.yaml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/agmangas/wot-py/test-wot-py.yaml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-wot-py.yaml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/agmangas/wot-py/test-wot-py.yaml/develop?enable=pin","Warn: containerImage not pinned by hash: .devcontainer/Dockerfile:5","Warn: pipCommand not pinned by hash: .devcontainer/post-create-command.sh:6","Warn: pipCommand not pinned by hash: .devcontainer/post-create-command.sh:7","Warn: pipCommand not pinned by hash: .github/workflows/publish.yaml:28","Warn: pipCommand not pinned by hash: .github/workflows/publish.yaml:29","Warn: pipCommand not pinned by hash: .github/workflows/test-wot-py.yaml:22","Warn: pipCommand not pinned by hash: .github/workflows/test-wot-py.yaml:23","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   6 pipCommand dependencies pinned"],"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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":"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":"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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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"}}]},"last_synced_at":"2025-08-16T16:22:31.508Z","repository_id":37602641,"created_at":"2025-08-16T16:22:31.508Z","updated_at":"2025-08-16T16:22:31.508Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28414704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T08:38:59.149Z","status":"ssl_error","status_checked_at":"2026-01-14T08:38:43.588Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["asyncio","iot","python","web-of-things","wot"],"created_at":"2025-11-13T10:00:26.790Z","updated_at":"2026-01-14T08:52:39.622Z","avatar_url":"https://github.com/agmangas.png","language":"Python","funding_links":[],"categories":["Section"],"sub_categories":["WoT Implementations"],"readme":"# wotpy\n\n## Introduction\n\nwotpy is an experimental implementation of a [W3C WoT Runtime](https://github.com/w3c/wot-architecture/blob/master/proposals/terminology.md#wot-runtime) and the [W3C WoT Scripting API](https://github.com/w3c/wot-architecture/blob/master/proposals/terminology.md#scripting-api) in Python.\n\nInspired by the exploratory implementations located in the [thingweb GitHub page](https://github.com/thingweb).\n\n### About the current version\n\nThe current version of the project has been updated in an effort to address stability and deprecation issues. The following changes have been made compared to [version `0.16.0`](https://pypi.org/project/wotpy/0.16.0/):\n\n* The project has been updated to support Python 3.7 and above. All support for Python 2 has been dropped.\n* The project has mostly dropped the Tornado coroutines syntax in favor of the `async`/`await` syntax.\n* The project has removed the dependency from the [`hbmqtt`](https://github.com/beerfactory/hbmqtt) package in favor of [`aiomqtt`](https://github.com/sbtinstruments/aiomqtt) due to the deprecation of the former.\n\nHowever, please note that there's still a **significant pending issue**. Although the project is currently in a reasonably stable state, it does not implement the current version of the W3C WoT specifications. Specifically, the version at the time of writing is based on the following **outdated** references:\n\n* K. Kajimoto, M. Kovatsch, and U. Davuluru, ‘Web of Things (WoT) Architecture’, W3C, W3C First Public Working Draft, Sep. 2017. [Online]. Available: https://www.w3.org/TR/2017/WD-wot-architecture-20170914/\n* Z. Kis, K. Nimura, D. Peintner, and J. Hund, ‘Web of Things (WoT) Scripting API’, W3C, W3C Working Draft, Nov. 2018. [Online]. Available: https://www.w3.org/TR/2018/WD-wot-scripting-api-20181129/\n* S. Käbisch and T. Kamiya, ‘Web of Things (WoT) Thing Description’, W3C, W3C Working Draft, Oct. 2018. [Online]. Available: https://www.w3.org/TR/2018/WD-wot-thing-description-20181021/\n\n\u003e ℹ️ It is in our plans to get wotpy up to speed with the latest version of the specifications. We don't have an ETA for this, but we will be working on it in the near future.\n\nIn summary, wotpy is mature enough to be used in projects; in fact, it is being used in production at [CTIC](https://github.com/fundacionctic). However, it is not an adequate representation of the current status of the W3C WoT. We greatly encourage you to check the [Developer Resources section on the WoT website](https://www.w3.org/WoT/developers) to find out about the current state of the art.\n\n## Features\n\nThe wotpy project provides fully functional implementations of four different protocol bindings: MQTT, HTTP, WebSockets, and CoAP. Moreover, it offers a discovery implementation based on Multicast DNS.\n\nThese bindings are built on top of the following dependencies, which are instrumental to the project:\n\n|            Feature | Implementation based on                                                 |\n| -----------------: | ----------------------------------------------------------------------- |\n|       HTTP binding | [tornadoweb/tornado](https://github.com/tornadoweb/tornado)             |\n| WebSockets binding | [tornadoweb/tornado](https://github.com/tornadoweb/tornado)             |\n|       CoAP binding | [chrysn/aiocoap](https://github.com/chrysn/aiocoap)                     |\n|       MQTT binding | [sbtinstruments/aiomqtt](https://github.com/sbtinstruments/aiomqtt)     |\n|     mDNS discovery | [jstasiak/python-zeroconf](https://github.com/jstasiak/python-zeroconf) |\n\n## Installation\n\n```console\npip install wotpy\n```\n\n### Development\n\nThe development workflow of wotpy is based on [Taskfile](https://taskfile.dev/installation/), so that's the first thing you need to install.\n\nThen, to create a virtual environment under `.venv`, and install the project in development mode with all the test dependencies, run:\n\n```console\ntask venv\n```\n\nSome wotpy features (e.g., the CoAP binding) are not available outside of Linux. If you have Docker installed on your system and want to run the tests in a Linux environment easily, you can use the Docker-based test task:\n\n```console\n$ PYTHON_TAG=\"3.9\" task docker-tests\ntask: [test-broker] docker run -d -p 1883:1883 --name wotpy_test_broker eclipse-mosquitto:1.6\n\n68bfef102faf3529427e5c7122f41d43490885c04f8a2d673a2c57b3afd68f72\ntask: [docker-tests] echo \"⚙️ Running tests for Python 3.9...\"\n⚙️ Running tests for Python 3.9...\ntask: [docker-tests] /Users/agmangas/Documents/Projects/wot-py/pytest-docker.sh\nRunning python tests for version 3.9 with arguments \"-v\"\nCreating temporary container volume\nwotpy_tests_28b82c629b354b83a7fa22a9ed3d6dba\nRunning test container. Environment setup will take a while.\n+ docker run --rm -it -v wotpy_tests_28b82c629b354b83a7fa22a9ed3d6dba:/app -e WOTPY_TESTS_MQTT_BROKER_URL=mqtt://172.16.102.196:1883 python:3.9 /bin/bash -c 'cd /app \u0026\u0026 pip install --quiet -U .[tests] \u0026\u0026 pytest -v'\nWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\n\n[notice] A new release of pip is available: 23.0.1 -\u003e 23.3.1\n[notice] To update, run: pip install --upgrade pip\n================================================================================================================================================== test session starts ===================================================================================================================================================\nplatform linux -- Python 3.9.18, pytest-7.4.2, pluggy-1.3.0 -- /usr/local/bin/python\ncachedir: .pytest_cache\nrootdir: /app\nconfigfile: pytest.ini\nplugins: asyncio-0.21.1, rerunfailures-10.3, Faker-13.16.0, cov-2.5.1\nasyncio: mode=strict\ncollected 154 items\n\ntests/codecs/test_json.py::test_json_codec PASSED [  0%]\ntests/protocols/test_protocols.py::test_all_protocols_combined PASSED [  1%]\n\n[...]\n\n================================================================================================================================== 148 passed, 6 skipped, 1 warning in 60.70s (0:01:00) ==================================================================================================================================\n+ set +x\nwotpy_tests_28b82c629b354b83a7fa22a9ed3d6dba\ntask: [docker-tests] echo \"✅ Tests for Python 3.9 completed successfully\"\n✅ Tests for Python 3.9 completed successfully\n```\n\nAn MQTT broker is needed as a dependency for the MQTT binding tests. The task will automatically create a new container based on the [eclipse-mosquitto image](https://hub.docker.com/_/eclipse-mosquitto) and expose the broker port to the host. The `WOTPY_TESTS_MQTT_BROKER_URL` environment variable will be set to the broker URL.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagmangas%2Fwot-py","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fagmangas%2Fwot-py","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagmangas%2Fwot-py/lists"}