Search in sources :

Example 16 with WeatherSpec

use of nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec in project Gadgetbridge by Freeyourgadget.

the class HuamiSupport method onSendWeather.

@Override
public void onSendWeather(WeatherSpec weatherSpec) {
    // FIXME: currently HuamiSupport *is* MiBand2 support, so return if we are using Mi Band 2
    if (gbDevice.getType() == DeviceType.MIBAND2) {
        return;
    }
    if (gbDevice.getFirmwareVersion() == null) {
        LOG.warn("Device not initialized yet, so not sending weather info");
        return;
    }
    boolean supportsConditionString = true;
    Version version = new Version(gbDevice.getFirmwareVersion());
    if (gbDevice.getType() == DeviceType.AMAZFITBIP && version.compareTo(new Version("0.0.8.74")) < 0) {
        supportsConditionString = false;
    }
    MiBandConst.DistanceUnit unit = HuamiCoordinator.getDistanceUnit();
    int tz_offset_hours = SimpleTimeZone.getDefault().getOffset(weatherSpec.timestamp * 1000L) / (1000 * 60 * 60);
    try {
        TransactionBuilder builder;
        builder = performInitialized("Sending current temp");
        byte condition = HuamiWeatherConditions.mapToAmazfitBipWeatherCode(weatherSpec.currentConditionCode);
        int length = 8;
        if (supportsConditionString) {
            length += weatherSpec.currentCondition.getBytes().length + 1;
        }
        ByteBuffer buf = ByteBuffer.allocate(length);
        buf.order(ByteOrder.LITTLE_ENDIAN);
        buf.put((byte) 2);
        buf.putInt(weatherSpec.timestamp);
        buf.put((byte) (tz_offset_hours * 4));
        buf.put(condition);
        int currentTemp = weatherSpec.currentTemp - 273;
        if (unit == MiBandConst.DistanceUnit.IMPERIAL) {
            currentTemp = (int) WeatherUtils.celsiusToFahrenheit(currentTemp);
        }
        buf.put((byte) currentTemp);
        if (supportsConditionString) {
            buf.put(weatherSpec.currentCondition.getBytes());
            buf.put((byte) 0);
        }
        if (characteristicChunked != null) {
            writeToChunked(builder, 1, buf.array());
        } else {
            builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array());
        }
        builder.queue(getQueue());
    } catch (Exception ex) {
        LOG.error("Error sending current weather", ex);
    }
    try {
        TransactionBuilder builder;
        builder = performInitialized("Sending air quality index");
        int length = 8;
        String aqiString = "(n/a)";
        if (supportsConditionString) {
            length += aqiString.getBytes().length + 1;
        }
        ByteBuffer buf = ByteBuffer.allocate(length);
        buf.order(ByteOrder.LITTLE_ENDIAN);
        buf.put((byte) 4);
        buf.putInt(weatherSpec.timestamp);
        buf.put((byte) (tz_offset_hours * 4));
        buf.putShort((short) -1);
        if (supportsConditionString) {
            buf.put(aqiString.getBytes());
            buf.put((byte) 0);
        }
        if (characteristicChunked != null) {
            writeToChunked(builder, 1, buf.array());
        } else {
            builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array());
        }
        builder.queue(getQueue());
    } catch (IOException ex) {
        LOG.error("Error sending air quality");
    }
    try {
        TransactionBuilder builder = performInitialized("Sending weather forecast");
        if (weatherSpec.forecasts.size() > 6) {
            // TDOD: find out the limits for each device
            weatherSpec.forecasts.subList(6, weatherSpec.forecasts.size()).clear();
        }
        final byte NR_DAYS = (byte) (1 + weatherSpec.forecasts.size());
        int bytesPerDay = 4;
        int conditionsLength = 0;
        if (supportsConditionString) {
            bytesPerDay = 5;
            conditionsLength = weatherSpec.currentCondition.getBytes().length;
            for (WeatherSpec.Forecast forecast : weatherSpec.forecasts) {
                conditionsLength += Weather.getConditionString(forecast.conditionCode).getBytes().length;
            }
        }
        int length = 7 + bytesPerDay * NR_DAYS + conditionsLength;
        ByteBuffer buf = ByteBuffer.allocate(length);
        buf.order(ByteOrder.LITTLE_ENDIAN);
        buf.put((byte) 1);
        buf.putInt(weatherSpec.timestamp);
        buf.put((byte) (tz_offset_hours * 4));
        buf.put(NR_DAYS);
        byte condition = HuamiWeatherConditions.mapToAmazfitBipWeatherCode(weatherSpec.currentConditionCode);
        buf.put(condition);
        buf.put(condition);
        int todayMaxTemp = weatherSpec.todayMaxTemp - 273;
        int todayMinTemp = weatherSpec.todayMinTemp - 273;
        if (unit == MiBandConst.DistanceUnit.IMPERIAL) {
            todayMaxTemp = (int) WeatherUtils.celsiusToFahrenheit(todayMaxTemp);
            todayMinTemp = (int) WeatherUtils.celsiusToFahrenheit(todayMinTemp);
        }
        buf.put((byte) todayMaxTemp);
        buf.put((byte) todayMinTemp);
        if (supportsConditionString) {
            buf.put(weatherSpec.currentCondition.getBytes());
            buf.put((byte) 0);
        }
        for (WeatherSpec.Forecast forecast : weatherSpec.forecasts) {
            condition = HuamiWeatherConditions.mapToAmazfitBipWeatherCode(forecast.conditionCode);
            buf.put(condition);
            buf.put(condition);
            int forecastMaxTemp = forecast.maxTemp - 273;
            int forecastMinTemp = forecast.minTemp - 273;
            if (unit == MiBandConst.DistanceUnit.IMPERIAL) {
                forecastMaxTemp = (int) WeatherUtils.celsiusToFahrenheit(forecastMaxTemp);
                forecastMinTemp = (int) WeatherUtils.celsiusToFahrenheit(forecastMinTemp);
            }
            buf.put((byte) forecastMaxTemp);
            buf.put((byte) forecastMinTemp);
            if (supportsConditionString) {
                buf.put(Weather.getConditionString(forecast.conditionCode).getBytes());
                buf.put((byte) 0);
            }
        }
        if (characteristicChunked != null) {
            writeToChunked(builder, 1, buf.array());
        } else {
            builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array());
        }
        builder.queue(getQueue());
    } catch (Exception ex) {
        LOG.error("Error sending weather forecast", ex);
    }
    try {
        TransactionBuilder builder;
        builder = performInitialized("Sending forecast location");
        int length = 2 + weatherSpec.location.getBytes().length;
        ByteBuffer buf = ByteBuffer.allocate(length);
        buf.order(ByteOrder.LITTLE_ENDIAN);
        buf.put((byte) 8);
        buf.put(weatherSpec.location.getBytes());
        buf.put((byte) 0);
        if (characteristicChunked != null) {
            writeToChunked(builder, 1, buf.array());
        } else {
            builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array());
        }
        builder.queue(getQueue());
    } catch (Exception ex) {
        LOG.error("Error sending current forecast location", ex);
    }
    if (supportsSunriseSunsetWindHumidity()) {
        try {
            TransactionBuilder builder;
            builder = performInitialized("Sending wind/humidity");
            String windString = this.windSpeedString(weatherSpec);
            String humidityString = weatherSpec.currentHumidity + "%";
            int length = 8 + windString.getBytes().length + humidityString.getBytes().length;
            ByteBuffer buf = ByteBuffer.allocate(length);
            buf.order(ByteOrder.LITTLE_ENDIAN);
            buf.put((byte) 64);
            buf.putInt(weatherSpec.timestamp);
            buf.put((byte) (tz_offset_hours * 4));
            buf.put(windString.getBytes());
            buf.put((byte) 0);
            buf.put(humidityString.getBytes());
            buf.put((byte) 0);
            writeToChunked(builder, 1, buf.array());
            builder.queue(getQueue());
        } catch (Exception ex) {
            LOG.error("Error sending wind/humidity", ex);
        }
        float[] longlat = GBApplication.getGBPrefs().getLongLat(getContext());
        float longitude = longlat[0];
        float latitude = longlat[1];
        if (longitude != 0 && latitude != 0) {
            final GregorianCalendar dateTimeToday = new GregorianCalendar();
            GregorianCalendar[] sunriseTransitSet = SPA.calculateSunriseTransitSet(dateTimeToday, latitude, longitude, DeltaT.estimate(dateTimeToday));
            try {
                TransactionBuilder builder;
                builder = performInitialized("Sending sunrise/sunset");
                ByteBuffer buf = ByteBuffer.allocate(10);
                buf.order(ByteOrder.LITTLE_ENDIAN);
                buf.put((byte) 16);
                buf.putInt(weatherSpec.timestamp);
                buf.put((byte) (tz_offset_hours * 4));
                buf.put((byte) sunriseTransitSet[0].get(GregorianCalendar.HOUR_OF_DAY));
                buf.put((byte) sunriseTransitSet[0].get(GregorianCalendar.MINUTE));
                buf.put((byte) sunriseTransitSet[2].get(GregorianCalendar.HOUR_OF_DAY));
                buf.put((byte) sunriseTransitSet[2].get(GregorianCalendar.MINUTE));
                writeToChunked(builder, 1, buf.array());
                builder.queue(getQueue());
            } catch (Exception ex) {
                LOG.error("Error sending sunset/sunrise", ex);
            }
        }
    }
}
Also used : MiBandConst(nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst) GregorianCalendar(java.util.GregorianCalendar) TransactionBuilder(nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder) IOException(java.io.IOException) ByteBuffer(java.nio.ByteBuffer) IOException(java.io.IOException) Version(nodomain.freeyourgadget.gadgetbridge.util.Version) WeatherSpec(nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec)

