Giter VIP home page Giter VIP logo

home-assistant-garmin_connect's Introduction

hacs_badge made-with-python Donate

Garmin Connect

The Garmin Connect integration allows you to expose data from Garmin Connect to Home Assistant.

NOTE: This integration doesn't support 2FA on Garmin Connect yet (support is coming), so if you have enabled it -and want to keep it- this integration doesn't work, it will try to login repeatedly and generate lots of 2FA codes via email. The change of adding support for it is unlikely since the Garmin Connect API is closed source, and will not be open for open-sourced projects.

Installation

HACS - Recommended

  • Have HACS installed, this will allow you to easily manage and track updates.
  • Inside HACS click 'Explore & download repositories'
  • Search for 'Garmin Connect'.
  • Click on found integration.
  • Click Download this repository with HACS.
  • Restart Home-Assistant.
  • Follow configuration steps below.

Manual

  • Copy directory custom_components/garmin_connect to your <config dir>/custom_components directory.
  • Restart Home-Assistant.
  • Follow configuration steps below.

Configuration

Adding Garmin Connect to your Home Assistant instance can be done via the integrations user interface.

  • Browse to your Home Assistant instance.
  • In the sidebar click on Configuration.
  • From the configuration menu select: Integrations.
  • In the bottom right, click on the Add Integration button.
  • From the list, search and select “Garmin Connect”.
  • Follow the instruction on screen to complete the set up

After successful set up a standard set of sensors are enabled. You can enable more if needed by using the Integrations page.

Please be aware that Garmin Connect has very low rate limits, max. once every ~5 minutes.

Available Sensors

Not every sensor holds meaningful values, it depends on the tracking and health devices you use, or the apps you have connected.

Enabled by default:

Total Steps
Daily Step Goal
Total KiloCalories
Active KiloCalories
BMR KiloCalories
Consumed KiloCalories
Burned KiloCalories
Total Distance Mtr
Active Time
Sedentary Time
Sleeping Time
Awake Duration
Sleep Duration
Floors Ascended
Floors Descended
Floors Ascended Goal
Min Heart Rate
Max Heart Rate
Resting Heart Rate
Avg Stress Level
Max Stress Level
Rest Stress Duration
Activity Stress Duration
Uncat. Stress Duration
Total Stress Duration
Low Stress Duration
Medium Stress Duration
High Stress Duration
Body Battery Charged
Body Battery Drained
Body Battery Highest
Body Battery Lowest
Body Battery Most Recent
Average SPO2
Lowest SPO2
Latest SPO2

Disabled by default:

Remaining KiloCalories
Net Remaining KiloCalories
Net Calorie Goal
Wellness Start Time
Wellness End Time
Wellness Description
Wellness Distance Mtr
Wellness Active KiloCalories
Wellness KiloCalories
Highly Active Time
Floors Ascended Mtr
Floors Descended Mtr
Min Avg Heart Rate
Max Avg Heart Rate
Abnormal HR Counts
Last 7 Days Avg Heart Rate
Stress Qualifier
Stress Duration
Stress Percentage
Rest Stress Percentage
Activity Stress Percentage
Uncat. Stress Percentage
Low Stress Percentage
Medium Stress Percentage
High Stress Percentage
Latest SPO2 Time
Average Altitude
Moderate Intensity
Vigorous Intensity
Intensity Goal
Latest Respiration Update
Highest Respiration
Lowest Respiration
Latest Respiration

Weight
BMI
Body Fat
Body Water
Body Mass
Muscle Mass
Physique Rating
Visceral Fat
Metabolic Age

Screenshots

screenshot

Tips and Tricks

Set up an automation using the garmin_connect.add_body_composition service

Useful if you want to pass your weight from another (incompatible) device to Garmin Connect. Garmin Connect does not calculate your BMI when you enter your weight manually so it needs to be passed along for now.

alias: uiSendWeightToGarminConnect
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.my_weight
condition:
  - condition: and
    conditions:
      - condition: numeric_state
        entity_id: sensor.my_weight
        above: 75
      - condition: numeric_state
        entity_id: sensor.my_weight
        below: 88
action:
  - service: garmin_connect.add_body_composition
    data:
      entity_id: sensor.garmin_connect_weight
      weight: "{{trigger.to_state.state}}"
      timestamp: "{{ as_timestamp(now())  | timestamp_local}}"
      bmi: >-
        {{ (trigger.to_state.state | float(0) / 1.86**2 )| round(1, default=0)
        }}
mode: single

Debugging

Add the relevant lines below to the configuration.yaml:

logger:
  default: info
  logs:
    custom_components.garmin_connect: debug

