Amazon Echo SmartJ Binding Last Voice Command not working anymore

This should help you get what you need. I plan to publish my entire “temp” working rule soon on this.

var String alexa_LastVoiceCommandString = sendHttpGetRequest("http://192.168.0.32:8080/amazonechocontrol/account1/PROXY/api/activities?startTime=&size=1&offset=1")
var serialNumber_alexa_LastVoiceCommand = transform("JSONPATH","$.activities[0]sourceDeviceIds[0]serialNumber",alexa_LastVoiceCommandString)
var PreLastVoiceCommand 				= transform("JSONPATH","$.activities[0].description",alexa_LastVoiceCommandString)	
var LastVoiceCommand 					= transform("JSONPATH","$.summary",PreLastVoiceCommand)

// eliminate trigger keywords
LastVoiceCommand = (LastVoiceCommand.toLowerCase()).replaceAll('alexa ','')
LastVoiceCommand = (LastVoiceCommand.toLowerCase()).replaceAll('echo ','')
LastVoiceCommand = (LastVoiceCommand.toLowerCase()).replaceAll('amazon ','')

// logInfo("ECHO","-----------------------------------------------------------------------------")
// logInfo("ECHO","Last Voice Command Serial Number is " + serialNumber_alexa_LastVoiceCommand)
// logInfo("ECHO","Last Voice Command Description is " + PreLastVoiceCommand)
// logInfo("ECHO","Last Voice Command is " + LastVoiceCommand)
// logInfo("ECHO","-----------------------------------------------------------------------------")

Best, Jay

2 Likes

SCRIPT UPDATED as of 10.25.23

Here’s my “temp” solution until @J-N-K has time to focus on it. This is based on file configuration of OH 3.4.4. Goal was to try to keep everything the same as it was still working before and just populate fields needed.

Some caveats to this setup:

  • it runs every 2 minutes, there can only be 1 OH command issued that your looking for within in a 2 minute window for it to work.
  • this will work across many Alexa devices based on serial number identifying.
  • if your Alexa routine is saying something back for that OH command like “sure”, “ok”, etc. then the lastCommand is cleared out from the API side. Better off not saying anything back on the Alexa routine app side, do nothing.
  • if you have other rules using the Alexa items, there could be an issue with “too many attempts” with the 2 minute API query and your other rules calling Alexa items within X seconds.

Items:

Group  AlexaCmds							"Last Voice Command [%s]"

String Echo_LivingRoom_LastVoiceCommand    	"Last Voice Command [%s]"           <recorder>	(AlexaCmds)				{ channel="amazonechocontrol:echo:account1:echolivingroom:lastVoiceCommand" }
String Echo_Bathroom_LastVoiceCommand       "Last Voice Command [%s]"           <recorder>  (AlexaCmds)				{ channel="amazonechocontrol:echo:account1:echobathroom:lastVoiceCommand" }

Rules:

