mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2025-02-19 22:06:48 +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_HOURLY_CHIME_END = "hourly_chime_end";
|
||||||
|
|
||||||
public static final String PREF_VOICE_SERVICE_LANGUAGE = "voice_service_language";
|
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_VOICE_SERVICE_LANGUAGE);
|
||||||
|
|
||||||
|
addPreferenceHandlerFor(PREF_TEMPERATURE_SCALE_CF);
|
||||||
|
|
||||||
addPreferenceHandlerFor("lock");
|
addPreferenceHandlerFor("lock");
|
||||||
|
|
||||||
String sleepTimeState = prefs.getString(PREF_SLEEP_TIME, PREF_DO_NOT_DISTURB_OFF);
|
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 androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractBLEDeviceCoordinator;
|
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractBLEDeviceCoordinator;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
||||||
@ -142,6 +143,13 @@ public class MijiaLywsd02Coordinator extends AbstractBLEDeviceCoordinator {
|
|||||||
return MijiaLywsd02Support.class;
|
return MijiaLywsd02Support.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int[] getSupportedDeviceSpecificSettings(GBDevice device) {
|
||||||
|
return new int[]{
|
||||||
|
R.xml.devicesettings_temperature_scale_cf,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) {
|
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) {
|
||||||
// nothing to delete, yet
|
// nothing to delete, yet
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (C) 2016-2021 Andreas Shimokawa, Carsten Pfeiffer, Sebastian
|
/* Copyright (C) 2016-2021 Andreas Shimokawa, Carsten Pfeiffer, Sebastian
|
||||||
Kranz
|
Kranz, Davis Mosenkovs
|
||||||
|
|
||||||
This file is part of Gadgetbridge.
|
This file is part of Gadgetbridge.
|
||||||
|
|
||||||
@ -21,15 +21,19 @@ import android.bluetooth.BluetoothGatt;
|
|||||||
import android.bluetooth.BluetoothGattCharacteristic;
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.SimpleTimeZone;
|
import java.util.SimpleTimeZone;
|
||||||
import java.util.UUID;
|
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.GBDeviceEventBatteryInfo;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
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.IntentListener;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.battery.BatteryInfoProfile;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.battery.BatteryInfoProfile;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfoProfile;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfoProfile;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
public class MijiaLywsd02Support extends AbstractBTLEDeviceSupport {
|
public class MijiaLywsd02Support extends AbstractBTLEDeviceSupport {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(MijiaLywsd02Support.class);
|
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 DeviceInfoProfile<MijiaLywsd02Support> deviceInfoProfile;
|
||||||
private final GBDeviceEventVersionInfo versionCmd = new GBDeviceEventVersionInfo();
|
private final GBDeviceEventVersionInfo versionCmd = new GBDeviceEventVersionInfo();
|
||||||
private final GBDeviceEventBatteryInfo batteryCmd = new GBDeviceEventBatteryInfo();
|
private final GBDeviceEventBatteryInfo batteryCmd = new GBDeviceEventBatteryInfo();
|
||||||
@ -81,12 +89,13 @@ public class MijiaLywsd02Support extends AbstractBTLEDeviceSupport {
|
|||||||
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext()));
|
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext()));
|
||||||
requestDeviceInfo(builder);
|
requestDeviceInfo(builder);
|
||||||
setTime(builder);
|
setTime(builder);
|
||||||
|
getBatteryInfo(builder);
|
||||||
setInitialized(builder);
|
setInitialized(builder);
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setTime(TransactionBuilder 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();
|
long ts = System.currentTimeMillis();
|
||||||
byte offsetHours = (byte) (SimpleTimeZone.getDefault().getOffset(ts) / (1000 * 60 * 60));
|
byte offsetHours = (byte) (SimpleTimeZone.getDefault().getOffset(ts) / (1000 * 60 * 60));
|
||||||
ts /= 1000;
|
ts /= 1000;
|
||||||
@ -98,6 +107,24 @@ public class MijiaLywsd02Support extends AbstractBTLEDeviceSupport {
|
|||||||
offsetHours});
|
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) {
|
private void requestDeviceInfo(TransactionBuilder builder) {
|
||||||
LOG.debug("Requesting Device Info!");
|
LOG.debug("Requesting Device Info!");
|
||||||
deviceInfoProfile.requestDeviceInfo(builder);
|
deviceInfoProfile.requestDeviceInfo(builder);
|
||||||
@ -144,7 +171,27 @@ public class MijiaLywsd02Support extends AbstractBTLEDeviceSupport {
|
|||||||
}
|
}
|
||||||
UUID characteristicUUID = characteristic.getUuid();
|
UUID characteristicUUID = characteristic.getUuid();
|
||||||
|
|
||||||
|
if(MijiaLywsd02Support.UUID_BATTERY.equals(characteristicUUID)) {
|
||||||
|
handleBatteryInfo(characteristic.getValue(), status);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
LOG.info("Unhandled characteristic read: " + characteristicUUID);
|
LOG.info("Unhandled characteristic read: " + characteristicUUID);
|
||||||
return false;
|
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>purple</item>
|
||||||
<item>white</item>
|
<item>white</item>
|
||||||
</string-array>
|
</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>
|
</resources>
|
||||||
|
@ -2351,4 +2351,9 @@
|
|||||||
<string name="prefs_wena3_vibration_siren">Siren</string>
|
<string name="prefs_wena3_vibration_siren">Siren</string>
|
||||||
<string name="prefs_wena3_vibration_short">Short</string>
|
<string name="prefs_wena3_vibration_short">Short</string>
|
||||||
<string name="prefs_wena3_led_none">No LED</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>
|
</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