Example 17 with WeatherSpec

use of nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec in project Gadgetbridge by Freeyourgadget.

the class CMWeatherReceiver method onWeatherRequestCompleted.

@Override
public void onWeatherRequestCompleted(int status, WeatherInfo weatherInfo) {
    if (weatherInfo != null) {
        LOG.info("weather: " + weatherInfo.toString());
        WeatherSpec weatherSpec = new WeatherSpec();
        weatherSpec.timestamp = (int) (weatherInfo.getTimestamp() / 1000);
        weatherSpec.location = weatherInfo.getCity();
        if (weatherInfo.getTemperatureUnit() == FAHRENHEIT) {
            weatherSpec.currentTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTemperature()) + 273;
            weatherSpec.todayMaxTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTodaysHigh()) + 273;
            weatherSpec.todayMinTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTodaysLow()) + 273;
        } else {
            weatherSpec.currentTemp = (int) weatherInfo.getTemperature() + 273;
            weatherSpec.todayMaxTemp = (int) weatherInfo.getTodaysHigh() + 273;
            weatherSpec.todayMinTemp = (int) weatherInfo.getTodaysLow() + 273;
        }
        if (weatherInfo.getWindSpeedUnit() == MPH) {
            weatherSpec.windSpeed = (float) weatherInfo.getWindSpeed() * 1.609344f;
        } else {
            weatherSpec.windSpeed = (float) weatherInfo.getWindSpeed();
        }
        weatherSpec.windDirection = (int) weatherInfo.getWindDirection();
        weatherSpec.currentConditionCode = Weather.mapToOpenWeatherMapCondition(CMtoYahooCondintion(weatherInfo.getConditionCode()));
        weatherSpec.currentCondition = Weather.getConditionString(weatherSpec.currentConditionCode);
        weatherSpec.currentHumidity = (int) weatherInfo.getHumidity();
        weatherSpec.forecasts = new ArrayList<>();
        List<WeatherInfo.DayForecast> forecasts = weatherInfo.getForecasts();
        for (int i = 1; i < forecasts.size(); i++) {
            WeatherInfo.DayForecast cmForecast = forecasts.get(i);
            WeatherSpec.Forecast gbForecast = new WeatherSpec.Forecast();
            if (weatherInfo.getTemperatureUnit() == FAHRENHEIT) {
                gbForecast.maxTemp = (int) WeatherUtils.fahrenheitToCelsius(cmForecast.getHigh()) + 273;
                gbForecast.minTemp = (int) WeatherUtils.fahrenheitToCelsius(cmForecast.getLow()) + 273;
            } else {
                gbForecast.maxTemp = (int) cmForecast.getHigh() + 273;
                gbForecast.minTemp = (int) cmForecast.getLow() + 273;
            }
            gbForecast.conditionCode = Weather.mapToOpenWeatherMapCondition(CMtoYahooCondintion(cmForecast.getConditionCode()));
            weatherSpec.forecasts.add(gbForecast);
        }
        Weather.getInstance().setWeatherSpec(weatherSpec);
        GBApplication.deviceService().onSendWeather(weatherSpec);
    } else {
        LOG.info("request has returned null for WeatherInfo");
    }
}
Also used : WeatherInfo(cyanogenmod.weather.WeatherInfo) WeatherSpec(nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec)

