From 6582025c1528e8b30c0ace82e86da942293af0d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lange?= Date: Fri, 27 Nov 2020 17:06:37 +0000 Subject: [PATCH] Initial contribution of the Miele Cloud binding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also-by: Bert Plonus Also-by: Martin Lepsy Also-by: Benjamin Bolte Signed-off-by: Björn Lange --- CODEOWNERS | 1 + bom/openhab-addons/pom.xml | 5 + bundles/org.openhab.binding.mielecloud/NOTICE | 13 + .../org.openhab.binding.mielecloud/README.md | 648 + .../doc/account-overview-empty.png | Bin 0 -> 50757 bytes .../doc/account-overview-with-bridge.png | Bin 0 -> 80119 bytes .../doc/miele-login.png | Bin 0 -> 16608 bytes .../doc/miele.png | Bin 0 -> 10975 bytes .../doc/pair-account.png | Bin 0 -> 73777 bytes .../doc/pairing-success.png | Bin 0 -> 84583 bytes .../org.openhab.binding.mielecloud/pom.xml | 16 + .../src/main/feature/feature.xml | 23 + .../internal/MieleCloudBindingConstants.java | 229 + .../internal/auth/OAuthException.java | 33 + .../auth/OAuthTokenRefreshListener.java | 30 + .../internal/auth/OAuthTokenRefresher.java | 74 + .../auth/OpenHabOAuthTokenRefresher.java | 153 + .../config/MieleCloudConfigService.java | 296 + .../config/OAuthAuthorizationHandler.java | 74 + .../config/OAuthAuthorizationHandlerImpl.java | 197 + .../config/ThingsTemplateGenerator.java | 86 + .../BridgeCreationFailedException.java | 25 + .../BridgeReconfigurationFailedException.java | 29 + .../NoOngoingAuthorizationException.java | 29 + .../OngoingAuthorizationException.java | 50 + .../servlet/AbstractRedirectionServlet.java | 62 + .../servlet/AbstractShowPageServlet.java | 94 + .../servlet/AccountOverviewServlet.java | 180 + .../config/servlet/CreateBridgeServlet.java | 194 + .../config/servlet/FailureServlet.java | 107 + .../config/servlet/ForwardToLoginServlet.java | 132 + .../config/servlet/MieleHttpException.java | 35 + .../config/servlet/PairAccountServlet.java | 112 + .../config/servlet/ResourceLoader.java | 86 + .../config/servlet/ResultServlet.java | 91 + .../internal/config/servlet/ServletUtil.java | 57 + .../config/servlet/SuccessServlet.java | 200 + .../discovery/ThingDiscoveryService.java | 202 + .../handler/AbstractMieleThingHandler.java | 291 + .../handler/CoffeeSystemThingHandler.java | 75 + .../handler/CoolingDeviceThingHandler.java | 91 + .../handler/DishWarmerDeviceThingHandler.java | 88 + .../handler/DishwasherDeviceThingHandler.java | 75 + .../handler/DryerDeviceThingHandler.java | 79 + .../handler/HobDeviceThingHandler.java | 77 + .../handler/HoodDeviceThingHandler.java | 73 + .../internal/handler/MieleBridgeHandler.java | 359 + .../internal/handler/MieleHandlerFactory.java | 212 + .../handler/OvenDeviceThingHandler.java | 81 + ...oboticVacuumCleanerDeviceThingHandler.java | 86 + .../handler/WashingDeviceThingHandler.java | 80 + .../WineStorageDeviceThingHandler.java | 75 + .../handler/channel/ActionsChannelState.java | 68 + .../handler/channel/ChannelTypeUtil.java | 63 + .../handler/channel/DeviceChannelState.java | 273 + .../channel/TransitionChannelState.java | 47 + .../internal/util/LocaleValidator.java | 45 + .../internal/util/OptionalUtils.java | 34 + .../webservice/ActionStateFetcher.java | 81 + .../internal/webservice/ConnectionError.java | 35 + .../webservice/ConnectionStatusListener.java | 36 + .../webservice/DefaultMieleWebservice.java | 354 + .../DefaultMieleWebserviceFactory.java | 28 + .../internal/webservice/DeviceCache.java | 50 + .../webservice/DeviceStateDispatcher.java | 109 + .../webservice/DeviceStateListener.java | 46 + .../internal/webservice/HttpUtil.java | 94 + .../internal/webservice/MieleWebservice.java | 142 + .../MieleWebserviceConfiguration.java | 135 + .../webservice/MieleWebserviceFactory.java | 31 + .../UnavailableMieleWebservice.java | 118 + .../internal/webservice/api/ActionsState.java | 174 + .../api/CoolingDeviceTemperatureState.java | 103 + .../internal/webservice/api/DeviceState.java | 561 + .../internal/webservice/api/PowerStatus.java | 50 + .../webservice/api/ProgramStatus.java | 50 + .../webservice/api/TransitionState.java | 148 + .../WineStorageDeviceTemperatureState.java | 208 + .../internal/webservice/api/json/Actions.java | 138 + .../internal/webservice/api/json/Device.java | 66 + .../webservice/api/json/DeviceCollection.java | 97 + .../webservice/api/json/DeviceIdentLabel.java | 93 + .../webservice/api/json/DeviceType.java | 129 + .../webservice/api/json/DryingStep.java | 79 + .../webservice/api/json/ErrorMessage.java | 77 + .../internal/webservice/api/json/Ident.java | 80 + .../internal/webservice/api/json/Light.java | 74 + .../api/json/MieleSyntaxException.java | 34 + .../webservice/api/json/PlateStep.java | 79 + .../webservice/api/json/ProcessAction.java | 51 + .../webservice/api/json/ProgramId.java | 79 + .../webservice/api/json/ProgramPhase.java | 79 + .../webservice/api/json/ProgramType.java | 79 + .../webservice/api/json/RemoteEnable.java | 66 + .../webservice/api/json/SpinningSpeed.java | 78 + .../internal/webservice/api/json/State.java | 239 + .../webservice/api/json/StateType.java | 71 + .../internal/webservice/api/json/Status.java | 79 + .../webservice/api/json/Temperature.java | 78 + .../internal/webservice/api/json/Type.java | 79 + .../webservice/api/json/VentilationStep.java | 79 + .../webservice/api/json/XkmIdentLabel.java | 66 + .../AuthorizationFailedException.java | 29 + ...MieleWebserviceDisconnectSseException.java | 25 + .../exception/MieleWebserviceException.java | 45 + ...ieleWebserviceInitializationException.java | 29 + .../MieleWebserviceTransientException.java | 43 + .../exception/TooManyRequestsException.java | 84 + .../language/CombiningLanguageProvider.java | 74 + .../language/JvmLanguageProvider.java | 32 + .../webservice/language/LanguageProvider.java | 32 + .../language/OpenHabLanguageProvider.java | 37 + .../webservice/request/RequestFactory.java | 64 + .../request/RequestFactoryImpl.java | 113 + .../AuthorizationFailedRetryStrategy.java | 92 + .../webservice/retry/NTimesRetryStrategy.java | 72 + .../webservice/retry/RetryStrategy.java | 63 + .../retry/RetryStrategyCombiner.java | 47 + .../webservice/sse/BackoffStrategy.java | 31 + .../sse/ExponentialBackoffWithJitter.java | 91 + .../webservice/sse/ServerSentEvent.java | 62 + .../webservice/sse/SseConnection.java | 241 + .../internal/webservice/sse/SseListener.java | 39 + .../webservice/sse/SseRequestFactory.java | 36 + .../webservice/sse/SseStreamParser.java | 105 + .../main/resources/OH-INF/binding/binding.xml | 9 + .../OH-INF/config/configDescription.xml | 6 + .../OH-INF/i18n/mielecloud.properties | 248 + .../main/resources/OH-INF/thing/bridge.xml | 28 + .../resources/OH-INF/thing/channelTypes.xml | 455 + .../resources/OH-INF/thing/coffeeSystem.xml | 45 + .../OH-INF/thing/dishWarmerDevice.xml | 43 + .../OH-INF/thing/dishwasherDevice.xml | 46 + .../resources/OH-INF/thing/dryerDevice.xml | 50 + .../main/resources/OH-INF/thing/freezer.xml | 36 + .../main/resources/OH-INF/thing/fridge.xml | 36 + .../resources/OH-INF/thing/fridgeFreezer.xml | 40 + .../main/resources/OH-INF/thing/hobDevice.xml | 48 + .../resources/OH-INF/thing/hoodDevice.xml | 40 + .../resources/OH-INF/thing/ovenDevice.xml | 51 + .../thing/roboticVacuumCleanerDevice.xml | 41 + .../resources/OH-INF/thing/washerDryer.xml | 53 + .../resources/OH-INF/thing/washingMachine.xml | 51 + .../OH-INF/thing/wineStorageDevice.xml | 43 + .../internal/config/assets/css/main.css | 15023 +++++++++++++ .../internal/config/assets/css/main.min.css | 6 + .../internal/config/assets/css/rtl.css | 10 + .../config/assets/img/OpenHAB_logo.svg | 1 + .../internal/config/assets/img/favicon.ico | Bin 0 -> 32038 bytes .../internal/config/assets/img/miele.png | Bin 0 -> 34870 bytes .../internal/config/assets/js/main.js | 17768 ++++++++++++++++ .../internal/config/assets/js/main.js.map | 1 + .../internal/config/assets/js/main.min.js | 1 + .../mielecloud/internal/config/failure.html | 48 + .../mielecloud/internal/config/index.html | 51 + .../mielecloud/internal/config/pairing.html | 67 + .../mielecloud/internal/config/success.html | 89 + .../MieleCloudBindingTestConstants.java | 30 + .../auth/OpenHabOAuthTokenRefresherTest.java | 363 + .../OAuthAuthorizationHandlerImplTest.java | 329 + .../config/ThingsTemplateGeneratorTest.java | 221 + .../internal/util/LocaleValidatorTest.java | 72 + .../mielecloud/internal/util/MockUtil.java | 94 + .../internal/util/ReflectionUtil.java | 142 + .../internal/util/ResourceUtil.java | 46 + .../webservice/ActionStateFetcherTest.java | 177 + .../DefaultMieleWebserviceTest.java | 757 + .../internal/webservice/DeviceCacheTest.java | 94 + .../webservice/DeviceStateDispatcherTest.java | 257 + .../internal/webservice/HttpUtilTest.java | 50 + .../webservice/RequestFactoryImplTest.java | 241 + .../webservice/api/ActionsStateTest.java | 299 + .../CoolingDeviceTemperatureStateTest.java | 144 + .../webservice/api/DeviceStateTest.java | 2130 ++ .../webservice/api/TransitionStateTest.java | 576 + ...WineStorageDeviceTemperatureStateTest.java | 455 + .../webservice/api/json/ActionsTest.java | 103 + .../api/json/DeviceCollectionTest.java | 290 + .../api/json/DeviceIdentLabelTest.java | 41 + .../webservice/api/json/ErrorMessageTest.java | 48 + .../webservice/api/json/LightTest.java | 69 + .../webservice/api/json/StateTest.java | 90 + .../webservice/api/json/StatusTest.java | 56 + .../webservice/api/json/TypeTest.java | 56 + .../TooManyRequestsExceptionTest.java | 108 + .../CombiningLanguageProviderTest.java | 98 + .../language/OpenHabLanguageProviderTest.java | 74 + .../AuthorizationFailedRetryStrategyTest.java | 203 + .../retry/NTimesRetryStrategyTest.java | 220 + .../retry/RetryStrategyCombinerTest.java | 97 + .../sse/ExponentialBackoffWithJitterTest.java | 202 + .../webservice/sse/SseConnectionTest.java | 579 + .../webservice/sse/SseStreamParserTest.java | 182 + .../webservice/api/json/deviceCollection.json | 123 + ...ionWithFloatingPointTargetTemperature.json | 13 + .../deviceCollectionWithLargeProgramID.json | 73 + ...viceCollectionWithSpinningSpeedObject.json | 11 + .../api/json/invalidDeviceCollection.json | 73 + bundles/pom.xml | 549 +- .../NOTICE | 13 + .../itest.bndrun | 81 + .../pom.xml | 25 + .../internal/config/ConfigFlowTest.java | 128 + .../servlet/AccountOverviewServletTest.java | 101 + .../servlet/CreateBridgeServletTest.java | 228 + .../servlet/ForwardToLoginServletTest.java | 201 + .../servlet/PairAccountServletTest.java | 53 + .../config/servlet/ResultServletTest.java | 190 + .../config/servlet/SuccessServletTest.java | 107 + .../discovery/ThingDiscoveryTest.java | 399 + .../AbstractMieleThingHandlerTest.java | 547 + .../handler/CoffeeDeviceThingHandlerTest.java | 210 + .../CoolingDeviceThingHandlerTest.java | 249 + .../DishWarmerDeviceThingHandlerTest.java | 230 + .../DishwasherDeviceThingHandlerTest.java | 226 + .../handler/DryerDeviceThingHandlerTest.java | 240 + .../handler/HobDeviceThingHandlerTest.java | 140 + .../handler/HoodDeviceThingHandlerTest.java | 130 + .../handler/MieleBridgeHandlerTest.java | 543 + .../handler/MieleHandlerFactoryTest.java | 352 + .../handler/OvenDeviceThingHandlerTest.java | 245 + ...icVacuumCleanerDeviceThingHandlerTest.java | 169 + .../WashingDeviceThingHandlerTest.java | 245 + .../WineStorageDeviceThingHandlerTest.java | 139 + .../internal/util/AbstractConfigFlowTest.java | 113 + ...eCloudBindingIntegrationTestConstants.java | 70 + .../internal/util/OpenHabOsgiTest.java | 97 + .../internal/util/ReflectionUtil.java | 167 + .../mielecloud/internal/util/Website.java | 113 + .../internal/util/WebsiteCrawler.java | 47 + itests/pom.xml | 1 + 231 files changed, 61998 insertions(+), 13 deletions(-) create mode 100644 bundles/org.openhab.binding.mielecloud/NOTICE create mode 100644 bundles/org.openhab.binding.mielecloud/README.md create mode 100644 bundles/org.openhab.binding.mielecloud/doc/account-overview-empty.png create mode 100644 bundles/org.openhab.binding.mielecloud/doc/account-overview-with-bridge.png create mode 100644 bundles/org.openhab.binding.mielecloud/doc/miele-login.png create mode 100644 bundles/org.openhab.binding.mielecloud/doc/miele.png create mode 100644 bundles/org.openhab.binding.mielecloud/doc/pair-account.png create mode 100644 bundles/org.openhab.binding.mielecloud/doc/pairing-success.png create mode 100644 bundles/org.openhab.binding.mielecloud/pom.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/feature/feature.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/MieleCloudBindingConstants.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/auth/OAuthException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/auth/OAuthTokenRefreshListener.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/auth/OAuthTokenRefresher.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/auth/OpenHabOAuthTokenRefresher.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/MieleCloudConfigService.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/OAuthAuthorizationHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/OAuthAuthorizationHandlerImpl.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/ThingsTemplateGenerator.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/exception/BridgeCreationFailedException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/exception/BridgeReconfigurationFailedException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/exception/NoOngoingAuthorizationException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/exception/OngoingAuthorizationException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/AbstractRedirectionServlet.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/AbstractShowPageServlet.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/AccountOverviewServlet.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/CreateBridgeServlet.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/FailureServlet.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/ForwardToLoginServlet.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/MieleHttpException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/PairAccountServlet.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/ResourceLoader.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/ResultServlet.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/ServletUtil.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/SuccessServlet.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/discovery/ThingDiscoveryService.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/AbstractMieleThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/CoffeeSystemThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/CoolingDeviceThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/DishWarmerDeviceThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/DishwasherDeviceThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/DryerDeviceThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/HobDeviceThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/HoodDeviceThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/MieleBridgeHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/MieleHandlerFactory.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/OvenDeviceThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/RoboticVacuumCleanerDeviceThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/WashingDeviceThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/WineStorageDeviceThingHandler.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/channel/ActionsChannelState.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/channel/ChannelTypeUtil.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/channel/DeviceChannelState.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/handler/channel/TransitionChannelState.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/util/LocaleValidator.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/util/OptionalUtils.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/ActionStateFetcher.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/ConnectionError.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/ConnectionStatusListener.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/DefaultMieleWebservice.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/DefaultMieleWebserviceFactory.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/DeviceCache.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/DeviceStateDispatcher.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/DeviceStateListener.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/HttpUtil.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/MieleWebservice.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/MieleWebserviceConfiguration.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/MieleWebserviceFactory.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/UnavailableMieleWebservice.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/ActionsState.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/CoolingDeviceTemperatureState.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/DeviceState.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/PowerStatus.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/ProgramStatus.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/TransitionState.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/WineStorageDeviceTemperatureState.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/Actions.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/Device.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/DeviceCollection.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/DeviceIdentLabel.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/DeviceType.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/DryingStep.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/ErrorMessage.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/Ident.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/Light.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/MieleSyntaxException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/PlateStep.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/ProcessAction.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/ProgramId.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/ProgramPhase.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/ProgramType.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/RemoteEnable.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/SpinningSpeed.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/State.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/StateType.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/Status.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/Temperature.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/Type.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/VentilationStep.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/api/json/XkmIdentLabel.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/exception/AuthorizationFailedException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/exception/MieleWebserviceDisconnectSseException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/exception/MieleWebserviceException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/exception/MieleWebserviceInitializationException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/exception/MieleWebserviceTransientException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/exception/TooManyRequestsException.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/language/CombiningLanguageProvider.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/language/JvmLanguageProvider.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/language/LanguageProvider.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/language/OpenHabLanguageProvider.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/request/RequestFactory.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/request/RequestFactoryImpl.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/retry/AuthorizationFailedRetryStrategy.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/retry/NTimesRetryStrategy.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/retry/RetryStrategy.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/retry/RetryStrategyCombiner.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/sse/BackoffStrategy.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/sse/ExponentialBackoffWithJitter.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/sse/ServerSentEvent.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/sse/SseConnection.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/sse/SseListener.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/sse/SseRequestFactory.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/java/org/openhab/binding/mielecloud/internal/webservice/sse/SseStreamParser.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/binding/binding.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/config/configDescription.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/i18n/mielecloud.properties create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/bridge.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/channelTypes.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/coffeeSystem.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/dishWarmerDevice.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/dishwasherDevice.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/dryerDevice.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/freezer.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/fridge.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/fridgeFreezer.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/hobDevice.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/hoodDevice.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/ovenDevice.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/roboticVacuumCleanerDevice.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/washerDryer.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/washingMachine.xml create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/OH-INF/thing/wineStorageDevice.xml create mode 100755 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/assets/css/main.css create mode 100755 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/assets/css/main.min.css create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/assets/css/rtl.css create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/assets/img/OpenHAB_logo.svg create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/assets/img/favicon.ico create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/assets/img/miele.png create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/assets/js/main.js create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/assets/js/main.js.map create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/assets/js/main.min.js create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/failure.html create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/index.html create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/pairing.html create mode 100644 bundles/org.openhab.binding.mielecloud/src/main/resources/org/openhab/binding/mielecloud/internal/config/success.html create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/MieleCloudBindingTestConstants.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/auth/OpenHabOAuthTokenRefresherTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/config/OAuthAuthorizationHandlerImplTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/config/ThingsTemplateGeneratorTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/util/LocaleValidatorTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/util/MockUtil.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/util/ReflectionUtil.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/util/ResourceUtil.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/ActionStateFetcherTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/DefaultMieleWebserviceTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/DeviceCacheTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/DeviceStateDispatcherTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/HttpUtilTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/RequestFactoryImplTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/ActionsStateTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/CoolingDeviceTemperatureStateTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/DeviceStateTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/TransitionStateTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/WineStorageDeviceTemperatureStateTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/json/ActionsTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/json/DeviceCollectionTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/json/DeviceIdentLabelTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/json/ErrorMessageTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/json/LightTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/json/StateTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/json/StatusTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/api/json/TypeTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/exception/TooManyRequestsExceptionTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/language/CombiningLanguageProviderTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/language/OpenHabLanguageProviderTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/retry/AuthorizationFailedRetryStrategyTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/retry/NTimesRetryStrategyTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/retry/RetryStrategyCombinerTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/sse/ExponentialBackoffWithJitterTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/sse/SseConnectionTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/java/org/openhab/binding/mielecloud/internal/webservice/sse/SseStreamParserTest.java create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/resources/org/openhab/binding/mielecloud/internal/webservice/api/json/deviceCollection.json create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/resources/org/openhab/binding/mielecloud/internal/webservice/api/json/deviceCollectionWithFloatingPointTargetTemperature.json create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/resources/org/openhab/binding/mielecloud/internal/webservice/api/json/deviceCollectionWithLargeProgramID.json create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/resources/org/openhab/binding/mielecloud/internal/webservice/api/json/deviceCollectionWithSpinningSpeedObject.json create mode 100644 bundles/org.openhab.binding.mielecloud/src/test/resources/org/openhab/binding/mielecloud/internal/webservice/api/json/invalidDeviceCollection.json create mode 100644 itests/org.openhab.binding.mielecloud.tests/NOTICE create mode 100644 itests/org.openhab.binding.mielecloud.tests/itest.bndrun create mode 100644 itests/org.openhab.binding.mielecloud.tests/pom.xml create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/config/ConfigFlowTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/AccountOverviewServletTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/CreateBridgeServletTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/ForwardToLoginServletTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/PairAccountServletTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/ResultServletTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/config/servlet/SuccessServletTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/discovery/ThingDiscoveryTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/AbstractMieleThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/CoffeeDeviceThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/CoolingDeviceThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/DishWarmerDeviceThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/DishwasherDeviceThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/DryerDeviceThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/HobDeviceThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/HoodDeviceThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/MieleBridgeHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/MieleHandlerFactoryTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/OvenDeviceThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/RoboticVacuumCleanerDeviceThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/WashingDeviceThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/handler/WineStorageDeviceThingHandlerTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/util/AbstractConfigFlowTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/util/MieleCloudBindingIntegrationTestConstants.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/util/OpenHabOsgiTest.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/util/ReflectionUtil.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/util/Website.java create mode 100644 itests/org.openhab.binding.mielecloud.tests/src/main/java/org/openhab/binding/mielecloud/internal/util/WebsiteCrawler.java diff --git a/CODEOWNERS b/CODEOWNERS index 9379686ef47cf..af3747a262cd0 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -139,6 +139,7 @@ /bundles/org.openhab.binding.meteoblue/ @9037568 /bundles/org.openhab.binding.meteostick/ @cdjackson /bundles/org.openhab.binding.miele/ @kgoderis +/bundles/org.openhab.binding.mielecloud/ @BjoernLange /bundles/org.openhab.binding.mihome/ @pboos /bundles/org.openhab.binding.miio/ @marcelrv /bundles/org.openhab.binding.milight/ @davidgraeff diff --git a/bom/openhab-addons/pom.xml b/bom/openhab-addons/pom.xml index ea69d3c0c1039..b1494b15938af 100644 --- a/bom/openhab-addons/pom.xml +++ b/bom/openhab-addons/pom.xml @@ -686,6 +686,11 @@ org.openhab.binding.miele ${project.version} + + org.openhab.addons.bundles + org.openhab.binding.mielecloud + ${project.version} + org.openhab.addons.bundles org.openhab.binding.mihome diff --git a/bundles/org.openhab.binding.mielecloud/NOTICE b/bundles/org.openhab.binding.mielecloud/NOTICE new file mode 100644 index 0000000000000..38d625e349232 --- /dev/null +++ b/bundles/org.openhab.binding.mielecloud/NOTICE @@ -0,0 +1,13 @@ +This content is produced and maintained by the openHAB project. + +* Project home: https://www.openhab.org + +== Declared Project Licenses + +This program and the accompanying materials are made available under the terms +of the Eclipse Public License 2.0 which is available at +https://www.eclipse.org/legal/epl-2.0/. + +== Source Code + +https://github.com/openhab/openhab-addons diff --git a/bundles/org.openhab.binding.mielecloud/README.md b/bundles/org.openhab.binding.mielecloud/README.md new file mode 100644 index 0000000000000..7d5344d9881e5 --- /dev/null +++ b/bundles/org.openhab.binding.mielecloud/README.md @@ -0,0 +1,648 @@ +# Miele Cloud Binding + +![Miele](doc/miele.png) + +This binding integrates [Miele@home](https://www.miele.de/brand/smarthome-42801.htm) appliances via a cloud connection. +A Miele cloud account and a set of developer credentials is required to use the binding. +The latter can be requested from the [Miele Developer Portal](https://www.miele.com/f/com/en/register_api.aspx). + +## Supported Things + +Most Miele appliances that directly connect to the cloud via a Wi-Fi module are supported. +Appliances connecting to the XGW3000 gateway via ZigBee are also supported when registered with the cloud account. +However they might be better supported by the [gateway-based Miele binding](https://www.openhab.org/addons/bindings/miele/). +Depending on the age of your appliance the functionality of the binding might be limited. +Appliances from recent generations will support all functionality. + +The following types of appliances are supported: + +- Coffee Machine +- Dishwasher +- Dish Warmer +- Freezer +- Fridge +- Fridge-Freezer Combination +- Hob +- Hood +- Microwave Oven +- Oven +- Robotic Vacuum Cleaner +- Tumble Dryer +- Washer Dryer +- Washing Machine +- Wine Cabinet +- Wine Cabinet Freezer Combination + +## Discovery + +Please take the following steps prior to using the binding. Create a Miele cloud account in the Miele@mobile app for [Android](https://play.google.com/store/apps/details?id=de.miele.infocontrol&hl=en_US) or [iOS](https://apps.apple.com/de/app/miele-mobile/id930406907?l=en) (if not already done). +Afterwards, pair your appliances. +Once your appliances are set up, register at the [Miele Developer Portal](https://www.miele.com/f/com/en/register_api.aspx). +You will receive a pair of client ID and client secret which will be used to pair your Miele cloud account to the Miele cloud openHAB binding. +Keep these credentials to yourself and treat them like a password! +It may take some time until the registration e-mail arrives. + +There is no auto discovery for the Miele cloud account. +The account is paired using OAuth2 with your Miele login and the developer credentials obtained from the [Miele Developer Portal](https://www.miele.com/f/com/en/register_api.aspx). +To pair the account go to the binding's configuration UI at `https:///mielecloud`. +For a standard openHABian Pi installation the address is [https://openhabianpi:8443/mielecloud](https://openhabianpi:8443/mielecloud). +Note that your browser will file a warning that the certificate is self-signed. +This is fine and you can safely continue. +It is also possible to use an unsecured connection for pairing but it is strongly recommended to use a secured connection because your credentials will otherwise be transferred without encryption over the local network. +For more information on this topic, see [Securing access to openHAB](https://www.openhab.org/docs/installation/security.html#encrypted-communication). +For a detailed walk through the account configuration, see [Account Configuration Example](#account-configuration-example). + +Once a Miele account is paired, all supported appliances are automatically discovered as individual things and placed in the inbox. +They can then be paired with your favorite management UI, e.g. the PaperUI. +As an alternative, the binding configuration UI provides a things-file template per paired account that can be used to pair the appliances. + +## Thing Configuration + +A Miele cloud account needs to be configured to get access to your appliances. +After that appliances can be configured. + +### Account Configuration + +The Miele cloud account must be paired via the binding configuration UI before a bridge that relies on it can be configured in openHAB. +For details on the configuration UI see [Discovery](#discovery) and [Account Configuration Example](#account-configuration-example). +The account serves as a bridge for the things representing your appliances. +On success the configuration assistant will directly configure the account without requiring further actions. +As an alternative, it provides a things-file template. + +The account has the following parameters: + +| Name | Type | Description | Notes | +| ----------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | +| locale | mandatory | The locale to use for full text channels of things from this account. Possible values are `en`, `de`, `da`, `es`, `fr`, `it`, `nl`, `nb`. Default is `en`. | Prior to the 7th January 2021 `da`, `es`, `fr`, `it`, `nl` and `nb` will default to English. | + +Example things-file: +``` +Bridge mielecloud:account:home [ locale="en" ] +``` + +### Appliance Configuration + +The binding configuration UI will show a things-file template containing things for all supported appliances from the paired account. +This can be used as a starting point for a custom things-file. +All Miele cloud appliance things have no configuration parameters. + +Example things-file: +``` +Bridge mielecloud:account:home [ locale="en" ] { + Thing coffee_system 000703261234 "Coffee machine CVA7440" [ ] + Thing hob 000160102345 "Cooktop KM7677" [ ] + Thing washing_machine 000148503456 "Washing Machine WWV980" [ ] + Thing oven 000137434567 "Oven" [ ] + Thing fridge 007109235678 "Refrigerator K34483" [ ] + Thing dishwasher 000159456789 "Dishwasher G5000" [ ] + Thing fridge_freezer 711397890 "Fridge-freezer" [ ] + Thing dryer 000091098901 "Dryer" [ ] +} +``` + +## Channels + +The following table lists all available channels. +See the following chapters for detailed information about which appliance supports which channels. +Depending on the exact appliance configuration not all channels might be supported, e.g. a hob with four plates will only fill the channels for plates 1-4. + +| Channel Type ID | Item Type | Description | Read only | +| ----------------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | --------- | +| remote_control_can_be_started | Switch | Indicates if this device can be started remotely. | Yes | +| remote_control_can_be_stopped | Switch | Indicates if this device can be stopped remotely. | Yes | +| remote_control_can_be_paused | Switch | Indicates if this device can be paused remotely. | Yes | +| remote_control_can_be_switched_on | Switch | Indicates if the device can be switched on remotely. | Yes | +| remote_control_can_be_switched_off | Switch | Indicates if the device can be switched off remotely. | Yes | +| remote_control_can_set_program_active | Switch | Indicates if the active program of the device can be set remotely. | Yes | +| spinning_speed | String | The spinning speed of the active program. | Yes | +| spinning_speed_raw | Number | The raw spinning speed of the active program. | Yes | +| program_active | String | The active program of the device. | Yes | +| program_active_raw | Number | The raw active program of the device. | Yes | +| dish_warmer_program_active | String | The active program of the device. | No | +| vacuum_cleaner_program_active | String | The active program of the device. | No | +| program_phase | String | The phase of the active program. | Yes | +| program_phase_raw | Number | The raw phase of the active program. | Yes | +| operation_state | String | The operation state of the device. | Yes | +| operation_state_raw | Number | The raw operation state of the device. | Yes | +| program_start | Switch | Starts the currently selected program. | No | +| program_stop | Switch | Stops the currently selected program. | No | +| program_start_stop | String | Starts or stops the currently selected program. | No | +| program_start_stop_pause | String | Starts, stops or pauses the currently selected program. | No | +| power_state_on_off | String | Switches the device On or Off. | No | +| finish_state | Switch | Indicates whether the most recent program finished. | Yes | +| delayed_start_time | Number | The delayed start time of the selected program. | Yes | +| program_remaining_time | Number | The remaining time of the active program. | Yes | +| program_elapsed_time | Number | The elapsed time of the active program. | Yes | +| program_progress | Number | The progress of the active program. | Yes | +| drying_target | String | The target drying step of the laundry. | Yes | +| drying_target_raw | Number | The raw target drying step of the laundry. | Yes | +| pre_heat_finished | Switch | Indicates whether the pre-heating finished. | Yes | +| temperature_target | Number | The target temperature of the device. | Yes | +| temperature_current | Number | The currently measured temperature of the device. | Yes | +| ventilation_power | String | The current ventilation power of the hood. | Yes | +| ventilation_power_raw | Number | The current raw ventilation power of the hood. | Yes | +| error_state | Switch | Indication flag which signals an error state for the device. | Yes | +| info_state | Switch | Indication flag which signals an information of the device. | Yes | +| fridge_super_cool | Switch | Start the super cooling mode of the fridge. | No | +| freezer_super_freeze | Switch | Start the super freezing mode of the freezer. | No | +| super_cool_can_be_controlled | Switch | Indicates if super cooling can be toggled. | Yes | +| super_freeze_can_be_controlled | Switch | Indicates if super freezing can be toggled | Yes | +| fridge_temperature_target | Number | The target temperature of the fridge. | Yes | +| fridge_temperature_current | Number | The currently measured temperature of the fridge. | Yes | +| freezer_temperature_target | Number | The target temperature of the freezer. | Yes | +| freezer_temperature_current | Number | The currently measured temperature of the freezer. | Yes | +| top_temperature_target | Number | The target temperature of the top area. | Yes | +| top_temperature_current | Number | The currently measured temperature of the top area. | Yes | +| middle_temperature_target | Number | The target temperature of the middle area. | Yes | +| middle_temperature_current | Number | The currently measured temperature of the middle area. | Yes | +| bottom_temperature_target | Number | The target temperature of the bottom area. | Yes | +| bottom_temperature_current | Number | The currently measured temperature of the bottom area. | Yes | +| light_switch | Switch | Indicates if the light of the device is enabled. | No | +| light_can_be_controlled | Switch | Indicates if the light of the device can be controlled. | Yes | +| plate_is_present | Switch | Indicates if plate is present. | Yes | +| plate_power_step | String | The power level of the heating plate. | Yes | +| plate_power_step_raw | Number | The raw power level of the heating plate. | Yes | +| door_state | Switch | Indicates if the door of the device is open. | Yes | +| door_alarm | Switch | Indicates if the door alarm of the device is active. | Yes | +| battery_level | Number | The battery level of the robotic vacuum cleaner. | Yes | + +### Coffee System + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| remote_control_can_be_started | remote_control_can_be_started | +| remote_control_can_be_stopped | remote_control_can_be_stopped | +| remote_control_can_be_switched_on | remote_control_can_be_switched_on | +| remote_control_can_be_switched_off | remote_control_can_be_switched_off | +| program_active | program_active | +| program_active_raw | program_active_raw | +| program_phase | program_phase | +| program_phase_raw | program_phase_raw | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| finish_state | finish_state | +| power_state_on_off | power_state_on_off | +| program_remaining_time | program_remaining_time | +| program_elapsed_time | program_elapsed_time | +| error_state | error_state | +| info_state | info_state | +| light_switch | light_switch | +| light_can_be_controlled | light_can_be_controlled | + +### Dish Warmer + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| remote_control_can_be_switched_on | remote_control_can_be_switched_on | +| remote_control_can_be_switched_off | remote_control_can_be_switched_off | +| dish_warmer_program_active | dish_warmer_program_active | +| program_active_raw | program_active_raw | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| power_state_on_off | power_state_on_off | +| finish_state | finish_state | +| program_remaining_time | program_remaining_time | +| program_elapsed_time | program_elapsed_time | +| program_progress | program_progress | +| temperature_target | temperature_target | +| temperature_current | temperature_current | +| error_state | error_state | +| info_state | info_state | +| door_state | door_state | + +### Dishwasher + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| remote_control_can_be_started | remote_control_can_be_started | +| remote_control_can_be_stopped | remote_control_can_be_stopped | +| remote_control_can_be_switched_on | remote_control_can_be_switched_on | +| remote_control_can_be_switched_off | remote_control_can_be_switched_off | +| program_active | program_active | +| program_active_raw | program_active_raw | +| program_phase | program_phase | +| program_phase_raw | program_phase_raw | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| program_start_stop | program_start_stop | +| finish_state | finish_state | +| power_state_on_off | power_state_on_off | +| delayed_start_time | delayed_start_time | +| program_remaining_time | program_remaining_time | +| program_elapsed_time | program_elapsed_time | +| program_progress | program_progress | +| error_state | error_state | +| info_state | info_state | +| door_state | door_state | + +### Tumble Dryer + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| remote_control_can_be_started | remote_control_can_be_started | +| remote_control_can_be_stopped | remote_control_can_be_stopped | +| remote_control_can_be_switched_on | remote_control_can_be_switched_on | +| remote_control_can_be_switched_off | remote_control_can_be_switched_off | +| program_active | program_active | +| program_active_raw | program_active_raw | +| program_phase | program_phase | +| program_phase_raw | program_phase_raw | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| program_start_stop | program_start_stop | +| finish_state | finish_state | +| power_state_on_off | power_state_on_off | +| delayed_start_time | delayed_start_time | +| program_remaining_time | program_remaining_time | +| program_elapsed_time | program_elapsed_time | +| program_progress | program_progress | +| drying_target | drying_target | +| drying_target_raw | drying_target_raw | +| error_state | error_state | +| info_state | info_state | +| light_switch | light_switch | +| light_can_be_controlled | light_can_be_controlled | +| door_state | door_state | + +### Freezer + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| error_state | error_state | +| info_state | info_state | +| freezer_super_freeze | freezer_super_freeze | +| super_freeze_can_be_controlled | super_freeze_can_be_controlled | +| freezer_temperature_target | freezer_temperature_target | +| freezer_temperature_current | freezer_temperature_current | +| door_state | door_state | +| door_alarm | door_alarm | + +### Fridge + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| error_state | error_state | +| info_state | info_state | +| fridge_super_cool | fridge_super_cool | +| super_cool_can_be_controlled | super_cool_can_be_controlled | +| fridge_temperature_target | fridge_temperature_target | +| fridge_temperature_current | fridge_temperature_current | +| door_state | door_state | +| door_alarm | door_alarm | + +### Fridge Freezer + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| error_state | error_state | +| info_state | info_state | +| fridge_super_cool | fridge_super_cool | +| freezer_super_freeze | freezer_super_freeze | +| super_cool_can_be_controlled | super_cool_can_be_controlled | +| super_freeze_can_be_controlled | super_freeze_can_be_controlled | +| fridge_temperature_target | fridge_temperature_target | +| fridge_temperature_current | fridge_temperature_current | +| freezer_temperature_target | freezer_temperature_target | +| freezer_temperature_current | freezer_temperature_current | +| door_state | door_state | +| door_alarm | door_alarm | + +### Hob + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| error_state | error_state | +| info_state | info_state | +| plate_1_is_present | plate_is_present | +| plate_1_power_step | plate_power_step | +| plate_1_power_step_raw | plate_power_step_raw | +| plate_2_is_present | plate_is_present | +| plate_2_power_step | plate_power_step | +| plate_2_power_step_raw | plate_power_step_raw | +| plate_3_is_present | plate_is_present | +| plate_3_power_step | plate_power_step | +| plate_3_power_step_raw | plate_power_step_raw | +| plate_4_is_present | plate_is_present | +| plate_4_power_step | plate_power_step | +| plate_4_power_step_raw | plate_power_step_raw | +| plate_5_is_present | plate_is_present | +| plate_5_power_step | plate_power_step | +| plate_5_power_step_raw | plate_power_step_raw | +| plate_6_is_present | plate_is_present | +| plate_6_power_step | plate_power_step | +| plate_6_power_step_raw | plate_power_step_raw | + +### Hood + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| remote_control_can_be_started | remote_control_can_be_started | +| remote_control_can_be_stopped | remote_control_can_be_stopped | +| remote_control_can_be_switched_on | remote_control_can_be_switched_on | +| remote_control_can_be_switched_off | remote_control_can_be_switched_off | +| program_phase | program_phase | +| program_phase_raw | program_phase_raw | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| power_state_on_off | power_state_on_off | +| ventilation_power | ventilation_power | +| ventilation_power_raw | ventilation_power_raw | +| error_state | error_state | +| info_state | info_state | +| light_switch | light_switch | +| light_can_be_controlled | light_can_be_controlled | + +### Oven + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| remote_control_can_be_started | remote_control_can_be_started | +| remote_control_can_be_stopped | remote_control_can_be_stopped | +| remote_control_can_be_switched_on | remote_control_can_be_switched_on | +| remote_control_can_be_switched_off | remote_control_can_be_switched_off | +| program_active | program_active | +| program_active_raw | program_active_raw | +| program_phase | program_phase | +| program_phase_raw | program_phase_raw | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| program_start_stop | program_start_stop | +| finish_state | finish_state | +| power_state_on_off | power_state_on_off | +| delayed_start_time | delayed_start_time | +| program_remaining_time | program_remaining_time | +| program_elapsed_time | program_elapsed_time | +| program_progress | program_progress | +| pre_heat_finished | pre_heat_finished | +| temperature_target | temperature_target | +| temperature_current | temperature_current | +| error_state | error_state | +| info_state | info_state | +| light_switch | light_switch | +| light_can_be_controlled | light_can_be_controlled | +| door_state | door_state | + +### Robotic Vacuum Cleaner + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| remote_control_can_be_started | remote_control_can_be_started | +| remote_control_can_be_stopped | remote_control_can_be_stopped | +| remote_control_can_be_paused | remote_control_can_be_paused | +| remote_control_can_set_program_active | remote_control_can_set_program_active | +| vacuum_cleaner_program_active | vacuum_cleaner_program_active | +| program_active_raw | program_active_raw | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| finish_state | finish_state | +| program_start_stop_pause | program_start_stop_pause | +| power_state_on_off | power_state_on_off | +| error_state | error_state | +| info_state | info_state | +| battery_level | battery_level | + +### Washer Dryer + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| remote_control_can_be_started | remote_control_can_be_started | +| remote_control_can_be_stopped | remote_control_can_be_stopped | +| remote_control_can_be_switched_on | remote_control_can_be_switched_on | +| remote_control_can_be_switched_off | remote_control_can_be_switched_off | +| spinning_speed | spinning_speed | +| spinning_speed_raw | spinning_speed_raw | +| program_active | program_active | +| program_active_raw | program_active_raw | +| program_phase | program_phase | +| program_phase_raw | program_phase_raw | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| program_start_stop | program_start_stop | +| finish_state | finish_state | +| power_state_on_off | power_state_on_off | +| delayed_start_time | delayed_start_time | +| program_remaining_time | program_remaining_time | +| program_elapsed_time | program_elapsed_time | +| program_progress | program_progress | +| drying_target | drying_target | +| drying_target_raw | drying_target_raw | +| error_state | error_state | +| info_state | info_state | +| temperature_target | temperature_target | +| light_switch | light_switch | +| light_can_be_controlled | light_can_be_controlled | +| door_state | door_state | + +### Washing Machine + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| remote_control_can_be_started | remote_control_can_be_started | +| remote_control_can_be_stopped | remote_control_can_be_stopped | +| remote_control_can_be_switched_on | remote_control_can_be_switched_on | +| remote_control_can_be_switched_off | remote_control_can_be_switched_off | +| spinning_speed | spinning_speed | +| spinning_speed_raw | spinning_speed_raw | +| program_active | program_active | +| program_active_raw | program_active_raw | +| program_phase | program_phase | +| program_phase_raw | program_phase_raw | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| program_start_stop | program_start_stop | +| finish_state | finish_state | +| power_state_on_off | power_state_on_off | +| delayed_start_time | delayed_start_time | +| program_remaining_time | program_remaining_time | +| program_elapsed_time | program_elapsed_time | +| program_progress | program_progress | +| error_state | error_state | +| info_state | info_state | +| temperature_target | temperature_target | +| light_switch | light_switch | +| light_can_be_controlled | light_can_be_controlled | +| door_state | door_state | + +### Wine Storage + +| Channel ID | Channel Type ID | +| ---------- | --------------- | +| remote_control_can_be_started | remote_control_can_be_started | +| remote_control_can_be_stopped | remote_control_can_be_stopped | +| remote_control_can_be_switched_on | remote_control_can_be_switched_on | +| remote_control_can_be_switched_off | remote_control_can_be_switched_off | +| operation_state | operation_state | +| operation_state_raw | operation_state_raw | +| power_state_on_off | power_state_on_off | +| error_state | error_state | +| info_state | info_state | +| temperature_target | temperature_target | +| temperature_current | temperature_current | +| top_temperature_target | top_temperature_target | +| top_temperature_current | top_temperature_current | +| middle_temperature_target | middle_temperature_target | +| middle_temperature_current | middle_temperature_current | +| bottom_temperature_target | bottom_temperature_target | +| bottom_temperature_current | bottom_temperature_current | + +### Note on plate_is_present and plate_power_step channels + +The `plate_x_is_present` channels show whether a plate is present on an appliance. +The plate numbers do not represent the physical layout of the plates on the appliance, but always start with the `plate_1_is_present` channel. +This means that a hob with two plates will have `plate_1_is_present` and `plate_2_is_present` active and all other `plate_x_is_present` channels inactive. + +The `plate_x_power_step` channels show the current power step of the according plate. +**Please note that different hobs may use dynamic numbering for plates.** +Hobs that use dynamic numbering will use the first power step channel that is currently at a power step of zero when the plate is turned on. +Additionally, when a plate is turned off all other plates with higher numbers will decrease their number by one. +For example if plate 1, 2 and 3 are active and plate 1 is turned off then plate 2 will become plate 1, plate 3 will become plate 2 and plate 3 will have a power step of zero. +This behavior is a fixed part of the affected appliances and cannot be changed. + +### Note on door_state channel + +The `door_state` channel might not always provide a value matching the actual state. +For example, a washing machine will not provide a valid `door_state` when the appliance is turned off. +A valid door state can be expected when the appliance is in one of the following raw operation states, compare the `operation_state_raw` channel: + +- `3`: Program selected +- `4`: Program selected, waiting to start +- `5`: Running +- `6`: Paused + +## Full Example + +### demo.things: + +``` +Bridge mielecloud:account:home [ locale="en" ] { + Thing coffee_system 000703261234 "Coffee machine CVA7440" [ ] + Thing hob 000160102345 "Cooktop KM7677" [ ] +} +``` + +### demo.items: + +``` +// Coffee system +Switch coffee_system_remote_control_can_be_started { channel="mielecloud:coffee_system:home:000703261234:remote_control_can_be_started" } +Switch coffee_system_remote_control_can_be_stopped { channel="mielecloud:coffee_system:home:000703261234:remote_control_can_be_stopped" } +Switch coffee_system_remote_control_can_be_switched_on { channel="mielecloud:coffee_system:home:000703261234:remote_control_can_be_switched_on" } +Switch coffee_system_remote_control_can_be_switched_off { channel="mielecloud:coffee_system:home:000703261234:remote_control_can_be_switched_off" } +String coffee_system_program_active { channel="mielecloud:coffee_system:home:000703261234:program_active" } +String coffee_system_program_phase { channel="mielecloud:coffee_system:home:000703261234:program_phase" } +String coffee_system_power_state_on_off { channel="mielecloud:coffee_system:home:000703261234:power_state_on_off" } +String coffee_system_operation_state { channel="mielecloud:coffee_system:home:000703261234:operation_state" } +Switch coffee_system_finish_state { channel="mielecloud:coffee_system:home:000703261234:finish_state" } +Number coffee_system_program_remaining_time { channel="mielecloud:coffee_system:home:000703261234:program_remaining_time" } +Switch coffee_system_error_state { channel="mielecloud:coffee_system:home:000703261234:error_state" } +Switch coffee_system_info_state { channel="mielecloud:coffee_system:home:000703261234:info_state" } +Switch coffee_system_light_switch { channel="mielecloud:coffee_system:home:000703261234:light_switch" } +Switch coffee_system_light_can_be_controlled { channel="mielecloud:coffee_system:home:000703261234:light_can_be_controlled" } + +// Hob +Switch hob_remote_control_can_be_started { channel="mielecloud:hob:home:000160102345:remote_control_can_be_started" } +Switch hob_remote_control_can_be_stopped { channel="mielecloud:hob:home:000160102345:remote_control_can_be_stopped" } +String hob_operation_state { channel="mielecloud:hob:home:000160102345:operation_state" } +Switch hob_error_state { channel="mielecloud:hob:home:000160102345:error_state" } +Switch hob_info_state { channel="mielecloud:hob:home:000160102345:info_state" } +Switch hob_plate_1_is_present { channel="mielecloud:hob:home:000160102345:plate_1_is_present" } +String hob_plate_1_power_step { channel="mielecloud:hob:home:000160102345:plate_1_power_step" } +Switch hob_plate_2_is_present { channel="mielecloud:hob:home:000160102345:plate_2_is_present" } +String hob_plate_2_power_step { channel="mielecloud:hob:home:000160102345:plate_2_power_step" } +Switch hob_plate_3_is_present { channel="mielecloud:hob:home:000160102345:plate_3_is_present" } +String hob_plate_3_power_step { channel="mielecloud:hob:home:000160102345:plate_3_power_step" } +Switch hob_plate_4_is_present { channel="mielecloud:hob:home:000160102345:plate_4_is_present" } +String hob_plate_4_power_step { channel="mielecloud:hob:home:000160102345:plate_4_power_step" } +Switch hob_plate_5_is_present { channel="mielecloud:hob:home:000160102345:plate_5_is_present" } +String hob_plate_5_power_step { channel="mielecloud:hob:home:000160102345:plate_5_power_step" } +Switch hob_plate_6_is_present { channel="mielecloud:hob:home:000160102345:plate_6_is_present" } +String hob_plate_6_power_step { channel="mielecloud:hob:home:000160102345:plate_6_power_step" } +``` + +### demo.sitemap: + +``` +sitemap demo label="Kitchen" +{ + Frame { + // Coffee system + Text item=coffee_system_program_active + Text item=coffee_system_program_phase + Text item=coffee_system_power_state_on_off + Text item=coffee_system_operation_state + Switch item=coffee_system_finish_state + Default item=coffee_system_program_remaining_time + Switch item=coffee_system_error_state + Switch item=coffee_system_info_state + Switch item=coffee_system_light_switch + + // Hob + Text item=hob_operation_state + Switch item=hob_error_state + Switch item=hob_info_state + Text item=hob_plate_1_power_step + Text item=hob_plate_2_power_step + Text item=hob_plate_3_power_step + Text item=hob_plate_4_power_step + Text item=hob_plate_5_power_step + Text item=hob_plate_6_power_step + } +} +``` + +## Account Configuration Example + +The configuration UI is accessible at `https:///mielecloud`. +See [Discovery](#discovery) for a detailed description of how to open the configuration UI in a browser. + +When first opening the configuration UI no account will be paired. + +![Empty Account Overview](doc/account-overview-empty.png) + +We strongly recommend to use a secure connection for pairing, details on this topic can also be found in the [Discovery](#discovery) section. +Click `Pair Account` to start the pairing process. +If not already done, go to the [Miele Developer Portal](https://www.miele.com/f/com/en/register_api.aspx), register there and wait for the confirmation e-mail. +Obtain your client ID and client secret according to the instructions presented there. +Once you obtained your client ID and client secret continue pairing by filling in your client ID, client secret and bridge ID. +You may choose any bridge ID you like as long as you only use letters, numbers, underscores and dashes. +The bridge ID entered here will become part of the thing UID of the paired account and cannot be changed later. +If you want to change the bridge ID you will need to remove the bridge and pair it again with the new bridge ID. + +![Pair Account](doc/pair-account.png) + +A click on `Pair Account` will take you to the Miele cloud service login form where you need to log in with the same account as you used for the Miele@mobile app. + +![Miele Login Form](doc/miele-login.png) + +When this is the first time you pair an account, you will need to allow openHAB to access your account. + +When everything worked, you are presented with a page stating that pairing was successful. +Select the locale which should be used to display localized texts in openHAB channels. +Note that there is currently an issue with the endpoint of the Miele cloud service which is used by the binding that prevents the locale setting from functioning correctly. +This will be fixed in the future. +From here, you have two options: +Either let the binding automatically configure a bridge instance or copy the presented things-file template to a things file and return to the overview page. +We recommend the former for reasons outlined under [Account Configuration](#account-configuration). + +![Pairing Successful](doc/pairing-success.png) + +Once the bridge instance is `ONLINE`, you can either pair things for all appliances via your favorite management UI, e.g. the Paper UI, or use a things-file. +The account overview provides a things-file template that is shown when you expand the account. +This can serve as a starting point for your own things-file. + +![Account Overview With Bridge](doc/account-overview-with-bridge.png) + +## Rule Ideas + +Here are some ideas on what could be done with this binding. You have more ideas or even an example? Great! Feel free to contribute! +- Notify yourself of a finished dishwasher, tumble dryer, washer dryer or washing machine, e.g. by changing the lighting +- Control the supercooler / superfreezer of your freezer, fridge or fridge-freezer combination with a voice assistant +- Notify yourself when the oven has finished pre-heating diff --git a/bundles/org.openhab.binding.mielecloud/doc/account-overview-empty.png b/bundles/org.openhab.binding.mielecloud/doc/account-overview-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..7b733af0be8bcef7f3564ff17333b8e1bdca1dd3 GIT binary patch literal 50757 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

