Once upon a time you could hook your Asterisk-based PBX to your Google Voice account to make and receive calls. How you hooked it up over the years changed (annoyingly). And at the end of 2018, support for accessing Google Voice via XMPP was dropped. Remember when we trusted Google to be the “for the better good” company? Oh, how times have changed.
I did it with the help of Nerdvittles and included several screenshots here for easy reference. I also used his advice when it came to picking a new VOIP provider. After looking at a few options, I’m going with Skyetel. Not because it’s the cheapest (it’s not), but because it has an important feature for our home phone: E911.
Pro-tip: don’t port your number over to Skyetel until you’ve made your first deposit into you Skyetel account. Once you make your first actual payment, they offer a 60-day free port-in service (normally $10).
Back when I had a land line from the local telephone company, it would cost at least $20/month. I expect the Skyetel monthly charges for a local number ($1) and E911 service ($1.50), plus call time, to be less than $5/mo. It’s worth it to me if I can reliably call the house and anyone can dial 911 in an emergency.
My initial deposit of $50, doubled to $100 should last me over 2 years.
It will cost $3 to unlock – worth it to me because it’s a cool number.
Once your purchase has been confirmed you’ll be emailed a receipt.
And now your number is unlocked!
Porting your number into Skyetel
From your Skyetel dash, go to Port Orders and click Submit New Order.
The process is fairly simple, but here are some key settings:
Port Type: Local
Assign to Endpoint Group: Out of Service Message – This is so we don’t need to do any SIP configuration up-front. I’m going to cover Skyetel setup in IncrediblePBX in a future post.
Current Provider: Google Voice
Account number with the losing provider: Your 10-digit Google Voice Number.
Port Out Pin: The PIN you use to access your Google Voice voicemail.
Phone Bill: I provided a screenshot of my Google Voice settings page.
Select the first available date for porting to happen, then submit. A support ticket will be automatically generated from your port-in request and you’ll get email updates during the process until it’s complete.
Stay tuned and we’ll go over tying all of the services and equipment together for a reliable VOIP-based home phone:
WordCamp US 2020 was canceled, citing online event fatigue. But the organizers of WordCamp Minneapolis / St. Paul did not. Would we just be another notch in the bedpost of 2020 online event fatigue?
To be honest, the organizing team did contemplate canceling WordCamp Minneapolis / St. Paul as the Coronavirus pandemic continued to linger. But everyone agreed that pivoting to a single-day virtual event was a better idea – and we stayed the course.
When we had a real-life venue selected, there was an excellent computer lab available with over twenty computers. Going virtual meant re-thinking the game-plan. With WordCamp US canceled, it looks like WordCamp MSP’s KidsCamp might wind up being the only virtual KidsCamp of 2020.
Since it was uncharted territory, we cut the attendance in half, to 10 available spots. We reserved them for locals only, as our regular in-person conference is truly supposed to highlight pillars of our local community. With 80% local speakers at the conference, I think our organizers nailed it.
Swag
SWAG – Stuff We All Get. Virtual swag? 🤔 That sound silly – kids like real stuff. So we mailed the attendees some stickers and a KidsCamp Activity Book. Michelle from Marktime Media made amazing coloring books as attendee swag for WordCamp Minneapolis 2015. She repurposed that book into an evergreen KidsCamp Activity Book:
Check out the inside pages – including the first page which has a place to write down all of your new hosting and WordPress site details.
Dry-Run
To make sure things would run smoothly, I went through the entire curriculum with my 11 year old son. We did it the same day the rest of the team was doing their streaming dry-run, two days before the live event. I even had my son go to his grandma’s and log in there via Zoom so we could simulate teaching remotely.
What did I learn from that experience? While I can power through a 3-hour zoom call with no issues, kids need to take a break. When my son asked to take a break I realized that I also was hungry, thirsty, or needed to use the restroom. So I added TAKE A BREAK in all-caps to my schedule notes in various places.
The Live Event
The day of the event went off without a hitch. We had 8 registrants and only 6 showed up. A 25% no-show rate is typical for WordCamp, so I didn’t sweat it.
Safety
We talked about online safety – I cited a lot of information from NetSmartzKids – which is what the Cub Scouts Cyber-Chip merit is based on (also it’s a WordPress site 😎).
Brainstorming
We did some self-reflection and brainstorming. We talked about people we follow on YouTube and social media and what we like about them. My son cited DanTDM who plays a variety of games, not just Minecraft. When it came to self-reflection, I was pleasantly surprised that my son listed gaming as one of his interests, not just Fortnite. He wound up setting up a site with the central ideal of helping people with their gaming strategies. I likened it to Chris Lema’s mantra of Be Helpful – it warmed my heart 😍
Other kids chose different central ideas based on their interests: Animals, Music, Gaming – it was good to see a variety from the group.
WP Setup
We went with GoDaddy as our KidsCamp hosting sponsor, and they provided slick managed WordPress sites that didn’t require us to FTP any zip files to get started. This was one of the most important pieces of doing the camp virtually. We literally had zero technical issues to troubleshoot. 💪
One of the first things we did once we were into the WordPress dashboard was to reset our account password (GoDaddy generates a random one). We talked about password security and choosing something long-ish to make it hard to guess. This is my favorite reference for increasing password strength with length.
Then we were off, publishing an about page and our first post. Then customizing our themes to reflect our tastes.
Lessons Learned
Besides taking breaks, doing the event virtually was challenging because I wanted all of the kids to stay in sync. When you’re in a lab, it’s easy to see what screen someone is on and help them move forward.
My approach to doing it virtually was to share my screen and have everyone let me know when they’re on the same screen so we can all move forward together. It was challenging at times because some kids would give a thumbs-up on their camera, some would type “done” in chat, some would confirm aloud, and others wouldn’t respond. I left plenty of breathing room and we managed to stay together.
I’m glad we were able to put this event on, and I’m hoping dearly that we can do KidsCamp again in person at Metro State in 2021 🤞
Before you install Duplicati, there’s one question you need to ask:
Does this computer have multiple user logins (that you want to back-up), or is it primarily used by one user?
This is important because you can install Duplicati in one of two ways: to run as a single-user, or to run as a system service that is available to all users. By default Duplicati is installed for a single user, but if there is more than one user on the computer you want to be able to back-up, you’ll want to install it as a service.
If you don’t install it as a service, when Duplicati tries to read files that belong to the other users, it will get a permission denied error and won’t be able to back those files up. You don’t want to find out that your files weren’t backed up when it’s too late.
I’ve provided some MacOS specific configurations in that section for setting it up as a service.
RaspberryPi
Install Duplicati on a RasperryPi
To get Duplicati successfully installed on a RaspberryPi running Raspbian, you’ll likely have to also install some of the mono dependencies to avoid installation errors.
Once that’s done you can (re)install Duplicati, hopefully without errors.
MacOS
For my MacOS installation I needed to install it as a service. It’s my wife’s Macbook. I also use it for Fusion360, and I like my scroll settings different than she does. So it has two user accounts, both with files we want to back-up. Installing Duplicati as a service in this case is a must.
Both of the plist configuration files can be installed as any user as they’ll be going in a system-wide location which will run Duplicati as a system service.
Service LaunchDaemon
$ sudo vi /Library/LaunchDaemons/com.duplicati.server.plist
Once those two files are in place, the next time you reboot and log in, any and all users should have a Duplicati icon in the system tray. You can then configure a backup job to read all users’ files without issue.
Useful Duplicati Options (all platforms)
There are two settings to reduce Duplicati’s resource usage:
use-background-io-priority
thread-priority
On my brand-new 2019 XPS13 developer system Duplicati was using 280% CPU.
In other words, three of the 8 available cores were dedicated to Duplicati, plus disk I/O. I recommend setting use-background-io-priority to true and thread-priority to something below “normal” to adjust the CPU usage to an acceptable level. You can find these under “Advanced options” on the last page of the Add/Edit Configuration page of a backup.
Test
As always, test your configuration. I like to do a daily backup with “Smart backup retention” so my backup cloud disk usage doesn’t grow indeterminately.
Make sure your RaspberryPi backups are completing. It will take a while if you have a lot of data. For a 1TB backup from my RaspberryPi, it took a full week to complete because it is s-l-o-w. Once a full backup is made, the incremental updates shouldn’t take as long, but they may still take longer than a day to complete.
For phones I have a Linksys RTP300 analog telephone adapter (ATA) that I purchased at a local thrift store. It’s a discontinued product, but they’re easy to find for cheap on eBay.
Since I did this years ago, some of the instructions and firmware files are getting hard to find, but if you need instructions – let me know in the comments and I’ll try to help as best I can.
Getting into the RTP-300 admin panel
It had been at least a year since I’ve logged into the admin interface on my RTP-300. Luckily, there are some fun things you can do to help figure out how to get in. If you have a phone hooked up to it and it’s powered on, you can use the Interactive Voice Response (IVR) to get information. This article from Cisco (who purchased Linksys) has many of the available codes.
Pick up the phone and dial #### to get into the IVR menu. Then press 110# and the nice lady will read back to you the IP of your ATA.
Good info, but it wasn’t running the web interface on port 80, so I had to figure that out. The IVR option for port wasn’t working, so I did an nmap scan of all ports 1-65535 from the command line – you could use the raspberry pi or any other computer on the same network as your RTP-300:
$ nmap 172.16.0.11 -Pn Starting Nmap 7.60 ( https://nmap.org ) at 2020-04-04 18:02 CDT Nmap scan report for voip.lan (172.16.0.11) Host is up (0.0048s latency). Not shown: 999 filtered ports PORT STATE SERVICE 8080/tcp open http-proxy
There it is, port 8080. I made sure to add the address (with port) in my password manager. Then I had to use Firefox to finally connect to the ATA admin because Chrome wouldn’t complete the connection – likely because the RTP300 doesn’t have support for HTTPS. ¯_(ツ)_/¯
But we’re in! We’ll first do some configuration in Asterisk and then come back to the RTP300 configuration.
Once you’re logged in to the IncrediblePBX/Asterisk web admin, navigate to Extensions (under Applications).
There you can see there are a few extensions pre-configured for you, including 701 & 702, which will work great with the RTP-300.
Click the Edit button to the right (paper/pencil icon) to edit and view more information about that extension. You’ll need to do two things in here. First, copy the “Secret” key for each extension.
Second, for extension 702, also change the SIP port to 5061. There’s a note in there about how 5061 is sometimes used for “Line 2” on ATAs – and that’s exactly the case for the RTP-300.
RTP-300 Admin Navigation
The RTP-300 admin interface is little weird. Once you’re logged in you’ll want to navigate to the voice menu item on the far right.
Click the “Admin Login” link to switch from an informational view to one where we can actually make changes. Then click “switch to advanced view”.
Advanced view will show all of the extensions and settings.
RTP-300 Extension Configuration for IncrediblePBX
Configuring phone lines 1 & 2 is fairly simple despite the overwhelming number of settings fields on the admin. We just need to enter three values:
The IP address or domain name of our IncrediblePBX server as the SIP “Proxy” This is the SIP server the ATA is going to register this line with.
The Incredible PBX extension number as the “User ID”
The extension secret as the “Password”
Test!
Once you have these settings saved, the ATA should now register itself with Asterisk on your IncrediblePBX system. The best way to know if it worked is to pick up the receiver one of your lines – you should hear a dial tone 📞
If you’ve got a dial-tone and a phone on each port, you should be able to dial each extension with 701# or 702#. The # isn’t strictly necessary, it just instructs the ATA that you’re done dialing so it can stop waiting for further input. If you’re feeling fancy you could add a 70X entry to the dialplan on the line configuration of the ATA.
If that’s working, try one of the pre-configured Nerdvittles custom extensions. You can see them in the IncrediblePBX/Asterisk web admin by going to “Admin” and “Custom Extensions.”
Try 947# for weather by zip code ⛈️ or 951# for the latest news 📰
This write-up covers installation of IncrediblePBX 2020.3 on a RaspberryPi 3. The latest instructions are always available on NerdVittles and incrediblepbx.com, but I wanted to document my experience here for posterity. This article will cover installing X Windows for a GUI, and Samba & SSHFS for cross-platform file sharing on your home network.
Eject the SD card and put it into your Raspberry Pi and boot it up.
Initial Setup
Follow the on-screen instructions carefully. I like to connect my RaspberryPi to the network, then ssh into it and run most of the configuration commands from a terminal on my main computer because:
I can select/copy/paste any instructions from the terminal into a document for later reference.
I don’t have to stand next to the cat’s litter box (where my Pi is located in the laundry room) 🤧
Because the IncrediblePBX installation is geared specifically towards having a turn-key phone system, it lacks some of the pre-installed stuff you normally get in a vanilla Raspbian installation, but that’s why were here (and we’ll fix it).
Caveats
You’ll inevitably use raspi-config to change the settings for your Pi. For IncrediblePBX, don’t enable predictable names on network interfaces unless you know what you’re doing. Some of the IncrediblePBX scripts are looking for good ol’ eth0.
For some reason IncrediblePBX didn’t include ntp so I installed it with:
# apt install ntp ntpdate
Both of those are needed before running /root/timezone-setup (specified by the on-screen instructions).
X Windows
Before setting up your PBX-equipped Pi to run X, you should add a “regular” user as having the system automatically log into X as root is a categorically bad idea. All of my examples in this article use the username as justin, but you should replace every instance with your own name 😀
# adduser justin
Follow the prompts for adduser, then add that user to the sudo group so you can still do useful stuff as a privileged user.
# usermod –aG sudo justin
Then log out and log in as your user, and run sudo raspi-config. Under “Boot Options” and set the “Desktop / CLI” option to “Desktop GUI, automatically logged in as ‘justin’ user.” raspi-config will prompt you to install X (follow those instructions). It will also ask you to reboot after changing that setting.
X Windows “Black Screen” Issue
When I went to log into X, I saw a black screen with the pointer mouse cursor and then it would log me out and show the login manager (LightDM). 🤔
After getting some clues about the error from my ~/.xsession-errors file, I found that I needed to remove this file out of /etc/profile.d in order to be able to log in to X:
I use samba to share files read-only across the network. This is especially useful for watching videos via VLC on devices like AppleTV and Amazon FireTV. Install samba by running:
$ sudo apt install samba
The Pi3, when set to boot up and log into the UI, will automatically mount any USB-attached drives under /media/justin, so I share my media folder read-only to the network.
$ sudo vi /etc/samba/smb.conf
To the bottom of the smb.conf file add:
[media]
comment = Media
path = /media/justin
browseable = yes
guest ok = yes
read only = yes
force user = justin
force group = justin
SSHFS for Read-Write Access
For read-write access to any of the drives on the Raspberry Pi, I use SSHFS.
Linux (Ubuntu)
In Ubuntu 18.04 you can connect to a sshfs URL in Nautilus by going to “Other Locations” and typing in the location in the “Connect to Server” box in the status bar at the bottom of this screen. Everything on my home network gets a .lan DNS name care of OpenWRT, so I connect to raspberrypi.lan – you can substitute your IP address. Your URL might look something like: sshfs://yourusername@X.X.X.X/media/yourusername
MacOS
For MacOS you’ll need to install FUSE for MacOS / OSXFuse and their SSHFS extension. Unfortunately the options for connecting through a GUI aren’t supported in recent versions of MacOS.
To connect you must “mount” the remote location. Make a folder in your home directory that will serve as the mount point. I created a folder called sshfs-Media.
$ mkdir ~/sshfs-Media
It doesn’t matter what it’s named, you just need to use it for the sshfs command. You’ll see that once it’s mounted, OSXFUSE will give it a different name in the Finder.
The remote location will show up as “OSXFUSE Volume X” in the Finder under your home directory and under “Volumes.” You can”Eject” (un-mount) the remote location if you wish to disconnect.
Windows 10
For access in windows I installed sshfs-win. Once it’s installed you can map a network drive over the SSHFS protocol. Right click “This PC” and select “Map network drive…”
That will bring up a dialog where you can enter the drive letter you want it to show up as, and the path information. sshfs-win has a protocol shortcut called sshfs.r if you want to map a path that is outside of your home directory (/home/justin) on the remote system. In my case I want to mount /media/justin. Remember to use backslashes for paths in Windows!
Test
At this point you should have a RaspberryPi on your network that boots into a UI, automatically mounts external USB drives, and shares them read-only on your network. You should also be able to connect read-write using your Pi username and password for authentication from any computer.
We haven’t even touched the fully blown PBX that is already installed – we’ll get into that next! Stay tuned.