rule "Alexa Last Voice Command Assignment"
	when
		Time cron "0 0/1 * * * ?" 			// every 1 Minute
	then
	
		if (systemStarted.state != ON && Alexa_Status.state == 'ONLINE' && gInternet.state == ON && OH_Uptime_HumanReadable.state != NULL && OH_Uptime_HumanReadable.state !== null && OH_Uptime_HumanReadable.state != UNDEF) {
		
			if (Part1Zone1Status.state != OPEN && Part1Zone2Status.state != OPEN && Part1Zone3Status.state != OPEN) { gExtDoors.postUpdate(CLOSED) }    // using this rule for the minute run interval
	
			var String alexa_LastVoiceCommandString = sendHttpGetRequest("http://192.168.0.32:8080/amazonechocontrol/account1/PROXY/api/activities?startTime=&size=1&offset=1")
					
			if (alexa_LastVoiceCommandString !== null && alexa_LastVoiceCommandString != NULL && alexa_LastVoiceCommandString.toString() != '' && alexa_LastVoiceCommandString != UNDEF) {
	
				try {
						var serialNumber_alexa_LastVoiceCommand = transform("JSONPATH","$.activities[0]sourceDeviceIds[0]serialNumber",alexa_LastVoiceCommandString)
						var PreLastVoiceCommand 				= transform("JSONPATH","$.activities[0].description",alexa_LastVoiceCommandString)	
						var LastVoiceCommand 					= transform("JSONPATH","$.summary",PreLastVoiceCommand)	

						if (LastVoiceCommand === null || LastVoiceCommand == NULL || LastVoiceCommand.toString() == '' || LastVoiceCommand == UNDEF) { return; }
						if (serialNumber_alexa_LastVoiceCommand === null || serialNumber_alexa_LastVoiceCommand == NULL || serialNumber_alexa_LastVoiceCommand.toString() == '' || serialNumber_alexa_LastVoiceCommand == UNDEF) { return; }						
						if (serialNumber_alexa_LastVoiceCommand.toString() == "<html>Request failed<br><a href='/amazonechocontrol/account1'>Try again</a></html>") { return; }

						// Eliminate trigger keywords
						LastVoiceCommand = (LastVoiceCommand.toLowerCase()).replaceAll('alexa ','')
						LastVoiceCommand = (LastVoiceCommand.toLowerCase()).replaceAll('echo ','')
						LastVoiceCommand = (LastVoiceCommand.toLowerCase()).replaceAll('amazon ','')
						
						LastVoiceCommand = (LastVoiceCommand.toLowerCase()).replaceAll('alexa','')
						LastVoiceCommand = (LastVoiceCommand.toLowerCase()).replaceAll('echo','')
						LastVoiceCommand = (LastVoiceCommand.toLowerCase()).replaceAll('amazon','')						

						if (LastVoiceCommand === null || LastVoiceCommand == NULL || LastVoiceCommand.toString() == '' || LastVoiceCommand == UNDEF) { return; }
						
						// Alexa Routine Call Names
						if (LastVoiceCommand.toString() == 'play music from the seventies on music') { return; }
						if (LastVoiceCommand.toString() == 'Close Garage') { return; }
						if (LastVoiceCommand.toString() == 'routine good morning loft') { return; }
						if (LastVoiceCommand.toString() == 'routine good morning kitchen') { return; }
						if (LastVoiceCommand.toString() == 'Good Morning Guest Bathroom') { return; }
						if (LastVoiceCommand.toString() == 'play seventies') { return; }
						if (LastVoiceCommand.toString() == 'close blind') { return; }
						if (LastVoiceCommand.toString() == 'open blind') { return; }
						if (LastVoiceCommand.toString() == 'Good Morning Bathroom') { return; }
						if (LastVoiceCommand.toString() == 'play eighties') { return; }
						if (LastVoiceCommand.toString() == 'kill use backyard echo') { return; }
						if (LastVoiceCommand.toString() == 'Open Garage') { return; }						
						
						if (serialNumber_alexa_LastVoiceCommand.toString == Echo_PreviousSerialNumber.state.toString && LastVoiceCommand.toString == Echo_PreviousVoiceCommand.state.toString) { return; }
						
						Echo_PreviousSerialNumber.postUpdate(serialNumber_alexa_LastVoiceCommand)
						Echo_PreviousVoiceCommand.postUpdate(LastVoiceCommand)
						
						// logInfo("ECHO","API Minute Call Last Voice Command Serial Number is " + serialNumber_alexa_LastVoiceCommand)
						// logInfo("ECHO","API Minute Call Last Voice Command Description is " + PreLastVoiceCommand)
						// logInfo("ECHO","API Minute Call Last Voice Command is " + LastVoiceCommand)	

						logInfo("ECHO","-----------------------------------------------------------------------------")						
						
						switch (serialNumber_alexa_LastVoiceCommand.toString) {

							   case "G090XG0994912345": { logInfo("ECHO","Echo_FrontOffice G090XG0994912345 Used - " + LastVoiceCommand.toString)
														  Echo_FrontOffice_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString)
														  Echo_FrontOffice_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}													
							   case "G8M0XG1111012345": { logInfo("ECHO","Echo_Jay G8M0XG1111012345 Used - " + LastVoiceCommand.toString)
														  Echo_Jay_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString) 
														  Echo_Jay_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}															
							   case "G8M0XG1114212345": { logInfo("ECHO","Echo_GuestRoom G8M0XG1114212345 Used - " + LastVoiceCommand.toString)
														  Echo_GuestRoom_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString)
														  Echo_GuestRoom_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}															
							   case "G8M11W1103212345": { logInfo("ECHO","Echo_Guest G8M11W1103212345 Used - " + LastVoiceCommand.toString)
														  Echo_Guest_Bathroom_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString)
														  Echo_Guest_Bathroom_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}														
							   case "G6G0XG1223412345": { logInfo("ECHO","Echo_Gym G6G0XG1223412345 Used - " + LastVoiceCommand.toString)
														  Echo_Gym_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString) 
														  Echo_Gym_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}															
							   case "G090U50991112345": { logInfo("ECHO","Echo_Bedroom G090U50991112345 Used - " + LastVoiceCommand.toString)
														  Echo_Bedroom_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString)
														  Echo_Bedroom_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}															
							   case "G6G1AA1521812345": { logInfo("ECHO","Echo_Ryan G6G1AA1521812345 Used - " + LastVoiceCommand.toString)
														  Echo_Ryan_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString) 
														  Echo_Ryan_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}															
							   case "G6G0XG1223412345": { logInfo("ECHO","Echo_Basement G6G0XG1223412345 Used - " + LastVoiceCommand.toString)
													      Echo_Basement_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString) 
														  Echo_Basement_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}															
							   case "G090XG0692812345": { logInfo("ECHO","Echo_Bathroom G090XG0692812345 Used - " + LastVoiceCommand.toString)
														  Echo_Bathroom_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString)  
														  Echo_Bathroom_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}														
							   case "G090LF1072412345": { logInfo("ECHO","Echo_BackYard G090LF1072412345 Used - " + LastVoiceCommand.toString)
														  Echo_BackYard_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString)	
														  Echo_BackYard_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}															
							   case "G8M0XG1111012345": { logInfo("ECHO","Echo_Loft G8M0XG1111012345 Used - " + LastVoiceCommand.toString)
														  Echo_Loft_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString) 
														  Echo_Loft_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}															
							   case "G2A1A60304612345": { logInfo("ECHO","Echo_LivingRoom G2A1A60304612345 Used - " + LastVoiceCommand.toString)
														  Echo_LivingRoom_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString)
														  Echo_LivingRoom_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}														
							   case "G8M0XG1111412345": { logInfo("ECHO","Echo_Garage G8M0XG1111412345 Used - " + LastVoiceCommand.toString)
														  Echo_Garage_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString) 
														  Echo_Garage_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}															
							   case "G8M0XG1114112345": { logInfo("ECHO","Echo_Parker G8M0XG1114112345 Used - " + LastVoiceCommand.toString)
														  Echo_Parker_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString) 
														  Echo_Parker_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}															
							   case "G090LF1073412345": { logInfo("ECHO","Echo_RIS G090LF1073412345 Used - " + LastVoiceCommand.toString)
														  Echo_RIS_LastVoiceCommandProxy.postUpdate(LastVoiceCommand.toString)  
														  Echo_RIS_LastVoiceCommand.postUpdate(LastVoiceCommand.toString)
														  return;
														}				   
											   default:	{ logInfo("ECHO","NO match on CASE statement for Echo Serial Number which is " + serialNumber_alexa_LastVoiceCommand)
														  return; 
														}
						}				
						
					} catch (Exception e) {
				 
						logInfo("ECHO","Alexa Last Voice Command Assignment BLEW up. Exception is " + e.getMessage)
					}
			}	
		}	
