[SOLVED] Millheat Wifi Electric heater openhab binding

@seime
I have deleted all Items and also the thing “millheat:heater” and also the thing “millheat:account” completely.
I also tried to with the things online/offline but no difference.
I also tried to add the thing manually, the connection works well but no setpoint and master switch channels.

→ But the channels do not appear…

Is there a difference between Openhab V3.1 and V3.2?

I do not what changed between 3.1 and 3.2.

Did you try to add the items via item files?

@seime
! Thank you very much for your intensive help !

I have now also tried to add the items by file.
Now I can see the item, but

.

Here an outtake of my log in DEBUG mode:
→ For me it looks not bad, the heater says: " “canChangeTemp”: 1,"

Hier der gesamte auszug:
==> /var/log/openhab/openhab.log <==
2022-01-31 20:15:47.445 [DEBUG] [llheat.internal.client.RequestLogger] - Request 1b5362a9a8-16
1b5362a9a8-16 > POST https://eurouter.ablecloud.cn:9005/millService/v1/selectHomeList
1b5362a9a8-16 > Accept-Encoding: gzip
1b5362a9a8-16 > User-Agent: Jetty/9.4.40.v20210413
1b5362a9a8-16 > Connection: Keep-Alive
1b5362a9a8-16 > X-Zc-Major-Domain: seanywell
1b5362a9a8-16 > X-Zc-Msg-Name: millService
1b5362a9a8-16 > X-Zc-Sub-Domain: milltype
1b5362a9a8-16 > X-Zc-Seq-Id: 1
1b5362a9a8-16 > X-Zc-Version: 1
1b5362a9a8-16 > Content-Type: application/x-zc-object
1b5362a9a8-16 > X-Zc-Timestamp: 1643656547
1b5362a9a8-16 > X-Zc-Timeout: 300
1b5362a9a8-16 > X-Zc-Nonce: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1b5362a9a8-16 > X-Zc-User-Id: 216231
1b5362a9a8-16 > X-Zc-User-Signature: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1b5362a9a8-16 > X-Zc-Content-Length: 2
1b5362a9a8-16 > Host: eurouter.ablecloud.cn:9005
1b5362a9a8-16 > Content-Length: 2
{}
2022-01-31 20:15:47.573 [DEBUG] [llheat.internal.client.RequestLogger] - Response 1b536xxxxxxxxx
1b5362a9a8-16 < HTTP/1.1 200 OK
1b5362a9a8-16 < Content-Length: 523
1b5362a9a8-16 < Content-Type: application/x-zc-object
1b5362a9a8-16 < Server: Jetty(9.1.5.v20140505)
1b5362a9a8-16 < X-Zc-Msg-Name: X-Zc-Ack
1b5362a9a8-16 < X-Zc-Trace-Id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1b5362a9a8-16 < Date: Mon, 31 Jan 2022 19:15:47 GMT
{
  "hourSystem": 1,
  "homeList": [
    {
      "maxTemperature": 0,
      "maxTemperatureMsg": "Temperature range is limited by administrator to 5-35℃",
      "homeAlways": 0,
      "changeTemperature": 0,
      "homeName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "isHoliday": 0,
      "postcode": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "holidayStartTime": 0,
      "timeZone": "+01:00",
      "modeMinute": 0,
      "modeStartTime": 0,
      "holidayTemp": 10,
      "modeHour": 0,
      "changeTemperatureMsg": "Temperature change not allowed by administrator",
      "currentMode": 0,
      "holidayEndTime": 0,
      "holidayTempType": 1,
      "homeType": 0,
      "homeId": xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,
      "programId": xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    }
  ]
}
2022-01-31 20:15:47.577 [DEBUG] [llheat.internal.client.RequestLogger] - Request 1b536XXXXX
1b5362a9a8-17 > POST https://eurouter.ablecloud.cn:9005/millService/v1/selectRoombyHome
1b5362a9a8-17 > Accept-Encoding: gzip
1b5362a9a8-17 > User-Agent: Jetty/9.4.40.v20210413
1b5362a9a8-17 > Connection: Keep-Alive
1b5362a9a8-17 > X-Zc-Major-Domain: seanywell
1b5362a9a8-17 > X-Zc-Msg-Name: millService
1b5362a9a8-17 > X-Zc-Sub-Domain: milltype
1b5362a9a8-17 > X-Zc-Seq-Id: 1
1b5362a9a8-17 > X-Zc-Version: 1
1b5362a9a8-17 > Content-Type: application/x-zc-object
1b5362a9a8-17 > X-Zc-Timestamp: 1643656547
1b5362a9a8-17 > X-Zc-Timeout: 300
1b5362a9a8-17 > X-Zc-Nonce: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1b5362a9a8-17 > X-Zc-User-Id: 216231
1b5362a9a8-17 > X-Zc-User-Signature: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1b5362a9a8-17 > X-Zc-Content-Length: 61
1b5362a9a8-17 > Host: eurouter.ablecloud.cn:9005
1b5362a9a8-17 > Content-Length: 61
{
  "homeId": xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,
  "timeZoneNum": "+01:00"
}
2022-01-31 20:15:47.681 [DEBUG] [llheat.internal.client.RequestLogger] - Response 1b536xxxxxx
1b5362a9a8-17 < HTTP/1.1 200 OK
1b5362a9a8-17 < Content-Length: 486
1b5362a9a8-17 < Content-Type: application/x-zc-object
1b5362a9a8-17 < Server: Jetty(9.1.5.v20140505)
1b5362a9a8-17 < X-Zc-Msg-Name: X-Zc-Ack
1b5362a9a8-17 < X-Zc-Trace-Id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1b5362a9a8-17 < Date: Mon, 31 Jan 2022 19:15:47 GMT
{
  "maxTemperature": 0,
  "backMinute": 0,
  "maxTemperatureMsg": "Temperature range is limited by administrator to 5-35℃",
  "homeAlways": 0,
  "changeTemperature": 0,
  "homeName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "isHoliday": 0,
  "changeTemperatureMsg": "Temperature change not allowed by administrator",
  "backHour": 0,
  "roomInfo": [],
  "offLineDeviceNum": 0,
  "mode": 0,
  "onlineDeviceNum": 0,
  "programList": [
    {
      "programName": "Standard Program",
      "homeId": xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,
      "programId": xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    }
  ],
  "homeType": 0,
  "homeId": xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
2022-01-31 20:15:47.686 [DEBUG] [llheat.internal.client.RequestLogger] - Request 1b5362xxxxxx
1b5362a9a8-18 > POST https://eurouter.ablecloud.cn:9005/millService/v1/getIndependentDevices
1b5362a9a8-18 > Accept-Encoding: gzip
1b5362a9a8-18 > User-Agent: Jetty/9.4.40.v20210413
1b5362a9a8-18 > Connection: Keep-Alive
1b5362a9a8-18 > X-Zc-Major-Domain: seanywell
1b5362a9a8-18 > X-Zc-Msg-Name: millService
1b5362a9a8-18 > X-Zc-Sub-Domain: milltype
1b5362a9a8-18 > X-Zc-Seq-Id: 1
1b5362a9a8-18 > X-Zc-Version: 1
1b5362a9a8-18 > Content-Type: application/x-zc-object
1b5362a9a8-18 > X-Zc-Timestamp: 1643656547
1b5362a9a8-18 > X-Zc-Timeout: 300
1b5362a9a8-18 > X-Zc-Nonce: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1b5362a9a8-18 > X-Zc-User-Id: 216231
1b5362a9a8-18 > X-Zc-User-Signature: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1b5362a9a8-18 > X-Zc-Content-Length: 34
1b5362a9a8-18 > Host: eurouter.ablecloud.cn:9005
1b5362a9a8-18 > Content-Length: 34
{
  "homeId": xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
2022-01-31 20:15:47.809 [DEBUG] [llheat.internal.client.RequestLogger] - Response 1b5362a9a8-18
1b5362a9a8-18 < HTTP/1.1 200 OK
1b5362a9a8-18 < Content-Length: 368
1b5362a9a8-18 < Content-Type: application/x-zc-object
1b5362a9a8-18 < Server: Jetty(9.1.5.v20140505)
1b5362a9a8-18 < X-Zc-Msg-Name: X-Zc-Ack
1b5362a9a8-18 < X-Zc-Trace-Id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1b5362a9a8-18 < Date: Mon, 31 Jan 2022 19:15:47 GMT
{
  "deviceInfo": [
    {
      "fanStatusShow": 1,
      "manualControlTime": 0,
      "isManualControl": 0,
      "isHoliday": 0,
      "description": "",
      "canChangeTemp": 1,
      "holidayTemp": 3000,
      "deviceId": 304730,
      "deviceName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "roomId": xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,
      "deviceStatus": 0,
      "timer": "",
      "heaterFlag": 0,
      "powerStatus": 0,
      "times": "",
      "fanStatus": 0,
      "subDomainId": 6979,
      "coolingStatus": 0,
      "currentTemp": 451.0,
      "open": 3
    }
  ]
}

It looks like I have the same issue, also on Openhab 3.2.0. I followed the steps described and deleted all millheat:heater and millheat:account things, and added the account again. Added items via item files, and tried setting the account and things online/offline.

The heater in question (155417) is not added to a room in the Millheat app.

I see the same result as @SmartHome4all - no channels.

Debug log looks similar, too:

2022-02-01 20:57:45.020 [DEBUG] [llheat.internal.client.RequestLogger] - Request xxx-109
b5c300cb5a-109 > POST https://eurouter.ablecloud.cn:9005/millService/v1/selectHomeList
b5c300cb5a-109 > Accept-Encoding: gzip
b5c300cb5a-109 > User-Agent: Jetty/9.4.43.v20210629
b5c300cb5a-109 > Connection: Keep-Alive
b5c300cb5a-109 > X-Zc-Major-Domain: seanywell
b5c300cb5a-109 > X-Zc-Msg-Name: millService
b5c300cb5a-109 > X-Zc-Sub-Domain: milltype
b5c300cb5a-109 > X-Zc-Seq-Id: 1
b5c300cb5a-109 > X-Zc-Version: 1
b5c300cb5a-109 > Content-Type: application/x-zc-object
b5c300cb5a-109 > X-Zc-Timestamp: 1643745465
b5c300cb5a-109 > X-Zc-Timeout: 300
b5c300cb5a-109 > X-Zc-Nonce: XXX
b5c300cb5a-109 > X-Zc-User-Id: 110030
b5c300cb5a-109 > X-Zc-User-Signature: XXX
b5c300cb5a-109 > X-Zc-Content-Length: 2
b5c300cb5a-109 > Host: eurouter.ablecloud.cn:9005
b5c300cb5a-109 > Content-Length: 2

{}
2022-02-01 20:57:45.059 [DEBUG] [llheat.internal.client.RequestLogger] - Response xxx-109
b5c300cb5a-109 < HTTP/1.1 200 OK
b5c300cb5a-109 < Content-Length: 521
b5c300cb5a-109 < Content-Type: application/x-zc-object
b5c300cb5a-109 < Server: Jetty(9.1.5.v20140505)
b5c300cb5a-109 < X-Zc-Msg-Name: X-Zc-Ack
b5c300cb5a-109 < X-Zc-Trace-Id: XXX
b5c300cb5a-109 < Date: Tue, 01 Feb 2022 19:57:45 GMT

{
  "hourSystem": 1,
  "homeList": [
    {
      "maxTemperature": 0,
      "maxTemperatureMsg": "Temperature range is limited by administrator to 5-35℃",
      "homeAlways": 0,
      "changeTemperature": 0,
      "homeName": "House",
      "isHoliday": 0,
      "postcode": "XXX",
      "holidayStartTime": 0,
      "timeZone": "+01:00",
      "modeMinute": 0,
      "modeStartTime": 0,
      "holidayTemp": 14,
      "modeHour": 0,
      "changeTemperatureMsg": "Temperature change not allowed by administrator",
      "currentMode": 0,
      "holidayEndTime": 0,
      "holidayTempType": 0,
      "homeType": 0,
      "homeId": XXX,
      "programId": XXX
    }
  ]
}
2022-02-01 20:57:45.060 [DEBUG] [llheat.internal.client.RequestLogger] - Request xxx-110
b5c300cb5a-110 > POST https://eurouter.ablecloud.cn:9005/millService/v1/selectRoombyHome
b5c300cb5a-110 > Accept-Encoding: gzip
b5c300cb5a-110 > User-Agent: Jetty/9.4.43.v20210629
b5c300cb5a-110 > Connection: Keep-Alive
b5c300cb5a-110 > X-Zc-Major-Domain: seanywell
b5c300cb5a-110 > X-Zc-Msg-Name: millService
b5c300cb5a-110 > X-Zc-Sub-Domain: milltype
b5c300cb5a-110 > X-Zc-Seq-Id: 1
b5c300cb5a-110 > X-Zc-Version: 1
b5c300cb5a-110 > Content-Type: application/x-zc-object
b5c300cb5a-110 > X-Zc-Timestamp: 1643745465
b5c300cb5a-110 > X-Zc-Timeout: 300
b5c300cb5a-110 > X-Zc-Nonce: XXX
b5c300cb5a-110 > X-Zc-User-Id: 110030
b5c300cb5a-110 > X-Zc-User-Signature: XXX
b5c300cb5a-110 > X-Zc-Content-Length: 61
b5c300cb5a-110 > Host: eurouter.ablecloud.cn:9005
b5c300cb5a-110 > Content-Length: 61

{
  "homeId": 202002231649150016,
  "timeZoneNum": "+01:00"
}
2022-02-01 20:57:45.221 [DEBUG] [llheat.internal.client.RequestLogger] - Response xxx-110
b5c300cb5a-110 < HTTP/1.1 200 OK
b5c300cb5a-110 < Content-Length: 743
b5c300cb5a-110 < Content-Type: application/x-zc-object
b5c300cb5a-110 < Server: Jetty(9.1.5.v20140505)
b5c300cb5a-110 < X-Zc-Msg-Name: X-Zc-Ack
b5c300cb5a-110 < X-Zc-Trace-Id: XXX
b5c300cb5a-110 < Date: Tue, 01 Feb 2022 19:57:45 GMT

{
  "maxTemperature": 0,
  "backMinute": 0,
  "maxTemperatureMsg": "Temperature range is limited by administrator to 5-35℃",
  "homeAlways": 0,
  "changeTemperature": 0,
  "homeName": "House",
  "isHoliday": 0,
  "changeTemperatureMsg": "Temperature change not allowed by administrator",
  "backHour": 0,
  "roomInfo": [],
  "offLineDeviceNum": 0,
  "mode": 0,
  "onlineDeviceNum": 0,
  "programList": [
    {
      "programName": "Standard Program",
      "homeId": XXX,
      "programId": XXX
    },
    {
      "programName": "Homeoffice",
      "homeId": XXX,
      "programId": XXX
    },
    {
      "programName": "Kitchen",
      "homeId": XXX,
      "programId": XXX
    },
    {
      "programName": "Lekerom",
      "homeId": XXX,
      "programId": XXX
    }
  ],
  "homeType": 0,
  "homeId": 202002231649150016
}
2022-02-01 20:57:45.224 [DEBUG] [llheat.internal.client.RequestLogger] - Request xxx-111
b5c300cb5a-111 > POST https://eurouter.ablecloud.cn:9005/millService/v1/getIndependentDevices
b5c300cb5a-111 > Accept-Encoding: gzip
b5c300cb5a-111 > User-Agent: Jetty/9.4.43.v20210629
b5c300cb5a-111 > Connection: Keep-Alive
b5c300cb5a-111 > X-Zc-Major-Domain: seanywell
b5c300cb5a-111 > X-Zc-Msg-Name: millService
b5c300cb5a-111 > X-Zc-Sub-Domain: milltype
b5c300cb5a-111 > X-Zc-Seq-Id: 1
b5c300cb5a-111 > X-Zc-Version: 1
b5c300cb5a-111 > Content-Type: application/x-zc-object
b5c300cb5a-111 > X-Zc-Timestamp: 1643745465
b5c300cb5a-111 > X-Zc-Timeout: 300
b5c300cb5a-111 > X-Zc-Nonce: XXX
b5c300cb5a-111 > X-Zc-User-Id: 110030
b5c300cb5a-111 > X-Zc-User-Signature: XXX
b5c300cb5a-111 > X-Zc-Content-Length: 34
b5c300cb5a-111 > Host: eurouter.ablecloud.cn:9005
b5c300cb5a-111 > Content-Length: 34

{
  "homeId": XXX
}
2022-02-01 20:57:45.605 [DEBUG] [llheat.internal.client.RequestLogger] - Response xxx-111
b5c300cb5a-111 < HTTP/1.1 200 OK
b5c300cb5a-111 < Content-Length: 729
b5c300cb5a-111 < Content-Type: application/x-zc-object
b5c300cb5a-111 < Server: Jetty(9.1.5.v20140505)
b5c300cb5a-111 < X-Zc-Msg-Name: X-Zc-Ack
b5c300cb5a-111 < X-Zc-Trace-Id: XXX
b5c300cb5a-111 < Date: Tue, 01 Feb 2022 19:57:45 GMT

{
  "deviceInfo": [
    {
      "fanStatusShow": 0,
      "manualControlTime": 0,
      "isManualControl": 0,
      "isHoliday": 0,
      "description": "",
      "canChangeTemp": 1,
      "holidayTemp": 22,
      "deviceId": 155417,
      "deviceName": "Kjeller",
      "roomId": XXX,
      "deviceStatus": 0,
      "timer": "",
      "heaterFlag": 1,
      "powerStatus": 1,
      "times": "",
      "fanStatus": 0,
      "subDomainId": 5316,
      "coolingStatus": 0,
      "currentTemp": 22.0,
      "open": 0
    },
    {
      "fanStatusShow": 0,
      "manualControlTime": 0,
      "isManualControl": 0,
      "isHoliday": 0,
      "description": "OFF",
      "canChangeTemp": 0,
      "holidayTemp": 21,
      "deviceId": 157618,
      "deviceName": "Kjøkken",
      "roomId": XXX,
      "deviceStatus": 0,
      "timer": "OFF in 00:32",
      "heaterFlag": 1,
      "powerStatus": 1,
      "times": "00:32",
      "fanStatus": 0,
      "subDomainId": 5316,
      "coolingStatus": 0,
      "currentTemp": 21.0,
      "open": 0
    }
  ]
}
2022-02-01 20:57:45.607 [DEBUG] [ternal.handler.MillheatHeaterHandler] - Cannot update power for heater as the nominal power has not been configured for thing millheat:heater:xxx:157618
2022-02-01 20:58:03.340 [DEBUG] [ternal.handler.MillheatHeaterHandler] - Initializing Millheat heater using config MillheatHeaterConfiguration [macAddress=null, heaterId=155417, power=null]

The thing is online and all channels, except masterSwitch and targetTemperature are available:

I did look into the code of the binding, and there is something that grabbed my attention. In MillheatHeaterHandler.java, where the heater is initialized (I believe), there is a check for canChangeTemp and no room set before adding the two channels in question:

    private void addOptionalChannels(final Heater heater) {
        final List<Channel> newChannels = new ArrayList<>();
        newChannels.addAll(getThing().getChannels());
        if (heater.canChangeTemp() && heater.getRoom() == null) {
            // Add power switch channel
            newChannels
                    .add(ChannelBuilder
                            .create(new ChannelUID(getThing().getUID(), MillheatBindingConstants.CHANNEL_MASTER_SWITCH),
                                    "Switch")
                            .withType(MillheatBindingConstants.CHANNEL_TYPE_MASTER_SWITCH_UID).build());
            // Add independent heater target temperature
            newChannels.add(ChannelBuilder
                    .create(new ChannelUID(getThing().getUID(), MillheatBindingConstants.CHANNEL_TARGET_TEMPERATURE),
                            "Number:Temperature")
                    .withType(MillheatBindingConstants.CHANNEL_TYPE_TARGET_TEMPERATURE_HEATER_UID).build());
        }

        updateThing(editThing().withChannels(newChannels).build());
    }

From the debug log, it looks like the roomId is set, despite the heater not beeing assigned to a room. If that is the case, the check above would return false, and no additional channels would be added?

Or did I miss something?

That was a red herring… I finally got around to install the dev environment and started to debug what is happening on my end.

I noticed that the Heater class is initialised with dto.holiday instead of dto.canChangeTemp in model/Heater.java:

    public Heater(final DeviceDTO dto) {
        id = dto.deviceId;
        name = dto.deviceName;
        macAddress = dto.macAddress;
        heatingActive = dto.heaterFlag;
        canChangeTemp = dto.canChangeTemp;
        subDomain = dto.subDomainId;
        currentTemp = (int) dto.currentTemp;
        setTargetTemp(dto.holidayTemp);
        setFanActive(dto.fanStatus);
        setPowerStatus(dto.powerStatus);
        windowOpen = dto.openWindow;
    }

I tried and changed this to dto.canChangeTemp and suddenly everything is working!

The two channels are available, and I can control the heater - both the master switch and temperature :smile:

I assume that the response has somehow been changed on the server side, as I can’t see that there where any code changes. I have no idea whether this will work for others, let me know if you need any more information.

@seime I can do a merge request if you prefer, but I’d rather have someone with more Java experience look into this before I do that :wink:

1 Like

I’ll have a look at it in a few weeks!

Regards

2 Likes

This will most likely solve the case I described here as well:
https://community.openhab.org/t/millheat-binding-channels-missing/132607/10?u=martindk

Hi @Michael_Nemecky, thanks for pointing this out. I will do a verification. Did you test how holiday mode affects control of the heater when heater is in standalone mode?

Since the binding was created, new models have arrived - including a new generation (V3) that I see need a bit different handling. There are also some new consumption data and (external?) sensors in place.

I should probably do a full review of the new functionality, but it will take some more time though.

Cheers

Hi @seime

I have not used holiday mode before, as I have implemented my own holiday mode so to speak in Openhab :wink:

I did try this two days ago, and enabled holiday mode in the Millheat app. I defined start and date date&time, a vacation temperature and activated “Vacation mode” (not the Advanced one) - but it does not look like this changes anything? All my (3) heaters are independent devices, but neither the temperature displayed in the app changed, nor did the heaters get any updates.

I can’t see any changes, and setting the heater targetTemp is still working as expected.

I left it running with DEBUG, the following is an excerpt of the logfile:

  "maxTemperature": 0,
  "backMinute": 0,
  "maxTemperatureMsg": "Temperature range is limited by administrator to 5-35℃",
  "homeAlways": 0,
  "changeTemperature": 0,
  "homeName": "House",
  "isHoliday": 1,
  "changeTemperatureMsg": "Temperature change not allowed by administrator",
  "backHour": 0,
  "roomInfo": [],
  "offLineDeviceNum": 0,
  "mode": 0,
  "onlineDeviceNum": 0,
  "programList": [
    { 
      "programName": "Standard Program",
      "homeId": XXX,
      "programId": XXX
    },
    { 
      "programName": "Homeoffice",
      "homeId": XXX,
      "programId": XXX
    },
    { 
      "programName": "Kitchen",
      "homeId": XXX,
      "programId": XXX
    },
    { 
      "programName": "Lekerom",
      "homeId": XXX,
      "programId": XXX
    }
  ],
  "homeType": 0,
  "homeId": XXX
}

and further

{
  "deviceInfo": [
    {
      "fanStatusShow": 0,
      "manualControlTime": 0,
      "isManualControl": 0,
      "isHoliday": 0,
      "description": "",
      "canChangeTemp": 1,
      "holidayTemp": 21,
      "deviceId": 155417,
      "deviceName": "Kjeller",
      "roomId": XXX,
      "deviceStatus": 0,
      "timer": "",
      "heaterFlag": 1,
      "powerStatus": 1,
      "times": "",
      "fanStatus": 0,
      "subDomainId": 5316,
      "coolingStatus": 0,
      "currentTemp": 21.0,
      "open": 0
    },
    {
      "fanStatusShow": 0,
      "manualControlTime": 0,
      "isManualControl": 0,
      "isHoliday": 0,
      "description": "",
      "canChangeTemp": 1,
      "holidayTemp": 21,
      "deviceId": 157618,
      "deviceName": "Kjøkken",
      "roomId": XXX,
      "deviceStatus": 0,
      "timer": "",
      "heaterFlag": 0,
      "powerStatus": 1,
      "times": "",
      "fanStatus": 0,
      "subDomainId": 5316,
      "coolingStatus": 0,
      "currentTemp": 22.0,
      "open": 0
    },
    {
      "fanStatusShow": 0,
      "manualControlTime": 0,
      "isManualControl": 0,
      "isHoliday": 0,
      "description": "",
      "canChangeTemp": 1,
      "holidayTemp": 16,
      "deviceId": 250995,
      "deviceName": "Lekerom",
      "roomId": XXX,
      "deviceStatus": 0,
      "timer": "",
      "heaterFlag": 0,
      "powerStatus": 1,
      "times": "",
      "fanStatus": 0,
      "subDomainId": 5316,
      "coolingStatus": 0,
      "currentTemp": 17.0,
      "open": 0
    }
  ]
}

Let me know if you need any testing (I currently only have V2 devices available, though).

/Michael

Hi Arne, did you get a chance to look at this - and possibly have an updated binding .jar for testing ?
I would really like to use this - while it is still cold here in the nordics :wink:

Hi @martindk

Here’s the version I have running for 2-3 weeks now with good success, with the changes I mentioned earlier. I’m running OH 3.2.0 too, btw.

Hi @Michael_Nemecky - are you sure it is the right version ? I still get dont get the “target temperature” channel in the UI ?
I have two millheat heaters - both set up as independant heaters (not linked to a room).

I’m pretty sure it’s the right one, I took the file from my /usr/share/openhab/addons folder where I had installed it. But not 100% :blush:

It also shows up in the list of bundles

openhab> bundle:list|grep Mill
345 │ Active │  80 │ 3.3.0.202202041545    │ openHAB Add-ons :: Bundles :: Millheat Binding
openhab> bundle:headers 345

openHAB Add-ons :: Bundles :: Millheat Binding (345)
----------------------------------------------------
Automatic-Module-Name = org.openhab.binding.millheat
Bnd-LastModified = 1643989523110
Build-Jdk = 11.0.13
Built-By = michael
Created-By = 11.0.13 (Azul Systems, Inc.)
Manifest-Version = 1.0
Service-Component = OSGI-INF/org.openhab.binding.millheat.internal.MillheatHandlerFactory.xml
Tool = Bnd-6.1.0.202111221555

You might want to check that the correct one is installed (I needed to uninstall the old one with ‘bundle uninstall’, maybe should have used update instead of install…)

Yep - it is the same as you describe - my output from the console is identical to what you show and it is the only version of the binding installed.

Strange… The binding still sort of works - but I dont get the settemp channel in the UI…

Strange indeed.

Sorry, I don’t have any good ideas where to start - except the usual like removing the Heater thing and adding again. I don’t remember whether I had to do this to get it working, or not…

I can confirm that the binding is now working correctly with my “independant heaters” (heaters not in a room) - after grabbing the binding from the latest 3.3-snapshot.

Thanks @seime for the effort !

And now it doesnt work again :frowning: Is this a problem in the API ?

Did you uninstall the previous versions of the binding?

Yes - in the console, only this (related to Millheat) comes:

357 │ Active │  80 │ 3.3.0.202203120350    │ openHAB Add-ons :: Bundles :: Millheat Binding

I´m trying to set vacation mode, but I get an error code 6012 “invalid result”.

Any pointers to what could possibly be wrong?

I´m using a script to set the relevant commands (start, end etc) for activating holiday mode.

var Vacation_Mode_Start = zdt.now().toLocalDateTime();
var Vacation_Mode_End = zdt.now().toLocalDateTime().plusDays(14);
  //Update MillHeat vacation mode
  events.sendCommand('Millheat_Vacation_Mode_Start',Vacation_Mode_Start);
  events.sendCommand('Millheat_Vacation_Mode_End',Vacation_Mode_End);
  events.sendCommand('Millheat_Vacation_Mode','ON');
  events.sendCommand('Millheat_Vacation_Mode_Advanced','ON');
  events.sendCommand('Millheat_Vacation_Target_Temperature','16');

From the debug log

1fc5eac128-11691 > POST https://eurouter.ablecloud.cn:9005/millService/v1/holidayChooseHome
1fc5eac128-11691 > Accept-Encoding: gzip
1fc5eac128-11691 > User-Agent: Jetty/9.4.50.v20221201
1fc5eac128-11691 > Connection: Keep-Alive
1fc5eac128-11691 > X-Zc-Major-Domain: seanywell
1fc5eac128-11691 > X-Zc-Msg-Name: millService
1fc5eac128-11691 > X-Zc-Sub-Domain: milltype
1fc5eac128-11691 > X-Zc-Seq-Id: 1
1fc5eac128-11691 > X-Zc-Version: 1
1fc5eac128-11691 > Content-Type: application/x-zc-object
1fc5eac128-11691 > X-Zc-Timestamp: 1693413143
1fc5eac128-11691 > X-Zc-Timeout: 300
1fc5eac128-11691 > X-Zc-Nonce: xxxxxxxxxxxxx
1fc5eac128-11691 > X-Zc-User-Id: 69281
1fc5eac128-11691 > X-Zc-User-Signature: xxxxxxxxx
1fc5eac128-11691 > X-Zc-Content-Length: 133
1fc5eac128-11691 > Host: eurouter.ablecloud.cn:9005
1fc5eac128-11691 > Content-Length: 133
{
“homeList”: [
{
“homeId”: xxxxxxxxx
}
],
“timeZoneNum”: “+02:00”,
“key”: “isHoliday”,
“value”: 1
}
2023-08-30 18:32:23.820 [DEBUG] [llheat.internal.client.RequestLogger] - Response 1fc5eac128-11691
1fc5eac128-11691 < HTTP/1.1 200 OK
1fc5eac128-11691 < Content-Length: 43
1fc5eac128-11691 < Content-Type: application/x-zc-object
1fc5eac128-11691 < Server: Jetty(9.1.5.v20140505)
1fc5eac128-11691 < X-Zc-Msg-Name: X-Zc-Err
1fc5eac128-11691 < X-Zc-Trace-Id: xxxxxxxxxx
1fc5eac128-11691 < Date: Wed, 30 Aug 2023 16:32:23 GMT
{
“errorCode”: 6012,
“error”: “invalid result”
}