{"id":20288014,"url":"https://github.com/emxsys/callattendant","last_synced_at":"2025-04-03T02:10:10.362Z","repository":{"id":43388524,"uuid":"151436768","full_name":"emxsys/callattendant","owner":"emxsys","description":"A python-based automated call attendant, call blocker, and voice messaging system running on a Raspberry Pi. Screens callers and block robocalls and scams with a low-cost Raspberry Pi and modem.","archived":false,"fork":false,"pushed_at":"2023-02-01T20:42:53.000Z","size":14884,"stargazers_count":124,"open_issues_count":45,"forks_count":37,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-24T08:38:48.159Z","etag":null,"topics":["answering-machine","auto-attendant","call-blocker","call-screener","callblocker","flask","modem","phone","python","python3","raspberry-pi","rational-unified-process","rup","telephone","telephony","uml","voice-mail","voice-messages","web-app","webapp"],"latest_commit_sha":null,"homepage":"https://emxsys.github.io/callattendant/","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/emxsys.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-10-03T15:37:08.000Z","updated_at":"2025-03-18T22:22:11.000Z","dependencies_parsed_at":"2023-02-17T11:00:51.232Z","dependency_job_id":null,"html_url":"https://github.com/emxsys/callattendant","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emxsys%2Fcallattendant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emxsys%2Fcallattendant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emxsys%2Fcallattendant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emxsys%2Fcallattendant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/emxsys","download_url":"https://codeload.github.com/emxsys/callattendant/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246922247,"owners_count":20855345,"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":["answering-machine","auto-attendant","call-blocker","call-screener","callblocker","flask","modem","phone","python","python3","raspberry-pi","rational-unified-process","rup","telephone","telephony","uml","voice-mail","voice-messages","web-app","webapp"],"created_at":"2024-11-14T14:43:42.082Z","updated_at":"2025-04-03T02:10:10.339Z","avatar_url":"https://github.com/emxsys.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Call Attendant\n![PyPI](https://img.shields.io/pypi/v/callattendant?style=flat\u0026link=https://pypi.org/project/callattendant/) ![PyPI - License](https://img.shields.io/pypi/l/callattendant?link=https://github.com/emxsys/callattendant/blob/master/LICENSE) ![PyPI - Status](https://img.shields.io/pypi/status/callattendant) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/emxsys/callattendant/callattendant)\n\n#### `pip install callattendant`\n\nThe Call Attendant (__callattendant__) is an auto attendant with an integrated call blocker and \nvoice messaging system running on a Raspberry Pi. It stops annoying robocalls and spammers from\ninterrupting your life. Let the Call Attendant intercept and block robocallers and telemarketers\nbefore the first ring on your landline.\n\nThe __callattendant__ provides international support with configurable phone number formats, with \nflexible and editable blocked-number and permitted-number lists.\n\n_If you're at all interested in this project, please provide some feedback by giving it a\n__[star](https://github.com/emxsys/callattendant/stargazers)__, or even better, get involved\nby filing [issues](https://github.com/emxsys/callattendant/issues), joining the \n[forum](https://groups.io/g/callattendant) and/or submitting \n[pull requests](https://github.com/emxsys/callattendant/pulls).\nThanks!_\n\n#### Support Links\n- [Web Page](https://emxsys.github.io/callattendant/)\n- [Wiki](https://github.com/emxsys/callattendant/wiki)\n- [Forum](https://groups.io/g/callattendant)\n\n#### Table of Contents\n- [Overview](#overview)\n- [Quick Start](#quick-start)\n\n## Overview\nThe Call Attendant (__callattendant__) is a python-based, automated call attendant that runs on a\nlightweight Raspberry Pi, or other Linux-based system, coupled with a US Robotics 5637 USB modem.\n\n#### How it works\nThe Raspberry Pi and modem are connected to your home phone system in parallel with your phone\nhandset(s). When an incoming call is received, the call goes to both your phone and the\n__callattendant__. During the period of the first ring the __callattendant__ analyzes the caller ID,\nand based on your configuration, determines if the call should be blocked or allowed. Blocked calls\ncan be simply hung up on, or routed to the voice message system. Calls that are allowed will simply\nring your home phone like normal. Calls can be sent to the integrated voice mail system if you choose. \nThe __callattendant__'s filtering mechanisms include an online lookup service, a permitted number list,\na blocked number list and pattern matching on the caller's number and/or name.\n\n#### Features include:\n- A call blocker that intercepts robocallers and blocked numbers at or before the first ring\n- Permitted numbers pass straight through to the local phone system for normal call ringing and answering\n- Visual indicators to show whether the incoming call is from a permitted, blocked, or unknown number\n- Call details, permitted numbers, and blocked numbers are available in a web-based user interface\n- Calls can be handled by a voice messaging system that optioanlly requires human interaction,\ne.g, \"Press 1 to leave a message\"\n\nYou can review call history, voice messages, permitted and blocked numbers, and performing caller\nmanagement through the Call Attendant's web interface. Here is an example of the home page with metrics\nand a convienient list of recent calls. For a complete description see the\n[User Guide](https://github.com/emxsys/callattendant/wiki/User-Guide).\n\n##### _Screenshots of the home page as seen on an IPad Pro and a Pixel 2 phone_\n![Dashboard-Responsive](https://github.com/emxsys/callattendant/raw/master/docs/dashboard-responsive.png)\n\n### Documentation\nThe project wiki on GitHub contains the documentation for the Call Attendant:\n\n- See the [Wiki Home](https://github.com/emxsys/callattendant/wiki/Home) for complete\ninstallation, configuration, and operation instructions.\n- See the [User Guide](https://github.com/emxsys/callattendant/wiki/User-Guide) section for the\nweb interface instructions.\n- The [Developer Guide](https://github.com/emxsys/callattendant/wiki/Developer-Guide) section\ndescribes the software architecture and software development plan, and shows you how to setup\nyour software development environment.\n- The [Advanced](https://github.com/emxsys/callattendant/wiki/Advanced) section addresses more\ncomplex setups and situations. For instance, _Running as a Service_.\n\n\n### Hardware Requirements\nThe __callattendant__ uses the following hardware:\n- [Raspberry Pi 3B+](https://www.amazon.com/ELEMENT-Element14-Raspberry-Pi-Motherboard/dp/B07P4LSDYV/ref=sr_1_4?dchild=1\u0026keywords=raspberry+pi+3\u0026qid=1598057138\u0026sr=8-4) or better\n- [US Robotics 5637 Modem](https://www.amazon.com/gp/product/B0013FDLM0/ref=ppx_yo_dt_b_asin_image_o03_s00?ie=UTF8\u0026psc=1) \nor the [Zoom 3095 Modem](https://www.amazon.com/Zoom-Model-3095-USB-Modem/dp/B07HHKG6HR). Other Conexant-based\nmodems may work.\n\n##### _Photo of the required hardware: a Raspberry Pi 3B+ and USR5637 modem_\n![Raspberry Pi and USR5637 Modem](https://github.com/emxsys/callattendant/raw/master/docs/raspberry_pi-modem.jpg)\n\n---\n\n## Quick Start\n\n### Hardware\nYou will need a Raspberry Pi running Raspbian or better with access to the Internet for the software\ninstallation, and ultimately for the the online robocaller lookups. For the project, you will need a\nmodem of some sort to do the telephony communications. The **U.S. Robotics USR5637 56K USB Modem** has\nbeen proven effective. For some installs, it just works, no config needed. It showed up as /dev/ttyACM0.\n\n---\n\n### Software\nThe installation calls for Python3.X.\n\n#### Setup a Virtual Environment\n###### _Optional_\nThe following instructions create and activate a virtual environment named _venv_ within the\ncurrent folder:\n```bash\n# Install virtualenv - if not installed\nsudo apt install virtualenv\n\n# Create the virtual environment\nvirtualenv venv --python=python3\n\n# Activate it\nsource venv/bin/activate\n```\n\nNow you're operating with a virtual Python. To check, issue the `which` command and ensure the\noutput points to your virtual environment; and also check the Python version:\n```bash\n$ which python\n/home/pi/venv/bin/python\n\n$ python --version\nPython 3.7.3\n```\nLater, when you install the __callattendant__ software, it will be placed within the virtual environment\nfolder (under `lib/python3.x/site-packages` to be exact). The virtual environment, when activated, alters\nyour _PATH_ so that the system looks for python and its packages within this folder hierarchy.\n\n#### Install the Software\nThe software is available on [PyPI](https://pypi.org/project/callattendant/). Install and update using `pip`:\n```bash\n# Using the virtual environment you use \"pip\" to install the software\npip install callattendant\n\n# You must use \"pip3\" on the Pi if your not using a virtual environment\npip3 install callattendant\n```\n\nIf your not using the virtual environment, you may need to reboot or logoff/login to update the\n`$PATH` for your profile in order to find and use the `callattendant` command.\n\n---\n\n### Operation\n\nThe __callattendant__ package includes a `callattendant` command to start the system. Run this command\nthe first time with the `--create-folder` option to create the initial data and files in the default\ndata folder: `~/.callattendant`. This is a hidden folder off the root of your home directory. You\ncan override this location with the `--data-path` option.\n\n```\nUsage: callattendant --config [FILE] --data-path [FOLDER]\nOptions:\n-c, --config [FILE]       load a python configuration file\n-d, --data-path [FOLDER]  path to data and configuration files\n-f, --create-folder       create the data-path folder if it does not exist\n-h, --help                displays this help text\n```\n\n```bash\n# Creating the default data folder with the default configuration\ncallattendant --create-folder\n\n# Using the default configuration\ncallattendant\n\n# Using a customized config file in an alternate, existing location\ncallattendant --config myapp.cfg --data-path /var/lib/callattendant\n```\n\nYou should see output of the form:\n```\nCommand line options:\n  --config=app.cfg\n  --data-path=None\n  --create-folder=False\n[Configuration]\n  BLOCKED_ACTIONS = ('greeting', 'voice_mail')\n  BLOCKED_GREETING_FILE = /home/pi/.local/lib/python3.7/site-packages/callattendant/resources/blocked_greeting.wav\n  BLOCKED_RINGS_BEFORE_ANSWER = 0\n  BLOCK_ENABLED = True\n  BLOCK_NAME_PATTERNS = {'V[0-9]{15}': 'Telemarketer Caller ID'}\n  BLOCK_NUMBER_PATTERNS = {}\n  BLOCK_SERVICE = NOMOROBO\n  CONFIG_FILE = app.cfg\n  DATABASE = callattendant.db\n  DATA_PATH = /home/pi/.callattendant\n  DB_FILE = /home/pi/.callattendant/callattendant.db\n  DEBUG = False\n  ENV = production\n  PERMITTED_ACTIONS = ('greeting', 'record_message')\n  PERMITTED_GREETING_FILE = /home/pi/.local/lib/python3.7/site-packages/callattendant/resources/general_greeting.wav\n  PERMITTED_RINGS_BEFORE_ANSWER = 6\n  PERMIT_NAME_PATTERNS = {}\n  PERMIT_NUMBER_PATTERNS = {}\n  PHONE_DISPLAY_FORMAT = ###-###-####\n  PHONE_DISPLAY_SEPARATOR = -\n  ROOT_PATH = /home/pi/.local/lib/python3.7/site-packages/callattendant\n  SCREENED_ACTIONS = ('greeting', 'record_message')\n  SCREENED_GREETING_FILE = /home/pi/.local/lib/python3.7/site-packages/callattendant/resources/general_greeting.wav\n  SCREENED_RINGS_BEFORE_ANSWER = 0\n  SCREENING_MODE = ('whitelist', 'blacklist')\n  TESTING = False\n  VERSION = 1.1.0\n  VOICE_MAIL_GOODBYE_FILE = /home/pi/.local/lib/python3.7/site-packages/callattendant/resources/goodbye.wav\n  VOICE_MAIL_GREETING_FILE = /home/pi/.local/lib/python3.7/site-packages/callattendant/resources/general_greeting.wav\n  VOICE_MAIL_INVALID_RESPONSE_FILE = /home/pi/.local/lib/python3.7/site-packages/callattendant/resources/invalid_response.wav\n  VOICE_MAIL_LEAVE_MESSAGE_FILE = /home/pi/.local/lib/python3.7/site-packages/callattendant/resources/please_leave_message.wav\n  VOICE_MAIL_MENU_FILE = /home/pi/.local/lib/python3.7/site-packages/callattendant/resources/voice_mail_menu.wav\n  VOICE_MAIL_MESSAGE_FOLDER = /home/pi/.callattendant/messages\nInitializing Modem\nOpening serial port\nLooking for modem on /dev/ttyACM0\n******* Conextant-based modem detected **********\nSerial port opened on /dev/ttyACM0\nModem initialized\n{MSG LED OFF}\nStarting the Flask webapp\nRunning the Flask server\nWaiting for call...\n * Serving Flask app \"userinterface.webapp\" (lazy loading)\n * Environment: production\n   WARNING: This is a development server. Do not use it in a production deployment.\n   Use a production WSGI server instead.\n * Debug mode: off\n\n```\n\nMake a few calls to yourself to test the service. The standard output will show the\nprogress of the calls. Then navigate to `http://\u003cpi-address\u003e|\u003cpi-hostname\u003e:5000` in a\nweb browser to checkout the web interface.\n\nPress `ctrl-c` to shutdown the system\n\n---\n\n### Web Interface\n#### URL: `http://\u003cpi-address\u003e|\u003cpi-hostname\u003e:5000`\nTo view the web interface, simply point your web browser to port `5000` on your Raspberry Pi.\nFor example, in your Raspberry Pi's browser, you can use:\n```\nhttp://localhost:5000/\n```\n\nSee the [User Guide](https://github.com/emxsys/callattendant/wiki/User-Guide) for more information.\n\n---\n\n### Configuration\nThe Call Attendant's behavior can be controlled by a configuration file. To override the default\nconfiguration, open the  the `~/.callattenant/app.cfg` and edit its contents.\n\n```bash\nnano ~/.callattendant/app.cfg\n```\n\nThen specify the configuration file and path on the command line, e.g.:\n```\ncallattendant --config app.cfg\n```\nSee the [Configuration](https://github.com/emxsys/callattendant/wiki/Home#configuration)\nsection in the project's wiki for more information.\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femxsys%2Fcallattendant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femxsys%2Fcallattendant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femxsys%2Fcallattendant/lists"}