{"id":16852600,"url":"https://github.com/marcocanc/orthoplay-re","last_synced_at":"2026-01-04T07:10:34.686Z","repository":{"id":152002721,"uuid":"63250183","full_name":"Marcocanc/orthoplay-re","owner":"Marcocanc","description":"🔊 Reversing Orthoplay Websocket communication (Teenage Engineering OD-11) ","archived":false,"fork":false,"pushed_at":"2016-07-13T14:30:44.000Z","size":68,"stargazers_count":8,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-17T21:21:37.343Z","etag":null,"topics":["notes","protocol","reverse-engineering","teenage-engineering","websocket"],"latest_commit_sha":null,"homepage":"","language":null,"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/Marcocanc.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}},"created_at":"2016-07-13T13:52:30.000Z","updated_at":"2025-03-15T22:48:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"e6d55282-f734-4311-8322-e8733dccec41","html_url":"https://github.com/Marcocanc/orthoplay-re","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcocanc%2Forthoplay-re","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcocanc%2Forthoplay-re/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcocanc%2Forthoplay-re/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcocanc%2Forthoplay-re/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Marcocanc","download_url":"https://codeload.github.com/Marcocanc/orthoplay-re/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244198395,"owners_count":20414443,"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","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":["notes","protocol","reverse-engineering","teenage-engineering","websocket"],"created_at":"2024-10-13T13:48:00.944Z","updated_at":"2026-01-04T07:10:34.612Z","avatar_url":"https://github.com/Marcocanc.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Reversing Orthoplay\r\n*Tested on OD-11 running V0.9.11*\r\n\r\n![Intel Edison with Encoder for controlling Volume and Display](https://raw.githubusercontent.com/Marcocanc/orthoplay/master/images/edison_remote.jpg)\r\n## Endpoints\r\n\r\nCommunication to the OD-11 goes through Websockets.\r\nThe OD-11 is running AutobahnPython 0.5.14 twice:\r\n\r\n- PROD: `http://od-11.local/ws`\r\n- DEV: `http://od-11.local:8081`\r\n\r\n##Initiating communication\r\nTo start communicating with the device, send the `global_join` message along with the protocol version you are going to use.\r\nAt the time of writing this, 0.4 seems to be the newest.\r\n\r\nThe message will look like this: `{\"protocol_major_version\":0,\"protocol_minor_version\":4,\"action\":\"global_join\"}`\r\n\r\n##Registering/configuring your remote\r\nNext you will need to register your remote with the following message:\r\n``{\"color_index\":0,\"name\":\"guest\",\"realtime_data\":true,\"uid\":\"YOUR_REMOTE_UID\",\"action\":\"group_join\"}``\r\n\r\nIn the js implementation, a unique ID for the remote is generated with the following code\r\n```javascript\r\nvar uid = \"uid-\" + Math.floor(1e8 * Math.random());\r\n```\r\n\r\n##Staying Connected\r\nIn order to stay connected, it is required to send a ping with a timestamp every once in a while (The web client does this every 5 seconds)\r\n```javascript\r\nvar createPing = function() {\r\n\treturn {\r\n\t\tvalue: (new Date).getTime() % 1e6,\r\n\t\taction:\"speaker_ping\"\r\n\t}\r\n}\r\n```\r\nThe ping message will look like this `{\"value\":913577,\"action\":\"speaker_ping\"}`\r\n\r\n\r\n###Changing the Volume\r\nYou can change the volume of your speaker group by sending the `group_change_volume` message along with the amount by which the volume should change\r\n\r\n`{\"amount\":-1,\"action\":\"group_change_volume\"}`\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcocanc%2Forthoplay-re","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcocanc%2Forthoplay-re","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcocanc%2Forthoplay-re/lists"}