Alexa Voicemonkey Skill

I wanted to create a post about the Alexa Voicemonkey Skill - https://voicemonkey.io/

In a nutshell, this skill creates a virtual doorbell button that is “pressed” by making a web request. In this scenerio, the web request is made in a webcore piston, so unless there’s some other method to do that, using webcore is necessary.

This skill can be used for two main reasons:
1- Trigger Alexa routines reliably. At the time of this writing, and for weeks now, the current Samsung Alexa skill is not reliable at triggering events on the Alexa side.
2- A hopefully temporary replacement for primarily making announcements/getting Alexa to speak in the now killed Echo Speaks, until there is a light version.

There are three main ways I’ve found the App to be used:
1- Trigger anything that can be triggered in an Alexa routine by making a simple GET request in Webcore.
2- Similar to 1, trigger a routine that makes an announcement to one or more Echo’s
3- Most complex, speak custom text, written in the GET request itself, to a single Echo. This text can be a webcore variable. Multiple GET requests can allow multiple Echo’s to speak, but they will speak in sequential order, not in unison. That can be funny or annoying depending on how you look at it.

Instructions to setup the skill are here voicemonkey.io . From there, you create “monkeys”. Each Monkey will make a separate smarthome virtual “doorbell” device, that can trigger a routine. For each Monkey created, you should get a notification shortly after in the Alexa app a new device was found. I’ll go through instructions for the three scenarios:

1- Most simple is create a routine to do any random thing with a get request. On Alexa, you will create a routine. Under “when this happens”, select “smarthome”. Then select the name of the monkey you created. It will say in the Alexa app “when monkey name is pressed”. Hit save. Then under action, select what you want to happen. Play traffic, turn another unrelated smartthings device on or off, etc.

2- For announcements, create the routine the same way, but under “action”, scroll down to “messaging” Then select “send announcement”. Type your announcement, IE “the backdoor was unlocked”. On the next screen, select “all devices”, or specify which Echo’s to announce to.

For option 1 and 2, you need to make a web request in Webcore, but leave the “notification” part of the URL off. For action, select “location”, then from the next drop down, select “make a webrequest”. You will do a webrequest, and put in a URL value. Your URL value will be - https://api-use.voicemonkey.io/trigger?access_token=YourAccessToken&secret_token=YourSecretToken&monkey=Your-Monkey-Name
Replace YourAccessToken and YourSecretToken with the values from Voicemonkey. Replace Your-Monkey-Name with the name of your Monkey. Note spaces are not used, dashes are in their place. Stop after your monkey name, you don’t need anything after.
For type of request, do “GET”. Do not select any other values under that.

Option 3 is the trickiest, but allows you to speak custom text to individual Echo’s without needing to make a routine for each thing you want the Echo to say. The limitation here is it will only make one echo “speak”. This is different from an announcement.

For this to work, create a routine in the device you want to speak that opens the Voice Monkey Skill like the screenshot below. My advice is to make a separate “speak” monkey for each different Echo you want to talk:

Then, in webcore, setup whatever trigger you want, and as action do “make a webrequest” using location. You will do a GET request like this. Replace the access token and secret token with the one generated in your own VoiceMonkey Skill (my own is blacked out of course). Also replace “announce-door” with the name of the “monkey” you created in your voice monkey skill (more info on what that means in the Voicemonkey documentation at the link above). Put whatever you want her to say in the quotes after urlEncode, including quote breaks and any variable in your piston you want her to say. The request must be coded as a URL, and Webcore’s urlEncode function will remove spaces and format it for you. Any number in that request/variable must be spelled out, and having numbers in the request will throw it off. My example tells the weather using a global variable “@forcast”. If you want this to speak on multiple echo’s, make a separate web request for each one. I also added a 2 second delay between each to make sure they all go through. The message will go off sequentially from one echo to the next, and won’t be in unison with this option.

There is an option to do notifications, which is the yellow light ring. I personally use the “notify me” skill for that, which works better. More info on the “notify me” skill here - www.notifymyecho.com

This skill is a good workaround. Be aware the developers have advised that it is free for now, but they may begin charging in the future. Hopefully using this is a temporary workaround until Echo Speaks comes out with a light version, and the Alexa skill is finally fixed to reliably work.

3 Likes

If you don’t need a variable phrase, you should be able to have it announce on multiple devices at the same time. This is an option in routines, but it is under “messaging,“ not under “Alexa says.“

  1. start by creating a routine.

!

  1. Name it, add a day filter if desired, then add the action.

  1. The action will be under “messaging.“

  1. now choose “send announcement”

Enter your text.

  1. finally, select the devices that you want to make the announcement. One option is “all devices“ but you can also just pick two or three or whatever you want.

  1. save it, and you have a routine that will make the same announcement on multiple echo devices at the same time. :sunglasses:

2 Likes

But if the action isn’t “Open Voice Monkey” then you won’t get the message you passed to the voicemonkey URL.

1 Like

Yes there’s two ways to get the Echo to talk. One is to enter the text into the URL on the Webcore side in the get request itself- my above instructions for “option 3”. That involves a routine to open the voicemonkey skill that @jlv mentioned.

@JDRoberts posted very helpful step by step pictures for “option 2” which is to get the announcement triggered on the Alexa side instead of the web request.

Advantages to option 3 through Webcore is variables from Webcore can be spoken, and you only need to make one monkey and routine per echo to trigger infinite amounts of spoken phrases. Disadvantage is separate get requests are needed for each device

Option 2 for the announcement gets multiple Echoes announcing with the ding dong tone at once, but disadvantage is no variables can be passed and separate routines are needed for each announcement.

