Don't apply the firmware update to your Ecodan FTC5 (yet)

If it’s helpful the request codes are listed in the service manual, page 60. This is mine: Ecodan PUZ-WM(50-60-85-112)V(H-A)A Service Manual (OCH727) - Document Library - Mitsubishi Electric


I can do better than that John, here’s the data (with some noise removed).

You can get this for your system. In your browser if you watch the traffic using developer tools via the “F12” key when you use MELCloud.

I renamed it “.txt” so Discourse would let me upload it.

devices-for-john-cantor.json.txt (14.5 KB)

Let me know if you’d like to see any other bits @johncantor

1 Like

Many thanks David. Fascinating… lots of interesting numbers in there. I dont think any of the ‘Running Information’ values are in there (values from temperure sensors etc). Unfortunately I dont have Melcloud. Have you investigated what info is on the SD card on the FTC panel?
Still finding my new unit ‘revving up’, and flow temperature creeping up, when I would not expect it to. Not got to bottom of it yet.

1 Like

I’ve not looked at the SD Card either, I believe I’d have to remove the case to get to it which I’m trying not to do during the warranty.

If you look at Swift3, you will be bombarded/baffled by graphs… I am!!

I have never seen the compressor discharge pipe oscillating like Bart Simpson! I guess you dont have access to the discharge temperature? It’s code 004 on ‘running Information’
I actually borrowed a melcloud module, but not bothered to look at it really… it seems a bit limited.
I might ask others to look at the discharge temperature… not sure what we would lean from it though

I look forward to getting to the bottom of it

I might put something publically on the forum, but am mindful it may not be a good idea to criticise Ecodan. Or at least… I should criticise thoughtfully


1 Like

I have now put (non intrusively) a few sensors around my refrigeration circuit. My old 5kW has a steady discharge temperature (‘running info’ code004) but the new one is modulating regularly with dramatic swings from around 50 down to 35C. Not seen anything like that before. I look forward to getting to the bottom of it.

1 Like

How does one look at Swift3? I’m not sure what that means. I graduated in statistics so might not be too baffled, assuming the graphs make any sense.

I am loosing the will to live now! My old model has been there for 10 years, and always done what I expected and what I wanted. This new one seems to do what you least expect. Maybe I am missing something, and I hope is a fault. Swift3 is an emoncms account.

1 Like

I fear it may be a fault in the latest firmware update. Mine also seems to increase the flow temperature aggressively if left to do what it wants, which I think then causes it to go above the target flow temperature, try to modulate down aggressively, then the temperature difference falls below 4° and it shuts down for a few minutes before starting another cycle. If I spot this, I can often stop it cycling by reducing the flow temperature 2°, waiting for it to steady and then stepping it back up, but I’m not always watching and I haven’t automated this yet.

That is interesting observation. I did get mine to go steady-state minimum for 10 minutes! then it ‘revved up’ and cycled. If I could get mine to at least steady state at 50% of output rating, I would be mildly happy.
Given I got COP 5.25 yesterday during a steady period (mostly 3.5 to 5.5kW), and the discharge temperure was oscillationg between 50 and 35, I am no longer worrying about the discharge (code 004) dropping so low… maybe its normal?

I hope that was during a warm bit of daytime, else I am really puzzled by our COP of 3.97 during a steady period of 4kW yesterday evening, despite a couple of known problems I want fixed already.

It was +7C outside, and flow temp about 35, return about 30, averages. Mine seems to do what the data shows if I can manage to get it in steady state. That seems a challenge

To be clear, what conditions were you 3.97 measured in? What was it measured with and is it allowing for glycol. There are two issues I am grappling with. 1) In steady-state, is the COP as data sheet . 2) What actual final COP when in normal use and stopping and starting etc.

