Add provideX for Angular standalone apps

Given right now, we need to use a converter to importing modules at bootstrap time
https://github.com/davidlj95/ngx/blob/111a6999931712f06318d96a1350d81af5ed7238/projects/ngx-meta/e2e/a17/src/app/app.config.ts#L15-L22
Whilst the new way with standalone apps is to use provideX methods
https://github.com/davidlj95/ngx/blob/111a6999931712f06318d96a1350d81af5ed7238/projects/ngx-meta/e2e/a17/src/app/app.config.ts#L14-L14
Those create environment injectors, which can't be used by component injectors. That can bring new possibilities
So we can add something like provideNgxMetaRouting() for instance

Okay some learnings after trying out a bit.
Resources:

Standalone components guide
Inspecting a bit Angular's router package. Specifically the

provide_router.ts file
router_module.ts files

Learnings

A provideX can be created in order to avoid the importProvidersFrom API to import NgModules for standalone apps
That function should provide the dependency injection Providers.
Standalone components can only import components, directives or modules. Except if modules are forRoot()-style modules. That use the ModuleWithProviders API to be created.
@Injectable({providedIn: 'root'}) decorator can be used in the library to declare services that are expected to be created only once at the app root injector.
Kind of a singleton. Indeed, Angular's Router is declared like that. That's why it doesn't appear declared in the provideRouter method. It's declared in the RouterModule but only for backwards compatibility purposes.
Listener providers can be used instead of module constructor functions to run a method to initialise the module.
For instance, you have:

APP_INITIALIZER: runs when bootstrapping the app.
You can return a Promise or Observable and app initialisation won't be complete until those complete. Not sure if can be used for a library, but it's a bit dangerous. Given if that is provided as part of a lazy route, then it's too late for that to run.
APP_BOOTSTRAP_LISTENER: runs every time a component is bootstrapped (name can be a bit confusing!).
Indeed you get a reference of the component being bootstrapped. That's what the Angular router does to initialise the router in provideRouter and RouterModule. And also perform the initial navigation (if need to). But how does it do to only initialise it once and not every time a component is bootstrapped? It compares the component being bootstrapped and only inits when the component is the app component.
ENVIRONMENT_INITIALIZER: runs when initialising the "environment". That concept is new for standalone apps. That means when providing providers in the application configuration, as part of a module import or in a route (either early or lazy-loaded). If using only standalone APIs, then just at app bootstrap or route change.

The function only runs once. For instance, if providing an ENVIRONMENT_INITIALIZER in a route, the function runs. But then, when switching to another route, doesn't run again. It doesn't run again if you enter same route where initialiser was provided again.
Environment injectors APIs were introduced in Angular v14. Pretty new

Modules can use provide APIs to DRY. To avoid declaring same providers twice.

For instance, see how router_module.ts imports many things from the provide APIs in order to create the module. This way, duplicate providers declaration is avoided.

So with all of that, we can:

Mark as injectables at root all core services that just need to be created once. Metadata service, defaults service, metadata setter, ...

Defaults service maybe is useful that is created in a non-root injector so that we specify defaults for a part of the app. But we can leave that feature for the feature. We could also code that feature with a global defaults service that is aware of scoped defaults.

Use ENVIRONMENT_INITIALIZER to initialise the router listener.