end	

rule "Alexa Status via Voice"
	when
		Member of AlexaCmds changed
	then

		if (systemStarted.state != OFF) { return; }
		
		if (gInternet.state == ON && (triggeringItem.name == NULL  || triggeringItem.name === null  || triggeringItem.name == 'UNDEF'))  { return; }
		if (gInternet.state == ON && (triggeringItem.state == NULL || triggeringItem.state === null || triggeringItem.state == UNDEF || triggeringItem.state == ''))  { return; }

		if (gInternet.state == ON && (triggeringItem.state == 'play notifications' || triggeringItem.state == 'stop' || triggeringItem.state == 'play notification' || triggeringItem.state == 'cancel' || triggeringItem.state == 'connect' || triggeringItem.state == 'snooze' || triggeringItem.state == 'discover devices' || triggeringItem.state == 'what is the weather')) { return; }
		if (gInternet.state == ON && (triggeringItem.state == 'volume up' || triggeringItem.state == 'volume down' || triggeringItem.state == 'no' || triggeringItem.state == 'yes')) { return; }			
		if (gInternet.state == ON && (triggeringItem.state == 'Sure' || triggeringItem.state == 'Ok')) { return; }		
		
		// special line for single and double quotes values
		if (gInternet.state == ON && (triggeringItem.state == "i'm home" || triggeringItem.state == "what's the weather")) { return; }		

		if (systemStarted.state != ON && Alexa_Status.state == 'ONLINE' && gInternet.state == ON) {
		                         
			var String sourceRoom  = triggeringItem.name.split("_").get(1)
			var String TheRoom_TTS = "Echo_"+sourceRoom+"_TTS"
			var String TheRoom_DoNotDisturb = "Echo_"+sourceRoom+"_doNotDisturb"		
			
			if (triggeringItem.state == 'echo' || triggeringItem.state == 'amazon' || triggeringItem.state == 'alexa' || triggeringItem.state == 'off') { return; } 			

			// Logic Starts Here
			
			if (Home_Away.state == ON && (triggeringItem.state == 'living room off' || triggeringItem.state == 'living room lights off')) { 
			
				logInfo("ECHO","Living Room OFF in order to turn OFF Cubby quicker " + triggeringItem.name)
				Wallplug_Cubby_Light.sendCommand(OFF)
					Thread::sleep(1500)  
				Wallplug_Cubby_Light.sendCommand(OFF)
					Thread::sleep(1500)
				Wallplug_Living_Room_Light.sendCommand(OFF)
					Thread::sleep(1500)
				Wallplug_Living_Room_Light.sendCommand(OFF)				
				return;
			}
			
			if (gInternet.state == ON && Home_Away.state == ON && (triggeringItem.state == 'sonos on' || triggeringItem.state == 'sonos play' || triggeringItem.state == 'play sonos')) { 
		
				if (TheRoom_TTS == 'Echo_LivingRoom_TTS' && systemStarted.state != ON) {		
		
					logInfo("ECHO","Alexa Sonos Play in Living Room via Voice has been triggered using " + triggeringItem.name)
						Thread::sleep(500)
					
					logInfo("tAlive","CREATING Generic 199 Timer!")
					createTimer(now().plusNanos(1000), [ |

						var String SonosPlayMsg = '<speak><prosody rate="fast">I have started Sonos, for the living room, and any rooms connected to the living room queue.</prosody></speak>'
						
						// Starts Playing Sonos in the Living Room
						Sonos_LivingRoom_Favorite.sendCommand(Sonos_Today_Favorite)
							Thread::sleep(1500)
						Sonos_LivingRoom2_Favorite.sendCommand(Sonos_Today_Favorite)
							Thread::sleep(1500)
						
						Sonos_LivingRoom_Controller.sendCommand(PLAY)
							Thread::sleep(1500)
			
						Sonos_LivingRoom_CurrentAlbumCoverArtURL_Proxy.postUpdate(Sonos_LivingRoom_CurrentAlbumCoverArtURL.state)
						Sonos_LivingRoom2_CurrentAlbumCoverArtURL_Proxy.postUpdate(Sonos_LivingRoom2_CurrentAlbumCoverArtURL.state)
						
						TheRoom_TTS.sendCommand(SonosPlayMsg)	
						
						Echo_LivingRoom_LastVoiceCommand.postUpdate(nullValue)
					])
					
					return;
				}	
				
				if (TheRoom_TTS == 'Echo_Basement_TTS' && systemStarted.state != ON) {		
		
					logInfo("ECHO","Alexa Sonos Play in Basement via Voice has been triggered using " + triggeringItem.name)
						Thread::sleep(500)
					
					logInfo("tAlive","CREATING Generic 200 Timer!")
					createTimer(now().plusNanos(1000), [ |

						var String SonosPlayMsg = '<speak><prosody rate="fast">I have started Sonos, for the Basement, and any rooms connected to the Basement queue.</prosody></speak>'
						
						// Starts Playing Sonos in the Basement
						Sonos_Basement_Favorite.sendCommand(Sonos_Today_Favorite)
							Thread::sleep(1500)
						Sonos_Basement2_Favorite.sendCommand(Sonos_Today_Favorite)
							Thread::sleep(1500)
						
						Sonos_Basement_Controller.sendCommand(PLAY)
							Thread::sleep(1500)
			
						Sonos_Basement_CurrentAlbumCoverArtURL_Proxy.postUpdate(Sonos_Basement_CurrentAlbumCoverArtURL.state)
						Sonos_Basement2_CurrentAlbumCoverArtURL_Proxy.postUpdate(Sonos_Basement2_CurrentAlbumCoverArtURL.state)
						
						TheRoom_TTS.sendCommand(SonosPlayMsg)
						
						Echo_Basement_LastVoiceCommand.postUpdate(nullValue)
					])
					
					return;
				}	
			}
		}	