Ambient +7°C, flow temp average 37, return temp average 32.5, read from melcloud and I hope it allows for glycol. The data sheet for my 8.5kW model makes me think COP should be over 4.4 in that situation, as that’s what’s given for a 40° flow at 6.8kW. The 35° flow 7° ambient curve in the graphs shows a COP above 5 for 4kW. The 45° flow one shows just below 3.8 for 4kW. So would you agree that mine is underperforming at present?

I agree that getting it into steady-state seems to be the challenge. The current firmware seems far too keen to aggressively increase flow temperature and trigger a flow ≤ return+3 shutdown.

@mjr You might be interested in this file:

It’s used on this line of my app:

so that it charts the efficiency for actual flow and ambient temperature.

As a result you can see the gold line on this chart shows I’m not hitting the “Nominal [email protected]” so my system isn’t performing terribly well.

As you can guess, I got bored of interpolating the figures mentally and looking at the other charts, I wanted the computer to do it for me.

ofc that set of efficiencies is for my heat pump, you’d need to enter the ones for yours. That will also get boring because you’d need to enter every flow / ambient combination which in my case is 35 x 30 which is about 1,000 entries.

So what I actually did was enter the ones from the data sheet and let the computer do the work. I love discourse, but it’s not going to let me upload those files, so here goes!

