[WIP] Poly trans: Issue #347

At the current stage the pull request implements PolynomialFeatures in dask-ml for dask arrays with known shape and chunk size.
Implements Issue #347

No, I have to apologize for not having invested more time on the dask fundamentals.
I was a bit distracted by realizing that the sklearn transformer is not stateless, which made me think that the "mapping" approach is not feasible.
Anyway, thanks for you valuable comments. I'm really happy to learn stuff.

Short Update: Following the lines of your suggestion works for dask arrays.

Hmm, it seems like my only one of my local commits appears here. Anyway.
Code seems to work: The transformed arrays coincide (even after starting with data frames).
TODOs

Documentation
Code Cleanup
Further tests, e.g. checking data frames (pandas and dask) will give the same result. Test fit more extensively, and maybe some ideas I'll have

Hope to commit tomorrow around the same time

Unfortunately not the last update. I'm still having a failed test. I assume it happens due to incomplete meta data. An example:
from dask import array as da
from dask_ml.preprocessing import PolynomialFeatures
from dask_ml.datasets import make_classification
import dask.dataframe as ddf

X, y = make_classification(chunks=50)
df = X.to_dask_dataframe().rename(columns=str)

p = PolynomialFeatures()
p.fit_transform(df)

Throws an AttributeError:
AttributeError: 'DataFrame' object has no attribute '_repr_data'

However, this is probably only due to jupyter as
p.fit_transform(df).compute()

returns a dataframe but with a duplicate index.
I have the suspicion, that this could be solved by passing to map_partitions the meta information about the column type. Could this be the way? Which types would one choose?

Unfortunately, I was too optimistic, probably some artifacts in jupyter.
So as the test indicates, I'm creating duplicate index entries.
An example to reproduce:
from dask import array as da
from dask_ml.preprocessing import PolynomialFeatures
from dask_ml.datasets import make_classification
import dask.dataframe as ddf
X, y = make_classification(chunks=50)
df = X.to_dask_dataframe().rename(columns=str)
p = PolynomialFeatures()

Now
p.fit_transform(df)

throws - in jupyter - an AttributeError
AttributeError: 'DataFrame' object has no attribute '_repr_data'

However
p.fit_transform(df).compute()

provides an output, and the arrays seem to be correct. However, the index isn't.
I was training to add a meta keyword argument to map_partitions, but this didn't help either.
Any ideas?
Besides: I'd assume there should be some documentation added right? Any wishes on what to put where?

The AttributeError indicates that something is wrong with the metadata. Haven't looked to see if it's a dask bug or not.
However, given my earlier comment we may not need to worry about it. If you don't pass meta=meta to the X.map_partitions, then we'll just return an ndarray and everything will be fine.

For documentation you can add it to the list of "scikit-learn clones" in doc/source/preprocessing.rst and to doc/source/modules/api.rst, again under preprocessing.

It seems that map_partitionhas some issues if the function creates more columns than originally in the dataframe! Even providing meta information was not helping. I'll post some details later. Though map_partition somehow shows some values, it seems one always would have to call reset_index() afterwards, if one can avoid errors. This seems a bit odd and unsafe.
It seems, that falling back to map_block for dask arrays is a solution.

Okay, so I investigated a bit and two (maybe three options) unfold.

Use map_partitions followed by reset_index
Use map_blocks but compute the number of rows

I'm not sure what is computational more expensive.

Set Up
import dask
from sklearn.preprocessing.data import PolynomialFeatures

from dask import array as da
from dask_ml.datasets import make_classification
import dask.dataframe as ddf

X, y = make_classification(chunks=3, n_samples=6, n_features=2)
df = X.to_dask_dataframe().rename(columns=str)
X_from_df = df.to_dask_array()

spf = PolynomialFeatures()
spf.fit(X.compute())

Essentially, the issue is that the concatenation of to_dask_array and to_dask_dataframe
is not the identity function, and thus the divisions can not be inferred for data frames

print(X)
print(df.shape, df.divisions)

dask.array<normal, shape=(6, 2), dtype=float64, chunksize=(3, 2)>
(Delayed('int-97a26258-e448-4f93-830e-72985a66cde2'), 2) (0, 3, 5)

print('X:', X)
print("'id'(X):", X_from_df)
print("df:", df.shape, df.divisions)
print("id(df):", df.to_dask_array().to_dask_dataframe().shape,  df.to_dask_array().to_dask_dataframe().divisions)

X: dask.array<normal, shape=(6, 2), dtype=float64, chunksize=(3, 2)>
'id'(X): dask.array<array, shape=(nan, 2), dtype=float64, chunksize=(nan, 2)>
df: (Delayed('int-756aa071-eaf0-4883-9bcf-383c630872a5'), 2) (0, 3, 5)
id(df): (Delayed('int-d7b1c932-daf6-44c6-943c-5de1ddd49297'), 2) (None, None, None)

For a dask array, we may provide the correct chunk sizes in the map_blocks function, and we obtain the correct output shapes. However, we also need to pass a dtype!

n_cols = len(spf.get_feature_names())
row_chunk_size = X.chunksize[0]
print(n_cols, row_chunk_size)

6 3

# wrong dimensions, need to set dtype
print(X.map_blocks(spf.transform, dtype='float'))
# only accurate solution: necessary to now the row_count!
print(X.map_blocks(spf.transform, dtype='float', chunks=(row_chunk_size, n_cols)))
# nan rows
print(X_from_df.map_blocks(spf.transform, dtype='float'))
# random guess also false
print(X_from_df.map_blocks(spf.transform, dtype='float', chunks=(10, n_cols)))
# shape: only one chunk_size predicts the correct shape!
print(X_from_df.map_blocks(spf.transform, dtype='float').compute().shape)

dask.array<transform, shape=(6, 2), dtype=float64, chunksize=(3, 2)>
dask.array<transform, shape=(6, 6), dtype=float64, chunksize=(3, 6)>
dask.array<transform, shape=(nan, 2), dtype=float64, chunksize=(nan, 2)>
dask.array<transform, shape=(20, 6), dtype=float64, chunksize=(10, 6)>
(6, 6)

Finally, the suggestion and issues for data frames:
#duplicate index -> reset_index will solve this
df_t = df.map_partitions(spf.transform).to_dask_dataframe(columns=spf.get_feature_names())
# Avoiding reset_index
X_t = X_from_df.map_blocks(spf.transform, dtype='float', chunks=(row_chunk_size, n_cols)).to_dask_dataframe(columns=spf.get_feature_names())
# Could use the dask graph and set the divisions manually, might be hard to do

print(df_t.index)
print('---------')
print(X_t.index)

Dask Index Structure:
npartitions=2
    int64
      ...
      ...
dtype: int64
Dask Name: from-dask, 12 tasks
---------
Dask Index Structure:
npartitions=2
0    int64
3      ...
5      ...
dtype: int64
Dask Name: from-dask, 14 tasks

We see, that there is no index information for the map_partitions approach (a compute shows duplicate index values). Moreover a third approach could be to use the dataframe-constructor, but we would need to calculate the divisions.
So: Which approach do you prefer? What is more expensive? Resetting the index or calculation the number of rows?

Any comments on the last commit?

So what do to with the sklearn_dev error. The I think, this should be mergeable right now.

Another question: As of the contributing pipelines, dask transformers should have a columns keyword. Should this be added here as well? Maybe one could add a follow up issue.

As of the contributing pipelines, dask transformers should have a columns keyword. Should this be added here as well?

No, I think that is unnecessary now that ColumnTransformer is in scikit-learn.

Fixed a merge conflict and pushed. Hopefully the CI is passing now.

I just got a RuntimeError
RuntimeError: scikit-learn estimators should always specify their parameters in the signature of their __init__ (no varargs). <class 'dask_ml.preprocessing.data.PolynomialFeatures'> with constructor (self, preserve_dataframe=False, *args, **kwargs) doesn't  follow this convention.
Moreover, something like
X, y = make_classification(chunks=50)
df = X.to_dask_dataframe().rename(columns=str)
a = dpp.PolynomialFeatures(preserve_dataframe=True)
res_df = a.fit_transform(frame)

seems to work, but inspecting
df

gives

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
~/anaconda3/envs/dask-ml-dev/lib/python3.6/site-packages/IPython/core/formatters.py in __call__(self, obj)
    700                 type_pprinters=self.type_printers,
    701                 deferred_pprinters=self.deferred_printers)
--> 702             printer.pretty(obj)
    703             printer.flush()
    704             return stream.getvalue()

~/anaconda3/envs/dask-ml-dev/lib/python3.6/site-packages/IPython/lib/pretty.py in pretty(self, obj)
    398                         if cls is not object \
    399                                 and callable(cls.__dict__.get('__repr__')):
--> 400                             return _repr_pprint(obj, self, cycle)
    401
    402             return _default_pprint(obj, self, cycle)

~/anaconda3/envs/dask-ml-dev/lib/python3.6/site-packages/IPython/lib/pretty.py in _repr_pprint(obj, p, cycle)
    693     """A pprint that just redirects to the normal repr function."""
    694     # Find newlines and replace them with p.break_()
--> 695     output = repr(obj)
    696     for idx,output_line in enumerate(output.splitlines()):
    697         if idx:

~/anaconda3/envs/dask-ml-dev/lib/python3.6/site-packages/dask/dataframe/core.py in __repr__(self)
    392
    393     def __repr__(self):