I use both options depending on what I need the echos to say, but it can get confusing since there similar, but different.

2 Likes

Thanks for the help. Voice Monkey works great.
Used it for 3 things: announcing the wash is done, using Alexa as a siren with STHM, and to start Alexa Guard automatically when I set STHM to arm (away).

1 Like

Thank you for this. My mistake previously was not using the newly created monkey virtual button it created, instead using the actual ST sensor as a trigger. ( I’m an idiot and should have totally known that ). Thank you for explaining that.

Now my issue is I’m unsure if I need to create loads of routines and loads of monkeys for my needs.

As previously mentioned. I have 3 Arlo cameras.
‘Back door. Patio door and driveway’.

I also have 7 echo devices.
‘Bedroom, kitchen, livingroom, spareroom, office, en-suite and bathroom’

I’m unsure how to go about this sensibly.
Basically I want any individual echo To announce if there is any motion on ‘Back Door’ with ‘backdoor camera detected motion’ Any motion on ‘Patio Door‘ with ‘patio door camera detected motion’ or any motion on ‘driveway’ with ‘driveway camera detected motion’ This would only announce on an echo device if said echo device was either active or has changed in the past 2 minutes, I have this part nailed down within webcore with ‘and’ / ‘if’ statements. What I’m unsure of is how many routines and monkeys would I need? If my math is correct I’d need 21 monkeys and 21 routines in total, or is there a simpler way to do this?

Thank you.

Unfortunately there is no way of getting this information anymore with the end of Echo Speaks. Even with the new proposed “lite” version, communication regarding the status of the Echo’s will be extremely limited and likely “get last device” or “get device activity” won’t be supported, as constant queries of the Alexa cloud are needed for that information, and that is what lead to Smartthings killing the app in the first place. The Monkey is only triggered by sending the web request, and there is no communication back from the Echo device to Smartthings on whether it went through or when the device was last spoken to.

You will need other ways to trigger or not trigger your pistons to a specific Echo. Your example of whether the kitchen door was opened in the last 5 minutes is a good example. Others are based on motion sensors in rooms being active within the last X minutes, or have the announcement made in a room when the light in that room is on, but not when it’s off. There’s workarounds here, but the only way I am aware of to get last Echo activity is to run Echo speaks on Hubitat, which I only say as a total last resort before trying everything else.

If you want to select which Echo’s speak, you should only have to create 7 monkeys, one for each Echo. Then you can customize the text in each Get request to say “motion detected at back door” or “motion detected at VARIABLE LAST DEVICE”. Then create additional IF statements to only have them go off with motion in the room, light on, etc. It might be a bit complicated to setup, but should be possible.

1 Like

Tim, thanks very much for putting together this alexa voicemonkey thread. This will sufficiently replace the gap left by echo speaks. I got this working yesterday through webcore, but for some reason I’m getting an error today. I haven’t made any changes. Earlier this morning, I didn’t get an error, except I would get the generic announcement to set up voicemonkey, now I’m just getting an error.

“Error executing external web request: groovyx.net.http.HttpResponseException: Internal Server Error”

Anyone else seeing this?

I had that happen once too, early on. I disabled the Voicemonkey skill, then re-enabled it, and that got all working again. If that still doesn’t work, you can email them for help at hello@voicemonkey.io . They responded to me within a day or two.

1 Like

Thanks, that did the trick. Hopefully this will stick.

1 Like

Sorry Tim, I didnt mean to say “This would only announce on an echo device if said echo device was either active or has changed in the past 2 minutes”

What i meant was "This would only announce on an echo device if said MOTIONSENSOR ( for example, the kitchen motion sensor ) was either active or has changed in the past 2 minutes

Oh, ok, that’s a lot easier. Do you want all seven Echo’s to announce that or only some of them?

Phew.
Yes i want any echo out of my seven to announce any motion on any of my 3 arlo cameras ( but each announcement has to mention what camera it came from – backdoor, patiodoor, driveway ), BUT only if the motion sensor within that room where the echo is situated is either active or has changed in the last 2 minutes.
PS: I think thats the best way ive explained that thus far haha

You should be able to do a Piston where the camera that triggered the motion is stored as a variable, then you monkey speaks the name of that camera/variable out using the urlEncode. This way, only seven Monkey’s are needed (one per Echo). Example below - you will have to add an IF statement under the action and use “motion was detected” by the motion sensor in the room with each Echo. Piston import code is mmy5 to get this going.

That’s a little too complicated for me mate.
I may just go down the route of a pistons for every scenario. I know that’s a lot of work but I don’t understand or even know what you are suggesting unfortunately:(

Ok this is weird. Now when I try a test and have a working piston it’s now announcing ‘welcome to voicemonkey, visit voicemonkey .io to get started’

This happened to me. The integration between voicemonkey.io and Alexa is broken. Contact their support (*) at hello@voicemonkey.io to get help fixing it. You might be able to fix it just by un-linking and re-linking the Skill, but for me they had to zap my account on the backend.

(*) I think the support is just the guy who created the service, Christian.

Thanks. Doesnt look good though does it, for this to happen 2 days after installing it.
I really hope ES Lite is out soon and i wont even need this.
Completely appreciate your help though buddy.

Totally get it, it shouldn’t need to be this complicated to set this up. Samsung shouldn’t have killed off Alexa speaks the way they did, and their Alexa skill should be working properly. We shouldn’t have to use this complex workaround.

Writing separate Pistons for each action will be a little more work, but more straightforward and easier to understand/troubleshoot, so whatever works.

1 Like

Yep, I’m having issues as well. I can’t even create/update any monkeys right now. They are looking into it.