diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandler.java index c0ddc21e..042c7e50 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandler.java @@ -10,7 +10,7 @@ import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; -public class AppMessageHandler { +class AppMessageHandler { final PebbleProtocol mPebbleProtocol; final UUID mUUID; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerHealthify.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerHealthify.java index 41cefd78..178b499e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerHealthify.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerHealthify.java @@ -2,12 +2,8 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble; import android.util.Pair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Objects; import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent; @@ -19,8 +15,6 @@ class AppMessageHandlerHealthify extends AppMessageHandler { private static final int KEY_TEMPERATURE = 10021; private static final int KEY_CONDITIONS = 10022; - private static final Logger LOG = LoggerFactory.getLogger(AppMessageHandlerHealthify.class); - AppMessageHandlerHealthify(UUID uuid, PebbleProtocol pebbleProtocol) { super(uuid, pebbleProtocol); } @@ -53,6 +47,9 @@ class AppMessageHandlerHealthify extends AppMessageHandler { @Override public GBDeviceEvent[] onAppStart() { WeatherSpec weatherSpec = Weather.getInstance().getWeatherSpec(); + if (weatherSpec == null) { + return new GBDeviceEvent[]{null}; + } GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes(); sendBytes.encodedBytes = encodeMarioWeatherMessage(weatherSpec); return new GBDeviceEvent[]{sendBytes}; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMarioTime.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMarioTime.java index 46992628..91b105e4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMarioTime.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMarioTime.java @@ -2,9 +2,6 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble; import android.util.Pair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.UUID; @@ -19,8 +16,6 @@ class AppMessageHandlerMarioTime extends AppMessageHandler { private static final int KEY_WEATHER_ICON_ID = 10; private static final int KEY_WEATHER_TEMPERATURE = 11; - private static final Logger LOG = LoggerFactory.getLogger(AppMessageHandlerMarioTime.class); - AppMessageHandlerMarioTime(UUID uuid, PebbleProtocol pebbleProtocol) { super(uuid, pebbleProtocol); } @@ -53,6 +48,9 @@ class AppMessageHandlerMarioTime extends AppMessageHandler { @Override public GBDeviceEvent[] onAppStart() { WeatherSpec weatherSpec = Weather.getInstance().getWeatherSpec(); + if (weatherSpec == null) { + return new GBDeviceEvent[]{null}; + } GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes(); sendBytes.encodedBytes = encodeMarioWeatherMessage(weatherSpec); return new GBDeviceEvent[]{sendBytes}; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMisfit.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMisfit.java index 1bb51991..381743a3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMisfit.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMisfit.java @@ -22,21 +22,21 @@ import nodomain.freeyourgadget.gadgetbridge.entities.PebbleMisfitSample; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; -public class AppMessageHandlerMisfit extends AppMessageHandler { +class AppMessageHandlerMisfit extends AppMessageHandler { - public static final int KEY_SLEEPGOAL = 1; - public static final int KEY_STEP_ROGRESS = 2; - public static final int KEY_SLEEP_PROGRESS = 3; - public static final int KEY_VERSION = 4; - public static final int KEY_SYNC = 5; - public static final int KEY_INCOMING_DATA_BEGIN = 6; - public static final int KEY_INCOMING_DATA = 7; - public static final int KEY_INCOMING_DATA_END = 8; - public static final int KEY_SYNC_RESULT = 9; + private static final int KEY_SLEEPGOAL = 1; + private static final int KEY_STEP_ROGRESS = 2; + private static final int KEY_SLEEP_PROGRESS = 3; + private static final int KEY_VERSION = 4; + private static final int KEY_SYNC = 5; + private static final int KEY_INCOMING_DATA_BEGIN = 6; + private static final int KEY_INCOMING_DATA = 7; + private static final int KEY_INCOMING_DATA_END = 8; + private static final int KEY_SYNC_RESULT = 9; private static final Logger LOG = LoggerFactory.getLogger(AppMessageHandlerMisfit.class); - public AppMessageHandlerMisfit(UUID uuid, PebbleProtocol pebbleProtocol) { + AppMessageHandlerMisfit(UUID uuid, PebbleProtocol pebbleProtocol) { super(uuid, pebbleProtocol); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMorpheuz.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMorpheuz.java index 4f7a14a8..4b152289 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMorpheuz.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMorpheuz.java @@ -20,37 +20,37 @@ import nodomain.freeyourgadget.gadgetbridge.devices.pebble.PebbleMorpheuzSampleP import nodomain.freeyourgadget.gadgetbridge.entities.PebbleMorpheuzSample; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; -public class AppMessageHandlerMorpheuz extends AppMessageHandler { +class AppMessageHandlerMorpheuz extends AppMessageHandler { - public static final int KEY_POINT = 1; - public static final int KEY_POINT_46 = 10000; - public static final int KEY_CTRL = 2; - public static final int KEY_CTRL_46 = 10001; - public static final int KEY_FROM = 3; - public static final int KEY_FROM_46 = 10002; - public static final int KEY_TO = 4; - public static final int KEY_TO_46 = 10003; - public static final int KEY_BASE = 5; - public static final int KEY_BASE_46 = 10004; - public static final int KEY_VERSION = 6; - public static final int KEY_VERSION_46 = 10005; - public static final int KEY_GONEOFF = 7; - public static final int KEY_GONEOFF_46 = 10006; - public static final int KEY_TRANSMIT = 8; - public static final int KEY_TRANSMIT_46 = 10007; - public static final int KEY_AUTO_RESET = 9; - public static final int KEY_AUTO_RESET_46 = 10008; - public static final int KEY_SNOOZES = 10; - public static final int KEY_SNOOZES_46 = 10009; - public static final int KEY_FAULT_46 = 10010; + private static final int KEY_POINT = 1; + private static final int KEY_POINT_46 = 10000; + private static final int KEY_CTRL = 2; + private static final int KEY_CTRL_46 = 10001; + private static final int KEY_FROM = 3; + private static final int KEY_FROM_46 = 10002; + private static final int KEY_TO = 4; + private static final int KEY_TO_46 = 10003; + private static final int KEY_BASE = 5; + private static final int KEY_BASE_46 = 10004; + private static final int KEY_VERSION = 6; + private static final int KEY_VERSION_46 = 10005; + private static final int KEY_GONEOFF = 7; + private static final int KEY_GONEOFF_46 = 10006; + private static final int KEY_TRANSMIT = 8; + private static final int KEY_TRANSMIT_46 = 10007; + private static final int KEY_AUTO_RESET = 9; + private static final int KEY_AUTO_RESET_46 = 10008; + private static final int KEY_SNOOZES = 10; + private static final int KEY_SNOOZES_46 = 10009; + private static final int KEY_FAULT_46 = 10010; - public static final int CTRL_TRANSMIT_DONE = 1; - public static final int CTRL_VERSION_DONE = 2; - public static final int CTRL_GONEOFF_DONE = 4; - public static final int CTRL_DO_NEXT = 8; - public static final int CTRL_SET_LAST_SENT = 16; - public static final int CTRL_LAZARUS = 32; - public static final int CTRL_SNOOZES_DONE = 64; + private static final int CTRL_TRANSMIT_DONE = 1; + private static final int CTRL_VERSION_DONE = 2; + private static final int CTRL_GONEOFF_DONE = 4; + private static final int CTRL_DO_NEXT = 8; + private static final int CTRL_SET_LAST_SENT = 16; + private static final int CTRL_LAZARUS = 32; + private static final int CTRL_SNOOZES_DONE = 64; // data received from Morpheuz in native format private int version = 0; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerPebStyle.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerPebStyle.java index d6402a1b..8e916c10 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerPebStyle.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerPebStyle.java @@ -14,7 +14,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.pebble.PebbleColor; import nodomain.freeyourgadget.gadgetbridge.model.Weather; import ru.gelin.android.weather.notification.ParcelableWeather2; -public class AppMessageHandlerPebStyle extends AppMessageHandler { +class AppMessageHandlerPebStyle extends AppMessageHandler { public static final int KEY_AMPM_TEXT = 21; public static final int KEY_BLUETOOTH_ALERT = 2; public static final int KEY_BLUETOOTH_ICON = 20; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTimeStylePebble.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTimeStylePebble.java index 6651ed61..16c96afc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTimeStylePebble.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTimeStylePebble.java @@ -2,9 +2,6 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble; import android.util.Pair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.UUID; @@ -13,7 +10,7 @@ import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes; import nodomain.freeyourgadget.gadgetbridge.model.Weather; import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; -public class AppMessageHandlerTimeStylePebble extends AppMessageHandler { +class AppMessageHandlerTimeStylePebble extends AppMessageHandler { private static final int MESSAGE_KEY_WeatherCondition = 10000; private static final int MESSAGE_KEY_WeatherForecastCondition = 10002; private static final int MESSAGE_KEY_WeatherForecastHighTemp = 10003; @@ -35,9 +32,7 @@ public class AppMessageHandlerTimeStylePebble extends AppMessageHandler { private static final int ICON_THUNDERSTORM = 10; private static final int ICON_WEATHER_GENERIC = 11; - private static final Logger LOG = LoggerFactory.getLogger(AppMessageHandlerTimeStylePebble.class); - - public AppMessageHandlerTimeStylePebble(UUID uuid, PebbleProtocol pebbleProtocol) { + AppMessageHandlerTimeStylePebble(UUID uuid, PebbleProtocol pebbleProtocol) { super(uuid, pebbleProtocol); } @@ -125,6 +120,9 @@ public class AppMessageHandlerTimeStylePebble extends AppMessageHandler { @Override public GBDeviceEvent[] onAppStart() { WeatherSpec weatherSpec = Weather.getInstance().getWeatherSpec(); + if (weatherSpec == null) { + return new GBDeviceEvent[]{null}; + } GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes(); sendBytes.encodedBytes = encodeTimeStylePebbleWeather(weatherSpec); return new GBDeviceEvent[]{sendBytes}; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTrekVolle.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTrekVolle.java new file mode 100644 index 00000000..b3cfce66 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTrekVolle.java @@ -0,0 +1,85 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble; + +import android.util.Pair; + +import java.util.ArrayList; +import java.util.UUID; + +import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent; +import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes; +import nodomain.freeyourgadget.gadgetbridge.model.Weather; +import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; + +class AppMessageHandlerTrekVolle extends AppMessageHandler { + private static final int MESSAGE_KEY_WEATHER_TEMPERATURE = 10000; + private static final int MESSAGE_KEY_WEATHER_CONDITIONS = 10001; + private static final int MESSAGE_KEY_WEATHER_ICON = 10002; + private static final int MESSAGE_KEY_WEATHER_TEMPERATURE_MIN = 10024; + private static final int MESSAGE_KEY_WEATHER_TEMPERATURE_MAX = 10025; + private static final int MESSAGE_KEY_WEATHER_LOCATION = 10030; + + AppMessageHandlerTrekVolle(UUID uuid, PebbleProtocol pebbleProtocol) { + super(uuid, pebbleProtocol); + } + + private int getIconForConditionCode(int conditionCode, boolean isNight) { + /* + case 1: return RESOURCE_ID_IMAGE_WEATHER_CLEARNIGHT; + case 2: return RESOURCE_ID_IMAGE_WEATHER_CLEAR; + case 3: return RESOURCE_ID_IMAGE_WEATHER_CLOUDYNIGHT; + case 4: return RESOURCE_ID_IMAGE_WEATHER_CLOUDY; + case 5: return RESOURCE_ID_IMAGE_WEATHER_CLOUDS; + case 6: return RESOURCE_ID_IMAGE_WEATHER_THICKCLOUDS; + case 7: return RESOURCE_ID_IMAGE_WEATHER_RAIN; + case 8: return RESOURCE_ID_IMAGE_WEATHER_RAINYNIGHT; + case 9: return RESOURCE_ID_IMAGE_WEATHER_RAINY; + case 10: return RESOURCE_ID_IMAGE_WEATHER_LIGHTNING; + case 11: return RESOURCE_ID_IMAGE_WEATHER_SNOW; + case 12: return RESOURCE_ID_IMAGE_WEATHER_MIST; + */ + return 2; + } + + private byte[] encodeTrekVolleWeather(WeatherSpec weatherSpec) { + + if (weatherSpec == null) { + return null; + } + + boolean isNight = false; // FIXME + ArrayList> pairs = new ArrayList<>(); + pairs.add(new Pair<>(MESSAGE_KEY_WEATHER_TEMPERATURE, (Object) (weatherSpec.currentTemp - 273))); + pairs.add(new Pair<>(MESSAGE_KEY_WEATHER_CONDITIONS, (Object) (weatherSpec.currentCondition))); + pairs.add(new Pair<>(MESSAGE_KEY_WEATHER_ICON, (Object) (getIconForConditionCode(weatherSpec.currentConditionCode, isNight)))); + pairs.add(new Pair<>(MESSAGE_KEY_WEATHER_TEMPERATURE_MAX, (Object) (weatherSpec.todayMaxTemp - 273))); + pairs.add(new Pair<>(MESSAGE_KEY_WEATHER_TEMPERATURE_MIN, (Object) (weatherSpec.todayMinTemp - 273))); + pairs.add(new Pair<>(MESSAGE_KEY_WEATHER_LOCATION, (Object) weatherSpec.location)); + + + return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); + } + + @Override + public GBDeviceEvent[] handleMessage(ArrayList> pairs) { + // Just ACK + GBDeviceEventSendBytes sendBytesAck = new GBDeviceEventSendBytes(); + sendBytesAck.encodedBytes = mPebbleProtocol.encodeApplicationMessageAck(mUUID, mPebbleProtocol.last_id); + return new GBDeviceEvent[]{sendBytesAck}; + } + + @Override + public GBDeviceEvent[] onAppStart() { + WeatherSpec weatherSpec = Weather.getInstance().getWeatherSpec(); + if (weatherSpec == null) { + return new GBDeviceEvent[]{null}; + } + GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes(); + sendBytes.encodedBytes = encodeTrekVolleWeather(weatherSpec); + return new GBDeviceEvent[]{sendBytes}; + } + + @Override + public byte[] encodeUpdateWeather(WeatherSpec weatherSpec) { + return encodeTrekVolleWeather(weatherSpec); + } +} \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java index 4bcc6ae5..1f69dcd1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java @@ -16,7 +16,7 @@ import nodomain.freeyourgadget.gadgetbridge.entities.PebbleHealthActivitySample; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.util.GB; -public class DatalogSessionHealthSteps extends DatalogSessionPebbleHealth { +class DatalogSessionHealthSteps extends DatalogSessionPebbleHealth { private static final Logger LOG = LoggerFactory.getLogger(DatalogSessionHealthSteps.class); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java index 9ba9c6cc..625cc734 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java @@ -361,6 +361,7 @@ public class PebbleProtocol extends GBDeviceProtocol { private static final UUID UUID_PEBSTYLE = UUID.fromString("da05e84d-e2a2-4020-a2dc-9cdcf265fcdd"); private static final UUID UUID_MARIOTIME = UUID.fromString("43caa750-2896-4f46-94dc-1adbd4bc1ff3"); private static final UUID UUID_HELTHIFY = UUID.fromString("7ee97b2c-95e8-4720-b94e-70fccd905d98"); + private static final UUID UUID_TREKVOLLE = UUID.fromString("2da02267-7a19-4e49-9ed1-439d25db14e4"); private static final UUID UUID_ZERO = new UUID(0, 0); @@ -375,9 +376,10 @@ public class PebbleProtocol extends GBDeviceProtocol { mAppMessageHandlers.put(UUID_MORPHEUZ, new AppMessageHandlerMorpheuz(UUID_MORPHEUZ, PebbleProtocol.this)); mAppMessageHandlers.put(UUID_MISFIT, new AppMessageHandlerMisfit(UUID_MISFIT, PebbleProtocol.this)); mAppMessageHandlers.put(UUID_PEBBLE_TIMESTYLE, new AppMessageHandlerTimeStylePebble(UUID_PEBBLE_TIMESTYLE, PebbleProtocol.this)); - mAppMessageHandlers.put(UUID_PEBSTYLE, new AppMessageHandlerPebStyle(UUID_PEBSTYLE, PebbleProtocol.this)); + //mAppMessageHandlers.put(UUID_PEBSTYLE, new AppMessageHandlerPebStyle(UUID_PEBSTYLE, PebbleProtocol.this)); mAppMessageHandlers.put(UUID_MARIOTIME, new AppMessageHandlerMarioTime(UUID_MARIOTIME, PebbleProtocol.this)); mAppMessageHandlers.put(UUID_HELTHIFY, new AppMessageHandlerHealthify(UUID_HELTHIFY, PebbleProtocol.this)); + mAppMessageHandlers.put(UUID_TREKVOLLE, new AppMessageHandlerTrekVolle(UUID_TREKVOLLE, PebbleProtocol.this)); } private final HashMap mDatalogSessions = new HashMap<>(); @@ -1164,10 +1166,10 @@ public class PebbleProtocol extends GBDeviceProtocol { buf.order(ByteOrder.LITTLE_ENDIAN); buf.put((byte) 3); // unknown, always 3? buf.putShort((short) (weatherSpec.currentTemp - 273)); - buf.put((byte) Weather.mapToPebbleCondition(weatherSpec.currentConditionCode)); + buf.put(Weather.mapToPebbleCondition(weatherSpec.currentConditionCode)); buf.putShort((short) (weatherSpec.todayMaxTemp - 273)); buf.putShort((short) (weatherSpec.todayMinTemp - 273)); - buf.put((byte) Weather.mapToPebbleCondition(weatherSpec.tomorrowConditionCode)); + buf.put(Weather.mapToPebbleCondition(weatherSpec.tomorrowConditionCode)); buf.putShort((short) (weatherSpec.tomorrowMaxTemp - 273)); buf.putShort((short) (weatherSpec.tomorrowMinTemp - 273)); buf.putInt(weatherSpec.timestamp);