NEWS
Test Adapter Garmin
-
@tombox Noch mal installiert und dann den Sicherheitscode bei MFA eingegeben;
garmin.0 2026-01-10 23:21:50.960 error Login failed garmin.0 2026-01-10 23:21:50.960 error OAuth2 token exchange failed garmin.0 2026-01-10 23:21:50.960 error OAuth2 request failed: 401 Request failed with status code 401 garmin.0 2026-01-10 23:21:50.816 debug Exchanging for OAuth2 token... garmin.0 2026-01-10 23:21:50.816 debug OAuth1 Token: OK garmin.0 2026-01-10 23:21:50.816 debug "oauth_token=a2d59379-a1e3-4a5d-b801-254e7610610b&oauth_token_secret=juIPzbGaeio0ria5HHiPlM32sNoo3nJm24Y&mfa_token=MFA-2253-sttzCWaUmDSjtXuOvAdfM7p2ffg02vkzthvegRfHllybqR66ES-cas&mfa_expiration_timestamp=2027-01-10 22:21:49.000" garmin.0 2026-01-10 23:21:50.816 debug OAuth1 Status: 200 garmin.0 2026-01-10 23:21:50.224 debug {"consumer_key":"fc3e99d2-118c-44b8-8ae3-03370dde24c0","consumer_secret":"E08WAR897WEy2knn7aFBrvegVAf0AFdWBBF"} garmin.0 2026-01-10 23:21:50.223 debug Fetched OAuth consumer from S3 garmin.0 2026-01-10 23:21:49.659 debug Getting OAuth1 token... garmin.0 2026-01-10 23:21:49.659 info MFA verification successful garmin.0 2026-01-10 23:21:49.655 debug MFA Response title: Success garmin.0 2026-01-10 23:21:49.655 debug "<!DOCTYPE html>\n<html class=\"no-js\">\n\t<head>\n\t\t<title>Success</title>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge;\" />\n\t\t<meta name=\"description\" content=\"\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\t\t<meta http-equiv=\"cleartype\" content=\"on\">\n\t\t<script type=\"text/javascript\" src=\"/sso/js/jquery/3.7.1/jquery.min.js?20210319\"></script>\n\t\t<script type=\"text/javascript\">jQuery.noConflict();</script>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/json2.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/consoleUtils.js?20210319\"></script>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/postmessage.js?20210319\"></script>\n\t\t<script type=\"text/javascript\">\n\t\t\tvar redirectAfterAccountLoginUrl \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\tvar redirectAfterAccountCreationUrl = \"\";\n\t\t\tvar consumeServiceTicket \t = \"true\";\n\t\t\tvar service_url \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\tvar parent_url \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\tvar response_url \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed?ticket=ST-243938-bluwhpefsfVehSkICaMj-cas\";\n\t\t\tvar logintoken \t = \"xTCEa3i5tL\";\n\t\t\tvar socialLogin \t = \"\";\n\t\t\tvar performMFACheck = \"\";\n\n\t\t\t// Decode url if it's encoded unnecessarily (which is happening when SSO GAuth logins redisplay the login page due to session timeouts.)\n\t\t\tif (response_url.indexOf('%3A%2F%2F') != -1) {\n\t\t\t\tresponse_url = decodeURIComponent(response_url);\n\t\t\t}\n\t\t\tresponse_url = response_url.replace(new RegExp(\"&\", 'g'),\"&\");\n\n\t\t\tvar service_ticket = response_url.substring(response_url.indexOf('ticket=') + 7, response_url.length);\n\n\t\t\tif (redirectAfterAccountLoginUrl) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: redirectAfterAccountLoginUrl: [' + redirectAfterAccountLoginUrl + ']');\n\t\t\t}\n\t\t\tconsoleInfo('casEmbedSuccess.html: consumeServiceTicket: [' + consumeServiceTicket + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: service_url: [' + service_url + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: parent_url: [' + parent_url + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: response_url: [' + response_url + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: service_ticket: [' + service_ticket + ']');\n\t\t\tif (logintoken) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: logintoken: [' + logintoken + ']');\n\t\t\t}\n\t\t\tif (socialLogin) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: socialLogin: [' + socialLogin + ']');\n\t\t\t}\n\n\t\t\tfunction send(msg) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: send(): Calling XD.postMessage(msg:[' + JSON.stringify(msg) + '], target_url:[' + parent_url + '])...');\n\t\t\t\tXD.postMessage(msg, parent_url, parent);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfunction redirect(target){\n\t\t\t\tvar embedWidget = \"true\";\n\t\t\t\tif (embedWidget != 'true') {\n\t\t\t\t\tif (logintoken || socialLogin) {\n\t\t\t\t\t\t// Tell parent to close opened Gauth lite box.\n\t\t\t\t\t\tsend({'closeLiteBox':'1'});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Tell parent to resize Gauth widget's height to just that of the loading icon.\n\t\t\t\t\t\tsend({'gauthHeight':jQuery(\"#GAuth-component\").height()});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (window.opener != null && window.opener.parent && window.opener.parent.frameElement) {\n\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: frameElement detected: [' + window.opener.parent.frameElement + ']');\n\t\t\t\t\tvar iframeParent = window.opener.parent;\n\t\t\t\t\tiframeParent.location.href = target;\n\t\t\t\t\twindow.close();\n\t\t\t\t} else {\n\t\t\t\t\t// If the \"redirectAfterAccountLoginUrl\" GAuth config parameter was specified,\n\t\t\t\t\t// a full page refresh upon logon was requested, so redirect the parent window upon login.\n\t\t\t\t\tif (redirectAfterAccountLoginUrl || redirectAfterAccountCreationUrl || (socialLogin && socialLogin === 'true') || (performMFACheck && performMFACheck === 'true')) {\n\n\t\t\t\t\t\tif (embedWidget != 'true') {\n\t\t\t\t\t\t\tsend({'status':'SUCCESS', 'successDetails':'Login Successful'});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Redirect parent of login iframe to requested service URL with ?ST=<Service Ticket ID> appended,\n\t\t\t\t\t\t// so the webapp can validate the service ticket and log the user on to the webapp.\n\t\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: Calling parent.location.href = [' + response_url + '];...');\n\t\t\t\t\t\ttop.location.href = response_url;\n\n\t\t\t\t\t// Else if GAuth was configured not to consume the service ticket, send the service ticket and service url.\n\t\t\t\t\t// It's then up to the parent page to hide the GAuth widget and validate the service ticket.\n\t\t\t\t\t} else if (consumeServiceTicket == 'false') {\n\n\t\t\t\t\t\tsend({'status':'SUCCESS', 'successDetails':'Login Successful', 'serviceTicket':service_ticket, 'serviceUrl':service_url});\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Else consume the service ticket and log the user into the parent webapp, by making a JSONP request to the response url.\n\t\t\t\t\t\t// This service ticket request to the parent webapp will return a small amount of JSON that we\n\t\t\t\t\t\t// can send in the success event to the parent page to notify them of successful logon\n\t\t\t\t\t\t// It's then up to the parent page to hide the GAuth widget and do whatever it wants.\n\t\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: Loading ajax jsonp URL: [' + response_url + ']');\n\t\t\t\t\t\tjQuery.ajax({\n\t\t\t\t\t\t\ttype: \"REDIRECT\",\n\t\t\t\t\t\t\turl: response_url,\n\t\t\t\t\t\t\tdataType: 'jsonp',\n\t\t\t\t\t\t\terror: function(xhr, status, error) {\n\t\t\t\t\t\t\t\tconsoleError('casEmbedSuccess.html: Error loading ajax jsonp URL: [' + response_url + ']! Error: ' + error);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsuccess: function( data, status, xhr ) {\n\t\t\t\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: success loading ajax jsonp url. data: [' + data + ']');\n\t\t\t\t\t\t\t\tvar userdata = data;\n\t\t\t\t\t\t\t\tif (typeof(userdata) === 'string') {\n\t\t\t\t\t\t\t\t\tuserdata = JSON.parse(data);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconsoleInfo('casGenericRedirect.jsp: customerId: [' + userdata.customerId\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], username: [' + userdata.username\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], rememberMe: [' + userdata.rememberMe\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], password: [' + userdata.password\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], email: [' + userdata.email\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], displayName: [' + userdata.displayName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], firstName: [' + userdata.firstName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], lastName: [' + userdata.lastName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], localePreference: [' + userdata.localePreference\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], addressLine1: [' + userdata.addressLine1\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], addressLine2: [' + userdata.addressLine2\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], cityName: [' + userdata.cityName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], state: [' + userdata.state\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], postalCode: [' + userdata.postalCode\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], country: [' + userdata.country\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], passwordChangeRequired: [' + userdata.passwordChangeRequired\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], lastLogin: [' + userdata.lastLogin\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], erpCustomerNumber: [' + userdata.erpCustomerNumber\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ ']');\n\t\t\t\t\t\t\t\tsend({'status' : 'SUCCESS',\n\t\t\t\t\t\t\t\t\t\t\t'successDetails' : 'Login Successful',\n\t\t\t\t\t\t\t\t\t\t\t'customerId' : userdata.customerId,\n\t\t\t\t\t\t\t\t\t\t\t'username' : userdata.username,\n\t\t\t\t\t\t\t\t\t\t\t'rememberMe' : userdata.rememberMe,\n\t\t\t\t\t\t\t\t\t\t\t'password' : userdata.password,\n\t\t\t\t\t\t\t\t\t\t\t'email' : userdata.email,\n\t\t\t\t\t\t\t\t\t\t\t'displayName' : userdata.displayName,\n\t\t\t\t\t\t\t\t\t\t\t'firstName' : userdata.firstName,\n\t\t\t\t\t\t\t\t\t\t\t'lastName' : userdata.lastName,\n\t\t\t\t\t\t\t\t\t\t\t'localePreference' : userdata.localePreference,\n\t\t\t\t\t\t\t\t\t\t\t'addressLine1' : userdata.addressLine1,\n\t\t\t\t\t\t\t\t\t\t\t'addressLine2' : userdata.addressLine2,\n\t\t\t\t\t\t\t\t\t\t\t'cityName' : userdata.cityName,\n\t\t\t\t\t\t\t\t\t\t\t'state' : userdata.state,\n\t\t\t\t\t\t\t\t\t\t\t'postalCode' : userdata.postalCode,\n\t\t\t\t\t\t\t\t\t\t\t'country' : userdata.country,\n\t\t\t\t\t\t\t\t\t\t\t'passwordChangeRequired' : userdata.passwordChangeRequired,\n\t\t\t\t\t\t\t\t\t\t\t'lastLogin' : userdata.lastLogin,\n\t\t\t\t\t\t\t\t\t\t\t'erpCustomerNumber' : userdata.erpCustomerNumber\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t</script>\n\t</head>\n\t<body>\n\t\t<div id=\"GAuth-component\">\n\t\t\t<img src='/sso/images/ajax-loader.gif' class=\"loaderImage\"/>\n\t\t</div>\n\t\t<script type=\"text/javascript\">\n\t\t\tjQuery(document).ready(function(){\n\t\t\t\tvar service = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\t\tconsoleInfo(\"casEmbedSuccess.html: ready, calling redirect('\" + service + \"')...\");\n\t\t\t\tredirect(service);\n\t\t\t});\n\t\t</script>\n\t<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML=\"window.__CF$cv$params={r:'9bbf91cbe912124d',t:'MTc2ODA4MzcwOS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);\";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>\n</html>\n" garmin.0 2026-01-10 23:21:49.655 debug MFA resume response: 200 garmin.0 2026-01-10 23:21:48.036 info Resuming MFA session... garmin.0 2026-01-10 23:21:47.992 info Starting SSO login... garmin.0 2026-01-10 23:21:47.992 info No token found, performing login... garmin.0 2026-01-10 23:21:47.854 info starting. Version 0.2.1 (non-npm: TA2k/ioBroker.garmin#dc6358fd578bc1f8b4c500c02d32a06366a491f6) in /opt/iobroker/node_modules/iobroker.garmin, node: v22.21.0, js-controller: 7.0.7 garmin.0 2026-01-10 23:21:45.532 debug States connected to redis: 127.0.0.1:9000 garmin.0 2026-01-10 23:21:45.411 debug States create User PubSub Client garmin.0 2026-01-10 23:21:45.410 debug States create System PubSub Client garmin.0 2026-01-10 23:21:45.368 debug Redis States: Use Redis connection: 127.0.0.1:9000 garmin.0 2026-01-10 23:21:45.286 debug Objects connected to redis: 127.0.0.1:9001 garmin.0 2026-01-10 23:21:45.285 debug Objects client initialize lua scripts garmin.0 2026-01-10 23:21:45.091 debug Objects create User PubSub Client garmin.0 2026-01-10 23:21:45.091 debug Objects create System PubSub Client garmin.0 2026-01-10 23:21:45.090 debug Objects client ready ... initialize now garmin.0 2026-01-10 23:21:45.028 debug Redis Objects: Use Redis connection: 127.0.0.1:9001 garmin.0 2026-01-10 23:21:41.160 info terminating garmin.0 2026-01-10 23:21:40.660 info Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason garmin.0 2026-01-10 23:21:40.660 info terminating garmin.0 2026-01-10 23:21:40.659 info Got terminate signal TERMINATE_YOURSELF -
@tombox Noch mal installiert und dann den Sicherheitscode bei MFA eingegeben;
garmin.0 2026-01-10 23:21:50.960 error Login failed garmin.0 2026-01-10 23:21:50.960 error OAuth2 token exchange failed garmin.0 2026-01-10 23:21:50.960 error OAuth2 request failed: 401 Request failed with status code 401 garmin.0 2026-01-10 23:21:50.816 debug Exchanging for OAuth2 token... garmin.0 2026-01-10 23:21:50.816 debug OAuth1 Token: OK garmin.0 2026-01-10 23:21:50.816 debug "oauth_token=a2d59379-a1e3-4a5d-b801-254e7610610b&oauth_token_secret=juIPzbGaeio0ria5HHiPlM32sNoo3nJm24Y&mfa_token=MFA-2253-sttzCWaUmDSjtXuOvAdfM7p2ffg02vkzthvegRfHllybqR66ES-cas&mfa_expiration_timestamp=2027-01-10 22:21:49.000" garmin.0 2026-01-10 23:21:50.816 debug OAuth1 Status: 200 garmin.0 2026-01-10 23:21:50.224 debug {"consumer_key":"fc3e99d2-118c-44b8-8ae3-03370dde24c0","consumer_secret":"E08WAR897WEy2knn7aFBrvegVAf0AFdWBBF"} garmin.0 2026-01-10 23:21:50.223 debug Fetched OAuth consumer from S3 garmin.0 2026-01-10 23:21:49.659 debug Getting OAuth1 token... garmin.0 2026-01-10 23:21:49.659 info MFA verification successful garmin.0 2026-01-10 23:21:49.655 debug MFA Response title: Success garmin.0 2026-01-10 23:21:49.655 debug "<!DOCTYPE html>\n<html class=\"no-js\">\n\t<head>\n\t\t<title>Success</title>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge;\" />\n\t\t<meta name=\"description\" content=\"\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\t\t<meta http-equiv=\"cleartype\" content=\"on\">\n\t\t<script type=\"text/javascript\" src=\"/sso/js/jquery/3.7.1/jquery.min.js?20210319\"></script>\n\t\t<script type=\"text/javascript\">jQuery.noConflict();</script>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/json2.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/consoleUtils.js?20210319\"></script>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/postmessage.js?20210319\"></script>\n\t\t<script type=\"text/javascript\">\n\t\t\tvar redirectAfterAccountLoginUrl \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\tvar redirectAfterAccountCreationUrl = \"\";\n\t\t\tvar consumeServiceTicket \t = \"true\";\n\t\t\tvar service_url \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\tvar parent_url \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\tvar response_url \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed?ticket=ST-243938-bluwhpefsfVehSkICaMj-cas\";\n\t\t\tvar logintoken \t = \"xTCEa3i5tL\";\n\t\t\tvar socialLogin \t = \"\";\n\t\t\tvar performMFACheck = \"\";\n\n\t\t\t// Decode url if it's encoded unnecessarily (which is happening when SSO GAuth logins redisplay the login page due to session timeouts.)\n\t\t\tif (response_url.indexOf('%3A%2F%2F') != -1) {\n\t\t\t\tresponse_url = decodeURIComponent(response_url);\n\t\t\t}\n\t\t\tresponse_url = response_url.replace(new RegExp(\"&\", 'g'),\"&\");\n\n\t\t\tvar service_ticket = response_url.substring(response_url.indexOf('ticket=') + 7, response_url.length);\n\n\t\t\tif (redirectAfterAccountLoginUrl) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: redirectAfterAccountLoginUrl: [' + redirectAfterAccountLoginUrl + ']');\n\t\t\t}\n\t\t\tconsoleInfo('casEmbedSuccess.html: consumeServiceTicket: [' + consumeServiceTicket + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: service_url: [' + service_url + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: parent_url: [' + parent_url + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: response_url: [' + response_url + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: service_ticket: [' + service_ticket + ']');\n\t\t\tif (logintoken) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: logintoken: [' + logintoken + ']');\n\t\t\t}\n\t\t\tif (socialLogin) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: socialLogin: [' + socialLogin + ']');\n\t\t\t}\n\n\t\t\tfunction send(msg) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: send(): Calling XD.postMessage(msg:[' + JSON.stringify(msg) + '], target_url:[' + parent_url + '])...');\n\t\t\t\tXD.postMessage(msg, parent_url, parent);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfunction redirect(target){\n\t\t\t\tvar embedWidget = \"true\";\n\t\t\t\tif (embedWidget != 'true') {\n\t\t\t\t\tif (logintoken || socialLogin) {\n\t\t\t\t\t\t// Tell parent to close opened Gauth lite box.\n\t\t\t\t\t\tsend({'closeLiteBox':'1'});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Tell parent to resize Gauth widget's height to just that of the loading icon.\n\t\t\t\t\t\tsend({'gauthHeight':jQuery(\"#GAuth-component\").height()});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (window.opener != null && window.opener.parent && window.opener.parent.frameElement) {\n\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: frameElement detected: [' + window.opener.parent.frameElement + ']');\n\t\t\t\t\tvar iframeParent = window.opener.parent;\n\t\t\t\t\tiframeParent.location.href = target;\n\t\t\t\t\twindow.close();\n\t\t\t\t} else {\n\t\t\t\t\t// If the \"redirectAfterAccountLoginUrl\" GAuth config parameter was specified,\n\t\t\t\t\t// a full page refresh upon logon was requested, so redirect the parent window upon login.\n\t\t\t\t\tif (redirectAfterAccountLoginUrl || redirectAfterAccountCreationUrl || (socialLogin && socialLogin === 'true') || (performMFACheck && performMFACheck === 'true')) {\n\n\t\t\t\t\t\tif (embedWidget != 'true') {\n\t\t\t\t\t\t\tsend({'status':'SUCCESS', 'successDetails':'Login Successful'});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Redirect parent of login iframe to requested service URL with ?ST=<Service Ticket ID> appended,\n\t\t\t\t\t\t// so the webapp can validate the service ticket and log the user on to the webapp.\n\t\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: Calling parent.location.href = [' + response_url + '];...');\n\t\t\t\t\t\ttop.location.href = response_url;\n\n\t\t\t\t\t// Else if GAuth was configured not to consume the service ticket, send the service ticket and service url.\n\t\t\t\t\t// It's then up to the parent page to hide the GAuth widget and validate the service ticket.\n\t\t\t\t\t} else if (consumeServiceTicket == 'false') {\n\n\t\t\t\t\t\tsend({'status':'SUCCESS', 'successDetails':'Login Successful', 'serviceTicket':service_ticket, 'serviceUrl':service_url});\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Else consume the service ticket and log the user into the parent webapp, by making a JSONP request to the response url.\n\t\t\t\t\t\t// This service ticket request to the parent webapp will return a small amount of JSON that we\n\t\t\t\t\t\t// can send in the success event to the parent page to notify them of successful logon\n\t\t\t\t\t\t// It's then up to the parent page to hide the GAuth widget and do whatever it wants.\n\t\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: Loading ajax jsonp URL: [' + response_url + ']');\n\t\t\t\t\t\tjQuery.ajax({\n\t\t\t\t\t\t\ttype: \"REDIRECT\",\n\t\t\t\t\t\t\turl: response_url,\n\t\t\t\t\t\t\tdataType: 'jsonp',\n\t\t\t\t\t\t\terror: function(xhr, status, error) {\n\t\t\t\t\t\t\t\tconsoleError('casEmbedSuccess.html: Error loading ajax jsonp URL: [' + response_url + ']! Error: ' + error);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsuccess: function( data, status, xhr ) {\n\t\t\t\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: success loading ajax jsonp url. data: [' + data + ']');\n\t\t\t\t\t\t\t\tvar userdata = data;\n\t\t\t\t\t\t\t\tif (typeof(userdata) === 'string') {\n\t\t\t\t\t\t\t\t\tuserdata = JSON.parse(data);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconsoleInfo('casGenericRedirect.jsp: customerId: [' + userdata.customerId\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], username: [' + userdata.username\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], rememberMe: [' + userdata.rememberMe\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], password: [' + userdata.password\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], email: [' + userdata.email\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], displayName: [' + userdata.displayName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], firstName: [' + userdata.firstName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], lastName: [' + userdata.lastName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], localePreference: [' + userdata.localePreference\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], addressLine1: [' + userdata.addressLine1\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], addressLine2: [' + userdata.addressLine2\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], cityName: [' + userdata.cityName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], state: [' + userdata.state\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], postalCode: [' + userdata.postalCode\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], country: [' + userdata.country\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], passwordChangeRequired: [' + userdata.passwordChangeRequired\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], lastLogin: [' + userdata.lastLogin\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], erpCustomerNumber: [' + userdata.erpCustomerNumber\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ ']');\n\t\t\t\t\t\t\t\tsend({'status' : 'SUCCESS',\n\t\t\t\t\t\t\t\t\t\t\t'successDetails' : 'Login Successful',\n\t\t\t\t\t\t\t\t\t\t\t'customerId' : userdata.customerId,\n\t\t\t\t\t\t\t\t\t\t\t'username' : userdata.username,\n\t\t\t\t\t\t\t\t\t\t\t'rememberMe' : userdata.rememberMe,\n\t\t\t\t\t\t\t\t\t\t\t'password' : userdata.password,\n\t\t\t\t\t\t\t\t\t\t\t'email' : userdata.email,\n\t\t\t\t\t\t\t\t\t\t\t'displayName' : userdata.displayName,\n\t\t\t\t\t\t\t\t\t\t\t'firstName' : userdata.firstName,\n\t\t\t\t\t\t\t\t\t\t\t'lastName' : userdata.lastName,\n\t\t\t\t\t\t\t\t\t\t\t'localePreference' : userdata.localePreference,\n\t\t\t\t\t\t\t\t\t\t\t'addressLine1' : userdata.addressLine1,\n\t\t\t\t\t\t\t\t\t\t\t'addressLine2' : userdata.addressLine2,\n\t\t\t\t\t\t\t\t\t\t\t'cityName' : userdata.cityName,\n\t\t\t\t\t\t\t\t\t\t\t'state' : userdata.state,\n\t\t\t\t\t\t\t\t\t\t\t'postalCode' : userdata.postalCode,\n\t\t\t\t\t\t\t\t\t\t\t'country' : userdata.country,\n\t\t\t\t\t\t\t\t\t\t\t'passwordChangeRequired' : userdata.passwordChangeRequired,\n\t\t\t\t\t\t\t\t\t\t\t'lastLogin' : userdata.lastLogin,\n\t\t\t\t\t\t\t\t\t\t\t'erpCustomerNumber' : userdata.erpCustomerNumber\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t</script>\n\t</head>\n\t<body>\n\t\t<div id=\"GAuth-component\">\n\t\t\t<img src='/sso/images/ajax-loader.gif' class=\"loaderImage\"/>\n\t\t</div>\n\t\t<script type=\"text/javascript\">\n\t\t\tjQuery(document).ready(function(){\n\t\t\t\tvar service = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\t\tconsoleInfo(\"casEmbedSuccess.html: ready, calling redirect('\" + service + \"')...\");\n\t\t\t\tredirect(service);\n\t\t\t});\n\t\t</script>\n\t<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML=\"window.__CF$cv$params={r:'9bbf91cbe912124d',t:'MTc2ODA4MzcwOS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);\";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>\n</html>\n" garmin.0 2026-01-10 23:21:49.655 debug MFA resume response: 200 garmin.0 2026-01-10 23:21:48.036 info Resuming MFA session... garmin.0 2026-01-10 23:21:47.992 info Starting SSO login... garmin.0 2026-01-10 23:21:47.992 info No token found, performing login... garmin.0 2026-01-10 23:21:47.854 info starting. Version 0.2.1 (non-npm: TA2k/ioBroker.garmin#dc6358fd578bc1f8b4c500c02d32a06366a491f6) in /opt/iobroker/node_modules/iobroker.garmin, node: v22.21.0, js-controller: 7.0.7 garmin.0 2026-01-10 23:21:45.532 debug States connected to redis: 127.0.0.1:9000 garmin.0 2026-01-10 23:21:45.411 debug States create User PubSub Client garmin.0 2026-01-10 23:21:45.410 debug States create System PubSub Client garmin.0 2026-01-10 23:21:45.368 debug Redis States: Use Redis connection: 127.0.0.1:9000 garmin.0 2026-01-10 23:21:45.286 debug Objects connected to redis: 127.0.0.1:9001 garmin.0 2026-01-10 23:21:45.285 debug Objects client initialize lua scripts garmin.0 2026-01-10 23:21:45.091 debug Objects create User PubSub Client garmin.0 2026-01-10 23:21:45.091 debug Objects create System PubSub Client garmin.0 2026-01-10 23:21:45.090 debug Objects client ready ... initialize now garmin.0 2026-01-10 23:21:45.028 debug Redis Objects: Use Redis connection: 127.0.0.1:9001 garmin.0 2026-01-10 23:21:41.160 info terminating garmin.0 2026-01-10 23:21:40.660 info Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason garmin.0 2026-01-10 23:21:40.660 info terminating garmin.0 2026-01-10 23:21:40.659 info Got terminate signal TERMINATE_YOURSELF -
@tombox Leider gleiches verhalten.
garmin.0 2026-01-11 20:07:28.217 error Login failed garmin.0 2026-01-11 20:07:28.215 error OAuth2 token exchange failed garmin.0 2026-01-11 20:07:28.215 error OAuth2 request failed: 401 Request failed with status code 401 garmin.0 2026-01-11 20:07:28.056 debug body: mfa_token=MFA-2666-d2lkc3YaB0wvxWh73SLfVqHgPvXiHHMzowVD1qKeQquelRZcBZ-cas garmin.0 2026-01-11 20:07:28.056 debug authHeader: {"Authorization":"OAuth oauth_consumer_key=\"fc3e99d2-118c-44b8-8ae3-03370dde24c0\", oauth_nonce=\"20WzdBPvvPp3CTYj0cjVSSrR4sMrQvLN\", oauth_signature=\"qAXGOYB%2F0oL5uSQjiOZQ0rouClA%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1768158448\", oauth_token=\"a2d59379-a1e3-4a5d-b801-254e7610610b\", oauth_version=\"1.0\""} garmin.0 2026-01-11 20:07:28.056 debug oauth1Token: {"oauth_token":"a2d59379-a1e3-4a5d-b801-254e7610610b","oauth_token_secret":"juIPzbGaeio0ria5HHiPlM32sNoo3nJm24Y","mfa_token":"MFA-2666-d2lkc3YaB0wvxWh73SLfVqHgPvXiHHMzowVD1qKeQquelRZcBZ-cas"} garmin.0 2026-01-11 20:07:28.056 debug Exchanging for OAuth2 token... garmin.0 2026-01-11 20:07:28.055 debug OAuth1 Token: OK garmin.0 2026-01-11 20:07:28.055 debug "oauth_token=a2d59379-a1e3-4a5d-b801-254e7610610b&oauth_token_secret=juIPzbGaeio0ria5HHiPlM32sNoo3nJm24Y&mfa_token=MFA-2666-d2lkc3YaB0wvxWh73SLfVqHgPvXiHHMzowVD1qKeQquelRZcBZ-cas&mfa_expiration_timestamp=2027-01-11 19:07:26.000" garmin.0 2026-01-11 20:07:28.055 debug OAuth1 Status: 200 garmin.0 2026-01-11 20:07:27.355 debug {"consumer_key":"fc3e99d2-118c-44b8-8ae3-03370dde24c0","consumer_secret":"E08WAR897WEy2knn7aFBrvegVAf0AFdWBBF"} garmin.0 2026-01-11 20:07:27.355 debug Fetched OAuth consumer from S3 garmin.0 2026-01-11 20:07:26.837 debug Getting OAuth1 token... garmin.0 2026-01-11 20:07:26.837 debug Ticket: ST-251421-CywKdEdqNVV2IDHe6gO7-cas garmin.0 2026-01-11 20:07:26.837 info MFA verification successful garmin.0 2026-01-11 20:07:26.833 debug MFA Response title: Success -
@bommel_030 was wäre denn ein einfacher filter bräuchte eine Beschreibung damit ki das einbauen kann
@tombox sagte in Test Adapter Garmin:
@bommel_030 was wäre denn ein einfacher filter bräuchte eine Beschreibung damit ki das einbauen kann
Also wenn ich ehrlich bin, am einfachsten wäre es, wenn man die interessanten Datenpunkte auswählen/eingeben könnte.
Von den gut 20k Datenpunkten die der Adapter liefert sind für mich ca. 25 interessant.
Es gibt zwar einige Ordner die man auf ne Blacklist setzen könnte, aber die Datenpunkte sind so quer über die Ordner verteilt, da würde noch ne Menge "Müll" verbleiben. -
@tombox sagte in Test Adapter Garmin:
@bommel_030 was wäre denn ein einfacher filter bräuchte eine Beschreibung damit ki das einbauen kann
Also wenn ich ehrlich bin, am einfachsten wäre es, wenn man die interessanten Datenpunkte auswählen/eingeben könnte.
Von den gut 20k Datenpunkten die der Adapter liefert sind für mich ca. 25 interessant.
Es gibt zwar einige Ordner die man auf ne Blacklist setzen könnte, aber die Datenpunkte sind so quer über die Ordner verteilt, da würde noch ne Menge "Müll" verbleiben.@bommel_030 ki hat was eingebaut einfach mal probieren
-
@tombox Leider gleiches verhalten.
garmin.0 2026-01-11 20:07:28.217 error Login failed garmin.0 2026-01-11 20:07:28.215 error OAuth2 token exchange failed garmin.0 2026-01-11 20:07:28.215 error OAuth2 request failed: 401 Request failed with status code 401 garmin.0 2026-01-11 20:07:28.056 debug body: mfa_token=MFA-2666-d2lkc3YaB0wvxWh73SLfVqHgPvXiHHMzowVD1qKeQquelRZcBZ-cas garmin.0 2026-01-11 20:07:28.056 debug authHeader: {"Authorization":"OAuth oauth_consumer_key=\"fc3e99d2-118c-44b8-8ae3-03370dde24c0\", oauth_nonce=\"20WzdBPvvPp3CTYj0cjVSSrR4sMrQvLN\", oauth_signature=\"qAXGOYB%2F0oL5uSQjiOZQ0rouClA%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1768158448\", oauth_token=\"a2d59379-a1e3-4a5d-b801-254e7610610b\", oauth_version=\"1.0\""} garmin.0 2026-01-11 20:07:28.056 debug oauth1Token: {"oauth_token":"a2d59379-a1e3-4a5d-b801-254e7610610b","oauth_token_secret":"juIPzbGaeio0ria5HHiPlM32sNoo3nJm24Y","mfa_token":"MFA-2666-d2lkc3YaB0wvxWh73SLfVqHgPvXiHHMzowVD1qKeQquelRZcBZ-cas"} garmin.0 2026-01-11 20:07:28.056 debug Exchanging for OAuth2 token... garmin.0 2026-01-11 20:07:28.055 debug OAuth1 Token: OK garmin.0 2026-01-11 20:07:28.055 debug "oauth_token=a2d59379-a1e3-4a5d-b801-254e7610610b&oauth_token_secret=juIPzbGaeio0ria5HHiPlM32sNoo3nJm24Y&mfa_token=MFA-2666-d2lkc3YaB0wvxWh73SLfVqHgPvXiHHMzowVD1qKeQquelRZcBZ-cas&mfa_expiration_timestamp=2027-01-11 19:07:26.000" garmin.0 2026-01-11 20:07:28.055 debug OAuth1 Status: 200 garmin.0 2026-01-11 20:07:27.355 debug {"consumer_key":"fc3e99d2-118c-44b8-8ae3-03370dde24c0","consumer_secret":"E08WAR897WEy2knn7aFBrvegVAf0AFdWBBF"} garmin.0 2026-01-11 20:07:27.355 debug Fetched OAuth consumer from S3 garmin.0 2026-01-11 20:07:26.837 debug Getting OAuth1 token... garmin.0 2026-01-11 20:07:26.837 debug Ticket: ST-251421-CywKdEdqNVV2IDHe6gO7-cas garmin.0 2026-01-11 20:07:26.837 info MFA verification successful garmin.0 2026-01-11 20:07:26.833 debug MFA Response title: Success -
@bommel_030 ki hat was eingebaut einfach mal probieren
@tombox
Danke, aber so ganz rund läuft es noch nicht. Ich habe die Instanz gestoppt, alle Datenpunkte gelöscht und 22 Datenpunkte in der Instanz eingetragen. Die Datenpunkte werden auch weiter abgerufen und aktualisiert.
Zusätzlich werden aber noch zig weitere abgerufen und ich kann nicht nachvollziehen warum.
Nach meinem Verständnis sollten nur noch die 22 eingetragenen auftauchen. Nach dem Löschen und Neustart des Adapter bin ich nicht wie erwartet von 20.000 auf 22 Datenpunkte runter, sondern "nur" auf 8.000 Datenpunkte.
Im Ordner "hydration" tauchen z.B. nur die angegebenen Datenpunkte auf. Im Ordner "weight" werden noch weitere, nicht eingetragene angelegt. Alles was im Screenshot den Link zum Alias hat ist auch in der Instanz eingetragen. Alle anderen sollten nicht auftauchen.

-
@Clown007 ja du kannst nochmal alles unter Objekt bei auth löschen und den mfa code und dann warten bis ein neuer kommt
@tombox Habe ich gemacht, Code kam sofort von Garmin, eingetragen, .... leider keine Veränderung. Adapter kann sich nicht verbinden, aber ich habe keine Einträge (trotz debug) unter Protokolle?
2026-01-12 14:05:46.727 - info: garmin.0 (393639) No token found, performing login... 2026-01-12 14:05:46.727 - info: garmin.0 (393639) Starting SSO login... 2026-01-12 14:05:46.770 - debug: garmin.0 (393639) Setting SSO cookies... 2026-01-12 14:05:47.424 - debug: garmin.0 (393639) SSO cookies response: 200 2026-01-12 14:05:47.424 - debug: garmin.0 (393639) "<html>\n\t<head>\n\t <title>GAuth Embedded Version</title>\n\t <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge;\" />\n\t <style type=\"text/css\">\n\t \t#gauth-widget {border: none !important;}\n\t </style>\n\t</head>\n\t<body>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/jquery/3.7.1/jquery.min.js?20210319\"></script>\n\n<div>\n\t<pre>\n\t<span>ERROR: clientId parameter must be specified!!!</span>\n\n\t<span >Usage: https://sso.garmin.com/sso/embed?clientId=<clientId>&locale=<locale>...</span>\n\n\tRequest parameter configuration options:\n\n\tNAME REQ VALUES DESCRIPTION\n\t------------------ --- ------------------------------------------------------- ---------------------------------------------------------------------------------------------------\n\tclientId Yes \"MY_GARMIN\"/\"BUY_GARMIN\"/\"FLY_GARMIN\"/ Client identifier for your web application\n\t \"RMA\"/\"GarminConnect\"/\"OpenCaching\"/etc\n\tlocale Yes \"en\", \"bg\", \"cs\", \"da\", \"de\", \"es\", \"el\", \"fr\", \"hr\", User's current locale, to display the GAuth login widget internationalized properly.\n\t \"in\", \"it\", \"iw\", \"hu\", \"ms\", \"nb\", \"nl\", \"no\", \"pl\", (All the currently supported locales are listed in the Values section.)\n\t \"pt\", \"pt_BR\", \"ru\", \"sk\", \"sl\", \"fi\", \"sv\", \"tr\",\n\t \"uk\", \"th\", \"ja\", \"ko\", \"zh_TW\", \"zh\", \"vi_VN\"\n\tcssUrl No Absolute URL to custom CSS file. Use custom CSS styling for the GAuth login widget.\n\treauth No true/false (Default value is false) Specify true if you want to ensure that the GAuth login widget shows up,\n\t even if the SSO infrastructure remembers the user and would immediately log them in.\n\t This is useful if you know a user is logged on, but want a different user to be allowed to logon.\n\tinitialFocus No true/false (Default value is true) If you don't want the GAuth login widget to autofocus in it's \"Email or Username\" field upon initial loading,\n\t then specify this option and set it to false.\n\trememberMeShown No true/false (Default value is false) Whether the \"Remember Me\" check box is shown in the GAuth login widget.\n\trememberMeChecked No true/false (Default value is false) Whether the \"Remember Me\" check box feature is checked by default.\n\tcreateAccountShown No true/false (Default value is true) Whether the \"Don't have an account? Create One\" link is shown in the GAuth login widget.\n\tsocialEnabled No true/false (Default value is false) If set to false, do not show any social sign in elements or allow social sign ins.\n\tlockToEmailAddress No Email address to pre-load and lock. If specified, the specified email address will be pre-loaded in the main \"Email\" field in the SSO login form,\n\t as well as in in the \"Email Address\" field in the \"Forgot Password?\" password reset form,\n\t and both fields will be disabled so they can't be changed.\n\t (If for some reason you want to force re-authentications for a known customer account, you can make use of this option.)\n\topenCreateAccount No true/false (Default value is false) If set to true, immediately display the the account creation screen.\n\tdisplayNameShown No true/false (Default value is false) If set to true, show the \"Display Name\" field on the account creation screen, to allow the user\n\t to set their central MyGarmin display name upon account creation.\n\tglobalOptInShown No true/false (Default value is false) Whether the \"Global Opt-In\" check box is shown on the create account & create social account screens.\n\t If set to true these screens will show a \"Sign Up For Email\" check box with accompanying text\n\t \"I would also like to receive email about promotions and new products.\"\n\t If checked, the Customer 2.0 account that is created will have it's global opt-in flag set to true,\n\t and Garmin email communications will be allowed.\n\tglobalOptInChecked No true/false (Default value is false) Whether the \"Global Opt-In\" check box is checked by default.\n\tconsumeServiceTicket No true/false (Default value is true) IF you don't specify a redirectAfterAccountLoginUrl AND you set this to false, the GAuth login widget\n\t will NOT consume the service ticket assigned and will not seamlessly log you into your webapp.\n\t It will send a SUCCESS JavaScript event with the service ticket and service url you can take\n\t and explicitly validate against the SSO infrastructure yourself.\n\t (By using casClient's SingleSignOnUtils.authenticateServiceTicket() utility method,\n\t or calling web service customerWebServices_v1.2 AccountManagementService.authenticateServiceTicket().)\n\tmobile No true/false (Default value is false) Setting to true will cause mobile friendly views to be shown instead of the tradition screens.\n\ttermsOfUseUrl No Absolute URL to your custom terms of use URL. If not specified, defaults to http://www.garmin.com/terms\n\tprivacyStatementUrl No Absolute URL to your custom privacy statement URL. If not specified, defaults to http://www.garmin.com/privacy\n\tproductSupportUrl No Absolute URL to your custom product support URL. If not specified, defaults to http://www.garmin.com/us/support/contact\n\tgenerateExtraServiceTicket No true/false (Default value is false) If set to true, generate an extra unconsumed service ticket.\n\t\t (The service ticket validation response will include the extra service ticket.)\n\tgenerateTwoExtraServiceTickets No true/false (Default value is false) If set to true, generate two extra unconsumed service tickets.\n\t\t\t\t\t\t\t\t\t \t\t\t (The service ticket validation response will include the extra service tickets.)\n\tgenerateNoServiceTicket No true/false (Default value is false) If you don't want SSO to generate a service ticket at all when logging in to the GAuth login widget.\n (Useful when allowing logins to static sites that are not SSO enabled and can't consume the service ticket.)\n\tconnectLegalTerms No true/false (Default value is false) Whether to show the connectLegalTerms on the create account page\n\tshowTermsOfUse No true/false (Default value is false) Whether to show the showTermsOfUse on the create account page\n\tshowPrivacyPolicy No true/false (Default value is false) Whether to show the showPrivacyPolicy on the create account page\n\tshowConnectLegalAge No true/false (Default value is false) Whether to show the showConnectLegalAge on the create account page\n\tlocationPromptShown No true/false (Default value is false) If set to true, ask the customer during account creation to verify their country of residence.\n\tshowPassword No true/false (Default value is true) If set to false, mobile version for createAccount and login screens would hide the password\n\tuseCustomHeader No true/false (Default value is false) If set to true, the \"Sign in\" text will be replaced by custom text. Contact CDS team to set the i18n text for your client id.\n\tmfaRequired No true/false (Default value is false) Require multi factor authentication for all authenticating users.\n\tperformMFACheck No true/false (Default value is false) If set to true, ask the logged in user to pass a multi factor authentication check. (Only valid for an already logged in user.)\n\trememberMyBrowserShown No true/false (Default value is false) Whether the \"Remember My Browser\" check box is shown in the GAuth login widget MFA verification screen.\n\trememberMyBrowserChecked No true/false (Default value is false) Whether the \"Remember My Browser\" check box feature is checked by default.\n\tconsentTypeIds\t\t\t\t\tNo\tconsent_types ids\t\t \t\t\t\t\t\t\t\t multiple consent types ids can be passed as consentTypeIds=type1&consentTypeIds=type2\n\t</pre>\n</div>\n\n\n\t<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML=\"window.__CF$cv$params={r:'9bccde0befe8d933',t:'MTc2ODIyMzE0Ny4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);\";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>\n</html>\n" 2026-01-12 14:05:47.425 - debug: garmin.0 (393639) Getting CSRF token... 2026-01-12 14:05:47.795 - debug: garmin.0 (393639) CSRF response: 200 2026-01-12 14:05:47.795 - debug: garmin.0 (393639) "<!DOCTYPE html>\n<html lang=\"en\" class=\"no-js\">\n <head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width\" />\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge;\" />\n <title>GARMIN Authentication Application</title>\n <link href=\"/sso/css/GAuth.css?20210406\" rel=\"stylesheet\" type=\"text/css\" media=\"all\" />\n\n\t <link rel=\"stylesheet\" href=\"\"/>\n\n <script type=\"text/javascript\" src=\"/sso/js/jquery/3.7.1/jquery.min.js?20210319\"></script>\n <script type=\"text/javascript\">jQuery.noConflict();</script>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/jquery-validate/1.16.0/jquery.validate.min.js?20210319\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/jsUtils.js?20210406\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/json2.js\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/consoleUtils.js?20210319\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/postmessage.js?20210319\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/popupWindow.js\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/base.js?20231020\"></script>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/gigyaUtils.js?20210319\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/login.js?20211102\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/reCaptchaUtil.js?20230706\"></script>\n\n <script>\n var recaptchaSiteKey = null;\n var reCaptchaURL = \"\\\\\\/sso\\\\\\/reCaptcha?id=gauth-widget\\u0026embedWidget=true\\u0026gauthHost=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed\\u0026service=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed\\u0026source=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed\\u0026redirectAfterAccountLoginUrl=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed\\u0026redirectAfterAccountCreationUrl=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed\";\n var isRecaptchaEnabled = null;\n var recaptchaToken = null; \n </script>\n <script type=\"text/javascript\">\n var parent_url = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n var status \t\t\t= \"\";\n\t\t\tvar result = \"\";\n\t\t\tvar clientId\t\t= '';\n\t\t\tvar embedWidget \t= true;\n\t\t\tvar isUsernameDefined = (false == true) || (false == true);\n\n // Gigya callback to SocialSignInController for brand new social network users redirects to this page\n // to popup Create or Link Social Account page, but has a possibly mangled source parameter\n // where \"?\" is set as \"<QM>\", so translate it back to \"?\" here.\n parent_url = parent_url.replace('<QM>', '?');\n var parent_scheme = parent_url.substring(0, parent_url.indexOf(\"://\"));\n var parent_hostname = parent_url.substring(parent_scheme.length + 3, parent_url.length);\n if (parent_hostname.indexOf(\"/\") != -1) {\n parent_hostname = parent_hostname.substring(0, parent_hostname.indexOf(\"/\"));\n }\n var parentHost \t = parent_scheme + \"://\" + parent_hostname;\n\t\t\tvar createAccountConfigURL = '\\/sso\\/createNewAccount?id%3Dgauth-widget%26embedWidget%3Dtrue%26gauthHost%3Dhttps%3A%252F%252Fsso.garmin.com%252Fsso%252Fembed%26service%3Dhttps%3A%252F%252Fsso.garmin.com%252Fsso%252Fembed%26source%3Dhttps%3A%252F%252Fsso.garmin.com%252Fsso%252Fembed%26redirectAfterAccountLoginUrl%3Dhttps%3A%252F%252Fsso.garmin.com%252Fsso%252Fembed%26redirectAfterAccountCreationUrl%3Dhttps%3A%252F%252Fsso.garmin.com%252Fsso%252Fembed';\n var socialConfigURL = 'https://sso.garmin.com/sso/socialSignIn?id%3Dgauth-widget%26embedWidget%3Dtrue%26gauthHost%3Dhttps%3A%2F%2Fsso.garmin.com%2Fsso%2Fembed%26service%3Dhttps%3A%2F%2Fsso.garmin.com%2Fsso%2Fembed%26source%3Dhttps%3A%2F%2Fsso.garmin.com%2Fsso%2Fembed%26redirectAfterAccountLoginUrl%3Dhttps%3A%2F%2Fsso.garmin.com%2Fsso%2Fembed%26redirectAfterAccountCreationUrl%3Dhttps%3A%2F%2Fsso.garmin.com%2Fsso%2Fembed';\n var gigyaURL = \"https://cdns.gigya.com/js/gigya.js?apiKey=2_R3ZGY8Bqlwwk3_63knoD9wA_m-Y19mAgW61bF_s5k9gymYnMEAtMrJiF5MjF-U7B\";\n\n if (createAccountConfigURL.indexOf('%253A%252F%252F') != -1) {\n \tcreateAccountConfigURL = decodeURIComponent(createAccountConfigURL);\n }\n consoleInfo('signin.html embedWidget: true, createAccountConfigURL: \\/sso\\/createNewAccount?id%3Dgauth-widget%26embedWidget%3Dtrue%26gauthHost%3Dhttps%3A%252F%252Fsso.garmin.com%252Fsso%252Fembed%26service%3Dhttps%3A%252F%252Fsso.garmin.com%252Fsso%252Fembed%26source%3Dhttps%3A%252F%252Fsso.garmin.com%252Fsso%252Fembed%26redirectAfterAccountLoginUrl%3Dhttps%3A%252F%252Fsso.garmin.com%252Fsso%252Fembed%26redirectAfterAccountCreationUrl%3Dhttps%3A%252F%252Fsso.garmin.com%252Fsso%252Fembed, socialEnabled: true, gigyaSupported: true, socialConfigURL(): https://sso.garmin.com/sso/socialSignIn?id%3Dgauth-widget%26embedWidget%3Dtrue%26gauthHost%3Dhttps%3A%2F%2Fsso.garmin.com%2Fsso%2Fembed%26service%3Dhttps%3A%2F%2Fsso.garmin.com%2Fsso%2Fembed%26source%3Dhttps%3A%2F%2Fsso.garmin.com%2Fsso%2Fembed%26redirectAfterAccountLoginUrl%3Dhttps%3A%2F%2Fsso.garmin.com%2Fsso%2Fembed%26redirectAfterAccountCreationUrl%3Dhttps%3A%2F%2Fsso.garmin.com%2Fsso%2Fembed');\n\n if (socialConfigURL.indexOf('%3A%2F%2F') != -1) {\n \tsocialConfigURL = decodeURIComponent(socialConfigURL);\n }\n\n if( status != null && status != ''){\n \tsend({'status':status});\n }\n\n jQuery(document).ready( function(){\n\n\n consoleInfo(\"signin.html: setting field validation rules...\");\n\n jQuery(\"#username\").rules(\"add\",{\n required: true,\n messages: {\n required: \"Email is required.\"\n }});\n\n jQuery(\"#password\").rules(\"add\", {\n required: true,\n messages: {\n required: \"Password is required.\"\n }\n });\n\n consoleInfo(\"signin.html: done setting field validation rules...\");\n\n });\n\n XD.receiveMessage(function(m){\n consoleInfo(\"signin.html: \" + m.data + \" received on \" + window.location.host);\n if (m && m.data) {\n var md = m.data;\n if (typeof(md) === 'string') {\n md = JSON.parse(m.data);\n }\n if (md.setUsername) {\n consoleInfo(\"signin.html: Setting username \\\"\" + md.username + \"\\\"...\");\n jQuery(\"#signInWithDiffLink\").click(); // Ensure the normal login form is shown.\n jQuery(\"#username\").val(md.username);\n jQuery(\"#password\").focus();\n }\n }\n }, parentHost);\n </script>\n </head>\n <body>\n\n <!-- begin GAuth component -->\n <div id=\"GAuth-component\">\n <!-- begin login component-->\n <div id=\"login-component\" class=\"blueForm-basic\">\n <input type=\"hidden\" id=\"queryString\" value=\"id=gauth-widget&embedWidget=true&gauthHost=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed&service=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed&source=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed&redirectAfterAccountLoginUrl=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed&redirectAfterAccountCreationUrl=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed\" />\n\t \t <input type=\"hidden\" id=\"contextPath\" value=\"/sso\" />\n <!-- begin login form -->\n <div id=\"login-state-default\">\n <h2>Sign In</h2>\n\n <form method=\"post\" id=\"login-form\">\n\n <div class=\"form-alert\">\n\t\t\t\t\t\t\t\n \n \n \n \n \n \n\n <div id=\"username-error\" style=\"display:none;\"></div>\n <div id=\"password-error\" style=\"display:none;\"></div>\n </div>\n <div class=\"textfield\">\n\t\t\t\t\t\t\t<label for=\"username\">Email</label>\n \t\t<!-- If the lockToEmailAddress parameter is specified then we want to mark the field as readonly,\n \t\tpreload the email address, and disable the other input so that null isn't sent to the server. We'll\n \t\talso style the field to have a darker grey background and disable the mouse pointer\n \t\t -->\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t<!-- If the lockToEmailAddress parameter is NOT specified then keep the existing functionality and disable the readonly input field\n\t\t\t\t\t\t\t -->\n\t\t\t\t\t\t\t <input class=\"login_email\" name=\"username\" id=\"username\" value=\"\" type=\"email\" spellcheck=\"false\" autocorrect=\"off\" autocapitalize=\"off\"/>\n\n </div>\n\n <div class=\"textfield\">\n <label for=\"password\">Password</label>\n <a id=\"loginforgotpassword\" class=\"login-forgot-password\" style=\"cursor:pointer\">(Forgot?)</a>\n <input type=\"password\" name=\"password\" id=\"password\" spellcheck=\"false\" autocorrect=\"off\" autocapitalize=\"off\" />\n <strong id=\"capslock-warning\" class=\"information\" title=\"Caps lock is on.\" style=\"display: none;\">Caps lock is on.</strong>\n\t\t\t\t\t </div>\n <input type=\"hidden\" name=\"embed\" value=\"true\"/>\n <input type=\"hidden\" name=\"_csrf\" value=\"2ADC7D4E7750F79EC5AAF96E34E327C360853E43183D7AFD6E250FF59F6690E4D05AB50FC2F39C661B592A8FDB6F91132370\" />\n <button type=\"submit\" id=\"login-btn-signin\" class=\"btn1\" accesskey=\"l\">Sign In</button>\n \n\n\n <!-- The existence of the \"rememberme\" parameter at all will remember the user! -->\n \n\n </form>\n </div>\n <!-- end login form -->\n\n <!-- begin Create Account message -->\n\t <div id=\"login-create-account\">\n\t \n\t </div>\n\t <!-- end Create Account message -->\n\n\t <!-- begin Social Sign In component -->\n\t <div id=\"SSI-component\">\n \n\n\t\t\t\t\t\n\t </div>\n\t <!-- end Social Sign In component -->\n <div class=\"clearfix\"></div> <!-- Ensure that GAuth-component div's height is computed correctly. -->\n </div>\n <!-- end login component-->\n\n\t\t</div>\n\t\t<!-- end GAuth component -->\n\n <script type=\"text/javascript\">\n jQuery(document).ready(function(){\n \tresizePageOnLoad(jQuery(\"#GAuth-component\").height());\n\n\t\t if(isUsernameDefined == true){\n\t\t // If the user's login just failed, redisplay the email/username specified, and focus them in the password field.\n\t\t jQuery(\"#password\").focus();\n\t\t } else if(false == true && result != \"PASSWORD_RESET_RESULT\"){\n // Otherwise focus them in the username field of the login dialog.\n jQuery(\"#username\").focus();\n }\n\n // Scroll to top of iframe to fix problem where Firefox 3.0-3.6 browsers initially show top of iframe cutoff.\n location.href=\"#\";\n\n if(!embedWidget){\n \tjQuery('.createAccountLink').click(function(){\n\t send({'openLiteBox':'createAccountLink', 'popupUrl': createAccountConfigURL, 'popupTitle':'Create An Account', 'clientId':clientId});\n\t });\n }\n });\n </script>\n <script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML=\"window.__CF$cv$params={r:'9bccde0f9d32051f',t:'MTc2ODIyMzE0Ny4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);\";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>\n</html>\n" 2026-01-12 14:05:47.796 - debug: garmin.0 (393639) Submitting login... 2026-01-12 14:05:49.247 - debug: garmin.0 (393639) Login response: 200 2026-01-12 14:05:49.247 - debug: garmin.0 (393639) "<!DOCTYPE html>\n<html lang=\"en\" class=\"no-js\">\n\n<head>\n <script type=\"text/javascript\" src=\"/sso/js/jquery/3.7.1/jquery.min.js?20210319\"></script>\n <script type=\"text/javascript\">jQuery.noConflict();</script>\n <script type=\"text/javascript\" src=\"/sso/js/jquery-validate/1.16.0/jquery.validate.min.js?20210319\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/base.js?20231020\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/jsUtils.js?20210406\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/json2.js\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/postmessage.js?20210319\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/consoleUtils.js?20210319\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/setupMfaRequiredView.js?20210319\"></script>\n <script type=\"text/javascript\" src=\"/sso/js/enterMfaCode.js?20230127\"></script>\n <script type=\"text/javascript\">\n var embedWidget = \"true\";\n if (embedWidget == \"\") {\n embedWidget = \"\";\n }\n embedWidget = (embedWidget == \"true\");\n var parent_url = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n window.onload = function() {\n ifrememberMyBrowserChecked();\n };\n\n jQuery(document).ready( function() {\n if (!embedWidget) {\n send({'gauthHeight': jQuery(\"#GAuth-component\").height()});\n }\n jQuery(\"#mfa-verification-code-submit\").click(function(){\n if (!validateMfaCodeAndPrivacyConsents()){\n return false;\n }\n jQuery('#submit-mfa-verification-code-form').submit();\n return false;\n });\n });\n var customerGuid = \"56f68a44-3317-47f6-8f27-7198decaa168\";\n var mfaMethod = \"email\";\n var locale = \"\";\n var clientId = \"\";\n var codeSentTo = \"br*****@gmail.com\";\n </script>\n <meta charset=\"utf-8\">\n <title>Enter MFA code for login</title>\n <meta name=\"description\" content=\"\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <meta http-equiv=\"cleartype\" content=\"on\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge;\" />\n <link href=\"/sso/css/GAuth.css?20170505\" rel=\"stylesheet\" type=\"text/css\" media=\"all\" />\n <link rel=\"stylesheet\" href=\"\" />\n</head>\n\n<body>\n <div id=\"GAuth-component\">\n <h2 id=\"enter-mfa-code-h2\">Enter security code</h2>\n <input type=\"hidden\" id=\"queryString\" value=\"id=gauth-widget&embedWidget=true&gauthHost=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed&service=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed&source=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed&redirectAfterAccountLoginUrl=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed&redirectAfterAccountCreationUrl=https:%2F%2Fsso.garmin.com%2Fsso%2Fembed\" />\n <input type=\"hidden\" id=\"contextPath\" value=\"/sso\" />\n\n <div id=\"login-component\" class=\"blueForm-basic\">\n <div id=\"login-state-verifymfa\">\n <td>\n \n <span >Code sent to <b>br*****@gmail.com</b></span>\n </td>\n <form id=\"submit-mfa-verification-code-form\" name=\"submit-mfa-verification-code-form\" method=\"post\" novalidate=\"novalidate\">\n <div class=\"blueForm-v2\">\n <div class=\"form-alert\">\n <div id=\"genericError\" class=\"error\" hidden>An unexpected error has occurred.</div>\n <div id=\"codeSentAttention\" class=\"attention\" hidden>A new code has been sent. You can request another code in 30 seconds.</div>\n \n \n <div id=\"maxLimit\" class=\"error\" hidden=\"hidden\">You have reached the maximum amount of codes requested. Please use a code you've received or wait 24 hours and try again.</div>\n \n </div>\n <div class=\"formTextField\">\n <div class=\"mfaFormLabel\">\n <label>\n <span>Security code</span>\n <br/>\n <input type=\"number\" pattern=\"[0-9]*\" inputmode=\"numeric\" maxlength=\"6\" id=\"mfa-code\" name=\"mfa-code\" autofocus oninput=\"validateMfaCodeAndPrivacyConsents()\"/>\n </label>\n </div>\n </div>\n <br><br>\n <div>\n <a href=\"https://support.garmin.com/en-US/?faq=uGHS8ZqOIhA0usBzBMdJu7\" target=\"_blank\" id=\"havingTrouble\">Get help</a><br>\n </div>\n <div id=\"requestNewCodeWrapper\" class=\"requestNewCode\">\n <a href=\"#\" id=\"newCode\">Request a new code</a>\n </div>\n \n \n <br>\n \n <br/>\n <button type=\"submit\" id=\"mfa-verification-code-submit\" class=\"btn1\">Next</button>\n </div>\n <input type=\"hidden\" name=\"embed\" value=\"true\"/>\n <input type=\"hidden\" name=\"_csrf\" value=\"6FDA52D5917AD7A3FFBA01B3F780CDA975A18834062CA73F39DE58CDA7CDB9701B8F67D0BD88834D380E20A37347F597A579\" />\n <input type=\"hidden\" name=\"fromPage\" value=\"setupEnterMfaCode\"/>\n <br/>\n </form>\n </div>\n <div class=\"clearfix\"></div> <!-- Ensure that GAuth-component div's height is computed correctly. -->\n </div>\n </div>\n <script type=\"text/javascript\">\n resizePageOnLoad(jQuery(\"#GAuth-component\").height());\n </script>\n<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML=\"window.__CF$cv$params={r:'9bccde199c485053',t:'MTc2ODIyMzE0OS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);\";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>\n</html>" 2026-01-12 14:05:49.247 - debug: garmin.0 (393639) Response title: Enter MFA code for login 2026-01-12 14:05:49.247 - info: garmin.0 (393639) MFA required. Saving session... 2026-01-12 14:05:49.251 - info: garmin.0 (393639) Please enter MFA code in the settings. The session is saved for 5 minutes. 2026-01-12 14:05:49.251 - error: garmin.0 (393639) Login failed - no ticket 2026-01-12 14:05:49.251 - error: garmin.0 (393639) Login failed 2026-01-12 14:06:30.904 - info: host.iobroker stopInstance system.adapter.garmin.0 (force=false, process=true) 2026-01-12 14:06:31.009 - info: garmin.0 (393639) Got terminate signal TERMINATE_YOURSELF 2026-01-12 14:06:31.009 - info: garmin.0 (393639) terminating 2026-01-12 14:06:31.010 - info: garmin.0 (393639) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason 2026-01-12 14:06:31.237 - info: host.iobroker stopInstance system.adapter.garmin.0 send kill signal 2026-01-12 14:06:31.511 - info: garmin.0 (393639) terminating 2026-01-12 14:06:31.626 - info: host.iobroker instance system.adapter.garmin.0 terminated with code 11 (ADAPTER_REQUESTED_TERMINATION) 2026-01-12 14:06:34.861 - info: host.iobroker instance system.adapter.garmin.0 in version "0.2.1" (non-npm: TA2k/ioBroker.garmin#157b732b6799ba0327989b6e9d744e238c91d93b) started with pid 393654 2026-01-12 14:06:35.351 - debug: garmin.0 (393654) Redis Objects: Use Redis connection: 127.0.0.1:9001 2026-01-12 14:06:35.528 - debug: garmin.0 (393654) Objects client ready ... initialize now 2026-01-12 14:06:35.529 - debug: garmin.0 (393654) Objects create System PubSub Client 2026-01-12 14:06:35.529 - debug: garmin.0 (393654) Objects create User PubSub Client 2026-01-12 14:06:35.880 - debug: garmin.0 (393654) Objects client initialize lua scripts 2026-01-12 14:06:35.882 - debug: garmin.0 (393654) Objects connected to redis: 127.0.0.1:9001 2026-01-12 14:06:35.964 - debug: garmin.0 (393654) Redis States: Use Redis connection: 127.0.0.1:9000 2026-01-12 14:06:36.006 - debug: garmin.0 (393654) States create System PubSub Client 2026-01-12 14:06:36.007 - debug: garmin.0 (393654) States create User PubSub Client 2026-01-12 14:06:36.317 - debug: garmin.0 (393654) States connected to redis: 127.0.0.1:9000 2026-01-12 14:06:38.584 - info: garmin.0 (393654) starting. Version 0.2.1 (non-npm: TA2k/ioBroker.garmin#157b732b6799ba0327989b6e9d744e238c91d93b) in /opt/iobroker/node_modules/iobroker.garmin, node: v22.21.0, js-controller: 7.0.7 2026-01-12 14:06:38.645 - info: garmin.0 (393654) No token found, performing login... 2026-01-12 14:06:38.646 - info: garmin.0 (393654) Starting SSO login... 2026-01-12 14:06:38.689 - info: garmin.0 (393654) Resuming MFA session... 2026-01-12 14:06:40.147 - debug: garmin.0 (393654) MFA resume response: 200 2026-01-12 14:06:40.148 - debug: garmin.0 (393654) "<!DOCTYPE html>\n<html class=\"no-js\">\n\t<head>\n\t\t<title>Success</title>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge;\" />\n\t\t<meta name=\"description\" content=\"\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\t\t<meta http-equiv=\"cleartype\" content=\"on\">\n\t\t<script type=\"text/javascript\" src=\"/sso/js/jquery/3.7.1/jquery.min.js?20210319\"></script>\n\t\t<script type=\"text/javascript\">jQuery.noConflict();</script>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/json2.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/consoleUtils.js?20210319\"></script>\n\t\t<script type=\"text/javascript\" src=\"/sso/js/postmessage.js?20210319\"></script>\n\t\t<script type=\"text/javascript\">\n\t\t\tvar redirectAfterAccountLoginUrl \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\tvar redirectAfterAccountCreationUrl = \"\";\n\t\t\tvar consumeServiceTicket \t = \"true\";\n\t\t\tvar service_url \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\tvar parent_url \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\tvar response_url \t = \"https:\\/\\/sso.garmin.com\\/sso\\/embed?ticket=ST-295764-qinkIxnY7bRZavhVEzFF-cas\";\n\t\t\tvar logintoken \t = \"NUgqbZheMn\";\n\t\t\tvar socialLogin \t = \"\";\n\t\t\tvar performMFACheck = \"\";\n\n\t\t\t// Decode url if it's encoded unnecessarily (which is happening when SSO GAuth logins redisplay the login page due to session timeouts.)\n\t\t\tif (response_url.indexOf('%3A%2F%2F') != -1) {\n\t\t\t\tresponse_url = decodeURIComponent(response_url);\n\t\t\t}\n\t\t\tresponse_url = response_url.replace(new RegExp(\"&\", 'g'),\"&\");\n\n\t\t\tvar service_ticket = response_url.substring(response_url.indexOf('ticket=') + 7, response_url.length);\n\n\t\t\tif (redirectAfterAccountLoginUrl) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: redirectAfterAccountLoginUrl: [' + redirectAfterAccountLoginUrl + ']');\n\t\t\t}\n\t\t\tconsoleInfo('casEmbedSuccess.html: consumeServiceTicket: [' + consumeServiceTicket + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: service_url: [' + service_url + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: parent_url: [' + parent_url + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: response_url: [' + response_url + ']');\n\t\t\tconsoleInfo('casEmbedSuccess.html: service_ticket: [' + service_ticket + ']');\n\t\t\tif (logintoken) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: logintoken: [' + logintoken + ']');\n\t\t\t}\n\t\t\tif (socialLogin) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: socialLogin: [' + socialLogin + ']');\n\t\t\t}\n\n\t\t\tfunction send(msg) {\n\t\t\t\tconsoleInfo('casEmbedSuccess.html: send(): Calling XD.postMessage(msg:[' + JSON.stringify(msg) + '], target_url:[' + parent_url + '])...');\n\t\t\t\tXD.postMessage(msg, parent_url, parent);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfunction redirect(target){\n\t\t\t\tvar embedWidget = \"true\";\n\t\t\t\tif (embedWidget != 'true') {\n\t\t\t\t\tif (logintoken || socialLogin) {\n\t\t\t\t\t\t// Tell parent to close opened Gauth lite box.\n\t\t\t\t\t\tsend({'closeLiteBox':'1'});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Tell parent to resize Gauth widget's height to just that of the loading icon.\n\t\t\t\t\t\tsend({'gauthHeight':jQuery(\"#GAuth-component\").height()});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (window.opener != null && window.opener.parent && window.opener.parent.frameElement) {\n\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: frameElement detected: [' + window.opener.parent.frameElement + ']');\n\t\t\t\t\tvar iframeParent = window.opener.parent;\n\t\t\t\t\tiframeParent.location.href = target;\n\t\t\t\t\twindow.close();\n\t\t\t\t} else {\n\t\t\t\t\t// If the \"redirectAfterAccountLoginUrl\" GAuth config parameter was specified,\n\t\t\t\t\t// a full page refresh upon logon was requested, so redirect the parent window upon login.\n\t\t\t\t\tif (redirectAfterAccountLoginUrl || redirectAfterAccountCreationUrl || (socialLogin && socialLogin === 'true') || (performMFACheck && performMFACheck === 'true')) {\n\n\t\t\t\t\t\tif (embedWidget != 'true') {\n\t\t\t\t\t\t\tsend({'status':'SUCCESS', 'successDetails':'Login Successful'});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Redirect parent of login iframe to requested service URL with ?ST=<Service Ticket ID> appended,\n\t\t\t\t\t\t// so the webapp can validate the service ticket and log the user on to the webapp.\n\t\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: Calling parent.location.href = [' + response_url + '];...');\n\t\t\t\t\t\ttop.location.href = response_url;\n\n\t\t\t\t\t// Else if GAuth was configured not to consume the service ticket, send the service ticket and service url.\n\t\t\t\t\t// It's then up to the parent page to hide the GAuth widget and validate the service ticket.\n\t\t\t\t\t} else if (consumeServiceTicket == 'false') {\n\n\t\t\t\t\t\tsend({'status':'SUCCESS', 'successDetails':'Login Successful', 'serviceTicket':service_ticket, 'serviceUrl':service_url});\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Else consume the service ticket and log the user into the parent webapp, by making a JSONP request to the response url.\n\t\t\t\t\t\t// This service ticket request to the parent webapp will return a small amount of JSON that we\n\t\t\t\t\t\t// can send in the success event to the parent page to notify them of successful logon\n\t\t\t\t\t\t// It's then up to the parent page to hide the GAuth widget and do whatever it wants.\n\t\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: Loading ajax jsonp URL: [' + response_url + ']');\n\t\t\t\t\t\tjQuery.ajax({\n\t\t\t\t\t\t\ttype: \"REDIRECT\",\n\t\t\t\t\t\t\turl: response_url,\n\t\t\t\t\t\t\tdataType: 'jsonp',\n\t\t\t\t\t\t\terror: function(xhr, status, error) {\n\t\t\t\t\t\t\t\tconsoleError('casEmbedSuccess.html: Error loading ajax jsonp URL: [' + response_url + ']! Error: ' + error);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsuccess: function( data, status, xhr ) {\n\t\t\t\t\t\t\t\tconsoleInfo('casEmbedSuccess.html: success loading ajax jsonp url. data: [' + data + ']');\n\t\t\t\t\t\t\t\tvar userdata = data;\n\t\t\t\t\t\t\t\tif (typeof(userdata) === 'string') {\n\t\t\t\t\t\t\t\t\tuserdata = JSON.parse(data);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconsoleInfo('casGenericRedirect.jsp: customerId: [' + userdata.customerId\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], username: [' + userdata.username\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], rememberMe: [' + userdata.rememberMe\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], password: [' + userdata.password\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], email: [' + userdata.email\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], displayName: [' + userdata.displayName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], firstName: [' + userdata.firstName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], lastName: [' + userdata.lastName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], localePreference: [' + userdata.localePreference\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], addressLine1: [' + userdata.addressLine1\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], addressLine2: [' + userdata.addressLine2\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], cityName: [' + userdata.cityName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], state: [' + userdata.state\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], postalCode: [' + userdata.postalCode\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], country: [' + userdata.country\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], passwordChangeRequired: [' + userdata.passwordChangeRequired\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], lastLogin: [' + userdata.lastLogin\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ '], erpCustomerNumber: [' + userdata.erpCustomerNumber\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ ']');\n\t\t\t\t\t\t\t\tsend({'status' : 'SUCCESS',\n\t\t\t\t\t\t\t\t\t\t\t'successDetails' : 'Login Successful',\n\t\t\t\t\t\t\t\t\t\t\t'customerId' : userdata.customerId,\n\t\t\t\t\t\t\t\t\t\t\t'username' : userdata.username,\n\t\t\t\t\t\t\t\t\t\t\t'rememberMe' : userdata.rememberMe,\n\t\t\t\t\t\t\t\t\t\t\t'password' : userdata.password,\n\t\t\t\t\t\t\t\t\t\t\t'email' : userdata.email,\n\t\t\t\t\t\t\t\t\t\t\t'displayName' : userdata.displayName,\n\t\t\t\t\t\t\t\t\t\t\t'firstName' : userdata.firstName,\n\t\t\t\t\t\t\t\t\t\t\t'lastName' : userdata.lastName,\n\t\t\t\t\t\t\t\t\t\t\t'localePreference' : userdata.localePreference,\n\t\t\t\t\t\t\t\t\t\t\t'addressLine1' : userdata.addressLine1,\n\t\t\t\t\t\t\t\t\t\t\t'addressLine2' : userdata.addressLine2,\n\t\t\t\t\t\t\t\t\t\t\t'cityName' : userdata.cityName,\n\t\t\t\t\t\t\t\t\t\t\t'state' : userdata.state,\n\t\t\t\t\t\t\t\t\t\t\t'postalCode' : userdata.postalCode,\n\t\t\t\t\t\t\t\t\t\t\t'country' : userdata.country,\n\t\t\t\t\t\t\t\t\t\t\t'passwordChangeRequired' : userdata.passwordChangeRequired,\n\t\t\t\t\t\t\t\t\t\t\t'lastLogin' : userdata.lastLogin,\n\t\t\t\t\t\t\t\t\t\t\t'erpCustomerNumber' : userdata.erpCustomerNumber\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t</script>\n\t</head>\n\t<body>\n\t\t<div id=\"GAuth-component\">\n\t\t\t<img src='/sso/images/ajax-loader.gif' class=\"loaderImage\"/>\n\t\t</div>\n\t\t<script type=\"text/javascript\">\n\t\t\tjQuery(document).ready(function(){\n\t\t\t\tvar service = \"https:\\/\\/sso.garmin.com\\/sso\\/embed\";\n\t\t\t\tconsoleInfo(\"casEmbedSuccess.html: ready, calling redirect('\" + service + \"')...\");\n\t\t\t\tredirect(service);\n\t\t\t});\n\t\t</script>\n\t<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML=\"window.__CF$cv$params={r:'9bccdf542efff56c',t:'MTc2ODIyMzIwMC4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);\";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>\n</html>\n" 2026-01-12 14:06:40.148 - debug: garmin.0 (393654) MFA Response title: Success 2026-01-12 14:06:40.150 - info: garmin.0 (393654) MFA verification successful 2026-01-12 14:06:40.150 - debug: garmin.0 (393654) Ticket: ST-295764-qinkIxnY7bRZavhVEzFF-cas 2026-01-12 14:06:40.150 - debug: garmin.0 (393654) Getting OAuth1 token... 2026-01-12 14:06:40.660 - debug: garmin.0 (393654) Fetched OAuth consumer from S3 2026-01-12 14:06:40.660 - debug: garmin.0 (393654) {"consumer_key":"fc3e99d2-118c-44b8-8ae3-03370dde24c0","consumer_secret":"E08WAR897WEy2knn7aFBrvegVAf0AFdWBBF"} 2026-01-12 14:06:41.511 - debug: garmin.0 (393654) OAuth1 Status: 200 2026-01-12 14:06:41.511 - debug: garmin.0 (393654) "oauth_token=a2d59379-a1e3-4a5d-b801-254e7610610b&oauth_token_secret=juIPzbGaeio0ria5HHiPlM32sNoo3nJm24Y&mfa_token=MFA-4945-HCURUt7GLOwWAnU3J9eVvYnEcdfX7cO6IVFKKUr2IRFQzZxITK-cas&mfa_expiration_timestamp=2027-01-12 13:06:39.000" 2026-01-12 14:06:41.511 - debug: garmin.0 (393654) OAuth1 Token: OK 2026-01-12 14:06:41.511 - debug: garmin.0 (393654) Exchanging for OAuth2 token... 2026-01-12 14:06:41.511 - debug: garmin.0 (393654) oauth1Token: {"oauth_token":"a2d59379-a1e3-4a5d-b801-254e7610610b","oauth_token_secret":"juIPzbGaeio0ria5HHiPlM32sNoo3nJm24Y","mfa_token":"MFA-4945-HCURUt7GLOwWAnU3J9eVvYnEcdfX7cO6IVFKKUr2IRFQzZxITK-cas"} 2026-01-12 14:06:41.512 - debug: garmin.0 (393654) authHeader: {"Authorization":"OAuth oauth_consumer_key=\"fc3e99d2-118c-44b8-8ae3-03370dde24c0\", oauth_nonce=\"bZ9xGtWFTXCAuCRiIRyIYNGJhmaNDbHh\", oauth_signature=\"cbpoQE1IQ2NlLJ5s2fueYRHspM8%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1768223201\", oauth_token=\"a2d59379-a1e3-4a5d-b801-254e7610610b\", oauth_version=\"1.0\""} 2026-01-12 14:06:41.512 - debug: garmin.0 (393654) body: mfa_token=MFA-4945-HCURUt7GLOwWAnU3J9eVvYnEcdfX7cO6IVFKKUr2IRFQzZxITK-cas 2026-01-12 14:06:41.663 - error: garmin.0 (393654) OAuth2 request failed: 401 Request failed with status code 401 2026-01-12 14:06:41.663 - error: garmin.0 (393654) OAuth2 token exchange failed 2026-01-12 14:06:41.665 - error: garmin.0 (393654) Login failed garmin.0: Nicht mit Gerät oder Service verbunden -
@tombox
Danke, aber so ganz rund läuft es noch nicht. Ich habe die Instanz gestoppt, alle Datenpunkte gelöscht und 22 Datenpunkte in der Instanz eingetragen. Die Datenpunkte werden auch weiter abgerufen und aktualisiert.
Zusätzlich werden aber noch zig weitere abgerufen und ich kann nicht nachvollziehen warum.
Nach meinem Verständnis sollten nur noch die 22 eingetragenen auftauchen. Nach dem Löschen und Neustart des Adapter bin ich nicht wie erwartet von 20.000 auf 22 Datenpunkte runter, sondern "nur" auf 8.000 Datenpunkte.
Im Ordner "hydration" tauchen z.B. nur die angegebenen Datenpunkte auf. Im Ordner "weight" werden noch weitere, nicht eingetragene angelegt. Alles was im Screenshot den Link zum Alias hat ist auch in der Instanz eingetragen. Alle anderen sollten nicht auftauchen.

-
@bommel_030 es gibt jetzt zwei filter listen
@clown007 ich habe nochmal logs hinzugefügt@tombox
hm, das läuft auch noch nicht rund...
Beim Filter exakter Datenpunkt wirdhydration.valueInMLnicht angenommen,
valueInMLhingegen schon.
Dieser Datenpunkt ist noch eineindeutig. Beidailysleep.dailySleepDTO.sleepScores.overall.valuewird das dann schon schwieriger, da
valuesehr oft verwendet wird. Ich fände es besser wenn der "Pfad" des Datenpunktes mit verwendet wird.
Leider werden weiterhin auch noch ca. 5.000 weitere Datenpunkte angelegt. Es dürften eigentlich nur die 2 im Screenshot dargestellten Punkte auftauchen(der Info Teil natürlich auch).
Die unteren drei Ordner sind leer, die oberen sind voll.

-
@bommel_030 es gibt jetzt zwei filter listen
@clown007 ich habe nochmal logs hinzugefügt@tombox sagte in Test Adapter Garmin:
@bommel_030 es gibt jetzt zwei filter listen
@clown007 ich habe nochmal logs hinzugefügt2026-01-12 23:33:48.476 - debug: garmin.0 (397261) MFA Response title: Success 2026-01-12 23:33:48.479 - info: garmin.0 (397261) MFA verification successful 2026-01-12 23:33:48.479 - debug: garmin.0 (397261) Ticket: ST-281134-Xxm0wB32BcpLHh2g17lg-cas 2026-01-12 23:33:48.479 - debug: garmin.0 (397261) Getting OAuth1 token... 2026-01-12 23:33:48.997 - debug: garmin.0 (397261) Fetched OAuth consumer from S3 2026-01-12 23:33:48.997 - debug: garmin.0 (397261) {"consumer_key":"fc3e99d2-118c-44b8-8ae3-03370dde24c0","consumer_secret":"E08WAR897WEy2knn7aFBrvegVAf0AFdWBBF"} 2026-01-12 23:33:49.580 - debug: garmin.0 (397261) OAuth1 Status: 200 2026-01-12 23:33:49.580 - debug: garmin.0 (397261) "oauth_token=a2d59379-a1e3-4a5d-b801-254e7610610b&oauth_token_secret=juIPzbGaeio0ria5HHiPlM32sNoo3nJm24Y&mfa_token=MFA-4166-q3IY01WZYBweJdrndrdGlfCXRWD1ZGt0avp04rB6lv5neXme1t-cas&mfa_expiration_timestamp=2027-01-12 22:33:48.000" 2026-01-12 23:33:49.581 - debug: garmin.0 (397261) OAuth1 Token: OK 2026-01-12 23:33:49.581 - debug: garmin.0 (397261) Exchanging for OAuth2 token... 2026-01-12 23:33:49.581 - debug: garmin.0 (397261) oauth1Token: {"oauth_token":"a2d59379-a1e3-4a5d-b801-254e7610610b","oauth_token_secret":"juIPzbGaeio0ria5HHiPlM32sNoo3nJm24Y","mfa_token":"MFA-4166-q3IY01WZYBweJdrndrdGlfCXRWD1ZGt0avp04rB6lv5neXme1t-cas"} 2026-01-12 23:33:49.581 - debug: garmin.0 (397261) authHeader: {"Authorization":"OAuth oauth_consumer_key=\"fc3e99d2-118c-44b8-8ae3-03370dde24c0\", oauth_nonce=\"WxShBZnGaUyc32QElolln2EqSHiqXWyA\", oauth_signature=\"ltG5oYAELBFPzDJpdF1LtEz43I0%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1768257229\", oauth_token=\"a2d59379-a1e3-4a5d-b801-254e7610610b\", oauth_version=\"1.0\""} 2026-01-12 23:33:49.581 - debug: garmin.0 (397261) body: mfa_token=MFA-4166-q3IY01WZYBweJdrndrdGlfCXRWD1ZGt0avp04rB6lv5neXme1t-cas 2026-01-12 23:33:49.725 - error: garmin.0 (397261) OAuth2 request failed: 401 Request failed with status code 401 2026-01-12 23:33:49.725 - error: garmin.0 (397261) OAuth2 error response: "<!doctype html><html lang=\"en\"><head><title>HTTP Status 401 – Unauthorized</title><style type=\"text/css\">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 401 – Unauthorized</h1><hr class=\"line\" /><p><b>Type</b> Status Report</p><p><b>Message</b> Invalid signature for signature method HMAC-SHA1</p><p><b>Description</b> The request has not been applied to the target resource because it lacks valid authentication credentials for that resource.</p><hr class=\"line\" /><h3>Garmin Connect API Server</h3></body></html>" 2026-01-12 23:33:49.725 - error: garmin.0 (397261) OAuth2 token exchange failed 2026-01-12 23:33:49.725 - info: garmin.0 (397261) Clearing MFA session and token for fresh login... 2026-01-12 23:33:49.730 - error: garmin.0 (397261) Login failedIch hatte beim ersten mal eine falsche MFA eingegeben das gab klar eine Fehlermeldung. Für mich sieht es so als ob der Hashing Algorithmus nicht akzeptiert wird: " Invalid signature for signature method HMAC-SHA1"
Wenn Du mehr vom log benötiogst, gib mir einfach eine kurze Info
-
@tombox
hm, das läuft auch noch nicht rund...
Beim Filter exakter Datenpunkt wirdhydration.valueInMLnicht angenommen,
valueInMLhingegen schon.
Dieser Datenpunkt ist noch eineindeutig. Beidailysleep.dailySleepDTO.sleepScores.overall.valuewird das dann schon schwieriger, da
valuesehr oft verwendet wird. Ich fände es besser wenn der "Pfad" des Datenpunktes mit verwendet wird.
Leider werden weiterhin auch noch ca. 5.000 weitere Datenpunkte angelegt. Es dürften eigentlich nur die 2 im Screenshot dargestellten Punkte auftauchen(der Info Teil natürlich auch).
Die unteren drei Ordner sind leer, die oberen sind voll.

-
@bommel_030 @clown007
wurde nochmal aktualisiert- Kann es sein, dass Groß-/Kleinschreibung interessant ist?
Ich habe die exakten Datenpunkte aus dem alten Baum kopiert.
weight.dateWeightList01.bmi, weight.dateWeightList01.bodyFat, weight.dateWeightList01.weight, weight.dateWeightList01.boneMass, weight.dateWeightList01.muscleMass,weight.dateWeightList01.bodyWater, usersummary.totalSteps, usersummary.dailyStepGoal, usersummary.floorsAscended, usersummary.totalDistanceMeters, usersummary.bodyBatteryMostRecentValue, usersummary.bodyBatteryChargedValue, usersummary.bodyBatteryDrainedValue, usersummary.maxHeartRate, usersummary.restingHeartRate, dailysleep.dailySleepDTO.sleepScores.overall.value, usersummary.latestSpo2, dailystress.avgStressLevel, trainingstatus.mostRecentVO2Max.generic.vo2MaxValue, hydration.valueInML, hydration.sweatLossInML, hydration.goalInMLIm Log gibt er die alle komplett klein geschrieben aus.
Exact allowlist active: weight.dateweightlist01.bmi, weight.dateweightlist01.bodyfat, weight.dateweightlist01.weight, weight.dateweightlist01.bonemass, weight.dateweightlist01.musclemass, weight.dateweightlist01.bodywater, usersummary.totalsteps, usersummary.dailystepgoal, usersummary.floorsascended, usersummary.totaldistancemeters, usersummary.bodybatterymostrecentvalue, usersummary.bodybatterychargedvalue, usersummary.bodybatterydrainedvalue, usersummary.maxheartrate, usersummary.restingheartrate, dailysleep.dailysleepdto.sleepscores.overall.value, usersummary.latestspo2, dailystress.avgstresslevel, trainingstatus.mostrecentvo2max.generic.vo2maxvalue, hydration.valueinml, hydration.sweatlossinml, hydration.goalinmlIm Objektbaum taucht kein einziger Datenpunkt aus der allowlist auf.
- Die ersten 4 Ordner werden trotzdem angelegt obwohl sie das eigentlich nicht sollten. Sind allein schon über 2.500 Datenpunkte.

Trotzdem nochmals danke für deine Arbeit. Mit der neuen LogIn übersteht die Instanz bei mir auch einen Neustart des ioBrokers.
- Kann es sein, dass Groß-/Kleinschreibung interessant ist?
-
- Kann es sein, dass Groß-/Kleinschreibung interessant ist?
Ich habe die exakten Datenpunkte aus dem alten Baum kopiert.
weight.dateWeightList01.bmi, weight.dateWeightList01.bodyFat, weight.dateWeightList01.weight, weight.dateWeightList01.boneMass, weight.dateWeightList01.muscleMass,weight.dateWeightList01.bodyWater, usersummary.totalSteps, usersummary.dailyStepGoal, usersummary.floorsAscended, usersummary.totalDistanceMeters, usersummary.bodyBatteryMostRecentValue, usersummary.bodyBatteryChargedValue, usersummary.bodyBatteryDrainedValue, usersummary.maxHeartRate, usersummary.restingHeartRate, dailysleep.dailySleepDTO.sleepScores.overall.value, usersummary.latestSpo2, dailystress.avgStressLevel, trainingstatus.mostRecentVO2Max.generic.vo2MaxValue, hydration.valueInML, hydration.sweatLossInML, hydration.goalInMLIm Log gibt er die alle komplett klein geschrieben aus.
Exact allowlist active: weight.dateweightlist01.bmi, weight.dateweightlist01.bodyfat, weight.dateweightlist01.weight, weight.dateweightlist01.bonemass, weight.dateweightlist01.musclemass, weight.dateweightlist01.bodywater, usersummary.totalsteps, usersummary.dailystepgoal, usersummary.floorsascended, usersummary.totaldistancemeters, usersummary.bodybatterymostrecentvalue, usersummary.bodybatterychargedvalue, usersummary.bodybatterydrainedvalue, usersummary.maxheartrate, usersummary.restingheartrate, dailysleep.dailysleepdto.sleepscores.overall.value, usersummary.latestspo2, dailystress.avgstresslevel, trainingstatus.mostrecentvo2max.generic.vo2maxvalue, hydration.valueinml, hydration.sweatlossinml, hydration.goalinmlIm Objektbaum taucht kein einziger Datenpunkt aus der allowlist auf.
- Die ersten 4 Ordner werden trotzdem angelegt obwohl sie das eigentlich nicht sollten. Sind allein schon über 2.500 Datenpunkte.

Trotzdem nochmals danke für deine Arbeit. Mit der neuen LogIn übersteht die Instanz bei mir auch einen Neustart des ioBrokers.
@bommel_030 KI hat eine dritte liste hinzugefügt und mehr debug logs weil wenn du die Ordner löscht sollten sie nicht mit Datenpunkt wieder angelegt werden
- Kann es sein, dass Groß-/Kleinschreibung interessant ist?
-
@bommel_030 @clown007
wurde nochmal aktualisiert -
@bommel_030 KI hat eine dritte liste hinzugefügt und mehr debug logs weil wenn du die Ordner löscht sollten sie nicht mit Datenpunkt wieder angelegt werden
@tombox sagte in Test Adapter Garmin:
@bommel_030 KI hat eine dritte liste hinzugefügt und mehr debug logs weil wenn du die Ordner löscht sollten sie nicht mit Datenpunkt wieder angelegt werden
Hab wieder über die Katze installiert, aber eine dritte Liste taucht nicht auf?!?
Ergebnis der Datenpunkte wie gehabt. Die Ordner auth und info sind eigentlich verständlich. Mit dem ordner devices habe ich grundsätzlich auch kein Problem.
Wenn ich mir das logfile ansehe filtert er nicht nach dem exakten Datenpunkt, sondern nur nach dem ersten Teil, also z.B. hydration. Damit kann er die Datenpunkte nicht parsen.
Im Ordner dailystress sollte nach der allowlist 1 Datenpunkt auftauchen. Exakt dieser eine taucht nicht auf, hunderte andere trotzdem. Würde aber immerhin erklären warum er den Ordner anlegt.
Warum er aber den Ordner activities anlegt verstehe ich nicht, das taucht in der allolist definitiv nicht auf.
Gekürztes Log anbei (das komplette würde den Rahmen sprengen, aber für hydration und activities ist der interessante Teil dabei).garmin.0 2026-01-13 21:10:12.937 debug Parsing activities with filtered data: [{"userRoles":["SCOPE_GOLF_API_READ","SCOPE_DI_OAUTH_2_DEVICE_REVOCATION_WRITE","SCOPE_DI_OAUTH_2_CREATE_DI_USER","SCOPE_ATP_READ","SCOPE_DIVE_API_WRITE","SCOPE_COMMUNITY_COURSE_ADMIN_READ","SCOPE_DIVE_API_READ","SCOPE_DI_OAUTH_2_CLIENT_READ","SCOPE_CONNECT_WRITE","SCOPE_COMMUNITY_COURSE_WRITE","SCOPE_CONNECT_MCT_DAILY_LOG_READ","SCOPE_CONNECT_API_CREATE_UPDATE_USER","SCOPE_MESSAGE_GENERATION_READ","SCOPE_DI_OAUTH_2_CLIENT_REVOCATION_ADMIN","SCOPE_CONNECT_WEB_TEMPLATE_RENDER","SCOPE_OMT_SUBSCRIP garmin.0 2026-01-13 21:10:12.936 debug [{"activityId":21535275938,"activityName":"Berlin Gehen","startTimeLocal":"2026-01-13 17:28:04","startTimeGMT":"2026-01-13 16:28:04","activityType":{"typeId":9,"typeKey":"walking","parentTypeId":17,"isHidden":false,"restricted":false,"trimmable":true},"eventType": garmin.0 2026-01-13 20:55:08.666 debug No data left after allowlist filter for hydration garmin.0 2026-01-13 20:55:08.666 debug {"userId":2400759,"calendarDate":"2026-01-13","valueInML":0,"goalInML":3022,"dailyAverageinML":null,"lastEntryTimestampLocal":"2026-01-13T17:28:04.0","sweatLossInML":222,"activityIntakeInML":0} garmin.0 2026-01-13 20:55:08.157 info Found 3 devices garmin.0 2026-01-13 20:55:07.469 info Exact allowlist active: hydration.valueinml, hydration.sweatlossinml, hydration.goalinml, trainingstatus.mostrecentvo2max.generic.vo2maxvalue, dailystress.avgstresslevel, usersummary.latestspo2, dailysleep.dailysleepdto.sleepscores.overall.value, usersummary.restingheartrate, usersummary.maxheartrate, usersummary.bodybatterydrainedvalue, usersummary.bodybatterychargedvalue, usersummary.bodybatterymostrecentvalue, usersummary.totaldistancemeters, usersummary.floorsascended, usersummary.dailystepgoal, usersummary.totalsteps, weight.dateweightlist01.bodywater, weight.dateweightlist01.musclemass, weight.dateweightlist01.bonemass, weight.dateweightlist01.weight, weight.dateweightlist01.bodyfat, weight.dateweightlist01.bmi garmin.0 2026-01-13 20:55:07.461 info starting. Version 0.2.1 (non-npm: TA2k/ioBroker.garmin) in /opt/iobroker/node_modules/iobroker.garmin, node: v22.21.0, js-controller: 7.1.0 -
@tombox sagte in Test Adapter Garmin:
@bommel_030 KI hat eine dritte liste hinzugefügt und mehr debug logs weil wenn du die Ordner löscht sollten sie nicht mit Datenpunkt wieder angelegt werden
Hab wieder über die Katze installiert, aber eine dritte Liste taucht nicht auf?!?
Ergebnis der Datenpunkte wie gehabt. Die Ordner auth und info sind eigentlich verständlich. Mit dem ordner devices habe ich grundsätzlich auch kein Problem.
Wenn ich mir das logfile ansehe filtert er nicht nach dem exakten Datenpunkt, sondern nur nach dem ersten Teil, also z.B. hydration. Damit kann er die Datenpunkte nicht parsen.
Im Ordner dailystress sollte nach der allowlist 1 Datenpunkt auftauchen. Exakt dieser eine taucht nicht auf, hunderte andere trotzdem. Würde aber immerhin erklären warum er den Ordner anlegt.
Warum er aber den Ordner activities anlegt verstehe ich nicht, das taucht in der allolist definitiv nicht auf.
Gekürztes Log anbei (das komplette würde den Rahmen sprengen, aber für hydration und activities ist der interessante Teil dabei).garmin.0 2026-01-13 21:10:12.937 debug Parsing activities with filtered data: [{"userRoles":["SCOPE_GOLF_API_READ","SCOPE_DI_OAUTH_2_DEVICE_REVOCATION_WRITE","SCOPE_DI_OAUTH_2_CREATE_DI_USER","SCOPE_ATP_READ","SCOPE_DIVE_API_WRITE","SCOPE_COMMUNITY_COURSE_ADMIN_READ","SCOPE_DIVE_API_READ","SCOPE_DI_OAUTH_2_CLIENT_READ","SCOPE_CONNECT_WRITE","SCOPE_COMMUNITY_COURSE_WRITE","SCOPE_CONNECT_MCT_DAILY_LOG_READ","SCOPE_CONNECT_API_CREATE_UPDATE_USER","SCOPE_MESSAGE_GENERATION_READ","SCOPE_DI_OAUTH_2_CLIENT_REVOCATION_ADMIN","SCOPE_CONNECT_WEB_TEMPLATE_RENDER","SCOPE_OMT_SUBSCRIP garmin.0 2026-01-13 21:10:12.936 debug [{"activityId":21535275938,"activityName":"Berlin Gehen","startTimeLocal":"2026-01-13 17:28:04","startTimeGMT":"2026-01-13 16:28:04","activityType":{"typeId":9,"typeKey":"walking","parentTypeId":17,"isHidden":false,"restricted":false,"trimmable":true},"eventType": garmin.0 2026-01-13 20:55:08.666 debug No data left after allowlist filter for hydration garmin.0 2026-01-13 20:55:08.666 debug {"userId":2400759,"calendarDate":"2026-01-13","valueInML":0,"goalInML":3022,"dailyAverageinML":null,"lastEntryTimestampLocal":"2026-01-13T17:28:04.0","sweatLossInML":222,"activityIntakeInML":0} garmin.0 2026-01-13 20:55:08.157 info Found 3 devices garmin.0 2026-01-13 20:55:07.469 info Exact allowlist active: hydration.valueinml, hydration.sweatlossinml, hydration.goalinml, trainingstatus.mostrecentvo2max.generic.vo2maxvalue, dailystress.avgstresslevel, usersummary.latestspo2, dailysleep.dailysleepdto.sleepscores.overall.value, usersummary.restingheartrate, usersummary.maxheartrate, usersummary.bodybatterydrainedvalue, usersummary.bodybatterychargedvalue, usersummary.bodybatterymostrecentvalue, usersummary.totaldistancemeters, usersummary.floorsascended, usersummary.dailystepgoal, usersummary.totalsteps, weight.dateweightlist01.bodywater, weight.dateweightlist01.musclemass, weight.dateweightlist01.bonemass, weight.dateweightlist01.weight, weight.dateweightlist01.bodyfat, weight.dateweightlist01.bmi garmin.0 2026-01-13 20:55:07.461 info starting. Version 0.2.1 (non-npm: TA2k/ioBroker.garmin) in /opt/iobroker/node_modules/iobroker.garmin, node: v22.21.0, js-controller: 7.1.0@bommel_030 ist jetzt drin
-
@bommel_030 ist jetzt drin
@tombox
Jetzt mit dritter Liste, aber leider gleichem Ergebnis. Diesmal nur mit hydration.goalinml in der allowlist.

Die grünen Ordner sind ok, der gelbe sollte nicht da sein, stört aber nicht, die beiden magenta sollten nicht auftauchen.
Der erlaubte hydration taucht leider gar nicht auf.

debug.log -
@tombox
Jetzt mit dritter Liste, aber leider gleichem Ergebnis. Diesmal nur mit hydration.goalinml in der allowlist.

Die grünen Ordner sind ok, der gelbe sollte nicht da sein, stört aber nicht, die beiden magenta sollten nicht auftauchen.
Der erlaubte hydration taucht leider gar nicht auf.

debug.log@bommel_030 nochmal testen
-
@bommel_030 nochmal testen
@tombox
Sobald ich einen Filter eingebe Werte kommen keine Daten an.
Die Ordner activities und dailystress erscheinen jetzt aber nicht mehr.
Wenn ich den Filter rausnehme kommen wieder Daten rein....