Example 18 with WeatherSpec

use of nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec in project Gadgetbridge by Freeyourgadget.

the class WeatherNotificationReceiver method onReceive.

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction() == null || !intent.getAction().contains("WEATHER_UPDATE_2")) {
        LOG.info("Wrong action");
        return;
    }
    ParcelableWeather2 parcelableWeather2 = null;
    try {
        parcelableWeather2 = intent.getParcelableExtra("ru.gelin.android.weather.notification.EXTRA_WEATHER");
    } catch (RuntimeException e) {
        LOG.error("cannot get ParcelableWeather2", e);
    }
    if (parcelableWeather2 != null) {
        Weather weather = Weather.getInstance();
        weather.setReconstructedOWMForecast(parcelableWeather2.reconstructedOWMForecast);
        WeatherSpec weatherSpec = parcelableWeather2.weatherSpec;
        LOG.info("weather in " + weatherSpec.location + " is " + weatherSpec.currentCondition + " (" + (weatherSpec.currentTemp - 273) + "°C)");
        Weather.getInstance().setWeatherSpec(weatherSpec);
        GBApplication.deviceService().onSendWeather(weatherSpec);
    }
}
Also used : Weather(nodomain.freeyourgadget.gadgetbridge.model.Weather) ParcelableWeather2(ru.gelin.android.weather.notification.ParcelableWeather2) WeatherSpec(nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec)

