async def async_get_measures(self) -> dict[MeasureType, Any]: """Get the measures data.""" _LOGGER.debug("Updating withings measures") now = dt.utcnow() startdate = now - datetime.timedelta(days=7) response = await self._opp.async_add_executor_job( self._api.measure_get_meas, None, None, startdate, now, None, startdate ) # Sort from oldest to newest. groups = sorted( query_measure_groups( response, MeasureTypes.ANY, MeasureGroupAttribs.UNAMBIGUOUS ), key=lambda group: group.created.datetime, reverse=False, ) return { WITHINGS_MEASURE_TYPE_MAP[measure.type].measurement: round( float(measure.value * pow(10, measure.unit)), 2 ) for group in groups for measure in group.measures }
def import_data(self, date_from, date_to): assert self.api is not None assert self.api.user_get_device() is not None meas_result = self.api.measure_get_meas( startdate=date_from, enddate=date_to, # lastupdate=1601478000, lastupdate=None, category=MeasureGetMeasGroupCategory.REAL) api_to_django = { MeasureType.WEIGHT: 'weight', MeasureType.FAT_RATIO: 'fat_pct', } dict_meas = [ { **{ api_to_django[measure.type]: float( measure.value * pow(10, measure.unit)) for measure in grp.measures }, 'measure_date': grp.date.datetime } for grp in query_measure_groups( meas_result, with_measure_type=cast(Tuple, api_to_django.keys()) ) ] logger.debug(f'Values from Withings API: {dict_meas}') db_values = list(Measurement.objects.filter( measure_date__range=[date_from.datetime, date_to.datetime] ).values('measure_date', *api_to_django.values())) logger.debug(f'Values from Django DB: {db_values}') results = {'add': 0, 'del': 0} for i in dict_meas + db_values: if i not in db_values: logger.info(f'Add to DB: {i}') Measurement.objects.create( scale=self.scale, **i ) results['add'] += 1 if i not in dict_meas: logger.info(f'Delete from DB: {i}') Measurement.objects.get(**i).delete() results['del'] += 1 logger.info(f'Import results: {results["add"]} addition,' f' {results["del"]} deletion')
async def async_get_measures(self) -> Dict[MeasureType, Any]: """Get the measures data.""" _LOGGER.debug("Updating withings measures") response = await self._hass.async_add_executor_job(self._api.measure_get_meas) groups = query_measure_groups( response, MeasureTypes.ANY, MeasureGroupAttribs.UNAMBIGUOUS ) return { WITHINGS_MEASURE_TYPE_MAP[measure.type].measurement: round( float(measure.value * pow(10, measure.unit)), 2 ) for group in groups for measure in group.measures }
def test_query_measure_groups() -> None: """Test function.""" response: Final = MeasureGetMeasResponse( offset=0, more=False, timezone=TIMEZONE0, updatetime=arrow.get(100000), measuregrps=( MeasureGetMeasGroup( attrib=MeasureGetMeasGroupAttrib.MANUAL_USER_DURING_ACCOUNT_CREATION, category=MeasureGetMeasGroupCategory.USER_OBJECTIVES, created=arrow.get(10000200), date=arrow.get(10000300), deviceid="dev1", grpid=1, measures=( MeasureGetMeasMeasure(type=MeasureType.WEIGHT, unit=1, value=10), MeasureGetMeasMeasure( type=MeasureType.BONE_MASS, unit=-2, value=20 ), ), ), MeasureGetMeasGroup( attrib=MeasureGetMeasGroupAttrib.MEASURE_USER_CONFIRMED, category=MeasureGetMeasGroupCategory.USER_OBJECTIVES, created=arrow.get(10000400), date=arrow.get(10000500), deviceid="dev2", grpid=2, measures=( MeasureGetMeasMeasure( type=MeasureType.BONE_MASS, unit=21, value=210 ), MeasureGetMeasMeasure( type=MeasureType.FAT_FREE_MASS, unit=-22, value=220 ), ), ), ), ) # Measure type filter. expected1: Final = tuple( [ MeasureGetMeasGroup( attrib=MeasureGetMeasGroupAttrib.MANUAL_USER_DURING_ACCOUNT_CREATION, category=MeasureGetMeasGroupCategory.USER_OBJECTIVES, created=arrow.get(10000200), date=arrow.get(10000300), deviceid="dev1", grpid=1, measures=(), ), MeasureGetMeasGroup( attrib=MeasureGetMeasGroupAttrib.MEASURE_USER_CONFIRMED, category=MeasureGetMeasGroupCategory.USER_OBJECTIVES, created=arrow.get(10000400), date=arrow.get(10000500), deviceid="dev2", grpid=2, measures=( MeasureGetMeasMeasure( type=MeasureType.FAT_FREE_MASS, unit=-22, value=220 ), ), ), ] ) assert query_measure_groups(response, MeasureType.FAT_FREE_MASS) == expected1 expected2: Final = tuple( [ MeasureGetMeasGroup( attrib=MeasureGetMeasGroupAttrib.MEASURE_USER_CONFIRMED, category=MeasureGetMeasGroupCategory.USER_OBJECTIVES, created=arrow.get(10000400), date=arrow.get(10000500), deviceid="dev2", grpid=2, measures=( MeasureGetMeasMeasure( type=MeasureType.FAT_FREE_MASS, unit=-22, value=220 ), ), ) ] ) assert ( query_measure_groups( response, MeasureType.FAT_FREE_MASS, MeasureGetMeasGroupAttrib.MEASURE_USER_CONFIRMED, ) == expected2 ) expected3: Final = tuple( [ MeasureGetMeasGroup( attrib=MeasureGetMeasGroupAttrib.MANUAL_USER_DURING_ACCOUNT_CREATION, category=MeasureGetMeasGroupCategory.USER_OBJECTIVES, created=arrow.get(10000200), date=arrow.get(10000300), deviceid="dev1", grpid=1, measures=( MeasureGetMeasMeasure( type=MeasureType.BONE_MASS, unit=-2, value=20 ), ), ), MeasureGetMeasGroup( attrib=MeasureGetMeasGroupAttrib.MEASURE_USER_CONFIRMED, category=MeasureGetMeasGroupCategory.USER_OBJECTIVES, created=arrow.get(10000400), date=arrow.get(10000500), deviceid="dev2", grpid=2, measures=( MeasureGetMeasMeasure( type=MeasureType.BONE_MASS, unit=21, value=210 ), ), ), ] ) assert query_measure_groups(response, MeasureType.BONE_MASS) == expected3 # Group attrib filter. assert query_measure_groups(response) == response.measuregrps assert ( query_measure_groups(response, MeasureTypes.ANY, MeasureGroupAttribs.ANY) == response.measuregrps ) assert query_measure_groups( response, MeasureTypes.ANY, MeasureGroupAttribs.AMBIGUOUS ) == (response.measuregrps[0],) assert query_measure_groups( response, MeasureTypes.ANY, MeasureGroupAttribs.UNAMBIGUOUS ) == (response.measuregrps[1],) assert query_measure_groups( response, MeasureTypes.ANY, response.measuregrps[0].attrib ) == (response.measuregrps[0],)