mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2025-02-16 12:26:47 +01:00
Mijia LYWSD02: Battery + setting temperature scale
Implement reading battery percentage. Implement setting temperature scale used on clock display. Communication protocol taken from: https://github.com/h4/lywsd02
This commit is contained in:
parent
f4af55d622
commit
edce45dcc3
@ -360,4 +360,6 @@ public class DeviceSettingsPreferenceConst {
|
||||
public static final String PREF_HOURLY_CHIME_END = "hourly_chime_end";
|
||||
|
||||
public static final String PREF_VOICE_SERVICE_LANGUAGE = "voice_service_language";
|
||||
|
||||
public static final String PREF_TEMPERATURE_SCALE_CF = "temperature_scale_cf";
|
||||
}
|
||||
|
@ -545,6 +545,8 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i
|
||||
|
||||
addPreferenceHandlerFor(PREF_VOICE_SERVICE_LANGUAGE);
|
||||
|
||||
addPreferenceHandlerFor(PREF_TEMPERATURE_SCALE_CF);
|
||||
|
||||
addPreferenceHandlerFor("lock");
|
||||
|
||||
String sleepTimeState = prefs.getString(PREF_SLEEP_TIME, PREF_DO_NOT_DISTURB_OFF);
|
||||
|
@ -23,6 +23,7 @@ import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractBLEDeviceCoordinator;
|
||||
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
||||
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
||||
@ -142,6 +143,13 @@ public class MijiaLywsd02Coordinator extends AbstractBLEDeviceCoordinator {
|
||||
return MijiaLywsd02Support.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getSupportedDeviceSpecificSettings(GBDevice device) {
|
||||
return new int[]{
|
||||
R.xml.devicesettings_temperature_scale_cf,
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) {
|
||||
// nothing to delete, yet
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (C) 2016-2021 Andreas Shimokawa, Carsten Pfeiffer, Sebastian
|
||||
Kranz
|
||||
Kranz, Davis Mosenkovs
|
||||
|
||||
This file is part of Gadgetbridge.
|
||||
|
||||
@ -21,15 +21,19 @@ import android.bluetooth.BluetoothGatt;
|
||||
import android.bluetooth.BluetoothGattCharacteristic;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Objects;
|
||||
import java.util.SimpleTimeZone;
|
||||
import java.util.UUID;
|
||||
|
||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
|
||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
|
||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo;
|
||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||
@ -48,10 +52,14 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateA
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.IntentListener;
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.battery.BatteryInfoProfile;
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfoProfile;
|
||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||
|
||||
public class MijiaLywsd02Support extends AbstractBTLEDeviceSupport {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(MijiaLywsd02Support.class);
|
||||
private static final UUID UUID_TIME = UUID.fromString("ebe0ccb7-7a0a-4b0c-8a1a-6ff2997da3a6");
|
||||
private static final UUID UUID_BATTERY = UUID.fromString("ebe0ccc4-7a0a-4b0c-8a1a-6ff2997da3a6");
|
||||
private static final UUID UUID_SCALE = UUID.fromString("ebe0ccbe-7a0a-4b0c-8a1a-6ff2997da3a6");
|
||||
private final DeviceInfoProfile<MijiaLywsd02Support> deviceInfoProfile;
|
||||
private final GBDeviceEventVersionInfo versionCmd = new GBDeviceEventVersionInfo();
|
||||
private final GBDeviceEventBatteryInfo batteryCmd = new GBDeviceEventBatteryInfo();
|
||||
@ -81,12 +89,13 @@ public class MijiaLywsd02Support extends AbstractBTLEDeviceSupport {
|
||||
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext()));
|
||||
requestDeviceInfo(builder);
|
||||
setTime(builder);
|
||||
getBatteryInfo(builder);
|
||||
setInitialized(builder);
|
||||
return builder;
|
||||
}
|
||||
|
||||
private void setTime(TransactionBuilder builder) {
|
||||
BluetoothGattCharacteristic timeCharacteristc = getCharacteristic(UUID.fromString("ebe0ccb7-7a0a-4b0c-8a1a-6ff2997da3a6"));
|
||||
BluetoothGattCharacteristic timeCharacteristc = getCharacteristic(MijiaLywsd02Support.UUID_TIME);
|
||||
long ts = System.currentTimeMillis();
|
||||
byte offsetHours = (byte) (SimpleTimeZone.getDefault().getOffset(ts) / (1000 * 60 * 60));
|
||||
ts /= 1000;
|
||||
@ -98,6 +107,24 @@ public class MijiaLywsd02Support extends AbstractBTLEDeviceSupport {
|
||||
offsetHours});
|
||||
}
|
||||
|
||||
private void getBatteryInfo(TransactionBuilder builder) {
|
||||
BluetoothGattCharacteristic batteryCharacteristc = getCharacteristic(MijiaLywsd02Support.UUID_BATTERY);
|
||||
builder.read(batteryCharacteristc);
|
||||
}
|
||||
|
||||
private void setTemperatureScale(TransactionBuilder builder, String scale) {
|
||||
BluetoothGattCharacteristic scaleCharacteristc = getCharacteristic(MijiaLywsd02Support.UUID_SCALE);
|
||||
builder.write(scaleCharacteristc, new byte[]{ (byte) ("f".equals(scale) ? 0x01 : 0xff) });
|
||||
builder.queue(getQueue());
|
||||
}
|
||||
|
||||
private void handleBatteryInfo(byte[] value, int status) {
|
||||
if (status == BluetoothGatt.GATT_SUCCESS) {
|
||||
batteryCmd.level = ((short) value[0]);
|
||||
handleGBDeviceEvent(batteryCmd);
|
||||
}
|
||||
}
|
||||
|
||||
private void requestDeviceInfo(TransactionBuilder builder) {
|
||||
LOG.debug("Requesting Device Info!");
|
||||
deviceInfoProfile.requestDeviceInfo(builder);
|
||||
@ -144,7 +171,27 @@ public class MijiaLywsd02Support extends AbstractBTLEDeviceSupport {
|
||||
}
|
||||
UUID characteristicUUID = characteristic.getUuid();
|
||||
|
||||
if(MijiaLywsd02Support.UUID_BATTERY.equals(characteristicUUID)) {
|
||||
handleBatteryInfo(characteristic.getValue(), status);
|
||||
return true;
|
||||
}
|
||||
LOG.info("Unhandled characteristic read: " + characteristicUUID);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSendConfiguration(String config) {
|
||||
TransactionBuilder builder;
|
||||
try {
|
||||
switch (config) {
|
||||
case DeviceSettingsPreferenceConst.PREF_TEMPERATURE_SCALE_CF:
|
||||
String temperatureScale = GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()).getString(DeviceSettingsPreferenceConst.PREF_TEMPERATURE_SCALE_CF, "");
|
||||
builder = performInitialized("Sending configuration for option: " + config);
|
||||
setTemperatureScale(builder, temperatureScale);
|
||||
break;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
GB.toast("Error setting configuration", Toast.LENGTH_LONG, GB.ERROR, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3394,4 +3394,13 @@
|
||||
<item>purple</item>
|
||||
<item>white</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="temperature_scales_cf">
|
||||
<item>@string/temperature_scale_celsius</item>
|
||||
<item>@string/temperature_scale_fahrenheit</item>
|
||||
</string-array>
|
||||
<string-array name="temperature_scales_cf_values">
|
||||
<item>c</item>
|
||||
<item>f</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
|
@ -2351,4 +2351,9 @@
|
||||
<string name="prefs_wena3_vibration_siren">Siren</string>
|
||||
<string name="prefs_wena3_vibration_short">Short</string>
|
||||
<string name="prefs_wena3_led_none">No LED</string>
|
||||
|
||||
<string name="temperature_scale_cf">Temperature scale</string>
|
||||
<string name="temperature_scale_cf_summary">Select whether device uses Celsius or Fahrenheit scale.</string>
|
||||
<string name="temperature_scale_celsius">Celsius</string>
|
||||
<string name="temperature_scale_fahrenheit">Fahrenheit</string>
|
||||
</resources>
|
||||
|
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<ListPreference
|
||||
android:key="temperature_scale_cf"
|
||||
android:title="@string/temperature_scale_cf"
|
||||
android:entries="@array/temperature_scales_cf"
|
||||
android:entryValues="@array/temperature_scales_cf_values"
|
||||
android:summary="@string/temperature_scale_cf_summary" />
|
||||
</PreferenceScreen>
|
Loading…
x
Reference in New Issue
Block a user