--> 394         data = self._repr_data.to_string(max_rows=5, show_dimensions=False)
    395         return """Dask {klass} Structure:
    396 {data}

~/anaconda3/envs/dask-ml-dev/lib/python3.6/site-packages/dask/dataframe/core.py in __getattr__(self, key)
   2518             return new_dd_object(merge(self.dask, dsk), name,
   2519                                  meta, self.divisions)
-> 2520         raise AttributeError("'DataFrame' object has no attribute %r" % key)
   2521
   2522     def __dir__(self):

AttributeError: 'DataFrame' object has no attribute '_repr_data'

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
~/anaconda3/envs/dask-ml-dev/lib/python3.6/site-packages/IPython/core/formatters.py in __call__(self, obj)
    343             method = get_real_method(obj, self.print_method)
    344             if method is not None:
--> 345                 return method()
    346             return None
    347         else:

~/anaconda3/envs/dask-ml-dev/lib/python3.6/site-packages/dask/dataframe/core.py in _repr_html_(self)
   3131
   3132     def _repr_html_(self):
-> 3133         data = self._repr_data.to_html(max_rows=5,
   3134                                        show_dimensions=False, notebook=True)
   3135         return self._HTML_FMT.format(data=data, name=key_split(self._name),

~/anaconda3/envs/dask-ml-dev/lib/python3.6/site-packages/dask/dataframe/core.py in __getattr__(self, key)
   2518             return new_dd_object(merge(self.dask, dsk), name,
   2519                                  meta, self.divisions)
-> 2520         raise AttributeError("'DataFrame' object has no attribute %r" % key)
   2521
   2522     def __dir__(self):

AttributeError: 'DataFrame' object has no attribute '_repr_data'

I though I resolved that error

I just got a RuntimeError
RuntimeError: scikit-learn estimators should always specify their parameters in the signature of their init (no varargs). <class 'dask_ml.preprocessing.data.PolynomialFeatures'> with constructor (self, preserve_dataframe=False, *args, **kwargs) doesn't follow this convention.

Sorry I missed that. That's because you're using *args, **kwargs in PolynomialFeatures.__init__. We need to list out the keyword arguments explicitly.

I just got a RuntimeError
RuntimeError: scikit-learn estimators should always specify their parameters in the signature of their init (no varargs). <class 'dask_ml.preprocessing.data.PolynomialFeatures'> with constructor (self, preserve_dataframe=False, *args, **kwargs) doesn't follow this convention.

Sorry I missed that. That's because you're using *args, **kwargs in PolynomialFeatures.__init__. We need to list out the keyword arguments explicitly.

Sorry for mentioning that I'm aware of that. Next two days are a but busy. I hope I'll find some time on Thursday or Friday to solve the last remaining issues and modify the tests accordingly.
Moreover, I'll add a test that ensures that a dataframe can be inspected.

I found the "bug" in dask. dd.from_dask_array does not like multiple column names. The test dataframe contains a 1which is the same column description as that of the bias.
So a hot fix is to ensure that the columns of the dataframe don't contain the 1 and maybe raise a warning. Other suggestions?
I'll check if dask already has an issue concerning that

So a hot fix is to ensure that the columns of the dataframe don't contain the 1 and maybe raise a warning. Other suggestions?

that seems fine.

The upstream issue seems pretty solvable as well if anyone wants to take a
shot.
On Wed, Oct 10, 2018 at 2:37 PM Tom Augspurger<EMAIL_ADDRESS>wrote:

So a hot fix is to ensure that the columns of the dataframe don't contain
the 1 and maybe raise a warning. Other suggestions?
that seems fine.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/dask/dask-ml/pull/367#issuecomment-428684244, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AASszIAIubI1Un-1T0SZtFJ_nxH917pYks5ujj6FgaJpZM4Wqu1L
.

So I'd suggest that I try to solve the issue in dask, as @mrocklin suggested. If I'm not able to fix this quickly, I'd provide a solution with the hot fix. Would this be okay, or should we rather close this issue first with the hot fix and create a new task to remove the fix once dask has the "bug" fixed?

Any hints on the coverage bug? Should I try to increase the coverage?

I think it's not actually coverage, I think that it's a flake issue.  I recommend running flake8 on your codebase and seeing if anything comes up.
cc @TomAugspurger feedback on the black process ^^  It's not entirely clear to users what went wrong when things go wrong, or how to fix it.

Hmm i ran black and pushen the changes. Will Check tomorrow morning again and push the Update. Thanks for your comments

[black]
would reformat /root/project/dask_ml/preprocessing/__init__.py
All done! 💥 💔 💥
1 file would be reformatted, 92 files would be left unchanged.

 Maybe it's too late today. Will push the changes tomorrow. Thanks again

@TomAugspurger and @mrocklin I think this could be merged right now. Any further comments? With my latest addition in dask, the representation bug is also gone. So assuming one hast the nightly dask, this will work without issues. Is there any suggestion how/if to make users aware of that?

Looks good, thanks @datajanko.
Dask-ML tends to require fairly recent versions of dask. We'll likely bump the required version of dask shortly after the next release. But since it's just a bug in the repr I don't think we're in a rush.


refactor(core): separate logic for inbound plaintext and encrypted message

Currently, we use receiveMessage for both encrypted and plaintext connection-less OOB messages. However, the plaintext message just passed through a lot of code related only to the encrypted message. I split the logic into separate methods.
I also did a few renamings according to DIDComm spec introducing EncryptedMessage and PlaintextMessage.

Codecov Report

Merging #581 (f07d37e) into main (aa49f99) will increase coverage by 0.51%.
The diff coverage is 75.38%.

@@            Coverage Diff             @@
##             main     #581      +/-   ##
==========================================
+ Coverage   85.83%   86.34%   +0.51%
==========================================
  Files         286      286
  Lines        6063     6070       +7
  Branches      889      891       +2
==========================================
+ Hits         5204     5241      +37
+ Misses        856      826      -30
  Partials        3        3

Impacted Files
Coverage Δ

packages/core/src/agent/TransportService.ts
92.30% <ø> (ø)

packages/core/src/index.ts
100.00% <ø> (ø)

...ackages/core/src/modules/routing/MediatorModule.ts
78.04% <0.00%> (ø)

...re/src/modules/routing/services/MediatorService.ts
73.00% <ø> (ø)

...c/modules/routing/services/MessagePickupService.ts
83.33% <0.00%> (+38.88%)
:arrow_up:

...ckages/core/src/transport/HttpOutboundTransport.ts
10.81% <0.00%> (ø)

packages/core/src/types.ts
100.00% <ø> (ø)

...ages/core/src/storage/InMemoryMessageRepository.ts
56.25% <50.00%> (+18.75%)
:arrow_up:

packages/core/src/agent/MessageSender.ts
71.77% <57.14%> (ø)

.../core/src/modules/routing/messages/BatchMessage.ts
82.60% <66.66%> (+26.08%)
:arrow_up:

... and 17 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update aa49f99...f07d37e. Read the comment docs.


specification: user-defined statistics

Related to https://github.com/foxglove/mcap/issues/384
It would be nice if there were a way for writers to define and use custom statistics in their mcap files and have them surfaced by the "info" subcommand. I think this could be implemented with a new record type like "custom statistic", which could minimally contain "name" and "value" fields. Better IMO would be to provide a little more structure, like supporting "channel statistic" and "file statistic" variants, or even "channel statistic", "file statistic", "attachment statistic", "metadata statistic", "chunk statistic". The channel statistics would have channel IDs associated with them, file statistics would be whole-file, and metadata/attachment/chunk statistics could contain references to the relevant record offset. I am imagining all these records would be written to the summary section somewhere, I guess in a new statistics section. The "info" command could then display file and channel statistics, and the list attachments/chunks/metadata/channels commands could show the relevant type of statistic as well.
Some additional things to think about:

what about within-chunk channel statistics?

This seems like a reasonably clean way to head off a category of statistic addition requests.
One awkward point here is that we have no floating-point value type in the MCAP spec as it currently stands.
It's also a little awkward that we need to add a new opcode for every concept that one might want to have a statistic about: Channel, Chunk, File, Attachment, Metadatat etc.

regarding 2 - I think we would probably just introduce one. The representation in use in file formats I have encountered is IEEE 754.
about 3, I agree - however I'm not sure the alternatives are better. I can imagine two ways to handle it. We could go with a scheme that looks like this:
Statistic
Type: channel | attachment | chunk | metadata | ...
Name: string
Value: float64
Reference: channelID | attachment offset | chunk offset | ??? | ...

or split out different record types as the OP suggests. I don't know with the previous scheme how we encode "chunk channel statistics" if that is something we would want to provide, and the implied dispatch on user-supplied strings to interpret the "reference" field seems kind of brittle to me. But I think at the end of the day you could use make either approach work.

Another interesting application for custom statistics would be accelerating text search using trigrams. Consider that in typical robotics data, text values within specific fields are extremely conserved: they will generally derive from a finite number of error strings that exist in code somewhere. Typical searches will be for rare strings like "ERROR", not common strings like "success".
Imagine a post-processing step that creates a chunk or file-level statistic for each text field contained within the chunk or file. The value of the statistic is a bit vector, maybe 8 or 12 bytes long. During post-processing, string values for each string field are decomposed into trigrams. The trigrams are hashed into the vector and combined with a bitwise OR.
To execute a search, the search term is decomposed into trigrams and hashed into a vector in the same manner. This vector is then checked for overlap with the index vector. If all flipped bits in the search vector are flipped in the index vector, the file/chunk must be examined. Otherwise it can be skipped.
The same technique could be used for generic text search (without specification of fields at all), but a longer vector would be required.

Much of that idea is lifted from https://www.postgresql.org/docs/current/pgtrgm.html


Failure log when having functional indexes

bundle exec database_consistency generates a failure log (just a file named database_consistency_<date>_<and>_<time>) containing the following line:
/bundle/gems/database_consistency-0.6.5/lib/database_consistency/checkers/missing_unique_index_checker.rb:36:in `block in unique_index': undefined method `sort' for "lower((email)::text)":String (NoMethodError)

Yes, this is a correct behaviour for errors implemented by DatabaseConsistency::RescueError. Thank you for creating an issue, I'm working on supporting case_sensetive: false.

Fixed https://github.com/djezzzl/database_consistency/pull/19. Try 0.6.6 version.

Thanks!


Move dependencies into a single file deps.ts

Specify the version tag for those which offer it.

@chiefbiiko It'd be great if you could tag these other repos of yours so that dynamodb could point to a specific version of them (and they, in turn, would do the same: point to specific version of each of their dependencies).
For larger projects like this, I find the deps.ts is a good model as it keeps the imports in a single place (excluding tests), so makes them more visible and also easier to update.

Yea for sure, will tag all dependencies in the 🌳


Can specify regions

Allows specification of a ?region= querystring to setup the AWS S3 client in tilelive-s3 appropriately for other buckets.

@rclark Debating if I should publish this and deploy to unpacker production separately on its own, just in case there are any surprises. Also, is this production ready?


Allow processing of the dins table and its variants

@siddharth-krishna unfortunatelly none of the benchmarks allows testing this issue (unless we want to process multiple regions in TIM). I've confirmed that this improves the results on TUSM.

Good idea! :-) Let's maybe wait a little bit with it though. I am thinking we could refactor process_transform_table_variants to make use of utils.explode. @SamRWest has a branch working on optimising process_wildcards. I'll open an issue on how to simplify it and separate some logic.


FEATURE: Filter Reporting Accounts + Spending By Category Report

Github Issue (if applicable): n/a
Trello Link (if applicable):
https://trello.com/c/igcefkhR
https://trello.com/c/oB1ZuBkC
Forum Link (if applicable): All of them
Explanation of Bugfix/Feature/Enhancement:
Implemented account filtering and the Spending By Category v1 Report (no master category drilldown, yet)
Recommended Release Notes:
Reporting Upgrade!
You can now filter by account for the NetWorth table.
Introducing the Spending By Category Report! Currently, there is no way to drill down into a master category but that is planned for a future release.
Known Issues?

Historical (migrated) data in the SBC report to doesn't line up perfectly across YNAB4 and nYNAB. I'm certain it's just something in a hidden category somewhere but I haven't found it yet.
There is no l8n for the SBC report right now

I like it!
I wasn't expecting SBC to be a pie chart though... Any way to change it to bars so I can see spending month-over-month?

@StephenBrown2 hmmmmmmmmmmmmmmm
I guess we should but I kinda straight up stole if from YNAB4...I think you're thinking about spending vs. expense report which is definitely my next goal...

Oh! Never used YNAB4, so feel free to disregard my misplaced expectations. :-) I can filter easy enough with the sliderbar.

┬─┬ ノ( ゜-゜ノ) 😃

Putting the table back? :wink:

Haha -- yea....no need to have any upside down tables around here! :D

@blargity I wanted to go through and change all of the template literals but became pretty daunting pretty fast... I fixed just the ones you commented on because they're the only ones with user input as of right now.

Thank you!


[Compiler] Merge GraphQL antlr grammars

We have two grammars:

GraphQL.g4 for operations
GraphSDL.g4 for type definitions

The spec uses the same grammar for both. Merging them will make maintenance easier in the long run.

Fixed in dev-3.x


Add cartesian product

Added cartesian product
Added unit test
Updated dependencies
Minor formatting and style changes in rdd mod

Merged this PR


adjust file descriptor limits

Hey, Can you provide a description?

The file descriptor is used to manage TCP sockets in the operating system. The number of file descriptors is limited per process, which can lead to a maximum limit of TCP sockets.

Should'nt we let the user decide whats the File descriptors limit, I can imagine that common server distros change this value or unlimit it. I wonder how Netty/Vanilla Minecraft handles it

Correct me if I'm wrong, but isn't the soft limit of file handles on linux usually unlimited? Only the hard limit which cannot be changed by unprivileged users is usually set (although also usually to an unnecessarily high value like >=2048). But to change those, pumpkin would need to run as root, which is also against security practices. The soft limit being lower also would probably mean that the user themselves set it that way for a reason.

Netty also uses the global OS value. I think we should use it aswell. There may will be useres who want to have an connection limit. I also don't really want to deal with libc. I will close this for now. Feel free to reopen or make an issue. To give good points to set the limits ourselfs


DP04S007 100A bluetooth

First of all, thank you very much for making this integration.
I'm attempting to connect to my BMS (model from xiaoxiang app: DP04S007L4S100A, so probably translates to DP04S007 100A) via bluetooth using an ESP32WROOM.
I'm using the "esp32-ble-example.yaml" example, only changing the board to esp32dev and the MAC to that of my BMS. Once I have 'installed' the code onto the ESP, the log shows "Not connected" with the MAC address I provided. I assume this MAC address is that of the BMS?
I'm not sure if I am doing something wrong or if this BMS may not be supported.
Any advice is appreciated.

You are on the right track. You have to make sure the MAC address matches with the one of your BMS. That's all.
Please increase the log level to VERY_VERBOSE:
logger:
  level: VERY_VERBOSE

Please reflash the ESPHome node and provida a log showing the "No connected" issue. I would like to make sure the implementation is able to see your BMS in the air and tries to connect to the BMS (without success?).

I swapped out my ESP as I started to suspect that one has some signal/antenna issues.
Results look more promising, Note that I just changed the MAC address as I'm not sure what is safe to share.
Normal logger
[08:08:40][C][jbd_bms_ble:384]: Cell Voltage 32 'revov-bms cell voltage 32' [08:08:40][C][jbd_bms_ble:384]:   Device Class: 'voltage' [08:08:40][C][jbd_bms_ble:384]:   State Class: 'measurement' [08:08:40][C][jbd_bms_ble:384]:   Unit of Measurement: 'V' [08:08:40][C][jbd_bms_ble:384]:   Accuracy Decimals: 3 [08:08:40][W][jbd_bms_ble:172]: [AA:AA:AA:AA:AA:AA] Not connected [08:08:40][C][ble_switch:076]: BLE Client Switch 'revov-bms enable bluetooth connection' [08:08:40][C][ble_switch:078]:   Icon: 'mdi:bluetooth' [08:08:40][C][ble_switch:099]:   Restore Mode: restore defaults to OFF [08:08:40][C][jbd_bms_ble.switch:076]: JbdBmsBle Switch 'revov-bms discharging' [08:08:40][C][jbd_bms_ble.switch:078]:   Icon: 'mdi:battery-charging-50' [08:08:40][C][jbd_bms_ble.switch:099]:   Restore Mode: restore defaults to OFF [08:08:40][C][jbd_bms_ble.switch:076]: JbdBmsBle Switch 'revov-bms charging' [08:08:40][C][jbd_bms_ble.switch:078]:   Icon: 'mdi:battery-charging-50' [08:08:40][C][jbd_bms_ble.switch:099]:   Restore Mode: restore defaults to OFF [08:08:40][C][jbd_bms_ble.switch:076]: JbdBmsBle Switch 'revov-bms balancer' [08:08:40][C][jbd_bms_ble.switch:078]:   Icon: 'mdi:seesaw' [08:08:40][C][jbd_bms_ble.switch:099]:   Restore Mode: restore defaults to OFF [08:08:40][C][esp32_ble_tracker:874]: BLE Tracker: [08:08:40][C][esp32_ble_tracker:875]:   Scan Duration: 300 s [08:08:40][C][esp32_ble_tracker:876]:   Scan Interval: 320.0 ms [08:08:40][C][esp32_ble_tracker:877]:   Scan Window: 30.0 ms [08:08:40][C][esp32_ble_tracker:878]:   Scan Type: ACTIVE [08:08:40][C][esp32_ble_tracker:879]:   Continuous Scanning: True [08:08:40][C][ble_client:027]: BLE Client: [08:08:40][C][ble_client:028]:   Address: AA:AA:AA:AA:AA:AA [08:08:40][C][mdns:103]: mDNS: [08:08:40][C][mdns:104]:   Hostname: revov-bms [08:08:40][C][ota:093]: Over-The-Air Updates: [08:08:40][C][ota:094]:   Address: <IP_ADDRESS>:3232 [08:08:40][C][ota:097]:   Using Password. [08:08:40][C][api:138]: API Server: [08:08:40][C][api:139]:   Address: <IP_ADDRESS>:6053 [08:08:40][C][api:143]:   Using noise encryption: NO [08:08:42][W][jbd_bms_ble:172]: [AA:AA:AA:AA:AA:AA] Not connected [08:08:44][W][jbd_bms_ble:172]: [AA:AA:AA:AA:AA:AA] Not connected [08:08:45][D][esp32_ble_client:048]: [0] [AA:AA:AA:AA:AA:AA] Found device [08:08:45][D][esp32_ble_tracker:216]: Pausing scan to make connection... [08:08:45][I][esp32_ble_client:064]: [0] [AA:AA:AA:AA:AA:AA] 0x00 Attempting BLE connection [08:08:46][W][jbd_bms_ble:172]: [AA:AA:AA:AA:AA:AA] Not connected [08:08:46][D][api:102]: Accepted ::FFFF:<IP_ADDRESS> [08:08:46][W][api.connection:083]: Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>): Connection closed [08:08:47][D][esp32_ble_tracker:327]: Starting scan... [08:08:47][I][jbd_bms_ble:091]: Request device info [08:08:48][W][jbd_bms_ble:114]: Maximum response size exceeded [08:08:48][W][jbd_bms_ble:132]: Invalid frame length [08:08:50][W][jbd_bms_ble:114]: Maximum response size exceeded [08:08:50][W][jbd_bms_ble:132]: Invalid frame length
Very verbose:
[07:53:31][C][jbd_bms_ble:384]: Cell Voltage 32 'revov-bms cell voltage 32' [07:53:31][C][jbd_bms_ble:384]:   Device Class: 'voltage' [07:53:31][C][jbd_bms_ble:384]:   State Class: 'measurement' [07:53:31][C][jbd_bms_ble:384]:   Unit of Measurement: 'V' [07:53:31][C][jbd_bms_ble:384]:   Accuracy Decimals: 3 [07:53:31][VV][scheduler:196]: Running interval 'update' with interval=2000 last_execution=7232 (now=9659) [07:53:31][VV][jbd_bms_ble:425]: Send command: DD.A5.03.00.FF.FD.77 (7) [07:53:31][C][ble_switch:076]: BLE Client Switch 'revov-bms enable bluetooth connection' [07:53:31][C][ble_switch:078]:   Icon: 'mdi:bluetooth' [07:53:31][C][ble_switch:099]:   Restore Mode: restore defaults to OFF [07:53:31][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=4 gattc_if=3 [07:53:31][C][jbd_bms_ble.switch:076]: JbdBmsBle Switch 'revov-bms discharging' [07:53:31][C][jbd_bms_ble.switch:078]:   Icon: 'mdi:battery-charging-50' [07:53:31][C][jbd_bms_ble.switch:099]:   Restore Mode: restore defaults to OFF [07:53:31][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:31][VV][jbd_bms_ble:101]: Notification received: DD.<IP_ADDRESS>.5F.00.00.4A.DF.4E.<IP_ADDRESS>D.<IP_ADDRESS>.00 (20) [07:53:31][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:31][VV][jbd_bms_ble:101]: Notification received: <IP_ADDRESS>.<IP_ADDRESS>B.B<IP_ADDRESS>.4E.20.4A.DF.00.00.FA.C2 (20) [07:53:31][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:31][VV][jbd_bms_ble:101]: Notification received: 77 [07:53:31][W][jbd_bms_ble:114]: Maximum response size exceeded [07:53:31][W][jbd_bms_ble:132]: Invalid frame length [07:53:31][V][component:200]: Component esp32_ble_tracker took a long time for an operation (0.05 s). [07:53:31][V][component:201]: Components should block for at most 20-30ms. [07:53:31][C][jbd_bms_ble.switch:076]: JbdBmsBle Switch 'revov-bms charging' [07:53:31][C][jbd_bms_ble.switch:078]:   Icon: 'mdi:battery-charging-50' [07:53:31][C][jbd_bms_ble.switch:099]:   Restore Mode: restore defaults to OFF [07:53:31][C][jbd_bms_ble.switch:076]: JbdBmsBle Switch 'revov-bms balancer' [07:53:31][C][jbd_bms_ble.switch:078]:   Icon: 'mdi:seesaw' [07:53:31][C][jbd_bms_ble.switch:099]:   Restore Mode: restore defaults to OFF [07:53:31][D][api:102]: Accepted ::FFFF:<IP_ADDRESS> [07:53:31][VV][api.service:434]: on_hello_request: HelloRequest {   client_info: 'Home Assistant 2022.12.6'   api_version_major: 1   api_version_minor: 7 } [07:53:31][V][api.connection:900]: Hello from client: 'Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>)' | API Version 1.7 [07:53:31][VV][api.service:013]: send_hello_response: HelloResponse {   api_version_major: 1   api_version_minor: 7   server_info: 'revov-bms (esphome v2022.12.1)'   name: 'revov-bms' } [07:53:31][C][esp32_ble_tracker:874]: BLE Tracker: [07:53:31][C][esp32_ble_tracker:875]:   Scan Duration: 300 s [07:53:31][C][esp32_ble_tracker:876]:   Scan Interval: 320.0 ms [07:53:31][C][esp32_ble_tracker:877]:   Scan Window: 30.0 ms [07:53:31][C][esp32_ble_tracker:878]:   Scan Type: ACTIVE [07:53:31][C][esp32_ble_tracker:879]:   Continuous Scanning: True [07:53:31][C][ble_client:027]: BLE Client: [07:53:31][C][ble_client:028]:   Address: AA:AA:AA:AA:AA:AA [07:53:31][VV][api.socket:810]: Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>): Connection closed [07:53:31][W][api.connection:083]: Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>): Connection closed [07:53:31][C][mdns:103]: mDNS: [07:53:31][C][mdns:104]:   Hostname: revov-bms [07:53:31][V][mdns:105]:   Services: [07:53:31][V][mdns:107]:   - _esphomelib, _tcp, 6053 [07:53:31][V][mdns:109]:     TXT: version = 2022.12.1 [07:53:32][V][mdns:109]:     TXT: mac = ababababab [07:53:32][V][mdns:109]:     TXT: platform = ESP32 [07:53:32][V][mdns:109]:     TXT: board = esp32dev [07:53:32][V][mdns:109]:     TXT: network = wifi [07:53:32][V][mdns:109]:     TXT: project_name = syssi.esphome-jbd-bms [07:53:32][V][mdns:109]:     TXT: project_version = 1.3.0 [07:53:32][V][api:114]: Removing connection to Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>) [07:53:32][C][ota:093]: Over-The-Air Updates: [07:53:32][C][ota:094]:   Address: <IP_ADDRESS>:3232 [07:53:32][C][ota:097]:   Using Password. [07:53:32][C][api:138]: API Server: [07:53:32][C][api:139]:   Address: <IP_ADDRESS>:6053 [07:53:32][C][api:143]:   Using noise encryption: NO [07:53:33][VV][scheduler:196]: Running interval 'update' with interval=2000 last_execution=9232 (now=11236) [07:53:33][VV][jbd_bms_ble:425]: Send command: DD.A5.03.00.FF.FD.77 (7) [07:53:33][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=4 gattc_if=3 [07:53:33][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:33][VV][jbd_bms_ble:101]: Notification received: DD.<IP_ADDRESS>.5F.00.00.4A.DF.4E.<IP_ADDRESS>D.<IP_ADDRESS>.00 (20) [07:53:33][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:33][VV][jbd_bms_ble:101]: Notification received: <IP_ADDRESS>.<IP_ADDRESS>B.B<IP_ADDRESS>.4E.20.4A.DF.00.00.FA.C2 (20) [07:53:33][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:33][VV][jbd_bms_ble:101]: Notification received: 77 [07:53:33][W][jbd_bms_ble:114]: Maximum response size exceeded [07:53:33][W][jbd_bms_ble:132]: Invalid frame length [07:53:35][D][api:102]: Accepted ::FFFF:<IP_ADDRESS> [07:53:35][VV][api.service:434]: on_hello_request: HelloRequest {   client_info: 'Home Assistant 2022.12.6'   api_version_major: 1   api_version_minor: 7 } [07:53:35][V][api.connection:900]: Hello from client: 'Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>)' | API Version 1.7 [07:53:35][VV][api.service:013]: send_hello_response: HelloResponse {   api_version_major: 1   api_version_minor: 7   server_info: 'revov-bms (esphome v2022.12.1)'   name: 'revov-bms' } [07:53:35][VV][api.socket:810]: Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>): Connection closed [07:53:35][W][api.connection:083]: Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>): Connection closed [07:53:35][V][api:114]: Removing connection to Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>) [07:53:35][VV][scheduler:196]: Running interval 'update' with interval=2000 last_execution=11232 (now=13232) [07:53:35][VV][jbd_bms_ble:425]: Send command: DD.A5.03.00.FF.FD.77 (7) [07:53:35][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=4 gattc_if=3 [07:53:35][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:35][VV][jbd_bms_ble:101]: Notification received: DD.<IP_ADDRESS>.5F.00.00.4A.DF.4E.<IP_ADDRESS>D.<IP_ADDRESS>.00 (20) [07:53:35][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:35][VV][jbd_bms_ble:101]: Notification received: <IP_ADDRESS>.<IP_ADDRESS>B.B<IP_ADDRESS>.4E.20.4A.DF.00.00.FA.C2 (20) [07:53:35][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:35][VV][jbd_bms_ble:101]: Notification received: 77 [07:53:35][W][jbd_bms_ble:114]: Maximum response size exceeded [07:53:35][W][jbd_bms_ble:132]: Invalid frame length [07:53:37][VV][scheduler:196]: Running interval 'update' with interval=2000 last_execution=13232 (now=15232) [07:53:37][VV][jbd_bms_ble:425]: Send command: DD.A5.03.00.FF.FD.77 (7) [07:53:37][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=4 gattc_if=3 [07:53:37][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:37][VV][jbd_bms_ble:101]: Notification received: DD.<IP_ADDRESS>.5F.00.00.4A.DF.4E.<IP_ADDRESS>D.<IP_ADDRESS>.00 (20) [07:53:37][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:37][VV][jbd_bms_ble:101]: Notification received: <IP_ADDRESS>.<IP_ADDRESS>B.B<IP_ADDRESS>.4E.20.4A.DF.00.00.FA.C2 (20) [07:53:37][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:37][VV][jbd_bms_ble:101]: Notification received: 77 [07:53:37][W][jbd_bms_ble:114]: Maximum response size exceeded [07:53:37][W][jbd_bms_ble:132]: Invalid frame length [07:53:39][VV][scheduler:196]: Running interval 'update' with interval=2000 last_execution=15232 (now=17232) [07:53:39][VV][jbd_bms_ble:425]: Send command: DD.A5.03.00.FF.FD.77 (7) [07:53:39][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=4 gattc_if=3 [07:53:39][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:39][VV][jbd_bms_ble:101]: Notification received: DD.<IP_ADDRESS>.5F.00.00.4A.DF.4E.<IP_ADDRESS>D.<IP_ADDRESS>.00 (20) [07:53:39][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:39][VV][jbd_bms_ble:101]: Notification received: <IP_ADDRESS>.<IP_ADDRESS>B.B<IP_ADDRESS>.4E.20.4A.DF.00.00.FA.C2 (20) [07:53:39][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:39][VV][jbd_bms_ble:101]: Notification received: 77 [07:53:39][W][jbd_bms_ble:114]: Maximum response size exceeded [07:53:39][W][jbd_bms_ble:132]: Invalid frame length [07:53:41][D][api:102]: Accepted ::FFFF:<IP_ADDRESS> [07:53:41][VV][api.service:434]: on_hello_request: HelloRequest {   client_info: 'Home Assistant 2022.12.6'   api_version_major: 1   api_version_minor: 7 } [07:53:41][V][api.connection:900]: Hello from client: 'Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>)' | API Version 1.7 [07:53:41][VV][api.service:013]: send_hello_response: HelloResponse {   api_version_major: 1   api_version_minor: 7   server_info: 'revov-bms (esphome v2022.12.1)'   name: 'revov-bms' } [07:53:41][VV][api.socket:810]: Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>): Connection closed [07:53:41][W][api.connection:083]: Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>): Connection closed [07:53:41][V][api:114]: Removing connection to Home Assistant 2022.12.6 (::FFFF:<IP_ADDRESS>) [07:53:41][VV][scheduler:196]: Running interval 'update' with interval=2000 last_execution=17232 (now=19232) [07:53:41][VV][jbd_bms_ble:425]: Send command: DD.A5.03.00.FF.FD.77 (7) [07:53:41][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=4 gattc_if=3 [07:53:41][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:41][VV][jbd_bms_ble:101]: Notification received: DD.<IP_ADDRESS>.5F.00.00.4A.DF.4E.<IP_ADDRESS>D.<IP_ADDRESS>.00 (20) [07:53:41][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:41][VV][jbd_bms_ble:101]: Notification received: <IP_ADDRESS>.<IP_ADDRESS>B.B<IP_ADDRESS>.4E.20.4A.DF.00.00.FA.C2 (20) [07:53:41][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:41][VV][jbd_bms_ble:101]: Notification received: 77 [07:53:41][W][jbd_bms_ble:114]: Maximum response size exceeded [07:53:41][W][jbd_bms_ble:132]: Invalid frame length [07:53:43][VV][scheduler:196]: Running interval 'update' with interval=2000 last_execution=19232 (now=21232) [07:53:43][VV][jbd_bms_ble:425]: Send command: DD.A5.03.00.FF.FD.77 (7) [07:53:43][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=4 gattc_if=3 [07:53:43][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:43][VV][jbd_bms_ble:101]: Notification received: DD.<IP_ADDRESS>.5F.00.00.4A.DF.4E.<IP_ADDRESS>D.<IP_ADDRESS>.00 (20) [07:53:43][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:43][VV][jbd_bms_ble:101]: Notification received: <IP_ADDRESS>.<IP_ADDRESS>B.B<IP_ADDRESS>.4E.20.4A.DF.00.00.FA.C2 (20) [07:53:43][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:43][VV][jbd_bms_ble:101]: Notification received: 77 [07:53:43][W][jbd_bms_ble:114]: Maximum response size exceeded [07:53:43][W][jbd_bms_ble:132]: Invalid frame length [07:53:45][VV][api.service:470]: on_ping_request: PingRequest {} [07:53:45][VV][api.service:043]: send_ping_response: PingResponse {} [07:53:45][VV][scheduler:196]: Running interval 'update' with interval=2000 last_execution=21232 (now=23232) [07:53:45][VV][jbd_bms_ble:425]: Send command: DD.A5.03.00.FF.FD.77 (7) [07:53:45][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=4 gattc_if=3 [07:53:45][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:45][VV][jbd_bms_ble:101]: Notification received: DD.<IP_ADDRESS>.5F.00.00.4A.DF.4E.<IP_ADDRESS>D.<IP_ADDRESS>.00 (20) [07:53:45][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:45][VV][jbd_bms_ble:101]: Notification received: <IP_ADDRESS>.<IP_ADDRESS>B.B<IP_ADDRESS>.4E.20.4A.DF.00.00.FA.C2 (20) [07:53:45][V][esp32_ble_client:111]: [0] [AA:AA:AA:AA:AA:AA] gattc_event_handler: event=10 gattc_if=3 [07:53:45][VV][jbd_bms_ble:101]: Notification received: 77 [07:53:45][W][jbd_bms_ble:114]: Maximum response size exceeded [07:53:45][W][jbd_bms_ble:132]: Invalid frame length

Good job! I will extract the responses from the log now and try to get an idea what needs to be improved to support your model. In best case relaxing some upper limits is enough.

Please change your configuration yaml to this feature branch and compile + flash again:
``
substitutions:
external_components_source: github://syssi/esphome-jbd-bms@add-dp04s007-support

I've increased the `MAX_RESPONSE_SIZE` to not reject the 41 byte frames of your BMS anymore:

https://github.com/syssi/esphome-jbd-bms/pull/21/files

Looks like that did the trick! Thank you so much for such speedy assistance. Not seeing my device/entities yet under integrations but that is something else.
10:49:48][D][esp32_ble_tracker:327]: Starting scan...
[10:49:48][I][jbd_bms_ble:091]: Request device info
[10:49:48][D][jbd_bms_ble:266]: Hardware info:
[10:49:48][D][jbd_bms_ble:267]:   Device model:
[10:49:48][D][sensor:127]: 'revov-bms total voltage': Sending state 13.28000 V with 2 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms current': Sending state -4.88000 A with 1 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms power': Sending state -64.80640 W with 1 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms charging power': Sending state 0.00000 W with 2 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms discharging power': Sending state 64.80640 W with 2 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms capacity remaining': Sending state 190.14000 Ah with 2 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms nominal capacity': Sending state 200.00000 Ah with 2 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms charging cycles': Sending state 2.00000  with 0 decimals of accuracy
[10:49:48][D][jbd_bms_ble:284]:   Date of manufacture: 2022.8.20
[10:49:48][D][sensor:127]: 'revov-bms balancer status bitmask': Sending state 0.00000  with 0 decimals of accuracy
[10:49:48][D][binary_sensor:036]: 'revov-bms balancing': Sending state OFF
[10:49:48][D][sensor:127]: 'revov-bms errors bitmask': Sending state 0.00000  with 0 decimals of accuracy
[10:49:48][D][text_sensor:067]: 'revov-bms errors': Sending state ''
[10:49:48][D][sensor:127]: 'revov-bms software version': Sending state 2.30000  with 1 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms state of charge': Sending state 95.00000 % with 0 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms operation status bitmask': Sending state 3.00000  with 0 decimals of accuracy
[10:49:48][D][binary_sensor:036]: 'revov-bms charging': Sending state ON
[10:49:48][D][binary_sensor:036]: 'revov-bms discharging': Sending state ON
[10:49:48][D][sensor:127]: 'revov-bms battery strings': Sending state 4.00000  with 0 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms temperature 1': Sending state 25.80000 °C with 1 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms cell voltage 1': Sending state 3.32000 V with 3 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms cell voltage 2': Sending state 3.31900 V with 3 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms cell voltage 3': Sending state 3.31900 V with 3 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms cell voltage 4': Sending state 3.32200 V with 3 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms min cell voltage': Sending state 3.31900 V with 3 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms max cell voltage': Sending state 3.32200 V with 3 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms max voltage cell': Sending state 4.00000  with 0 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms min voltage cell': Sending state 2.00000  with 0 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms delta cell voltage': Sending state 0.00300 V with 4 decimals of accuracy
[10:49:48][D][sensor:127]: 'revov-bms average cell voltage': Sending state 3.32000 V with 4 decimals of accuracy
[10:49:50][D][jbd_bms_ble:266]: Hardware info:
[10:49:50][D][jbd_bms_ble:267]:   Device model:
[10:49:50][D][sensor:127]: 'revov-bms total voltage': Sending state 13.28000 V with 2 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms current': Sending state -4.88000 A with 1 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms power': Sending state -64.80640 W with 1 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms charging power': Sending state 0.00000 W with 2 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms discharging power': Sending state 64.80640 W with 2 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms capacity remaining': Sending state 190.12999 Ah with 2 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms nominal capacity': Sending state 200.00000 Ah with 2 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms charging cycles': Sending state 2.00000  with 0 decimals of accuracy
[10:49:50][D][jbd_bms_ble:284]:   Date of manufacture: 2022.8.20
[10:49:50][D][sensor:127]: 'revov-bms balancer status bitmask': Sending state 0.00000  with 0 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms errors bitmask': Sending state 0.00000  with 0 decimals of accuracy
[10:49:50][D][text_sensor:067]: 'revov-bms errors': Sending state ''
[10:49:50][D][sensor:127]: 'revov-bms software version': Sending state 2.30000  with 1 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms state of charge': Sending state 95.00000 % with 0 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms operation status bitmask': Sending state 3.00000  with 0 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms battery strings': Sending state 4.00000  with 0 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms temperature 1': Sending state 25.80000 °C with 1 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms cell voltage 1': Sending state 3.32000 V with 3 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms cell voltage 2': Sending state 3.31900 V with 3 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms cell voltage 3': Sending state 3.31900 V with 3 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms cell voltage 4': Sending state 3.32200 V with 3 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms min cell voltage': Sending state 3.31900 V with 3 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms max cell voltage': Sending state 3.32200 V with 3 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms max voltage cell': Sending state 4.00000  with 0 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms min voltage cell': Sending state 2.00000  with 0 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms delta cell voltage': Sending state 0.00300 V with 4 decimals of accuracy
[10:49:50][D][sensor:127]: 'revov-bms average cell voltage': Sending state 3.32000 V with 4 decimals of accuracy

You are welcome! Could you do me a favor? This implementation sends three different requests to the BMS:

>>> DD:A5:03:00:FF:FD:77
>>> DD:A5:04:00:FF:FC:77
>>> DD:A5:05:00:FF:FB:77

You've provided an response example for request 1 already. I'm looking for example of type 2 and 3. I've pushed some more debug statements to the feature branch. Could you compile & flash the node again. This time you should see some raw traffic again:
Cell info frame (%d bytes): [...]
Hardware info frame (%d bytes): [...]
Hardware version frame (%d bytes): [...]

https://github.com/syssi/esphome-jbd-bms/pull/21/files
Could you provide these raw frames? Thanks!

If you have used this ESP32 in the past as ESPHome node already with a different hostname you have to remove the old node (host)name from Home Assistant first. If you add the new ESPHome device afterwards the device + all entities should show up properly.

Did not see the hardware version frame showing up
[15:16:55][D][jbd_bms_ble:251]: Hardware info frame (34 bytes):
[15:16:55][D][jbd_bms_ble:252]:   05.5E.00.00.4B.4D.4E.<IP_ADDRESS>D.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.0B.AF.<IP_ADDRESS>E.20.4B.4D.00.00 (34)
[15:16:55][D][jbd_bms_ble:272]: Hardware info:
[15:16:55][D][jbd_bms_ble:273]:   Device model:
[15:16:55][D][sensor:127]: 'revov-bms total voltage': Sending state 13.74000 V with 2 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms current': Sending state 0.00000 A with 1 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms power': Sending state 0.00000 W with 1 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms charging power': Sending state 0.00000 W with 2 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms discharging power': Sending state 0.00000 W with 2 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms capacity remaining': Sending state 192.76999 Ah with 2 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms nominal capacity': Sending state 200.00000 Ah with 2 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms charging cycles': Sending state 2.00000  with 0 decimals of accuracy
[15:16:55][D][jbd_bms_ble:290]:   Date of manufacture: 2022.8.20
[15:16:55][D][sensor:127]: 'revov-bms balancer status bitmask': Sending state 0.00000  with 0 decimals of accuracy
[15:16:55][D][binary_sensor:036]: 'revov-bms balancing': Sending state OFF
[15:16:55][D][sensor:127]: 'revov-bms errors bitmask': Sending state 0.00000  with 0 decimals of accuracy
[15:16:55][D][text_sensor:067]: 'revov-bms errors': Sending state ''
[15:16:55][D][sensor:127]: 'revov-bms software version': Sending state 2.30000  with 1 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms state of charge': Sending state 96.00000 % with 0 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms operation status bitmask': Sending state 3.00000  with 0 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms battery strings': Sending state 4.00000  with 0 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms temperature 1': Sending state 26.00000 °C with 1 decimals of accuracy
[15:16:55][D][jbd_bms_ble:200]: Cell info frame (8 bytes):
[15:16:55][D][jbd_bms_ble:201]:   0D.52.0D.56.0D.57.0D.B4 (8)
[15:16:55][D][sensor:127]: 'revov-bms cell voltage 1': Sending state 3.41000 V with 3 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms cell voltage 2': Sending state 3.41400 V with 3 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms cell voltage 3': Sending state 3.41500 V with 3 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms cell voltage 4': Sending state 3.50800 V with 3 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms min cell voltage': Sending state 3.41000 V with 3 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms max cell voltage': Sending state 3.50800 V with 3 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms max voltage cell': Sending state 4.00000  with 0 decimals of accuracy
[15:16:55][D][sensor:127]: 'revov-bms min voltage cell': Sending state 1.00000  with 0 decimals of accuracy
[15:16:56][D][sensor:127]: 'revov-bms delta cell voltage': Sending state 0.09800 V with 4 decimals of accuracy
[15:16:56][D][sensor:127]: 'revov-bms average cell voltage': Sending state 3.43675 V with 4 decimals of accuracy
[15:16:57][D][jbd_bms_ble:251]: Hardware info frame (34 bytes):
[15:16:57][D][jbd_bms_ble:252]:   05.5E.00.00.4B.4D.4E.<IP_ADDRESS>D.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.0B.AF.<IP_ADDRESS>E.20.4B.4D.00.00 (34)
[15:16:57][D][jbd_bms_ble:272]: Hardware info:
[15:16:57][D][jbd_bms_ble:273]:   Device model:
[15:16:57][D][sensor:127]: 'revov-bms total voltage': Sending state 13.74000 V with 2 decimals of accuracy

The hardware version frame is requested once if the BLE connection is established. Please use the
switch:
  - platform: ble_client
    ble_client_id: client0
    name: "${name} enable bluetooth connection"

switch to turn off the BLE connection + turn it on again. This time you should see the hardware version frame  at the log.

I don't seem to see that frame when turning off and on the ble connection.
When I turn off I get this:
[16:14:51][D][switch:017]: 'Revov enable bluetooth connection' Turning OFF.
[16:14:51][I][ble_client:041]: [AA:AA:AA:AA:AA:AA] Disabling BLE client.
[16:14:51][D][switch:056]: 'Revov enable bluetooth connection': Sending state OFF
[16:14:51][D][esp-idf:000]: W (1866637) BT_HCI: hci cmd send: disconnect: hdl 0x0, rsn:0x13
[16:14:51][D][esp-idf:000]: W (1866640) BT_APPL: gattc_conn_cb: if=3 st=0 id=3 rsn=0x16
[16:14:51][D][esp-idf:000]: W (1866683) BT_HCI: hcif disc complete: hdl 0x0, rsn 0x16
When turning back on it seems to start with hardware info frame followed by cell info frame but no sign of the version frame.

Alright. It looks like your BMS doesn't support this response. Thanks for your support! I will merge the feature branch into main now. Please don't forget to update your YAML.

Feel free to close this issue if it's resolved.

Thanks so much for the help!

thanks for your work. Everything worked for me. I added the status led and total energy charged and total energy discharged, daily energy charged and daily energy discharged


Fix pyarrow build error on GDS server

Combined with https://github.com/neo-technology/graph-analytics/pull/5983

 [PF] Find out flaky python client


Fix/time logic

sry this was meant to be based of a fork of this repo, not for this parent repo

@leizmonk no problem man .. i encourage you to submit pull requests to this one too

@Ahmadposten oh cool! i paired your lib up with https://www.npmjs.com/package/slackbots to provide some more customization. Two things I worked on:

Create an option that only runs the reminder bot during specified work hours and days. Right now, it's configured directly in the index.js but I can extract those to env vars.
Create a reminder-fetch command that when received by a linked slackbots bot will trigger a reminder to the user that sent the command.

If either of these sound interesting to you, I can create a couple PRs with those changes and submit.

@leizmonk both are very interesting specially the working hours issue .. I am also interested in making customizable messages .. let us team up

@Ahmadposten ok cool - when i get some time, i'll organize what i have into PRs and submit. slackbots is super easy to set up also. Aside from manual reminders, for now, I just have some easter eggs hah


PLT-7566 Add docker images for marlowe-apps

Pre-submit checklist:

Branch

[ ] Tests are provided (if possible)
[ ] Test report is updated (if relevant)
[x] Commit sequence broadly makes sense
[x] Key commits have useful messages
[ ] Relevant tickets are mentioned in commit messages
[x] Formatting, PNG optimization, etc. are updated

PR

[x] Self-reviewed the diff
[x] Useful pull request description

Review required
[x] Substantial changes to code, test, or documentation
[ ] Change made to Marlowe validator (@bwbush and @palas must be included as reviewers)
Review not required
[ ] Minor changes to non-critical code, documentation, nix derivations, configuration files, or scripts
[ ] Formatting, spelling, grammar, or reorganization

[x] Reviewer requested

Fixes https://github.com/input-output-hk/marlowe-starter-kit/issues/42


ENYO-2530: Focus move to breadcrumb when press left on panel item

Issue:
When we press left key without move mouse just after panel transition by
mouse click (Still there is no focus), Spotlight neighbor routine is
drop half plane from the mouse point.
So, focus move to breadcrumb even if there is focusable item under the
mouse.
Fix:
When _calculateNearestNeighbor called from getNearestPointerNeighbor,
oControl is not passed. So, filter out contains case here only when
called from getNearestPointerNeighbor .
Enyo-DCO-1.1-Signed-off-by: Kunmyon Choi<EMAIL_ADDRESS>

Closing PR as Jira has been closed.


Fix wrong return type in canvas.glsl

ERROR: _display_error_with_code: CanvasShaderGLES3: Fragment Program Compilation Failed: 0:166(2): error: `return' with wrong type int, in function `map_ninepatch_axis' returning float
caused by e4907e50feab1af05f514a66adc0086d1c141885
and 6546735f23b8b6bd7e2a7679168edc9d9fb9ae51

My bad - I wondered about this but assumed it would be fine... Forgot this was glsl and not C.

Thanks!


Collapse - collapses automatically after opening, ( bootstrap.min.js)

When clicking on a collapsed item, the item opens but is visible for < 1 second before collapsing automatically. Seems to be a problem with the .min.js version where
<div class="collapse active" id="xxx"
instead of:
<div class="collapse in" id="xxx"
Does work:
https://raw.githubusercontent.com/twbs/bootstrap/v4-dev/dist/js/bootstrap.js
Does not work:
https://raw.githubusercontent.com/twbs/bootstrap/v4-dev/dist/js/bootstrap.min.js
Using example from https://v4-alpha.getbootstrap.com/components/collapse/:
Html from browser running in develop mode (boostrap.js), which is OK:

    Link with href

  <button aria-controls="collapseExample" aria-expanded="true" class="btn btn-primary" data-target="#collapseExample" data-toggle="collapse" type="button">
    Button with data-target
  </button>

    Anim pariatur cliche reprehenderit...

Html from browser running the bostrap.min.js version, which is auto collapsing:
...

    Anim pariatur cliche reprehenderit...

Tested in browsers:

Chrome Version 57.0.2987.133 (64-bit)
Firefox Version 52.0.2

Os: Mac OS X

I think in general you shouldn't rely on the /dist/ versions in the branch to contain all the fixes etc done in the branch, since they're not consistently rebuilt (to my knowledge anyway) when PRs/changes get merged. Safest always to grab the latest state of the branch and build your own.

Totally agree with @patrickhlauke and you should add a CodePen or JSBin to demonstrate your issue thank you

Thank you, I am also facing the same issue, then I got this and it is resolved.
Thanks a lot


glTF skinning and morphing animations

This is a revival, rebase, and a substantial rewrite of #151
cc @alteous - if you want to check out how the bones are traversed without caching the world transforms

@alteous thanks for taking a look!

I'm not sure who removed this but beware of possible copyright violation.

does the shader code match anything licensed? I thought you wrote it, and then I changed it more. If there are still lines under license, I'd like to rewrite them anyway.

It seems you are traversing the scene graph (hub.walk) three times every frame. IIRC, you were pretty adamant about not traversing it more than once in the original PR.

You might have misunderstood me then. I said previously that ideally in some not far future we'd want to only traverse the graph once and collect all the render data into appropriate buckets for GPU. That doesn't in any way force this change to go crazy out of scope, especially since there were already multiple passes over the graph before it.
And that ideal scenario was brought up as an argument to not cache those world transforms (or anything, really, we are almost functional!). As you can see, bone transforms are fitting the scheme just fine.

The majority of the shader code was taken from https://github.com/KhronosGroup/glTF-WebGL-PBR/tree/master/shaders. I adapted the code for use with gfx changed its style to reflect ours.

Thanks!
Bors r=vitvakatu

On Feb 24, 2018, at 06:17, David Harvey-Macaulay<EMAIL_ADDRESS>wrote:
@alteous commented on this pull request.
In src/material.rs:

@@ -19,7 +19,7 @@ pub mod basic {
/// Renders triangle meshes with a solid color or texture.
#[derive(Clone, Hash, Debug, PartialEq, Eq)]
pub struct Basic {

   /// Solid color applied in the absense of `map`.

   /// Solid color applied in the absence of `map`.

TIL.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.


BUMP_DELAY = 0

seeing no discussion on #424, giving us BUMP_DELAY = 0 to try out.  Any objections?

This may also resolve #418 as a happy side effect...hmm...although I haven't tested it extensively enough.

(no, #418 still happens sometimes)

Given the resurgent discussion on #424, should I ignore this for now?

yep, thanks :P


Request clangd provide semantic highlight for builtin functions and classes like Xcode.

Xcode can display different colors for builtin functions and types, like cpp std libraries and system provided frameworks.
This feature can improve clangd's highlight experience much more better.
Best wishes.

Clangd supports the defaultLibrary token modifier from the LSP spec, a theme can use it to color the std + framework libraries just like Xcode does.

That's great! I use coc.nvim as LSP client, seems like coc.nvim does not provide token modifier highlight infos.
Thanks for you info.

(I don't believe we apply the modifier to things in std though. We could, if this is useful - my sense is modifiers aren't widely used)


Don't remove the last semicolon in style attributes by default

@kireerik could you please give us an example and a reason why it should be so?

@jakubpawlowicz I am extremely sorry for creating this issue. I have passed by something, and I thought it is an invalid markup, but it isn't.

No worries!

On 6 Jun 2017, at 22:39, Erik Engi<EMAIL_ADDRESS>wrote:
Closed #949.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.


my fix doesnt work

klept0, im still working on a fix for the list index. apparently ms patched it? sometimes it does more than 35 searches.

Your fix for closing out the app worked perfect - if you look at the code in my repo I integrated it with the fix for searches. Feel free to drop by the telegram group and chat if you have more questions!

Your fix for closing out the app worked perfect - if you look at the code in my repo I integrated it with the fix for searches. Feel free to drop by the telegram group and chat if you have more questions!

ok thanks. i think i will start helping to apply fixes to this repo, instead of the orginal https://github.com/charlesbel/Microsoft-Rewards-Farmer.


Combination of icon + text -> text gets cutted

I'm using an font-awesome icon + some text string and e.g. the letter "g" gets cutted on the bottom.

My code for the login UIButton:
self.loginButton.titleLabel?.font = UIFont.fontAwesome(ofSize: 20)
self.loginButton.setTitle("Login " + String.fontAwesomeIcon(name: .arrowCircleRight), for: .normal)

Code for the logout BarButtonItem
let attributes = [NSAttributedStringKey.font: UIFont.fontAwesome(ofSize: 17)] as [NSAttributedStringKey: Any]
self.logoutButton.setTitleTextAttributes(attributes, for: .normal)
self.logoutButton.setTitleTextAttributes(attributes, for: .selected)
self.logoutButton.title = String.fontAwesomeIcon(name: .signOut) + " Logout"

This can be caused by the height of the button not making room for the titleLabel content. Can you make sure this isn't the case?

@OlafAndreas
Height is fine. Tested even much too big label and still occurs

I was able to reproduce the problem you're describing.
One solution might be:

Create a NSMutableAttributedString for the icon with FontAwesome font.
Create a NSAttributedString for the title with the font you want.
Append title string to icon string.
Set setAttributedTitle of button with the icon string.

Note: the fonts used should have the same size or else they will not align on the vertical axis. You could have different sizes but then you must calculate the difference between them and use that as a baselineOffset.
Please see if this covers your needs :)

@OlafAndreas
I just had the exact same issue as @M-HERBRICH-ITC, so I tried your solution and wanted to let you know that it worked perfectly! For anyone who likes to just copy and paste:
let icon = NSMutableAttributedString(string: String.fontAwesomeIcon(name: .cog), attributes: [.font: UIFont.fontAwesome(ofSize: 17)])
let text = NSAttributedString(string: " Settings", attributes: [.font: UIFont.systemFont(ofSize: 17)])
icon.append(text)
settingsButton.setAttributedTitle(icon, for: .normal)

I'm glad to hear it, maybe this is something that could be implemented into the framework.
@thii, what do you think?


Adding Ultra-Lite container

This is a Container-Interop compliant container, implementing the Delegate Lookup feature.

Any feedback on the container itself would be very gratefully received, btw!

I don't think it implements the delegate lookup feature. For that I think it needs to call the get method on the delegate container with the same service id.

But the spec says "Calls to the get method should [...] return an entry if the entry is part of the container".  I thought this meant that if the service exists, it should return the result.  The point is that if the delegate container is set, it should be used in producing any required dependencies needed in the creation of the requested service.
@mnapoli what's your view on this?

Indeed, maybe I was too fast in responding; I looked a your code and responded from the phone.
I now understood how the ultra-lite container works.
The container is not doing any dependencies lookup himself but is letting the factories to do it.
I don't have anything against the pull request.

Thanks very much for your suggestion.  I will make the docs better :-)

:+1: after having a look it seems to me that the delegate feature is implemented correctly

Completely agree. Delegate feature lookup is implemented correctly.
On a side note: Ultra-lite container is looking a lot (some minor differences still) like Picotainer or like Acclimate's ArrayContainer.

@moufmouf wow, you've got a point.  I hadn't seen Picotainer before, but they are spookily similar.  I'll update my docs and put a link to it.
Thanks for the feedback guys.


SignedAtalaOperation secp256k1 signature compatibility

There are a lot of DID operations observed on mainnet that don't pass the signature validation. The secp256k1 signature of SignedAtalaOperation should be investigated since it is known that most (if not all) operations on mainnet were signed by JVM libararies (bitcoinj / BouncyCastle).

Probably a good idea to bring in test vectors from this PR
https://github.com/hyperledger/identus-apollo/pull/154

Resolved by https://github.com/patextreme/neoprism/pull/7


Spike artifacts appearing in certain viewing angles

When importing my 3D Gaussian Splatting model into Supersplat editor, I'm observing numerous spike-like artifacts in the point cloud. These artifacts have the following characteristics:

They appear as needle-like protrusions from the main object
The artifacts are particularly noticeable when viewing parallel to the main object surface
When rotating to an oblique angle, the artifacts become less visible
After deleting these spike artifacts, they tend to reappear

Questions

Is this a known issue with 3DGS models in Supersplat?
Are there any recommended settings or approaches to minimize these artifacts?
Could this be related to the optimization process during the initial 3DGS training?

Here's the splat file

Hi @RobLinkA,
It looks like this scene just contains very long and thin gaussian splats. I can select and delete them, but as you say, they appear and disappear depending on the view angle making it difficult to remove them all.
I also tried isolating them on the SPLAT DATA panel, by volume or surface area but didn't manage.
How did you train this scene? My first guess is the trainer is generating bad data. I will look at the raw file next though, perhaps it includes NaNs or similar.

After deleting these spike artifacts, they tend to reappear

This shouldn't happen though...

After further investigation, I found the spike artifacts are not from the original training, but appear after scaling the model:

Original models (both standard 3DGS and Postshot):

Are normal without any spike artifacts
Display correct visualization from all angles

After scaling operation:

Standard 3DGS model shows spike artifacts
Artifacts are especially visible when viewing parallel to the main object
Different viewing angles affect the visibility of artifacts

This suggests the problem might be related to how Gaussian parameters (scale, shape, orientation) are handled during the scaling operation (for this case it's not done in Supersplat). The spikes could be a result of improper scaling of these parameters, causing some Gaussians to be abnormally stretched. So is there a recommended way to scale 3DGS models while preserving Gaussian properties? Thank you!

Hi @RobLinkA,
Have you tried scaling in SuperSplat instead? I haven't heard any users having issues with this.

After further investigation, I found the spike artifacts are not from the original training, but appear after scaling the model:

Original models (both standard 3DGS and Postshot):

Are normal without any spike artifacts
Display correct visualization from all angles

After scaling operation:

Standard 3DGS model shows spike artifacts
Artifacts are especially visible when viewing parallel to the main object
Different viewing angles affect the visibility of artifacts

This suggests the problem might be related to how Gaussian parameters (scale, shape, orientation) are handled during the scaling operation (for this case it's not done in Supersplat). The spikes could be a result of improper scaling of these parameters, causing some Gaussians to be abnormally stretched. So is there a recommended way to scale 3DGS models while preserving Gaussian properties? Thank you!

The scale are calculated with log functions: if you want to scale a gaussian,  use scale += scaling_ratio instead of scale *= scaling_ratio.


Release 2.0.1

On the docket:

[x] pex --index-url=... fails in 2.0.0 #794

N.B.: There are two more issues on the API side left over from #790 but I'll push this one out to fix our more numerous CLI users quickly.


Error when adding video to "My List"

I'm submitting a ...

[ x] bug report
[ ] feature request
[ ] support request

General infomration
Prerequisites

[x ] Are you running the latest version?

Description
When selecting a video and adding to My List, an error message pops up.
Steps to Reproduce

Select Video
Add to My List

Expected behavior: [What you expected to happen]
Video would be added to My List in Netflix
Actual behavior: [What actually happened]
Error message and video is not added to My List in Netflix
Context (Environment)
Installation

[x ] I installed the plugin via zip from the Releases page
[x ] I´m using the Netflix Repo
[ ] I´m using a different source (Please tell which)

Operating System

[ x] Linux (x86/x64)
[ ] OSX (x86/x64)
[ ] Windows (x86/x64)
[ ] Linux (ARM)
[ ] Android

Additional informatin on the environment
Arch based Linux with Kodi 18 alpha 1
Debug log
https://pastebin.com/0dD8AdJN

It seems than Netflix refuse your request : Error 401, not authorized, then response is empty...
Are you try to unlogged and reauth from the addon ?

Also some strange behaviour when removing items from My List, variable as to effect.
Best case was, item moved to bottom of my list, then disappeared next time list was viewd.
Worst case was a crash.

Sorry, I've been away a few days @Dodobibi .  I will try to logout and login again to see if that corrects it.  I should also note that it was 0.13.6 and I have not yet tried 0.13.7

I've just tried logging out and back in and confirmed the same thing happens.  I've just updated to 0.13.7 as well with the same results.  It errors for both adding and removing videos from my list.  Are there any other tasks I could try that might lead to some useful troubleshooting information?

@Dodobibi I thought I would check on this since there hasn't been activity for a while.  Are others having issues with "My List" or is this unique to me?  It also seems that when I play videos with this addon that it does not add them to the recently watched category.

I've got the exact same problem. After an update to 0.13.10 I could not find my recently viewed category. Therefore I wanted to use add to my list to have my currently viewing series at hand. Any time I want to add anything to my list I get the error in the pastebin:
https://pastebin.com/ckSFi8UQ
I'm on Milhouse libreelec on a RPI3.

Same error on my OSMC.

Adding / removing to my list is working fine on a clean setup. Please try with the newest version and start with a clean slate, i.e. deleting addon data.

@caphm I should be able to try this out in the next couple of days.

@caphm Unfortunately this still doesn't work. I have uninstalled the Netflix plugin with removing addon settings, installed it again (version 0.13.12 as available in the plugin repository), logged in with my credentials and tried to remove the item from My list. No success.

Please provide a debug log with the clean setup. Ideally right after newly installing the add-on. Thanks.

@caphm I am still experiencing the issue as well.  Here is the debug log after clean setup.
https://pastebin.com/gvJ2ZqYQ

Please post the full log, as the issue might have its roots before the parts you posted, thanks.

Sure thing.  Full debug log is here:
https://pastebin.com/TLdBAwtS
I believe the log includes loading kodi, installing the addon, then launching, logging in, going to my list, and trying to remove the video from my list.  Let me know if you need additional info.

I removed the link to your log, since it contained your Netflix credentials (debug messages by Kodi as to which keys were handled while you were logging in).
The log looks fine so far. The only way I was able to reproduce was by supplying a wrong authURL with the request. But this should be correct, since you can use all other API operations successfully... I'll provide you with a temp release that'll output more debug info. Could take a couple of days though, I'm swamped at work right now.
In the meantime: does it only happen with this particular show? Can you add or remove other items to "my list"?

Whoops.  Is that key just the ESN number?  If you let me know I will cut it out of the log and repost it.

No, the authURL is a session specific key that is extracted from the Netflix website data.
Can you please install this modified release and post another debug log: https://github.com/caphm/plugin.video.netflix/archive/debug_383.zip
Thanks.

Sorry, there was a typo in a variable name, my bad. I pushed a fix, please download and install the zip again.

I'll give it a try tonight.  Do you have any details on posting debug logs without the authURL info?

Posting the authURL ist fine, as it's worthless without the cookie. The reason I removed the link to your log was because one could read your email and password (the credentials you use to log into your Netflix account) out of it.
When debug logging is enabled, Kodi also logs all keypresses. Thus, when you logged into your account, all the keypresses for entering your email and password were also logged.

@caphm, one other thing I noticed recently is that if I make a change to my list from another source, like a web browser, it is not reflected in the kodi plugin until I exit and reopen kodi.  Is there any other info I can share at this time?

I suspect it's got something to do with using mutltiple profiles (where you are not using the first one in the list). I'm sorry but this will take some time to fix as I am busy with work currently and can only attend to simple issues. I'll let you know if anything comes up.

Thanks for the response @caphm.  No worries, I just wanted to post my latest observation.  This is relatively minor and it is great to have this plugin so that I dont have to switch inputs, remotes, etc to watch Netflix.  Thanks for your efforts.

I confirm I have the same issue. I do have multiple accounts and I'm not using the first one in the list. Tried clean install with other accounts and got the same error as reported above. Using 0.13.13.

I'd just like to report that I have this same problem.  I tried reporting and asking for help in the kodi.tv forums here: https://forum.kodi.tv/showthread.php?tid=329767&pid=2787169#pid2787169
I, too, am using a secondary profile when I have this problem.  It works fine with the primary profile.

Leave it open for now, as it'll only be fixed once the PR is merged ;) Good to see this is confirmed as fixed, though.

@caphm would it be possible to add this fix to the next 0.13 release as well? As I understand, this was fixed only in 0.14.0, but as I see, there are still problems with that heavily refactored version and it is not sure when it will be stable enough to be released, it might still take a lot of time until 0.14.0 is out and stable.

Issue still persists

'My List' works in the "CastagnaIT" build/fork.  We've been using it at my house for a number of weeks with no issues, multiple profiles. The only function not working is 'Export'.
https://github.com/CastagnaIT/plugin.video.netflix


how to initial workflow when i create new database record? ("Call to a member function getTos() on null" Error)

Hi
when I try to use a workflow, I get an error like this:
Call to a member function getTos() on null

my config/workflow.php file :
<?php

return [
    'straight'   => [
        'type'          => 'workflow',
        'marking_store' => [
            'type'      => 'multiple_state',
            'arguments' => ['state']
        ],
        'supports'      => ["App\Task"],
        'places'        => ['draft', 'review', 'publish'],
        'transitions'   => [
            'drafting' => [
                'from' => 'draft',
                'to'   => 'review',
            ],
            'reviewing' => [
                'from' => 'review',
                'to'   => 'publish',
            ]
        ],
    ]
];

my Controller :
public function store(Request $request)
    {
        // validate the given request
        $data = $this->validate($request, [
            'title' => 'required|string|max:255',
        ]);

        // create a new incomplete task with the given title
        $task = Auth::user()->tasks()->create([
            'title' => $data['title'],
        ]);

        $task->workflow_apply('drafting');

        // flash a success message to the session
        session()->flash('status', 'Task Created!');

        // redirect to tasks index
        return redirect('/tasks');
    }

how i can initialize state of my task when i create new task?

@sjavadez - what version of laravel and php are you running? Can you please dump your composer.json file here for reference? Thank you ✌

This is an issue in relationship to the Symfony workflow component itself. In Symfony 4.2.9+ the "entered" event is fired when the workflow enters the initial place for the first time. It does so without a transition--hence getTos() on null.
Easiest fix is lock the version of the Symfony Workflow component to 4.2.8. I've fixed this in my version of this, and can open a PR on this one if need be.

Thanks @zerodahero
i want use multiple_state type and must add the array cast onto my marking:
// on your Task model:
protected $casts = [
    "state" => "array"
];

Closing this. @zerodahero answered you question @sjavadez .


implementing listview and column layout

closes #3

Codecov Report
Patch coverage: 90.62% and project coverage change: -0.81 :warning:

Comparison is base (a47bc76) 100.00% compared to head (2a6e1c3) 99.19%.

:exclamation: Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more.
Additional details and impacted files
@@             Coverage Diff             @@
##            master       #4      +/-   ##
===========================================
- Coverage   100.00%   99.19%   -0.81%
===========================================
  Files           34       34
  Lines          355      373      +18
===========================================
+ Hits           355      370      +15
- Misses           0        3       +3

Impacted Files
Coverage Δ

lib/src/enums/design_grid_row_alignment.dart
100.00% <ø> (ø)

lib/src/widgets/design_grid_row.dart
100.00% <ø> (ø)

lib/src/material/widgets/material_design_grid.dart
93.33% <81.25%> (-6.67%)
:arrow_down:

...src/responsive/widgets/responsive_design_grid.dart
100.00% <100.00%> (ø)

...onsive/widgets/responsive_design_grid_builder.dart
100.00% <100.00%> (ø)

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Do you have feedback about the report comment? Let us know in this issue.


[WIP][Fix] Solve the problem of lvis AP degradation in 3.x

After refactoring to MMDet 3.x, the AP of lvis is reduced. This PR is going to fix this bug.
Description of the problem
In MMDet 2.x, get_cat_ids is directly obtained from self.coco (which means self.lvis in MMDet 3.x):
https://github.com/open-mmlab/mmdetection/blob/e9cae2d0787cd5c2fc6165a6061f92fa09e48fb1/mmdet/datasets/coco.py#L106-L119
While, in 3.x, it is obtained from self.data_info:
https://github.com/open-mmlab/mmdetection/blob/05f42355edb901e41264e680b7f225f6a4a23689/mmdet/datasets/base_det_dataset.py#L110-L120
Some instances will be filtered when loading annotation. Hence, in ClassBalancedDataset, cat_ids may empty. (This is the core problem that AP reduced in 3.x)
for idx in range(num_images):
    cat_ids = set(self.dataset.get_cat_ids(idx))
    if len(cat_ids) != 0:
         repeat_factor = max(
            {category_repeat[cat_id]
             for cat_id in cat_ids})
          repeat_factors.append(repeat_factor)

If the cat_ids is empty, the operation will be skipped. And the length of the repeat_factors will not equal to len(self.dataset). The index of the image without any label will be replaced by the next image, and this will cause error.
repeat_indices = []
for dataset_index, repeat_factor in enumerate(repeat_factors):
    repeat_indices.extend([dataset_index] * math.ceil(repeat_factor))

Results
Released results in mmdet2.x:
{"mode": "val", "epoch": 12, "iter": 7674, "lr": 0.0002, "bbox_AP": 0.225, "bbox_AP50": 0.369, "bbox_AP75": 0.238, "bbox_APs": 0.168, "bbox_APm": 0.297, "bbox_APl": 0.35, "bbox_APr": 0.091, "bbox_APc": 0.211, "bbox_APf": 0.301,
 "bbox_mAP_copypaste": "AP:0.225 AP50:0.369 AP75:0.238 APs:0.168 APm:0.297 APl:0.350 APr:0.091 APc:0.211 APf:0.301",
 "segm_AP": 0.217, "segm_AP50": 0.343, "segm_AP75": 0.23, "segm_APs": 0.152, "segm_APm": 0.294, "segm_APl": 0.351, "segm_APr": 0.096, "segm_APc": 0.21, "segm_APf": 0.278,
 "segm_mAP_copypaste": "AP:0.217 AP50:0.343 AP75:0.230 APs:0.152 APm:0.294 APl:0.351 APr:0.096 APc:0.210 APf:0.278"}

After fixing this error:
03/28 15:12:01 - mmengine - INFO - Evaluating bbox...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=300 catIds=all] = 0.229
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=300 catIds=all] = 0.376
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=300 catIds=all] = 0.239
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=     s | maxDets=300 catIds=all] = 0.173
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=     m | maxDets=300 catIds=all] = 0.300
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=     l | maxDets=300 catIds=all] = 0.350
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=300 catIds=  r] = 0.105
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=300 catIds=  c] = 0.213
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=300 catIds=  f] = 0.300
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=300 catIds=all] = 0.313
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=     s | maxDets=300 catIds=all] = 0.219
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=     m | maxDets=300 catIds=all] = 0.402
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=     l | maxDets=300 catIds=all] = 0.480
03/28 15:22:23 - mmengine - INFO - Evaluating segm...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=300 catIds=all] = 0.223
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=300 catIds=all] = 0.350
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=300 catIds=all] = 0.238
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=     s | maxDets=300 catIds=all] = 0.158
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=     m | maxDets=300 catIds=all] = 0.297
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=     l | maxDets=300 catIds=all] = 0.354
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=300 catIds=  r] = 0.117
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=300 catIds=  c] = 0.214
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=300 catIds=  f] = 0.279
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=300 catIds=all] = 0.303
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=     s | maxDets=300 catIds=all] = 0.202
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=     m | maxDets=300 catIds=all] = 0.396
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=     l | maxDets=300 catIds=all] = 0.479
03/28 15:34:31 - mmengine - INFO - Epoch(val) [12][2477/2477]  lvis/bbox_AP: 0.2290  lvis/bbox_AP50: 0.3760  lvis/bbox_AP75: 0.2390  lvis/bbox_APs: 0.1730  lvis/bbox_APm: 0.3000  lvis/bbox_APl: 0.3500  lvis/bbox_APr: 0.1050  lvis/bbox_APc: 0.2130  lvis/bbox_APf: 0.3000  lvis/segm_AP: 0.2230  lvis/segm_AP50: 0.3500  lvis/segm_AP75: 0.2380  lvis/segm_APs: 0.1580  lvis/segm_APm: 0.2970  lvis/segm_APl: 0.3540  lvis/segm_APr: 0.1170  lvis/segm_APc: 0.2140  lvis/segm_APf: 0.2790

Way to fix this problem
Right now, we have temporarily solved this problem using the original solution, i.e. use 2.x get_cat_ids way (obtained from self.lvis.
We need to find a more elegant way to solve this error.

Closed due to MMEngine has fix this error


Implement AVX-512 support

[x] Extend build system to do AVX-512 builds
[x] Investigate whether Travis can be instructed to run the Intel SDE for AVX-512 tests
[ ] Investigate how large the difference to the MIC implementation would be
[ ] depending on the above: fork/extend MIC or AVX2 to support AVX-512

Hi, I would be highly interested in that enhancement and could offer testing. Is there a time line for this feature?
To my experience so far, intrinsics code written for KNC SIMD instructions compiled without problems for an AVX512 (using the Intel compiler), so at least initial support should be relatively easy to accomplish.

Hi noma, thanks for your offer and info. I have not set up a development environment for KNL / Skylake-AVX512 at this point. @svalleco is working on KNL support, though. I'd be very happy for any kind of help on this front. My plate is currently full with 70% parental leave and a priority on C++ standardization...
It would be best if you and @svalleco can coordinate efforts to share the work.

AVX512 is implemented in the mkretz/datapar branch, which is to become Vc 2.0 once the P0214 proposal is merged into the next WG21 TS.


[cli] add command uptime to cli

This PR adds a command uptime to print how long the device has been running.

If this is for debugging, should we provide a option to condition out this feature?

We can use OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE if this is for debugging only.
But personally I think this is a good command to have for all CLI devices.

@bukepo @simonlingoogle The command "uptime" is used to check how long the device has started or reset. Sometimes, the device is accidentally reset. We can use this command to check this case. All platforms are able to support it. I thought it is a common command,  it may be a good choice to enable it on all platforms. Comments?


Description of values of the StringProfile to be added

A multi line description for explaining the respective meaning of the values

'string-profile-1-0:STRING_VALUE_TYPE_REACTIVE'
'string-profile-1-0:STRING_VALUE_TYPE_SANITATION'
'string-profile-1-0:STRING_VALUE_TYPE_PROTECTION'
'string-profile-1-0:STRING_VALUE_TYPE_OFF'

of the enumeration at the PUT method of path
/core-model-1-4:control-construct/profile-collection/profile=okm-0-0-1-string-p-0000/string-profile-1-0:string-profile-pac/string-profile-configuration/string-value
needs to be added.
Required Changes to the OAS:

The value 'string-profile-1-0:STRING_VALUE_TYPE_SANITATION' shall be deleted from the modeling, since necessary data is no longer provided by the ApplicationLayerTopology application.

The following description shall be added to the PUT method for setting the value of the String:

description: >
  'reactive: a new value gets written into the operationKey attributes at server and connected clients, whenever a link update got notified (/v1/regard-updated-link)
   protection: new values get periodically written into the operationKey attributes at servers and connected clients
   off: no automated changes to the values of the operationKey attributes at servers or clients
  '

When OperationKeyManagement(OKM) is operating in the reactive mode , once a link is approved by the ApplicationLayerTopology(ALT) , OKM updates the operation-key immediately to the approved client application.

When OKM is operating in the protection mode , once a link is approved by the ALT , OKM will not update the operation-key immediately. OKM updates the operation-key in its next cycle(max delay = 5 mins).
Disadvantage :
In Protection mode, client application may receive operation-key with a delay.

Proposals :
Can we modify the description of the Protection mode mentioned in the comment to include functionality to immediately update the operation-key after got notified by /v1/regard-updated-link,
Proposal#1 :
protection: a new value gets written into the operationKey attributes at server and connected clients, whenever a link update got notified (/v1/regard-updated-link) and new values get periodically written into the operationKey attributes at servers and connected clients.

Proposal#2 :
protection: a new value gets written into the operationKey attributes at server and connected clients, whenever a link update got notified (/v1/regard-updated-link) and gets periodically updated.

It's been agreed that "protection" mode can work as "reaction" + updating keys in cycles.
There are two more things to discuss:

What should /v1/regard-updated-link do and return when mode is "off"?
When mode "off" is going to be enabled, should there be any other logic executed besides stopping of sending cyclic update (when we go from "protection" to "off")?

Updated Proposal for changes to the OAS:

The value 'string-profile-1-0:STRING_VALUE_TYPE_SANITATION' shall be deleted from the modeling, since necessary data is no longer provided by the ApplicationLayerTopology application.

The following description shall be added to the PUT method for setting the value of the String:

description: >
  'reactive: A new value gets written into the operationKey attributes at server and connected clients, whenever a link update got notified (/v1/regard-updated-link).
   protection: A new value gets written into the operationKey attributes at server and connected clients, whenever a link update got notified (/v1/regard-updated-link) and this value gets periodically changed afterwards.
   off: The application assures open interfaces by periodically writing the default value into the operationKey attributes at servers and clients.
  '

The descriptions needs to be added to putStringProfileStringValue

The description shall be updated for the REACTIVE mode from
"reactive: A new value gets written into the operationKey attributes at server and connected clients, whenever a link update got notified (/v1/regard-updated-link))"
to
"reactive: After an initial walk through, a new value gets written into the operationKey attributes at server and connected clients, whenever a link update got notified (/v1/regard-updated-link))"

Following comment added:
description: >
  'reactive: After initially updating the keys at all servers and clients, a new value gets written into the operationKey attributes at server and connected clients, whenever a link update got notified (/v1/regard-updated-link))
  protection: A new value gets written into the operationKey attributes at server and connected clients, whenever a link update got notified (/v1/regard-updated-link) and this value gets periodically changed afterwards.
  off: The default value gets written into the operationKey attributes at server and connected clients, whenever a link update got notified (/v1/regard-updated-link) and periodically again afterwards.'