end

Best, Jay

4 Likes

I also have a workaround in production using the tips in the above posts. I have set it up to poll every 2 seconds, and this makes the response times as fast as it was before. I am not sure if there is a reason to increase it, the URL I am polling is local, but perhaps the binding is forwarding it outwards?

My code is public, but possibly not very deployable for others, I have my own habapp-like solution with async python code doing things like this: https://github.com/berland/pyrotun/blob/master/pyrotun/pyrotunservice.py#L64-L113

You may want to log all the API results at 2 second interval to see what they are. In the US, if I did that it would come back a lot of the times “too many requests” error.

Maybe that’s not the case where you’re at?

Best, Jay

@berland , @Jagohu : Why do you prefer to poll continuously instead of one trigger item that is switched by Alexa? Polling causes constant traffic and even with 2 seconds you get quite different delays of openhab reactions.
I don’t see any disadvantage in using a connecting item that triggers the rule.

Just to give you a heads-up: I have made progress on this issue in the last days. There was quite some refactoring to do before it was possible to add the HTTP/2 connection, but that is what I’m currently working on.

11 Likes

To me it didn’t seem like Alexa would switch anything anymore. The LastVoiceCommand was just not updated at all without the bash script polling the Echo. I must have missed something if it works for everyone else - I didn’t get it what should trigger the update of this channel if the binding doesn’t work properly.

