mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
Zendure SolarFlow: parse firmware version, allow setting maximum charge
This commit is contained in:
+1
@@ -677,6 +677,7 @@ public class DeviceSettingsPreferenceConst {
|
||||
public static final String PREF_BATTERY_DISCHARGE_INTERVALS_SET = "battery_discharge_intervals_set";
|
||||
public static final String PREF_BATTERY_DISCHARGE_MANUAL = "battery_discharge_manual";
|
||||
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_DISPLAY_ENABLED = "display_enabled";
|
||||
|
||||
+1
@@ -1001,6 +1001,7 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i
|
||||
addPreferenceHandlerFor("lock");
|
||||
|
||||
addPreferenceHandlerFor(PREF_BATTERY_MINIMUM_CHARGE);
|
||||
addPreferenceHandlerFor(PREF_BATTERY_MAXIMUM_CHARGE);
|
||||
addPreferenceHandlerFor(PREF_BATTERY_ALLOW_PASS_THROUGH);
|
||||
|
||||
addPreferenceHandlerFor(PREF_DISPLAY_ENABLED);
|
||||
|
||||
+1
@@ -90,6 +90,7 @@ public class SolarFlowDeviceCoordinator extends AbstractBLEDeviceCoordinator {
|
||||
public int[] getSupportedDeviceSpecificSettings(GBDevice device) {
|
||||
return new int[]{
|
||||
R.xml.devicesettings_battery_minimum_charge,
|
||||
R.xml.devicesettings_battery_maximum_charge,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
+61
-44
@@ -16,6 +16,7 @@
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
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 android.bluetooth.BluetoothGatt;
|
||||
@@ -59,6 +60,7 @@ public class SolarFlowDeviceSupport extends AbstractBTLESingleDeviceSupport {
|
||||
private int hyperTmp;
|
||||
private int electricLevel = -1;
|
||||
private String deviceId;
|
||||
private int firmwareVersion = -1;
|
||||
|
||||
public SolarFlowDeviceSupport() {
|
||||
super(LOG);
|
||||
@@ -74,47 +76,49 @@ public class SolarFlowDeviceSupport extends AbstractBTLESingleDeviceSupport {
|
||||
if (jsonMessage.has("method")) {
|
||||
String method = jsonMessage.getString("method");
|
||||
|
||||
if (method.equals("BLESPP")) {
|
||||
deviceId = jsonMessage.getString("deviceId");
|
||||
JSONObject sendMessage = new JSONObject()
|
||||
.put("messageId", messageId++)
|
||||
.put("method", "BLESPP_OK");
|
||||
switch (method) {
|
||||
case "BLESPP" -> {
|
||||
deviceId = jsonMessage.getString("deviceId");
|
||||
JSONObject sendMessage = new JSONObject()
|
||||
.put("messageId", messageId++)
|
||||
.put("method", "BLESPP_OK");
|
||||
|
||||
sendMessage(sendMessage);
|
||||
sendMessage(sendMessage);
|
||||
|
||||
JSONObject sendMessageGetInfo = new JSONObject()
|
||||
.put("messageId", messageId++)
|
||||
.put("method", "getInfo")
|
||||
.put("timestamp", System.currentTimeMillis() / 1000);
|
||||
sendMessage(sendMessageGetInfo);
|
||||
|
||||
JSONObject sendMessageGetAllInfos = new JSONObject()
|
||||
.put("messageId", messageId++)
|
||||
.put("deviceId", deviceId)
|
||||
.put("method", "read")
|
||||
.put("properties", new JSONArray().put("getAll"))
|
||||
.put("timestamp", System.currentTimeMillis() / 1000);
|
||||
sendMessage(sendMessageGetAllInfos);
|
||||
} else if (method.equals("report")) {
|
||||
long messageIdReport = jsonMessage.getLong("messageId");
|
||||
if (messageIdReport != this.messageIdReport) {
|
||||
if (this.messageIdReport != -1) {
|
||||
reportToStatusActivity();
|
||||
} else {
|
||||
TransactionBuilder builder = createTransactionBuilder("setInitialized");
|
||||
builder.setDeviceState(GBDevice.State.INITIALIZED);
|
||||
builder.queue();
|
||||
JSONObject sendMessageGetInfo = new JSONObject()
|
||||
.put("messageId", messageId++)
|
||||
.put("method", "getInfo")
|
||||
.put("timestamp", System.currentTimeMillis() / 1000);
|
||||
sendMessage(sendMessageGetInfo);
|
||||
}
|
||||
case "getInfo-rsp" -> {
|
||||
JSONObject sendMessageGetAllInfos = new JSONObject()
|
||||
.put("messageId", messageId++)
|
||||
.put("deviceId", deviceId)
|
||||
.put("method", "read")
|
||||
.put("properties", new JSONArray().put("getAll"))
|
||||
.put("timestamp", System.currentTimeMillis() / 1000);
|
||||
sendMessage(sendMessageGetAllInfos);
|
||||
}
|
||||
case "report" -> {
|
||||
long messageIdReport = jsonMessage.getLong("messageId");
|
||||
if (messageIdReport != this.messageIdReport) {
|
||||
if (this.messageIdReport != -1) {
|
||||
reportToStatusActivity();
|
||||
} else {
|
||||
TransactionBuilder builder = createTransactionBuilder("setInitialized");
|
||||
builder.setDeviceState(GBDevice.State.INITIALIZED);
|
||||
builder.queue();
|
||||
}
|
||||
this.messageIdReport = messageIdReport;
|
||||
}
|
||||
if (jsonMessage.has("properties")) {
|
||||
return handleReportProperties(jsonMessage.getJSONObject("properties"));
|
||||
}
|
||||
if (jsonMessage.has("packData")) {
|
||||
return handleReportPackData(jsonMessage.getJSONArray("packData"));
|
||||
}
|
||||
this.messageIdReport = messageIdReport;
|
||||
|
||||
}
|
||||
if (jsonMessage.has("properties")) {
|
||||
return handleReportProperties(jsonMessage.getJSONObject("properties"));
|
||||
}
|
||||
if (jsonMessage.has("packData")) {
|
||||
return handleReportPackData(jsonMessage.getJSONArray("packData"));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
@@ -144,14 +148,19 @@ public class SolarFlowDeviceSupport extends AbstractBTLESingleDeviceSupport {
|
||||
public void onSendConfiguration(final String config) {
|
||||
Prefs devicePrefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(getDevice().getAddress()));
|
||||
switch (config) {
|
||||
case PREF_BATTERY_MINIMUM_CHARGE:
|
||||
case PREF_BATTERY_MINIMUM_CHARGE -> {
|
||||
int minSoc = devicePrefs.getInt(PREF_BATTERY_MINIMUM_CHARGE, 10);
|
||||
if (minSoc < 0) minSoc = 0;
|
||||
if (minSoc > 50) minSoc = 50;
|
||||
sendWriteProperty("minSoc", minSoc*10);
|
||||
return;
|
||||
default:
|
||||
LOG.warn("Unknown config changed: {}", config);
|
||||
sendWriteProperty("minSoc", minSoc * 10);
|
||||
}
|
||||
case PREF_BATTERY_MAXIMUM_CHARGE -> {
|
||||
int socSet = devicePrefs.getInt(PREF_BATTERY_MAXIMUM_CHARGE, 100);
|
||||
if (socSet < 70) socSet = 70;
|
||||
if (socSet > 100) socSet = 100;
|
||||
sendWriteProperty("socSet", socSet * 10);
|
||||
}
|
||||
default -> LOG.warn("Unknown config changed: {}", config);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -199,13 +208,21 @@ public class SolarFlowDeviceSupport extends AbstractBTLESingleDeviceSupport {
|
||||
int electricLevel = properties.getInt("electricLevel");
|
||||
if (electricLevel != this.electricLevel) {
|
||||
this.electricLevel = electricLevel;
|
||||
getDevice().setBatteryLevel(electricLevel);
|
||||
getDevice().sendDeviceUpdateIntent(getContext());
|
||||
getDevice().setBatteryLevel(electricLevel); // update event will be sent when firmware gets read
|
||||
}
|
||||
}
|
||||
if (properties.has("outputHomePower")) {
|
||||
outputHomePower = properties.getInt("outputHomePower");
|
||||
}
|
||||
if (properties.has("MASTER")) {
|
||||
int firmwareVersion = properties.getInt("MASTER");
|
||||
if (firmwareVersion != this.firmwareVersion) {
|
||||
this.firmwareVersion = firmwareVersion;
|
||||
String firmwareString = ((firmwareVersion & 0xf000) >> 12) + "." + ((firmwareVersion & 0x0f00) >> 8) + "." + (firmwareVersion & 0x00ff);
|
||||
getDevice().setFirmwareVersion(firmwareString);
|
||||
getDevice().sendDeviceUpdateIntent(getContext());
|
||||
}
|
||||
}
|
||||
|
||||
} catch (JSONException e) {
|
||||
LOG.error("JSON error while parsing report: {}", e.getMessage());
|
||||
|
||||
@@ -4137,6 +4137,7 @@
|
||||
<string name="manual_discharge">Manual discharge intervals</string>
|
||||
<string name="summary_battery_discharge_intervals_set">Send configuration below to device</string>
|
||||
<string name="battery_minimum_charge">Minimum battery charge in %</string>
|
||||
<string name="battery_maximum_charge">Maximum battery charge in %</string>
|
||||
<string name="battery_allow_pass_though_summary">When enabled, the battery can be charged while discharging</string>
|
||||
<string name="battery_allow_pass_through">Allow battery pass-through</string>
|
||||
<string name="canned_replies_not_empty">There should be at least one canned reply.</string>
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<EditTextPreference
|
||||
android:defaultValue="100"
|
||||
android:inputType="number"
|
||||
android:key="battery_maximum_charge"
|
||||
android:title="@string/battery_maximum_charge"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
</androidx.preference.PreferenceScreen>
|
||||
Reference in New Issue
Block a user