Last updated November 16, 2016: In a recent blog entry I told you how we’d been playing with Amazon Echo (Alexa) and got it working. Well, nearly. It turns out that what SEEMS obvious in the system is not all it seems – but read on as we’ve had success.
What is Alexa?
Actually the device is called an Amazon Echo – or for the cheap version and Amazon Dot. It is a box requiring power and WIFI that you can talk to and which will control things. It can automatically discover certain (and often expensive) commercial devices, it can play music, it can answer questions, set diary appointments, make shopping lists – all by voice. And with a little effort can talk to Node-Red to open up a whole new world of DIY possibilities.
Listening for specific words
For example in the Amazon setup pages, you can define variables that will only accept a certain amount of options – so for example – you might say “Alexa, tell computer to turn kitchen lights on” where “lights” could be, say, light, lights or heater.
And that’s fine – but you can’t TRUST that. the word “flights” works equally well and Amazon makes it clear in their documentation that you must do your own tests – any similar valid word in the dictionary could have been accepted (which seems utter madness to me but there you go). Indeed when we tested this – we found all sorts of irregularities – there is no way to say “accept ONLY these words”. And, if you say something that is not at all acceptable, the system will wait to time out – and that takes several seconds – which would annoy the hell out of the spouse. So – if you’re going to have to do your own checks anyway, we reasoned you may as well just try to get the basic words out of the units into Node-Red and “do your own thing”. To be clear then, the Amazon unit is no-where near perfect at word recognition and you have to consider that when designing a solution. I wonder if Google will be better.
Wemo Emulator
A slight diversion here: If ALL you want to do is turn things on and off with Alexa and Node-Red – you COULD just ignore the rest of this article and go grab node-red-contrib-wemo-emulator or read other posts here describing my modifications to FAUXMO.
No – REALLY – drop it in – give it a name – like Orange – and define topics and payloads (which might go off to, say, MQTT or may be used to trigger direct port control on a Raspberry Pi or similar) for each of the two commands ON and OFF. Tell your Alexa to go looking for devices – it will find orange – and THAT IS IT – no HTTPS, no NOTHING. It really doesn’t get any easier. But only ON and OFF which is a bit restrictive – and for heaven’s sake don’t use the word “shed”.
How about controlling your TV. Well, the Anymote Smart controller for Android will talk to Alexa and then hence control stuff by infra-red – except I can’t get it to talk to Alexa. I’ve written off to the guys at Anymote and will report back. But that takes care of all sorts of Infra-Red stuff as long as you leave your phone on! Not ideal really.
The Bigger Picture
And now – back to the bigger picture!
Before Alexa, all Aidan and I wanted was something that would listen to requests and then fire speech out so we could handle it ourselves in Node-Red – and that is exactly what we have now achieved. Some will shrink in horror at this having already done it another way – but it looks to us like a great general way forward provided you’re happy with writing your own simple, high level code to handle a sentence like “kitchen lights on” which could be as simple as a string comparison.
What we’ve done here – is to simple make Alexa collect up to 15 words (arbitrary number) after “ask computer to” – where “computer” is whatever word you want to be (the “skill”) and put them in an array, that function above, called “Alexa” does all of this and strips out words like “eh” “and”, “please” etc. – and you can add more exclusions. If you forget to actually say anything – the second output of the Alexa function handles it all for you automatically.
So in USER FUNCTION – you get an array – msg.word – with up to 15 lower case words – with the rubbish stripped out. You also get msg.combined, a simple string with everything in one string. If your requirements are simple – the latter might be the way to go.
If you merely want to have Alexa repeat the salient points of what you said so that “Alexa tell the computer to turn the lights on” – the output will be “you said: lights on”
[pcsh lang=”js” tab_size=”4″ message=”” hl_lines=”” provider=”manual”]
msg.payload = "You said. " + msg.combined;
return msg;
[/pcsh]
“Alexa tell the computer to turn the lights on”
So above, Alexa reads the words in purple and passes on the rest. The simple Node-Red Alexa function strips out the words in red – and passes on the remainder in both an array of words and a simple string.
So clearly you might want that USER function to have outputs for MQTT and EMAIL and whatever other stuff to control your kit – that, of course, is easy and up to you. If you have 2 outputs from the function (set the number of outputs at the bottom) you can write to both at once – or separately by returning an array of messages – or just one and a null etc. When you send a null – nothing goes out.
Now – I don’t want to go TOO heavily into this because simply string comparisons is probably not the way to go for any kind of sizeable setup… but here is something I’ve used as a test and it absolutely works a treat.
The code in the user function (note the extra output) is trivial to say the least.
[pcsh lang=”js” tab_size=”4″ message=”” hl_lines=”” provider=”manual”]
var msg2 = {};
switch (msg.combined)
{
case "office lights on" :
msg2.topic="mains3/toesp";
msg2.payload="{out12:1}";
node.send([null,msg2]);
msg.payload="The office lights are now active";
break;
case "office lights off" :
msg2.topic="mains3/toesp";
msg2.payload="{out12:0}";
node.send([null,msg2]);
msg.payload="The office lights are now off";
break;
case "thank you" : msg.payload="No problem, to be sure."; break;
default : msg.payload="You said: " + msg.combined;break;
}
return [msg,null];
[/pcsh]
In the example above, I have the function react to “Alexa tell the computer to turn office lights on” by sending an ON command via MQTT to one of my ESP8266 boards. Off has a similar effect, different parameter. The final command it just a bit of fun.
Really – so to get all of this fun, you have to set up your SSL (which I found incredibly painful but in retrospect it was dead easy – another of life’s hurdles out of the way) so that Amazon’s servers can talk to a secure connection (your Raspberry Pi or whatever you are using – FriendlyArm Neo or similar would be just as good running Debian), you need to update some stuff into Amazon’s site – and from there on you never touch the Amazon site again –which is of course the point really – you only have to concern yourself with your USER FUNCTION in the cosy and quick-to-alter Node-Red environment. What you do with that is up to you. In my case I’ll add another output to go to MQTT and whatever comes in is processed and maybe does something – any message in msg.payload (you HAVE to send something back) is spoken by Alexa when you’re done. It really doesn’t get a lot easier.
In a really trivial case you might, with TWO outputs, (the first should be used to return a message;
say
[pcsh lang=”js” tab_size=”4″ message=”” hl_lines=”” provider=”manual”]
if (msg.combined==”lights on”)
{
msg.payload=”Ok, light is on”; node.send([msg,null]);
msg.topic=”kitchen/toesp”; msg.payload=”{out0:1}”; node.send([null,msg]);
}
[/pcsh]
Ok, I know, create another object and send them both out at once – I’m trying to keep this simple.
But of course, in reality, you’ll be likely to do FAR more than this and hence having the separate words in an array is useful.
So – on Amazon – you need an intent!
[pcsh lang=”js” tab_size=”4″ message=”” hl_lines=”” provider=”manual”]
{
"intents": [
{
"intent":"inputIntent",
"slots":
[
{"name": "wa", "type": "LITERAL"},
{"name": "wb", "type": "LITERAL"},
{"name": "wc", "type": "LITERAL"},
{"name": "wd", "type": "LITERAL"},
{"name": "we", "type": "LITERAL"},
{"name": "wf", "type": "LITERAL"},
{"name": "wg", "type": "LITERAL"},
{"name": "wh", "type": "LITERAL"},
{"name": "wi", "type": "LITERAL"},
{"name": "wj", "type": "LITERAL"},
{"name": "wk", "type": "LITERAL"},
{"name": "wl", "type": "LITERAL"},
{"name": "wm", "type": "LITERAL"},
{"name": "wn", "type": "LITERAL"},
{"name": "wo", "type": "LITERAL"}
]
}
]
}
[/pcsh]
and a “sample utterance”
[pcsh lang=”js” tab_size=”4″ message=”” hl_lines=”” provider=”manual”]
inputIntent {LITERAL|wa} {LITERAL|wb} {LITERAL|wc} {LITERAL|wd} {LITERAL|we} {LITERAL|wf} {LITERAL|wg} {LITERAL|wh} {LITERAL|wi} {LITERAL|wj} {LITERAL|wk} {LITERAL|wl} {LITERAL|wm} {LITERAL|wn} {LITERAL|wo}
[/pcsh]
All we’re doing here is telling Amazon, for the “intent” “computer” – to collect up words and fire them off. And that’s it for the Amazon end apart from the usual details they need about you and the https address of your website (the node-red exposed point).
As for Node-Red itself – the example above:
We have an http node which has nothing more than POST and “/echo” as the URL – then our ALEXA function contains the following – it may well be far from perfect but for now it works.
[pcsh lang=”js” tab_size=”4″ message=”” hl_lines=”” provider=”manual”]
var doStuff = {payload: msg.payload.length};
switch (msg.payload.request.type)
{
case "IntentRequest":
if (msg.payload.request.intent.name === "inputIntent")
{
var word = [];
word[0] = msg.payload.request.intent.slots.wa.value;
word[1] = msg.payload.request.intent.slots.wb.value;
word[2] = msg.payload.request.intent.slots.wc.value;
word[3] = msg.payload.request.intent.slots.wd.value;
word[4] = msg.payload.request.intent.slots.we.value;
word[5] = msg.payload.request.intent.slots.wf.value;
word[6] = msg.payload.request.intent.slots.wg.value;
word[7] = msg.payload.request.intent.slots.wh.value;
word[8] = msg.payload.request.intent.slots.wi.value;
word[9] = msg.payload.request.intent.slots.wj.value;
word[10] = msg.payload.request.intent.slots.wk.value;
word[11] = msg.payload.request.intent.slots.wl.value;
word[12] = msg.payload.request.intent.slots.wm.value;
word[13] = msg.payload.request.intent.slots.wn.value;
word[14] = msg.payload.request.intent.slots.wo.value;
var thisone =0, processed = 0, total = word.length;
for (;;)
{
var nxt = "";
switch (word[thisone])
{
case "cancel" :
msg.payload = "";
return [null, msg];
break;
case undefined:
case "the":
case "to":
case "thanks":
case "thank":
case "and":
case "turn":
case "a":
case "please":
case "you":
case "er":
case "erm":
word.splice(thisone,1);
break;
default:
++thisone;
break;
}
if (++processed >= total)
break;
}
msg.topic = "";
msg.payload = "OK";
doStuff.word = word;
msg.word = word;
msg.combined="";
for (a = 0; a < word.length; a++)
{
msg.combined += word[a] + " ";
}
}
return [msg, null];
case "LaunchRequest":
msg.payload = "You need help";
return [null, msg];
case "SessionEndedRequest":
msg.payload = "Session Ended";
return [null, msg];
default:
msg.payload = "Unrecognised Intent";
return [null, msg];
}
[/pcsh]
Note I’ve added a check for the word “cancel” which simply returns nothing, immediately. This is a vital addition as sometimes you just talk gibberish and want to get out of it!
The format response function looks like this…
The other blocks don’t have anything in them – other than the user function in which you can make use of msg.combined and msg.word. When you are done be sure to send the message out – payload containing text of your choice – as Amazon does need a return value even if your text is blank.
So:
Set up an Amazon account – get PRIME if you want their music – if you’re rich get a Spotify account as the Amazon music selection is naff.
Get HTTPS so the end point of your Node-Red page (no real page exists) in my case http://whatever.com/url
That domain or subdomain needs to point to your building – and your router should redirect port 443 (ssl) traffic to port 1880 on your PI or whatever you are using. Why 443 – isn’t that a pain for routers which have SSL management and VPN – yes it is – you have to move those to another port. WHY Amazon absolutely insist on port 443 for SSL I don’t know – because any port will work but they won’t accept them – please by all means do take it up with them.
If you have passwords set up on your Node-Red and your Node-Red UI (which I do) you’ll have to pass them in the Amazon website string – and I recommend you do this as clearly you don’t want any old Tom, Dick or Harry logging into your Node-Red
Once they are set up is a matter of going to the Amazon developer site with your account – the Alexa tab, setting up s skill including letting it know about your URL – filling in the bits above – and soon thereafter your DOT or ECHO or whatever you are using should be sending text over to you – to do whatever you want with.
Clearly, this will develop – splitting text up into words like this is useless for email addresses – so “Alexa tell the computer to send an email to pete@scargill.org” is simply not going to work – and as for “Aidan” – it makes a complete mess of that
For reference – we made up some notes from our efforts to get an SSL certificate – if you have proven, better ways that cost less and don’t involve re-signing on every now and then as some freebies do – and which you know Amazon will accept as genuine – by all means give us blow by blow info. If you have a better, more complete, simpler description – please do let us know.
From our notes on setting up SSL – https – which may or may not be useful…
You need a trusted certificate to work with Alexa if you want it to talk to your Node-Red setup. Aidan has emailed the Amazon developer guys and eventually got a reply to say they had an issue with self-generated certificates, now resolved – sadly my router setup appears ot have an issue with them and so I can’t test this (the router setup in Spain simply WILL not pass through port 443 to an internal unit).
With Node-Red typically you would have separate username and password for external access – this can be re-used with https: and the https: url can bypass the username and password requirement which means you can continue to use UI (dashboard externally).
Obtain SSL from – in our case, https://www.ssls.com
So, the procedure is to pay your money and then use openssl to generate a certificate request (.csr) file.
openssl req -out my.domain.name.csr -new -newkey rsa:2048 -nodes -keyout my.domain.name.key
Enter all the details that are asked for, but when it comes to the ‘Common Name (e.g.server FQDN or YOUR name)’ bit, you must put in the domain name of your server (without the ‘www’ as you get that anyway), so enter ‘my.domain.name’ into the ‘common name’ section and you will be verified for my.domain.name and www.my.domain.name’
Before you start the above process, make sure that you can access your Pi (or whatever) externally using your domain name to avoid unnecessary delays.
When you have your .csr, then edit it and cut and paste the full certificate request into the ssls.com request box when it asks for a certificate request.
It will then generate a small text file for you to place in the www/html root of your Pi. Make sure that you can access it externally by cutting and pasting the file name into a web browser, such as http://my.domain.name/AB5678DEF.txt (or whatever the file name is). When you enter that into a browser, you should see the contents of the file appear.
When you’re happy that works, then click continue on ssls.com and it will verify your website and generate your certificate and bundle which you can then get by clicking ‘download’ to get a zip file.
Store this all safely (including the private key file that you generated with the .csr file) – i.e. make a backup!
You can use a subdomain – so that if you use www.fred.com for something else you can have https://mysub.fred.com for Alexa and Node-Red (verified – I am using a “things” subdomain without issue while my basic root www address is going elsewhere).
Using advanced DNS or similar function with your provider, point mysub.fred.com to your site. In your router, take 443 and point to the 1880 port of your node-red Pi.
We checked and you definitely can’t use anything other than port 443.
Temporarily route port 80 (website in our case) to Pi – as you’ll be asked to dump a file in the root folder for verification….. once complete this can be restored to whatever you were using it for in the first place.
Some files need to go into a folder i.e. /home/pi/ssl (our choice) and your info set up in node-red settings.js needs to know where they are…
Need to setup certificate in settings.js (https://… And uncomment ‘fs=’ …etc.
NOTE: I’ve just had to move the lot from one Pi to another – because I messed up the installation of the Pi and had no ports to play with. I can confirm – ALL that is needed is to move the certificate files (in any old directory) to the new Pi and make changes to the Node-Red settings file – uncommenting FS and adding two lines for the certificates – that’s it – all up and running – this is no-where near as complicated as I initially thought it would be.
Also, if your certificate isn’t from a root CA then you need to copy your base certificate into the certificate chain, mainly because node-red doesn’t give you any option to use a certificate bundle file. i.e. edit your .crt file, copy the contents and paste to the top of the ‘my.domain.name.ca-bundle’ file – this will add your certificate to the chain file.
Use SSL CHECKER https://www.sslchecker.com/sslchecker to check validity
Make sure that the certificate is verified all the way up to the issuing root Certificate Authority or Amazon will reject it
When all working – put your port 80 to where it was. After everything works – reboot your router to be sure.
And if I have not said it before – Amazon’s music library is SHITE!
In case you are still interested in having Alexa initiate a conversation for instance when the heating has reached the target temperature or the timer has activated – Amazon have updated the voice service API for the UK to allow skills to send notifications. Restrictions as to certificates and port 443 still apply though.
Hi Peter,
Thanks for the write-up! Very nice!
Do you have any idea how to make Alexa ask for parameters once the skill has been initiated? What I mean is, say, I ask “Alexa, switch the aircon on.” Alexa replies: “Ok. For how long do you want me to switch the aircon on?” which I can reply with “30 minutes”.
Well I hope someone else has that answer- I’ve found Alexa to be considerably more restrictive from a programming perspective than need be – I guess Amazon are only interested in the mass sale, people content to turn Philips (heavily advertised by Alexa) light bulbs etc.
Just a word about SSL:
On dietpi there is now an option to install Certbot, I did this and it is really easy to create a free SSL certificate using Letsencrypt, a CA authority, which means it is not a self signed certificate so no problems with any servers trying to access your domain..
Updating the certificate is really easy too (3 months duration).
Tested and working with node-red and Alexa. I can really recommend this method.
Garry – The Welsh SSL expert (feels that way after the time I have invested in this 🙂 )
I have LetsEncrypy on all my sites- but in Spain my service provider has reserved the SSL port for internal use!!! And Amazon won’t accept https on any other port.
Ipsec vpn towards a vps service, nginx in reverse proxy and you’re done ☺️
more details… i’ve a setup between our work firewall and a vps server in the cloud… they’re connected via a ipsec tunnel, and the exposed public ip address is the one of the vps server… then, there’s a nginx server configured in reverse proxy, so it gets the public requests for domains and redirect to lan ip on the other side of the ipsec tunnel… so you don’t need to expose any port of your local machines, you can use the same vps as target for 2 different tunnels (ES and UK) and it works flawlessly for port 80… i need to complete the ssl part, but it’s all in the docs… it’s FAST, and you have addon security given by the reverse proxy… the aruba cloud 1€ server is fine for this…
Loving the Alexa progress. I am quite new to this but have achieved the easy step, “Alexa light on” via node red and the sonoffs.
Now while the weather is still warm I wish to accomplish getting an appropriate reply to ” Alexa Tell me the heating system status “. Yes, looking for her to tell us the wood boiler temperature, etc!
I have a virtual server on the web and am considering going down that path for the https connection. Need to brush up on the MQTT bridging idea.
Love the ideas gleaned from this site.. Thank you Peter!
Hi Pete, regarding your Port 443 problem, I also experienced this and came up with this solution. I bought a cheap Linode for $5 month running Node-Red and MQTT then I bridge the MQTT ‘s from my home instance which initiates the connection, works flawlessly…..just a suggestion.
Thanks for that, Mark. Mostly now I use HA-Bridge – I do miss the ability to do customer feedback audio – I was rather hoping Amazon would have eased up on the 433 port by now.
i use aruba cloud – small server – just 1€ per month:
https://www.arubacloud.com/vps/virtual-private-server-range.aspx
just seen that trying to reach the UI with the https works properly, not with the http anymore. Maybe I’m almost in the right direction…
Hello Pete & all,
currently trying to replicate the setup, ok with the slss.com certificate check, probably missing something in node-red or Apache 2 setup, since the SSL Certificate Checker fails.
These are the settings,js for node-red now edited as follows:
“…
var fs = require(“fs”);
…
https: {
key: fs.readFileSync(‘/etc/ssl/ssl.key/my.domain.name.key’),
cert: fs.readFileSync(‘/etc/ssl/ssl.crt/my.domain.name.crt’)
},”
I had to issue the command “sudo a2enmod ssl” in order to have Apache 2 starting after having modified its settings file 000-default.conf in the /etc/apache2/sites-enabled folder as follows:
“…
SSLEngine on
SSLCertificateKeyFile /etc/ssl/ssl.key/my.domain.name.key
SSLCertificateFile /etc/ssl/ssl.crt/my.domain.name.crt
SSLCertificateChainFile /etc/ssl/ssl.crt/my.domain.name.ca-bundle”
Trying to access my.domain.name via http receives a
“Bad Request
Your browser sent a request that this server could not understand.
Reason: You’re speaking plain HTTP to an SSL-enabled server port.
Instead use the HTTPS scheme to access this URL, please.”
port 80 still forwarded to my internal raspberry IP, as the 443 to 1880 and the port 1880 to the raspberry internal IP.
Also just had a static public IP with my provider (Fastweb in Italy)
Any hints?
You can use the fairly recently opened up Alexa Smart Home Skill with node-red so you don’t have to deal with giving example utterances or parsing the commands.
As a bonus, you can use phrases like “Alexa, turn on kitchen lights” Instead of “Alexa, tell [skill] to turn on kitchen lights”
I wrote a guide and node-red flow showing how here:
https://flows.nodered.org/flow/5a4d0fd9e3332ab6ecb56bbd51ed77f8
Yes, but my point elsewhere remains – you can use HABRIDGE to do exactly that – but NEITHER of them will let you tell Amazon to fire back with “Ok, I’ve turned the heating to 16c as you requested”.
The parsing system we put together – lets you ask ANY question and get ANY reply. “How is the Pi doing?” – “The processor temperature is 40c which is ok and it is consuming 1 amp”…
NONE of the systems which do not require port 443 and a little coding can do this – the skill we put together (I’m not sure if Amazon will allow this now) which sadly has to (because of Amazon) use port 443) will do this – if I am wrong – PLEASE someone tell me… our skill DOES however need you to say “ASK THE HOUSE TO…” which is offputting — HABRIDGE however does not – you can say “Alexa, turn the heating to 16 degrees”, “Turn the lights off” – etc etc… but all you get is an utterly useless “OK” as a result. The problem with THAT is that let’s say you said “Turn the heating to 16c” – Alexa could have interpreted that as 60c and you would not know it until you were sweltering. Amazon need to EASE UP and let us have more control.
Hi All,
Is anyone else having a problem with the word “open”. If I say “Open the Family room blinds”, then 1 out of 5 times Alexa does not understand, but when I say “turn on the family room blinds” it opens the blinds 100% of the time, or if I say “close the family room blinds” it closed the blinds every time. It just seem to be a problem with “open”.
Thank you,
Mike
To add to this. I do his via HA Bridge. in HA bridge I have a device called Family room blinds. I also have another device called Kitchen blinds that I have the same problem with.
Mike
i followed this guide and now alexa is playing very nicely with my nodered. thank you!
My two-penneth having recently done this: Yes, my own self-signed uploaded certs wouldn’t work, however I tried it.
You can get a free certificate which works just fine however from https://letsencrypt.org/
Thanks for that – I’ll let you know if mine works if I can ever get past the fact that for reasons beyond me – I cannot redirect 443.
I am SO glad you mentioned that – I immediately tackled our service provider and they came back to say they already support it!!!
Google will give me browny points for making the blog SSL!
Great, happy it was useful!
Another way round the 443 thing might be to point it at a different domain, and use Apache’s redirect to bring it into your node-red install via a different port.
Good luck!
Not so easy – so – the ISP in Spain has told me – they use port 443 for remote admin and can’t change it.
In the UK I have port 443 going to Node-Red – so that’s that used up… don’t have any more places I ahve full control of the ports and redirection…
Am I missing something?
Sorry about that…Yeah I read that post as well. You would think they would have the same for US and UK but guess not.
Right – so a bit more digging
https://apkpure.com/ubi-app/com.avsintegration.android/download?from=details
This link produces the UBI link and you get the UBI app on the phone
Unfortunatel – when I asked it the time – an American voice said it is 3.45pm – it’s actually 11.46pm – clearly it is not speaking to my house or my home control…. just to Amazon itself – which is not a lot of use.
Go on – tell me what I did wrong..
Sorry, forgot to mention you have to add the “Ubi Portal Voice Prototyping Tool” skill in your Alexa app, that is where it links your amazon account I believe. Been working on getting all this stuff working together for the last several days and my mind is getting foggy LOL. Hope it works for you because it works very good for me.
And this is where my rant in another post was leading. There IS no “ubi” skill of any kind in the UK version of the Alexa app.
Here is the web address https://portal.theubi.com/login.jsp, and it has a link to the Google Play Store for the app as well on the page. I also wanted a phone app that would allow me to use my Alexa skills away from the house and Ubi does exactly that! It works the same as if you were talking directly to the Echo but remotely. I can run the app and press the listen button and say “Ask the house, what the inside temperature is” and it will reply with what ever I have set up in my node red Alexa flows.
I must be thick – I have the UBICC app, I have the account – no-where in the APP setup am I seeing anything about Amazon or Echo.
Peter have you heard of a phone app called “Ubi”? It allows you to use Alexa from your smartphone. It works great and its free. Now I can control my lights with my voice even if I’m not at home or near the Echo Dot. Give it a try.
Hi there Alan
I’m afraid you’ll need to include a link – I’ve just been to my UK-based Android Smartphone to the App store and there are a couple of “UBI”s none of which has anything to do with Alexa. There is an app called “Roger” but that turns out to be a red herring as it does not talk to your Echo but to Amazon – and hence cannot access internal skills. What I’d like is an App that can handle internal skills via possibly port redirection so I can speak to my Echo from out of the house – I suspect if one included the audio feedback from Echo the most likely solution to that is the rather unwieldy auto-answering SKYPE.
Got Alexa talking to my Pi now! Thanks Peter for great info in your blog, couldn’t have done it with out it. Ended up paying for the http://www.ssls.com cert to get it working.
Excellent news Alan – well, let’s hope Amazon get their act together and give us loads of new routines to play with for Christmas.
or maybe will be other stuff to play with for Christmas 😀
Mine are on the way!
hi
Finally got the SSL certs installed & working. Many thanks to Pete and Aiden for all there help. Next obstical….
“If you have passwords set up on your Node-Red and your Node-Red UI (which I do) you’ll have to pass them in the Amazon website string”
How do i pass the node red passwords to amazon?
Chris.
Erm hang on…. that one was my discovery… so – off to my amazon account…
Amazon – Alexa – Skills – Configuration –
https://username:password@yourdomain.whatever/echo
tried to set it up but unfortunately I can’t get anything from amazon dev –> raspi node-red. My url only works with the node-red port attached:
https://username:password@subdomain.yourdomain.whatever:1880/echo
is this the problem? how can I make the url work without the specific port?
if I set up the alexa skill linkin to that url and just use a http node that listens post /echo and a debug node after that I should get anything when I tell alexa the skill, right?
As we found out (and I think I mentioned) Amazon will not work with any other than port 443… so in my case here in the UK I simply put a redirect on the router from incoming 443 to 1880 on the Pi – works a treat…. in Spain however my router (not a cheap one) point blank refuses to redirect 443.
yea, the router was the problem. I tried with an old one and now its working – partially. When I try it in the Service Simulator it works:
{
“version”: “1.0”,
“response”: {
“outputSpeech”: {
“type”: “PlainText”,
“text”: “You said. Test”
},
“shouldEndSession”: true
},
“sessionAttributes”: {}
}
But when I ask my echo dot it says “I don’t know how I can help you with that” or “something went wrong”.
In my node red there is nothing in the debug node after the /echo http node then.
When I look in the history it understood me correctly. “ask commander test”
Any idea what the problem could be?
in case of routers that not allow 443 redirect, in general it’s because they use it themselves for their gui admin interface, but usually this admin port can be changed, leaving the 443 free to be used for other
Absolutely – and not only that but I’m fairly familiar with the Draytek 2830 router – but it is NOT letting me redirect 433. I turned off remote management altogether as I use TightVNC to get into the machine (I’ m in the UK now and it is in Spain) – but it’s not having it. If anyone with a Draytek 2830 or similar has done this I’d love to hear from them.
seen this?
https://www.draytek.com/en/faq/faq-connectivity/connectivity.nat/how-to-forward-https-traffic-(tcp-port-443)-to-an-internal-server/
http://www.tech-culture.co.uk/draytek-2830n-blocking-port-443-traffic/
Yes thanks – the two of them say the same (except one refers to self-signing and the 2830 doesn’t have that option).
But – it does not work.
So – having set up Node-Red to accept a self-signed certificate – and it is on 192.168.1.19….
If I do (internally) https://192.168.1.19:1880 – Node-Red runs after griping about the certificate being no good (because I’m using a port and not the domain name). But from outside – https://blah.com – Should work because I have moved the Draytek SSL port to another one – and because I have set the redirection to take incoming 443 to 192.168.0.19 and 1880.
Now I know you can do this because at home I had to do this with my Node-Red to use a proper certificate with Amazon Echo as their servers will ONLY talk to port 443 (all of which seems daft because you don’t HAVE to use 443 to have SSL.
So how do I know it is the Draytek? Because a redirect on port 445 works – https://daft.com:445 works and gives a nice clean green HTTPS – but send it to 443 and it won’t work… HAS to be the Draytek, surely.
contact their support… i see people talking about this bug on their routers (a previous model of yours) already 8 years ago… incredible not still fixed… http://forums.whirlpool.net.au/archive/909760
I now have an almost identical setup in the UK – Draytek 2830 on the end of a Plus-Net Plus-One crap router. And the SSL redirect works a TREAT there – so I’m left with not a CLUE as to why it isn’t working in Spain.
sometimes disabling management is not enough, you have to first change port, as above links, and then eventually disable it…
different scenario, but you see this in windows too… assign an ip to a network interface, disable it, then try to assing that same ip to an other network interface, it complains it’s in use…
The ha_bridge looks overly complicated to me – and as for using a Pi as an Alexa emulator – it simply isn’t worth it. The Pi costs £30 then you need a microphone array from somewhere – assuming such a thing exists – there’s a reason Amazon put an array of mics on there – and the hardware to do cancellation for example so you can play music and Alexa can still hear you – that’s just not going to happen on a pi with any old mic. So I would dispute strongly that you get the full functionality of the Dot… consider the cost of a Pi + nice case + decent microphone(s) + speaker – and if you need the Bluetooth that would have to be the Pi3 ASSUMING Bluetooth is supported in the emulator. I just don’t see the maths working out on that… Actually the speaker in the DOT isn’t bad – I would not want to listen to music with it – but for responses it is just fine… and of course you get the lighting array for visual feedback as to whether it is actually listening. I think the Pi would make a poor cousin. However anything that gets people writing code – has to be better than nothing – the WEMO emulator is good and saves all the faffing about with HTTPS etc… but what is really needed is support for and a node that simply returns whatever command you say after it’s name – that then opens up a whole world.
Hi,
I also found a Philips HUE emulator (ha_bridge) that works some what like the wemo emulator but it can also dim in addition to on and off. I found the following blog (https://nathan.chantrell.net/20160328/amazon-echo-alexa-skills-kit-integration-with-node-red/) that talks a little about it. In this blog he also talks about an AlexaPi emulator. Not something I would want to use as a permanent set-up but it is an option for those who want to just play around with Alexa before they buy one. It installs on a Pi and you connect a speaker and a microphone and get the full functionality of the Echo Dot.
Mike
Any idea when Alexa will be available in French?
Hi Pete,
had no time to check it but maybe you have already looked into it?
https://www.npmjs.com/package/node-red-contrib-alexa
Cheers,
andreas
Apparently – according to Aidan who tested it – he got so far and realised it had issues – got in touch with the author and put it to one side for now – in the meantime we came up with this mechanism to extract words – and of course now we have them – we want to do our own thing – it also makes our solution somewhat system independent – as anything in the future that will release the words – will do the job. It would be nice if we could figure out a way to let Alexa continue to listen after the initial release of words – to make it more reactive – not sure if there is anything we can send back in the http response to do that – somewhat vague info there..
Yes, there is something you can send back. I am not sure how it works as not gone into detail yet but search for “shouldEndSession”
There is a bit about it at the bottom of this site where they show a typical interaction.
https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/implementing-the-built-in-intents
Can this be used with a dyndns domain name or will I need to get a real domain to use this?
If I use a real domain, is it possible to update the IP address when my IP changes. My ISP generally only changes the IP if my modem has been offline for more than 24 hours. I’ve basically had the same one for a year now.
Hi
No idea re: dynamic address. A long time ago I made the decision because of various control gadgets, to pay the extra £1 a month for a fixed IP with my provider – both here and in Spain.
Saves a lot of hassle. Someone else might advise re: SSL and dyndns – do-able?
It seems to be stuck on the in progress state for well over an hour now so looks like it’s not possible. I am trying to check with the ISP to see if I can get a fixed IP and then I can use one of my free domains to connect to it.
It looks like my ISP is blocking PORT 80. I can access the system from internally using the domain name but any attempt from outside using GSM connection fails.
well, it’s absolutely normal… if you don’t ask, normal operation of a home router is “all out, none in”… you have to ask a “port forward”, or “virtual ip”, or “nat”, or whatelse, saying your isp to open port 80 towards your local raspberry ip address… in many cases you can do it yourself by going in the router admin interface… in any case, you know the risks of opening an unprotected local service to the world: someone can hack your device and escalate privileges and even going elsewhere in your home network, at that point… take care, the fact that you didn’t know that port 80 is blocked by default let me think you didn’t think all of this 🙂
Sorry, but I know more than enough about his subject. I’ve used a number of ports via port forwarding on the router over the years to get access to my old Homeseer and for commercial work. 🙂
I’ve done enough testing this afternoon to think that the ISP is blocking ports under 1500. I’ve tried various and no access. Set 1999 or 2000 for example to redirect to the RPi3 and I can see the default Apache webpage. Set 1400 and nothing. I’ve sent them an email to find out. Sadly they don’t offer any fixed IP options. This may turn out to be a futile exercise and a waste of the SSL cert. Luckily it was cheap 🙂
sorry, didn’t want to be offensive…
very strange… maybe your isp is doing some NAT (as do Fastweb in Italy, and you have to pay an additional fee to have open ports or public ip, static or not)…
No problem. 🙂
Looks like I need to try and convince the ISP to open ports 80 and 443 on my connection. I hope they have the tech know how to do this or I just wasted money on the SSL cert 🙁
Another possibility is CGN (Carrier Grade Nat), maybe your provider share your external ip with others and the traffic is nat’ed at carrier side.
I don’t think so. I can use other ports and they always work with the IP address. The issue here is that the SSL certificate site requires verification using standard HTTP on port 80 and it appears blocked. Will see if the ISP is willing to unblock this and 443 for me to get this working.
i haven’t read this comment before commenting myself the other post… yes, i think you could ask for opening those ports… never heard of such behaviour from an isp…
This is Indonesia I live in and they are not known for good customer support.
I asked and they said no. 🙁
Looks like I may have to wait until I get my Respeaker from Seeed Studio before I can do any more on this.
My alternative is to setup a redirection on another web host on the likes of GoDaddy to get this to work. If this works I’ll post this on my own blog for others who have the same issue with their ISP.
My ISP blocks 80 and 443 as well, unless you have a business account. I get around with using a url redirect from my dynamic DNS provide – I can type in http://mydomain.com in a browse r and the DNS redirect it translates it in the background to mydomain:3000 that gets through to my home machine. Not sure if this will work for SSL or not – but it’s on the list of things to try.
Please do Dave – I cannot believe an ISP (unless it’s a freeby) would put blocks on ports – I think I’d be telling them to shove it assuming there is competition. So for reference here in the UK I use Plusnet as an ISP and in Spain I use Habland. In both cases I have no restrictions (except speed of course). In both cases I pay a couple of £ extra for fixed IP addresses. For websites I run my own sites with bestwebhosting.co.uk for a few £ a month again with no real restrictions.
npm available, too: https://www.npmjs.com/package/ngrok
sorry, bad reply, it was meant for Dave post…
try ngrok…
For a free dynamic dns service you can use zonomi.com if you have a registered domain or duckdns.org if a subdomain is enough for you. Both can update your ip address from crontab by requesting a web page with your apı key using curl.
I have been using duckdns.org for a few years now and it works a charm. Yes you can use a cron job to update the IP but someone also developed the following flow in Node-red, which I use.
Mike
But presumably that is not trusted and so you’d end up having to send a file to Amazon to confirm – and that didn’t seem to work despite claims.
or we can use Nginx to do both reverse proxy and serve the php apps Peter uses in his script… we already ported them from apache to lighttpd, eventually I can help porting everything to nginx, just because it’s lighter on the SBC we use to manage all this stuff…
https://www.sitepoint.com/configuring-nginx-ssl-node-js/
Sorry – some parts have been stripped…
Here is the plain version: http://pastebin.com/LEMFNv7s
Now tested version with some modifications.
http://pastebin.com/aYdJksng
Works so far with letsencrypt cert (certbot) and basic auth.
I get my node-red gui. Change the paths in .conf file or create another proxy path to call a specific node-red sub-page like /ui.
Have to stop testing for today.
Good luck!
_andreas
Hi Andreas,
Thank you for providing this. I am going to give it a shot this week, I just have one question regarding the contents on the conf file. Does . need to be replace with my domain name?
Thank you,
Mike
that didn’t work…. I’ll try this. .
domain.tld
yes of course
Just a quick shot to set up reverse proxy with ssl and basic auth – not tested:
You will need:
sudo apt-get install -y apache2 libapache2-mod-proxy-html
Create a apache conf file f.e. /etc/apache2/sites-available/node-red_ssl.conf
—————-
ServerAdmin webmaster@.
ServerName .
DocumentRoot /var/www
Options FollowSymLinks
AllowOverride None
AuthType basic
AuthName “Secured”
AuthBasicProvider file
AuthUserFile /etc/apache2/ssl/node-users
Require valid-user
SSLCertificateFile /etc/apache2/ssl/.crt
SSLCertificateKeyFile /etc/apache2/ssl/.key
SSLCertificateChainFile /etc/apache2/ssl/.crt
RewriteEngine On
redirectmatch ^/node-red$ /node-red/
ProxyPass /node-red/ http://:1880/node-red/
ProxyPassReverse /node-red/ http://:1880/node-red/
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/node-red_ssl_access.log combined
SSLEngine on
—————————
Execute:
sudo htpasswd -c /etc/apache2/ssl/node-users
sudo a2enmod proxy proxy_http ssl rewrite
sudo a2ensite node-red_ssl.conf
sudo service apache2 reload
Hi Pete,
maybe it would be possible to use mod_proxy with an apache and letsencrypt ssl cert and certbot for automatic renew?
Proxy with basic auth to secure incoming connectins to node red, and proxy traffic from 443 to 1880? Just a quick solution i have to prove.
Hope to get my dot next days – release will be 26.10.2016 here in germany.
Best regards,
andreas
typo: https port is 443, not 433
Correct and fixed! Thank you!