[amazonechocontrol] - Bugs in 5.0.3 version

I finally upgrade from Pi4 x32 OH 4.3.8 → Pi5 and OH x64 to OH 4.3.8 → Pi5 and OH x64 to OH 5.0.3 because of the Amazon Echo binding stating its working fully on the OH 5.x version.

openhab> list -s | grep amazon
300 x Active x 80 x 5.0.3 x org.openhab.binding.amazonechocontrol
openhab>

Unfortunately, this is NOT true. The only thing that got fixed making this huge upgrade was the Echo Air Quality device with the Humidity item that was failing on Amazon Echo binding 4.3.9

These are still NOT working.

  • lastvoicecommand channel is still not working (FIXED BY LOGGING IN/OUT of BINDING)
  • binding referencing a URL that doesn’t exist at startup
2025-12-06 18:04:10.190 [WARN ] [g.amazonechocontrol.internal.connection.Connection] - Failed to get notifications: https://na-api-alexa.amazon.com/api/notifications failed with code 400: Bad Request
2025-12-06 18:04:40.713 [WARN ] [g.amazonechocontrol.internal.connection.Connection] - Failed to get notifications: https://na-api-alexa.amazon.com/api/notifications failed with code 400: Bad Request
2025-12-06 18:04:58.058 [WARN ] [g.amazonechocontrol.internal.connection.Connection] - Failed to get notifications: https://na-api-alexa.amazon.com/api/notifications failed with code 400: Bad Request
2025-12-06 18:11:56.642 [WARN ] [g.amazonechocontrol.internal.connection.Connection] - Failed to get notifications: https://na-api-alexa.amazon.com/api/notifications failed with code 400: Bad Request
2025-12-06 18:12:13.895 [WARN ] [g.amazonechocontrol.internal.connection.Connection] - Failed to get notifications: https://na-api-alexa.amazon.com/api/notifications failed with code 400: Bad Request
2025-12-06 18:24:23.188 [WARN ] [g.amazonechocontrol.internal.connection.Connection] - Failed to get notifications: https://na-api-alexa.amazon.com/api/notifications failed with code 400: Bad Request
2025-12-06 18:24:40.054 [WARN ] [g.amazonechocontrol.internal.connection.Connection] - Failed to get notifications: https://na-api-alexa.amazon.com/api/notifications failed with code 400: Bad Request

Here’s the 4.3.9 posting with the GitHub bug tickets created.

Best, Jay

Well it’s working for me (and according to another thread for many others too).
Have you tried to

  • re-register your account?
  • recreate the bridge?

Are you using 5.0 or 5.1 version of the binding?

All my Echos are registered via a .thing file? Are yours?

Best, Jay

This FIXED the lastvoicecommand for version 5.0.3.

Thank you!

I can’t get playAlarmSound to work - tried it on my Echo Dot, Echo Dot v4 and Echo Show v5.
Is this a know issue or am I doing something wrong?
Here’s my log:

00:21:43.115[INFO] [openhab.event.ItemCommandEvent] - Item 'echoDot4_playAlarmSound' received command ECHO:system_alerts_melodic_01 (source: org.openhab.core.automation.module.script)
00:21:43.117[DEBUG] [org.openhab.binding.amazonechocontrol.internal.util.HttpRequestBuilder] - > DELETE: https://eu-api-alexa.amazon.com/api/notifications/___ (available: 2)
00:21:43.365[DEBUG] [org.openhab.binding.amazonechocontrol.internal.util.HttpRequestBuilder$HttpResponseListener] - < DELETE to https://eu-api-alexa.amazon.com/api/notifications/___
00:21:43.366[DEBUG] [org.openhab.binding.amazonechocontrol.internal.util.HttpRequestBuilder] - > PUT: https://eu-api-alexa.amazon.com/api/notifications/createReminder (available: 2)
00:21:43.451[DEBUG] [org.openhab.binding.amazonechocontrol.internal.handler.AccountHandler] - Processing CommandTO{command='PUSH_NOTIFICATION_CHANGE', payload='{"dopplerId":{"deviceSerialNumber":"___","deviceType":"___"},"notificationId":"___","notificationVersion":3,"eventType":"DELETE","destinationUserId":"___"}', timeStamp=1772320903344}
00:21:43.452[DEBUG] [org.openhab.binding.amazonechocontrol.internal.handler.AccountHandler] - refresh notifications amazonechocontrol:account:amazonAccount
00:21:43.452[DEBUG] [org.openhab.binding.amazonechocontrol.internal.util.HttpRequestBuilder] - > GET: https://eu-api-alexa.amazon.com/api/notifications (available: 1)
00:21:43.619[DEBUG] [org.openhab.binding.amazonechocontrol.internal.util.HttpRequestBuilder$HttpResponseListener] - < PUT to https://eu-api-alexa.amazon.com/api/notifications/createReminder: 200
00:21:43.645[DEBUG] [org.openhab.binding.amazonechocontrol.internal.util.HttpRequestBuilder$HttpResponseListener] - < GET to https://eu-api-alexa.amazon.com/api/notifications: 200
00:21:43.701[DEBUG] [org.openhab.binding.amazonechocontrol.internal.handler.AccountHandler] - Processing CommandTO{command='PUSH_NOTIFICATION_CHANGE', payload='{"dopplerId":{"deviceSerialNumber":"___","deviceType":"___"},"notificationId":"___","notificationVersion":2,"eventType":"UPDATE","destinationUserId":"___"}', timeStamp=1772320903599}
00:21:43.701[DEBUG] [org.openhab.binding.amazonechocontrol.internal.handler.AccountHandler] - refresh notifications amazonechocontrol:account:amazonAccount
00:21:43.701[DEBUG] [org.openhab.binding.amazonechocontrol.internal.util.HttpRequestBuilder] - > GET: https://eu-api-alexa.amazon.com/api/notifications (available: 2)
00:21:43.969[DEBUG] [org.openhab.binding.amazonechocontrol.internal.util.HttpRequestBuilder$HttpResponseListener] - < GET to https://eu-api-alexa.amazon.com/api/notifications: 200

None of mine work either; use to have it look at my alarm setting per echo and do specific things, code has been commented out since Nov 2025 now.

Best, Jay

@jwiseman , @mancer :
I just tried the alarm sounds and they (currently) work fine:

items.getItem('AmazonEchoBad_SpieltAlarmSound').sendCommand('ECHO:system_alerts_melodic_01');

Wasn’t talking about alarm sounds, was talking about seeing if an alarm was set on a specific echo.

Best, Jay

the channels nextAlarm and nextTimer work as expected in my setup.

The API/JSON call to get those variables don’t work anymore, sorry for the confusion.

Here’s the code that use to work from OH 2.x to 4.3.x.

