Giter Club home page Giter Club logo

ryobi_gdo's Introduction

Ryobi Garage Door Opener - HA Custom Component

This integration will request all of the Garage Door devices linked to your Ryobi account and automatically add them into Home Assistant, through a standard config flow.

The Garage Door must first be setup and added through Ryobi's app. Once you've created an account and can successfully control the garage door from the app, you can use your login details with this integration.

Installation.

Install from HACS (recommended)

  1. Have HACS installed, this will allow you to easily manage and track updates.
  2. Search in HACS for "Ryobi (When its added)" integration.
  3. Add https://github.com/catduckgnaf/ryobi_gdo as custom respository.
  4. Click Install below the found integration.

Issues

Please open an Issue and paste DEBUG logs or I can't help as easily. PLEASE remove all personal login details, including your username, password, device IDs, and API Keys!!

Functionality / To-Do

  • HTTP: Login to check details and get API Key.
  • HTTP: Get devices list to check for more than 1 GDO.
  • HTTP: Get device state for each device.
  • WS: Authenticate using API Key.
  • WS: Subscribe to device notifications using device ID.
  • WS: Listen for device updates and update internal state.
  • Implement RyobiGarage CoverEntity in HA.
  • Set the unique_id properly using device_id, mac, serial and name.
  • WS: Send open/close command to sever
  • Support Vacation mode toggle
  • WS: Check for and implement set_position command (look into app's "preset" functionality).
  • WS: Check for and implement stop command.
  • Implement RyobiGarage LightEntity in HA.
  • Implement Motion Sensor in HA.
  • Fully Support G125
  • [-] Get identities for all modules. (currently a work in progress.).

'Thank You's

ryobi_gdo's People

Contributors

catduckgnaf avatar firstof9 avatar dependabot[bot] avatar cjowood avatar korvinszanto avatar tinkertims avatar

Stargazers

 avatar Mike Powell avatar  avatar  avatar  avatar Marc Sherry avatar  avatar  avatar

Watchers

Marc Sherry avatar Mike Powell avatar  avatar  avatar

ryobi_gdo's Issues

Control the GD200 directly via LAN, bypassing the app completely

Checklist

  • I have filled out the template to the best of my ability.
  • This only contains 1 feature request (if you have multiple feature requests, open one feature request for each feature request).
  • This issue is not a duplicate feature request of previous feature requests.

Is your feature request related to a problem? Please describe.

Many times the Android app breaks, sometimes for weeks on end...

Describe the solution you'd like

Would it be possible to communicate directly with the opener over LAN? I think I've read somewhere that people used wireshark to intercept the Ryobi calls over the network.

Describe alternatives you've considered

Would be great if we could bypass the app completely and not rely on it, the app breaks so many times.
I tried to use a GoControl GD00Z Z-wave controller with the Ryobi but turns out it only works with standard garage openers, the Ryobi is doing something special.

Additional context

I can't find where I saw people mention wireshark for intercepting the Ryobi network calls.

Make All Buttons Toggle On/Off (Fan(s), BT Speaker, Park Assist)

Checklist

  • I have filled out the template to the best of my ability.
  • This only contains 1 feature request (if you have multiple feature requests, open one feature request for each feature request).
  • This issue is not a duplicate feature request of previous feature requests.

Is your feature request related to a problem? Please describe.

I'm unable to toggle the two fans (each button press cycles through fan speeds, 4 levels).
I'm unable to toggle the park-assist on/off.
I'm unable to toggle BT speaker on/off.

Describe the solution you'd like

The fan button controls its speed as follows:
Off-High-Medium-Low
I have two fans, would be great if I could designate/name each.
Opener
BT Speaker toggle on/off
Park Assist toggle on/off
Would be great to see a clear indication of the state each device is at.

Describe alternatives you've considered

I tried changing some of the events to switch-toggle type to no avail

Additional context

Wireless_Indoor_Keypad
My button mappings:
Button '1' toggles on/off bluetooth
Button '2' cycles left-side fan speed
Button '4' toggles park assist on/off
Button '5' cycles right-side fan speed
So after everything is configured (via the app only I assume), all buttons serve as toggles on/off (where the fans cycle through 4 steps for controlling fan speed and turning off the fan).

Key "motionSensor" not supported by GDO125

Checklist

  • I have filled out the template to the best of my ability.
  • This only contains 1 feature request (if you have multiple feature requests, open one feature request for each feature request).
  • This issue is not a duplicate feature request of previous feature requests.

Is your feature request related to a problem? Please describe.

Getting an error when trying to parse the initial API Exception while parsing answer to update device: 'motionSensor'

Describe the solution you'd like

Remove reliance on having a montionSensor key present. GDO125 uses a sensorFlag key for the safety sensors.

Describe alternatives you've considered

N/A

Additional context

"garageDoor_4":{
               "at":{
                  "heightUnits":{
                     "varName":"heightUnits",
                     "varType":"tc_bool",
                     "defv":false,
                     "dataType":"boolean",
                     "units":"",
                     "metaData":{
                        "name":"Units Display"
                     },
                     "flags":[
                        "C"
                     ],
                     "value":false
                  },
                  "remoteProgram":{
                     "varName":"remoteProgram",
                     "varType":"tc_bool",
                     "defv":false,
                     "dataType":"boolean",
                     "units":"",
                     "metaData":{
                        "name":"Remote Program Mode"
                     },
                     "enum":[
                        "Off",
                        "On"
                     ],
                     "flags":[
                        "C",
                        "SERV"
                     ],
                     "value":false,
                     "lastValue":false
                  },
                  "vacationMode":{
                     "varName":"vacationMode",
                     "varType":"tc_bool",
                     "defv":false,
                     "dataType":"boolean",
                     "units":"",
                     "metaData":{
                        "name":"Garage Door Vacation Mode"
                     },
                     "enum":[
                        "Disabled",
                        "Enabled"
                     ],
                     "flags":[
                        "C",
                        "SERV"
                     ],
                     "value":false,
                     "lastValue":false
                  },
                  "sensorFlag":{
                     "varName":"sensorFlag",
                     "varType":"tc_bool",
                     "defv":false,
                     "dataType":"boolean",
                     "units":"",
                     "metaData":{
                        "name":"Safety Sensor Triggered"
                     },
                     "flags":[
                        "C",
                        "SERV"
                     ],
                     "value":false,
                     "lastValue":false,
                     "lastSet":1672453289764
                  },
                  "opMode":{
                     "varName":"opMode",
                     "varType":"tc_uint8",
                     "defv":0,
                     "dataType":"number",
                     "units":"",
                     "metaData":{
                        "name":"Garage Door Operation Mode"
                     },
                     "enum":[
                        "Standard",
                        "Pre-Lockout",
                        "Lockout"
                     ],
                     "max":5,
                     "min":0,
                     "flags":[
                        "C"
                     ],
                     "value":0,
                     "lastValue":0,
                     "lastSet":1668787043860
                  },
                  "doorState":{
                     "varName":"doorState",
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "units":"",
                     "metaData":{
                        "name":"Garage Door State"
                     },
                     "defv":0,
                     "enum":[
                        "Closed",
                        "Open",
                        "Closing",
                        "Opening",
                        "Fault"
                     ],
                     "max":4,
                     "min":0,
                     "flags":[
                        "C",
                        "SET"
                     ],
                     "value":0,
                     "lastValue":0,
                     "lastSet":1672555960089
                  },
                  "doorPercentOpen":{
                     "varName":"doorPercentOpen",
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "defv":-1,
                     "metaData":{
                        "name":"Garage Door Percent Open"
                     },
                     "max":100,
                     "min":-1,
                     "flags":[
                        "C"
                     ],
                     "value":-1
                  },
                  "doorPosition":{
                     "varName":"doorPosition",
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "defv":0,
                     "metaData":{
                        "name":"Garage Door Position"
                     },
                     "max":180,
                     "min":0,
                     "flags":[
                        "C"
                     ],
                     "value":1,
                     "lastValue":1,
                     "lastSet":1672555960089
                  },
                  "maxDoorPosition":{
                     "varName":"maxDoorPosition",
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "defv":0,
                     "metaData":{
                        "name":"Uppermost Garage Door Position"
                     },
                     "max":180,
                     "min":0,
                     "flags":[
                        "C"
                     ],
                     "value":96,
                     "lastValue":96,
                     "lastSet":1661395225403
                  },
                  "presetPosition":{
                     "varName":"presetPosition",
                     "metaData":{
                        "name":"Preset Position"
                     },
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "defv":0,
                     "units":"inches",
                     "max":72,
                     "min":0,
                     "flags":[
                        "C",
                        "SET"
                     ],
                     "value":0,
                     "lastValue":0
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "icon":"/img/profiles/gdo_125.png",
                  "name":"GDO Door 125"
               }
            },

Device ID (Not able to enter any information)

Checklist

  • I have filled out the template to the best of my ability.
  • This only contains 1 feature request (if you have multiple feature requests, open one feature request for each feature request).
  • This issue is not a duplicate feature request of previous feature requests.

Is your feature request related to a problem? Please describe.

When I go to install the integration, after entering my username and password and submitting I get a box to enter my Device ID but nowhere in the box is a place to enter the ID.

Describe the solution you'd like

None

Describe alternatives you've considered

None

Additional context

This is for an issue not a request for an issue
Screenshot 2024-03-24 at 1 00 43 PM

Add support for GDO125

Is your feature request related to a problem? Please describe.

I have a Ryobi GDO125. The response from the API is slightly different (uses different modules numbers) than a majority of their devices resulting in a failure setting up the integration. Referencing this try block from the error: Exception while parsing answer to update device: 'garageDoor_7'. This GDO also does not contain a backupCharger_8 or parkAssistLaser_3 key. Additionally, commands do not work because of the incorrect portId being used in send_command().

Describe the solution you'd like

Add support for the API response from GDO125. I plan to help implement this (or begin to) when I have time.

Specifically, the response TypeMap uses the key garageDoor_4 and garageLight_4 rather than _7. Additionally, rather than wifiModule_9 it uses wifiModule_5.

See how I solved this, in my old sorta broken integration, by pulling the keys of installed devices from the modulePort_X that contained the key moduleProfiles with an array of devices 'installed'. (See entire API response for my GDO below).

We should also update the send_commnd() to use whatever portId the modules are in.

Describe alternatives you've considered

Ignore _7 and have the try/catch ignore missing parkAssist, backupChaarger, etc

Current (bad) solution:

  • Manually change _7 to _4 and comment out parsing of unsupported features.
- modify send_command()
ws_command = {
            "jsonrpc": "2.0",
            "method": "gdoModuleCommand",
            "params": {
                "msgType": 16,
                "moduleType": 5,
                "portId": 4, #CHANGE FROM 7 to 4 (portId of my garageDoor and garageLight module)
                "moduleMsg": {command: value},
                "topic": self._device_id,
            },
        }

Additional context

Entire GDO125 API response
{
   "result":[
      {
         "deviceTypeIds":[
            "GD125"
         ],
         "activated":0,
         "deleted":false,
         "enabled":true,
         "varName":"XXXXXXXXXXXX",
         "metaData":{
            "name":"Main Garage",
            "version":1,
            "icon":"/img/devices/gdo.png",
            "description":"RYOBI Connected Garage Door Opener Master Unit",
            "wskAuthAttempts":[
            ],
            "authCount":1932,
            "sys":{
               "lastSeen":
            },
            "socketId":"ec2.internal.8080_XXXXXXXXXXXX"
         },
         "createdDate":"2022-08-25T02:40:02.132Z",
         "deviceTypeMap":{
            "masterUnit":{
               "at":{
                  "modulesInstalled":{
                     "varName":"modulesInstalled",
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "units":"",
                     "metaData":{
                        "name":"Modules Installed",
                        "description":"the number of ports that are currently occupied",
                        "icon":"icon.png"
                     },
                     "max":255,
                     "min":0,
                     "defv":0,
                     "flags":[
                        "C"
                     ],
                     "value":2,
                     "lastValue":2,
                     "lastSet":1661395223371
                  },
                  "lastSeen":{
                     "defv":0,
                     "min":0,
                     "max":9223372036854776000,
                     "metaData":{
                        "name":"Last Seen",
                        "description":"the description",
                        "icon":"icon.png"
                     },
                     "units":"",
                     "dataType":"number",
                     "varType":"tc_utcdate",
                     "varName":"lastSeen",
                     "flags":[
                        
                     ],
                     "value":1672557444399
                  },
                  "timeZoneOffset":{
                     "defv":0,
                     "min":-12,
                     "max":14,
                     "varName":"timeZoneOffset",
                     "varType":"tc_float",
                     "dataType":"number",
                     "metaData":{
                        "name":"Time Zone Offset"
                     },
                     "units":"hours",
                     "flags":[
                        "SRV",
                        "C",
                        "SET"
                     ],
                     "value":-8
                  },
                  "portCount":{
                     "defv":7,
                     "metaData":{
                        "name":"Port Count"
                     },
                     "varName":"portCount",
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "max":255,
                     "min":0,
                     "flags":[
                        "C"
                     ],
                     "value":10,
                     "lastValue":10,
                     "lastSet":1661395202335
                  },
                  "serialNumber":{
                     "varName":"serialNumber",
                     "varType":"tc_string",
                     "dataType":"string",
                     "units":"",
                     "metaData":{
                        "name":"Serial Number",
                        "description":"",
                        "icon":"icon.png"
                     },
                     "max":"",
                     "min":"",
                     "defv":"",
                     "flags":[
                        "C"
                     ],
                     "value":"00000000000001",
                     "lastValue":"00000000000001",
                     "lastSet":1661395202335
                  },
                  "macAddress":{
                     "varName":"macAddress",
                     "varType":"tc_string",
                     "dataType":"string",
                     "units":"",
                     "metaData":{
                        "name":"MAC Address",
                        "description":"the description",
                        "icon":"icon.png"
                     },
                     "max":"",
                     "min":"",
                     "defv":"",
                     "flags":[
                        "C"
                     ],
                     "value":"",
                     "lastValue":"",
                     "lastSet":1661395202335
                  },
                  "appVersion":{
                     "varName":"appVersion",
                     "varType":"tc_string",
                     "dataType":"string",
                     "units":"",
                     "metaData":{
                        "name":"WiFi FW Version",
                        "description":"The TTI wifi Firmware Version",
                        "icon":"icon.png"
                     },
                     "max":"",
                     "min":"",
                     "defv":"",
                     "flags":[
                        "C"
                     ],
                     "value":"1.0.4",
                     "lastValue":"1.0.4",
                     "lastSet":1661395202335
                  },
                  "nwpVersion":{
                     "varName":"nwpVersion",
                     "varType":"tc_string",
                     "dataType":"string",
                     "units":"",
                     "metaData":{
                        "name":"NWP Version",
                        "description":"TI WiFi Network Processor Version",
                        "icon":"icon.png"
                     },
                     "max":"",
                     "min":"",
                     "defv":"",
                     "flags":[
                        "C"
                     ],
                     "value":"1.0.0.10-2.4.0.2.31.1.3.0.1.1.0.3.34",
                     "lastValue":"1.0.0.10-2.4.0.2.31.1.3.0.1.1.0.3.34",
                     "lastSet":1661395220887
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Master Unit",
                  "description":"GDO Master Unit",
                  "icon":"/img/profiles/gdo.png"
               }
            },
            "modulePort_0":{
               "at":{
                  "portId":{
                     "defv":0,
                     "min":0,
                     "max":255,
                     "metaData":{
                        "name":"Port Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"portId",
                     "flags":[
                        "C"
                     ],
                     "value":0
                  },
                  "portStatus":{
                     "max":false,
                     "min":false,
                     "defv":false,
                     "metaData":{
                        "name":"Port Status"
                     },
                     "dataType":"boolean",
                     "varType":"tc_bool",
                     "varName":"portStatus",
                     "flags":[
                        "C"
                     ],
                     "value":false
                  },
                  "moduleId":{
                     "max":0,
                     "min":0,
                     "defv":0,
                     "metaData":{
                        "name":"Module Type Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"moduleId",
                     "flags":[
                        "C"
                     ],
                     "value":255
                  },
                  "moduleProfiles":{
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "defv":[
                        
                     ],
                     "metaData":{
                        "name":"Module Profile VarName(s)"
                     },
                     "dataType":"object",
                     "varType":"tc_array",
                     "varName":"moduleProfiles",
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  },
                  "triggerTemplateVarNames":{
                     "defv":[
                        
                     ],
                     "varName":"triggerTemplateVarNames",
                     "varType":"tc_array",
                     "dataType":"object",
                     "units":"",
                     "metaData":{
                        "name":"Trigger Template VarNames",
                        "description":"varnames of trigger templates that the module in this port uses",
                        "icon":"icon.png"
                     },
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Module Port 0"
               }
            },
            "modulePort_1":{
               "at":{
                  "portId":{
                     "defv":0,
                     "min":0,
                     "max":255,
                     "metaData":{
                        "name":"Port Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"portId",
                     "flags":[
                        "C"
                     ],
                     "value":1
                  },
                  "portStatus":{
                     "max":false,
                     "min":false,
                     "defv":false,
                     "metaData":{
                        "name":"Port Status"
                     },
                     "dataType":"boolean",
                     "varType":"tc_bool",
                     "varName":"portStatus",
                     "flags":[
                        "C"
                     ],
                     "value":false
                  },
                  "moduleId":{
                     "max":0,
                     "min":0,
                     "defv":0,
                     "metaData":{
                        "name":"Module Type Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"moduleId",
                     "flags":[
                        "C"
                     ],
                     "value":255
                  },
                  "moduleProfiles":{
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "defv":[
                        
                     ],
                     "metaData":{
                        "name":"Module Profile VarName(s)"
                     },
                     "dataType":"object",
                     "varType":"tc_array",
                     "varName":"moduleProfiles",
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  },
                  "triggerTemplateVarNames":{
                     "defv":[
                        
                     ],
                     "varName":"triggerTemplateVarNames",
                     "varType":"tc_array",
                     "dataType":"object",
                     "units":"",
                     "metaData":{
                        "name":"Trigger Template VarNames",
                        "description":"varnames of trigger templates that the module in this port uses",
                        "icon":"icon.png"
                     },
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Module Port 1"
               }
            },
            "modulePort_2":{
               "at":{
                  "portId":{
                     "defv":0,
                     "min":0,
                     "max":255,
                     "metaData":{
                        "name":"Port Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"portId",
                     "flags":[
                        "C"
                     ],
                     "value":2
                  },
                  "portStatus":{
                     "max":false,
                     "min":false,
                     "defv":false,
                     "metaData":{
                        "name":"Port Status"
                     },
                     "dataType":"boolean",
                     "varType":"tc_bool",
                     "varName":"portStatus",
                     "flags":[
                        "C"
                     ],
                     "value":false
                  },
                  "moduleId":{
                     "max":0,
                     "min":0,
                     "defv":0,
                     "metaData":{
                        "name":"Module Type Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"moduleId",
                     "flags":[
                        "C"
                     ],
                     "value":255
                  },
                  "moduleProfiles":{
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "defv":[
                        
                     ],
                     "metaData":{
                        "name":"Module Profile VarName(s)"
                     },
                     "dataType":"object",
                     "varType":"tc_array",
                     "varName":"moduleProfiles",
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  },
                  "triggerTemplateVarNames":{
                     "defv":[
                        
                     ],
                     "varName":"triggerTemplateVarNames",
                     "varType":"tc_array",
                     "dataType":"object",
                     "units":"",
                     "metaData":{
                        "name":"Trigger Template VarNames",
                        "description":"varnames of trigger templates that the module in this port uses",
                        "icon":"icon.png"
                     },
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Module Port 2"
               }
            },
            "modulePort_3":{
               "at":{
                  "portId":{
                     "defv":0,
                     "min":0,
                     "max":255,
                     "metaData":{
                        "name":"Port Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"portId",
                     "flags":[
                        "C"
                     ],
                     "value":3
                  },
                  "portStatus":{
                     "max":false,
                     "min":false,
                     "defv":false,
                     "metaData":{
                        "name":"Port Status"
                     },
                     "dataType":"boolean",
                     "varType":"tc_bool",
                     "varName":"portStatus",
                     "flags":[
                        "C"
                     ],
                     "value":false
                  },
                  "moduleId":{
                     "max":0,
                     "min":0,
                     "defv":0,
                     "metaData":{
                        "name":"Module Type Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"moduleId",
                     "flags":[
                        "C"
                     ],
                     "value":255
                  },
                  "moduleProfiles":{
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "defv":[
                        
                     ],
                     "metaData":{
                        "name":"Module Profile VarName(s)"
                     },
                     "dataType":"object",
                     "varType":"tc_array",
                     "varName":"moduleProfiles",
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  },
                  "triggerTemplateVarNames":{
                     "defv":[
                        
                     ],
                     "varName":"triggerTemplateVarNames",
                     "varType":"tc_array",
                     "dataType":"object",
                     "units":"",
                     "metaData":{
                        "name":"Trigger Template VarNames",
                        "description":"varnames of trigger templates that the module in this port uses",
                        "icon":"icon.png"
                     },
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Module Port 3"
               }
            },
            "modulePort_4":{
               "at":{
                  "portId":{
                     "defv":0,
                     "min":0,
                     "max":255,
                     "metaData":{
                        "name":"Port Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"portId",
                     "flags":[
                        "C"
                     ],
                     "value":4
                  },
                  "portStatus":{
                     "max":false,
                     "min":false,
                     "defv":false,
                     "metaData":{
                        "name":"Port Status"
                     },
                     "dataType":"boolean",
                     "varType":"tc_bool",
                     "varName":"portStatus",
                     "flags":[
                        "C"
                     ],
                     "value":true,
                     "lastValue":false,
                     "lastSet":1661395222521
                  },
                  "moduleId":{
                     "max":0,
                     "min":0,
                     "defv":0,
                     "metaData":{
                        "name":"Module Type Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"moduleId",
                     "flags":[
                        "C"
                     ],
                     "value":11,
                     "lastValue":255,
                     "lastSet":1661395222521
                  },
                  "moduleProfiles":{
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "defv":[
                        
                     ],
                     "metaData":{
                        "name":"Module Profile VarName(s)"
                     },
                     "dataType":"object",
                     "varType":"tc_array",
                     "varName":"moduleProfiles",
                     "flags":[
                        "C"
                     ],
                     "value":[
                        "garageDoor_4",
                        "garageLight_4"
                     ]
                  },
                  "triggerTemplateVarNames":{
                     "defv":[
                        
                     ],
                     "varName":"triggerTemplateVarNames",
                     "varType":"tc_array",
                     "dataType":"object",
                     "units":"",
                     "metaData":{
                        "name":"Trigger Template VarNames",
                        "description":"varnames of trigger templates that the module in this port uses",
                        "icon":"icon.png"
                     },
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "flags":[
                        "C"
                     ],
                     "value":[
                        "GDO.DoorOpens.__varName",
                        "GDO.DoorCloses.__varName",
                        "GDO.DoorOpenLongerThan.__varName",
                        "GDO.DoorOpenAfter.__varName"
                     ]
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Module Port 4"
               }
            },
            "modulePort_5":{
               "at":{
                  "portId":{
                     "defv":0,
                     "min":0,
                     "max":255,
                     "metaData":{
                        "name":"Port Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"portId",
                     "flags":[
                        "C"
                     ],
                     "value":5
                  },
                  "portStatus":{
                     "max":false,
                     "min":false,
                     "defv":false,
                     "metaData":{
                        "name":"Port Status"
                     },
                     "dataType":"boolean",
                     "varType":"tc_bool",
                     "varName":"portStatus",
                     "flags":[
                        "C"
                     ],
                     "value":true,
                     "lastValue":false,
                     "lastSet":1661395223352
                  },
                  "moduleId":{
                     "max":0,
                     "min":0,
                     "defv":0,
                     "metaData":{
                        "name":"Module Type Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"moduleId",
                     "flags":[
                        "C"
                     ],
                     "value":7,
                     "lastValue":255,
                     "lastSet":1661395223352
                  },
                  "moduleProfiles":{
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "defv":[
                        
                     ],
                     "metaData":{
                        "name":"Module Profile VarName(s)"
                     },
                     "dataType":"object",
                     "varType":"tc_array",
                     "varName":"moduleProfiles",
                     "flags":[
                        "C"
                     ],
                     "value":[
                        "wifiModule_5"
                     ]
                  },
                  "triggerTemplateVarNames":{
                     "defv":[
                        
                     ],
                     "varName":"triggerTemplateVarNames",
                     "varType":"tc_array",
                     "dataType":"object",
                     "units":"",
                     "metaData":{
                        "name":"Trigger Template VarNames",
                        "description":"varnames of trigger templates that the module in this port uses",
                        "icon":"icon.png"
                     },
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Module Port 5"
               }
            },
            "modulePort_6":{
               "at":{
                  "portId":{
                     "defv":0,
                     "min":0,
                     "max":255,
                     "metaData":{
                        "name":"Port Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"portId",
                     "flags":[
                        "C"
                     ],
                     "value":6
                  },
                  "portStatus":{
                     "max":false,
                     "min":false,
                     "defv":false,
                     "metaData":{
                        "name":"Port Status"
                     },
                     "dataType":"boolean",
                     "varType":"tc_bool",
                     "varName":"portStatus",
                     "flags":[
                        "C"
                     ],
                     "value":false
                  },
                  "moduleId":{
                     "max":0,
                     "min":0,
                     "defv":0,
                     "metaData":{
                        "name":"Module Type Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"moduleId",
                     "flags":[
                        "C"
                     ],
                     "value":255
                  },
                  "moduleProfiles":{
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "defv":[
                        
                     ],
                     "metaData":{
                        "name":"Module Profile VarName(s)"
                     },
                     "dataType":"object",
                     "varType":"tc_array",
                     "varName":"moduleProfiles",
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  },
                  "triggerTemplateVarNames":{
                     "defv":[
                        
                     ],
                     "varName":"triggerTemplateVarNames",
                     "varType":"tc_array",
                     "dataType":"object",
                     "units":"",
                     "metaData":{
                        "name":"Trigger Template VarNames",
                        "description":"varnames of trigger templates that the module in this port uses",
                        "icon":"icon.png"
                     },
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Module Port 6"
               }
            },
            "modulePort_7":{
               "at":{
                  "portId":{
                     "defv":0,
                     "min":0,
                     "max":255,
                     "metaData":{
                        "name":"Port Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"portId",
                     "flags":[
                        "C"
                     ],
                     "value":7
                  },
                  "portStatus":{
                     "max":false,
                     "min":false,
                     "defv":false,
                     "metaData":{
                        "name":"Port Status"
                     },
                     "dataType":"boolean",
                     "varType":"tc_bool",
                     "varName":"portStatus",
                     "flags":[
                        "C"
                     ],
                     "value":false
                  },
                  "moduleId":{
                     "max":0,
                     "min":0,
                     "defv":0,
                     "metaData":{
                        "name":"Module Type Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"moduleId",
                     "flags":[
                        "C"
                     ],
                     "value":255
                  },
                  "moduleProfiles":{
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "defv":[
                        
                     ],
                     "metaData":{
                        "name":"Module Profile VarName(s)"
                     },
                     "dataType":"object",
                     "varType":"tc_array",
                     "varName":"moduleProfiles",
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  },
                  "triggerTemplateVarNames":{
                     "defv":[
                        
                     ],
                     "varName":"triggerTemplateVarNames",
                     "varType":"tc_array",
                     "dataType":"object",
                     "units":"",
                     "metaData":{
                        "name":"Trigger Template VarNames",
                        "description":"varnames of trigger templates that the module in this port uses",
                        "icon":"icon.png"
                     },
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Module Port 7"
               }
            },
            "modulePort_8":{
               "at":{
                  "portId":{
                     "defv":0,
                     "min":0,
                     "max":255,
                     "metaData":{
                        "name":"Port Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"portId",
                     "flags":[
                        "C"
                     ],
                     "value":8
                  },
                  "portStatus":{
                     "max":false,
                     "min":false,
                     "defv":false,
                     "metaData":{
                        "name":"Port Status"
                     },
                     "dataType":"boolean",
                     "varType":"tc_bool",
                     "varName":"portStatus",
                     "flags":[
                        "C"
                     ],
                     "value":false
                  },
                  "moduleId":{
                     "max":0,
                     "min":0,
                     "defv":0,
                     "metaData":{
                        "name":"Module Type Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"moduleId",
                     "flags":[
                        "C"
                     ],
                     "value":255
                  },
                  "moduleProfiles":{
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "defv":[
                        
                     ],
                     "metaData":{
                        "name":"Module Profile VarName(s)"
                     },
                     "dataType":"object",
                     "varType":"tc_array",
                     "varName":"moduleProfiles",
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  },
                  "triggerTemplateVarNames":{
                     "defv":[
                        
                     ],
                     "varName":"triggerTemplateVarNames",
                     "varType":"tc_array",
                     "dataType":"object",
                     "units":"",
                     "metaData":{
                        "name":"Trigger Template VarNames",
                        "description":"varnames of trigger templates that the module in this port uses",
                        "icon":"icon.png"
                     },
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Module Port 8"
               }
            },
            "modulePort_9":{
               "at":{
                  "portId":{
                     "defv":0,
                     "min":0,
                     "max":255,
                     "metaData":{
                        "name":"Port Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"portId",
                     "flags":[
                        "C"
                     ],
                     "value":9
                  },
                  "portStatus":{
                     "max":false,
                     "min":false,
                     "defv":false,
                     "metaData":{
                        "name":"Port Status"
                     },
                     "dataType":"boolean",
                     "varType":"tc_bool",
                     "varName":"portStatus",
                     "flags":[
                        "C"
                     ],
                     "value":false
                  },
                  "moduleId":{
                     "max":0,
                     "min":0,
                     "defv":0,
                     "metaData":{
                        "name":"Module Type Id"
                     },
                     "dataType":"number",
                     "varType":"tc_uint8",
                     "varName":"moduleId",
                     "flags":[
                        "C"
                     ],
                     "value":255
                  },
                  "moduleProfiles":{
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "defv":[
                        
                     ],
                     "metaData":{
                        "name":"Module Profile VarName(s)"
                     },
                     "dataType":"object",
                     "varType":"tc_array",
                     "varName":"moduleProfiles",
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  },
                  "triggerTemplateVarNames":{
                     "defv":[
                        
                     ],
                     "varName":"triggerTemplateVarNames",
                     "varType":"tc_array",
                     "dataType":"object",
                     "units":"",
                     "metaData":{
                        "name":"Trigger Template VarNames",
                        "description":"varnames of trigger templates that the module in this port uses",
                        "icon":"icon.png"
                     },
                     "max":[
                        
                     ],
                     "min":[
                        
                     ],
                     "flags":[
                        "C"
                     ],
                     "value":[
                        
                     ]
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Module Port 9"
               }
            },
            "garageDoor_4":{
               "at":{
                  "heightUnits":{
                     "varName":"heightUnits",
                     "varType":"tc_bool",
                     "defv":false,
                     "dataType":"boolean",
                     "units":"",
                     "metaData":{
                        "name":"Units Display"
                     },
                     "flags":[
                        "C"
                     ],
                     "value":false
                  },
                  "remoteProgram":{
                     "varName":"remoteProgram",
                     "varType":"tc_bool",
                     "defv":false,
                     "dataType":"boolean",
                     "units":"",
                     "metaData":{
                        "name":"Remote Program Mode"
                     },
                     "enum":[
                        "Off",
                        "On"
                     ],
                     "flags":[
                        "C",
                        "SERV"
                     ],
                     "value":false,
                     "lastValue":false
                  },
                  "vacationMode":{
                     "varName":"vacationMode",
                     "varType":"tc_bool",
                     "defv":false,
                     "dataType":"boolean",
                     "units":"",
                     "metaData":{
                        "name":"Garage Door Vacation Mode"
                     },
                     "enum":[
                        "Disabled",
                        "Enabled"
                     ],
                     "flags":[
                        "C",
                        "SERV"
                     ],
                     "value":false,
                     "lastValue":false
                  },
                  "sensorFlag":{
                     "varName":"sensorFlag",
                     "varType":"tc_bool",
                     "defv":false,
                     "dataType":"boolean",
                     "units":"",
                     "metaData":{
                        "name":"Safety Sensor Triggered"
                     },
                     "flags":[
                        "C",
                        "SERV"
                     ],
                     "value":false,
                     "lastValue":false,
                     "lastSet":1672453289764
                  },
                  "opMode":{
                     "varName":"opMode",
                     "varType":"tc_uint8",
                     "defv":0,
                     "dataType":"number",
                     "units":"",
                     "metaData":{
                        "name":"Garage Door Operation Mode"
                     },
                     "enum":[
                        "Standard",
                        "Pre-Lockout",
                        "Lockout"
                     ],
                     "max":5,
                     "min":0,
                     "flags":[
                        "C"
                     ],
                     "value":0,
                     "lastValue":0,
                     "lastSet":1668787043860
                  },
                  "doorState":{
                     "varName":"doorState",
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "units":"",
                     "metaData":{
                        "name":"Garage Door State"
                     },
                     "defv":0,
                     "enum":[
                        "Closed",
                        "Open",
                        "Closing",
                        "Opening",
                        "Fault"
                     ],
                     "max":4,
                     "min":0,
                     "flags":[
                        "C",
                        "SET"
                     ],
                     "value":0,
                     "lastValue":0,
                     "lastSet":1672555960089
                  },
                  "doorPercentOpen":{
                     "varName":"doorPercentOpen",
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "defv":-1,
                     "metaData":{
                        "name":"Garage Door Percent Open"
                     },
                     "max":100,
                     "min":-1,
                     "flags":[
                        "C"
                     ],
                     "value":-1
                  },
                  "doorPosition":{
                     "varName":"doorPosition",
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "defv":0,
                     "metaData":{
                        "name":"Garage Door Position"
                     },
                     "max":180,
                     "min":0,
                     "flags":[
                        "C"
                     ],
                     "value":1,
                     "lastValue":1,
                     "lastSet":1672555960089
                  },
                  "maxDoorPosition":{
                     "varName":"maxDoorPosition",
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "defv":0,
                     "metaData":{
                        "name":"Uppermost Garage Door Position"
                     },
                     "max":180,
                     "min":0,
                     "flags":[
                        "C"
                     ],
                     "value":96,
                     "lastValue":96,
                     "lastSet":1661395225403
                  },
                  "presetPosition":{
                     "varName":"presetPosition",
                     "metaData":{
                        "name":"Preset Position"
                     },
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "defv":0,
                     "units":"inches",
                     "max":72,
                     "min":0,
                     "flags":[
                        "C",
                        "SET"
                     ],
                     "value":0,
                     "lastValue":0
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "icon":"/img/profiles/gdo_125.png",
                  "name":"GDO Door 125"
               }
            },
            "garageLight_4":{
               "at":{
                  "lightState":{
                     "varName":"lightState",
                     "varType":"tc_bool",
                     "dataType":"boolean",
                     "units":"off,on",
                     "metaData":{
                        "icon":"icon.png",
                        "description":"Overhead Light",
                        "name":"Light"
                     },
                     "max":true,
                     "min":false,
                     "defv":false,
                     "flags":[
                        "C",
                        "SET"
                     ],
                     "value":false,
                     "lastValue":false,
                     "lastSet":1672556151276
                  },
                  "lightTimer":{
                     "varName":"lightTimer",
                     "varType":"tc_uint8",
                     "dataType":"number",
                     "units":"",
                     "metaData":{
                        "icon":"icon.png",
                        "description":"Overhead Light Timer",
                        "name":"Light Timer"
                     },
                     "max":255,
                     "min":0,
                     "flags":[
                        "C",
                        "SET"
                     ],
                     "lastValue":3,
                     "value":3,
                     "lastSet":1661395225403
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"GDO Light"
               }
            },
            "wifiModule_5":{
               "at":{
                  "macAddress":{
                     "varName":"macAddress",
                     "varType":"tc_string",
                     "dataType":"string",
                     "metaData":{
                        "name":"WiFi MAC Address"
                     },
                     "defv":"",
                     "flags":{
                        "C":true
                     },
                     "value":""
                  },
                  "rssi":{
                     "varName":"rssi",
                     "varType":"tc_int8",
                     "dataType":"number",
                     "metaData":{
                        "name":"RSSI Value"
                     },
                     "defv":-50,
                     "flags":{
                        "C":true
                     },
                     "value":-50
                  },
                  "ipAddr":{
                     "varName":"ipAddr",
                     "varType":"tc_string",
                     "dataType":"string",
                     "metaData":{
                        "name":"IP Address"
                     },
                     "defv":"0.0.0.0",
                     "flags":{
                        "C":true
                     },
                     "value":"0.0.0.0"
                  },
                  "ssid":{
                     "varName":"ssid",
                     "varType":"tc_string",
                     "dataType":"string",
                     "metaData":{
                        "name":"SSID Value"
                     },
                     "defv":"?",
                     "flags":{
                        "C":true
                     },
                     "value":"?"
                  },
                  "id":{
                     "varName":"id",
                     "varType":"tc_int8",
                     "dataType":"number",
                     "metaData":{
                        "name":"ID"
                     },
                     "defv":0,
                     "flags":{
                        "C":true
                     },
                     "value":0
                  },
                  "portInfoReq":{
                     "varName":"portInfoReq",
                     "varType":"tc_int8",
                     "dataType":"number",
                     "metaData":{
                        "name":"Port Info Req"
                     },
                     "defv":0,
                     "flags":{
                        "C":true
                     },
                     "value":0
                  },
                  "serialNum":{
                     "varName":"serialNum",
                     "varType":"tc_int8",
                     "dataType":"number",
                     "metaData":{
                        "name":"Serial Number"
                     },
                     "defv":0,
                     "flags":{
                        "C":true
                     },
                     "value":0
                  }
               },
               "ac":{
                  
               },
               "metaData":{
                  "name":"Wifi Module Status"
               }
            }
         }
      }
}

Tiwi connect API down

Adding a ryobi garage door opener device leads to "Error handling request" with no clear output or logs of the actual failed request or response

Additional context

Logger: aiohttp.server
Source: /usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py:421
First occurred: February 23, 2024 at 10:01:07 PM (11 occurrences)
Last logged: 9:56:15 AM

Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 452, in _handle_request
    resp = await request_handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_app.py", line 543, in _handle
    resp = await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_middlewares.py", line 114, in impl
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 91, in security_filter_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 94, in forwarded_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 28, in request_context_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 80, in ban_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 235, in auth_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 31, in headers_middleware
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 149, in handle
    result = await handler(request, **request.match_info)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 72, in with_admin
    return await func(self, request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 185, in post
    return await super().post(request, flow_id)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 72, in wrapper
    result = await method(view, request, data, *args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 110, in post
    result = await self._flow_mgr.async_configure(flow_id, data)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 358, in async_configure
    result = await self._async_configure(flow_id, user_input)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 404, in _async_configure
    result = await self._async_handle_step(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 501, in _async_handle_step
    result: FlowResult = await getattr(flow, method)(user_input)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/ryobi_gdo/config_flow.py", line 32, in async_step_user
    result = await self._test_credentials(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/ryobi_gdo/config_flow.py", line 97, in _test_credentials
    return await client.get_api_key()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/ryobi_gdo/api.py", line 116, in get_api_key
    resp_meta = request["result"]["metaData"]
                ~~~~~~~^^^^^^^^^^
TypeError: string indices must be integers, not 'str'

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.