Floor Heating Danfoss Icon System

Since @sennm didn’t answer, I decided to check for myself. And to my surprise, it does actually work only with the APP module. So a solution to adding Danfoss Icon to HA, for now at least, could be to run a dummy instance of openHAB and connecting that to HA somehow.

The repository for the openhab addon is:
https://github.com/Sonic-Amiga/org.openhab.binding.devireg

1 Like

Sorry, the holidays got in the way. Indeed - this solution works with the app module, not the zigbee module. I played with the idea of porting the java code to python3, but I just don’t have the time. What I am building now for my setup is a container running the java api-client, that I will try to integrate with HA (either with MQTT, or http).

Any help/ideas are welcome! :slight_smile:

Sidenote: the integration in OpenHAB has been running smoothly for the last 3 months, so it’s def. possible

Since my post, I also thought about porting the code however, as you also mentioned, that would take a lot of time. Instead I decided to just run an openHAB instance alongside HA. I then went ahead and created a few scripts that imports all Danfoss “things” (or whatever they are called) from openHAB to HA via MQTT. So since then I have had all my Danfoss thermostats in HA, setup as climate entities and everything has been working smoothly for a month now. The ideal setup would definitely be to either have the code ported to python, or at least not having to run a full openHAB instance as well but for now at least this is my solution to actually being able to control my thermostats in HA.

  1. How have you integrated/bridged openHAB and HA?

  2. I will run openHAB in a docker container. The binding mentioned earlier requires the openSDG. My setup is docker on Synology. Any help on the setup?

2: I just followed the github README, which seems to work. Download the opensdg release applicable for your distro, and install into your container.

The ReadMe states:

UNIX build process is very straightforward. Download and install your dependencies using package management facilities of your distribution, then configure the build using cmake as usual. All the dependencies should be discovered automatically.

Are you able to describe the process or link to a guide-for-dummies?

I’ve made Home Assistant Addon which works very well with Danfoss Icon App module. Some documentation can be found here.

Nice!

I have added it and tried to configure it as described, but when I click “Start” then after 20 seconds or so I get the error message “Server Error”:

image

On the phone it says it has transferred the configuration and I can click next, so something does indeed trigger.
When looking in the “share” library nothing seems to have been written (empty folder).

Any ideas why?

Could you look into the add-on logs after pairing is done?
Have you managed to get to the “Discovered Icon house %s with %s peerId (privateKey: %s) successfully” message?
Also try creating /share/danfoss-icon directory manually and then run the pairing again. It might be that it cannot write the file there because the directory is missing.

1 Like

Hi,

Thanks for getting back to me. I found the issue was that some of my thermostats were low on battery and one them looked like it wasn’t connected to the Controller (probably ran out of battery). But after I installed new batteries in the units it went through flawlessy.

Now I just need to try out the Climate Card and see if I can get it to response to the rest commands.

Thank you - this is awesome!

1 Like

I’m glad it worked :slight_smile:
Regarding battery, I’ve made that it’s level is now exposed in each sensor as an attribute (battery_level), so you could always see the status of it (which is impossible to find in e.g., danfoss official icon app)

Hi soundvibe,
this sounds very promising. Just tried to make it work, but I’m failing in pairing…
I created the folder /share/danfoss-icon - when I enter the pairing-digits, after a few seconds I get an error on the phone, telling me something like (translated to english) “an Error occurred - something went wrong, the configuration could not be sent”. On the Logs from the add-on I get:

00:12:23.313 [JettyServerThreadPool-Virtual-12] INFO  n.s.h.d.protocol.DanfossDiscovery - Successfully connected to Danfoss grid
00:12:53.348 [JettyServerThreadPool-Virtual-12] ERROR net.soundvibe.hasio.Application - Failed to discover a new house

the second message gets logged only another few seconds after the error on the phone. Tried to restart the App, the add-on, no success. Any idea?

It looks like some connection issue. There should have been a stack trace logged after Failed to discover a new house message which would be very helpful to see.
I suggest trying to pair a few times again, maybe it’s just one time glitch.

This is awesome - I see that. Now I can drag those into my battery alarm automation.

Btw., the Climate Template card you are using, is that a manual rep I need to add. I’m not able to find it under Hacs?

It should be present in HACS integrations, just type Template Climate in a search box.

Tried - but no luck :frowning:

I think you need to add custom repository for it to appear in HACS, see here for detailed instructions.

That did the trick it seems. Now loaded and added.
How does your config look like for the card. I’ve tried adding it as described but it just says “no card type configured”.

Check your indentation, I’m using the same configuration as shown in the docs.md.

I tried again to pair and failed with the same errors, this time the full stack trace:

00:55:26.033 [JettyServerThreadPool-Virtual-20] INFO  n.s.h.d.protocol.DanfossDiscovery - Successfully connected to Danfoss grid
00:55:56.068 [JettyServerThreadPool-Virtual-20] ERROR net.soundvibe.hasio.Application - Failed to discover a new house
java.lang.RuntimeException: Failed to connect to the sender: 
	at net.soundvibe.hasio.danfoss.protocol.DanfossDiscovery.discover(DanfossDiscovery.java:65)
	at net.soundvibe.hasio.Application.lambda$main$2(Application.java:58)
	at io.javalin.routing.HandlerEntry.handle(HandlerEntry.kt:19)
	at io.javalin.http.servlet.DefaultTasks.HTTP$lambda$8$lambda$6$lambda$5(DefaultTasks.kt:39)
	at io.javalin.http.servlet.JavalinServlet.handleTask(JavalinServlet.kt:88)
	at io.javalin.http.servlet.JavalinServlet.handleSync(JavalinServlet.kt:53)
	at io.javalin.http.servlet.JavalinServlet.service(JavalinServlet.kt:41)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
	at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:58)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:529)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1570)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1381)
	at io.javalin.jetty.JettyServer$start$wsAndHttpHandler$1.doHandle(JettyServer.kt:61)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1543)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1303)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
	at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:173)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
	at org.eclipse.jetty.server.Server.handle(Server.java:563)
	at org.eclipse.jetty.server.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1598)
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:753)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:501)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:287)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:314)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
	at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at java.base/java.lang.VirtualThread.run(VirtualThread.java:309)
Caused by: java.rmi.RemoteException: Connection refused by grid: 1
	at io.github.sonic_amiga.opensdg.java.PeerConnection.startForwarding(PeerConnection.java:92)
	at io.github.sonic_amiga.opensdg.java.PeerConnection.connectToRemote(PeerConnection.java:72)
	at net.soundvibe.hasio.danfoss.protocol.DanfossDiscovery.discover(DanfossDiscovery.java:63)
	... 35 common frames omitted