rule "Guest Bedroom Echo Alarm controlling HUE bed side table light"
	when
		Time cron "45 0/3 4-7 * * ?"		// 45 secs every 3 minutes between 4 - 7 am
	then
	
		if (systemStarted.state != ON && Home_Away.state == ON && UnifiPhones.state != OFF && gInternet.state == ON && OH_Uptime_HumanReadable.state != NULL && OH_Uptime_HumanReadable.state != UNDEF) {

			if (Good_Morning_Loft_Switch.state != ON && Good_Morning_Kitchen_Switch.state != ON) {

				var EchoThing = getThingStatusInfo(zEchoAccount)
				if ((EchoThing !== null) && (EchoThing.getStatus().toString() == 'ONLINE' )) {
					
					// read Alexa notifications - alarm, reminders, timers	
					var String json	= AlexaHTTP.sendHttpGetRequest(10000) 
						Thread::sleep(3000)
						
					json = AlexaHTTP.sendHttpGetRequest(10000)			// 2nd attempt since the 1st attempt seems to fail often
						Thread::sleep(3000)	
						
					var int count = 0				
													
					if (json !== null && json != NULL && json.toString() != '') {				
					
						length = transform("JSONPATH", "$.notifications.length()", json)
						count  = Integer::parseInt(length)
					
					} else { return;}
					
					// logInfo("ECHO","Notifications found for Guest Room is " + count)
					
					if (json == NULL || json == '' || length == NULL || length == '' || count == UNDEF || count == NULL) { return; }
							 
					var Number i = 0
					var String status = 'NULL'
					var String deviceSerialNumber = 'NULL'
					var String type = 'NULL'
					var String alarmtime = 'NULL'
					var String alarmdate = 'NULL'
					var CurrentDT = now				

					// logInfo("ECHO","CurrentDT is " + CurrentDT)				
					  
					// for all notifications, identify ...
					while (i <= (count - 1)) {
					
						status = transform("JSONPATH", "$.notifications[" + i +"].status", json)

						// logInfo("ECHO","Notification status is " + status)
						
						deviceSerialNumber = transform("JSONPATH", "$.notifications[" + i + "].deviceSerialNumber", json)

						// logInfo("ECHO","Device serial number is " + deviceSerialNumber)
						
						type = transform("JSONPATH", "$.notifications[" + i + "].type", json)

						// logInfo("ECHO","Type is " + type)	

						// logInfo("ECHO","Count is " + i)
						// An ALARM that is ACTIVE and belongs to the GUEST BEDROOM echo device
					
						if (type == 'Alarm' && status == 'ON' && deviceSerialNumber == 'G8M0XG1114270RX5') {
					
							alarmtime = transform("JSONPATH", "$.notifications[" + i + "].originalTime", json)
							alarmdate = transform("JSONPATH", "$.notifications[" + i + "].originalDate", json)		
						
							// logInfo("ECHO","Guest Bedroom Alarm found is " + alarmtime + " " + alarmdate)
						
							i = count 	// only the first one is considered - exit while loop
						} 
		
						i = i + 1
					}
					
					if (alarmtime.toString() == 'NULL' || alarmdate.toString() == 'NULL') { return; }			
				
					// An active alarm has been found
				
					var setAlarmTime = ZonedDateTime.parse(alarmdate + "T" + alarmtime + "000-06:00[America/Chicago]")		// DST Day Light Savings Time have to change to 06:00 in fall and 05:00 in spring
					logInfo("ECHO","Guest Bedroom alarm time for HUE control is " + setAlarmTime)							// uncomment this one to determine what alarm time was used
				
					if (CurrentDT.isBefore(setAlarmTime) && CurrentDT.plusMinutes(20).isAfter(setAlarmTime)) {
					
						// logInfo("ECHO","Guest Bedroom Alarm is within 20 minute range.")
						if (CurrentDT.isBefore(setAlarmTime) && CurrentDT.plusMinutes(15).isAfter(setAlarmTime)) {
					
							// logInfo("ECHO","Guest Bedroom Alarm is within 15 minutes range.")
							if (CurrentDT.isBefore(setAlarmTime) && CurrentDT.plusMinutes(10).isAfter(setAlarmTime)) {
				
								GuestBedLamp_Dimmer.sendCommand(new PercentType(80))			// 80%
									Thread::sleep(1000)
								GuestBedLamp_ColorTemp.sendCommand(new PercentType(100))		// Full White
									Thread::sleep(1000)
								
								if (GuestBedLamp_Switch.state != ON) { GuestBedLamp_Switch.sendCommand(ON) }	
					
							} else {

								GuestBedLamp_Dimmer.sendCommand(new PercentType(50))			// 50%
									Thread::sleep(1000)
								GuestBedLamp_ColorTemp.sendCommand(new PercentType(100))		// Full White
									Thread::sleep(1000)
								
								if (GuestBedLamp_Switch.state != ON) { GuestBedLamp_Switch.sendCommand(ON) }
							}

						} else {

							GuestBedLamp_Dimmer.sendCommand(new PercentType(30))				// 30%
								Thread::sleep(1000)
							GuestBedLamp_ColorTemp.sendCommand(new PercentType(100))			// Full White
								Thread::sleep(1000)
							
							if (GuestBedLamp_Switch.state != ON) { GuestBedLamp_Switch.sendCommand(ON) }										
						}
					} 
				}
			}	
	    }
end

Best, Jay

why so complicated when you get the dates of alarms, timers etc. directly from the channels of the echo things?

It was written back in OH 2.x time frame, it worked the entire time from OH 2.x - 3.x

I guess I’ll have to re-work it based on item values in OH now vs. API

Best, Jay