From 73b20db4e58bb158da7dc02b0f208c9a4cc77a38 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Thu, 25 Dec 2025 02:05:45 +0100 Subject: [PATCH] Zendure SolarFlow: allow setting target power to grid --- .../DeviceSettingsPreferenceConst.java | 1 + .../DeviceSpecificSettingsFragment.java | 14 +++++++++----- .../zendure/SolarFlowDeviceCoordinator.java | 1 + .../devices/zendure/SolarFlowDeviceSupport.java | 7 +++++++ app/src/main/res/values/strings.xml | 2 ++ .../res/xml/devicesettings_output_power_grid.xml | 10 ++++++++++ 6 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/xml/devicesettings_output_power_grid.xml diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java index 778fa9572a..9ec70f94eb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java @@ -679,6 +679,7 @@ public class DeviceSettingsPreferenceConst { public static final String PREF_BATTERY_MINIMUM_CHARGE = "battery_minimum_charge"; public static final String PREF_BATTERY_MAXIMUM_CHARGE = "battery_maximum_charge"; public static final String PREF_BATTERY_ALLOW_PASS_THROUGH = "battery_allow_pass_through"; + public static final String PREF_OUTPUT_POWER_GRID = "output_power_grid"; public static final String PREF_DISPLAY_ENABLED = "display_enabled"; public static final String PREF_DISPLAY_ENABLED_ALL_DAY = "display_all_day"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java index ef5e5b2c27..025083d94d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java @@ -1003,6 +1003,7 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i addPreferenceHandlerFor(PREF_BATTERY_MINIMUM_CHARGE); addPreferenceHandlerFor(PREF_BATTERY_MAXIMUM_CHARGE); addPreferenceHandlerFor(PREF_BATTERY_ALLOW_PASS_THROUGH); + addPreferenceHandlerFor(PREF_OUTPUT_POWER_GRID); addPreferenceHandlerFor(PREF_DISPLAY_ENABLED); addPreferenceHandlerFor(PREF_DISPLAY_ENABLED_ALL_DAY); @@ -1363,12 +1364,15 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i setInputTypeFor(PREF_CALENDAR_SYNC_EVENTS_AMOUNT, InputType.TYPE_CLASS_NUMBER); setInputTypeFor(PREF_CALENDAR_MAX_TITLE_LENGTH, InputType.TYPE_CLASS_NUMBER); setInputTypeFor(PREF_CALENDAR_MAX_DESC_LENGTH, InputType.TYPE_CLASS_NUMBER); - setNumericInputTypeWithRangeFor(DeviceSettingsPreferenceConst.PREF_BATTERY_DISCHARGE_INTERVAL1_WATT, 80, 800, false); - setNumericInputTypeWithRangeFor(DeviceSettingsPreferenceConst.PREF_BATTERY_DISCHARGE_INTERVAL2_WATT, 80, 800, false); - setNumericInputTypeWithRangeFor(DeviceSettingsPreferenceConst.PREF_BATTERY_DISCHARGE_INTERVAL3_WATT, 80, 800, false); - setNumericInputTypeWithRangeFor(DeviceSettingsPreferenceConst.PREF_BATTERY_DISCHARGE_INTERVAL4_WATT, 80, 800, false); - setNumericInputTypeWithRangeFor(DeviceSettingsPreferenceConst.PREF_BATTERY_DISCHARGE_INTERVAL5_WATT, 80, 800, false); + setNumericInputTypeWithRangeFor(PREF_BATTERY_DISCHARGE_INTERVAL1_WATT, 80, 800, false); + setNumericInputTypeWithRangeFor(PREF_BATTERY_DISCHARGE_INTERVAL2_WATT, 80, 800, false); + setNumericInputTypeWithRangeFor(PREF_BATTERY_DISCHARGE_INTERVAL3_WATT, 80, 800, false); + setNumericInputTypeWithRangeFor(PREF_BATTERY_DISCHARGE_INTERVAL4_WATT, 80, 800, false); + setNumericInputTypeWithRangeFor(PREF_BATTERY_DISCHARGE_INTERVAL5_WATT, 80, 800, false); + setNumericInputTypeWithRangeFor(PREF_OUTPUT_POWER_GRID, 0, 2400, false); + setNumericInputTypeWithRangeFor(PREF_BATTERY_MINIMUM_CHARGE, 0, 100, false); + setNumericInputTypeWithRangeFor(PREF_BATTERY_MAXIMUM_CHARGE, 0, 100, false); new PasswordCapabilityImpl().registerPreferences(getContext(), coordinator.getPasswordCapability(), this); new HeartRateCapability().registerPreferences(getContext(), coordinator.getHeartRateMeasurementIntervals(), this); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zendure/SolarFlowDeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zendure/SolarFlowDeviceCoordinator.java index 248c17cc05..a394bfd47a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zendure/SolarFlowDeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zendure/SolarFlowDeviceCoordinator.java @@ -92,6 +92,7 @@ public class SolarFlowDeviceCoordinator extends AbstractBLEDeviceCoordinator { return new int[]{ R.xml.devicesettings_battery_minimum_charge, R.xml.devicesettings_battery_maximum_charge, + R.xml.devicesettings_output_power_grid, }; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zendure/SolarFlowDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zendure/SolarFlowDeviceSupport.java index c3e3b79690..28bc2c46f7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zendure/SolarFlowDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zendure/SolarFlowDeviceSupport.java @@ -18,6 +18,7 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.zendure; import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BATTERY_MAXIMUM_CHARGE; import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BATTERY_MINIMUM_CHARGE; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_OUTPUT_POWER_GRID; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCharacteristic; @@ -162,6 +163,12 @@ public class SolarFlowDeviceSupport extends AbstractBTLESingleDeviceSupport { if (socSet > 100) socSet = 100; sendWriteProperty("socSet", socSet * 10); } + case PREF_OUTPUT_POWER_GRID -> { + int outputLimit = devicePrefs.getInt(PREF_OUTPUT_POWER_GRID, 800); + if (outputLimit < 0) outputLimit = 0; + if (outputLimit > 2400) outputLimit = 2400; + sendWriteProperty("outputLimit", outputLimit); + } default -> LOG.warn("Unknown config changed: {}", config); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6b300d7c7a..2a0792a075 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2184,6 +2184,7 @@ Coospo HW807 Garmin HRM 200 Coospo H9Z + SolarFlow Nothing Status @@ -4133,6 +4134,7 @@ Discharge interval 4 Discharge interval 5 Power in W + Output power to grid in W when disabled, this assumes intelligent discharge controlled by an external power meter (not supported by Gadgetbridge) Manual discharge intervals Send configuration below to device diff --git a/app/src/main/res/xml/devicesettings_output_power_grid.xml b/app/src/main/res/xml/devicesettings_output_power_grid.xml new file mode 100644 index 0000000000..dad6c7500e --- /dev/null +++ b/app/src/main/res/xml/devicesettings_output_power_grid.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file