{"action":"created","comment":{"url":"https://api.github.com/repos/openhab/openhab-addons/pulls/comments/365943442","pull_request_review_id":341879078,"id":365943442,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDM2NTk0MzQ0Mg==","diff_hunk":"@@ -0,0 +1,590 @@\n+/**\n+ * Copyright (c) 2010-2019 Contributors to the openHAB project\n+ *\n+ * See the NOTICE file(s) distributed with this work for additional\n+ * information.\n+ *\n+ * This program and the accompanying materials are made available under the\n+ * terms of the Eclipse Public License 2.0 which is available at\n+ * http://www.eclipse.org/legal/epl-2.0\n+ *\n+ * SPDX-License-Identifier: EPL-2.0\n+ */\n+package org.openhab.binding.wemo.internal.handler;\n+\n+import static org.openhab.binding.wemo.internal.WemoBindingConstants.*;\n+\n+import java.io.StringReader;\n+import java.math.BigDecimal;\n+import java.net.URL;\n+import java.util.Collections;\n+import java.util.HashMap;\n+import java.util.Map;\n+import java.util.Set;\n+import java.util.concurrent.ScheduledFuture;\n+import java.util.concurrent.TimeUnit;\n+\n+import javax.xml.parsers.DocumentBuilder;\n+import javax.xml.parsers.DocumentBuilderFactory;\n+\n+import org.apache.commons.lang.StringEscapeUtils;\n+import org.apache.commons.lang.StringUtils;\n+import org.eclipse.smarthome.config.core.Configuration;\n+import org.eclipse.smarthome.core.library.types.OnOffType;\n+import org.eclipse.smarthome.core.library.types.PercentType;\n+import org.eclipse.smarthome.core.library.types.StringType;\n+import org.eclipse.smarthome.core.thing.ChannelUID;\n+import org.eclipse.smarthome.core.thing.Thing;\n+import org.eclipse.smarthome.core.thing.ThingStatus;\n+import org.eclipse.smarthome.core.thing.ThingStatusDetail;\n+import org.eclipse.smarthome.core.thing.ThingTypeUID;\n+import org.eclipse.smarthome.core.types.Command;\n+import org.eclipse.smarthome.core.types.RefreshType;\n+import org.eclipse.smarthome.core.types.State;\n+import org.eclipse.smarthome.io.transport.upnp.UpnpIOParticipant;\n+import org.eclipse.smarthome.io.transport.upnp.UpnpIOService;\n+import org.openhab.binding.wemo.internal.http.WemoHttpCall;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+import org.w3c.dom.CharacterData;\n+import org.w3c.dom.Document;\n+import org.w3c.dom.Element;\n+import org.w3c.dom.Node;\n+import org.w3c.dom.NodeList;\n+import org.xml.sax.InputSource;\n+\n+/**\n+ * The {@link WemoHolmesHandler} is responsible for handling commands, which are\n+ * sent to one of the channels and to update their states.\n+ *\n+ * @author Hans-Jörg Merk - Initial contribution;\n+ */\n+\n+public class WemoHolmesHandler extends AbstractWemoHandler implements UpnpIOParticipant {\n+\n+    private final Logger logger = LoggerFactory.getLogger(WemoHolmesHandler.class);\n+\n+    public static final Set<ThingTypeUID> SUPPORTED_THING_TYPES = Collections.singleton(THING_TYPE_PURIFIER);\n+\n+    private Map<String, Boolean> subscriptionState = new HashMap<String, Boolean>();\n+\n+    private final Map<String, String> stateMap = Collections.synchronizedMap(new HashMap<String, String>());\n+\n+    private UpnpIOService service;\n+\n+    private int filterLifeDays = 330;\n+    private int filterLifeMins = filterLifeDays * 24 * 60;\n+\n+    /**\n+     * The default refresh interval in Seconds.\n+     */\n+    private final int DEFAULT_REFRESH_INTERVAL = 120;\n+\n+    private ScheduledFuture<?> refreshJob;\n+\n+    private final Runnable refreshRunnable = new Runnable() {\n+\n+        @Override\n+        public void run() {\n+            try {\n+                if (!isUpnpDeviceRegistered()) {\n+                    logger.debug(\"WeMo UPnP device {} not yet registered\", getUDN());\n+                }\n+\n+                updateWemoState();\n+                onSubscription();\n+            } catch (Exception e) {\n+                logger.debug(\"Exception during poll\", e);\n+                updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage());\n+            }\n+        }\n+    };\n+\n+    public WemoHolmesHandler(Thing thing, UpnpIOService upnpIOService, WemoHttpCall wemohttpCaller) {\n+        super(thing);\n+\n+        this.wemoHttpCaller = wemohttpCaller;\n+\n+        logger.debug(\"Creating a WemoHolmesHandler for thing '{}'\", getThing().getUID());\n+\n+        if (upnpIOService != null) {\n+            this.service = upnpIOService;\n+        } else {\n+            logger.debug(\"upnpIOService not set.\");\n+        }\n+    }\n+\n+    @Override\n+    public void initialize() {\n+        Configuration configuration = getConfig();\n+\n+        if (configuration.get(\"udn\") != null) {\n+            logger.debug(\"Initializing WemoHolmesHandler for UDN '{}'\", configuration.get(\"udn\"));\n+            service.registerParticipant(this);\n+            onSubscription();\n+            onUpdate();\n+            updateStatus(ThingStatus.ONLINE);\n+        } else {\n+            logger.debug(\"Cannot initalize WemoHolmesHandler. UDN not set.\");\n+        }\n+    }\n+\n+    @Override\n+    public void dispose() {\n+        logger.debug(\"WemoHolmesHandler disposed.\");\n+\n+        removeSubscription();\n+\n+        if (refreshJob != null && !refreshJob.isCancelled()) {\n+            refreshJob.cancel(true);\n+            refreshJob = null;\n+        }\n+    }\n+\n+    @Override\n+    public void handleCommand(ChannelUID channelUID, Command command) {\n+        logger.trace(\"Command '{}' received for channel '{}'\", command, channelUID);\n+\n+        String attribute = null;\n+        String value = null;\n+\n+        if (command instanceof RefreshType) {\n+            try {\n+                updateWemoState();\n+            } catch (Exception e) {\n+                logger.debug(\"Exception during poll\", e);\n+            }\n+        } else if (channelUID.getId().equals(CHANNEL_PURIFIERMODE)) {\n+            attribute = \"Mode\";\n+            String commandString = command.toString();\n+            switch (commandString) {\n+                case \"OFF\":\n+                    value = \"0\";\n+                    break;\n+                case \"LOW\":\n+                    value = \"1\";\n+                    break;\n+                case \"MED\":\n+                    value = \"2\";\n+                    break;\n+                case \"HIGH\":\n+                    value = \"3\";\n+                    break;\n+                case \"AUTO\":\n+                    value = \"4\";\n+                    break;\n+            }\n+        } else if (channelUID.getId().equals(CHANNEL_IONIZER)) {\n+            attribute = \"Ionizer\";\n+            if (command.equals(OnOffType.ON)) {\n+                value = \"1\";\n+            } else if (command.equals(OnOffType.OFF)) {\n+                value = \"0\";\n+            }\n+        } else if (channelUID.getId().equals(CHANNEL_HUMIDIFIERMODE)) {\n+            attribute = \"FanMode\";\n+            String commandString = command.toString();\n+            switch (commandString) {\n+                case \"OFF\":\n+                    value = \"0\";\n+                    break;\n+                case \"MIN\":\n+                    value = \"1\";\n+                    break;\n+                case \"LOW\":\n+                    value = \"2\";\n+                    break;\n+                case \"MED\":\n+                    value = \"3\";\n+                    break;\n+                case \"HIGH\":\n+                    value = \"4\";\n+                    break;\n+                case \"MAX\":\n+                    value = \"5\";\n+                    break;\n+            }\n+        } else if (channelUID.getId().equals(CHANNEL_DESIREDHUMIDITY)) {\n+            attribute = \"DesiredHumidity\";\n+            String commandString = command.toString();\n+            switch (commandString) {\n+                case \"45\":\n+                    value = \"0\";\n+                    break;\n+                case \"50\":\n+                    value = \"1\";\n+                    break;\n+                case \"55\":\n+                    value = \"2\";\n+                    break;\n+                case \"60\":\n+                    value = \"3\";\n+                    break;\n+                case \"100\":\n+                    value = \"4\";\n+                    break;\n+            }\n+        } else if (channelUID.getId().equals(CHANNEL_HEATERMODE)) {\n+            attribute = \"Mode\";\n+            String commandString = command.toString();\n+            switch (commandString) {\n+                case \"OFF\":\n+                    value = \"0\";\n+                    break;\n+                case \"FROSTPROTECT\":\n+                    value = \"1\";\n+                    break;\n+                case \"HIGH\":\n+                    value = \"2\";\n+                    break;\n+                case \"LOW\":\n+                    value = \"3\";\n+                    break;\n+                case \"ECO\":\n+                    value = \"4\";\n+                    break;\n+            }\n+        } else if (channelUID.getId().equals(CHANNEL_TARGETTEMP)) {\n+            attribute = \"SetTemperature\";\n+            value = command.toString();\n+        }\n+        try {\n+            String soapHeader = \"\\\"urn:Belkin:service:deviceevent:1#SetAttributes\\\"\";\n+            String content = \"<?xml version=\\\"1.0\\\"?>\"\n+                    + \"<s:Envelope xmlns:s=\\\"http://schemas.xmlsoap.org/soap/envelope/\\\" s:encodingStyle=\\\"http://schemas.xmlsoap.org/soap/encoding/\\\">\"\n+                    + \"<s:Body>\" + \"<u:SetAttributes xmlns:u=\\\"urn:Belkin:service:deviceevent:1\\\">\"\n+                    + \"<attributeList>&lt;attribute&gt;&lt;name&gt;\" + attribute + \"&lt;/name&gt;&lt;value&gt;\" + value\n+                    + \"&lt;/value&gt;&lt;/attribute&gt;</attributeList>\" + \"</u:SetAttributes>\" + \"</s:Body>\"\n+                    + \"</s:Envelope>\";\n+            String wemoURL = getWemoURL(\"deviceevent\");\n+\n+            if (wemoURL != null) {\n+                wemoHttpCaller.executeCall(wemoURL, soapHeader, content);\n+            }\n+        } catch (Exception e) {\n+            logger.error(\"Failed to send command '{}' for device '{}': {}\", command, getThing().getUID(),\n+                    e.getMessage());\n+            updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR);\n+        }\n+        updateStatus(ThingStatus.ONLINE);\n+    }\n+\n+    @Override\n+    public void onServiceSubscribed(String service, boolean succeeded) {\n+        logger.debug(\"WeMo {}: Subscription to service {} {}\", getUDN(), service, succeeded ? \"succeeded\" : \"failed\");\n+        subscriptionState.put(service, succeeded);\n+    }\n+\n+    @Override\n+    public void onValueReceived(String variable, String value, String service) {\n+        logger.debug(\"Received pair '{}':'{}' (service '{}') for thing '{}'\",","path":"bundles/org.openhab.binding.wemo/src/main/java/org/openhab/binding/wemo/internal/handler/WemoHolmesHandler.java","position":280,"original_position":280,"commit_id":"9afb4776e960183c32b60e6a12bdd105542bb038","original_commit_id":"9afb4776e960183c32b60e6a12bdd105542bb038","user":{"login":"martinvw","id":2625279,"node_id":"MDQ6VXNlcjI2MjUyNzk=","avatar_url":"https://avatars3.githubusercontent.com/u/2625279?v=4","gravatar_id":"","url":"https://api.github.com/users/martinvw","html_url":"https://github.com/martinvw","followers_url":"https://api.github.com/users/martinvw/followers","following_url":"https://api.github.com/users/martinvw/following{/other_user}","gists_url":"https://api.github.com/users/martinvw/gists{/gist_id}","starred_url":"https://api.github.com/users/martinvw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/martinvw/subscriptions","organizations_url":"https://api.github.com/users/martinvw/orgs","repos_url":"https://api.github.com/users/martinvw/repos","events_url":"https://api.github.com/users/martinvw/events{/privacy}","received_events_url":"https://api.github.com/users/martinvw/received_events","type":"User","site_admin":false},"body":"See above","created_at":"2020-01-13T17:55:49Z","updated_at":"2020-01-13T17:59:55Z","html_url":"https://github.com/openhab/openhab-addons/pull/6445#discussion_r365943442","pull_request_url":"https://api.github.com/repos/openhab/openhab-addons/pulls/6445","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/openhab/openhab-addons/pulls/comments/365943442"},"html":{"href":"https://github.com/openhab/openhab-addons/pull/6445#discussion_r365943442"},"pull_request":{"href":"https://api.github.com/repos/openhab/openhab-addons/pulls/6445"}}},"pull_request":{"url":"https://api.github.com/repos/openhab/openhab-addons/pulls/6445","id":344910527,"node_id":"MDExOlB1bGxSZXF1ZXN0MzQ0OTEwNTI3","html_url":"https://github.com/openhab/openhab-addons/pull/6445","diff_url":"https://github.com/openhab/openhab-addons/pull/6445.diff","patch_url":"https://github.com/openhab/openhab-addons/pull/6445.patch","issue_url":"https://api.github.com/repos/openhab/openhab-addons/issues/6445","number":6445,"state":"open","locked":false,"title":"[wemo] Add new devices and update Readme","user":{"login":"hmerk","id":5521736,"node_id":"MDQ6VXNlcjU1MjE3MzY=","avatar_url":"https://avatars1.githubusercontent.com/u/5521736?v=4","gravatar_id":"","url":"https://api.github.com/users/hmerk","html_url":"https://github.com/hmerk","followers_url":"https://api.github.com/users/hmerk/followers","following_url":"https://api.github.com/users/hmerk/following{/other_user}","gists_url":"https://api.github.com/users/hmerk/gists{/gist_id}","starred_url":"https://api.github.com/users/hmerk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hmerk/subscriptions","organizations_url":"https://api.github.com/users/hmerk/orgs","repos_url":"https://api.github.com/users/hmerk/repos","events_url":"https://api.github.com/users/hmerk/events{/privacy}","received_events_url":"https://api.github.com/users/hmerk/received_events","type":"User","site_admin":false},"body":"Signed-off-by: Hans-Jörg Merk <hans-joerg.merk@t-online.de>\r\n\r\n","created_at":"2019-11-24T14:06:17Z","updated_at":"2020-01-13T17:59:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3055ed5c56e701c81e9cda8711d90cde76b52648","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1260833238,"node_id":"MDU6TGFiZWwxMjYwODMzMjM4","url":"https://api.github.com/repos/openhab/openhab-addons/labels/cre","name":"cre","color":"f95e16","default":false,"description":"Coordinated Review Effort"},{"id":99327136,"node_id":"MDU6TGFiZWw5OTMyNzEzNg==","url":"https://api.github.com/repos/openhab/openhab-addons/labels/enhancement","name":"enhancement","color":"84b6eb","default":true,"description":"An enhancement or new feature for an existing add-on"}],"milestone":null,"commits_url":"https://api.github.com/repos/openhab/openhab-addons/pulls/6445/commits","review_comments_url":"https://api.github.com/repos/openhab/openhab-addons/pulls/6445/comments","review_comment_url":"https://api.github.com/repos/openhab/openhab-addons/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openhab/openhab-addons/issues/6445/comments","statuses_url":"https://api.github.com/repos/openhab/openhab-addons/statuses/9afb4776e960183c32b60e6a12bdd105542bb038","head":{"label":"hmerk:Wemo-New-Devices","ref":"Wemo-New-Devices","sha":"9afb4776e960183c32b60e6a12bdd105542bb038","user":{"login":"hmerk","id":5521736,"node_id":"MDQ6VXNlcjU1MjE3MzY=","avatar_url":"https://avatars1.githubusercontent.com/u/5521736?v=4","gravatar_id":"","url":"https://api.github.com/users/hmerk","html_url":"https://github.com/hmerk","followers_url":"https://api.github.com/users/hmerk/followers","following_url":"https://api.github.com/users/hmerk/following{/other_user}","gists_url":"https://api.github.com/users/hmerk/gists{/gist_id}","starred_url":"https://api.github.com/users/hmerk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hmerk/subscriptions","organizations_url":"https://api.github.com/users/hmerk/orgs","repos_url":"https://api.github.com/users/hmerk/repos","events_url":"https://api.github.com/users/hmerk/events{/privacy}","received_events_url":"https://api.github.com/users/hmerk/received_events","type":"User","site_admin":false},"repo":{"id":189544381,"node_id":"MDEwOlJlcG9zaXRvcnkxODk1NDQzODE=","name":"openhab2-addons","full_name":"hmerk/openhab2-addons","private":false,"owner":{"login":"hmerk","id":5521736,"node_id":"MDQ6VXNlcjU1MjE3MzY=","avatar_url":"https://avatars1.githubusercontent.com/u/5521736?v=4","gravatar_id":"","url":"https://api.github.com/users/hmerk","html_url":"https://github.com/hmerk","followers_url":"https://api.github.com/users/hmerk/followers","following_url":"https://api.github.com/users/hmerk/following{/other_user}","gists_url":"https://api.github.com/users/hmerk/gists{/gist_id}","starred_url":"https://api.github.com/users/hmerk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hmerk/subscriptions","organizations_url":"https://api.github.com/users/hmerk/orgs","repos_url":"https://api.github.com/users/hmerk/repos","events_url":"https://api.github.com/users/hmerk/events{/privacy}","received_events_url":"https://api.github.com/users/hmerk/received_events","type":"User","site_admin":false},"html_url":"https://github.com/hmerk/openhab2-addons","description":"Add-ons for openHAB 2.x","fork":true,"url":"https://api.github.com/repos/hmerk/openhab2-addons","forks_url":"https://api.github.com/repos/hmerk/openhab2-addons/forks","keys_url":"https://api.github.com/repos/hmerk/openhab2-addons/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hmerk/openhab2-addons/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hmerk/openhab2-addons/teams","hooks_url":"https://api.github.com/repos/hmerk/openhab2-addons/hooks","issue_events_url":"https://api.github.com/repos/hmerk/openhab2-addons/issues/events{/number}","events_url":"https://api.github.com/repos/hmerk/openhab2-addons/events","assignees_url":"https://api.github.com/repos/hmerk/openhab2-addons/assignees{/user}","branches_url":"https://api.github.com/repos/hmerk/openhab2-addons/branches{/branch}","tags_url":"https://api.github.com/repos/hmerk/openhab2-addons/tags","blobs_url":"https://api.github.com/repos/hmerk/openhab2-addons/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hmerk/openhab2-addons/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hmerk/openhab2-addons/git/refs{/sha}","trees_url":"https://api.github.com/repos/hmerk/openhab2-addons/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hmerk/openhab2-addons/statuses/{sha}","languages_url":"https://api.github.com/repos/hmerk/openhab2-addons/languages","stargazers_url":"https://api.github.com/repos/hmerk/openhab2-addons/stargazers","contributors_url":"https://api.github.com/repos/hmerk/openhab2-addons/contributors","subscribers_url":"https://api.github.com/repos/hmerk/openhab2-addons/subscribers","subscription_url":"https://api.github.com/repos/hmerk/openhab2-addons/subscription","commits_url":"https://api.github.com/repos/hmerk/openhab2-addons/commits{/sha}","git_commits_url":"https://api.github.com/repos/hmerk/openhab2-addons/git/commits{/sha}","comments_url":"https://api.github.com/repos/hmerk/openhab2-addons/comments{/number}","issue_comment_url":"https://api.github.com/repos/hmerk/openhab2-addons/issues/comments{/number}","contents_url":"https://api.github.com/repos/hmerk/openhab2-addons/contents/{+path}","compare_url":"https://api.github.com/repos/hmerk/openhab2-addons/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hmerk/openhab2-addons/merges","archive_url":"https://api.github.com/repos/hmerk/openhab2-addons/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hmerk/openhab2-addons/downloads","issues_url":"https://api.github.com/repos/hmerk/openhab2-addons/issues{/number}","pulls_url":"https://api.github.com/repos/hmerk/openhab2-addons/pulls{/number}","milestones_url":"https://api.github.com/repos/hmerk/openhab2-addons/milestones{/number}","notifications_url":"https://api.github.com/repos/hmerk/openhab2-addons/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hmerk/openhab2-addons/labels{/name}","releases_url":"https://api.github.com/repos/hmerk/openhab2-addons/releases{/id}","deployments_url":"https://api.github.com/repos/hmerk/openhab2-addons/deployments","created_at":"2019-05-31T06:59:56Z","updated_at":"2019-11-27T13:05:49Z","pushed_at":"2020-01-09T08:18:42Z","git_url":"git://github.com/hmerk/openhab2-addons.git","ssh_url":"git@github.com:hmerk/openhab2-addons.git","clone_url":"https://github.com/hmerk/openhab2-addons.git","svn_url":"https://github.com/hmerk/openhab2-addons","homepage":"","size":362341,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"epl-2.0","name":"Eclipse Public License 2.0","spdx_id":"EPL-2.0","url":"https://api.github.com/licenses/epl-2.0","node_id":"MDc6TGljZW5zZTMy"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"openhab:2.5.x","ref":"2.5.x","sha":"eb3d2526c5c67571449c4cb94a5740ea7231e187","user":{"login":"openhab","id":1007353,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMDczNTM=","avatar_url":"https://avatars0.githubusercontent.com/u/1007353?v=4","gravatar_id":"","url":"https://api.github.com/users/openhab","html_url":"https://github.com/openhab","followers_url":"https://api.github.com/users/openhab/followers","following_url":"https://api.github.com/users/openhab/following{/other_user}","gists_url":"https://api.github.com/users/openhab/gists{/gist_id}","starred_url":"https://api.github.com/users/openhab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openhab/subscriptions","organizations_url":"https://api.github.com/users/openhab/orgs","repos_url":"https://api.github.com/users/openhab/repos","events_url":"https://api.github.com/users/openhab/events{/privacy}","received_events_url":"https://api.github.com/users/openhab/received_events","type":"Organization","site_admin":false},"repo":{"id":19753195,"node_id":"MDEwOlJlcG9zaXRvcnkxOTc1MzE5NQ==","name":"openhab-addons","full_name":"openhab/openhab-addons","private":false,"owner":{"login":"openhab","id":1007353,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMDczNTM=","avatar_url":"https://avatars0.githubusercontent.com/u/1007353?v=4","gravatar_id":"","url":"https://api.github.com/users/openhab","html_url":"https://github.com/openhab","followers_url":"https://api.github.com/users/openhab/followers","following_url":"https://api.github.com/users/openhab/following{/other_user}","gists_url":"https://api.github.com/users/openhab/gists{/gist_id}","starred_url":"https://api.github.com/users/openhab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openhab/subscriptions","organizations_url":"https://api.github.com/users/openhab/orgs","repos_url":"https://api.github.com/users/openhab/repos","events_url":"https://api.github.com/users/openhab/events{/privacy}","received_events_url":"https://api.github.com/users/openhab/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/openhab/openhab-addons","description":"Add-ons for openHAB","fork":false,"url":"https://api.github.com/repos/openhab/openhab-addons","forks_url":"https://api.github.com/repos/openhab/openhab-addons/forks","keys_url":"https://api.github.com/repos/openhab/openhab-addons/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openhab/openhab-addons/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openhab/openhab-addons/teams","hooks_url":"https://api.github.com/repos/openhab/openhab-addons/hooks","issue_events_url":"https://api.github.com/repos/openhab/openhab-addons/issues/events{/number}","events_url":"https://api.github.com/repos/openhab/openhab-addons/events","assignees_url":"https://api.github.com/repos/openhab/openhab-addons/assignees{/user}","branches_url":"https://api.github.com/repos/openhab/openhab-addons/branches{/branch}","tags_url":"https://api.github.com/repos/openhab/openhab-addons/tags","blobs_url":"https://api.github.com/repos/openhab/openhab-addons/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openhab/openhab-addons/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openhab/openhab-addons/git/refs{/sha}","trees_url":"https://api.github.com/repos/openhab/openhab-addons/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openhab/openhab-addons/statuses/{sha}","languages_url":"https://api.github.com/repos/openhab/openhab-addons/languages","stargazers_url":"https://api.github.com/repos/openhab/openhab-addons/stargazers","contributors_url":"https://api.github.com/repos/openhab/openhab-addons/contributors","subscribers_url":"https://api.github.com/repos/openhab/openhab-addons/subscribers","subscription_url":"https://api.github.com/repos/openhab/openhab-addons/subscription","commits_url":"https://api.github.com/repos/openhab/openhab-addons/commits{/sha}","git_commits_url":"https://api.github.com/repos/openhab/openhab-addons/git/commits{/sha}","comments_url":"https://api.github.com/repos/openhab/openhab-addons/comments{/number}","issue_comment_url":"https://api.github.com/repos/openhab/openhab-addons/issues/comments{/number}","contents_url":"https://api.github.com/repos/openhab/openhab-addons/contents/{+path}","compare_url":"https://api.github.com/repos/openhab/openhab-addons/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openhab/openhab-addons/merges","archive_url":"https://api.github.com/repos/openhab/openhab-addons/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openhab/openhab-addons/downloads","issues_url":"https://api.github.com/repos/openhab/openhab-addons/issues{/number}","pulls_url":"https://api.github.com/repos/openhab/openhab-addons/pulls{/number}","milestones_url":"https://api.github.com/repos/openhab/openhab-addons/milestones{/number}","notifications_url":"https://api.github.com/repos/openhab/openhab-addons/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openhab/openhab-addons/labels{/name}","releases_url":"https://api.github.com/repos/openhab/openhab-addons/releases{/id}","deployments_url":"https://api.github.com/repos/openhab/openhab-addons/deployments","created_at":"2014-05-13T19:41:58Z","updated_at":"2020-01-13T14:59:53Z","pushed_at":"2020-01-13T17:33:48Z","git_url":"git://github.com/openhab/openhab-addons.git","ssh_url":"git@github.com:openhab/openhab-addons.git","clone_url":"https://github.com/openhab/openhab-addons.git","svn_url":"https://github.com/openhab/openhab-addons","homepage":"","size":365045,"stargazers_count":1236,"watchers_count":1236,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2249,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":572,"license":{"key":"epl-2.0","name":"Eclipse Public License 2.0","spdx_id":"EPL-2.0","url":"https://api.github.com/licenses/epl-2.0","node_id":"MDc6TGljZW5zZTMy"},"forks":2249,"open_issues":572,"watchers":1236,"default_branch":"2.5.x"}},"_links":{"self":{"href":"https://api.github.com/repos/openhab/openhab-addons/pulls/6445"},"html":{"href":"https://github.com/openhab/openhab-addons/pull/6445"},"issue":{"href":"https://api.github.com/repos/openhab/openhab-addons/issues/6445"},"comments":{"href":"https://api.github.com/repos/openhab/openhab-addons/issues/6445/comments"},"review_comments":{"href":"https://api.github.com/repos/openhab/openhab-addons/pulls/6445/comments"},"review_comment":{"href":"https://api.github.com/repos/openhab/openhab-addons/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openhab/openhab-addons/pulls/6445/commits"},"statuses":{"href":"https://api.github.com/repos/openhab/openhab-addons/statuses/9afb4776e960183c32b60e6a12bdd105542bb038"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"martinvw"}}