{"id":24791270,"url":"https://github.com/bulletmark/wccontrol","last_synced_at":"2025-10-08T10:54:37.760Z","repository":{"id":62588335,"uuid":"163731810","full_name":"bulletmark/wccontrol","owner":"bulletmark","description":"Watts Clever Switch Control","archived":false,"fork":false,"pushed_at":"2025-07-27T01:52:45.000Z","size":49,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-08T22:19:47.268Z","etag":null,"topics":["google-assistant","ifttt","ifttt-webhooks","python","raspberry-pi","rf-transmitter","switch"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bulletmark.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2019-01-01T11:28:39.000Z","updated_at":"2025-08-07T13:07:27.000Z","dependencies_parsed_at":"2025-01-28T01:25:33.728Z","dependency_job_id":"f55969dc-9424-45e8-a51a-b2a03ae5039c","html_url":"https://github.com/bulletmark/wccontrol","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/bulletmark/wccontrol","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fwccontrol","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fwccontrol/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fwccontrol/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fwccontrol/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bulletmark","download_url":"https://codeload.github.com/bulletmark/wccontrol/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fwccontrol/sbom","scorecard":{"id":258069,"data":{"date":"2025-08-11","repo":{"name":"github.com/bulletmark/wccontrol","commit":"699c57ee84bbbe9ee47ad616f4d02ce30892cddb"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"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":"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":"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":"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":"Maintained","score":1,"reason":"2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"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":"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":"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":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"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"}}]},"last_synced_at":"2025-08-17T10:08:20.106Z","repository_id":62588335,"created_at":"2025-08-17T10:08:20.106Z","updated_at":"2025-08-17T10:08:20.106Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278931659,"owners_count":26070788,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["google-assistant","ifttt","ifttt-webhooks","python","raspberry-pi","rf-transmitter","switch"],"created_at":"2025-01-29T19:16:13.094Z","updated_at":"2025-10-08T10:54:37.738Z","avatar_url":"https://github.com/bulletmark.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## WCCONTROL - Watts Clever Switch Control\n[![PyPi](https://img.shields.io/pypi/v/wccontrol)](https://pypi.org/project/wccontrol/)\n\nThis is a Raspberry Pi command line program and Python module to switch\non and off a Watts Clever RF Switch via a cheap 433 MHz transmitter\nmodule. I also have a higher level program\n[`wcscheduler`](https://github.com/bulletmark/wcscheduler) which imports\nthis module and can be used to schedule one or more switches on/off at\nspecified times and days of week.\n\nThe `wccontrol` module implements the protocol which was reverse\nengineered in the excellent posts\n[here](https://goughlui.com/2016/04/10/reverse-eng-watts-clever-easy-off-sockets-wsmart-box-es-aus1103/)\nand\n[here](https://goughlui.com/2016/04/13/reverse-eng-pt-2-watts-clever-easy-off-wsmart-box-es-aus1103/).\n\nThe latest version of this document and code is available at\nhttps://github.com/bulletmark/wccontrol.\n\n## Watts Clever Switch\n\nYou need one or more of these:\n\n![Watts Clever RF Switch](http://i.imgur.com/mILcB6m.jpg)\n\nOften this is purchased in a pack with 2, 3, or 4 such switches, and an\nIR (infra-red) receiver box which allows you to operate the remote\nswitches using a standard TV remote which talks IR to the receiver, then\nthe receiver talks RF 433 MHz to the switches. E.g the pack is:\n\n![Watts Clever Easy Off Pack](http://i.imgur.com/uqLBL8f.jpg)\n\nThe `wccontrol` module allows your Raspberry Pi to talk directly via RF\nto the switches. You do not need the IR receiver box at all (i.e. you do\nnot need the blue box in above image), neither to operate or initially\nprogram the switches. `wccontrol` can be used to fully program\nswitch group and addresses, and then to operate the switches on and off.\n\n## RF Transmitter\n\nYou also need a 433 MHz RF transmitter to connect to your Raspberry Pi.\n\n![RF Transmitter](http://i.imgur.com/UHoh3Px.jpg)\n\nRF modules like the above for Raspberry Pi and similar devices are\npurchased for only a few bucks on ebay etc, usually as a transmitter and\nreceiver pair. To use `wccontrol`, we only need the transmitter which is\nthe smaller board as shown above.\n\nThe transmitter has 3 pins which you directly connect to the RPi header\npins using push-on [female to female jumper\nwires](https://www.adafruit.com/product/266) as follows.\n\nTx pin | Description | Raspberry Pi GPIO header\n------ | ----------- | ------------------------\nLeft   | Data        | GPIO4 (board pin 7)\nMiddle | VCC         | 5V power (e.g. board pin 4 or 2)\nRight  | GND         | Ground  (e.g. board pin 6 or 9 or etc)\n\nYou can significantly increase the range of the transmitter by soldering\na 17.3 cm copper wire to the ANT pad in the corner of the PCB. Ideally,\norientate the wire parallel to the switches, i.e. if you plug the RF\nswitch unit directly into a wall socket then orientate the antenna wire\nvertically.\n\nNote that `wccontrol` uses GPIO4 by default to drive the transmitter but\nyou can easily set it to use any of the other Raspberry Pi GPIO pins by\npassing the `pin` argument.\n\n## Installation\n\nRequires Python 3.6 or later. Does not work with Python 2.\n\n`wccontrol` is [available on PyPI](https://pypi.org/project/wccontrol/)\nso install the usual way, e.g:\n\n```bash\n$ pipx install -U wccontrol\n```\n\nOr explicitly from [github](https://github.com/bulletmark/wccontrol):\n\n```bash\n$ git clone https://github.com/bulletmark/wccontrol.git\n$ cd wccontrol\n$ pipx install .\n```\n\n### Make GPIO Device Accessible\n\nTo be able to run this utility/module as your normal user you need to\ninstall a udev rule and assign yourself to the `gpio` group.\n\nAs root, create `gpio` group:\n\n```bash\n$ sudo groupadd -f -r gpio\n```\n\nAdd your user to that group:\n\n```bash\n$ sudo usermod -aG gpio $USER\n```\n\nFetch `gpio.rules` from this repo and copy it to the appropriate place\non your system:\n\n```bash\n$ sudo curl -L https://raw.githubusercontent.com/bulletmark/wccontrol/master/gpio.rules -o /etc/udev/rules.d/99-gpio.rules\n```\n\nReboot your RPi and log back in again.\n\n## Groups and Addresses\n\nBefore you can operate a switch on/off you must first program it to\nrespond to a specific _group_ and _address_.\n\nA _group_ is a number 0 to 1023. An _address_ is a number 0 to 7 within\na group that you allocate to specific switches. Address number 6 is\nspecial as it means \"all addresses in same group\", i.e. you can switch\nall devices together in the same group by using address 6. So there are\nactually only 7 unique addresses which you can use per group, 0-\u003e5 and\n7. Thus there are potentially 1024 x 7 individually addressable devices\nyou can control.\n\n### Program Group and Address to Device\n\nE.g. say you want to assign your first switch as address 0 in group 0.\n\n1. Ensure power is applied to the switch.\n1. Ensure switch is OFF, i.e. press button to turn LED OFF.\n1. Press and hold the switch button until the LED fast flashes, then\n   slow flashes, then release.\n1. Execute the ON command `wccontrol 0 0 1` to program ON.\n1. Execute the OFF command `wccontrol 0 0 0` to program OFF.\n1. The LED will go OFF and the switch is now programmed.\n1. Test using `wccontrol 0 0 1` to confirm the switch goes ON then \n   `wccontrol 0 0 0` to confirm the switch goes OFF.\n1. Repeat the above steps for your other switches using a different group/address.\n\n## Example Commands to Switch On and Off\n\nSwitch group 0, device 2 to ON:\n\n```bash\n$ wccontrol 0 2 1\n```\n\nSwitch group 0, device 2 to OFF:\n\n```bash\n$ wccontrol 0 2 0\n```\n\nSwitch group 0, device 3 to ON:\n\n```bash\n$ wccontrol 0 3 1\n```\n\nSwitch group 0, device 3 to OFF:\n\n```bash\n$ wccontrol 0 3 0\n```\n\nSwitch both (i.e. all) devices in group 0 to ON:\n\n```bash\n$ wccontrol 0 6 1\n```\n\nSwitch both (i.e. all) devices in group 0 to OFF:\n\n```bash\n$ wccontrol 0 6 0\n```\n\n## Command Line Options\n\nType `wccontrol -h` to view the usage summary:\n\n```\nusage: wccontrol [-h] [-p PIN] [-r RETRIES] group address {0,1}\n\nModule/program to set a Watts Clever Smart switch on or off.\n\npositional arguments:\n  group                 group, 0 to 1023\n  address               switch address to write to, 0 to 7 (6=all in same\n                        group)\n  {0,1}                 value 0=off, 1=on\n\noptions:\n  -h, --help            show this help message and exit\n  -p PIN, --pin PIN     RPi BCM GPIO pin to output (default: 4)\n  -r RETRIES, --retries RETRIES\n                        number of retries to send (default: 15)\n```\n\n## Using as a Python Module\n\n```python\nfrom wccontrol import WCcontrol\n\n# Create instance on given \"pin\"\nwc = WCcontrol(pin)\n\n# Use this instance\nwc.set(0, 2, 1)\n```\n\nSee the stub code in\n[`wccontrol.py`](https://github.com/bulletmark/wccontrol/blob/master/wccontrol.py)\nor my [scheduler\napplication](https://github.com/bulletmark/wcscheduler/blob/master/wcscheduler)\nfor more complete examples using the python module.\n\n## IFTTT Integration\n\nAnother example of how this module can be used is to call it from a tiny\nweb service application you can run on your Raspberry Pi and which can\nreceive [IFTTT](https://ifttt.com/discover) web-hook messages from the\ninternet to turn devices on and off. Usually you would just forward a\nport from your home firewall/router to the RPi. The web-hooks can be\ntriggered by the Google Assistant service. So you can say \"Hey Google,\nturn the Living Room lights on\" and it happens! Quite simple and cheap\nto implement given the hardware described here. My [scheduler\napplication](https://github.com/bulletmark/wcscheduler)\nfor _wccontrol_ has [IFTTT](https://ifttt.com/discover) integration.\n\n\u003c!-- vim: se ai syn=markdown: --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulletmark%2Fwccontrol","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbulletmark%2Fwccontrol","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulletmark%2Fwccontrol/lists"}