Okay, if we mark core injectables as root (specifically, MetadataService and MetadataRegistry) those will be global. So if we add some metadata plugin (let's say open graph profile) at a specific route provider / module import / standalone component import that wasn't added in app providers, those won't take effect. Because:

If setting with MetadataService: the one loaded is the root one. Which uses the root MetadataRegistry. Which injects metadata when being built as it's specified in the constructor. So won't be able to fetch metadata injected later (like in the route in this case).
If setting with router: the strategy (like the default one CurrentRouteMetadataStrategy) requires the metadata service when being built. Hence the root metadata service. Hence falling again in the previous case

So we can live with that for now (you can't add extra metadata to manage for a specific route). Or we make the registry load metadata at runtime 🤔 Giving it a quick try to do it at runtime with the inject API

Hmm can't place it inside getAll registry API as it's not in an injection context so an error is triggered. Also to make it work clean with multi: true there's a bit of Typescript code to add

Another solution that works (it worked before) is to provide core services again. However, that would work only for MetadataService.set, given the router listener uses the root service, which uses the root registry. And that one doesn't have the new metadata registered (that behaviour was already there before changing anything)
Another approach can be to call MetadataRegistry.register. But ⚠  that would make the metadata added to be handled for the whole app. One would have to deregister that metadata in case you want to avoid that metadata from being handled once exiting that route.

I think we can leave that for a future feature. For instance, it could be implemented by providing a local registry that loads new metadata from that injector to the global registry. And unloads metadata when being destroyed

For now, making the provideX not provide environment providers, given not sure about why those should be used instead of regular providers. And given environment providers are Angular v14+, we may support (though untested) older Angular versions


running madge from outside project directory shows empty dependencies with paths tsconfig option

Minimal reproducible example: https://github.com/dyllandry/vite-madge-mre
When working on a vue project and running madge from outside the project directory, madge shows missing imports when the import uses tsconfig's paths option.
This will correctly work when madge is run from inside the project:
$ ../madge/bin/cli.js src/main.js --ts-config tsconfig.json
Processed 4 files (352ms)

App.vue
  components/HelloWorld.vue
components/HelloWorld.vue
main.js
  App.vue
  style.css
style.css

But when run from outside the project, it doesn't work:
$ ./madge/bin/cli.js vite-madge-mre/src/main.js --ts-config vite-madge-mre/tsconfig.json --warning
Processed 3 files (272ms) (1 warning)

App.vue
main.js
  App.vue
  style.css
style.css

✖ Skipped 1 file

@/components/HelloWorld.vue

I've seen this issue https://github.com/pahen/madge/issues/399 but I'm not sure what they set --basedir to to get it working. I've tried many different combinations.
I've gotten it working by setting in the project's tsconfig "baseUrl": "." but that could cause breaking behaviour in the project by favoring a relative import instead of one from node_modules.

My current solution is when calling the madge module to provide a tsconfig object that uses my project's tsconfig and adds a baseUrl set to the path to the project's directory.
  const madgeResult = await madge(pathToMainJs, {
    baseDir: pathToProjectDir,
    tsConfig: {
      ...projectsTsconfig,
      compilerOptions: {
        ...projectsTsconfig.compilerOptions,
        baseUrl: pathToProjectDir,
      },
    },
  });

This works for now, but it can still cause breaking changes. If I understand the baseUrl docs correctly, if the project imports "my-module" it could now resolve to a local file "my-module.js" when they mean for it to resolve to a package in node_modules called "my-module". I don't think this is happening for any of my projects, but it is a reason why this solution isn't ideal.


IPv4 validation regex validates faulty ip adresses

Hi,
the class IpV4FormatValidator contains a regex:
private const string IpV4RegexExpression = "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
This one supports also an ip address with only three parts, like: 192.168.178
A correct one would be: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
I got this one from regular-expressions-cookbook@oreilly. Basically these are the same, but the implementation is missing the
"?:(?:" at the start and "\" in the middle.

The current regex is not correct. For instance for this input, the output should be false
string pattern = @"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
string input = "00:45:00.0";
bool isMatch = Regex.IsMatch(input, pattern);
Console.WriteLine(isMatch);

Output: true

With correct regex pattern:
string pattern = @"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
string input = "00:45:00.0";
bool isMatch = Regex.IsMatch(input, pattern);
Console.WriteLine(isMatch);

Output: false


update eslint

Just updating to eslint 6.6.0

@vietnogigoodrx Isn't our shared eslint now published out of singularity - https://github.com/heydoctor/singularity/tree/main/eslint-config?

@vietnogigoodrx Isn't our shared eslint now published out of singularity - https://github.com/heydoctor/singularity/tree/main/eslint-config?

Crap, forgot 🤦🏻♂


Fix the Customer register page and add some styles in the form

I strongly believe that the customer register page needs to be fixed, there are bugs and it is not aligned properly.

we can see that the sign in with google button is not aligned properly and is out of its place. We do not want to give user hassle in registration.
We can fix it by aligning it with the form correctly.
proposed idea:

Also, we can make some changes to the registration form in order to make it more attractive and more user friendly as shown in the above snapshot.
P.S:  I really want to contribute to this wonderful project. So can you please assign me to this task under GSSoC '23. Thank You!

This issue is already being solved...
#26


Add DSC Resource identifier to WinGet manifests

Description of the new feature / enhancement
When I'm trying to author a WinGet configuration file (*.dsc.yaml) it's not easy to discover the DSC resource with the ability to configure the package.
I'd like to have a field in the WinGet manifest with a pointer to a DSC Resource. This would allow WinGet to help configuration file authors locate resources. For example, if a user is adding Visual Studio to a configuration, the manifest for Visual Studio would be able to indicate the "Microsoft.VisualStudio.DSC" module can configure Visual Studio.
Proposed technical implementation details
No response

This might also be a fix the error message I'm seeing with  The module for the configuration unit is available in multiple locations with the same version.. I don't see a way to specify the repository to pull DSC resources from.

I'm starting to think that it might be better to leverage the existing DSC document schema to define the set of resources required to extract configuration.


Add PR label enforcement

Add a check to our PRs that enforced PR labels like we see in Milo. For the check to pass, the PR will need to have either the "verified" or "trivial" label.

Files:

https://github.com/adobecom/milo/blob/main/.github/workflows/enforce-labels.yml

Jira ticket: https://jira.corp.adobe.com/browse/MWPW-134596

We decided we didn't want to add this action


Adding in refcat demo that works on IDF

This notebook shows how to identify and load a reference catalog.
Unlike refcat_loader_demo.ipynb this demo uses the DC2 dataset, and can be run on the IDF
I think this notebook could use a little more text before it is merged, comments/suggestions on the content are welcome

@psferguson is this the one we are closing?

Should check that this works on IDF and at NCSA.


MINOR: improve Streams application reset tool to make sure application is down

@guozhangwang @miguno @dguy @enothereska @hjafarpour
See #1764

@mjsax There is a failure of org.apache.kafka.streams.integration.WordCountIntegrationTest.shouldCountWords but we do not have this class in integration package, could you double check?

Don't understand. What do you mean by "but we do not have this class in integration package"?
Both tests timed out. I guess this is transient failure.

Nvm, I thought it was against trunk.

Merged to 0.10.0, @mjsax could you manually close this PR?


Changes to make it work for OS X (New)

Please decline old pull-request (#672) and review this new pull-request.

Looks good! Thanks Sai


cli should say npx dns instead of npm run dns

Describe the bug
the 'go approve the certificate then rerun this command' instructions likely just need updating to say 'rerun npx dns' instead of 'rerun npm run dns'. I believe this is similar to #79
To Reproduce
Steps to reproduce the behavior:

create a new app with a rando domain name
run npx dns
follow command instructions to the letter, including "rerun npm run dns"
see error

Expected behavior
likely just needs instruction copy update
~Screenshots~ Logs
➜ npx dns

        ARC_APP_NAME filmaj-api
          AWS_REGION us-west-1
         AWS_PROFILE default

                Node 10.4.1
                 npm 6.2.0
                .arc 3.2.17

Requested certificates for REDACTED
Check domain admin email to verify certs and then rerun npm run dns to continue.

➜ npm run dns
npm ERR! missing script: dns

npm ERR!      /Users/maj/.npm/_logs/2018-08-06T21_13_28_830Z-debug.log

Desktop (please complete the following information):

OS: [e.g. iOS] mac osx
Version [e.g. 22] high sierra

Dope, thank you!
lmk if you want commit privs!


Wraps text nodes in span elements.

This is a precursor to implementing actual text styling (bold, italic, underline, font face) as well as selections.

@bors r+

bors r+

bors r-

bors r+


update the BRP to work with new versions of Chrome and Firefox

Currently the React components of the BRP do not work with the new version of Chrome and Firefox.

@seg1129:
Is this issue all encompassing of the browser update issues? Specifically affecting the subject registration?
Is the issue one that stops people from enrolling subjects?

Yes, in chrome 68 - users were not able to add subjects. The processing bar would just continue to move and behind the scenes the request was failing. For some Chrome 68 was doing something funky with the API request generated by the react component. Here is the fix: #191

Ah cool so that's the thing you fixed. Thanks for clarification @seg1129


Update READE with instructions on how to build from command prompt

The same instructions apply to setting up a build agent.
@Sergei-Nikitin, Can you take a look at this?

@Sergei-Nikitin @olegsych can you please merge this in?


New classification activity

This commit implements the updated classification activity. Not all content is included, but it provides a nice foundation  that makes it easy to add new content.
See it live: http://applejack-preview-classification.surge.sh/play/classification
Additions

Updated UI according to Figma prototype
Imported new images from COASST
Added AWS serverless backend to record classification attempts
Added JSON files defining classification images and classification options making it easy to add additional image and options
Added documentation for AWS setup
Added documentation for new JSON file formats

Known issues

Not all images are imported yet. Will be added in an upcoming PR.
Help text for some option types are missing. Will be added in a upcoming PR.
Does not award badges. Will be added in a future PR about progression in general.

The Instructions button when you arrive to the classification activity shares definitions about the 4 classifiers. Should we instead share what to do in the activity and why it is important? I am happy to write that up. I can also write definitions for the other classifiers to add in the "help?" button. Other than this, I approve!

Thank you! since revised content is a non-substantial change (it's easy to update the JSON), I'll merge for now but I'll make sure to add this revised content


google_news and google_news_old return empty result set

Even https://scrapeulous.com/dashboard/api returns nothing.

@slotix I've created a pull request with fixes.


Update dependencies

It seems that common-25.3.3.jar required by com.android.tools.build:gradle:2.3.3 is removed from jcenter recently.
related stackoverflow question: https://stackoverflow.com/questions/53677823/cannot-run-existing-android-project-com-android-toolscommon25-3-3

@zubricky Could you merge it?


Non working socket

Fixes the main issue with websocket. Also some misc cleanups. Great job so far team!


column chooser / table view - shouldn't blink out when adding/removing columns loads

Originally reported by: lisa ballard (Bitbucket: basilleaf, GitHub: basilleaf)

v 1.2

Bitbucket: https://bitbucket.org/ringsnode/opus2/issue/84

This seems to be fine.


Road network and coordinate reference systems

Before we finalize the project, we need to:

[x] confirm that speed limit cleaning worked correctly, including assumptions about mph / kph
[x] save a version of the network to the OSF project
[x] confirm that the code can download the saved version from OSF from https://osf.io/download/65a6bf5aa246ff0cd5dd3ee8/
[ ] I was able to set the OSMNX default CRS to the VT State Plane system, but it caused problems with the query to create a graph. Therefore, I think it is better to leave the default CRS for network analysis as epsg:4326, to convert pharmacies to epsg:4326 for the purposes of 'snapping' them to the nearest graph node, and to then transform the polygons output from network analysis into VT state plane for weighted overlay analysis.

@samroubin I have updated code to check the accuracy of the road network. Once you read the comment above about how to deal with coordinate reference systems, you may close this issue.


Correctly install RPM against Papyrus RCP app

added org.eclipse.xtext.xbase as a dependency
corrected RPM to use /opt/Papyrus/papyrus as the eclipse target and executable.

Signed-off-by: Paul Elder<EMAIL_ADDRESS>

Addresses #75


Do not suggest a command when using the raw module

According to http://docs.ansible.com/raw_module.html, the raw module has
two purposes:
- Installing python-simplejson in old python installations
- Installing python or using ansible without python

Consider the following valid task (which currently fails lint):
- name: Install python-simplejson
  raw: yum install python-simplejson -y

For these reasons, the raw module should probably be ignored.

Good point, well made - thanks.


Support for two networks? They are pingable and reachable

Describe Your Problem:

I have two wireless networks, my homebridge on network-1. I'm able to detect devices on network-1, however, I cannot find devices on network-2 (my IOT network). Is this supported? I can ping the device on network-2 from the homebridge container (on network-1), however it's not discovering.
Am I missing a setting?
Logs:
NOTICE TO USERS AND PLUGIN DEVELOPERS
> Homebridge 2.0 is on the way and brings some breaking changes to existing plugins.
> Please visit the following link to learn more about the changes and how to prepare:
> https://github.com/homebridge/homebridge/wiki/Updating-To-Homebridge-v2.0

[11/10/2024, 11:17:55 PM] [Kasa Python] (31381) wsgi starting up on http://<IP_ADDRESS>:33041
[11/10/2024, 11:17:55 PM] [Kasa Python] (31381) accepted ('<IP_ADDRESS>', 53720)
[11/10/2024, 11:18:00 PM] [Kasa Python] Restarting child bridge...
[11/10/2024, 11:18:00 PM] Got SIGTERM, shutting down child bridge process...
[11/10/2024, 11:18:00 PM] [Kasa Python] An error occurred during device discovery: socket hang up
[11/10/2024, 11:18:05 PM] [Kasa Python] Child bridge process ended
[11/10/2024, 11:18:05 PM] [Kasa Python] Process Ended. Code: 143, Signal: null
[11/10/2024, 11:18:12 PM] [Kasa Python] Restarting Process...
[11/10/2024, 11:18:12 PM] [Kasa Python] Launched child bridge with PID 31414
[11/10/2024, 11:18:12 PM] Registering platform 'homebridge-kasa-python.KasaPython'
[11/10/2024, 11:18:13 PM] [Kasa Python] Loaded homebridge-kasa-python v2.3.1 child bridge successfully
[11/10/2024, 11:18:13 PM] Loaded 3 cached accessories from cachedAccessories.0EC22C5FE329.
[11/10/2024, 11:18:13 PM] [Kasa Python] Configuring cached accessory: [Garage - Kasa Plug 0E94] UUID: fd23e1f5-e1e6-4f7e-9aa0-df4c62da5acc deviceId:
[11/10/2024, 11:18:13 PM] [Kasa Python] Configuring cached accessory: [Entry Kasa] UUID: fe7c3c49-a82c-4d8f-97a2-9ecb28112009 deviceId:
[11/10/2024, 11:18:13 PM] [Kasa Python] Configuring cached accessory: [TP-LINK_Smart Plug_F61D] UUID: 6e25ca08-5921-473e-ac7f-5b3d1a4891f5 deviceId:
[11/10/2024, 11:18:13 PM] [Kasa Python] homebridge-kasa-python v2.3.1, node v20.18.0, homebridge v1.8.5, api v2.7 Initializing...
[11/10/2024, 11:18:13 PM] Homebridge v1.8.5 (HAP v0.12.3) (Kasa Python) is running on port 40106.
[11/10/2024, 11:18:13 PM]

NOTICE TO USERS AND PLUGIN DEVELOPERS
> Homebridge 2.0 is on the way and brings some breaking changes to existing plugins.
> Please visit the following link to learn more about the changes and how to prepare:
> https://github.com/homebridge/homebridge/wiki/Updating-To-Homebridge-v2.0

[11/10/2024, 11:18:13 PM] [Kasa Python] Version file updated to version 2.3.1
[11/10/2024, 11:18:13 PM] [Kasa Python] Plugin version changed, virtual python environment will be recreated.
[11/10/2024, 11:18:32 PM] [Kasa Python] Discovering devices...
[11/10/2024, 11:18:37 PM] [Kasa Python] Devices discovered: 3
[11/10/2024, 11:18:37 PM] [Kasa Python] Adding: [Entry Kasa] IOT.SMARTPLUGSWITCH []
[11/10/2024, 11:18:37 PM] [Kasa Python] Adding: [Garage - Kasa Plug 0E94] IOT.SMARTPLUGSWITCH []
[11/10/2024, 11:18:37 PM] [Kasa Python] Adding: [TP-LINK_Smart Plug_F61D] IOT.SMARTPLUGSWITCH []

Plugin Config:
{
    "name": "Kasa Python",
    "enableCredentials": true,
    "username": "",
    "password": "",
    "powerStrip": false,
    "_bridge": {
        "username": "",
        "port": 40106
    },
    "platform": "KasaPython"
}

Screenshots:

Environment:

Plugin Version: v2.3.1
Homebridge Version:  1.8.5
Node.js Version: v20.18.0
NPM Version: 10.8.2
Operating System:  Ubuntu Jammy (22.04.5 LTS)

The discovery is done based on the connected network and the default broadcast address of <IP_ADDRESS>. I can see about adding an option for additional discovery networks to be added. They would need to be applied in the format of: <IP_ADDRESS>. Give me some time to work through this and add it in.

Thank you so much - Look forward to testing

Ok, excellent. I'll update this again once I have something for you to test. Now, as you stated, you can ping the devices from the Homebridge instance, direct network communication will be required for this plugin and library to work. It will not communicate over the Kasa Cloud to devices.

Marc,  I could use this as well.  However it looks like the homebridge and iPhone have to still be on the same network, did you find a way around that issue? On Nov 11, 2024, at 12:07 AM, Marc Smith @.> wrote: Thank you so much - Look forward to testing —Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you are subscribed to this thread.Message ID: @.>

I have not found a work around for this. Of course the other option is put homebridge all in the same network as my devices. I will do this unless ZeliardM feature to add discovery networks option doesn't pane out.

I have updated to v2.4.0. There is a new area under discovery options to add the other networks, formatted <IP_ADDRESS>, add your other network and let's see if the other devices can be discovered. Let me know.

Hello - Thanks for the work on this. However, It hasn't found the devices on that network. I'm going to keep poking around and test.
{
    "name": "Kasa Python",
    "enableCredentials": true,
    "username": "",
    "password": "",
    "powerStrip": false,
    "additionalNetworks": [
        "<IP_ADDRESS>"
    ],
    "_bridge": {
        "username": "",
        "port": 40106
    },
    "platform": "KasaPython"
}

NOTICE TO USERS AND PLUGIN DEVELOPERS
Homebridge 2.0 is on the way and brings some breaking changes to existing plugins.
Please visit the following link to learn more about the changes and how to prepare:
https://github.com/homebridge/homebridge/wiki/Updating-To-Homebridge-v2.0
[11/11/2024, 5:03:48 PM] [Kasa Python] Discovering devices...
[11/11/2024, 5:03:53 PM] [Kasa Python] Devices discovered: 3
[11/11/2024, 5:03:53 PM] [Kasa Python] Adding: [Entry Kasa] IOT.SMARTPLUGSWITCH []
[11/11/2024, 5:03:53 PM] [Kasa Python] Adding: [Garage - Kasa Plug 0E94] IOT.SMARTPLUGSWITCH []
[11/11/2024, 5:03:53 PM] [Kasa Python] Adding: [TP-LINK_Smart Plug_F61D] IOT.SMARTPLUGSWITCH []

Here is a ping from homebridge in console

#homebridge -V
1.8.5
#ping <IP_ADDRESS>
PING <IP_ADDRESS> (<IP_ADDRESS>) 56(84) bytes of data.
64 bytes from <IP_ADDRESS>: icmp_seq=1 ttl=254 time=27.3 ms
64 bytes from <IP_ADDRESS>: icmp_seq=2 ttl=254 time=51.7 ms
^C
--- <IP_ADDRESS> ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 27.263/39.485/51.707/12.222 ms

#ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet <IP_ADDRESS>  netmask <IP_ADDRESS>  broadcast <IP_ADDRESS>
ether 02:42:ac:10:01:c0  txqueuelen 0  (Ethernet)
RX packets 269114  bytes 139683419 (139.6 MB)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 220628  bytes 32546646 (32.5 MB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
inet <IP_ADDRESS>  netmask <IP_ADDRESS>
inet6 ::1  prefixlen 128  scopeid 0x10
loop  txqueuelen 1000  (Local Loopback)
RX packets 152189  bytes 71473574 (71.4 MB)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 152189  bytes 71473574 (71.4 MB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Ok, I'll check and see if there's anything else I need to do on my end as well. I also made another update to hopefully resolve the issues with the alias. Try v2.4.1

Same result with v2.4.1

Yea, sorry, 2.4.1 was only to handle the issues with the alias not working correctly sometimes. I'll have to look into the issue with the network a little further. Would you be willing to do some troubleshooting of the library from the Homebridge Web UI Terminal?

Given instructions, I'll do my best to help, yes.

In the Web UI, open the terminal:
It should start in /var/lib/homebridge/
Type cd kasa-python and then enter, then the following:
source .venv/bin/activate
kasa --version
kasa --target <IP_ADDRESS> discover

Here you go

Note: This is a restricted shell, sudo cannot be used here.
Homebridge Terminal
Node.js Version: v20.18.0
Node.js Path: /opt/homebridge/bin/node
Plugin Path: /var/lib/homebridge/node_modules
Update Node.js: hb-service update-node
Install Plugin: hb-service add homebridge-plugin-name
Remove Plugin: hb-service remove homebridge-plugin-name
root@7a57c1e717ba:/var/lib/homebridge $ cd kasa-python
root@7a57c1e717ba:/var/lib/homebridge/kasa-python $ source .venv/bin/activate
(.venv) root@7a57c1e717ba:/var/lib/homebridge/kasa-python $ kasa --version
kasa, version 0.7.7
(.venv) root@7a57c1e717ba:/var/lib/homebridge/kasa-python $ kasa --target <IP_ADDRESS> discover
Discovering devices on <IP_ADDRESS> for 10 seconds
Found 0 devices
(.venv) root@7a57c1e717ba:/var/lib/homebridge/kasa-python $

Ok, so I guessed that <IP_ADDRESS> is the broadcast address for the other network. I suppose a little more information about the other devices might be needed. Is the other network segmented and closed off? Like can the devices talk to each other, do they talk to the internet, is mDNS enabled in the network for broadcast discovery? If not, I can see about doing a manual input for specific IP's and we can see if that works.

mDNS is enabled, network can talk to internet. it's a /26 so my broadcast is <IP_ADDRESS>.63. You might need to allow users to specify CIDR, if allowed.
For now, I switched to a /24 so my broadcast is <IP_ADDRESS>. That being said, I'm still not discovering the devices, even using the cmd prompt mentioned above. I restarted bridge and plugin after changes were made.

So I used your commands directly to the ip address of the device I wanted added and that worked. See below. This isn't ideal, as the IP could change, so would like to figure out auto-discover.

(.venv) root@7a57c1e717ba:/var/lib/homebridge/kasa-python $ kasa --target <IP_ADDRESS> discover
Discovering devices on <IP_ADDRESS> for 10 seconds
== Back porch - KL130(US) ==
Host: <IP_ADDRESS>
Port: 9999
Device state: True
Time:         2024-11-11 23:54:52-05:00
Hardware:     3.0
Software:     1.0.15 Build 240429 Rel.154143
MAC (rssi):   14:eb:b6:33:f3:31 (-60)
== Primary features ==
State (state): True
Current consumption (current_consumption): 1.2 W
Brightness (brightness): 4 (range: 0-100)
Color temperature (color_temperature): 3945 (range: 2500-9000)
== Information ==
Today's consumption (consumption_today): 0.028 kWh
This month's consumption (consumption_this_month): 0.374 kWh
Total consumption since reboot (consumption_total): 0.036 kWh
Cloud connection (cloud_connection): True
== Configuration ==
HSV (hsv): HSV(hue=0, saturation=0, value=4)
Light preset (light_preset): Not set Light preset 1 Light preset 2 Light preset 3 Light preset 4
== Debug ==
RSSI (rssi): -60 dBm
Reboot (reboot):
Found 1 devices
(.venv) root@7a57c1e717ba:/var/lib/homebridge/kasa-python $

Ok, I'll make the modifications for specifying the exact broadcast. I'll also make modifications for specifying devices and let you know when those changes are done.

As of right now, bulbs and lights are not supported by the plugin, so they may be discoverable by the library but the plugin will not find them.

I have an EP40 on that network as well that isn't being discovered. At this point, I'm somewhat convinced that it's a network issue. One thing I failed to mention is I have VLANs enabled. Upon my research it appears mDNS isn't supported across VLANs without a repeater. My network hardware/software does support it, but I can't seem to get it to work.
From your kasa commands you sent me, manually adding seems to work and might be a workaround. However, I think my best route would be to put everything on the same network.
I really appreciate your responsiveness and help on this. I'll continue to help if you need someone to test.

I'm going to add manually adding devices, just in case people want to only manually add them and not use the broadcasting. Give me a bit and I will get something together.

Check v2.4.2 and see if you can manually add the devices you have on the other network, you don't need to manually add the devices on the network that are connected to the homebridge instance. If they get added, check and make sure that you can control them correctly from Homebridge and HomeKit.

If the discover works through the library on the Homebridge Web UI Terminal, it should work through the plugin. Could be something else with the plugin. Let me add some additional logging. Do you know how to turn on Debug Mode in Homebridge? Now, this may print some sensitive information, so I would suggest scrubbing it before you post any logs, but let me update the logging and get v2.4.3 out there and have you try it.

Ok, sorry, try v2.4.4, I forgot to turn on the logging

here you go
homebridge-kasa-python.log(2).txt

Ok, looks like it didn't pull in the manual device. Let me look into it.

Ok, let's try v2.5.0. I got everything to parse and pass correctly now. remove the manual devices, put your broadcast back at the correct one and let's try the discovery on the additionalBroadcast and see what happens. You should be able to disable the debug logging as well. Please let me know.

v2.5.1 should resolve the errors with the device name in getSysInfo

Hello -
It appears to scan for them, but again, I don't think mDNS works across multiple VLAN IDs, therefore, nothing is discovered on my added broadcast network (at least in my network).

[11/13/2024, 2:15:15 PM] [KasaPython] Child bridge process ended
[11/13/2024, 2:15:15 PM] [KasaPython] Process Ended. Code: 143, Signal: null
[11/13/2024, 2:15:22 PM] [KasaPython] Restarting Process...
[11/13/2024, 2:15:22 PM] [KasaPython] Launched child bridge with PID 2621
[11/13/2024, 2:15:23 PM] [KasaPython] Loaded homebridge-kasa-python v2.5.1 child bridge successfully
[11/13/2024, 2:15:23 PM] [KasaPython] Configuring cached accessory: [Smart Plug 20A8] UUID: 02fa4449-7986-49cc-9526-2fe675759917 deviceId: 80068CA5E49793D1E684A461C4BA79B71FEF709A
[11/13/2024, 2:15:23 PM] [KasaPython] homebridge-kasa-python v2.5.1, node v20.18.0, homebridge v1.8.5, api v2.7 Initializing...
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Starting python environment check...
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Running command: python3 --version
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Command PID: 2632
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Command finished.
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Running command: /var/lib/homebridge/kasa-python/.venv/bin/python3 /homebridge/node_modules/homebridge-kasa-python/dist/python/pythonHome.py
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Command PID: 2633
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Command finished.
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Running command: python3 /homebridge/node_modules/homebridge-kasa-python/dist/python/pythonHome.py
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Command PID: 2634
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Command finished.
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Running command: /var/lib/homebridge/kasa-python/.venv/bin/pip3 --version
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Command PID: 2635
[11/13/2024, 2:15:23 PM] [KasaPython] [Python Check] Command finished.
[11/13/2024, 2:15:24 PM] [KasaPython] [Python Check] Running command: /var/lib/homebridge/kasa-python/.venv/bin/pip3 freeze
[11/13/2024, 2:15:24 PM] [KasaPython] [Python Check] Command PID: 2636
[11/13/2024, 2:15:24 PM] [KasaPython] [Python Check] Command finished.
[11/13/2024, 2:15:24 PM] [KasaPython] [Python Check] Running command: /var/lib/homebridge/kasa-python/.venv/bin/pip3 install -r /homebridge/node_modules/homebridge-kasa-python/requirements.txt
[11/13/2024, 2:15:24 PM] [KasaPython] [Python Check] Command PID: 2637
[11/13/2024, 2:15:25 PM] [KasaPython] [Python Check] Command finished.
[11/13/2024, 2:15:25 PM] [KasaPython] [Python Check] Finished python environment check.
[11/13/2024, 2:15:25 PM] [KasaPython] Running command: /var/lib/homebridge/kasa-python/.venv/bin/python3 /var/lib/homebridge/node_modules/homebridge-kasa-python/dist/python/kasaApi.py 42521
[11/13/2024, 2:15:25 PM] [KasaPython] Command PID: 2640
[11/13/2024, 2:15:25 PM] [KasaPython] Command started.
[11/13/2024, 2:15:25 PM] [KasaPython] Discovering devices...
[11/13/2024, 2:15:25 PM] [KasaPython] Sending discovery request with additionalBroadcasts: ["<IP_ADDRESS>"], and manualDevices: []
[11/13/2024, 2:15:35 PM] [KasaPython] Devices discovered: 1
[11/13/2024, 2:15:35 PM] [KasaPython] Adding: [Smart Plug 20A8] IOT.SMARTPLUGSWITCH [80068CA5E49793D1E684A461C4BA79B71FEF709A]
[11/13/2024, 2:15:35 PM] [KasaPython] [Smart Plug 20A8] Existing Accessory found [80068CA5E49793D1E684A461C4BA79B71FEF709A] [02fa4449-7986-49cc-9526-2fe675759917] category: OUTLET
[11/13/2024, 2:15:40 PM] [KasaPython] [Smart Plug 20A8] executing deferred getSysInfo count: 1

I'm moving towards putting everything on the same network. Appreciate your additions and these new features. Should help other users!

It looks like it did find it though, 20A8 is the plug that was on the separate network. Did it add the other devices back as well or just the new one? I understand, I appreciate your help with this. I don't employ a complex network myself so troubleshooting this with you has been extremely helpful. If while you have time to test a few more things, I'd like to see if I could get it fully working this way.

It was, but I moved homebridge to network-2, so everything is reversed. Homebridge is now on network-2 and I'm scanning network-1 (<IP_ADDRESS>.255). There are still items to discover on network-1 as I haven't moved them over yet. Sorry for confusion, here is my config.
{
    "name": "KasaPython",
    "enableCredentials": false,
    "powerStrip": false,
    "additionalBroadcasts": [
        "<IP_ADDRESS>"
    ],
    "platform": "KasaPython",
    "_bridge": {
        "username": "0E:8E:7A:DD:A5:97",
        "port": 43811
    }
}

What if you remove the broadcast and add the IP Addresses of those devices on network 1 to the list of manual devices? Discovery will not work with VLAN's because of UDP discovery not transversing the VLAN, you are correct.

I've updated to v2.5.2 with a lot of additional logging for the device discovery. If you can enable debug logging on the server and run it and post a copy of the log here after scrubbing any personal information, it should help narrow down some things. Thanks.

I've updated to v2.5.2 with a lot of additional logging for the device discovery. If you can enable debug logging on the server and run it and post a copy of the log here after scrubbing any personal information, it should help narrow down some things. Thanks.

I will look at it and do that today. Been busy with work.

no problem, just keeping the issue up to date. Thanks for your help, this will make things a lot more versatile for others as well with more complex set ups.

Check v2.5.4 and let me know. I made some changes to the device type handling.

Here are the logs attached using the added broadcast address. Remember, I moved my networks around and the broadcast address is <IP_ADDRESS>. The default is <IP_ADDRESS>.
{
    "name": "KasaPython",
    "enableCredentials": false,
    "powerStrip": false,
    "additionalBroadcasts": [
        "<IP_ADDRESS>"
    ],
    "_bridge": {
        "username": "0E:8E:7A:DD:A5:97",
        "port": 43811
    },
    "platform": "KasaPython"
}

homebridge-kasa-python.log.txt

Here are logs for address discovery. It looks like it finds the device, but can't be added. Device being added is <IP_ADDRESS>
{
    "name": "KasaPython",
    "enableCredentials": false,
    "powerStrip": false,
    "manualDevices": [
        "<IP_ADDRESS>"
    ],
    "_bridge": {
        "username": "0E:8E:7A:DD:A5:97",
        "port": 43811
    },
    "platform": "KasaPython"
}

NOTICE TO USERS AND PLUGIN DEVELOPERS

Homebridge 2.0 is on the way and brings some breaking changes to existing plugins.
Please visit the following link to learn more about the changes and how to prepare:
https://github.com/homebridge/homebridge/wiki/Updating-To-Homebridge-v2.0

[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Starting python environment check...
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Running command: python3 --version
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Command PID: 65516
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Command finished.
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Running command: /var/lib/homebridge/kasa-python/.venv/bin/python3 /homebridge/node_modules/homebridge-kasa-python/dist/python/pythonHome.py
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Command PID: 65517
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Command finished.
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Running command: python3 /homebridge/node_modules/homebridge-kasa-python/dist/python/pythonHome.py
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Command PID: 65518
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Command finished.
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Running command: /var/lib/homebridge/kasa-python/.venv/bin/pip3 --version
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Command PID: 65519
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Command finished.
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Running command: /var/lib/homebridge/kasa-python/.venv/bin/pip3 freeze
[11/15/2024, 9:29:04 AM] [KasaPython] [Python Check] Command PID: 65520
[11/15/2024, 9:29:05 AM] [KasaPython] [Python Check] Command finished.
[11/15/2024, 9:29:05 AM] [KasaPython] [Python Check] Running command: /var/lib/homebridge/kasa-python/.venv/bin/pip3 install -r /homebridge/node_modules/homebridge-kasa-python/requirements.txt
[11/15/2024, 9:29:05 AM] [KasaPython] [Python Check] Command PID: 65521
[11/15/2024, 9:29:05 AM] [KasaPython] [Python Check] Command finished.
[11/15/2024, 9:29:05 AM] [KasaPython] [Python Check] Finished python environment check.
[11/15/2024, 9:29:05 AM] [KasaPython] Logging server started on port 33077
[11/15/2024, 9:29:05 AM] [KasaPython] Running command: /var/lib/homebridge/kasa-python/.venv/bin/python3 /var/lib/homebridge/node_modules/homebridge-kasa-python/dist/python/kasaApi.py 33873
[11/15/2024, 9:29:05 AM] [KasaPython] Command PID: 65524
[11/15/2024, 9:29:05 AM] [KasaPython] Command started.
[11/15/2024, 9:29:06 AM] [KasaPython] 2024-11-15 09:29:06.455 | INFO     | main::192 - Starting server on port 33873
[11/15/2024, 9:29:11 AM] [KasaPython] Discovering devices...
[11/15/2024, 9:29:11 AM] [KasaPython] Sending discovery request with additionalBroadcasts: [], and manualDevices: ["<IP_ADDRESS>"]
[11/15/2024, 9:29:11 AM] [KasaPython] 2024-11-15 09:29:11.459 | DEBUG    | main:discover:167 - Starting device discovery with additionalBroadcasts: [] and manualDevices: ['<IP_ADDRESS>']
[11/15/2024, 9:29:11 AM] [KasaPython] 2024-11-15 09:29:11.462 | DEBUG    | main:discover_devices:54 - Starting device discovery
[11/15/2024, 9:29:11 AM] [KasaPython] 2024-11-15 09:29:11.464 | DEBUG    | main:discover_devices:60 - Discovering devices on broadcast: <IP_ADDRESS>
[11/15/2024, 9:29:16 AM] [KasaPython] 2024-11-15 09:29:16.542 | DEBUG    | main:discover_devices:64 - Discovered 2 devices on broadcast <IP_ADDRESS>
[11/15/2024, 9:29:16 AM] [KasaPython] 2024-11-15 09:29:16.545 | DEBUG    | main:discover_devices:71 - Discovering manual device: <IP_ADDRESS>
[11/15/2024, 9:29:16 AM] [KasaPython] 2024-11-15 09:29:16.555 | DEBUG    | main:discover_devices:75 - Discovered manual device: <IP_ADDRESS>
[11/15/2024, 9:29:16 AM] [KasaPython] 2024-11-15 09:29:16.558 | DEBUG    | main:update_device_info:105 - Updating device info for <IP_ADDRESS>
[11/15/2024, 9:29:16 AM] [KasaPython] 2024-11-15 09:29:16.560 | DEBUG    | main:update_device_info:105 - Updating device info for <IP_ADDRESS>
[11/15/2024, 9:29:16 AM] [KasaPython] 2024-11-15 09:29:16.597 | DEBUG    | main:custom_device_serializer:37 - Serializing device: <DeviceType.Plug at <IP_ADDRESS> - Entry Kasa (EP25(US))>
[11/15/2024, 9:29:16 AM] [KasaPython] 2024-11-15 09:29:16.600 | DEBUG    | main:update_device_info:114 - Updated device info for <IP_ADDRESS>
[11/15/2024, 9:29:16 AM] [KasaPython] 2024-11-15 09:29:16.613 | DEBUG    | main:custom_device_serializer:37 - Serializing device: <DeviceType.Strip at <IP_ADDRESS> - TP-LINK_Smart Plug_20A8 (EP40(US))>
[11/15/2024, 9:29:16 AM] [KasaPython] 2024-11-15 09:29:16.616 | DEBUG    | main:update_device_info:114 - Updated device info for <IP_ADDRESS>
[11/15/2024, 9:29:16 AM] [KasaPython] 2024-11-15 09:29:16.618 | DEBUG    | main:discover_devices:101 - Device discovery completed with 2 devices found
[11/15/2024, 9:29:16 AM] [KasaPython] 2024-11-15 09:29:16.620 | DEBUG    | main:discover:169 - Device discovery completed with 2 devices found
[11/15/2024, 9:29:16 AM] [KasaPython] Devices discovered: 2
[11/15/2024, 9:29:16 AM] [KasaPython] Adding: [Entry Kasa] IOT.SMARTPLUGSWITCH [80066260040F711445AEEA79F35EFE8521A74FE2]
[11/15/2024, 9:29:16 AM] [KasaPython] [Entry Kasa] Existing Accessory found [80066260040F711445AEEA79F35EFE8521A74FE2] [fe7c3c49-a82c-4d8f-97a2-9ecb28112009] category: OUTLET
[11/15/2024, 9:29:16 AM] [KasaPython] Adding: [Smart Plug 20A8] IOT.SMARTPLUGSWITCH [80068CA5E49793D1E684A461C4BA79B71FEF709A]
[11/15/2024, 9:29:16 AM] [KasaPython] [Smart Plug 20A8] Existing Accessory found [80068CA5E49793D1E684A461C4BA79B71FEF709A] [02fa4449-7986-49cc-9526-2fe675759917] category: OUTLET
[11/15/2024, 9:29:21 AM] [KasaPython] [Entry Kasa] executing deferred getSysInfo count: 1
[11/15/2024, 9:29:21 AM] [KasaPython] [Smart Plug 20A8] executing deferred getSysInfo count: 1
[11/15/2024, 9:29:21 AM] [KasaPython] 2024-11-15 09:29:21.730 | DEBUG    | main:get_sys_info_route:176 - Getting system info for device config: {'connection_type': {'device_family': 'IOT.SMARTPLUGSWITCH', 'encryption_type': 'XOR', 'https': False}, 'host': '<IP_ADDRESS>', 'timeout': 5, 'uses_http': False}
[11/15/2024, 9:29:21 AM] [KasaPython] 2024-11-15 09:29:21.734 | DEBUG    | main:get_device_info:121 - Getting device info for config: {'connection_type': {'device_family': 'IOT.SMARTPLUGSWITCH', 'encryption_type': 'XOR', 'https': False}, 'host': '<IP_ADDRESS>', 'timeout': 5, 'uses_http': False}
[11/15/2024, 9:29:21 AM] [KasaPython] 2024-11-15 09:29:21.810 | DEBUG    | main:custom_device_serializer:37 - Serializing device: <DeviceType.Plug at <IP_ADDRESS> - Entry Kasa (EP25(US))>
[11/15/2024, 9:29:21 AM] [KasaPython] 2024-11-15 09:29:21.814 | DEBUG    | main:get_sys_info_route:176 - Getting system info for device config: {'connection_type': {'device_family': 'IOT.SMARTPLUGSWITCH', 'encryption_type': 'XOR', 'https': False}, 'host': '<IP_ADDRESS>', 'timeout': 5, 'uses_http': False}
[11/15/2024, 9:29:21 AM] [KasaPython] 2024-11-15 09:29:21.817 | DEBUG    | main:get_device_info:121 - Getting device info for config: {'connection_type': {'device_family': 'IOT.SMARTPLUGSWITCH', 'encryption_type': 'XOR', 'https': False}, 'host': '<IP_ADDRESS>', 'timeout': 5, 'uses_http': False}
[11/15/2024, 9:29:21 AM] [KasaPython] 2024-11-15 09:29:21.990 | DEBUG    | main:custom_device_serializer:37 - Serializing device: <DeviceType.Strip at <IP_ADDRESS> - TP-LINK_Smart Plug_20A8 (EP40(US))>
[11/15/2024, 9:29:26 AM] [KasaPython] [Entry Kasa] executing deferred getSysInfo count: 1
[11/15/2024, 9:29:26 AM] [KasaPython] [Smart Plug 20A8] executing deferred getSysInfo count: 1
[11/15/2024, 9:29:26 AM] [KasaPython] 2024-11-15 09:29:26.732 | DEBUG    | main:get_sys_info_route:176 - Getting system info for device config: {'connection_type': {'device_family': 'IOT.SMARTPLUGSWITCH', 'encryption_type': 'XOR', 'https': False}, 'host': '<IP_ADDRESS>', 'timeout': 5, 'uses_http': False}
[11/15/2024, 9:29:26 AM] [KasaPython] 2024-11-15 09:29:26.734 | DEBUG    | main:get_device_info:121 - Getting device info for config: {'connection_type': {'device_family': 'IOT.SMARTPLUGSWITCH', 'encryption_type': 'XOR', 'https': False}, 'host': '<IP_ADDRESS>', 'timeout': 5, 'uses_http': False}
[11/15/2024, 9:29:26 AM] [KasaPython] 2024-11-15 09:29:26.814 | DEBUG    | main:custom_device_serializer:37 - Serializing device: <DeviceType.Plug at <IP_ADDRESS> - Entry Kasa (EP25(US))>
[11/15/2024, 9:29:26 AM] [KasaPython] 2024-11-15 09:29:26.818 | DEBUG    | main:get_sys_info_route:176 - Getting system info for device config: {'connection_type': {'device_family': 'IOT.SMARTPLUGSWITCH', 'encryption_type': 'XOR', 'https': False}, 'host': '<IP_ADDRESS>', 'timeout': 5, 'uses_http': False}
[11/15/2024, 9:29:26 AM] [KasaPython] 2024-11-15 09:29:26.821 | DEBUG    | main:get_device_info:121 - Getting device info for config: {'connection_type': {'device_family': 'IOT.SMARTPLUGSWITCH', 'encryption_type': 'XOR', 'https': False}, 'host': '<IP_ADDRESS>', 'timeout': 5, 'uses_http': False}
[11/15/2024, 9:29:26 AM] [KasaPython] 2024-11-15 09:29:26.997 | DEBUG    | main:custom_device_serializer:37 - Serializing device: <DeviceType.Strip at <IP_ADDRESS> - TP-LINK_Smart Plug_20A8 (EP40(US))>
[11/15/2024, 9:29:31 AM] [KasaPython] [Entry Kasa] executing deferred getSysInfo count: 1

Ok, so it does not find the devices using the additional broadcast, but we figured that with the VLAN's. It finds 2 devices on the default broadcast and the 1 manual device but only adds one of the devices from the default broadcast and the manual device. I believe you had three devices on the network originally that were being discovered, what is the makeup of devices between the two networks now? can you run a manual discovery for each device:
/var/lib/homebridge/
cd kasa-python
source .venv/bin/activate
kasa --version
kasa --target (Each Device IP) discover
Trying to find out the differences in the device information and why it's discovering it, but not adding it. Will add some more logging as well.

v2.5.5 with some additional logging for device type filtering

v2.5.6 with additional fixes for the different classifications for device types

@smithmarcw Any luck with 2.5.6?

So some good news and bad..
The good news is I can discover and control devices using manual devices here is the log
homebridge-kasa-python.log(4).txt
The bad news is, additional broadcast addresses still doesn't work.
homebridge-kasa-python (2).log
Nice work!

And the additional broadcast for you is across VLAN's is that correct? If so, then manual entry will be the only way to handle that device unless the firewall configuration can be updated to allow udp and mdns traffic across the vlans. I don't implement something like this myself so it would be difficult to test successfully and would be a local configuration outside of the scope of the plugin itself. I'm glad that we were able to get the manual discovery working and that functionality is working now. If you're satisfied with the state of things, I will close this issue on my end. I will keep updating the plugin for additional device support and thank you for your help in troubleshooting the issues.

Yes, it's across VLANs. Thanks so much for your work.

No problem, if you need anything else, open another issue and we can work through it.

@smithmarcw let me know if the latest versions of the plugin still work for your manual devices, please and thank you!

I’ve been busy with holidays and work travel. I will do this when I get back from work.
From: ZeliardM @.>
Date: Wednesday, November 27, 2024 at 5:27 AM
To: ZeliardM/homebridge-kasa-python @.>
Cc: Smith, Marc @.>, Mention @.>
Subject: Re: [ZeliardM/homebridge-kasa-python] Support for two networks? They are pingable and reachable (Issue #3)
[Warning] This email comes from an external source. Be careful of any embedded links and attachments.
Reopened #3https://urldefense.com/v3/__https:/github.com/ZeliardM/homebridge-kasa-python/issues/3__;!!FxRPhOnl!_7cy81typZNO_pro32Uu8s3pB7vlMMlouT8lNYafquEAqdrDMkuV4OYBpBJcPo6_S8kbqi20ZUzFY5SVk5UiGiI2Ig$.
—
Reply to this email directly, view it on GitHubhttps://urldefense.com/v3/__https:/github.com/ZeliardM/homebridge-kasa-python/issues/3*event-15452704545__;Iw!!FxRPhOnl!_7cy81typZNO_pro32Uu8s3pB7vlMMlouT8lNYafquEAqdrDMkuV4OYBpBJcPo6_S8kbqi20ZUzFY5SVk5VEJLDzxw$, or unsubscribehttps://urldefense.com/v3/__https:/github.com/notifications/unsubscribe-auth/AD4CPPZPXXFGEQLPZJQX4CD2CXCBXAVCNFSM6AAAAABRQ74LJKVHI2DSMVQWIX3LMV45UABCJFZXG5LFIV3GK3TUJZXXI2LGNFRWC5DJN5XDWMJVGQ2TENZQGQ2TINI__;!!FxRPhOnl!_7cy81typZNO_pro32Uu8s3pB7vlMMlouT8lNYafquEAqdrDMkuV4OYBpBJcPo6_S8kbqi20ZUzFY5SVk5Xy7pfCAg$.
You are receiving this because you were mentioned.Message ID: @.***>

I was able to test the latest version. Manual devices were still found and working.

Excellent! Thanks!


High Peak GPU Memory with ZeRO Stage 3

Describe the bug
While comparing ZeRO Stage 2 and ZeRO Stage 3, I found that the peak GPU memory utilization (as measured by the deepspeed.runtime.utils.memory_status function) is higher when using ZeRO Stage 3, which does not align with what is described in the ZeRO: Memory Optimizations Toward Training Trillion Parameter Models.
I noticed this behavior at first while testing with small models on small hardware (e.g. 560M parameter model on 4x16GB T4 GPUs), and then observed it again after scaling up the model size and environment (13B parameter model on 8x80GB A100 GPUs).
Would like to understand where this memory overhead is coming from with ZeRO Stage 3, and figure out if this is a bug /
if something missing in my config / if my test scenario or environment is not appropriate for ZeRO Stage 3.
Example Memory Stats Captured w/ ZeRO Stage 2
RANK=2 MEMSTATS Memory stats after training step device=cuda:2 current alloc=45.4646GB (delta=0.0000GB max=52.3739GB) current cache=57.1406GB (delta=0.0000GB max=57.1406GB)

Example Memory Stats Captured w/ ZeRO Stage 3
RANK=1 MEMSTATS Memory stats after training step device=cuda:1 current alloc=25.3114GB (delta=0.0000GB max=56.1189GB) current cache=69.2051GB (delta=0.0000GB max=69.2051GB)

To Reproduce
Here is a minimal training script to reproduce the behavior:
import deepspeed
import os
import torch
from deepspeed.runtime.utils import memory_status
from torch.utils.data import DataLoader
from torch.utils.data.distributed import DistributedSampler
from transformers import AutoModelForCausalLM, AutoTokenizer, DataCollatorForLanguageModeling
from util import load_wikitext

def main():

    rank = int(os.getenv("LOCAL_RANK", "0"))
    world_size = int(os.getenv("WORLD_SIZE", "1"))

    model_name = "facebook/opt-13b"

    model = AutoModelForCausalLM.from_pretrained(model_name)

    deepspeed_config = {
        "train_micro_batch_size_per_gpu": 1,
        "optimizer": {
            "type": "Adam",
            "params": { "lr": 5e-5 }
        },
        "fp16": { "enabled": True },
        "zero_optimization": { "stage": 3 }
    }

    model_engine, _, _, _ = deepspeed.initialize(
        model=model,
        model_parameters=model.parameters(),
        config=deepspeed_config
    )
    model_engine.train()

    tokenizer = AutoTokenizer.from_pretrained(model_name)
    collator = DataCollatorForLanguageModeling(tokenizer, mlm=False)

    train_dataset = load_wikitext(tokenizer, collator, max_length=512).select(range(128))
    train_dataloader = DataLoader(
        train_dataset,
        batch_size=1,
        shuffle=False,
        sampler=DistributedSampler(train_dataset, num_replicas=world_size)
    )

    device = torch.device("cuda", rank)
    for batch in train_dataloader:
        input_ids = batch['input_ids'].to(device)
        labels = batch['labels'].to(device)
        outputs = model_engine(input_ids, labels=labels)

        model_engine.backward(outputs.loss)
        model_engine.step()

        memory_status("Memory stats after training step")

    return

if __name__ == "__main__":
    main()

Expected behavior
The ZeRO Paper describes the memory consumed by Stages 1, 2, and 3 using the equations below

Based on these equations, I expected that the peak GPU memory consumption would be significantly lower when using ZeRO Stage 3 as compared to ZeRO Stage 2.
ds_report output
[2023-06-11 22:03:53,488] [INFO] [real_accelerator.py:110:get_accelerator] Setting ds_accelerator to cuda (auto detect)
--------------------------------------------------
DeepSpeed C++/CUDA extension op report
--------------------------------------------------
NOTE: Ops not installed will be just-in-time (JIT) compiled at
      runtime if needed. Op compatibility means that your system
      meet the required dependencies to JIT install the op.
--------------------------------------------------
JIT compiled ops requires ninja
ninja .................. [OKAY]
--------------------------------------------------
op name ................ installed .. compatible
--------------------------------------------------
 [WARNING]  async_io requires the dev libaio .so object and headers but these were not found.
 [WARNING]  async_io: please install the libaio-dev package with apt
 [WARNING]  If libaio is already installed (perhaps from source), try setting the CFLAGS and LDFLAGS environment variables to where it can be found.
async_io ............... [NO] ....... [NO]
cpu_adagrad ............ [NO] ....... [OKAY]
cpu_adam ............... [NO] ....... [OKAY]
fused_adam ............. [YES] ...... [OKAY]
fused_lamb ............. [NO] ....... [OKAY]
quantizer .............. [NO] ....... [OKAY]
random_ltd ............. [NO] ....... [OKAY]
 [WARNING]  please install triton==1.0.0 if you want to use sparse attention
sparse_attn ............ [NO] ....... [NO]
spatial_inference ...... [NO] ....... [OKAY]
transformer ............ [NO] ....... [OKAY]
stochastic_transformer . [NO] ....... [OKAY]
transformer_inference .. [NO] ....... [OKAY]
utils .................. [NO] ....... [OKAY]
--------------------------------------------------
DeepSpeed general environment info:
torch install path ............... ['/usr/lib/python3/dist-packages/torch']
torch version .................... 1.13.1
deepspeed install path ........... ['/home/ubuntu/.local/lib/python3.8/site-packages/deepspeed']
deepspeed info ................... 0.9.4, unknown, unknown
torch cuda version ............... 11.8
torch hip version ................ None
nvcc version ..................... 11.8
deepspeed wheel compiled w. ...... torch 1.13, cuda 11.8

System info (please complete the following information):

OS: Ubuntu 20.04
GPU count and types: 8x80GB A100
Interconnects (if applicable): N/A
Python version: 3.8.10

Launcher context
Are you launching your experiment with the deepspeed launcher, MPI, or something else? I am using the deepspeed launcher.
Docker context
Are you using a specific docker image that you can share? N/A
Additional context
Add any other context about the problem here.

@gnovack Thanks for the script. Can you include the load_wikitext for repro?

@jschweiz Yours appears to be a separate issue. Take a look at this response and see if it helps. If not feel free to open an issue with code to reproduce and assign me.

@gnovack I have investigated the issue, here are few points to consider:

If you follow the instructions in my previous comment it will show the proper way to use HfDeepSpeedConfig for ZeRO stage 3. By doing this I was able to get the MaxMem of Stage 3 equal to that of Stage 2.
For further optimizations to reduce mem usage you can adjust the intermediate communication buffers used in, such as the prefetch buffer size. Those can be found here
The best place to measure the difference between Stage 2 and 3 memory usage is after DeepSpeed initialization. Once in the training loop a lot of the transient allocated memory is up to the Pytorch memory allocator.


display deblur version used with study

It would be useful to display the version so that users are able to report with their results.

Fixed in dev


Update OVS to 2.17.3

There are a few important bug fixes around conntrack which became available in OVS 2.17.2 so it would be good to update the image for that.
Signed-off-by: Mohammed Naser<EMAIL_ADDRESS>

/test-all

is there some explain  abount ovs conntrack fix  ?

is there some explain abount ovs conntrack fix ?

Not sure if it's related to OVS conntrack fix, but @GraysonWu indeed met an issue with OVS 2.17.3 when he worked on https://github.com/antrea-io/antrea/pull/4612.
@gaopeiliang Do you have anything we should know?
@GraysonWu Do you know if 2.17.1 or 2.17.2 has that issue?

Ah, it seems I misread the comment. I thought @gaopeiliang was asking whether we met issue with the ovs conntrack fix.

en,  we have an firewall module use ct flow action (ovs conntrack,  ovs 2.14),   sometimes   "handler_duplicate_upcall"  "upcall_ukey_replace"  rate very high ...   and vswitchd use more CPU,   kernel datapath maybe miss always ...

it maybe IP flow related
clean  and reinstall  ct flow  can recover it

so  I  want to know the case about "conntrack fix",  and how 2.17.3 abount stable ,,,
the commit log said less about fix case ...

is there some explain abount ovs conntrack fix ?

Not sure if it's related to OVS conntrack fix, but @GraysonWu indeed met an issue with OVS 2.17.3 when he worked on #4612. @gaopeiliang Do you have anything we should know? @GraysonWu Do you know if 2.17.1 or 2.17.2 has that issue?

Haven't tested 2.17.1 or 2.17.2. Post the issue I met here: https://github.com/openvswitch/ovs-issues/issues/272


Deploy Checklist: New Expensify 2023-07-25

Release Version: 1.3.45-1
Compare Changes: https://github.com/Expensify/App/compare/production...staging
This release contains changes from the following pull requests:

[x] https://github.com/Expensify/App/pull/17996
[x] https://github.com/Expensify/App/pull/19516
[x] https://github.com/Expensify/App/pull/20864
[x] https://github.com/Expensify/App/pull/21243
[x] https://github.com/Expensify/App/pull/21549
[x] https://github.com/Expensify/App/pull/22216
[x] https://github.com/Expensify/App/pull/22270
[x] https://github.com/Expensify/App/pull/22276
[x] https://github.com/Expensify/App/pull/22430
[ ] https://github.com/Expensify/App/pull/22461
[x] https://github.com/Expensify/App/pull/22619
[x] https://github.com/Expensify/App/pull/22645
[x] https://github.com/Expensify/App/pull/22727
[x] https://github.com/Expensify/App/pull/22728
[x] https://github.com/Expensify/App/pull/22805
[x] https://github.com/Expensify/App/pull/22809
[x] https://github.com/Expensify/App/pull/22841
[x] https://github.com/Expensify/App/pull/22851
[x] https://github.com/Expensify/App/pull/22864
[x] https://github.com/Expensify/App/pull/22886
[x] https://github.com/Expensify/App/pull/22891
[x] https://github.com/Expensify/App/pull/22904
[x] https://github.com/Expensify/App/pull/22927
[ ] https://github.com/Expensify/App/pull/22982
[x] https://github.com/Expensify/App/pull/22984
[x] https://github.com/Expensify/App/pull/22985
[x] https://github.com/Expensify/App/pull/22991
[x] https://github.com/Expensify/App/pull/23007
[x] https://github.com/Expensify/App/pull/23041
[x] https://github.com/Expensify/App/pull/23047
[x] https://github.com/Expensify/App/pull/23054
[x] https://github.com/Expensify/App/pull/23056
[x] https://github.com/Expensify/App/pull/23071
[x] https://github.com/Expensify/App/pull/23079
[x] https://github.com/Expensify/App/pull/23099
[x] https://github.com/Expensify/App/pull/23101
[x] https://github.com/Expensify/App/pull/23112
[x] https://github.com/Expensify/App/pull/23117
[x] https://github.com/Expensify/App/pull/23127
[x] https://github.com/Expensify/App/pull/23135
[x] https://github.com/Expensify/App/pull/23141
[x] https://github.com/Expensify/App/pull/23150
[x] https://github.com/Expensify/App/pull/23156
[x] https://github.com/Expensify/App/pull/23159
[x] https://github.com/Expensify/App/pull/23162
[x] https://github.com/Expensify/App/pull/23176
[x] https://github.com/Expensify/App/pull/23181
[x] https://github.com/Expensify/App/pull/23185
[x] https://github.com/Expensify/App/pull/23192
[x] https://github.com/Expensify/App/pull/23205
[x] https://github.com/Expensify/App/pull/23206
[x] https://github.com/Expensify/App/pull/23211
[x] https://github.com/Expensify/App/pull/23214
[x] https://github.com/Expensify/App/pull/23215
[x] https://github.com/Expensify/App/pull/23222
[x] https://github.com/Expensify/App/pull/23240
[x] https://github.com/Expensify/App/pull/23241
[x] https://github.com/Expensify/App/pull/23243
[x] https://github.com/Expensify/App/pull/23244
[x] https://github.com/Expensify/App/pull/23246
[x] https://github.com/Expensify/App/pull/23247
[x] https://github.com/Expensify/App/pull/23248
[x] https://github.com/Expensify/App/pull/23249
[x] https://github.com/Expensify/App/pull/23255
[x] https://github.com/Expensify/App/pull/23256
[x] https://github.com/Expensify/App/pull/23259
[x] https://github.com/Expensify/App/pull/23263
[x] https://github.com/Expensify/App/pull/23276
[x] https://github.com/Expensify/App/pull/23277
[x] https://github.com/Expensify/App/pull/23286
[x] https://github.com/Expensify/App/pull/23295
[x] https://github.com/Expensify/App/pull/23299
[x] https://github.com/Expensify/App/pull/23310
[x] https://github.com/Expensify/App/pull/23337
[x] https://github.com/Expensify/App/pull/23338
[x] https://github.com/Expensify/App/pull/23358
[x] https://github.com/Expensify/App/pull/23363
[x] https://github.com/Expensify/App/pull/23366
[x] https://github.com/Expensify/App/pull/23391
[x] https://github.com/Expensify/App/pull/23418
[x] https://github.com/Expensify/App/pull/23461
[x] https://github.com/Expensify/App/pull/23487
[x] https://github.com/Expensify/App/pull/23514

Internal QA:

[x] https://github.com/Expensify/App/pull/23110 - @mountiny

Deploy Blockers:

[x] https://github.com/Expensify/App/issues/23189

[x] https://github.com/Expensify/App/issues/23250

[x] https://github.com/Expensify/App/issues/23401

[x] https://github.com/Expensify/App/issues/23416

[x] https://github.com/Expensify/App/issues/23536

[x] https://github.com/Expensify/App/issues/23537

[x] https://github.com/Expensify/App/issues/23539

[x] https://github.com/Expensify/App/issues/23540

[x] https://github.com/Expensify/App/issues/23542

[x] https://github.com/Expensify/App/issues/23544

[x] https://github.com/Expensify/App/issues/23504

[x] https://github.com/Expensify/App/issues/23584

[x] https://github.com/Expensify/App/issues/23583

[x] https://github.com/Expensify/App/issues/23576

Deployer verifications:

[ ] I checked the App Timing Dashboard and verified this release does not cause a noticeable performance regression.
[ ] I checked Firebase Crashlytics and verified that this release does not introduce any new crashes. More detailed instructions on this verification can be found here.
[ ] I checked GitHub Status and verified there is no reported incident with Actions.

cc @Expensify/applauseleads

Checking these 2 off:

https://github.com/Expensify/App/issues/23537
https://github.com/Expensify/App/issues/23539

They are resolved by a CP to staging

The following issues might be deploy blockers. I reported them when they were only reproducible on dev. now they are reproducible on staging too.

Dev: Web - User is signed-out when adding 2FA
Dev: Web - User is unable to authenticate with magic link

Checking off #23416 because the fix for that went out yesterday - we just did not remove the DeployBlockerCash label so it returned on this checklist.

Checking off https://github.com/Expensify/App/issues/23542 & https://github.com/Expensify/App/issues/23536 as per this comment

Checking off https://github.com/Expensify/App/issues/23540 as per this comment

Checked off https://github.com/Expensify/App/issues/23544

https://github.com/Expensify/App/pull/22619 is failing https://github.com/Expensify/App/issues/23566 repro in PROD checking off
https://github.com/Expensify/App/pull/22886 is failing https://github.com/Expensify/App/issues/23565 repro in PROD
https://github.com/Expensify/App/pull/23159 is failing https://github.com/Expensify/App/issues/23583
https://github.com/Expensify/App/pull/23248 the issue observed https://github.com/Expensify/App/issues/23584. pls double check if related
https://github.com/Expensify/App/pull/23418 is failing https://github.com/Expensify/App/issues/23548 repro in prod checking off

Checking off https://github.com/Expensify/App/issues/23504 as we CP'd a fix

Checking off #23584 as it is a web deploy blocker and not a blocker for App

Checking off https://github.com/Expensify/App/pull/20864 since we reverted the PR

Checking off https://github.com/Expensify/App/issues/23583 as per https://github.com/Expensify/App/issues/23583#issuecomment-1650686515

https://github.com/Expensify/App/pull/23248 the issue observed https://github.com/Expensify/App/issues/23584. pls double check if related

Not related

Were either of these PRs blocked by anything @mvtglobally ?
https://github.com/Expensify/App/pull/22461
https://github.com/Expensify/App/pull/22982
Or just not yet tested?

@marcaaron
We are down to just 15% TestRail regression left
Was double checking with the team.
We are blocked for https://github.com/Expensify/App/pull/22461 due to https://github.com/Expensify/App/issues/12913
#22982 we have an issue, but it's repro in prod, so not a blocker. Will post in a few

@mountiny @marcaaron regression is completed
#22982 is failing with https://github.com/Expensify/App/issues/23598 repro in prod

Thank you! Checking off the last one https://github.com/Expensify/App/pull/22461#issuecomment-1651848507 as I have qaed it and it works

API timings are good and no crashes which would stand out and would be unique for this version as far as I can tell
There are github incidents with PRs for some users

:shipit:

:shipit:


I2C master changes clock after slave "NACK" (IDFGH-10531)

Answers checklist.

[X] I have read the documentation ESP-IDF Programming Guide and the issue is not addressed there.
[X] I have updated my IDF branch (master or release) to the latest version and checked that the issue is present there.
[X] I have searched the issue tracker for a similar issue and not found a similar issue.

IDF version.
ESP-IDF v5.0.2
Operating System used.
Windows
How did you build your project?
Eclipse IDE
If you are using Windows, please specify command line type.
CMD
Development Kit.
ESP32-C3
Power Supply used.
External 3.3V
What is the expected behavior?
I setup an I2C master which communicates with two slaves. One of the two slaves is sometimes disconnected hence the response is a "NACK".
The clock speed of the I2C peripheral should never change without reconfiguration.
I2C_CLOCK: 20000Hz
SCL_GPIO: GPIO_NUM_18
SDA_GPIO: GPIO_NUM_19
What is the actual behavior?
The I2C clock changes to 40000Hz on itself after 8 nacks. The I2C peripheral is initialized once and regular write/read operations are executed.
The data received is always correct and I2C is fully functional, but the clock change is inexplicable.
The image shows the clock changing during runtime captured with a logic analyzer.

Steps to reproduce.

Step: Setup an I2C master addressing two slaves. Slave 1 has to response, slave 2 has to nack the requests.
Step: Monitor the clock speed.
Step: After around 8 nacks from slave 2, the clock speed is changed and never recovers.

Debug Logs.
No response
More Information.
No response

Update:
The issue appears after 10 "nack" responses from slave. This triggers the function "i2c_hw_fsm_reset".
Apperantly, the clock is not set properly in this function. Each time the function i2c_hw_fsm_reset is called, the i2c clock is changed to a value higher then initially set.
Workaround:
Save the initial i2c config locally in "i2c.h".
esp_err_t i2c_param_config(i2c_port_t i2c_num, const i2c_config_t *i2c_conf) {     i2c_clock_source_t src_clk = I2C_CLK_SRC_DEFAULT;     esp_err_t ret = ESP_OK;     i2c_masterConfig = *i2c_conf;
In i2c_hw_fsm_reset, add following lines:
 i2c_clock_source_t src_clk = s_get_clk_src(i2c_masterConfig.clk_flags, i2c_masterConfig.master.clk_speed);   i2c_hal_set_bus_timing(&(i2c_context[i2c_num].hal), i2c_masterConfig.master.clk_speed, src_clk, s_get_src_clk_freq(src_clk));
Like this, the clock is not changed when i2c_hw_fsm_reset is called, but it is not a proper fix.

@o-marshmallow
Any comment about https://github.com/espressif/esp-idf/issues/11776#issuecomment-1617620249 ?

Hi, I have a very similar issue.  After several times trying to access to a non-existent peripheral, one of my other (existing) devices begins issuing ACK errors.  I can recover the communication by executing this function:
void i2c_recover(void)
{
    i2c_param_config(i2c_master_port, &i2c_conf);
}

I've been doing a more specific recovery by reducing the contents of the i2c_param_config() to just re-config the clock source, and it worked.
This is the function added to ESP-IDF's i2c.c:
esp_err_t i2c_clk_source_config(i2c_port_t i2c_num, const i2c_config_t *i2c_conf)
{
    i2c_clock_source_t src_clk = I2C_CLK_SRC_DEFAULT;
    esp_err_t ret = ESP_OK;

    ESP_RETURN_ON_FALSE(i2c_conf != NULL, ESP_ERR_INVALID_ARG, I2C_TAG, I2C_ADDR_ERROR_STR);
    ESP_RETURN_ON_FALSE(i2c_conf->mode < I2C_MODE_MAX, ESP_ERR_INVALID_ARG, I2C_TAG, I2C_MODE_ERR_STR);

    if (i2c_conf->mode == I2C_MODE_MASTER) {
        src_clk = s_get_clk_src(i2c_conf->clk_flags, i2c_conf->master.clk_speed);
    }

    ESP_RETURN_ON_FALSE(src_clk != I2C_CLOCK_INVALID, ESP_ERR_INVALID_ARG, I2C_TAG, I2C_CLK_FLAG_ERR_STR);
    i2c_hal_set_bus_timing(&(i2c_context[i2c_num].hal), i2c_conf->master.clk_speed, src_clk, s_get_src_clk_freq(src_clk));

    return ESP_OK;
}

And this is the new recovery function:
void i2c_recover(void)
{
    i2c_clk_source_config(i2c_master_port, &i2c_conf);
}

I am using the ESP32C3, and the relevant peripherals are:

The absent peripheral is the LM73.
The present peripheral whose communication is lost, is the PCF8576.

If I don't try to access the LM73, the communication with the PCF8576 is not lost.
If I try to access the LM73 several times, then the comm with the PCF8576 is lost, error is ACK is not received.
If then I execute i2c_recover(), the communication with the PCF8576 is recovered.
This situation is repeating every 15 seconds approx, I am asking the LM73 approx 1 time every 1.2 seconds.
I've tried several ESP-IDF versions:

With 4.4.1 I did not see the issue.
With 4.4.5 the issue appeared.
With 5.1.1 the issue is still present.

I've tested two chips:

With ESP32C3, the issue exists (within the ESP-IDF versions shown above).
With ESP32C6 I have not seen the issue.

It looks like some change done in the HAL of the ESP32C3 in 4.4.2 ... 4.4.5 created the issue, or activated it.  Maybe changes done in the I2C common part could be activated it too.
Hope this information helps.

Update: The issue appears after 10 "nack" responses from slave. This triggers the function "i2c_hw_fsm_reset".

Now I observed this symptom on esp32c6 with v5.1.1-588-gc1c843f5e2.

@o-marshmallow Any update regarding this issue?


Update HtmlView to HtmlString instead of String

I'm not happy with ModuleHtmlView but didn't see an easy way to have access to a fully populated ViewContext where I need it

The premium build succeeded, which means that nobody else in the set of modules is calling HtmlView with null as the HTML, which is good for a number of reasons.
Just pushed a little more cleanup and converted a couple of places to DOM building.


No obvious way to access delegate once started

Once a delegate is spawned, I cannot see an obvious way to get information about the delegate. For example, I have a simple Pomodoro chat bot which starts a timer for 20 seconds, and I want to query how much time is left. But since the delegate is not the original class, self._current_pomodoro_handler is not the correct one (in fact, it's the initial value of None).
Is there a way to do this? If so, documentation would be good. If not, why not? (e.g. shouldn't be using DelegatorBot?) or could this be implemented?
class PomodoroHandler(telepot.helper.ChatHandler):
    def __init__(self, seed_tuple, timeout):
        super(PomodoroHandler, self).__init__(seed_tuple, timeout)
        self._bot._current_pomodoro_handler = None

    @asyncio.coroutine
    def on_message(self, msg):
        if "/pomodorostart" in msg["text"]:
            yield from self.pomodoro_begin(msg)
        if "/timeleft" in msg["text"]:
            yield from self.pomodoro_time_left(msg)

    @asyncio.coroutine
    def pomodoro_time_left(self, msg):
        # PROBLEM HERE (self._current_pomodoro_handler still at initial value)
        yield from self.sender.sendMessage(str(self._current_pomodoro_handler._when))

    @asyncio.coroutine
    def pomodoro_end(self, msg):
        yield from self.sender.sendMessage("POMODORO END!")

    @asyncio.coroutine
    def pomodoro_begin(self, msg):
        h = asyncio.get_event_loop().call_later(
            20,
            lambda: asyncio.async(self.pomodoro_end(msg)))
        self._current_pomodoro_handler = h

        yield from self.sender.sendMessage("POMODORO BEGIN!")

if __name__ == "__main__":
    bot = telepot.async.DelegatorBot(
        TELEGRAM_ID,
        [
            (per_chat_id(), create_open(
                PomodoroHandler, timeout=72*3600)),
        ])

    loop = asyncio.get_event_loop()
    loop.create_task(bot.messageLoop())
    loop.run_forever()

You don't need to remember the handle. Instead, you should remember the end time. The following class should work fine.
class PomodoroHandler(telepot.helper.ChatHandler):
    def __init___(self, seed_tuple, timeout):
        super(PomodoroHandler, self).__init__(seed_tuple, timeout)
        self._endtime = None

    @asyncio.coroutine
    def on_message(self, msg):
        if "/pomodorostart" in msg["text"]:
            yield from self.pomodoro_begin(msg)
        if "/timeleft" in msg["text"]:
            yield from self.pomodoro_time_left(msg)

    @asyncio.coroutine
    def pomodoro_time_left(self, msg):
        yield from self.sender.sendMessage('%.2f' % (self._endtime - time.time()))

    @asyncio.coroutine
    def pomodoro_end(self, msg):
        yield from self.sender.sendMessage("POMODORO END!")

    @asyncio.coroutine
    def pomodoro_begin(self, msg):
        h = asyncio.get_event_loop().call_later(
            20,
            lambda: asyncio.async(self.pomodoro_end(msg)))
        self._endtime = time.time() + 20

        yield from self.sender.sendMessage("POMODORO BEGIN!")

My apologies, the bug was due to the following line in my code (not in the code above) self.listener.clear_captures(), causing the error ERROR:root:on_close() called due to RuntimeError: Listener has no capture criteria, will wait forever.
I'll close now, since this is not a bug (passing the handle works fine without the listener.clear_captures() line).


Update CBOR library dependency

See discussion at https://github.com/Nitrokey/pynitrokey/commit/bc45e74d377f28853ff05cfe926e5ac9b7b36267.
cbor library is not maintained anymore, and the repository is not reachable. cbor2 looks like a valid candidate.

Just found this, which suggests that this is the original repository, moved to Github:

https://github.com/brianolson/cbor_py


fix: Update swagger to match latest changes in go-mod-core-contracts Device DTO

Per https://github.com/edgexfoundry/go-mod-core-contracts/pull/800, the Device DTO is added with a new field properties, so the swagger file of core-metadata needs to be updated correspondingly. This commit also updates the swagger with newly created field tags of the Device DTO.

If your build fails  due to your commit message not passing the build checks, please review the guidelines here: https://github.com/edgexfoundry/edgex-go/blob/main/.github/Contributing.md
PR Checklist
Please check if your PR fulfills the following requirements:

[x] I am not introducing a breaking change (if you are, flag in conventional commit message with BREAKING CHANGE: describing the break)
[ ] I am not introducing a new dependency (add notes below if you are)
[x] I have added unit tests for the new feature or bug fix (if not, why?)
[x] I have fully tested (add details below) this the new feature or bug fix (if not, why?)
[ ] I have opened a PR for the related docs change (if not, why?)

Testing Instructions

New Dependency Instructions (If applicable)

Codecov Report

Merging #4372 (b27614f) into main (69b2f2f) will not change coverage.
The diff coverage is n/a.

:mega: This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more
@@           Coverage Diff           @@
##             main    #4372   +/-   ##
=======================================
  Coverage   43.71%   43.71%
=======================================
  Files         116      116
  Lines       10713    10713
=======================================
  Hits         4683     4683
  Misses       5610     5610
  Partials      420      420

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

As https://github.com/edgexfoundry/edgex-go/pull/4375 had included the changes of this PR and is merged, close this PR.


dnlib dependancy in capa/features/address.py

Context
First of all, I'm a big fan of Capa, thank your for this great tool! I have been successfully integrating Capa into Malcat (you can test the capa integration in the free version if you're curious) for some time now. I use my own main script to list matching rules and my own extractor (using Malcat's python bindings). So basically I just keep the engine and the rules and discard evtg else. Integration was pretty easy and clean until now because the engine/features are very well detached from the extractors (great job guys !).
Problem
In capa 4.0, the separation between extractor and features has a tiny flaw: there is a dnlib dependancy in capa/features/address.py:
[capa/features/address.py](https://github.com/mandiant/capa/compare/v3.2.0...master#diff-0727ca1e119ebd353a0204473ea5b404b0e0d60d58d777d6d81af2ad75af8732)
@@ -0,0 +1,117 @@
import abc

from dncil.clr.token import Token    # <-- there

And this is used in these two classes:
class DNTokenAddress(Address):
    """a .NET token"""

    def __init__(self, token: Token):
        self.token = token
    # ...

class DNTokenOffsetAddress(Address):
    """an offset into an object specified by a .NET token"""

    def __init__(self, token: Token, offset: int):
        assert offset >= 0
        self.token = token
        self.offset = offset
    # ...

The use of dnlib is specific to the current dnlib-based extractor, another extractor could use another library. In fact, I have my own dotnet parser and my extractor doesn't need dnlib at all. And that's unfortunate since only the token.value seems to be used there, so why not store directly the token value as int?  In fact, I made the change in the v4.0 branch and it seems to have no impact at all.
Of course I could create a parallel branch with the dncil.clr.token.Token->int change and always rebase when integrating capa (that's what I'm doing right now), but I find it unfortunate that the clean features/extractors separation is gone because of this small detail.
If you want, I could submit a PR where int is used there instead of dncil.clr.token.Token.

Thanks a lot for the feedback and the issue details! It's always exciting to see how other projects leverage our tools.
Your points make a lot of sense and we really strive to keep the components independent. The Token contains some additional properties, but I'm sure we can figure out a good solution. Let's wait for @mike-hunhoff's comment and then we're happy to accept a PR :)

Thank you again for the feedback and details! The referenced line imports the Token class from dncil, a Python library (with no dependencies) that we developed to disassemble CIL instructions. capa's .NET feature extractor does not have a dnlib dependency as we are able to emit features using only Python with the help of dncil and dnfile, a Python library that parses .NET metadata.
That being said, I agree we should keep components of capa independent whenever possible. It would be great if you could open a PR with your changes - I don't see a reason why we can't remove the use of Token as long as our tests pass post change.

Sorry I was in vacations and did not have time to clean my changes & push. Thanks  @mr-tz!

No worries. Hope this works well for you now!


realsense2_description package not included

You should have the realsense2_description package already in the packages or mention that it needs to be installed

Will be an update soon fixing this problem, which ros distro you use?


Best practices?

Great work @matiasmagni !
I'm new to meteor and react, and I'm searching around the web for boilerplates as starting points...
Are you planning on moving the files from client to imports as the best practices say?
Thanks for sharing your work!
PS: soy argentino también!

In the near future, I want to put it into atmospherejs.com as a meteor package. I have to figure out how to do that and I will!
I'm also specifying some kind of methodology in the building of SPAs, it's part of my thesis work. Could you help me filling the survey I made? Thanks!
SPANISH: https://matiasmagni.blogspot.com.ar/p/spa.html
ENGLISH: https://en-matiasmagni.blogspot.com.ar/p/spa.html
I also invite you to join my groups:
https://www.facebook.com/groups/spa.castellano/
https://www.facebook.com/SPA-Single-Page-Application-558321497832268/
PS: no había leído la posdata jajaja, genial, saludos!

Ok! I'll be waiting for that package!


Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

Description
We spiked detox a couple of months ago on:

React Native: 0.45
Detox: 5.3.0
Jest: 20.0.4

Everything worked as expected.
We have now upgraded to React Native 0.47.2, but detox doesn't seem to be working. We have followed the getting started guide multiple times with different versions of detox with both mocha and jest:
5.6.0+ hangs on the white screen - this is a known issue
< 5.5.1 throws a timeout error - The app launches on the simulator as expected, but then hangs until the tests time out in both Release and Debug mode:
** BUILD SUCCEEDED **

 server listening on localhost:60174...
 : Listing devices...
 evice B6EEA117-5538-4EF0-8AB9-33B53FB4CD9D is already booted
 : Uninstalling com.app.ios.dev...
 : com.app.ios.dev uninstalled
4: Installing /Users/stuartjones/Documents/applications/apps/product-mobile/i s/build/Build/Products/Release-iphonesimulator/Devlyfe.app...
4: /Users/stuartjones/Documents/applications/apps/product-mobile/ios/build/Bu ld/Products/Release-iphonesimulator/Devlyfe.app installed
 : Terminating com.app.ios.dev...
 : com.app.ios.dev terminated
 : Launching com.app.ios.dev...
6: com.app.ios.dev launched. The stdout and stderr logs were recreated, you can watch them with:
        tail -F $HOME/Library/Developer/CoreSimulator/Devices/B6BEA117-5538-4EF0-8BB9-33B53FB4CD9D/data/tmp/detox.last_launch_app_log.{out,err}
 FAIL  __e2e__/index.spec.js (369.577s)
  ● App › Should show menu

    Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

      at pTimeout (node_modules/jest-jasmine2/build/queueRunner.js:53:21)
      at ontimeout (timers.js:488:11)
      at tryOnTimeout (timers.js:323:5)
      at Timer.listOnTimeout (timers.js:283:5)

  ● App › Open menu

    Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

      at pTimeout (node_modules/jest-jasmine2/build/queueRunner.js:53:21)
      at ontimeout (timers.js:488:11)
      at tryOnTimeout (timers.js:323:5)
      at Timer.listOnTimeout (timers.js:283:5)

  App
    ✕ Should show menu (120525ms)
    ✕ Open menu (120388ms)

Test Suites: 1 failed, 1 total
Tests:       2 failed, 2 total
Snapshots:   0 total
Time:        369.899s
Ran all test suites matching "__e2e__".

When running tail -F Library/Developer/CoreSimulator/Devices/B6BEA117-5538-4EF0-8BB9-33B53FB4CD9D/data/tmp/detox.last_launch_app_log.err the log shows:
2017-09-07 16:09:58.262 Devlyfe[2561:1216693] ☣ Adding idling resource for queue: <OS_dispatch_queue: com.facebook.react.KeyboardObserverQueue[0x6100000f3400]>
2017-09-07 16:09:58.278 Devlyfe[2561:1216693] ☣ DETOX:: Ignoring timer: 38 failure reason: "duration>1.5"
2017-09-07 16:09:58.285 Devlyfe[2561:1216693] ☣ Adding idling resource for queue: <OS_dispatch_queue: com.facebook.react.NetworkingQueue[0x6180000f3f00]>
2017-09-07 16:09:58.286 Devlyfe[2561:1216693] ☣ DETOX:: Removing observed timer 1
2017-09-07 16:09:58.286 Devlyfe[2561:1216668] ☣ Adding idling resource for queue: <OS_dispatch_queue: com.facebook.react.ImageStoreManagerQueue[0x6080000f0d00]>
2017-09-07 16:09:58.286 Devlyfe[2561:1216668] ☣ Adding idling resource for queue: <OS_dispatch_queue: com.facebook.react.FileRequestHandlerQueue[0x6080000f0180]>
2017-09-07 16:09:58.286 Devlyfe[2561:1216668] ☣ Adding idling resource for queue: <OS_dispatch_queue: com.facebook.react.DataRequestHandlerQueue[0x6080000ef780]>
2017-09-07 16:09:58.287 Devlyfe[2561:1216668] ☣ Adding idling resource for queue: <OS_dispatch_queue: com.facebook.react.HTTPRequestHandlerQueue[0x6000000f4580]>
2017-09-07 16:09:58.371 Devlyfe[2561:1201502] ☣ DETOX:: Detox Action Sent: ready
2017-09-07 16:09:58.448 Devlyfe[2561:1201502] ☣ DETOX:: Detox Action Received: invoke

Steps to Reproduce

Create a react native project version 0.47.2
Install and run detox using the getting started guide

Node, Device, Xcode and macOS Versions

Node: 8.1.0
Device: iPhone 6 iOS 10.3
Xcode: 8.3.3
macOS: 10.12.6

Any help would be greatly appreciated. We have spent days trying to debug this, but keep going round in circles.

React Native changed implementation to the C++ bridge in 0.45, and synchronization broke. We fixed that in 5.6.1. So using a modern (0.45.0+) RN with an old build is not supported. I will close this issue as it cannot be meaningfully debugged. Instead, we should focus on fixing #155.

Hm, I'm actually mistaken. The improvement was done in 5.2.0.
I have not tested yet Detox with 0.47.2, so there may have been introduced new issues. Let's keep the issue open.

I guess the app is terminated like what i have ran into and refers to #279 as well

@Kureev If you enable synchronization debug, what do you see?

@LeoNatan sure thing, I can take care if you elaborate what "synchronization debug" means :)

I think this is related to issue #270 so I will close for the time being.


Very nice!!

Not really an issue, but wanna congratulate you on this repo, it's very good content.
I'm glad more ppl is walking the path I walked some years ago, even with a repository on github like I did .
Although I must say your diagram looks a lot better than mine :)

If you are curious, you can also check out my talk about it.
Keep it up!

Hey! I shamelessly based my diagram on yours + some others I've found online, I bet you can tell by the color schema :)
Also your talk is first in my list of Additional resources ;)

Hah, you also have my talk in your resources, cool, i had only seen the link to my blog post :)
Tkx for referring me there and, again, very nice content, keep it up. :)


Add workspace filter to check for text

It would be nice to filter workspace based on entities that have text properties


Added response id based on request id.

What this PR does / why we need it:
Which issue(s) this PR fixes (optional, in fixes #<issue number>(, fixes #<issue_number>, ...) format, will close the issue(s) when PR gets merged):
Fixes #3019
Type of changes
Please delete options that are not relevant.

[x] Bug fix (non-breaking change which fixes an issue)

Feature/Issue validation/testing:
Please describe the tests that you ran to verify your changes and relevent result summary. Provide instructions so it can be reproduced.
Checklist:

[ ] Have you added unit/e2e tests that prove your fix is effective or that this feature works?

Release note:

NONE

/lgtm
/approve


unattached block volume removal

We have unattached block volumes costing us money- they need to be terminated/deleted.

From https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=143753911297273&parent=EXTERNAL_SEARCH&sourceId=HOWTO&id=2957335.1&_afrWindowMode=0&_adf.ctrl-state=ez8idkiy4_4
print $COMPARTMENTS                                                                                ░▒▓ ✔ │ 12s │ 04:28:10 PM
ocid1.tenancy.oc1..aaaaaaaal5vevlcd4mmizjkw5xyn4l5vhpn7jnkkkk7juwsvmljkech3axia [
  "ocid1.compartment.oc1..aaaaaaaaq66pc6rncwymf7vturzdpt2ssqo77u2cjaiyx7oheqngitcjqovq",
  "ocid1.compartment.oc1..aaaaaaaap5blzjemtnhoaqncpbvzfa4m6ttfll2nro5nhs3zvcx7yaxfmo5q",
  "ocid1.compartment.oc1..aaaaaaaa4dm2s7hha3z6pvcbwozvsxi76lyi7la76pafus3unhnjtxmb3kbq",
  "ocid1.compartment.oc1..aaaaaaaakpxxvzoncfzfq3agxfxrousvc36wnwgtljjzbwr2k6wm7qlupwya",
  "ocid1.compartment.oc1..aaaaaaaa36uorhzz5eswhjjxbyxk5cm6t4nmzckaxh2b5asrymxm6u7zf6xa",
  "ocid1.compartment.oc1..aaaaaaaaksjizf3he3mxfkzktit7t4725vswbhweh3g5cazjdmdmww56d7xa"
]

oci bv volume list --compartment-id <COMPARTMENT_ID> | grep '"id"' | cut -d '"' -f4 > all_volumes #get all volumes and place them in a file

oci compute volume-attachment list --compartment-id <COMPARTMENT_ID> | grep '"volume-id"' | cut -d'"' -f4 > attached_volumes #get attached volumes and place them in a file

grep -vxFf attached_volumes all_volumes #get unattached volumes

This script finds all unattached volumes in all compartments in the tenancy and prints them by compartment and the command to delete them:
import subprocess
import os
import json
from tqdm import tqdm

def fetch_compartments(compartment_id):
    cmd = f"oci iam compartment list --compartment-id {compartment_id} | grep '\"id\"' | cut -d '\"' -f4"
    compartment_ids = subprocess.check_output(cmd, shell=True).decode().splitlines()
    for cid in compartment_ids:
        yield from fetch_compartments(cid)
    yield compartment_id

def get_compartment_name(compartment_id):
    cmd = f"oci iam compartment get --compartment-id {compartment_id} | grep '\"name\"' | cut -d '\"' -f4"
    name = subprocess.check_output(cmd, shell=True).decode().strip()
    return name

def get_untagged_volumes(compartment_id):
    cmd = f"oci bv volume list --compartment-id {compartment_id}"
    volumes = subprocess.check_output(cmd, shell=True).decode()
    if not volumes.strip():
        return []
    try:
        volume_data = json.loads(volumes)
        untagged = [v for v in volume_data["data"] if not v["defined-tags"] and not v["freeform-tags"]]
        return untagged
    except json.JSONDecodeError:
        print(f"Error parsing JSON for untagged volumes in compartment {compartment_id}. Raw output:\n{volumes}")
        return []

def find_unattached_volumes():
    root_compartment = "YOUR_ROOT_COMPARTMENT_OCID_HERE"
    compartments = list(fetch_compartments(root_compartment))

    untagged_file = 'untagged.txt'

    for compartment_id in tqdm(compartments, desc="Processing compartments"):
        untagged = get_untagged_volumes(compartment_id)
        if untagged:
            with open(untagged_file, 'a') as f:
                for resource in untagged:
                    f.write(f"Compartment: {get_compartment_name(compartment_id)}, Volume: {resource['id']}, Name: {resource['display-name']}\n")

    print("\nCommands to delete all unattached volumes:")
    for compartment_id in compartments:
        compartment_name = get_compartment_name(compartment_id)
        cmd_all_volumes = f"oci bv volume list --compartment-id {compartment_id} | grep '\"id\"' | cut -d '\"' -f4"
        cmd_attached_volumes = f"oci compute volume-attachment list --compartment-id {compartment_id} | grep '\"volume-id\"' | cut -d '\"' -f4"

        all_volumes = set(subprocess.check_output(cmd_all_volumes, shell=True).decode().splitlines())
        attached_volumes = set(subprocess.check_output(cmd_attached_volumes, shell=True).decode().splitlines())

        unattached_volumes = all_volumes - attached_volumes

        if unattached_volumes:
            print(f"{compartment_name}:")
            for volume in unattached_volumes:
                print(f"oci bv volume delete --volume-id {volume} --force")

find_unattached_volumes()


correspondence mutator may be used on unspecified value

An initialization check is not performed on storage:
class Collection<Element>(Element e) {
    variable Array<Element?> storage;
    storage[0] = e; // no error!
    storage.set(0, e); // error: not definitely initialized: 'storage'
}

Fixed.


goerli: pixel-canvas-api scene is not rendering

Explorer Alpha build version:
0.3.402-g7a23dc7e-main
Issue Description:

On 81,-8, the scene doesn't render at all. It should fetch data from a simple API to know what color to paint each tile in the canvas
Evidence:

Additional Notes:

Rendering on version 0.10.0


Icon request: Robot for robot.txt

I wanted to add an icon for robot.txt files to the Atom package, but there is no robot icons in the existing fonts (as far as I know at least)(there is hubot in octicons, but I don't think it should be used for this)
Since the the official(?) website does not really have a proper icon to use for this, I would suggest just using a random but iconic robot icon, for example this one (which has a license!).
For clarity, this icon would only be associated to robot.txt files.
Throughts?

there is hubot in octicons, but I don't think it should be used for this

Hrm, any particular reason you think it shouldn't?
While I'm not averse to adding "unofficial" icons for filetypes which lack them, this would feel like overkill to be honest...

Hrm, any particular reason you think it shouldn't?

The main reason I did think that is because Hubot is a Github product. But if you think it is okay to use it for the specified purpose, I'll have a go at a PR in file-icons/atom 🙂


lastfm zap

Zap lastfm leftovers.

[x] brew cask audit --download {{cask_file}} is error-free.
[x] brew cask style --fix {{cask_file}} reports no offenses.
[ ] The commit message includes the cask’s name and version.

Thank you.


[1.0] Can't rely on BadRequestException

Guzzle 6 has an optional http_errors middleware, which means that it is not guaranteed that exceptions will be thrown for bad requests.
I have two ideas that could help fix this:

Keep the catch for BadRequestException in order to use $e->getReponse().
Check response status code and throw either a ClientErrorException or ServerErrorException, creating with the Response.
Could create protected onError(request,response) and onSuccess(request, response) style methods that by default throw those two exceptions.

Pass the Response to checkResponse as well as the parsed result. This would allow providers to determine errors based on status code and/or the parsed result.

Happy to PR this if it sounds reasonable to everyone.

This seems to very unlikely to be an issue, because if the user is passing in a custom Guzzle client that is throwing custom exceptions, it would be caught by the user and is not the responsibility of OAuth client to do so.

:+1:
What about passing the response object to checkResponse alongside the parsed result?

That's probably useful. The provider can decide to use it or not, it doesn't hurt anything.


how can use in online mode?

How?

You can not use it on the real ladder. You can use it to play against it yourself locally or you can upload it to a bot ladder like https://www.sc2ai.net (the site is broken atm but hopefully fixed in the next couple of days).