Making Alexa say something she was not going to
Amazon's integration only goes one way. This closes the gap — with the session deliberately kept outside the plugin, and a version check that admits when it does not know.
Not in the HomeSeer store yet — running here daily, and heading for the store as a beta.
Amazon's HomeSeer integration is one-directional. Alexa can control HomeSeer perfectly well. HomeSeer cannot make Alexa say anything at all — there is no published API for it and no skill that grants one.
Which is a shame, because "announce it on the speakers that are already in every room" is among the most useful things a house can do, and every one of those rooms already has a speaker in it.
The shape, and why it is that shape
HomeSeer ──HTTP──► local service ──HTTPS──► Amazon ──► your Echoes
(plugin) (Node, on this machine)
The plugin does not hold the Amazon session, and that is the whole design decision.
Establishing one requires a full browser-style login, and it refreshes itself on a timer. Neither belongs inside a HomeSeer plugin: a plugin restarts when you reconfigure it, restarts when HomeSeer restarts, and fails in ways the user can neither see nor fix.
So the session lives in a small Node service running locally. The plugin posts to it over plain HTTP and stays simple and stateless. The awkward, stateful, occasionally-needs-a-human part is isolated where it can be restarted, logged and reasoned about on its own.
Built for a second backend it does not have yet
Announcements go through an interface rather than straight to Amazon. Only the Alexa backend exists — but Google speakers over Cast are the obvious second, and are in several ways nicer: local, no account, and nothing that can expire.
Nothing above that interface is permitted to assume which backend is in use. Whether that was foresight or optimism is a question for whenever the Cast one gets written.
The version check that says "I do not know"
The service depends on libraries that reach Amazon, and Amazon changes. So the plugin shows which versions are installed and which are current — and that check is deliberately three-valued.
Installed, current, or could not ask. A null is not "you are up to date". Displaying an unchecked library as current is exactly the kind of confidently wrong answer that made one particular afternoon expensive, and the comment in the code names the date.
Reporting I could not check is less satisfying than a green tick and infinitely more honest. It is also the sort of thing that gets quietly collapsed into "assume fine" by somebody tidying up later, which is why the reason is written down beside it.
What it does
Speaks arbitrary text, plays sounds from Amazon's library, and triggers Alexa's own built-in phrases. Still beta, and still the plugin I use most.