{"id":27876932,"url":"https://github.com/ethauvin/tesremoteprogrammer","last_synced_at":"2026-05-01T19:32:49.064Z","repository":{"id":146413904,"uuid":"66515102","full_name":"ethauvin/TESRemoteProgrammer","owner":"ethauvin","description":"Telephone Entry System Remote Programmer for Android","archived":false,"fork":false,"pushed_at":"2020-07-28T22:11:59.000Z","size":53967,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-05T02:54:54.060Z","etag":null,"topics":["android","anko","gate","kotlin","remote-control","telephone-entry"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ethauvin.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2016-08-25T02:00:15.000Z","updated_at":"2025-03-17T19:10:45.000Z","dependencies_parsed_at":null,"dependency_job_id":"cd788771-2f2a-417c-a9f7-daaae3e9d9cd","html_url":"https://github.com/ethauvin/TESRemoteProgrammer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ethauvin/TESRemoteProgrammer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethauvin%2FTESRemoteProgrammer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethauvin%2FTESRemoteProgrammer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethauvin%2FTESRemoteProgrammer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethauvin%2FTESRemoteProgrammer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ethauvin","download_url":"https://codeload.github.com/ethauvin/TESRemoteProgrammer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethauvin%2FTESRemoteProgrammer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32510752,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"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":["android","anko","gate","kotlin","remote-control","telephone-entry"],"created_at":"2025-05-05T02:54:03.885Z","updated_at":"2026-05-01T19:32:49.056Z","avatar_url":"https://github.com/ethauvin.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Telephone Entry System Remote Programmer for Android\n\n[![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Build Status](https://travis-ci.com/ethauvin/TESRemoteProgrammer.svg?branch=master)](https://travis-ci.com/ethauvin/TESRemoteProgrammer)\n[![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/tesremoteprogrammer/badge.svg?targetFile=app%2Fbuild.gradle)](https://snyk.io/test/github/ethauvin/tesremoteprogrammer?targetFile=app%2Fbuild.gradle)\n[![CircleCI](https://circleci.com/gh/ethauvin/TESRemoteProgrammer/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/TESRemoteProgrammer/tree/master)\n[![License](https://img.shields.io/badge/android-Privacy%20Policy-orange.svg)](https://m.thauvin.net/android/TESRemoteProgrammer/privacy.shtml)\n\n\n[![TES Remote Programmer](https://github.com/ethauvin/TESRemoteProgrammer/raw/master/images/github_graphic.png)](httpd://mobile.thauvin.net/android/)\n\nEasily program your Telephone Entry System remotely from anywhere using your phone.\n\nMost Telephone Entry Systems can be programmed from the front keypad or remotely from an off-premise location using any touch-tone phone. TES Remote Programmer streamlines the often cumbersome remote programming process by providing data entry screens and automated dial-in options.\n\n### DoorKing (DKS) \u0026 Linear\n\nBy default, TES Remote Programmer is configured to work with the [DoorKing 1802, 1802-EPD, 1803, 1808, 1810 and 1819](http://www.doorking.com/telephone/) as well as the [Linear AE-100 and AE-500](http://www.linearproaccess.com/access-controls/telephone-entry-systems/) systems, additional [configurations](#configurations) can be created for most systems supporting remote programming.\n\n### Directory Code\n\nPlease note that all default configurations are set for 3-digits directory code length. If your system is setup differently, you will need to modify the [default configuration](app/src/main/res/raw/) and re-import it. Look for all `Directory Code` fields and modify their `size` attributes accordingly.\n\n## Usage\n\n![Main Activity](images/screenshots/main_activity_framed_small.png)\n\nIn the main activity screen enter the entry system's phone number and master code, then select one the programming options.\n\n![Programming Activity](images/screenshots/add_phone_number_framed_small.png) ![Programming Activity](images/screenshots/set_time_clock_framed_small.png)\n\nIn the programming activity screens fill out the fields and click the ![Dial](images/call_fab.png) floating button (if available) to dial the programming in or the ![Dial](images/dialpad_fab.png) floating button to scroll through the manual (keypad) steps.\n\n## Configurations\n\n![Configurations](images/screenshots/configurations_framed_small.png)\n\nTo switch configuration, choose `Configurations` under the toolbar menu and select the desired configuration.\n\nTo import a new configuration, select `Import` in the _Configurations_ dialog.\n\n### New Configurations\n\nCustom configurations can be created using [JSON](http://www.json.org/).\n\n[View Examples](app/src/main/res/raw/)\n\n#### Parameters\n\nParameters define the configuration's global settings.\n\n```json\n\"params\": {\n  \"name\": \"DKS 1802-EPD\",\n  \"type\": \"dks\",\n  \"ack\": \"*\",\n  \"alt\": \"#\",\n  \"end\": \"0 + #\",\n  \"size\": 4\n}\n```\n\n| Property | Description                                                                                       | Required |\n|:---------|:--------------------------------------------------------------------------------------------------|:---------|\n|`name`    | The name of the configuration.                                                                    | Yes      |\n|`type`    | The system's type, either `dks` or `linear`. See note below.                                      | Yes      |\n|`ack`     | The key used to acknowledge or terminate programming steps. Most systems use the `*` or `#` keys. | Yes      |\n|`alt`     | They key used to in place of numbers when applicable. DKS systems use the `#` key                 | No       |\n|`begin`   | The begin programming manual sequence. (e.g. Linear uses `0` and `2` pressed together)            | No       |\n|`end`     | The end programming manual sequence. (e.g. DSK uses `0` and `#` pressed together.)                | No       |\n|`size`    | The size (number of digits) of the master code. Most systems use 4 or 6.                          | Yes      |\n\nThe `type` is used to determine how letters are converted to digits in alphanumeric (`alpha`) [fields](#fields), both DKS and Linear use different methodologies. It is also used to allow numeric values with leading zeros (e.g. `001`) on DKS systems.\n\n### Options\n\nOptions define the data used to create programming activity screens in the app.\n\nFor example, the system's manual lists the steps to _Programming 7-digit Phone Numbers_ as:\n\n1. Press *01 and enter Master Code.\n2. Enter a Directory Code then press *.\n3. Enter a 7-digit Phone Number then press *. If the number is less than 7-digits, enter # in the empty spaces.\n4. Press 0# TOGETHER when finished.\n\nwhich would translate into:\n\n![Options](images/options_example.png)\n\n```json\n\"opts\": [\n  {\n    \"title\": \"Add 7-digit Phone Number\",\n    \"fields\": [\n      {\n        \"hint\": \"Directory Code\",\n        \"size\": 3\n      },\n      {\n        \"hint\": \"Phone Number\",\n        \"size\": 7,\n        \"alt\": true\n      }\n    ],\n    \"dtmf\": \"*01[MASTER],[FIELD:1]*,[FIELD:2]*\"\n  }\n]\n```\n\nStep 4 is configured in the `end` [parameter](#parameters) since it only applies to manual/keypad programming.\n\n| Property | Description                                                                                       |\n|:---------|:--------------------------------------------------------------------------------------------------|\n|`title`   | The title of the option.                                                                          |\n|`fields`  | See [Fields](#fields)                                                                             |\n|`dtmf`    | See [DTMF](#dtmf)                                                                                 |\n|`nodial`  | Indicate that remote programming is not available. Steps must be executed manually at the keypad. |\n|`nosteps` | Indicate that manual/keypad steps are not available. Programming must be executed remotely.       |\n\nAll are required, except `nodial` and `nosteps` which are mutually exclusive.\n\n#### Fields\n\n```json\n\"fields\": [\n  {\n    \"hint\": \"Directory Code\",\n    \"size\": 3\n  },\n  {\n    \"hint\": \"Phone Number\",\n    \"size\": 7,\n    \"alt\": true\n  }\n]\n```\n\nFields represent the data entry text fields on option screens.\n\n| Property | Description                                                                                                                                             | Required |\n|:---------|:--------------------------------------------------------------------------------------------------------------------------------------------------------|:---------|\n|`hint`    | Set the hint/label of the field.                                                                                                                        | Yes      |\n|`size`    | Set the size of the field.                                                                                                                              | Yes      |\n|`minSize` | Set the minimum size of the field. If set, `size` is the maximum size of the field.                                                                     | No       |\n|`alpha`   | Set to `true` for alphanumeric fields.                                                                                                                  | No       |\n|`min`     | Set the minimum value of a numeric field.                                                                                                               | No       |\n|`max`     | Set the maximum value of a numeric field.                                                                                                               | No       |\n|`digits`  | Set digits that are allowed. (e.g. DKS uses `1234567` for days of the week: Sun=1... Sat=7)                                                             | No       |\n|`alt`     | Set to `true` if the field accepts the `alt` [parameter](#parameters) value in place of a digit.                                                        | No       |\n|`zeros`   | Set to `true` by default when the `type` [parameter](#parameters) is `dks`. Allows numeric values with leading zeros (e.g. `001`), based on the `size`. | No       |\n\n\n#### DTMF\n\n```json\n\"dtmf\": \"*01[MASTER],[FIELD:1]*,[FIELD:2]*\"\n```\n\nDTMF represent the dialing sequence for the programming steps. A comma (`,`) should be used to specify a pause in the dialing sequence.\n\nThe following markers will be substituted by their actual values upon dialing.\n\n| Marker     | Description                                                                               |\n|:-----------|:------------------------------------------------------------------------------------------|\n|`[MASTER]`  | Substituted with the Master Code                                                          |\n|`[FIELD:X]` | Substituted with the field's value, where X is the field number in the array.             |\n|`'Foo bar'` | Displays the enclosed text as a manual step. The `nodial` [option](#options) must be set. |\n\n#### Validation\n\nImported configurations will be validated. While the validation is not perfect, it should be good enough to spot most syntax errors.\n\nPlease sure to use a JSON editor to make creating configurations a whole lot easier.\n\nWhen in doubt be sure to look at the [default configurations](app/src/main/res/raw/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fethauvin%2Ftesremoteprogrammer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fethauvin%2Ftesremoteprogrammer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fethauvin%2Ftesremoteprogrammer/lists"}