Donation

Donate

home-assistant-garmin_connect's People

Contributors

cyberjunky avatar dependabot[bot] avatar dmadisetti avatar elgatross avatar gorzelak avatar jfparis avatar misa1515 avatar obbers avatar paillom avatar ray0711 avatar ronlut avatar viper5000 avatar wrt54g avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

home-assistant-garmin_connect's Issues

Can't load integration

Screenshot 2022-04-18 at 13 47 18

Whenever I try to install the integration, I get that screen (I don't have much more info than this to be honest)

Happy to try to provide any information that you might require, just let me know.

Device battery?

Are there any metrics that can be accessed regarding the device itself?

In particular, is it possible to get the device battery percentage? It would be nice to have an automation setup to remind me to charge it when it gets below a certain threshold.

Thanks

Local variable 'response' referenced before assignment

Got the following error -- after few seconds got this message too (2022-06-23 12:20:53 INFO (MainThread) [custom_components.garmin_connect] Fetching garmin_connect data recovered)

2022-06-23 12:15:50 ERROR (MainThread) [custom_components.garmin_connect] Unexpected error fetching garmin_connect data: local variable 'response' referenced before assignment
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 703, in urlopen
    httplib_response = self._make_request(
  File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 449, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 444, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/local/lib/python3.9/http/client.py", line 1377, in getresponse
    response.begin()
  File "/usr/local/lib/python3.9/http/client.py", line 320, in begin
    version, status, reason = self._read_status()
  File "/usr/local/lib/python3.9/http/client.py", line 281, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/usr/local/lib/python3.9/socket.py", line 704, in readinto
    return self._sock.recv_into(b)
  File "/usr/local/lib/python3.9/ssl.py", line 1241, in recv_into
    return self.read(nbytes, buffer)
  File "/usr/local/lib/python3.9/ssl.py", line 1099, in read
    return self._sslobj.read(len, buffer)
ConnectionResetError: [Errno 104] Connection reset by peer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/requests/adapters.py", line 440, in send
    resp = conn.urlopen(
  File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 785, in urlopen
    retries = retries.increment(
  File "/usr/local/lib/python3.9/site-packages/urllib3/util/retry.py", line 550, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/usr/local/lib/python3.9/site-packages/urllib3/packages/six.py", line 769, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 703, in urlopen
    httplib_response = self._make_request(
  File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 449, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 444, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/local/lib/python3.9/http/client.py", line 1377, in getresponse
    response.begin()
  File "/usr/local/lib/python3.9/http/client.py", line 320, in begin
    version, status, reason = self._read_status()
  File "/usr/local/lib/python3.9/http/client.py", line 281, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/usr/local/lib/python3.9/socket.py", line 704, in readinto
    return self._sock.recv_into(b)
  File "/usr/local/lib/python3.9/ssl.py", line 1241, in recv_into
    return self.read(nbytes, buffer)
  File "/usr/local/lib/python3.9/ssl.py", line 1099, in read
    return self._sslobj.read(len, buffer)
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/garminconnect/__init__.py", line 47, in get
    response = self.session.get(url, headers=total_headers, params=params)
  File "/usr/local/lib/python3.9/site-packages/requests/sessions.py", line 542, in get
    return self.request('GET', url, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/cloudscraper/__init__.py", line 257, in request
    self.perform_request(method, url, *args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/cloudscraper/__init__.py", line 190, in perform_request
    return super(CloudScraper, self).request(method, url, *args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/requests/sessions.py", line 529, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.9/site-packages/requests/sessions.py", line 645, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/requests/adapters.py", line 501, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 191, in _async_refresh
    self.data = await self._async_update_data()
  File "/config/custom_components/garmin_connect/__init__.py", line 93, in _async_update_data
    summary = await self.hass.async_add_executor_job(
  File "/usr/local/lib/python3.9/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.9/site-packages/garminconnect/__init__.py", line 309, in get_user_summary
    response = self.modern_rest_client.get(url, params=params).json()
  File "/usr/local/lib/python3.9/site-packages/garminconnect/__init__.py", line 51, in get
    if response.status_code == 429:
UnboundLocalError: local variable 'response' referenced before assignment

sensor.next_alarm_time not shown when irregular alarm schedule

The sensor.next_alarm_time entity nicely shows the next alarm time when I have a single alarm set, but when I have a schedule (e.g. 'weekdays') there is no next alarm time shown. It looks like the integration has some trouble handling that. Or do I do something wrong on my watch or with synchronizing?
I would like to couple responses of HA to my wake-up time.

Error with "stress_qualifier" sensor enabled - type str doesn't define round method

Just enabled all sensors again to see what was coming in, and caught one error with the sensor "stress_qualifier" enabled.

  • All other sensors are enabled as well and don't give errors.
  • Version: 0.2.3
  • Looks like strings default to that round(x, 2) return in sensor.py.
Error adding entities for domain sensor with platform garmin_connect
Error while setting up garmin_connect platform for sensor

2023-01-04 19:20:42.827 ERROR (MainThread) [homeassistant.components.sensor] Error while setting up garmin_connect platform for sensor
Traceback (most recent call last):
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/entity_platform.py", line 289, in _async_setup_platform
await asyncio.gather(*pending)
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/entity_platform.py", line 428, in async_add_entities
await asyncio.gather(*tasks)
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/entity_platform.py", line 692, in _async_add_entity
await entity.add_to_platform_finish()
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/entity.py", line 789, in add_to_platform_finish
self.async_write_ha_state()
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/entity.py", line 545, in async_write_ha_state
self._async_write_ha_state()
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/entity.py", line 583, in _async_write_ha_state
state = self._stringify_state(available)
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/entity.py", line 551, in _stringify_state
if (state := self.state) is None:
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/components/sensor/__init__.py", line 680, in state
value = self.native_value
File "/home/homeassistant/.homeassistant/custom_components/garmin_connect/sensor.py", line 127, in native_value
return round(value, 2)
TypeError: type str doesn't define __round__ method

All OK for the other sensors when stress_qualifier is disabled:

2023-01-04 19:25:51.367 DEBUG (MainThread) [custom_components.garmin_connect] Finished fetching garmin_connect data in 0.803 seconds (success: True)
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: totalSteps, Total Steps, steps, mdi:walk, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: dailyStepGoal, Daily Step Goal, steps, mdi:walk, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: totalKilocalories, Total KiloCalories, kcal, mdi:food, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: activeKilocalories, Active KiloCalories, kcal, mdi:food, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: bmrKilocalories, BMR KiloCalories, kcal, mdi:food, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: consumedKilocalories, Consumed KiloCalories, kcal, mdi:food, None, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: burnedKilocalories, Burned KiloCalories, kcal, mdi:food, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: remainingKilocalories, Remaining KiloCalories, kcal, mdi:food, None, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: netRemainingKilocalories, Net Remaining KiloCalories, kcal, mdi:food, None, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: netCalorieGoal, Net Calorie Goal, kcal, mdi:food, None, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: totalDistanceMeters, Total Distance Mtr, m, mdi:walk, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: wellnessStartTimeLocal, Wellness Start Time, None, mdi:clock, timestamp, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: wellnessEndTimeLocal, Wellness End Time, None, mdi:clock, timestamp, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: wellnessDescription, Wellness Description, , mdi:clock, None, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: wellnessDistanceMeters, Wellness Distance Mtr, m, mdi:walk, None, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: wellnessActiveKilocalories, Wellness Active KiloCalories, kcal, mdi:food, None, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: wellnessKilocalories, Wellness KiloCalories, kcal, mdi:food, None, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: highlyActiveSeconds, Highly Active Time, min, mdi:fire, None, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: activeSeconds, Active Time, min, mdi:fire, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: sedentarySeconds, Sedentary Time, min, mdi:seat, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: sleepingSeconds, Sleeping Time, min, mdi:sleep, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: measurableAwakeDuration, Awake Duration, min, mdi:sleep, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: measurableAsleepDuration, Sleep Duration, min, mdi:sleep, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: floorsAscendedInMeters, Floors Ascended Mtr, m, mdi:stairs, None, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: floorsDescendedInMeters, Floors Descended Mtr, m, mdi:stairs, None, False
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: floorsAscended, Floors Ascended, floors, mdi:stairs, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: floorsDescended, Floors Descended, floors, mdi:stairs, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: userFloorsAscendedGoal, Floors Ascended Goal, floors, mdi:stairs, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: minHeartRate, Min Heart Rate, bpm, mdi:heart-pulse, None, True
2023-01-04 19:25:51.369 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: maxHeartRate, Max Heart Rate, bpm, mdi:heart-pulse, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: restingHeartRate, Resting Heart Rate, bpm, mdi:heart-pulse, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: minAvgHeartRate, Min Avg Heart Rate, bpm, mdi:heart-pulse, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: maxAvgHeartRate, Max Avg Heart Rate, bpm, mdi:heart-pulse, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: abnormalHeartRateAlertsCount, Abnormal HR Counts, None, mdi:heart-pulse, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: lastSevenDaysAvgRestingHeartRate, Last 7 Days Avg Heart Rate, bpm, mdi:heart-pulse, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: averageStressLevel, Avg Stress Level, lvl, mdi:flash-alert, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: maxStressLevel, Max Stress Level, lvl, mdi:flash-alert, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: stressQualifier, Stress Qualifier, None, mdi:flash-alert, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: stressDuration, Stress Duration, min, mdi:flash-alert, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: restStressDuration, Rest Stress Duration, min, mdi:flash-alert, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: activityStressDuration, Activity Stress Duration, min, mdi:flash-alert, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: uncategorizedStressDuration, Uncat. Stress Duration, min, mdi:flash-alert, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: totalStressDuration, Total Stress Duration, min, mdi:flash-alert, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: lowStressDuration, Low Stress Duration, min, mdi:flash-alert, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: mediumStressDuration, Medium Stress Duration, min, mdi:flash-alert, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: highStressDuration, High Stress Duration, min, mdi:flash-alert, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: stressPercentage, Stress Percentage, %, mdi:flash-alert, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: restStressPercentage, Rest Stress Percentage, %, mdi:flash-alert, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: activityStressPercentage, Activity Stress Percentage, %, mdi:flash-alert, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: uncategorizedStressPercentage, Uncat. Stress Percentage, %, mdi:flash-alert, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: lowStressPercentage, Low Stress Percentage, %, mdi:flash-alert, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: mediumStressPercentage, Medium Stress Percentage, %, mdi:flash-alert, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: highStressPercentage, High Stress Percentage, %, mdi:flash-alert, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: moderateIntensityMinutes, Moderate Intensity, min, mdi:flash-alert, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: vigorousIntensityMinutes, Vigorous Intensity, min, mdi:run-fast, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: intensityMinutesGoal, Intensity Goal, min, mdi:run-fast, None, False
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: bodyBatteryChargedValue, Body Battery Charged, %, mdi:battery-charging-100, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: bodyBatteryDrainedValue, Body Battery Drained, %, mdi:battery-alert-variant-outline, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: bodyBatteryHighestValue, Body Battery Highest, %, mdi:battery-heart, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: bodyBatteryLowestValue, Body Battery Lowest, %, mdi:battery-heart-outline, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: bodyBatteryMostRecentValue, Body Battery Most Recent, %, mdi:battery-positive, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: averageSpo2, Average SPO2, %, mdi:diabetes, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: lowestSpo2, Lowest SPO2, %, mdi:diabetes, None, True
2023-01-04 19:25:51.370 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: latestSpo2, Latest SPO2, %, mdi:diabetes, None, True
2023-01-04 19:25:51.371 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: latestSpo2ReadingTimeLocal, Latest SPO2 Time, None, mdi:diabetes, timestamp, False
2023-01-04 19:25:51.371 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: averageMonitoringEnvironmentAltitude, Average Altitude, %, mdi:image-filter-hdr, None, False
2023-01-04 19:25:51.371 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: highestRespirationValue, Highest Respiration, brpm, mdi:progress-clock, None, False
2023-01-04 19:25:51.371 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: lowestRespirationValue, Lowest Respiration, brpm, mdi:progress-clock, None, False
2023-01-04 19:25:51.371 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: latestRespirationValue, Latest Respiration, brpm, mdi:progress-clock, None, False
2023-01-04 19:25:51.371 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: latestRespirationTimeGMT, Latest Respiration Update, None, mdi:progress-clock, timestamp, False
2023-01-04 19:25:51.371 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: weight, Weight, kg, mdi:weight-kilogram, None, False
2023-01-04 19:25:51.371 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: bmi, BMI, bmi, mdi:food, None, False
2023-01-04 19:25:51.371 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: bodyFat, Body Fat, %, mdi:food, None, False
2023-01-04 19:25:51.371 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: bodyWater, Body Water, %, mdi:water-percent, None, False
2023-01-04 19:25:51.371 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: boneMass, Bone Mass, kg, mdi:bone, None, False
2023-01-04 19:25:51.372 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: muscleMass, Muscle Mass, kg, mdi:dumbbell, None, False
2023-01-04 19:25:51.372 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: physiqueRating, Physique Rating, None, mdi:numeric, None, False
2023-01-04 19:25:51.372 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: visceralFat, Visceral Fat, %, mdi:food, None, False
2023-01-04 19:25:51.372 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: metabolicAge, Metabolic Age, y, mdi:calendar-heart, None, False
2023-01-04 19:25:51.372 DEBUG (MainThread) [custom_components.garmin_connect.sensor] Registering entity: nextAlarm, Next Alarm Time, None, mdi:alarm, None, True

State max length is 255 characters.

File "/usr/src/homeassistant/homeassistant/core.py", line 1218, in async_set
state = State(
File "/usr/src/homeassistant/homeassistant/core.py", line 906, in init
raise InvalidStateError(
homeassistant.exceptions.InvalidStateError: Invalid state encountered for entity ID: sensor.garmin_next_alarm. State max length is 255 characters.

Long term stats' not available for garmin connect sensors sensors

Hi,

In trying to configure a Statistics Graph Card for the Garmin Connect sleep sensors, I discovered that it (along with the other Garmin Connect sensors) are not configured correctly for statistics tracking. The documentation for the Statistics Graph Card includes a statement that points to what needs to be done ...

"If your sensor doesn’t work with statistics, check this."

The document at that link points to the solution in this developer document:

Long-term Statistics

Integration is using deprecated `DEVICE_CLASS_*` constants

This custom integration uses deprecated DEVICE_CLASS_* constants in its codebase.

The DEVICE_CLASS_* constants have been deprecated and replaced in Home Assistant Core 2021.12 (over a year ago). I would highly suggest updating/migrating this integration to the new enums.

For example, for the device classes supported by the sensor platform, there is now a SensorDeviceClass enum. So if a sensor previously used the DEVICE_CLASS_ENERGY constant, it should now use SensorDeviceClass.ENERGY. Other platforms (like binary_sensor, and number) provide similar enumerations for their supported device classes.

The migration thus only consists of replacing constants with an enumeration member and is, therefore, very low impact and should be fairly straightforward.

If I can help resolve any questions regarding this change or migration, feel free to ask or respond to this issue. I'm happy to help!

Kindest regards,

../Frenck

Weight Sensors change at midnight to 'unknown'?

Hello, great integration. I have noticed that with my Garmin Fit Scale, that my weights come through, but at about midnight my local time, the values revert to "unknown".

image

Here's an example of weight, that shows the value in the history log, but seems the state changes from the value to 'unknown' at shortly before midnight local. (It is currently almost 11:00 local, and the screen shot shows 11 hours ago last change).

This appears to affect the following sensors:

sensor.body_fat
sensor.bmi
sensor.body_water
sensor.bone_mass
sensor.muscle_mass
sensor.visceral_fat
sensor.weight

All of which have values, but then change to 'unknown'. I looked over your code, and it looks like you are just taking stuff from Garmin and putting it into the sensor, but perhaps, it is possible to do a check on these weight values and if they come through as 'unknown' from Garmin, maybe drop it and don't pass it on to the sensor?

I'd be happy to provide additional debug or logs information if it would help to resolve this issue. Thanks!

Failed to connect while logging in for first time

Just downloaded and installed via HACS.

Rebooted as reqd.

When logging in for the first time I receive an error stating failed to connect. Nothing in the logs. I do not have 2FA enabled on this account.

Any suggestions?

Fails on latest update 0.1.6 ha 2021.12.07

:39 PM – (WARNING) Template - message first occurred at 3:21:39 PM and shows up 3 times
Setup failed for garmin_connect: Unable to import component: No module named 'garminconnect_ha
Setup.py. .01.4 and .0.1.5 work.

Invalid Add-on repository

Could it be that the fact there's no repository.json file it results in an error when manually adding the repository to add on store?

Workout started

Hi, I really like this as I am planning on buying a Garmin GPS for mountainbiking. Is it possible to have the app communicate with HA when I start/finish a workout?

Regards, Patrick

HACS

I can't find your integration on HACS. Is it still there?

Error login

Hi,
I am trying to connect, but i have problems with the credentials. There are a solution? Or the problem its garmin?

Data retrieval/parsing cancelled due to exception with "Wellness start time" sensor enabled

Data retrieval/parsing cancelled due to exception with Wellness start time sensor enabled.

  • This value is empty in my Garmin Connect, however I just enabled everthing to see what was coming in.
  • This was for me the only sensor giving troubles in the logs (had all sensors enabled previously).
  • Home assistant says this sensor is no longer used by the Connect integration, however removing it and reloading the integration adds it back again.

AttributeError: 'str' object has no attribute 'tzinfo'

ValueError: Invalid datetime: sensor.wellness_start_time has timestamp device class but provides state 2022-11-19T00:00:00.0:<class 'str'> resulting in ''str' object has no attribute 'tzinfo''

  • Since I don't use this value, I disabled the sensor for now which for me resolves the issue, but wanted to report it nevertheless.

Full log:

2022-11-19 18:50:07.471 DEBUG (MainThread) [custom_components.garmin_connect] Finished fetching garmin_connect data in 1.471 seconds (success: True)
2022-11-19 18:50:07.472 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/components/sensor/__init__.py", line 678, in state
if value.tzinfo is None:
AttributeError: 'str' object has no attribute 'tzinfo'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/update_coordinator.py", line 151, in _handle_refresh_interval
await self._async_refresh(log_failures=True, scheduled=True)
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/update_coordinator.py", line 283, in _async_refresh
self.async_update_listeners()
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/update_coordinator.py", line 110, in async_update_listeners
update_callback()
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/update_coordinator.py", line 348, in _handle_coordinator_update
self.async_write_ha_state()
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/entity.py", line 545, in async_write_ha_state
self._async_write_ha_state()
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/entity.py", line 583, in _async_write_ha_state
state = self._stringify_state(available)
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/helpers/entity.py", line 551, in _stringify_state
if (state := self.state) is None:
File "/usr/share/webapps/homeassistant/lib/python3.10/site-packages/homeassistant/components/sensor/__init__.py", line 689, in state
raise ValueError(
ValueError: Invalid datetime: sensor.wellness_start_time has timestamp device class but provides state 2022-11-19T00:00:00.0:<class 'str'> resulting in ''str' object has no attribute 'tzinfo''
  • Home Assistant core 2022.11.2
  • Garmin Connect integration 0.2.1
  • Phone: Google Pixel 6a (Android 13).
  • Garmin Connect 4.61 on Android.
  • Watch: Garmin Vivoactive 4

[Question/help] Automatically synchronize smart watch to Garmin Connect

Hi,

Apologies for asking this here, I know this isn't a problem with the integration, but it has often proven that my fellow automation colleagues have some nifty tricks for the little problems in our lives.

After going through every setting in the app/watch, searching for options online and even calling with a Garmin developer via their support desk, I have yet to find a resolution for getting my watch automatically synced to Garmin Connect (Garmin told me this wasn't possible, but I've heard that before).

Currently my watch (or rather the app) synchronizes to the cloud (Connect) in two ways:

  1. Automatically after saving an activity on the watch (which for me only happens max. once a day after swimming).
  2. When opening the Garmin Connect app on my phone, or of course manually syncing through the app or watch.

What I would like to see is that the watch/app automatically syncs in the background. Every 15-30 min. would be more than sufficient. At the moment when I don't open the app it just never syncs to Connect, which becomes especially annoying when it's not done before midnight as it resets making me lose the values of the day.

I know this is not an issue of this integration, it simply retrieves every five minutes what's on Connect, however I was wondering if any of you ever ran into this and perhaps have a neat little trick to work around it? At the moment it's a bit pointless for me to have my watch connected to Home Assistant as I'm not really able to automate anything or show data/progress without any values coming in on an "acceptable" interval.

Phone: Google Pixel 6a

  • Android 13.
  • Background access enabled (also properly sends notifications directly etc...).
  • Battery saving fully disabled.
  • Garmin Connect 4.61 (latest).
  • Closing or leaving the application open makes no difference.

Watch: Garmin Vivoactive 4

Many thanks in advance!

Forbidden URL

I have managed to get the Garmin Connect integration to connect and login. But as soon as the integration connects, I get the following two lines appear in my HA Logs: -

2022-01-04 17:15:05 ERROR (MainThread) [custom_components.garmin_connect] Connection error occurred during Garmin Connect login request: Forbidden url 2022-01-04 17:15:05 WARNING (MainThread) [homeassistant.config_entries] Config entry '[email protected]' for garmin_connect integration not ready yet: Forbidden url; Retrying in background

It is possible that my PiHole has blocked something, but the HA logs don't tell me what URL is forbidden.

Any thoughts on what URL is forbidden?

No values returned

Hi,

I installed the plugin without any issue. But after 24 hours I´ve got values only for 9 of 80 sensors. Other sensors are in the state Unknown.
Garmin Connect dashboard is synced and shows all correct data.
It is only my issue or general problem?
I want to know it before I enable debug logs etc.

Thanks, Regards,
Petr

Retrying setup: 'NoneType' object is not iterable

I get the constantly the message: Retrying setup: 'NoneType' object is not iterable and the Garmin Coonnect integration is not working. Tried many times, reinstalling restarting etc. Now ginving up, until some suggestions can be given find the solution.

Every suggestion is appreciated.

Garmin - next alarm time shows Unknown

Hello. I remember that Garmin integration worked, then it was removed, then it was added again... However, I cannot get the entity "Next alarm time" to show anything. Other entities work fine, with delay of 2-5 hours. But no matter what, the "Next alarm time" still shows "unknown".

Failed to connect

I tried to log in to my garmin account, but it always says 'Failed to connect'.I don't know if I'm missing something, but it just won't log into my account.

Sleep Stages

Just got my first Garmin and was pleasantly surprised to find this integration! Just got it setup, but was curious if sleep stages come through or if I need to do something specific to see them? I thought they'd maybe be attributes of sleep time or something but can't seem to find them; or are they just not there?

Thanks for the great work, looking forward to exploring what Garmin offers compared to Fitbit.

bodyMass doesn't exist for Garmin Index Smart Scale

"bodyMass": ["Body Mass", MASS_KILOGRAMS, "mdi:food", None, False],

Please make this changes:
bodyMass with boneMass
mdi:food with mdi:bone

"boneMass": ["Bone Mass", MASS_KILOGRAMS, "mdi:bone", None, False],

this is the correct "measured value name" for Garmin Index Smart Scale or Index S2 Smart Scale. (https://www.garmin.com/nl-NL/p/679362/pn/010-02294-13#overview)

Garmin Index Smart Scale

Adding accounts problems

HA 2021.7.0 Supervised on Debian

HACS repository added.
Integration added.
Adding first account goes well, data is retrieved and posible to see in lovelace card.
But error is occuring and won't go away:

Deze fout is ontstaan door een aangepaste integratie.

Logger: custom_components.garmin_connect
Source: custom_components/garmin_connect/__init__.py:41
Integration: Garmin Connect (documentation)
First occurred: 16:50:21 (3 occurrences)
Last logged: 16:51:21

Connection error occurred during Garmin Connect login request: Connection error

Adding second account does not work.
After enter of credentials nothing happens.
Connection can not be made.

Garmin Connect Password Change

Hi,

I really enjoy a lot of what you have developed and our favorite is the Garmin Connect integration. My wife changed her password and now we are not pulling values from Garmin Connect, is there an easy way to update her password in the custom integration or even in the json files. I see the config_flow.pl script is pulling the username and password from homeassistant.const and strings.json is dialog messages for creds.

Thanks in advance,
Eric

Garmin Connect

I noticed yesterday that the information I'm getting from Garmin is sparse to absent.

Presently, I am getting only the following

Active KiloCalories
Burned KiloCalories
Next Alarm Time
Sedentary Time
Total Distance Mtr
Total KiloCalories

I also get the following error when I reboot:

This error originated from a custom integration.

Logger: custom_components.garmin_connect
Source: custom_components/garmin_connect/init.py:78
Integration: Garmin Connect (documentation, issues)
First occurred: 4:24:56 PM (4 occurrences)
Last logged: 4:25:45 PM

Connection error occurred during Garmin Connect login request: Connection error

Getting warning messages about "The unit of this entity changed from '<unit>' to ''." after upgrading to HA 2022.5.x

After upgrading to HA2022.5.x, the logs contain multiple warning for various sensors in this integration, to the effect that the unit of the entity has changed. e.g.: "The unit of this entity changed from 'min' to ''."

Clicking on the 'Fix Issue' link (Developer Tools -> Statistics) the following message is shown:

The unit of this entity changed, we can't store values in multiple units.
If the historic statistic values have a wrong unit, you can update the units of the old values. The values will not be updated.
Otherwise you can choose to delete all historic statistic values, and start over.

This affects various sensors with various units, such as 'min', '%', 'bpm' or 'steps', among others.

Wondering if this is a consequence of database optimizations/upgrades in the latest version of HA, and how best to proceed.

About the problem of logging in to garmin connect in China

Hi, I found that my garmin Chinese account cannot log in by default, this is because line 108 in the python package garminconnect defaults to Chinese is_cn=False, can you add a switch on the login page to allow us to manually What about changing this parameter to True?
If possible, I think this can greatly reduce login problems for Chinese users. thanks

login but no data

After updating to the latest version login seems to be fine but I don't see any data from my garmin account,
all 81 entities listed are in "unavailable" status

Last activity?

I'm wanting to use a new activity as a trigger. Is it possible to add "sensors" for last activity info? If it's possible, I can work on a PR for this.

sensor.next_alarm_time shows "unavailable" while there is an alarm set in Garmin Connect

Since the March release of HA, I have had an issue with next_alarm_time. Not sure if that's HA related or Garmin related.
But all I know is that since the March release, the next_alarm_time says that it's "unavailable". But I have several alarms set in Garmin Connect.

All other Garmin data do get updated though, As far as I can see, it's only the Next Alarm Time that remains unavailable.
So it could very well be a change in the API on Garmin side, which happened to coincide with when I updated my HA-setup.

Cannot setup Garmin Connect integration

After updating my HA Core to 2012.12.3 it's not possible to setup the Garmin Connect integration. I tried a reinstall but that doesn't changed a thing.

I see this in my log:
2021-12-20 16:00:31 ERROR (MainThread) [homeassistant.components.sensor] Error adding entities for domain sensor with platform garmin_connect
Traceback (most recent call last):
File "/home/homeassistant/.pyenv/versions/3.9.9/lib/python3.9/site-packages/homeassistant/helpers/entity_platform.py", line 382, in async_add_entities
await asyncio.gather(*tasks)
File "/home/homeassistant/.pyenv/versions/3.9.9/lib/python3.9/site-packages/homeassistant/helpers/entity_platform.py", line 613, in _async_add_entity
await entity.add_to_platform_finish()
File "/home/homeassistant/.pyenv/versions/3.9.9/lib/python3.9/site-packages/homeassistant/helpers/entity.py", line 748, in add_to_platform_finish
self.async_write_ha_state()
File "/home/homeassistant/.pyenv/versions/3.9.9/lib/python3.9/site-packages/homeassistant/helpers/entity.py", line 505, in async_write_ha_state
self._async_write_ha_state()
File "/home/homeassistant/.pyenv/versions/3.9.9/lib/python3.9/site-packages/homeassistant/helpers/entity.py", line 538, in _async_write_ha_state
state = self._stringify_state()
File "/home/homeassistant/.pyenv/versions/3.9.9/lib/python3.9/site-packages/homeassistant/helpers/entity.py", line 511, in _stringify_state
if (state := self.state) is None:
File "/mnt/dietpi_userdata/homeassistant/custom_components/garmin_connect/sensor.py", line 125, in state
return round(value, 2)
TypeError: type str doesn't define round method

I'm running HA Core on a Rpi2 with Debian BullsEye and Ptyhon 3.9.9

failed to connect

I have installed the integration over HACS, added it over the Integrations menu, but when entering the logins i get a failed to connect message. It's not a bad password issue, because entering random email and password gets me a different error message. I see nothing in the logs relevant to garmin connect.

Using Home Assistant container 2021.7.1

Intensity minutes

Hi,

The "Intensity Goal" entity is there. The
Moderate Intensity
Vigorous Intensity
is mentioned in the documentation., however I do not have them. I know they should be disabled like the Intensity Goal.

I have installed yesterday using HACS on a RPi4. running versioin 0.1.8

Anything I can do to help/check

garmin jr

is it possible to connect to a garmin connect jr. watch? accounts for those are under an adults account and dont have a seperate login for them and i dont see them on list of active sensors under my account

Unable to log in

Hi
It asks for username and code.

But my login is via email
and it does not work ...

and I have tried that but just say wrong username or code

What is I doing wrong?

Logged in to the Garmin connect website without any problems

Versioning and multiple users

Hi Ron,

loving that you've moved this across to HACS - got a questions. I have two accounts set up, one for me, and one for my wife. I can successfully retrieve data for one account at a time, but not when both are configured. Not sure if (or how to do it) there needs to be a check for the integration running multiple retrievals consecutively, and offset them by a minute if there are?

not connecting to Garmin

guys, I tried million times - it does not allow to login even to Garmin
what am I missing?
installed via HACS, restarted HA, adding integration, entering credentials and ... "login failed"

thx for help

`sensor.next_alarm_time` is providing a string for it's state

On load of the integration, Home Assistant logs the following error:
WARNING (MainThread) [homeassistant.components.sensor] sensor.next_alarm_time is providing a string for its state, while the device class is 'timestamp', this is not valid and will be unsupported from Home Assistant 2022.2. Please report it to the custom component author.

Please fix this as fast as possible to make sure the integration continues working.

All sensors remain "unknown" even after 12+ hours of running

Hi

This integration was working for me for a while and suddenly it no longer does. All sensors show as "unknown".

Running this integration on ver 1.8, with HA 2021.12.10

I get the "forbidden url" error (#26) twice in my logs, but both have happened over 11 hours ago now, and I still get no sensor data.
I have tried restarting HA a few times to get this to work and leave it sitting for 12+ hours, no luck so far.
I had issues getting this to work in the beginning, but indeed running HA for a few hours would fix it in the past.

I have updated some HA versions (started happening in 2021.12.07 I think) during it being broken initially and now, but all had the same issue.
I also updated to the latest integration version 1.8 yesterday, as I wasn't running latest version. However it's been running now for 15 hours and still no data appeared.

Not sure what else I can check.

Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.