1 Like

At the moment the binding does not work but J-N-K is about to fix it :crossed_fingers:
In the meantime you can use the workaround:

  • create an item of type switch in OH
  • add Alexa metadata of type switch
  • add expire metadata (off after 1s)
  • call “Alexa search new devices”
  • create a routine in Alexa that is triggered by your voice command and then switches the (just found) device on
  • create the rule (either in the UI with JavaScript action (see my posts) or the text-based DSL version) in OH that is triggered when the item is switched on

It’s done in 5 minutes and better than constantly polling

Is there someone here that uses at least latest OH 4.1 milestone? I have something to test available. Please contact me by private mail. Thanks.

2 Likes

I do have the same issue with the PLAYER channel, which is responding very slow…
Does anyone have the same issue here?
I am using Openhab 3.4.2 on a RPI3b+ and AmazonEchonControl binding Version 3.4.2.

Already posted the problem here, but no solution.

Can someone tell me if

			<channel id="amazonMusicTrackId" typeId="amazonMusicTrackId"/>
			<channel id="amazonMusicPlayListId" typeId="amazonMusicPlayListId"/>
			<channel id="amazonMusic" typeId="amazonMusic"/>

these channels still work? I don’t use Amazon Music, so I don’t have playlists I could try with. They have been reported to be no longer functional in the past and are marked as “for future removal”. With the big changes I have made, it would be nice to solve that, too.

Had lots of issues with this one in the past (especially for the unpaid Amazon music user), so I just started using this instead and it’s worked for the last 3 years.

Echo_Guest_Bathroom_StartRoutine.sendCommand(‘play seventies’)

Best, Jay

1 Like

