Announcement

Collapse
No announcement yet.

Info How-To: Make regular phone calls with HS3 using vgetty on Linux

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Info How-To: Make regular phone calls with HS3 using vgetty on Linux

    Greetings,

    I needed the ability to make outgoing voice calls using a regular phone line (PSTN) from my HS3 system. In particular, this has applications when the power goes out and the Internet goes down. It is not particularly hard, but it uses older technology, for which documentation is now becoming harder to find. I present the setup below in the hope it will be useful to others - and so that next time I have to set it up, I'll remember what I did. Please note that I am not an expert on the programs used here, and so this may contain inaccuracies.

    First a note about versions:

    Software:
    Operating System - Linux: OpenSuSE 42.1 x86-64, Kernel 4.1.27
    HomeSeer Version - HS3 Standard 3.0.0.293
    mgetty/vgetty - 1.1.36
    minicom - 2.7-3.3

    Hardware:
    Modem: Conexant Systems (Rockwell), Inc. V.92 Fax Modem - USB ID: 0572:1329
    System: AMD AM1 SOC on Biostar MB

    The first thing you will need is a modem supported by Linux. As modems in general are not exactly common nowadays, these can be somewhat difficult to find. I bought one specifically for this project from a vendor (see references) that had already tested it with Linux - taking some of the guesswork out of the process. The Conexant USB modem I'm using plugs in, is recognized by the Linux kernel, and shows up at /dev/ttyACM1 out of the box (Note: your port may be different). This ttyACM1 device file is basically a serial port and can be tested as such. I used minicom for testing:

    First setup minicom:

    Code:
    # minicom -s
    Here under 'Serial port setup' set 'A - Serial Device:' to the modems port (/dev/ttyACM1). I also set the 'E - Bps/Par/Bits' to a slower speed (9600 8N1) for testing purposes. Once you exit from the setup screen you can enter commands - which will be sent directly to the modem. Most modems recognize the Hayes AT command set (Wikipedia), in which a command begins with AT (for ATtention) and some further combination of letters or digits. To do a basic test (Note - you won't see what you type) type AT <Enter>:

    Code:
    (AT)
    
    OK
    This tells us that we can actually talk to the modem - it responds to the AT(tention) command. If you have trouble here, further research is necessary (Linux Modem How-To). If the modem returns "OK" then we can proceed.

    To exit minicom type Ctrl-A; Z. And choose 'Exit and Reset' from the menu.

    Mgetty was originally designed to provide a data/fax interface on a modem - in particular it can receive data and faxes. Vgetty adds voice extension on top of mgetty and so can act as an answering machine. Documentation is somewhat sparse, given that the heyday of modems has past, but useful information can be found at the homepage.

    I was able to find mgetty in the OpenSuSE repositories, it included vgetty as part of the package. I believe it is available as a prebuilt package for Ubuntu and possibly the Raspberry Pi as well. Installing is fairly simple:

    Code:
    # zypper in mgetty
    Configuration must not be skipped. The files are located in /etc/mgetty+sendfax/voice.conf. I had to adjust three settings to get the Conexant modem to work.

    Under the generic section:
    Line: Setting Value
    352: forceV253 FALSE
    361: forceV253subset TRUE

    Under the vm program section:
    575: voice_devices ttyACM1

    (Line numbers are approximate)

    The first two settings tell vgetty that this modem uses a subset of the V253 command syntax. The last setting is the port the modem is on.

    vgetty includes a command - vm - which can perform several different actions on the voice modem. After installation and configuration we can try testing vgettys access to the modem:

    Code:
    # vm devicetest
    It should have output similar to:

    Code:
    Test Dialup Line, Int. Mic. and Int. Speaker: not supported by modem
    Test Dialup Line, Ext. Mic. and Ext. Speaker: not supported by modem
    Test Dialup Line and Local Handset: not supported by modem
    Test Dialup Line and Int. Speaker: OK
    Test Dialup Line and Ext. Speaker: OK
    Test Local Handset: not supported by modem
    Test Int. Speaker: OK
    Test Ext. Speaker: OK
    Test Int. Microphone: OK
    Test Ext. Microphone: OK
    Test Dialup Line: OK
    Test No Device: OK
    If you encounter errors, check the log file located in /var/log/vm.log

    Code:
    # tail /var/log/vm.log
    Next we need to record a message to play. This can be done with vm using a local handset. Pick up the phone and enter:

    Code:
    # vm record -vt test_message.rmd
    The -v is for verbose, the -t is to use the local phone line. Hang up when you're done and you now have a message ready to go. Messages can also be recorded with your favorite audio recorder, but there are some additional steps needed.

    Using Audacity, first record your message as a 8000Hz, 32bit float sample format, mono track. Next export it as a test_message.wav file. Now we need to convert the .wav to a .rmd (raw modem data) format. Vgetty includes tools to do this, but each modem takes a slightly different format. This can be frustrating until the correct combination is discovered. Using wavtopvf and pvftormd we will convert from .wav to .pvf (portable voice format) and finally to .rmd. The final conversion to .rmd requires modem specific options, here I present what worked for me.

    Code:
    # wavtopvf test_message.wav | pvftormd V253modem 8 > test_message.rmd
    Once you have a message in .rmd format, you can use vm to listen to it on the local handset. Pick up the phone and execute:

    Code:
    # vm play -vt test_message.rmd
    That's a lot of work to hear a scratchy recording of yourself over the phone line. So, let's get someone else to listen to it.

    Vgetty includes a shell script that will call a phone number, wait till it answers and play a message. It's called appropriately enough 'message.sh'. On OpenSuSE it can be found in /usr/share/doc/packages/mgetty/voice/scripts. Other distros will no doubt place it elsewhere. You can copy it to a more useful location if you would like. To use it, the format is: message.sh phone_number test_message.rmd. Note that phone_number can be a full number (1-807-555-1212) or a local (555-1212) number. Example:

    Code:
    # ./message.sh 5551212 /home/user/test_message.rmd
    This command can be used in a HS3 event. Use the 'Run Another Program or Process' with the main program being the message.sh script and the options being the phone number and message. Now, HS3 can call out using the POTS and tell us what's happening, even if it loses an Internet connection.

    Finally, as a bonus, the TTS system 'flite' can be use to generate .wav files that can be converted to .rmd and played by message.sh. This can be used to add dynamic content to messages - eg. date and time.

    Given a text file with your message:

    Code:
    # flite text_message.txt -o audio_message.wav
    Creates a .wav, and from before:

    Code:
    # 
    wavtopvf audio_message.wav | pvftormd V253modem 8 > tele_message.rmd
    and test it:

    Code:
    # ./message 17265551212 tele_message.rmd
    Some final notes. Vgetty is not actually running during all this. It is installed, and we are using it's tools to talk to the modem, but the vgetty program itself is not used. Vgetty can be used to answer the phone and provide answering machine and voice mail services. This setup uses none of that. If you want to use vgetty with a systemd init system, here is a service file that will allow proper start-up and shutdown:

    Code:
    # A basic .service file used by systemd to control vgetty.                                                  
    #                                                                                                           
    # Vgetty turns your voice modem into an answering machine.                                                  
    # It is part of the mgetty package. [URL]http://alpha.greenie.net/vgetty[/URL]                                         
    # This script adapted from the Fedora mailing list.                                                         
                                                                                                                
    [Unit]                                                                                                      
    Description=Voice Modem Getty (vgetty)                                                                      
    Documentation=man:vgetty(8)                                                                                 
    After=syslog.target                                                                                         
                                                                                                                
    [Service]                                                                                                   
    Type=simple                                                                                                 
    ExecStart=-/usr/sbin/vgetty /dev/ttyACM1                                                                    
    Restart=always                                                                                              
                                                                                                                
    [Install]                                                                                                   
    WantedBy=multi-user.target
    It was adapted from several source across the web (see references). Bug fixes welcome.

    And that's about it. I would be interested to hear if someone tries this on a different distro - what changes are necessary, file locations, etc. Maybe we can turn this into a proper How-To.

    Thanks for reading,
    -Alex

    References:
    Modem HW: https://www.thinkpenguin.com/gnu-lin...usb-dial-modem
    Modem configuration: http://opensourcedesignsolutions.com...eap-usb-modem/
    Hayes AT Commands: https://en.wikipedia.org/wiki/Hayes_...es_command_set
    Linux Modem How-To: http://www.tldp.org/HOWTO/Modem-HOWTO.html#toc11
    Vgetty Main Page: http://alpha.greenie.net/vgetty/
    Vgetty configuration: http://articles.yuikee.com.hk/techno...ty_config.html
    Vgetty + systemd: http://www.unix.com/suse/251405-star...y-systemd.html
    Vgetty + systemd: https://bugzilla.redhat.com/show_bug.cgi?id=721208
    Vgetty as an answering machine: http://frank.harvard.edu/~coldwell/answering_machine/
    Sending SMS via Modem: http://hristoborisov.com/index.php/p...-using-python/
    Modem calling: http://serverfault.com/questions/152.../804315#804315
    Modem calling: https://www.raspberrypi.org/forums/v...p?f=41&t=61510

    #2
    Thanks for posting Alex. I may set up a linux version of HS at a vacation home and this would be useful as a backup notification method.

    Cheers
    Al
    HS 4.2.8.0: 2134 Devices 1252 Events
    Z-Wave 3.0.10.0: 133 Nodes on one Z-Net

    Comment


      #3
      My pleasure, let me know how it goes.

      -Alex

      Comment


        #4
        Nice! I have a Way2Call that I have been itching to use on my Raspberry Pi3...
        HS4Pro on a Raspberry Pi4
        54 Z-Wave Nodes / 21 Zigbee Devices / 108 Events / 767 Devices
        Plugins: Z-Wave / Zigbee Plus / EasyTrigger / AK Weather / OMNI

        HSTouch Clients: 1 Android

        Comment


          #5
          Good luck! I don't have a Way2Call, but here are some RPi links I found during my original research - some are more relevant than others. When you get it working, let us know how you did it.

          -Alex

          https://www.raspberrypi.org/forums/
          https://www.raspberrypi.org/forums/v...p?f=41&t=61510
          https://www.raspberrypi.org/forums/v...=3357&start=10
          https://www.raspberrypi.org/forums/v...p?f=66&t=26249
          https://www.raspberrypi.org/forums/v...p?f=28&t=46294
          https://www.raspberrypi.org/forums/v...php?f=9&t=3357

          http://raspberrypi.stackexchange.com/
          http://raspberrypi.stackexchange.com...h-raspberry-pi
          http://raspberrypi.stackexchange.com...nect-to-a-pstn

          Comment

          Working...
          X