Skip to content

Conversation

@medusalix
Copy link
Owner

This PR adds support for the W 980 washing machine with software ID 324. This machine is based on the EDPW 213, which is very similar to the EDPW 206 (also using a Mitsubishi M37451MC).

@ThiefMaster It would be great if you could that all features are working.

Resolves #20

@medusalix medusalix added the new device Support for a new device. label Jan 16, 2026
@ThiefMaster
Copy link

awesome, i'll give it a try on the weekend

@ThiefMaster
Copy link

I guess none of the read operations in the TUI should require full access (I commented that out for safety reasons)?

image

A moment later it crashes with this error:

Error: Failed to run worker

Caused by:
    0: Failed to query properties
    1: unexpected memory value

And with some debug output added, it looks like querying active_actuators fails:

query: Property { kind: General, id: "rom_code", name: "ROM Code", unit: None }
val: Number(5)
query: Property { kind: General, id: "operating_time", name: "Operating Time", unit: None }
val: Duration(18949380s)
query: Property { kind: Failure, id: "faults", name: "Faults", unit: None }
val: String("TachometerGenerator | Inlet | Eeprom")
query: Property { kind: Operation, id: "operating_mode", name: "Operating Mode", unit: None }
val: String("ProgramIdle")
query: Property { kind: Operation, id: "program_selector", name: "Program Selector", unit: None }
val: String("Cottons60")
query: Property { kind: Operation, id: "program_type", name: "Program Type", unit: None }
val: String("Cottons")
query: Property { kind: Operation, id: "program_temperature", name: "Program Temperature", unit: Some("°C") }
val: Number(60)
query: Property { kind: Operation, id: "program_options", name: "Program Options", unit: None }
val: String("WaterPlus | Short")
query: Property { kind: Operation, id: "buzzer_enabled", name: "Buzzer Enabled", unit: None }
val: Bool(true)
query: Property { kind: Operation, id: "program_spin_setting", name: "Program Spin Setting", unit: None }
val: String("SpinMax")
query: Property { kind: Operation, id: "program_phase", name: "Program Phase", unit: None }
val: String("Idle")
query: Property { kind: Operation, id: "program_locked", name: "Program Locked", unit: None }
val: Bool(false)
query: Property { kind: Operation, id: "load_level", name: "Load Level", unit: None }
val: Number(3)
query: Property { kind: Operation, id: "display_contents", name: "Display Contents", unit: None }
val: String("1.16")
query: Property { kind: Io, id: "active_actuators", name: "Active Actuators", unit: None }
Error: Failed to run worker

Caused by:
    0: Failed to query properties
    1: unexpected memory value

@ThiefMaster
Copy link

ThiefMaster commented Jan 16, 2026

When commenting out the PROP_ACTIVE_ACTUATORS prop in the property list it works fine, so I guess the memory address for that one is wrong?

The Operating State information looks correct though, it matches what I selected.

Not sure about the faults, I'd have expected that list to be empty since the machine works fine. So maybe something is faulty (scnr) with the memory address there?

image

@medusalix
Copy link
Owner Author

medusalix commented Jan 17, 2026

Thanks for testing. I think I've fixed the actuator problem now. It turns out your machine has a motor protection relay that we also have to handle in the implementation.

The list of stored faults is actually (mostly) fine. I just forgot to add one more fault that is also present in the firmware. So your machine probably now has these faults: TachometerGenerator, Inlet, SpinCycle. But that's nothing to worry about. You can reset these faults from the service menu of the machine if you want.

I haven't been able to figure out where the motor speed values are stored on these older machines yet. If you want to you can try to figure that out. But keep in mind that the speed values are only calculated and stored in memory during the spin cycle.

@ThiefMaster
Copy link

If you want to you can try to figure that out. But keep in mind that the speed values are only calculated and stored in memory during the spin cycle.

So I'd need to dump memory (which range(s) would you suggest to make it faster?) while it's spinning? And I assume with "spin cycle" you mean fast spinning ("Schleudern"), not the slow rotations while washing?

@medusalix
Copy link
Owner Author

Yes, exactly. The motor speed is only calculated during the "Schleudern" phase.

The microcontroller has two RAM ranges: 0x0000 - 0x00bf and 0x0100 - 0x023f. I think the speed is probably stored in the second region. Figuring out the target speed is probably the easier part, since that will probably just be the speed you selected for the washing program.

@ThiefMaster
Copy link

While the door is open the operating mode appears to be 0 so right now it fails with "unexpected memory value" since that one isn't covered.

After closing the door I'm back to the unexpected memory value for the actuators. The value read is 0100.

@medusalix
Copy link
Owner Author

Hmm, interesting. I don't think the EDPW 206 board that I have laying around here works at all if the door is open.

I also couldn't find this actuator on my board. That pin is not connected on the microcontroller. I believe it could be the ring illumination of the program selector on your machine, so it would be great if you could test that.

@ThiefMaster
Copy link

I don't think it's for the ring illumination - it also had that value when the ring was off (iirc during door open).

The 0100 actuator was also on permanently on, both durinh the washing cycle and after it finished.

@ThiefMaster
Copy link

I'm now running a FinalSpin cycle in the Spin program and dumped memory while it was spinning: https://fd.aeum.net/mem-spin.bin

Program Spin Speed was showing as 1350 rpm (SpinVeryHigh), and the speed printed on the front panel for that mode is 1400 rpm.

PS: What's the "field switch" actuator doing btw? Is it to use the motor as a brake after spinning?

@medusalix
Copy link
Owner Author

I don't think it's for the ring illumination - it also had that value when the ring was off (iirc during door open).

The 0100 actuator was also on permanently on, both durinh the washing cycle and after it finished.

Hmm, strange. I figured it might be the ring illumination since that actuator was off in the initial memory dump you shared.
Do you have any other idea what that actuator might be? If not, we could also just ignore that one for now.

I'm now running a FinalSpin cycle in the Spin program and dumped memory while it was spinning: fd.aeum.net/mem-spin.bin

Thanks, that was really helpful. The current motor speed is stored as a 24-bit value at 0x0091 and the target speed is a 16-bit value at 0x0094. I did some reverse-engineering on the firmware and figured out that these values can be used to calculate an approximate rpm value using the following formula:

rpm = 442500 / speed

So judging from your memory dump, the motor was running at 900 rpm. I've now implemented a new property for these values.

Program Spin Speed was showing as 1350 rpm (SpinVeryHigh), and the speed printed on the front panel for that mode is 1400 rpm.

I wouldn't be surprised if the machine is actually spinning at 1350 rpm. On some machines, the temperatures printed on the front panel are also slightly off.

PS: What's the "field switch" actuator doing btw? Is it to use the motor as a brake after spinning?

The field switch relay is used to reach higher motor speeds by switching to a separate motor winding. The principles behind this are explained here: Feldschwächung.

@ThiefMaster
Copy link

Do you have any other idea what that actuator might be? If not, we could also just ignore that one for now.

No idea... I didn't see anything it could be used for

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new device Support for a new device.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Washing machine - Miele Novotronic W980

3 participants