Hi,
I’m struggling with the configuration of a simple example where the sitemap presents a chart of a group of temperature sensors, two specifically. I am using rrd4j to store values, and set the everyMinute to the group as read over multiple tutorials/examples, but when I open the webpage the chart is empty and the log (in debug mode) shows:
18:20:08.503 [INFO ] [ui.internal.chart.ChartServlet:251 ] - Illegal argument in chart: {}
java.lang.IllegalArgumentException: Series name >Temperature < has already been used. Use unique names for each series!!!
at com.xeiam.xchart.internal.chartpart.AxisPair.addSeries(AxisPair.java:123) ~[na:na]
at com.xeiam.xchart.Chart.addSeries(Chart.java:115) ~[na:na]
at org.openhab.ui.internal.chart.DefaultChartProvider.addItem(DefaultChartProvider.java:354) ~[na:na]
at org.openhab.ui.internal.chart.DefaultChartProvider.createChart(DefaultChartProvider.java:197) ~[na:na]
at org.openhab.ui.internal.chart.ChartServlet.doGet(ChartServlet.java:245) ~[na:na]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:735) [javax.servlet_3.0.0.v201112011016.jar:na]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) [javax.servlet_3.0.0.v201112011016.jar:na]
at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61) [org.eclipse.equinox.http.servlet_1.1.300.v20120522-1841.jar:na]
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:128) [org.eclipse.equinox.http.servlet_1.1.300.v20120522-1841.jar:na]
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60) [org.eclipse.equinox.http.servlet_1.1.300.v20120522-1841.jar:na]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) [javax.servlet_3.0.0.v201112011016.jar:na]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598) [org.eclipse.jetty.servlet_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:486) [org.eclipse.jetty.servlet_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413) [org.eclipse.jetty.servlet_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.Server.handle(Server.java:350) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630) [org.eclipse.jetty.http_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230) [org.eclipse.jetty.http_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77) [org.eclipse.jetty.server_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:191) [org.eclipse.jetty.io_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:606) [org.eclipse.jetty.io_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46) [org.eclipse.jetty.io_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603) [org.eclipse.jetty.util_8.1.3.v20120522.jar:8.1.3.v20120522]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538) [org.eclipse.jetty.util_8.1.3.v20120522.jar:8.1.3.v20120522]
at java.lang.Thread.run(Thread.java:744) [na:1.8.0]
Could anyone throw any light? My version is 1.7.1 and my config files are like this:
default.items
Group gCasaML "CasaML" <groundfloor>
/* summaries */
Group:Number:AVG TempIndoor "Avg indoor Temperature [%.1f °C]" <temperature> (gCasaML)
Group:Switch:OR(ON,OFF) Heating "Active heatings [(%d)]" <heating> (gCasaML)
Group:Switch:OR(ON,OFF) AC "Air conditioning [(%s)]" <climate> (gCasaML)
Group HumIndoor (gCasaML)
/* PASILLO */
Group gCorridor "Pasillo" (gCasaML)
Number tempCorridor "Temperature [%.1f °C]" <temperature> (TempIndoor, gCorridor) {mqtt="<[cc:SnS/1/1/V_TEMP:state:default]"}
Number humCorridor "Humidity [%.1f]" <temperature> (Humidities) {mqtt="<[cc:SnS/1/0/V_HUM:state:default]"}
/* SALON */
Group gLiving "Salón" (gCasaML)
Number tempLiving "Temperature [%.1f °C]" <temperature> (TempIndoor, gLiving) {mqtt="<[cc:tmp/msr/TS00:state:default]"}
Switch socket0Living "Socket 0" <socket> (gLiving) {mqtt=">[cc:pm/act/WS00/0:command:*:default],<[cc:pm/adv/WS00/0:state:default]", autoupdate="false"}
Switch socket1Living "Socket 1" <socket> (gLiving) {mqtt=">[cc:pm/act/WS00/1:command:*:default],<[cc:pm/adv/WS00/1:state:default]", autoupdate="false"}
Switch socket2Living "Socket 2" <socket> (gLiving) {mqtt=">[cc:pm/act/WS00/2:command:*:default],<[cc:pm/adv/WS00/2:state:default]", autoupdate="false"}
Switch socket3Living "Socket 3" <socket> (gLiving) {mqtt=">[cc:pm/act/WS00/3:command:*:default],<[cc:pm/adv/WS00/3:state:default]", autoupdate="false"}
/* COCINA */
Group gKitchen "Cocina" (gCasaML)
/* BAÑO */
Group gToilet "Baño" (gCasaML)
/* HABITACION */
Group gRoom "Habitación" (gCasaML)
/* BAÑO DORMITORIO */
Group gBathroom "Baño dormitorio" (gCasaML)
/* DORMITORIO */
Group gBedroom "Dormitorio" (gCasaML)
/* SIN LUGAR ESPECIFICO */
Switch boiler "Boiler" <heating> (Heating) {mqtt=">[cc:boiler/act/BO00:command:*:default],<[cc:boiler/adv/BO00:state:default]", autoupdate="false"}
Switch airConditioner "Air conditioning" <climate> (AC) {mqtt=">[cc:ac/act/AC00:command:*:default],<[cc:ac/adv/AC00:state:default]", autoupdate="false"}
default.sitemap
sitemap default label="CasaML"
{
Frame label="TempIndoor" {
Chart item=TempIndoor period=4h refresh=60000
}
Frame label="HumIndoor" {
Chart item=HumIndoor period=4h refresh=60000
}
Frame label="Heating" {
Switch item=boiler label="Boiler"
}
Frame label="Air conditioning" {
Switch item=airConditioner label="Air conditioner"
}
Frame label="Wall sockets" {
Switch item=socket0Living label="Socket 0"
Switch item=socket1Living label="Socket 1"
Switch item=socket2Living label="Socket 2"
Switch item=socket3Living label="Socket 3"
}
}
rrd4j.persist
// persistence strategies have a name and a definition and are referred to in the "Items" section
Strategies {
everyDay : "0 0 0 * * ?"
everyHour : "0 0 * * * ?"
everyMinute : "0 * * * * ?"
// if no strategy is specified for an item entry below, the default list will be used
default = everyChange
}
/*
* Each line in this section defines for which item(s) which strategy(ies) should be applied.
* You can list single items, use "*" for all items or "groupitem*" for all members of a group
* item (excl. the group item itself).
*/
Items {
// persist all items once a day and on every change and restore them from the db at startup
* : strategy = everyChange, everyDay, restoreOnStartup
// additionally, persist all temperature and weather values every hour
TempIndoor* : strategy = everyMinute
}