diff --git a/LibreHardwareMonitor/UI/SensorNode.cs b/LibreHardwareMonitor/UI/SensorNode.cs
index ca08026..c5c073e 100644
--- a/LibreHardwareMonitor/UI/SensorNode.cs
+++ b/LibreHardwareMonitor/UI/SensorNode.cs
@@ -88,7 +88,7 @@ namespace LibreHardwareMonitor.UI
case SensorType.Load: Format = "{0:F1} %"; break;
case SensorType.Temperature: Format = "{0:F1} °C"; break;
case SensorType.Fan: Format = "{0:F0} RPM"; break;
- case SensorType.Flow: Format = "{0:F0} L/h"; break;
+ case SensorType.Flow: Format = "{0:F1} L/h"; break;
case SensorType.Control: Format = "{0:F1} %"; break;
case SensorType.Level: Format = "{0:F1} %"; break;
case SensorType.Power: Format = "{0:F1} W"; break;
diff --git a/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/AquacomputerGroup.cs b/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/AquacomputerGroup.cs
index 55f133e..705e54b 100644
--- a/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/AquacomputerGroup.cs
+++ b/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/AquacomputerGroup.cs
@@ -38,6 +38,16 @@ namespace LibreHardwareMonitor.Hardware.Controller.AquaComputer
_hardware.Add(device);
break;
}
+ case 0xf003:
+ {
+ var device = new MPS(dev, settings);
+ _report.AppendLine($"Device name: {productName}");
+ _report.AppendLine($"Firmware version: {device.FirmwareVersion}");
+ _report.AppendLine($"{device.Status}");
+ _report.AppendLine();
+ _hardware.Add(device);
+ break;
+ }
default:
{
_report.AppendLine($"Unknown Hardware PID: {dev.Attributes.ProductHexId} Name: {productName}");
diff --git a/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/MPS.cs b/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/MPS.cs
new file mode 100644
index 0000000..954c580
--- /dev/null
+++ b/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/MPS.cs
@@ -0,0 +1,108 @@
+// Mozilla Public License 2.0
+// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+// Copyright (C) LibreHardwareMonitor and Contributors
+// All Rights Reserved
+
+using System;
+using HidLibrary;
+
+namespace LibreHardwareMonitor.Hardware.Controller.AquaComputer
+{
+ internal class MPS : Hardware
+ {
+ #region USB
+ private HidDevice _device;
+ private byte[] _rawData;
+ public UInt16 FirmwareVersion { get; private set; }
+ #endregion
+
+ private readonly Sensor _pumpFlow;
+ private readonly Sensor[] _temperatures = new Sensor[2];
+
+ private const byte MPS_REPORT_ID = 0x2;
+
+ private UInt16 _externalTemperature = 0;
+
+ private sealed class MPSDataIndexes
+ {
+ public const int PumpFlow = 35;
+ public const int ExternalTemperature = 43;
+ public const int InternalWaterTemperature = 45;
+ }
+
+ public MPS(HidDevice dev, ISettings settings) : base("MPS", new Identifier(dev.DevicePath), settings)
+ {
+ _device = dev;
+
+ do
+ {
+ _device.ReadFeatureData(out _rawData, MPS_REPORT_ID);
+ } while (_rawData[0] != MPS_REPORT_ID);
+
+ Name = $"MPS";
+ FirmwareVersion = ExtractFirmwareVersion();
+
+ _temperatures[0] = new Sensor("External", 0, SensorType.Temperature, this, new ParameterDescription[0], settings);
+ ActivateSensor(_temperatures[0]);
+ _temperatures[1] = new Sensor("Internal Water", 1, SensorType.Temperature, this, new ParameterDescription[0], settings);
+ ActivateSensor(_temperatures[1]);
+
+ _pumpFlow = new Sensor("Pump", 0, SensorType.Flow, this, new ParameterDescription[0], settings);
+ ActivateSensor(_pumpFlow);
+ }
+
+ public override HardwareType HardwareType
+ {
+ get
+ {
+ return HardwareType.AquaComputer;
+ }
+ }
+
+ public string Status
+ {
+ get
+ {
+ FirmwareVersion = ExtractFirmwareVersion();
+ if (FirmwareVersion < 1012)
+ {
+ return $"Status: Untested Firmware Version {FirmwareVersion}! Please consider Updating to Version 1012";
+ }
+ return "Status: OK";
+ }
+ }
+
+ public override void Close()
+ {
+ _device.CloseDevice();
+ base.Close();
+ }
+
+ public override void Update()
+ {
+ _device.ReadFeatureData(out _rawData, MPS_REPORT_ID);
+
+ if (_rawData[0] != MPS_REPORT_ID)
+ return;
+
+ _pumpFlow.Value = BitConverter.ToUInt16(_rawData, MPSDataIndexes.PumpFlow) / 10f;
+
+ _externalTemperature = BitConverter.ToUInt16(_rawData, MPSDataIndexes.ExternalTemperature);
+ //sensor reading returns Int16.MaxValue (32767), when not connected
+ if (_externalTemperature != Int16.MaxValue)
+ {
+ _temperatures[0].Value = _externalTemperature / 100f;
+ }
+ else
+ _temperatures[0].Value = null;
+
+ _temperatures[1].Value = BitConverter.ToUInt16(_rawData, MPSDataIndexes.InternalWaterTemperature) / 100f;
+
+ }
+
+ private ushort ExtractFirmwareVersion()
+ {
+ return BitConverter.ToUInt16(_rawData, 3);
+ }
+ }
+}
diff --git a/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj b/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj
index f9f3582..617ab50 100644
--- a/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj
+++ b/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj
@@ -33,6 +33,7 @@
+