I really like the idea. Also using frontail and also Grafana. Remembering the ports is not user-friendly but your solution is great.
Nice idea, but I guess a “binding” is the wrong approach here.
The dashboard is already an OSGi service, why not simply add some configuration possibilities to it that picks up a conf/services/dashboard.cfg
file in which additional tiles can be specified?
I had this thought the other day but lack the skills to make it happen! This is a great step forward for novice users.
Nice idea, but I guess a “binding” is the wrong approach here.
Actually, it’s not binding but UI addon.
The dashboard is already an OSGi service, why not simply add some configuration possibilities to it that picks up a conf/services/dashboard.cfg file in which additional tiles can be specified?
I tested this approach yesterday and I agree, this could be better option. Do you or anyone else have suggestion/opinion about the dashboard.cfg file content?
Currently dashboard links have four parameters; name, url, overlay and image url.
JSON:
org.openhab.ui.dashboard:link1={“name” : “openHAB Log Viewer”, “url” : “http://192.168.1.5:9001”, “overlay” : “”, “imageUrl” : “data:image/png;base64,iVBORw0KGgoAAA…uQmCC” }
org.openhab.ui.dashboard:link2={“name” : “Node-RED”, “url” : “http://192.168.1.5:1880”, “overlay” : “”, “imageUrl” : “data:image/png;base64,iVBORw0KGgoAAAANSUh…SuQmCC” }
Individual options:
org.openhab.ui.dashboard:link-name1=openHAB Log Viewer
org.openhab.ui.dashboard:link-url1=http://192.168.1.5:9001
org.openhab.ui.dashboard:link-overlay1=
org.openhab.ui.dashboard:link-imageurl1=data:image/png;base64,iVBORw0KGgoAAA…uQmCC
org.openhab.ui.dashboard:link-name2=
org.openhab.ui.dashboard:link-url2=
org.openhab.ui.dashboard:link-overlay2=
org.openhab.ui.dashboard:link-imageurl2=
Comma separated options:
org.openhab.ui.dashboard:link1=“openHAB Log Viewer”, http://192.168.1.5:9001, html5, data:image/png;base64,iVBORw0KGgoAAA…uQmCC
org.openhab.ui.dashboard:link2=…
Any other options?
If we can have a list in JSON, this would be my favorite (as YAML obviously is no option)
If the numbers need to stay there, the individual options approach would be best in terms of readability IMHO
The comma-separated approach breaks easily, I assume, and looks awful as well
@pauli_anttila thank you so much for the enhancement!
Looks great!
Here’s my configuration file for anyone interested
$openhab-config/services/dashboard.cfg
frontail.link-name=openHAB Log Viewer
frontail.link-url=http://home:9001
frontail.link-imageurl=../static/frontail.png
nodered.link-name=Node-RED
nodered.link-url=http://home:1880
nodered.link-imageurl=../static/nodered.png
grafana.link-name=Grafana
grafana.link-url=http://home:3000
grafana.link-imageurl=../static/grafana.png
And in this album you can find the images to be placed in $openhab-config/html/
.
Here’s how it looks like:
Note: I’m using openHAB 2.2.0 Build #1031.
@pauli_anttila & @kubawolanin Would one of you like to add a sentence about that feature to https://github.com/openhab/openhab-distro/wiki/Draft-for-openHAB-2.2-Release-Notes#new-and-noteworthy, possibly just linking to @kubawolanin’s post here?
hey guys, would it possible to hide the paperui page via this method? thanks
I am wondering whether these *link-url will work through myopenhab,org or remotely (proxied through)? Or it is just for local network usage only. Thanks
Just for local use. myopenhab.org does not provide a generic proxy for all the web applications on your LAN, just openHAB’s REST API.
Above just puts a link on your dashboard.
Hi i just tried to add my own links by editing the dashboard.cfg, but then my dashboard stopped working. Now i restored my dashboard.cfg but it still doesn’t work. How can i fix it?
Here is what the browser shows:
HTTP ERROR 500
Problem accessing /start/index. Reason:
Server Error
Caused by:
java.lang.NullPointerException
at java.util.regex.Matcher.quoteReplacement(Matcher.java:701)
at org.openhab.ui.dashboard.internal.DashboardServlet.lambda$1(DashboardServlet.java:208)
at org.openhab.ui.dashboard.internal.DashboardServlet.replaceKeysWithFunction(DashboardServlet.java:217)
at org.openhab.ui.dashboard.internal.DashboardServlet.replaceKeysFromMap(DashboardServlet.java:207)
at org.openhab.ui.dashboard.internal.DashboardServlet.serveDashboard(DashboardServlet.java:96)
at org.openhab.ui.dashboard.internal.DashboardServlet.doGet(DashboardServlet.java:80)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:584)
at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180)
at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:284)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:512)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at org.eclipse.jetty.server.Server.handle(Server.java:534)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:283)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:108)
at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
at java.lang.Thread.run(Thread.java:748)
Try restarting openhab and if that doesn’t work, post your dashboard.cfg here.
Tried restarting and updating OH without success
The dashboard.cfg i have now (need to shorten the image part):
grafana.link-name=Grafana
grafana.link-url=http://192.168.1.20/grafana/?orgId=1
grafana.link-imageurl=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV4AAADkCAMAAADn07yPAAAABGdBTUEAALGPC[...]
frontail.link-name=openHAB Log Viewer
frontail.link-url=http://HausPi:9001
frontail.link-imageurl=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV4AAADqCAMAAADd2d3/AAAABGdBTUEAALGPC/xhBQAAAwBQTFRFaWJdYGFlZGl5bXN/dmppcmx3dHl+Y22CaHyMbH6YdHuGZ3z[...]
openhabiandocs.link-name=openHABian Help
openhabiandocs.link-url=https://docs.openhab.org/installation/openhabian.html
openhabiandocs.link-imageurl=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV4AAADmCAMAAACqGx2EAAAABGdBTUEAALGPC[...]
And here is the one that “broke” it:
grafana.link-name=Grafana
grafana.link-url=http://192.168.1.20/grafana/?orgId=1
grafana.link-imageurl=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV4AAADkCAMAAADn07yPAAAABGdBTUEAALGPC[...]
frontail.link-name=openHAB Log Viewer
frontail.link-url=http://HausPi:9001
frontail.link-imageurl=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV4AAADqCAMAAADd2d3/AAAABGdBTUEAALGPC/xhBQAAAwBQTFRFaWJdYGFlZGl5bXN/dmppcmx3dHl+Y22CaHyMbH6YdHuGZ3z[...]
openhabiandocs.link-name=openHABian Help
openhabiandocs.link-url=https://docs.openhab.org/installation/openhabian.html
openhabiandocs.link-imageurl=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV4AAADmCAMAAACqGx2EAAAABGdBTUEAALGPC[...]
homegear.link-name=Homegear RPC Server
homegear.link-url=http://192.168.1.20:2001/
homegear.link-imageurl=../static/homegear.png
cups.link-name=CUPS Printserver
cups.link-url=https://192.168.1.20:631/admin
cups.link-imageurl=../static/cups.png
homegear.png and cups.png are in [OHconfdir]/html
Thanks
Start of this message deleted Seems that I was wrong in my interpretation of that stack trace. But is this a bug that should be reported.
I searched for the original file but didn’t find it. While those are string items I’m not sure do they need quotes around them. In dashboards readme that I found there’s an example that is without quotes. You can try this one out by adding them like this:
grafana.link-imageurl="../static/grafana.png"
grafana.link-name="Grafana"
grafana.link-url="http://openhab:3000"
Ping @pauli_anttila, didn’t you create this feature? How is it?
Quotes shouldn’t be used.
@andirs, I quickly tested you “broken” configuration, but I didn’t meet any problems.
That’s odd
The only thing i can further contribute else is that this
2018-01-21 17:07:11.009 [WARN ] [eclipse.jetty.servlet.ServletHandler] - /start/index
java.lang.NullPointerException: null
at java.util.regex.Matcher.quoteReplacement(Matcher.java:701) ~[?:?]
at org.openhab.ui.dashboard.internal.DashboardServlet.lambda$1(DashboardServlet.java:208) ~[189:org.openhab.ui.dashboard:2.3.0.201801141430]
at org.openhab.ui.dashboard.internal.DashboardServlet.replaceKeysWithFunction(DashboardServlet.java:217) [189:org.openhab.ui.dashboard:2.3.0.201801141430]
at org.openhab.ui.dashboard.internal.DashboardServlet.replaceKeysFromMap(DashboardServlet.java:207) [189:org.openhab.ui.dashboard:2.3.0.201801141430]
at org.openhab.ui.dashboard.internal.DashboardServlet.serveDashboard(DashboardServlet.java:96) [189:org.openhab.ui.dashboard:2.3.0.201801141430]
at org.openhab.ui.dashboard.internal.DashboardServlet.doGet(DashboardServlet.java:80) [189:org.openhab.ui.dashboard:2.3.0.201801141430]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) [31:javax.servlet-api:3.1.0]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [31:javax.servlet-api:3.1.0]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848) [88:org.eclipse.jetty.servlet:9.3.22.v20171030]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:584) [88:org.eclipse.jetty.servlet:9.3.22.v20171030]
at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71) [191:org.ops4j.pax.web.pax-web-jetty:6.0.7]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [87:org.eclipse.jetty.server:9.3.22.v20171030]
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) [85:org.eclipse.jetty.security:9.3.22.v20171030]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) [87:org.eclipse.jetty.server:9.3.22.v20171030]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180) [87:org.eclipse.jetty.server:9.3.22.v20171030]
at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:284) [191:org.ops4j.pax.web.pax-web-jetty:6.0.7]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:512) [88:org.eclipse.jetty.servlet:9.3.22.v20171030]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) [87:org.eclipse.jetty.server:9.3.22.v20171030]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112) [87:org.eclipse.jetty.server:9.3.22.v20171030]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [87:org.eclipse.jetty.server:9.3.22.v20171030]
at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80) [191:org.ops4j.pax.web.pax-web-jetty:6.0.7]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) [87:org.eclipse.jetty.server:9.3.22.v20171030]
at org.eclipse.jetty.server.Server.handle(Server.java:534) [87:org.eclipse.jetty.server:9.3.22.v20171030]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333) [87:org.eclipse.jetty.server:9.3.22.v20171030]
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251) [87:org.eclipse.jetty.server:9.3.22.v20171030]
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:283) [79:org.eclipse.jetty.io:9.3.22.v20171030]
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:108) [79:org.eclipse.jetty.io:9.3.22.v20171030]
at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93) [79:org.eclipse.jetty.io:9.3.22.v20171030]
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303) [90:org.eclipse.jetty.util:9.3.22.v20171030]
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148) [90:org.eclipse.jetty.util:9.3.22.v20171030]
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136) [90:org.eclipse.jetty.util:9.3.22.v20171030]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671) [90:org.eclipse.jetty.util:9.3.22.v20171030]
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589) [90:org.eclipse.jetty.util:9.3.22.v20171030]
at java.lang.Thread.run(Thread.java:748) [?:?]
appears in my log every time i try to access the dashboard…
Edit: Ah ok it is the same the browser is showing…
I enjoy exactly the same problem, but with openHAB 2.0.1.
ava.lang.NullPointerException
at java.util.regex.Matcher.quoteReplacement(Matcher.java:701)
at org.openhab.ui.dashboard.internal.DashboardServlet.lambda$1(DashboardServlet.java:208)
at org.openhab.ui.dashboard.internal.DashboardServlet.replaceKeysWithFunction(DashboardServlet.java:217)
at org.openhab.ui.dashboard.internal.DashboardServlet.replaceKeysFromMap(DashboardServlet.java:207)
at org.openhab.ui.dashboard.internal.DashboardServlet.serveDashboard(DashboardServlet.java:96)
at org.openhab.ui.dashboard.internal.DashboardServlet.doGet(DashboardServlet.java:80)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:584)
at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180)
at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:284)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:512)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at org.eclipse.jetty.server.Server.handle(Server.java:534)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:283)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:108)
at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
at java.lang.Thread.run(Thread.java:748)
I wanted to include some stuff in the dashboard. As noticed it didn’t work i reverted dashboard.cfg to my previous version. But the exception stays, and the dashboard is unavailable. So, the dashboard.cfg itself is not the problem, but changing it triggerd something which stays corrupt.
sudo rm -rf /var/lib/openhab2/cache/*
sudo rm -rf /var/lib/openhab2/tmp/*
… did not help as well.
So did
sudo apt-get remove openhab2
sudo apt-get install openhab2
Any ideas anybody?
OK, found it by myself. A copy of dashboard.cfg is stored in
/var/lib/openhab2/config/org/openhab/
If this one contains something, dashboard is not happy about, dashboard is inaccessible.
Deleting that file made the dashboard work again.
Adding things to the dashboard was not available until OH 2.2.
Sorry. Typing error. 2.2.0-1