I have added the channel and an item for each to test but do not see any results/info populated when I start playing a song from my playlist. However, I am not sure if I have something wrong with my setup. Up until yesterday the workaround for the lastvoice command not working is no longer working for me (it was working really well before).

When pasting this into a browser I used to get the info required (last voice):
http://192.168.1.10:8080/amazonechocontrol/Amazon/PROXY/api/activities?startTime=&size=1&offset=1

I now get:

HTTP ERROR 500 org.openhab.binding.amazonechocontrol.internal.HttpException: GET url ‘https://alexa.amazon.co.uk/api/activities?startTime=&size=1&offset=1’ failed: Not Found

At the moment I am not sure if Amazon implemented more restrictions or if there is an issue with my setup. Is this still working for anyone else?

1 Like

Same here.

http://192.168.0.32:8080/amazonechocontrol/account1/PROXY/api/activities?startTime=&size=1&offset=1

Request failed
[Try again](http://192.168.0.32:8080/amazonechocontrol/account1)

This URL still works → http://openhabian:8080/amazonechocontrol/account1

Best, Jay

They switched the URL to www.amazon.co.uk/alexa-privacy/apd/rvh/customer-history-records?startTime=, You might run into trouble with the proxy here, because it always uses the Alexa API host as target, not the retail website. Unfortunately there is no easy fix for the proxy, since we can’t detect what the correct host is.

When I checked some days ago, they redirected to the new URL with 302, so maybe they removed that re-direction now.

Same here also.
If anyone has a workaround for the workaround :grin: or any suggestion/idea, I can help to test.

Same problem here

nooooo, not again…
I don’t see any other possibility yet to retrieve via API what I have said to my echos. Really hoping someone figures this out.

FYI, providers getting cut off also with last voice commands.

We’re writing to let you know that on October 31st, 2023 the Amazon Alexa service will no longer be available on IFTTT.

Amazon has made the decision to no longer support their integration on IFTTT. Like you, many of us here on the IFTTT team use the Alexa IFTTT integration daily for things ranging from controlling lights and music in our homes to integrating with task management apps to boost productivity. We were disappointed to hear about this change, we understand it is always difficult to see an existing service removed from IFTTT.

We encourage you to update your Alexa Applets to use alternative triggers prior to October 31st. You can find more information on how to update your Applets, as well as suggested alternative triggers here.

Starting November 1st, Applets that use the Say a specific phrase trigger will be migrated to instead use the IFTTT Button Widget. Applets that use any Amazon Alexa trigger other than Say a specific phrase or any Amazon Alexa query will be archived on October 31st if they are not updated to use a different trigger and/or query prior to that date.

  • IFTTT Community team

Good evening.

Those that are on OH 4.0.x or OH 4.1.0-SNAPSHOT (latest SNAPSHOT, M2 is NOT working):

  • Uninstall the old binding
  • Go to the karaf console and verify with list -s | grep amazon that it is really not installed.
  • Change the JSON 3rd-party marketplace URL:
    – OH4.0.x: https://download.smarthomej.org/addons.json|https://download.smarthomej.org/addons-beta.json
    – OH 4.1.0-SNAPSHOT: https://download.smarthomej.org/addons-snapshot.json|https://download.smarthomej.org/addons-beta.json
  • Install “SmartHome/J Amazon Echo Control Binding (beta)”
  • Go to http://<openhab>/amazonechocontrol, select your account
  • On the account page, “Logout” (upper right corner), log in again
  • Check if the account and all your amazonechocontrol things come online

Troubleshooting:

  • If the lastVoiceCommand still does not work: use “Logout and Re-register” on the account page. Log in again
  • If that still does not help, please use “Logout and Re-register”, the the binding to TRACE logging (you can do that on the bindings info page in the add-on store), log in and send the log to me.
  • If you encounter messages at ERROR or WARN level, please set the binding to TRACE logging and sent a log with the five request before the error to me.

Send logs to my email address github@klug.nrw. Your amazon password is nowhere in the logs. If all works fine for you, please report in this thread. After there is a new release of the add-on, please uninstall the beta and with back to the release. I’ll remove the beta downloads then.

12 Likes