This is device_efficiencies.json :

    "25": {
        "nominal": {
            "-10": 2.59,
            "-7": 2.78,
            "2": 2.99,
            "7": 4.54,
            "12": 5.18,
            "15": 5.35,
            "20": 5.57
    "35": {
        "nominal": {
            "-20": 1.51,
            "-15": 1.96,
            "-10": 2.41,
            "-7": 2.68,
            "2": 3.11,
            "7": 4.26,
            "12": 4.51,
            "15": 4.66,
            "20": 4.91
    "40": {
        "nominal": {
            "-20": 1.37,
            "-15": 1.78,
            "-10": 2.19,
            "-7": 2.44,
            "2": 2.86,
            "7": 3.81,
            "12": 4.03,
            "15": 4.17,
            "20": 4.4
        "mid": {
            "-20": 2.13,
            "-15": 2.23,
            "-10": 2.33,
            "-7": 2.39,
            "2": 3.01,
            "7": 3.75,
            "12": 4.11,
            "15": 4.33,
            "20": 4.7
        "min": {
            "-20": 2.13,
            "-15": 2.23,
            "-10": 2.33,
            "-7": 2.02,
            "2": 2.46,
            "7": 3.41,
            "12": 3.89,
            "15": 4.17,
            "20": 4.65
    "45": {
        "nominal": {
            "-20": 1.23,
            "-15": 1.6,
            "-10": 1.97,
            "-7": 2.19,
            "2": 2.61,
            "7": 3.35,
            "12": 3.56,
            "15": 3.68,
            "20": 3.89
    "50": {
        "nominal": {
            "-15": 1.58,
            "-10": 1.84,
            "-7": 2,
            "2": 2.38,
            "7": 3.03,
            "12": 3.21,
            "15": 3.32,
            "20": 3.51
    "55": {
        "nominal": {
            "-15": 1.55,
            "-10": 1.71,
            "-7": 1.8,
            "2": 2.14,
            "7": 2.7,
            "12": 2.87,
            "15": 2.96,
            "20": 3.13
    "60": {
        "nominal": {
            "2": 2.05,
            "7": 2.46,
            "12": 2.57,
            "15": 2.63,
            "20": 2.74

and this is the script to do the interpolation:

import json
import pprint

with open("device_efficiencies.json") as de:
    allEfficiencies = json.load(de)

    outcome = {}
    for flowTemp in allEfficiencies.keys():
        flowEfficiencies = allEfficiencies[flowTemp]
        interpolatedEfficienciesForTemp = outcome.setdefault(flowTemp, {})
        for series in flowEfficiencies.keys():
            interpolatedEfficienciesForSeries = interpolatedEfficienciesForTemp.setdefault(series, {})
            efficiencies = flowEfficiencies[series]
            temperatures = [int(t) for t in efficiencies.keys()]
            for i in range(0, len(efficiencies) - 1):
                currentTemp = temperatures[i]
                nextFlowTemp = temperatures[i + 1]
                domain = range(currentTemp, nextFlowTemp)

                currentEfficiency = efficiencies[str(currentTemp)]
                nextEfficiency = efficiencies[str(nextFlowTemp)]

                for temperature in domain:
                    efficiency = currentEfficiency + (temperature - currentTemp) * (nextEfficiency - currentEfficiency) / (nextFlowTemp - currentTemp)

                    interpolatedEfficienciesForSeries[temperature] = round(efficiency, 2)
            lastTemp = str(temperatures[-1])
            interpolatedEfficienciesForSeries[int(lastTemp)] = efficiencies[lastTemp]

    # Now interpolate across flows

    flowTemps = [str(t) for t in sorted([int(t) for t in outcome.keys()])]
    for i in range(0, len(flowTemps) - 1):
        localFlowTemp = flowTemps[i]
        nextFlowTemp = flowTemps[i + 1]
        localEfficiencies = outcome[localFlowTemp]
        nextEfficiencies = outcome[nextFlowTemp]

        for series in localEfficiencies.keys():
            if series in nextEfficiencies.keys():
                print("Interpolating between " + localFlowTemp + " and " + nextFlowTemp + " for " + series)

                localSeriesEfficiencies = localEfficiencies[series]
                nextSeriesEfficiencies = nextEfficiencies[series]
                for intFlowTemp in range(int(localFlowTemp) + 1, int(nextFlowTemp)):
                    proportion = (intFlowTemp - int(localFlowTemp)) / (int(nextFlowTemp) - int(localFlowTemp))
                    intFlowTempBucket = outcome.setdefault(str(intFlowTemp), {})
                    seriesBucket = intFlowTempBucket.setdefault(series, {})
                    for outdoorTemp in localSeriesEfficiencies:
                        if outdoorTemp in nextSeriesEfficiencies:
                            efficiencyRange = nextSeriesEfficiencies[outdoorTemp] - localSeriesEfficiencies[outdoorTemp]
                            seriesBucket[outdoorTemp] = round(localSeriesEfficiencies[outdoorTemp] + proportion * efficiencyRange, 2,)

    with open("interpolated_efficiencies.json", "w") as ie:
        json.dump(outcome, ie, indent=4, sort_keys=True)

It looks plausible, but you might have to tweak it if there’s a bug I didn’t spot.

I dont think the Mitsi COP estimate is very accurate. Mine shows a lower COP than my measurements with proper heat meter. The Mitsi system uses a vortex-flow sensor and might be using the strap-on sensors… not certain. Anyhow, my new and old units do what it says on the tin, BUT my new one does these strange dips in output when on low load (as graph). here the average heat output is around 3kW… It should do that in steady state. COP here (in ideal conditions, 7 degrees out) is 3.94, but the tail end 17:32 to 17:37 is COP 4.5. I think it should do steady state with better COP than it is. I don’t know if you are getting these drop-in-output issue too, or if your COP estimate is low

I’ve only got the 5-minutely readings. I’ve not done whatever is needed to get the minute-by-minute readings back (phone Mitsubishi? Do some network funnies to intercept the melcloud internet traffic but it’s probably/hopefully done over TLS to avoid people outside my house doing that. Or get an mbus splitter and figure out where to connect it and what to…). So I can’t be sure that I’m seeing the abrupt output drops, but it looks very possible.

How’s that going? I tried a naïve contact through the melcloud app and got nothing back. I’d really love to know what their heat-thermostat mode logic is, to consider whether that could be useful as a cycle-breaker, without waiting for warmer weather when it’s cheaper to let it run and observe it.

And of course, it would be useful to know what actually changed in November.

A big established company like Mitsubishi really should be better at customer communications than this. I’m feeling a bit like a mushroom…

Sorry, I’m absorbed in something else for a while and the heat pump is just in the background for a while.

Cross-post so folks know what’s happening: