Skip to content

Commit

Permalink
Added support for dashboard links to external services. (#185)
Browse files Browse the repository at this point in the history
* Added dashboard support for links to external services.


Signed-off-by: Pauli Anttila <pauli.anttila@gmail.com>
  • Loading branch information
paulianttila authored and kaikreuzer committed Aug 18, 2017
1 parent 778ce5b commit ef8d0df
Show file tree
Hide file tree
Showing 3 changed files with 145 additions and 2 deletions.
34 changes: 34 additions & 0 deletions bundles/org.openhab.ui.dashboard/README.md
@@ -0,0 +1,34 @@
# Dashboard

The openHAB dashboard is a landing page for the user where all openHAB UIs can be found.
Dashboard support also links to external services.
Links can be added to the dashboard by editing the `conf/services/dashboard.cfg` configuration file.

## Link Configuration

| Parameter name | Type | Description |
|-----------------------------|---------|-----------------------------------------------------------------------------------------|
| <unique-name>.link-name | String | Name which is shown in the openHAB dashboard. |
| <unique-name>.link-url | String | URL to external service. |
| <unique-name>.link-imageurl | String | URL to image which is shown in the dashboard. |

Where `<unique-name>` is link unique identifier (see examples).

## Image URL

Browser fetch image from image URL. URL can be direct http link or data URIs according to [RFC2397](https://tools.ietf.org/html/rfc2397). If data URIs are used, browser should support them as well. All five major browsers (Chrome, Firefox, IE, Opera and Safari) support data URIs. See e.g. [https://www.base64-image.de](https://www.base64-image.de) to convert images to base64 coded data.

## Example configuration file

```
frontail.link-name=openHAB Log Viewer
frontail.link-url=http://<server-adddress>:9001
frontail.link-imageurl=../static/image.png
nodered.link-name=Node-RED
nodered.link-url=http://<server-adddress>:1880
nodered.link-imageurl=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXwAAACfCAIAAA...QmCC
```

Note: **nodered** image data URL is not valid (it's shorten for the sake of clarity).
Expand Up @@ -11,6 +11,7 @@
import java.io.IOException;
import java.net.URL;
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

Expand Down Expand Up @@ -40,7 +41,7 @@
*
* @author Kai Kreuzer - Initial contribution
*/
@Component(service = DashboardService.class, immediate = true)
@Component(service = DashboardService.class, immediate = true, name = "org.openhab.dashboard")
public class DashboardService {

public static final String DASHBOARD_ALIAS = "/start";
Expand All @@ -58,8 +59,12 @@ public class DashboardService {

private BundleContext bundleContext;

private final static String LINK_NAME = "link-name";
private final static String LINK_URL = "link-url";
private final static String LINK_IMAGEURL = "link-imageurl";

@Activate
protected void activate(ComponentContext componentContext) {
protected void activate(ComponentContext componentContext, Map<String, Object> properties) {
try {
bundleContext = componentContext.getBundleContext();
Hashtable<String, String> props = new Hashtable<>();
Expand All @@ -78,6 +83,8 @@ protected void activate(ComponentContext componentContext) {
} catch (NamespaceException | ServletException e) {
logger.error("Error during dashboard startup: {}", e.getMessage());
}

addTilesForExternalServices(properties);
}

@Deactivate
Expand Down Expand Up @@ -175,4 +182,24 @@ protected HttpServlet createServlet() {
return new DashboardServlet(configurationAdmin, indexTemplate, entryTemplate, warnTemplate, setupTemplate,
tiles);
}

private void addTilesForExternalServices(Map<String, Object> properties) {
for (String key : properties.keySet()) {
if (key.endsWith(LINK_NAME)) {
if (key.length() > LINK_NAME.length()) {
// get prefix from link name
String linkname = key.substring(0, key.length() - LINK_NAME.length());

String name = (String) properties.get(linkname + LINK_NAME);
String url = (String) properties.get(linkname + LINK_URL);
String imageUrl = (String) properties.get(linkname + LINK_IMAGEURL);

logger.debug("Add link: {}", name);

addDashboardTile(new ExternalServiceTile.DashboardTileBuilder().withName(name).withUrl(url)
.withImageUrl(imageUrl).build());
}
}
}
}
}
@@ -0,0 +1,82 @@
/**
* Copyright (c) 2010-2017 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.ui.dashboard.internal;

import org.openhab.ui.dashboard.DashboardTile;

/**
* The dashboard tile for external services.
*
* @author Pauli Anttila - Initial contribution
*/
public class ExternalServiceTile implements DashboardTile {
private String name;
private String url;
private String overlay;
private String imageUrl;

private ExternalServiceTile(DashboardTileBuilder builder) {
this.name = builder.name;
this.url = builder.url;
this.overlay = builder.overlay;
this.imageUrl = builder.imageUrl;
}

@Override
public String getName() {
return name;
}

@Override
public String getUrl() {
return url;
}

@Override
public String getOverlay() {
return overlay;
}

@Override
public String getImageUrl() {
return imageUrl;
}

public static class DashboardTileBuilder {

private String name;
private String url;
private String overlay;
private String imageUrl;

public DashboardTileBuilder withName(String name) {
this.name = name;
return this;
}

public DashboardTileBuilder withUrl(String url) {
this.url = url;
return this;
}

public DashboardTileBuilder withOverlay(String overlay) {
this.overlay = overlay;
return this;
}

public DashboardTileBuilder withImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
return this;
}

public ExternalServiceTile build() {
return new ExternalServiceTile(this);
}
}
}

0 comments on commit ef8d0df

Please sign in to comment.