Example 19 with WeatherSpec

use of nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec in project Gadgetbridge by Freeyourgadget.

the class SMAQ2OSSSupport method onSendWeather.

@Override
public void onSendWeather(WeatherSpec weatherSpec) {
    try {
        TransactionBuilder builder;
        builder = performInitialized("Sending current weather");
        SMAQ2OSSProtos.SetWeather.Builder setWeather = SMAQ2OSSProtos.SetWeather.newBuilder();
        setWeather.setTimestamp(weatherSpec.timestamp);
        setWeather.setCondition(weatherSpec.currentConditionCode);
        setWeather.setTemperature(weatherSpec.currentTemp - 273);
        setWeather.setTemperatureMin(weatherSpec.todayMinTemp - 273);
        setWeather.setTemperatureMax(weatherSpec.todayMaxTemp - 273);
        setWeather.setHumidity(weatherSpec.currentHumidity);
        for (WeatherSpec.Forecast f : weatherSpec.forecasts) {
            SMAQ2OSSProtos.Forecast.Builder fproto = SMAQ2OSSProtos.Forecast.newBuilder();
            fproto.setCondition(f.conditionCode);
            fproto.setTemperatureMin(f.minTemp - 273);
            fproto.setTemperatureMax(f.maxTemp - 273);
            setWeather.addForecasts(fproto);
        }
        builder.write(normalWriteCharacteristic, createMessage(SMAQ2OSSConstants.MSG_SET_WEATHER, setWeather.build().toByteArray()));
        builder.queue(getQueue());
    } catch (Exception ex) {
        LOG.error("Error sending current weather", ex);
    }
}
Also used : WeatherSpec(nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec) TransactionBuilder(nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder) IOException(java.io.IOException)

Example 20 with WeatherSpec

use of nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec in project Gadgetbridge by Freeyourgadget.

the class AppMessageHandlerM7S method onAppStart.

@Override
public GBDeviceEvent[] onAppStart() {
    WeatherSpec weatherSpec = Weather.getInstance().getWeatherSpec();
    if (weatherSpec == null) {
        return new GBDeviceEvent[] { null };
    }
    GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes();
    sendBytes.encodedBytes = encodeM7SWeatherMessage(weatherSpec);
    return new GBDeviceEvent[] { sendBytes };
}
Also used : GBDeviceEvent(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent) WeatherSpec(nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec) GBDeviceEventSendBytes(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes)

Aggregations

WeatherSpec (nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec)24 GBDeviceEvent (nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent)11 GBDeviceEventSendBytes (nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes)11 ByteBuffer (java.nio.ByteBuffer)4 ArrayList (java.util.ArrayList)3 JSONObject (org.json.JSONObject)3 Paint (android.graphics.Paint)2 Pair (android.util.Pair)2 IOException (java.io.IOException)2 TransactionBuilder (nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder)2 JsonPutRequest (nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.json.JsonPutRequest)2 JSONException (org.json.JSONException)2 SuppressLint (android.annotation.SuppressLint)1 Intent (android.content.Intent)1 Cursor (android.database.Cursor)1 Uri (android.net.Uri)1 Bundle (android.os.Bundle)1 WeatherInfo (cyanogenmod.weather.WeatherInfo)1 Calendar (java.util.Calendar)1 GregorianCalendar (java.util.GregorianCalendar)1