mb4_}5UJ>TM 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 JrDXo~zX9^bA(sFE literal 0 HcmV?d00001 diff --git a/bundles/org.openhab.binding.mielecloud/doc/account-overview-with-bridge.png b/bundles/org.openhab.binding.mielecloud/doc/account-overview-with-bridge.png new file mode 100644 index 0000000000000000000000000000000000000000..60a768bf082e74c3a9d342c66eadb35723e8a1ef GIT binary patch literal 80119 zcmZ^}b9^M<6E-?AC$?>FY)rVZ?QEQlZJV2oZ9Cc6-q^OCjs52PyZ8O${&9P{d%Ej$ zrt6%i>Qp_|b0QSwC4umG@Bjb+C@m$X3;;l2eH|FE&|eZ#*SbmofEwhfs_Cq3CHvNO`tKEUPa=a>mxk-B zN22Z^SuX(@Ihu6Zd-o^Lq2JSjb~IJ7veVy{fAr1E-bWc$IR+OWXEq(5f}f+D9s2Kg zZ4Nj0p+}THk8e}SA1{VS_jh{`c1!kqw`av&n>Y6^`AhhjPap7Y^<4(U*rR739vg#8 z5v#skqgBaqGK4kg6H5VZv^Cu~K3Y@Q?_1uUd4@&5TNJN-VXzrKU#_)9+&^4DI6quS zoig`0d<=jF-tO%hi2qI=HoLT6XM}U2-yX7_S6+@f){cMO`1lc``quyOT?x1IeGZio z>Ll8%xf0Un?x-2@^DXeo=~|yWyW*+HZpdjrV>Ow1i!8Oad341?B1q+5kNe?^{Xx~m z{OGpl*0dq7+jZU;v^B?ZbTdXuvf;Qv_~&Zrgi0pb_q9*sss#D52`|#l7y6m@^bcRx zb|)s?WV&w#iu+1;&EUpavsdQ{orZoasB_QM@m}bI^Yh^_=Z*77Hf=;;sH53fPv2qU z+dj|xUnTB=tdy-;j_b9nl-G-}9x~M%!#1<(b;CbjI0^Ii32@ z8TMlEJQ&^}-u+TtWfy0Y|nMbwSoVK31+knj6y9c;mWNtqS+)-c z8k#)=V-=NctEX#eK;`q6xyknPwzbPJO}?FhU-E(n^K1|dKHS^c$Uz%-pp;Wdw)$v;A^cu= zPUDO9_(jdieK?fbLU^gE;o$P&SG~%;~ z<1!<(+)aRn-1eQ+;nIw!-lW~ZAdG~|V%9xpkhM3~q`ivm=jN-^UK(|o4{6ZRr>$}- z=Sj1d>LTECT9M=6n@2y_juj@s8zQ4Wb8LG_D|4HiVdXxOD{|?$&=Besi?3X3Q||@N z<1X1)@-+%FY{FYIbeZbBu4sMWf~oR(fe_@K8Z_$jJ=&#Lwe$qC@bMy;4zr8#x7mZH?l_7$aiW{s7r+U@h97;m}5A|M>D}?iv2yvk|6EJ-gQqm2QLD| z<+VDivuoWe-qu3(<(ku2WJnDp`sTdLotz3<)O6v!E)+xQsXb~DxN1xLcn)vCt z0wb`NG&9Zz@4PB6z7;FI-L7{$l!80FpOra-&bd~R)U$^YY(Ic#MMdI|5ykXK$1^^LW=-Rqd=|mJ;D?ObT&mF zAs2<`YJ0(eU{{!$opyDl!K9#_5OjGkE*(_!H=4mj1B4Oy_qpv&t1{PlQB90NsX}l_ zQiidrEt$iHnzmkioI8HXysGh?84YY0=e9a=P0x@R2_aSTFjU$o)BD*@=;u@RG>UxH z9Vu?6Tw0ucH(os5tF%4fm#Sub@uYlJSja2Ny0T2^6#piu->gx_eeH3hqX`AJ z(0leb);oW#lAyf|r1xWvkb=7(3def*D-)3^)x~w`Jkd1^%)!@99Q-A-PuV1u6z$&H z;V`&9-}hr%%Gr9m-b{^BRu@15?`gT|^HKU}8Owxio*Cr{Hp?*+1~0!em2mK!C@uo zoa5V;8)YQSuJGBMzd|6-Dr&gdzaReN=FuKhjuu0wMxR zxzh9K_6Yy*MPz0>%8|x{v!Yzz278P|i*N*#3A;-)HV{6+@HQF}oJ*&o zup_rDD7$M6&V<4N4iclMR?bxnFoXnom=@oGwG6w!4RDs>TXVSwm&67@_i&o?8*&Up zpK?z11S(Mqy5aEQN&=0|4fGP`w(=FBoE=fdi-0VajCi-0e_yJYIoh0f8

O>}kLMXs_3{@LfVUF0d^cQ7 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%0A>B}2bXNm1uT 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%0DM> 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