diff --git a/.bumpversion-edge.toml b/.bumpversion-edge.toml index 96178f5..7d8a992 100644 --- a/.bumpversion-edge.toml +++ b/.bumpversion-edge.toml @@ -1,5 +1,5 @@ [tool.bumpversion] -current_version = "2.11.16" +current_version = "2.11.17" parse = "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)" serialize = ["{major}.{minor}.{patch}"] search = "{current_version}" diff --git a/GridboxConnectorAddon-dev/CHANGELOG.md b/GridboxConnectorAddon-dev/CHANGELOG.md index 8985174..f0ea748 100644 --- a/GridboxConnectorAddon-dev/CHANGELOG.md +++ b/GridboxConnectorAddon-dev/CHANGELOG.md @@ -1,10 +1,11 @@ -## 2.11.16 +## 2.11.17 ### 🔨 Fixed - Worked on create new device and fixed hopefully +- Removed Telemetry ## 2.11.11 diff --git a/GridboxConnectorAddon-dev/GridboxConnector/__main__.py b/GridboxConnectorAddon-dev/GridboxConnector/__main__.py index 17aacb8..224989c 100644 --- a/GridboxConnectorAddon-dev/GridboxConnector/__main__.py +++ b/GridboxConnectorAddon-dev/GridboxConnector/__main__.py @@ -7,7 +7,6 @@ import logging from importlib.resources import files from utils import SensitiveDataFilter, get_bool_env -from telemetry import Telemetry import threading opens_file_path = '/data/options.json' #logging.basicConfig(format='%(asctime)s %(filename)s:%(lineno)d %(levelname)s - %(message)s', level=logging.getLevelName(os.getenv('LOG_LEVEL', 'INFO'))) @@ -141,6 +140,5 @@ def run_addon(): threading.Thread(target=start_historical_thread, args=(gridboxConnector, viessmann_gridbox_historical_device, WAIT)).start() if __name__ == '__main__': - #telemetry = run_telemetry() run_addon() #run_test_log() \ No newline at end of file diff --git a/GridboxConnectorAddon-dev/GridboxConnector/requirements.txt b/GridboxConnectorAddon-dev/GridboxConnector/requirements.txt index 959dd06..bf0f665 100644 --- a/GridboxConnectorAddon-dev/GridboxConnector/requirements.txt +++ b/GridboxConnectorAddon-dev/GridboxConnector/requirements.txt @@ -1,8 +1,3 @@ -ha-mqtt-discoverable==0.13.1 +ha-mqtt-discoverable==0.16.0 requests==2.32.2 -viessmann-gridbox-connector==1.5.1 -opentelemetry-api -opentelemetry-sdk -opentelemetry-exporter-otlp-proto-grpc -opentelemetry-instrumentation-requests -opentelemetry-instrumentation-logging +viessmann-gridbox-connector==1.6.0 diff --git a/GridboxConnectorAddon-dev/GridboxConnector/telemetry.py b/GridboxConnectorAddon-dev/GridboxConnector/telemetry.py deleted file mode 100644 index 5e40e73..0000000 --- a/GridboxConnectorAddon-dev/GridboxConnector/telemetry.py +++ /dev/null @@ -1,92 +0,0 @@ -import logging -import requests -import uuid -from opentelemetry import trace -from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import BatchSpanProcessor -from opentelemetry.instrumentation.requests import RequestsInstrumentor -from opentelemetry.instrumentation.logging import LoggingInstrumentor -from opentelemetry.sdk.resources import Resource -from opentelemetry.semconv.resource import ResourceAttributes - -from opentelemetry.sdk._logs.export import BatchLogRecordProcessor -from opentelemetry._logs import set_logger_provider -from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter -from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler - -class Telemetry: - def __init__(self, collector_endpoint, service_name): - self.service_instance_id = str(uuid.uuid4()) - self.resource = Resource(attributes={ - ResourceAttributes.SERVICE_NAME: service_name, - ResourceAttributes.SERVICE_INSTANCE_ID: self.service_instance_id - }) - - # Instrument the logging module - LoggingInstrumentor().instrument(set_logging_format=True, log_level=logging.DEBUG) - # Set up logging - logging.basicConfig(level=logging.DEBUG) - - # Set up the tracer provider and exporter - trace.set_tracer_provider(TracerProvider(resource=self.resource)) - self.tracer = trace.get_tracer(__name__) - - # Set up the OTLP exporter - otlp_exporter = OTLPSpanExporter(endpoint=collector_endpoint, insecure=True) - span_processor = BatchSpanProcessor(otlp_exporter) - trace.get_tracer_provider().add_span_processor(span_processor) - - # Instrument the requests library - RequestsInstrumentor().instrument() - - # Create and set the logger provider - logger_provider = LoggerProvider(resource=self.resource) - set_logger_provider(logger_provider) - - exporter = OTLPLogExporter(endpoint=collector_endpoint, insecure=True) - logger_provider.add_log_record_processor(BatchLogRecordProcessor(exporter)) - handler = LoggingHandler(level=logging.DEBUG, logger_provider=logger_provider) - - # Attach OTLP handler to root logger - logging.getLogger().addHandler(handler) - self.logger = logging.getLogger("telemetry") - - def log_as_span(self, message, level=logging.INFO): - with self.tracer.start_as_current_span("logging") as span: - if level == logging.DEBUG: - self.logger.debug(message) - elif level == logging.INFO: - self.logger.info(message) - elif level == logging.WARNING: - self.logger.warning(message) - elif level == logging.ERROR: - self.logger.error(message) - elif level == logging.CRITICAL: - self.logger.critical(message) - span.add_event("log_event", {"message": message, "level": level}) - - def make_request(self, url): - try: - with self.tracer.start_as_current_span("http_request") as span: - response = requests.get(url) - self.logger.info(f"Received response: {response.status_code}") - span.add_event("Received response", {"status_code": response.status_code, "body": response.text}) - return response - except Exception as e: - self.logger.exception(f"Exception during request: {e}") - raise - -def main(): - collector_endpoint = "https://otel.helming.xyz" - service_name = "test_telemetry" - telemetry = Telemetry(collector_endpoint, service_name) - telemetry.log_as_span("This is a test log message", level=logging.INFO) - try: - response = telemetry.make_request("https://httpbin.org/get") - telemetry.log_as_span(f"Request successful with status code: {response.status_code}", level=logging.INFO) - except Exception as e: - telemetry.log_as_span(f"Request failed with exception: {e}", level=logging.ERROR) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/GridboxConnectorAddon-dev/cloudSettings.json b/GridboxConnectorAddon-dev/cloudSettings.json index 77ebb5e..2b4935b 100644 --- a/GridboxConnectorAddon-dev/cloudSettings.json +++ b/GridboxConnectorAddon-dev/cloudSettings.json @@ -1,5 +1,5 @@ { - "version": "2.11.16", + "version": "2.11.17", "urls": { "login": "https://gridx.eu.auth0.com/oauth/token", "gateways": "https://api.gridx.de/gateways", diff --git a/GridboxConnectorAddon-dev/config.yaml b/GridboxConnectorAddon-dev/config.yaml index 88656c8..2f0efc9 100644 --- a/GridboxConnectorAddon-dev/config.yaml +++ b/GridboxConnectorAddon-dev/config.yaml @@ -1,6 +1,6 @@ # https://developers.home-assistant.io/docs/add-ons/configuration#add-on-config name: Viessmann Gridbox Connector (dev) -version: "2.11.16" +version: "2.11.17" slug: "gridbox_connector_dev" description: Development version of Viessmann Gridbox Connector url: "https://github.com/unl0ck/homeassistant-addon-viessmann-gridbox/tree/main/GridboxConnectorAddon-dev" diff --git a/GridboxConnectorAddon-dev/rootfs/share/cloudSettings.json b/GridboxConnectorAddon-dev/rootfs/share/cloudSettings.json index 77ebb5e..2b4935b 100644 --- a/GridboxConnectorAddon-dev/rootfs/share/cloudSettings.json +++ b/GridboxConnectorAddon-dev/rootfs/share/cloudSettings.json @@ -1,5 +1,5 @@ { - "version": "2.11.16", + "version": "2.11.17", "urls": { "login": "https://gridx.eu.auth0.com/oauth/token", "gateways": "https://api.gridx.de/gateways", diff --git a/GridboxConnectorAddon-edge/CHANGELOG.md b/GridboxConnectorAddon-edge/CHANGELOG.md index 8985174..f0ea748 100644 --- a/GridboxConnectorAddon-edge/CHANGELOG.md +++ b/GridboxConnectorAddon-edge/CHANGELOG.md @@ -1,10 +1,11 @@ -## 2.11.16 +## 2.11.17 ### 🔨 Fixed - Worked on create new device and fixed hopefully +- Removed Telemetry ## 2.11.11 diff --git a/GridboxConnectorAddon-edge/GridboxConnector/__main__.py b/GridboxConnectorAddon-edge/GridboxConnector/__main__.py index 17aacb8..224989c 100644 --- a/GridboxConnectorAddon-edge/GridboxConnector/__main__.py +++ b/GridboxConnectorAddon-edge/GridboxConnector/__main__.py @@ -7,7 +7,6 @@ import logging from importlib.resources import files from utils import SensitiveDataFilter, get_bool_env -from telemetry import Telemetry import threading opens_file_path = '/data/options.json' #logging.basicConfig(format='%(asctime)s %(filename)s:%(lineno)d %(levelname)s - %(message)s', level=logging.getLevelName(os.getenv('LOG_LEVEL', 'INFO'))) @@ -141,6 +140,5 @@ def run_addon(): threading.Thread(target=start_historical_thread, args=(gridboxConnector, viessmann_gridbox_historical_device, WAIT)).start() if __name__ == '__main__': - #telemetry = run_telemetry() run_addon() #run_test_log() \ No newline at end of file diff --git a/GridboxConnectorAddon-edge/GridboxConnector/requirements.txt b/GridboxConnectorAddon-edge/GridboxConnector/requirements.txt index faa4e89..bf0f665 100644 --- a/GridboxConnectorAddon-edge/GridboxConnector/requirements.txt +++ b/GridboxConnectorAddon-edge/GridboxConnector/requirements.txt @@ -1,8 +1,3 @@ ha-mqtt-discoverable==0.16.0 requests==2.32.2 viessmann-gridbox-connector==1.6.0 -opentelemetry-api -opentelemetry-sdk -opentelemetry-exporter-otlp-proto-grpc -opentelemetry-instrumentation-requests -opentelemetry-instrumentation-logging diff --git a/GridboxConnectorAddon-edge/GridboxConnector/telemetry.py b/GridboxConnectorAddon-edge/GridboxConnector/telemetry.py deleted file mode 100644 index 5e40e73..0000000 --- a/GridboxConnectorAddon-edge/GridboxConnector/telemetry.py +++ /dev/null @@ -1,92 +0,0 @@ -import logging -import requests -import uuid -from opentelemetry import trace -from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import BatchSpanProcessor -from opentelemetry.instrumentation.requests import RequestsInstrumentor -from opentelemetry.instrumentation.logging import LoggingInstrumentor -from opentelemetry.sdk.resources import Resource -from opentelemetry.semconv.resource import ResourceAttributes - -from opentelemetry.sdk._logs.export import BatchLogRecordProcessor -from opentelemetry._logs import set_logger_provider -from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter -from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler - -class Telemetry: - def __init__(self, collector_endpoint, service_name): - self.service_instance_id = str(uuid.uuid4()) - self.resource = Resource(attributes={ - ResourceAttributes.SERVICE_NAME: service_name, - ResourceAttributes.SERVICE_INSTANCE_ID: self.service_instance_id - }) - - # Instrument the logging module - LoggingInstrumentor().instrument(set_logging_format=True, log_level=logging.DEBUG) - # Set up logging - logging.basicConfig(level=logging.DEBUG) - - # Set up the tracer provider and exporter - trace.set_tracer_provider(TracerProvider(resource=self.resource)) - self.tracer = trace.get_tracer(__name__) - - # Set up the OTLP exporter - otlp_exporter = OTLPSpanExporter(endpoint=collector_endpoint, insecure=True) - span_processor = BatchSpanProcessor(otlp_exporter) - trace.get_tracer_provider().add_span_processor(span_processor) - - # Instrument the requests library - RequestsInstrumentor().instrument() - - # Create and set the logger provider - logger_provider = LoggerProvider(resource=self.resource) - set_logger_provider(logger_provider) - - exporter = OTLPLogExporter(endpoint=collector_endpoint, insecure=True) - logger_provider.add_log_record_processor(BatchLogRecordProcessor(exporter)) - handler = LoggingHandler(level=logging.DEBUG, logger_provider=logger_provider) - - # Attach OTLP handler to root logger - logging.getLogger().addHandler(handler) - self.logger = logging.getLogger("telemetry") - - def log_as_span(self, message, level=logging.INFO): - with self.tracer.start_as_current_span("logging") as span: - if level == logging.DEBUG: - self.logger.debug(message) - elif level == logging.INFO: - self.logger.info(message) - elif level == logging.WARNING: - self.logger.warning(message) - elif level == logging.ERROR: - self.logger.error(message) - elif level == logging.CRITICAL: - self.logger.critical(message) - span.add_event("log_event", {"message": message, "level": level}) - - def make_request(self, url): - try: - with self.tracer.start_as_current_span("http_request") as span: - response = requests.get(url) - self.logger.info(f"Received response: {response.status_code}") - span.add_event("Received response", {"status_code": response.status_code, "body": response.text}) - return response - except Exception as e: - self.logger.exception(f"Exception during request: {e}") - raise - -def main(): - collector_endpoint = "https://otel.helming.xyz" - service_name = "test_telemetry" - telemetry = Telemetry(collector_endpoint, service_name) - telemetry.log_as_span("This is a test log message", level=logging.INFO) - try: - response = telemetry.make_request("https://httpbin.org/get") - telemetry.log_as_span(f"Request successful with status code: {response.status_code}", level=logging.INFO) - except Exception as e: - telemetry.log_as_span(f"Request failed with exception: {e}", level=logging.ERROR) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/GridboxConnectorAddon-edge/cloudSettings.json b/GridboxConnectorAddon-edge/cloudSettings.json index 77ebb5e..2b4935b 100644 --- a/GridboxConnectorAddon-edge/cloudSettings.json +++ b/GridboxConnectorAddon-edge/cloudSettings.json @@ -1,5 +1,5 @@ { - "version": "2.11.16", + "version": "2.11.17", "urls": { "login": "https://gridx.eu.auth0.com/oauth/token", "gateways": "https://api.gridx.de/gateways", diff --git a/GridboxConnectorAddon-edge/config.yaml b/GridboxConnectorAddon-edge/config.yaml index 9ee3499..bfe038c 100644 --- a/GridboxConnectorAddon-edge/config.yaml +++ b/GridboxConnectorAddon-edge/config.yaml @@ -1,7 +1,7 @@ # https://developers.home-assistant.io/docs/add-ons/configuration#add-on-config --- name: Viessmann Gridbox Connector (edge) -version: "2.11.16" +version: "2.11.17" slug: "gridbox_connector_edge" description: "Viessmann Gridbox Connector (edge)" url: "https://github.com/unl0ck/homeassistant-addon-viessmann-gridbox/tree/main/GridboxConnectorAddon-edge" @@ -23,7 +23,6 @@ options: password: "password" wait_time: 60 log_level: INFO - enable_telemetry: false schema: username: str @@ -34,7 +33,5 @@ schema: OverrideMqttServer: str? OverrideMqttPort: int? log_level: list(TRACE|DEBUG|INFO|WARN|ERROR) - enable_telemetry: bool - OverrideTelemetryUrl: url? image: ghcr.io/unl0ck/homeassistant-addon-viessmann-gridbox-edge-{arch} stage: experimental diff --git a/GridboxConnectorAddon-edge/rootfs/share/cloudSettings.json b/GridboxConnectorAddon-edge/rootfs/share/cloudSettings.json index 77ebb5e..2b4935b 100644 --- a/GridboxConnectorAddon-edge/rootfs/share/cloudSettings.json +++ b/GridboxConnectorAddon-edge/rootfs/share/cloudSettings.json @@ -1,5 +1,5 @@ { - "version": "2.11.16", + "version": "2.11.17", "urls": { "login": "https://gridx.eu.auth0.com/oauth/token", "gateways": "https://api.gridx.de/gateways", diff --git a/GridboxConnectorAddon/CHANGELOG.md b/GridboxConnectorAddon/CHANGELOG.md index 8985174..f0ea748 100644 --- a/GridboxConnectorAddon/CHANGELOG.md +++ b/GridboxConnectorAddon/CHANGELOG.md @@ -1,10 +1,11 @@ -## 2.11.16 +## 2.11.17 ### 🔨 Fixed - Worked on create new device and fixed hopefully +- Removed Telemetry ## 2.11.11 diff --git a/GridboxConnectorAddon/GridboxConnector/__main__.py b/GridboxConnectorAddon/GridboxConnector/__main__.py index 17aacb8..224989c 100644 --- a/GridboxConnectorAddon/GridboxConnector/__main__.py +++ b/GridboxConnectorAddon/GridboxConnector/__main__.py @@ -7,7 +7,6 @@ import logging from importlib.resources import files from utils import SensitiveDataFilter, get_bool_env -from telemetry import Telemetry import threading opens_file_path = '/data/options.json' #logging.basicConfig(format='%(asctime)s %(filename)s:%(lineno)d %(levelname)s - %(message)s', level=logging.getLevelName(os.getenv('LOG_LEVEL', 'INFO'))) @@ -141,6 +140,5 @@ def run_addon(): threading.Thread(target=start_historical_thread, args=(gridboxConnector, viessmann_gridbox_historical_device, WAIT)).start() if __name__ == '__main__': - #telemetry = run_telemetry() run_addon() #run_test_log() \ No newline at end of file diff --git a/GridboxConnectorAddon/GridboxConnector/requirements.txt b/GridboxConnectorAddon/GridboxConnector/requirements.txt index 959dd06..bf0f665 100644 --- a/GridboxConnectorAddon/GridboxConnector/requirements.txt +++ b/GridboxConnectorAddon/GridboxConnector/requirements.txt @@ -1,8 +1,3 @@ -ha-mqtt-discoverable==0.13.1 +ha-mqtt-discoverable==0.16.0 requests==2.32.2 -viessmann-gridbox-connector==1.5.1 -opentelemetry-api -opentelemetry-sdk -opentelemetry-exporter-otlp-proto-grpc -opentelemetry-instrumentation-requests -opentelemetry-instrumentation-logging +viessmann-gridbox-connector==1.6.0 diff --git a/GridboxConnectorAddon/GridboxConnector/telemetry.py b/GridboxConnectorAddon/GridboxConnector/telemetry.py deleted file mode 100644 index 5e40e73..0000000 --- a/GridboxConnectorAddon/GridboxConnector/telemetry.py +++ /dev/null @@ -1,92 +0,0 @@ -import logging -import requests -import uuid -from opentelemetry import trace -from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import BatchSpanProcessor -from opentelemetry.instrumentation.requests import RequestsInstrumentor -from opentelemetry.instrumentation.logging import LoggingInstrumentor -from opentelemetry.sdk.resources import Resource -from opentelemetry.semconv.resource import ResourceAttributes - -from opentelemetry.sdk._logs.export import BatchLogRecordProcessor -from opentelemetry._logs import set_logger_provider -from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter -from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler - -class Telemetry: - def __init__(self, collector_endpoint, service_name): - self.service_instance_id = str(uuid.uuid4()) - self.resource = Resource(attributes={ - ResourceAttributes.SERVICE_NAME: service_name, - ResourceAttributes.SERVICE_INSTANCE_ID: self.service_instance_id - }) - - # Instrument the logging module - LoggingInstrumentor().instrument(set_logging_format=True, log_level=logging.DEBUG) - # Set up logging - logging.basicConfig(level=logging.DEBUG) - - # Set up the tracer provider and exporter - trace.set_tracer_provider(TracerProvider(resource=self.resource)) - self.tracer = trace.get_tracer(__name__) - - # Set up the OTLP exporter - otlp_exporter = OTLPSpanExporter(endpoint=collector_endpoint, insecure=True) - span_processor = BatchSpanProcessor(otlp_exporter) - trace.get_tracer_provider().add_span_processor(span_processor) - - # Instrument the requests library - RequestsInstrumentor().instrument() - - # Create and set the logger provider - logger_provider = LoggerProvider(resource=self.resource) - set_logger_provider(logger_provider) - - exporter = OTLPLogExporter(endpoint=collector_endpoint, insecure=True) - logger_provider.add_log_record_processor(BatchLogRecordProcessor(exporter)) - handler = LoggingHandler(level=logging.DEBUG, logger_provider=logger_provider) - - # Attach OTLP handler to root logger - logging.getLogger().addHandler(handler) - self.logger = logging.getLogger("telemetry") - - def log_as_span(self, message, level=logging.INFO): - with self.tracer.start_as_current_span("logging") as span: - if level == logging.DEBUG: - self.logger.debug(message) - elif level == logging.INFO: - self.logger.info(message) - elif level == logging.WARNING: - self.logger.warning(message) - elif level == logging.ERROR: - self.logger.error(message) - elif level == logging.CRITICAL: - self.logger.critical(message) - span.add_event("log_event", {"message": message, "level": level}) - - def make_request(self, url): - try: - with self.tracer.start_as_current_span("http_request") as span: - response = requests.get(url) - self.logger.info(f"Received response: {response.status_code}") - span.add_event("Received response", {"status_code": response.status_code, "body": response.text}) - return response - except Exception as e: - self.logger.exception(f"Exception during request: {e}") - raise - -def main(): - collector_endpoint = "https://otel.helming.xyz" - service_name = "test_telemetry" - telemetry = Telemetry(collector_endpoint, service_name) - telemetry.log_as_span("This is a test log message", level=logging.INFO) - try: - response = telemetry.make_request("https://httpbin.org/get") - telemetry.log_as_span(f"Request successful with status code: {response.status_code}", level=logging.INFO) - except Exception as e: - telemetry.log_as_span(f"Request failed with exception: {e}", level=logging.ERROR) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/GridboxConnectorAddon/cloudSettings.json b/GridboxConnectorAddon/cloudSettings.json index 77ebb5e..2b4935b 100644 --- a/GridboxConnectorAddon/cloudSettings.json +++ b/GridboxConnectorAddon/cloudSettings.json @@ -1,5 +1,5 @@ { - "version": "2.11.16", + "version": "2.11.17", "urls": { "login": "https://gridx.eu.auth0.com/oauth/token", "gateways": "https://api.gridx.de/gateways", diff --git a/GridboxConnectorAddon/config.yaml b/GridboxConnectorAddon/config.yaml index 9877b08..3ef0a99 100644 --- a/GridboxConnectorAddon/config.yaml +++ b/GridboxConnectorAddon/config.yaml @@ -1,6 +1,6 @@ # https://developers.home-assistant.io/docs/add-ons/configuration#add-on-config name: Viessmann Gridbox Connector -version: "2.11.16" +version: "2.11.17" slug: "gridbox_connector" description: Fetch your live data from your Viessmann Gridbox url: "https://github.com/unl0ck/homeassistant-addon-viessmann-gridbox/tree/main/GridboxConnectorAddon" diff --git a/GridboxConnectorAddon/rootfs/share/cloudSettings.json b/GridboxConnectorAddon/rootfs/share/cloudSettings.json index 77ebb5e..2b4935b 100644 --- a/GridboxConnectorAddon/rootfs/share/cloudSettings.json +++ b/GridboxConnectorAddon/rootfs/share/cloudSettings.json @@ -1,5 +1,5 @@ { - "version": "2.11.16", + "version": "2.11.17", "urls": { "login": "https://gridx.eu.auth0.com/oauth/token", "gateways": "https://api.gridx.de/gateways",