ZJ BENY - changing current gives invalid JSON error

Version of the custom_component
OCPP: v0.5.1
ZJ BENY: v1.0.31  BCP-A2N-L
Describe the bug
When I change the charging current it starts giving errors and the device goes offline for about 25 seconds before coming back online, then repeating.
I can see in the logs that it is reporting that the message is not valid JSON and ChatGPT suggests the issue is the leading comma before the first object in the 'sampledValue' array. Would that be causing the unit to become unresponsive. If so, does this mean there is an issue with the firmware, or is there a possible work around to get the unit stable?
Debug log

2024-02-06 19:06:21.580 INFO (MainThread) [ocpp] charger: send [2,"f2b57d3b-1d2d-47ec-ab9d-d3778b0fc8e7","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}]
2024-02-06 19:06:21.977 INFO (MainThread) [ocpp] charger: receive message [3,"f2b57d3b-1d2d-47ec-ab9d-d3778b0fc8e7",{"configurationKey":[{"key":"ChargingScheduleAllowedChargingRateUnit","readonly":true,"value":"Current,Power"}]}]
2024-02-06 19:06:21.978 INFO (MainThread) [ocpp] charger: send [2,"0e75fc9a-1906-4d7a-a1cf-00a1d47bcecf","GetConfiguration",{"key":["ChargeProfileMaxStackLevel"]}]
2024-02-06 19:06:22.084 INFO (MainThread) [ocpp] charger: receive message [3,"0e75fc9a-1906-4d7a-a1cf-00a1d47bcecf",{"configurationKey":[{"key":"ChargeProfileMaxStackLevel","readonly":true,"value":"10"}]}]
2024-02-06 19:06:22.090 INFO (MainThread) [ocpp] charger: send [2,"768714ab-5d43-4da1-96d2-4e9ada87eaa6","SetChargingProfile",{"connectorId":0,"csChargingProfiles":{"chargingProfileId":8,"stackLevel":10,"chargingProfileKind":"Relative","chargingProfilePurpose":"ChargePointMaxProfile","chargingSchedule":{"chargingRateUnit":"A","chargingSchedulePeriod":[{"startPeriod":0,"limit":19.0}]}}}]
2024-02-06 19:06:22.235 INFO (MainThread) [ocpp] charger: receive message [3,"768714ab-5d43-4da1-96d2-4e9ada87eaa6",{"status":"Accepted"}]
2024-02-06 19:06:33.831 INFO (MainThread) [ocpp] charger: send [2,"9ccb5185-bc1a-4329-8c26-41caa55f457e","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}]
2024-02-06 19:07:03.834 INFO (MainThread) [ocpp] charger: send [2,"9315d242-e8ee-49a9-87bd-9d957bcd6e86","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}]
2024-02-06 19:07:03.835 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection] [140343519912896] Waited 30s for response on [2,"9ccb5185-bc1a-4329-8c26-41caa55f457e","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}].
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/asyncio/tasks.py", line 500, in wait_for
    return fut.result()
           ^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/asyncio/queues.py", line 158, in get
    await getter
asyncio.exceptions.CancelledError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 327, in call
    response = await self._get_specific_response(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/ocpp/api.py", line 893, in _get_specific_response
    resp = await super()._get_specific_response(unique_id, timeout)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 361, in _get_specific_response
    response = await asyncio.wait_for(self._response_queue.get(), timeout)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/asyncio/tasks.py", line 502, in wait_for
    raise exceptions.TimeoutError() from exc
TimeoutError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 238, in handle_call_service
    response = await hass.services.async_call(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2149, in async_call
    response_data = await coro
                    ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2186, in _execute_service
    return await target(service_call)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 272, in handle_service
    return await service.entity_service_call(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 882, in entity_service_call
    single_response = await _handle_entity_call(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 952, in _handle_entity_call
    result = await task
             ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/number/__init__.py", line 111, in async_set_value
    await entity.async_set_native_value(native_value)
  File "/config/custom_components/ocpp/number.py", line 129, in async_set_native_value
    resp = await self.central_system.set_max_charge_rate_amps(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/ocpp/api.py", line 289, in set_max_charge_rate_amps
    return await self.charge_points[cp_id].set_charge_rate(limit_amps=value)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/ocpp/api.py", line 605, in set_charge_rate
    resp = await self.get_configuration(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/ocpp/api.py", line 828, in get_configuration
    resp = await self.call(req)
           ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 331, in call
    raise asyncio.TimeoutError(
TimeoutError: Waited 30s for response on [2,"9ccb5185-bc1a-4329-8c26-41caa55f457e","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}].
2024-02-06 19:07:04.168 INFO (MainThread) [ocpp] charger: receive message [3,"9315d242-e8ee-49a9-87bd-9d957bcd6e86",{"configurationKey":[{"key":"ChargingScheduleAllowedChargingRateUnit","readonly":true,"value":"Current,Power"}]}]
2024-02-06 19:07:04.169 INFO (MainThread) [ocpp] charger: send [2,"5680766b-54f2-45c2-9f9e-c621d7fc7bc1","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}]
2024-02-06 19:07:04.277 INFO (MainThread) [ocpp] charger: receive message [3,"5680766b-54f2-45c2-9f9e-c621d7fc7bc1",{"configurationKey":[{"key":"ChargingScheduleAllowedChargingRateUnit","readonly":true,"value":"Current,Power"}]}]
2024-02-06 19:07:04.278 INFO (MainThread) [ocpp] charger: send [2,"29bfe3b5-dc38-410c-9346-7dbe8e12f909","GetConfiguration",{"key":["ChargeProfileMaxStackLevel"]}]
2024-02-06 19:07:04.398 INFO (MainThread) [ocpp] charger: receive message [3,"29bfe3b5-dc38-410c-9346-7dbe8e12f909",{"configurationKey":[{"key":"ChargeProfileMaxStackLevel","readonly":true,"value":"10"}]}]
2024-02-06 19:07:04.400 INFO (MainThread) [ocpp] charger: send [2,"01d17eac-8ec3-478d-bd1c-9fa2422c3769","GetConfiguration",{"key":["ChargeProfileMaxStackLevel"]}]
2024-02-06 19:07:04.499 INFO (MainThread) [ocpp] charger: receive message [3,"01d17eac-8ec3-478d-bd1c-9fa2422c3769",{"configurationKey":[{"key":"ChargeProfileMaxStackLevel","readonly":true,"value":"10"}]}]
2024-02-06 19:07:04.501 INFO (MainThread) [ocpp] charger: send [2,"5f9dd208-f771-4cfa-887a-682c18ecea15","SetChargingProfile",{"connectorId":0,"csChargingProfiles":{"chargingProfileId":8,"stackLevel":10,"chargingProfileKind":"Relative","chargingProfilePurpose":"ChargePointMaxProfile","chargingSchedule":{"chargingRateUnit":"A","chargingSchedulePeriod":[{"startPeriod":0,"limit":25.0}]}}}]
2024-02-06 19:07:04.751 INFO (MainThread) [ocpp] charger: receive message [3,"5f9dd208-f771-4cfa-887a-682c18ecea15",{"status":"Accepted"}]
2024-02-06 19:07:04.752 INFO (MainThread) [ocpp] charger: send [2,"a876aa5a-5cd7-4246-ae0f-3c3d7ad49305","SetChargingProfile",{"connectorId":0,"csChargingProfiles":{"chargingProfileId":8,"stackLevel":10,"chargingProfileKind":"Relative","chargingProfilePurpose":"ChargePointMaxProfile","chargingSchedule":{"chargingRateUnit":"A","chargingSchedulePeriod":[{"startPeriod":0,"limit":13.0}]}}}]
2024-02-06 19:07:05.091 INFO (MainThread) [ocpp] charger: receive message [3,"a876aa5a-5cd7-4246-ae0f-3c3d7ad49305",{"status":"Accepted"}]
2024-02-06 19:07:25.122 INFO (MainThread) [ocpp] charger: send [2,"aaccc5b5-1f1f-428b-914d-5b78b54b09cb","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}]
2024-02-06 19:07:25.459 INFO (MainThread) [ocpp] charger: receive message [3,"aaccc5b5-1f1f-428b-914d-5b78b54b09cb",{"configurationKey":[{"key":"ChargingScheduleAllowedChargingRateUnit","readonly":true,"value":"Current,Power"}]}]
2024-02-06 19:07:25.461 INFO (MainThread) [ocpp] charger: send [2,"d7c1959c-aed7-41dd-bd22-e60eaa4c10a7","GetConfiguration",{"key":["ChargeProfileMaxStackLevel"]}]
2024-02-06 19:07:25.595 INFO (MainThread) [ocpp] charger: receive message [3,"d7c1959c-aed7-41dd-bd22-e60eaa4c10a7",{"configurationKey":[{"key":"ChargeProfileMaxStackLevel","readonly":true,"value":"10"}]}]
2024-02-06 19:07:25.596 INFO (MainThread) [ocpp] charger: send [2,"ceab6279-3351-4bee-b9ad-07079e5e3f93","SetChargingProfile",{"connectorId":0,"csChargingProfiles":{"chargingProfileId":8,"stackLevel":10,"chargingProfileKind":"Relative","chargingProfilePurpose":"ChargePointMaxProfile","chargingSchedule":{"chargingRateUnit":"A","chargingSchedulePeriod":[{"startPeriod":0,"limit":32.0}]}}}]
2024-02-06 19:07:25.744 INFO (MainThread) [ocpp] charger: receive message [3,"ceab6279-3351-4bee-b9ad-07079e5e3f93",{"status":"Accepted"}]
2024-02-06 19:07:54.535 DEBUG (MainThread) [custom_components.ocpp] Connection latency from 'central' to 'charger': ping=0.0 ms, pong=388.0 ms
2024-02-06 19:07:57.251 INFO (MainThread) [ocpp] charger: send [2,"42c54a18-42aa-4aa5-baeb-38a53f084b04","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}]
2024-02-06 19:07:57.411 INFO (MainThread) [ocpp] charger: receive message [3,"42c54a18-42aa-4aa5-baeb-38a53f084b04",{"configurationKey":[{"key":"ChargingScheduleAllowedChargingRateUnit","readonly":true,"value":"Current,Power"}]}]
2024-02-06 19:07:57.412 DEBUG (MainThread) [custom_components.ocpp] Get Configuration for ChargingScheduleAllowedChargingRateUnit: Current,Power
2024-02-06 19:07:57.412 INFO (MainThread) [custom_components.ocpp] Charger supports setting the following units: Current,Power
2024-02-06 19:07:57.412 INFO (MainThread) [custom_components.ocpp] If more than one unit supported default unit is Amps
2024-02-06 19:07:57.413 INFO (MainThread) [ocpp] charger: send [2,"6377e2ce-78a6-49bd-ab8e-28f2b00fa7ed","GetConfiguration",{"key":["ChargeProfileMaxStackLevel"]}]
2024-02-06 19:07:57.544 INFO (MainThread) [ocpp] charger: receive message [3,"6377e2ce-78a6-49bd-ab8e-28f2b00fa7ed",{"configurationKey":[{"key":"ChargeProfileMaxStackLevel","readonly":true,"value":"10"}]}]
2024-02-06 19:07:57.546 DEBUG (MainThread) [custom_components.ocpp] Get Configuration for ChargeProfileMaxStackLevel: 10
2024-02-06 19:07:57.547 INFO (MainThread) [ocpp] charger: send [2,"93034109-3401-4fa0-a489-788a9641b987","SetChargingProfile",{"connectorId":0,"csChargingProfiles":{"chargingProfileId":8,"stackLevel":10,"chargingProfileKind":"Relative","chargingProfilePurpose":"ChargePointMaxProfile","chargingSchedule":{"chargingRateUnit":"A","chargingSchedulePeriod":[{"startPeriod":0,"limit":14.0}]}}}]
2024-02-06 19:07:57.694 INFO (MainThread) [ocpp] charger: receive message [3,"93034109-3401-4fa0-a489-788a9641b987",{"status":"Accepted"}]
2024-02-06 19:08:06.627 INFO (MainThread) [ocpp] charger: send [2,"6ecd5bbb-0b49-4936-a324-001a3c95676e","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}]
2024-02-06 19:08:06.833 INFO (MainThread) [ocpp] charger: receive message [3,"6ecd5bbb-0b49-4936-a324-001a3c95676e",{"configurationKey":[{"key":"ChargingScheduleAllowedChargingRateUnit","readonly":true,"value":"Current,Power"}]}]
2024-02-06 19:08:06.834 DEBUG (MainThread) [custom_components.ocpp] Get Configuration for ChargingScheduleAllowedChargingRateUnit: Current,Power
2024-02-06 19:08:06.834 INFO (MainThread) [custom_components.ocpp] Charger supports setting the following units: Current,Power
2024-02-06 19:08:06.834 INFO (MainThread) [custom_components.ocpp] If more than one unit supported default unit is Amps
2024-02-06 19:08:06.835 INFO (MainThread) [ocpp] charger: send [2,"48e78bba-ebec-4c72-b4f3-b3bb55a9b404","GetConfiguration",{"key":["ChargeProfileMaxStackLevel"]}]
2024-02-06 19:08:06.967 INFO (MainThread) [ocpp] charger: receive message [3,"48e78bba-ebec-4c72-b4f3-b3bb55a9b404",{"configurationKey":[{"key":"ChargeProfileMaxStackLevel","readonly":true,"value":"10"}]}]
2024-02-06 19:08:06.968 DEBUG (MainThread) [custom_components.ocpp] Get Configuration for ChargeProfileMaxStackLevel: 10
2024-02-06 19:08:06.969 INFO (MainThread) [ocpp] charger: send [2,"257ccf76-9843-47d5-b176-7c5eaa82dd5f","SetChargingProfile",{"connectorId":0,"csChargingProfiles":{"chargingProfileId":8,"stackLevel":10,"chargingProfileKind":"Relative","chargingProfilePurpose":"ChargePointMaxProfile","chargingSchedule":{"chargingRateUnit":"A","chargingSchedulePeriod":[{"startPeriod":0,"limit":32.0}]}}}]
2024-02-06 19:08:07.118 INFO (MainThread) [ocpp] charger: receive message [3,"257ccf76-9843-47d5-b176-7c5eaa82dd5f",{"status":"Accepted"}]
2024-02-06 19:08:14.700 DEBUG (MainThread) [custom_components.ocpp] Connection latency from 'central' to 'charger': ping=0.0 ms, pong=162.0 ms
2024-02-06 19:08:35.108 DEBUG (MainThread) [custom_components.ocpp] Connection latency from 'central' to 'charger': ping=0.0 ms, pong=407.0 ms
2024-02-06 19:08:55.238 DEBUG (MainThread) [custom_components.ocpp] Connection latency from 'central' to 'charger': ping=0.0 ms, pong=129.0 ms
2024-02-06 19:08:58.223 INFO (MainThread) [ocpp] charger: receive message [2,"3w5c2fuqqfzmnexl3w4g93rq","StatusNotification",{"connectorId":1,"errorCode":"NoError","status":"Preparing","timestamp":"2024-02-06T08:08:58Z"}]
2024-02-06 19:08:58.224 INFO (MainThread) [ocpp] charger: send [3,"3w5c2fuqqfzmnexl3w4g93rq",{}]
2024-02-06 19:09:03.323 INFO (MainThread) [ocpp] charger: send [2,"cf7ca473-36a1-4c4a-9976-28817badcad1","GetConfiguration",{"key":["AuthorizeRemoteTxRequests"]}]
2024-02-06 19:09:03.463 INFO (MainThread) [ocpp] charger: receive message [3,"cf7ca473-36a1-4c4a-9976-28817badcad1",{"configurationKey":[{"key":"AuthorizeRemoteTxRequests","readonly":false,"value":"false"}]}]
2024-02-06 19:09:03.464 DEBUG (MainThread) [custom_components.ocpp] Get Configuration for AuthorizeRemoteTxRequests: false
2024-02-06 19:09:03.468 INFO (MainThread) [ocpp] charger: send [2,"c785ab85-368c-42af-8203-340830c6e2b8","RemoteStartTransaction",{"idTag":"charger","connectorId":1}]
2024-02-06 19:09:03.567 INFO (MainThread) [ocpp] charger: receive message [3,"c785ab85-368c-42af-8203-340830c6e2b8",{"status":"Accepted"}]
2024-02-06 19:09:03.844 INFO (MainThread) [ocpp] charger: receive message [2,"0kzq33gkhf81p7w76wfd5szx","StartTransaction",{"connectorId":1,"idTag":"charger","meterStart":139954,"timestamp":"2024-02-06T08:09:04Z"}]
2024-02-06 19:09:03.849 DEBUG (MainThread) [custom_components.ocpp] id_tag='charger' not found in auth_list, default authorization_status='Accepted'
2024-02-06 19:09:03.851 INFO (MainThread) [ocpp] charger: send [3,"0kzq33gkhf81p7w76wfd5szx",{"transactionId":1707206943,"idTagInfo":{"status":"Accepted"}}]
2024-02-06 19:09:04.583 INFO (MainThread) [ocpp] charger: receive message [2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]
2024-02-06 19:09:04.583 ERROR (MainThread) [ocpp] Unable to parse message: '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]', it doesn't seem to be valid OCPP: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 83, in unpack
    msg = json.loads(msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 155 (char 154)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 175, in route_message
    msg = unpack(raw_msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 85, in unpack
    raise FormatViolationError(
ocpp.exceptions.FormatViolationError: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
2024-02-06 19:09:09.593 INFO (MainThread) [ocpp] charger: receive message [2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]
2024-02-06 19:09:09.594 ERROR (MainThread) [ocpp] Unable to parse message: '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]', it doesn't seem to be valid OCPP: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 83, in unpack
    msg = json.loads(msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 155 (char 154)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 175, in route_message
    msg = unpack(raw_msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 85, in unpack
    raise FormatViolationError(
ocpp.exceptions.FormatViolationError: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
2024-02-06 19:09:14.603 INFO (MainThread) [ocpp] charger: receive message [2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]
2024-02-06 19:09:14.604 ERROR (MainThread) [ocpp] Unable to parse message: '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]', it doesn't seem to be valid OCPP: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 83, in unpack
    msg = json.loads(msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 155 (char 154)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 175, in route_message
    msg = unpack(raw_msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 85, in unpack
    raise FormatViolationError(
ocpp.exceptions.FormatViolationError: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
2024-02-06 19:09:15.311 DEBUG (MainThread) [custom_components.ocpp] Connection latency from 'central' to 'charger': ping=0.0 ms, pong=72.0 ms
2024-02-06 19:09:19.613 INFO (MainThread) [ocpp] charger: receive message [2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]
2024-02-06 19:09:19.614 ERROR (MainThread) [ocpp] Unable to parse message: '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]', it doesn't seem to be valid OCPP: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 83, in unpack
    msg = json.loads(msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 155 (char 154)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 175, in route_message
    msg = unpack(raw_msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 85, in unpack
    raise FormatViolationError(
ocpp.exceptions.FormatViolationError: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9386nmn4ktjx4znjck54b8k2","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:05Z","sampledValue":[,{"value":"139954","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
2024-02-06 19:09:30.429 INFO (MainThread) [ocpp] charger: send [2,"706efad7-87ba-4350-a864-6572dd94159b","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}]
2024-02-06 19:09:33.616 DEBUG (MainThread) [custom_components.ocpp] Connection closed to 'charger': no close frame received or sent
2024-02-06 19:09:33.616 INFO (MainThread) [custom_components.ocpp] Charger charger disconnected from <IP_ADDRESS>:9000.
2024-02-06 19:09:36.361 INFO (MainThread) [custom_components.ocpp] Websocket Subprotocol matched: ocpp1.6
2024-02-06 19:09:36.361 INFO (MainThread) [custom_components.ocpp] Charger websocket path=///charger
2024-02-06 19:09:36.361 INFO (MainThread) [custom_components.ocpp] Charger charger reconnected to <IP_ADDRESS>:9000.
2024-02-06 19:09:36.361 DEBUG (MainThread) [custom_components.ocpp] Reconnect websocket to charger
2024-02-06 19:09:37.153 INFO (MainThread) [ocpp] charger: receive message [2,"t99o4weaxjsy5tl1p5xk2h7b","StatusNotification",{"connectorId":1,"errorCode":"NoError","status":"Charging","timestamp":"2024-02-06T08:09:05Z"}]
2024-02-06 19:09:37.154 INFO (MainThread) [ocpp] charger: send [3,"t99o4weaxjsy5tl1p5xk2h7b",{}]
2024-02-06 19:09:37.522 INFO (MainThread) [ocpp] charger: receive message [2,"b4r3j7d3r1dlbnvm2zfwpu0s","StatusNotification",{"connectorId":0,"errorCode":"NoError","status":"Available","timestamp":"2024-02-06T08:09:36Z"}]
2024-02-06 19:09:37.523 INFO (MainThread) [ocpp] charger: send [3,"b4r3j7d3r1dlbnvm2zfwpu0s",{}]
2024-02-06 19:09:37.897 INFO (MainThread) [ocpp] charger: receive message [2,"q6pvnqrzkknby78vpg13y0b9","StatusNotification",{"connectorId":1,"errorCode":"NoError","status":"Charging","timestamp":"2024-02-06T08:09:36Z"}]
2024-02-06 19:09:37.898 INFO (MainThread) [ocpp] charger: send [3,"q6pvnqrzkknby78vpg13y0b9",{}]
2024-02-06 19:09:38.289 INFO (MainThread) [ocpp] charger: receive message [2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]
2024-02-06 19:09:38.289 ERROR (MainThread) [ocpp] Unable to parse message: '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]', it doesn't seem to be valid OCPP: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 83, in unpack
    msg = json.loads(msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 155 (char 154)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 175, in route_message
    msg = unpack(raw_msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 85, in unpack
    raise FormatViolationError(
ocpp.exceptions.FormatViolationError: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
2024-02-06 19:09:43.300 INFO (MainThread) [ocpp] charger: receive message [2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]
2024-02-06 19:09:43.301 ERROR (MainThread) [ocpp] Unable to parse message: '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]', it doesn't seem to be valid OCPP: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 83, in unpack
    msg = json.loads(msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 155 (char 154)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 175, in route_message
    msg = unpack(raw_msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 85, in unpack
    raise FormatViolationError(
ocpp.exceptions.FormatViolationError: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
2024-02-06 19:09:48.312 INFO (MainThread) [ocpp] charger: receive message [2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]
2024-02-06 19:09:48.312 ERROR (MainThread) [ocpp] Unable to parse message: '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]', it doesn't seem to be valid OCPP: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 83, in unpack
    msg = json.loads(msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 155 (char 154)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 175, in route_message
    msg = unpack(raw_msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 85, in unpack
    raise FormatViolationError(
ocpp.exceptions.FormatViolationError: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
2024-02-06 19:09:53.318 INFO (MainThread) [ocpp] charger: receive message [2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]
2024-02-06 19:09:53.318 ERROR (MainThread) [ocpp] Unable to parse message: '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]', it doesn't seem to be valid OCPP: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 83, in unpack
    msg = json.loads(msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 155 (char 154)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 175, in route_message
    msg = unpack(raw_msg)
          ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/messages.py", line 85, in unpack
    raise FormatViolationError(
ocpp.exceptions.FormatViolationError: FormatViolationError: Payload for Action is syntactically incorrect or structure for Action, {'cause': 'Message is not valid JSON', 'ocpp_message': '[2,"9lmha8x27fuad8cemfzn5bxr","MeterValues",{"connectorId":1,"transactionId":1707206943,"meterValue":[{"timestamp":"2024-02-06T08:09:37Z","sampledValue":[,{"value":"139955","context":"Sample.Periodic","measurand":"Energy.Active.Import.Register","format":"Raw","unit":"Wh"},{"value":"0","measurand":"Power.Active.Import","format":"Raw","unit":"W"}]}]}]'}
2024-02-06 19:09:56.634 DEBUG (MainThread) [custom_components.ocpp] Connection latency from 'central' to 'charger': ping=0.0 ms, pong=271.0 ms
2024-02-06 19:10:00.430 INFO (MainThread) [ocpp] charger: send [2,"acbd2b61-8c20-4ae7-80bf-ff76c1236f57","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}]
2024-02-06 19:10:00.430 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection] [140343519912896] Waited 30s for response on [2,"706efad7-87ba-4350-a864-6572dd94159b","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}].
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/asyncio/tasks.py", line 500, in wait_for
    return fut.result()
           ^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/asyncio/queues.py", line 158, in get
    await getter
asyncio.exceptions.CancelledError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 327, in call
    response = await self._get_specific_response(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/ocpp/api.py", line 893, in _get_specific_response
    resp = await super()._get_specific_response(unique_id, timeout)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 361, in _get_specific_response
    response = await asyncio.wait_for(self._response_queue.get(), timeout)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/asyncio/tasks.py", line 502, in wait_for
    raise exceptions.TimeoutError() from exc
TimeoutError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 238, in handle_call_service
    response = await hass.services.async_call(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2149, in async_call
    response_data = await coro
                    ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2186, in _execute_service
    return await target(service_call)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 272, in handle_service
    return await service.entity_service_call(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 882, in entity_service_call
    single_response = await _handle_entity_call(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 952, in _handle_entity_call
    result = await task
             ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/number/__init__.py", line 111, in async_set_value
    await entity.async_set_native_value(native_value)
  File "/config/custom_components/ocpp/number.py", line 129, in async_set_native_value
    resp = await self.central_system.set_max_charge_rate_amps(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/ocpp/api.py", line 289, in set_max_charge_rate_amps
    return await self.charge_points[cp_id].set_charge_rate(limit_amps=value)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/ocpp/api.py", line 605, in set_charge_rate
    resp = await self.get_configuration(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/ocpp/api.py", line 828, in get_configuration
    resp = await self.call(req)
           ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/ocpp/charge_point.py", line 331, in call
    raise asyncio.TimeoutError(
TimeoutError: Waited 30s for response on [2,"706efad7-87ba-4350-a864-6572dd94159b","GetConfiguration",{"key":["ChargingScheduleAllowedChargingRateUnit"]}].
2024-02-06 19:10:05.971 INFO (MainThread) [custom_components.ocpp] Websocket Subprotocol matched: ocpp1.6
2024-02-06 19:10:05.971 INFO (MainThread) [custom_components.ocpp] Charger websocket path=///charger
2024-02-06 19:10:05.971 INFO (MainThread) [custom_components.ocpp] Charger charger reconnected to <IP_ADDRESS>:9000.
2024-02-06 19:10:05.971 DEBUG (MainThread) [custom_components.ocpp] Reconnect websocket to charger
2024-02-06 19:10:05.971 DEBUG (MainThread) [custom_components.ocpp] Closing websocket to 'charger'
2024-02-06 19:10:08.826 INFO (MainThread) [ocpp] charger: receive message [2,"8ihps4pd1460etv1yj2ra5nb","StatusNotification",{"connectorId":0,"errorCode":"NoError","status":"Available","timestamp":"2024-02-06T08:10:06Z"}]
2024-02-06 19:10:08.827 INFO (MainThread) [ocpp] charger: send [3,"8ihps4pd1460etv1yj2ra5nb",{}]
2024-02-06 19:10:08.828 DEBUG (MainThread) [custom_components.ocpp] Closing websocket to 'charger'
2024-02-06 19:10:09.197 INFO (MainThread) [ocpp] charger: receive message [2,"zfx0uomszb7rw369wbkz7zoc","StatusNotification",{"connectorId":1,"errorCode":"NoError","status":"Charging","timestamp":"2024-02-06T08:10:06Z"}]
2024-02-06 19:10:09.198 INFO (MainThread) [ocpp] charger: send [3,"zfx0uomszb7rw369wbkz7zoc",{}]
2024-02-06 19:10:19.072 DEBUG (MainThread) [custom_components.ocpp] Connection closed to 'charger': sent 1000 (OK); no close frame received
2024-02-06 19:10:19.073 INFO (MainThread) [custom_components.ocpp] Charger charger disconnected from <IP_ADDRESS>:9000.

I finally got my ZJ Beny connected to OCPP today. I get this issue as well.  BCP-AT2N-L firmware 1.0.31.
Though I am stoked to be able to use the on/off via HA instead of the tedious Bluetooth control!

I appear to have the same issue. During charging, the charger becomes unavailable for 25 seconds or so. Then recovers after 40 seconds. This cycle repeats throughout the charging session.
BCP-AT2N-P by Benyi Firmware: 1.0.31

On the Charge HQ site, it mentions a similar issue: https://chargehq.net/kb/zj-beny-ev-charger-configuration#:~:text=There is a known issue,caused by the charger itself.

There is a known issue where ZJ Beny chargers will frequently disconnect and reconnect to Charge HQ. This can happen tens or even hundreds of times per day. You may see a "charger offline" error message in Charge HQ which appears and disappears frequently.

This issue is caused by the charger itself. It doesn't generally lead to any problems, as the charger should reconnect quickly each time.

We are hoping that this issue will be resolved by a firmware update from ZJ Beny.

Although, when I've used Charge HQ, it seems to work fine. Maybe they have worked around any bug... Have either of you had any success in Charge HQ?

Thanks for covering the Charge HQ side, I'd been wondering about that. I assumed similar to above - that Charge HQ users must get the same issue, but that they must have worked around the bad data in their OCPP implementation.
I got in touch with the company that sold me the ZJ Beny, Ultipower in Australia. I wasn't expecting much but they've got in contact with ZJ Beny and at least by appearances we're getting engagement.
A few days ago I tried to dig into the error and the code to see how one might workaround the charger bug when using this HA project. Other issue threads has people mentioning that it's possible, I think I saw for the Grizzl-E. But I couldn't figure out how to edit (permanently or in a nice way) the messages.py in the underlying OCPP Python project that this HA project uses. I'd appreciate any tips, though I suspect any workaround like that could be truly nasty. Best to get ZJ Beny to fix. How long that will take, who knows.
I got this response from ZJ Beny:
I have sent your information to our engineer this morning.

But he want to get below informations of Home Assistant, so that we can solve this issue.

1) URL address:
2) WEB or APP Account:
3) Pile Number:

So could you please provide your account of Home Assistant for our reference?

I think they're asking to access my server >.<. Which is not something I'll be doing as I haven't setup any remote access yet. I honestly don't know how to respond and assist them just yet. If anyone can safely provide them their server I can connect you.

I just connected my Benyi to ChargeHQ. Connection State = Online. Status = Charging.  Looks stable over several minutes.
Chargehq says they've tested Benyi firmware 1.0.14 and 1.0.23. But my 1.0.31 works ok.
CP-AT2N-P by Benyi Firmware: 1.0.31

I think they're asking to access my server >.<. Which is not something I'll be doing as I haven't setup any remote access yet. I honestly don't know how to respond and assist them just yet. If anyone can safely provide them their server I can connect you.

I bought from Ultipower as well. Their contact at ZJ Beny has sent me a similar request.
I've setup a sandboxed home assistant install with the charger connected and sent them the details to access it. So, hopefully that helps them work out the problem.

Here's the response I got back from ZJ Beny after I followed them up. Pretty disappointing.

Sorry for the late reply, due to the customer visited us last week.
Our engineer have login and test the Home Assistant.
This program is a free charge software, and will be often offline after connected.
Their Open Source Server has the problem, will not respone the message from EV Charger.
It is better to use our EV-BOX (EVB) App, free charge to use, more stable than Home Assistant.
Please note and feel free to let me know if any question, thank you.

wow that's quite disappointing. They should do better, and present a much better argument than "HA is free open source therefore it's bad".
How to reply and continue.... hmm. So it's not that I think that the JSON error is an absolute smoking gun. We can acknowledge the ambiguity coming from an interface between the ZJ Beny and a server.
I'll email them in my own thread as well, but I think the pressure to apply is in OCPP capability and compliance. While we cannot assess compliance with our level of knowledge, we an argue that their charger is not demonstrating OCPP capability. Their suggestion to use their App does not address the fact their charger is sold as OCPP capable.
Home Assistant is showing offline because ZJ Beny is dumping what seems to be invalid input messages. The engineer on the ZJ Beny side is possibly having an even worse time of it on a remote connection.

I've sent a similar response.

I got another message back from ZJ BENY and they have released a beta firmware update 1.0.33.
I updated my unit and it's now working properly with Home Assistant! Might need some time to check that there are no errors, but I tried a few different settings and current levels and it responded as expected.
Here's their email with the right firmware link for BCP-A2N-L OCPP.

Thank you for the information, helpful for us and we have found the problem.
Please upgrade the firmware as per the instruction as attached.
Your charger model number is BCP-A2N-L OCPP, so please select first URL address for updating.
Household EV charger, Signel phase with cable
http://<IP_ADDRESS>/V_DEBUG/BCP-A2N-P_SW1_0_33_HW1_DEBUG.bin
It is Beta Version, we will launch a official version around May.

Thank you for the update. The new version 1.0.33 BETA appears to work correctly on my BCP-AT2N-P! I will monitor it and report back any issues. Thanks again!

Yeah outstanding, I was surprised by the same reply this morning. I only had time for a quick look in the docs for how to update the firmware over OCPP. I know I've seen it talked about in other threads but couldn't find any documentation.
Sorry if I've missed something obvious, would one of you mind pointing me at the right process to update via OCPP? Or just the best way to update? Hopefully without factory resetting to use the Bluetooth connection

I changed the server over to use my Charge hq account. In there you can tap on your charger and update the firmware. Just need to paste in the url from the post above
Just make sure you can reach the firmware server first with your computer. For some reason my router/isp was blocking it, but Optus didn't.

To update the firmware:
Check the list of available files at  http://<IP_ADDRESS>   The new BETA firmware is in the V_DEBUG folder.
In Home Assistant, go to  Developer Tools / Services
Scroll through the list of Services to  "Open Charge Point Protocol (OCPP): Update charger firmware"
Go to YAML mode and modify the example provided to match your URL for your model. My YAML looked like this:
service: ocpp.update_firmware
data:
firmware_url: http://<IP_ADDRESS>/V_DEBUG/BCP-AT2N-P_SW1_0_33_HW1_DEBUG.bin
delay_hours: 0
Then press "Call Service"
I got timestamped notifications to show:
Ocpp integration
Firmware upload status: Downloading
Ocpp integration
Firmware upload status: Downloaded
Ocpp integration
Firmware upload status: Installing
Ocpp integration
Firmware upload status: Installed
It worked first time!

I have been running the OCPP version of the ZJBeny charger for about 18 months. The only issue I have is that after a firmware update, one needs to perform a ´Clear Profile' otherwise one cannot change the current. On the ver 31 update, I also needed to power cycle the charger. Personally, I think it is a well priced Charger (also sourced from Ultipower). Currently running Ver 32 firmware.

Thanks PeterBofai for the details of firmware update.
And @GuzziDoug for mentioning the current change issue. If you might be able to continue to help, I seem to have that issue, however I can't Clear Profile.
I've tried power cycling the charger (turn break off and on)
Y_CHARGER: send [2,"c54169c6-42fa-46fd-891f-177dbe3c0d3a","ClearChargingProfile",{}]
Y_CHARGER: receive message [3,"c54169c6-42fa-46fd-891f-177dbe3c0d3a",{"status":"Unknown"}]
WARNING (MainThread) [custom_components.ocpp] Failed with response: Unknown

Calling the Clear Profile Service from Home Assistant. I looked at the YAML but I can't figure out what data {} I might want to put in from a crude dig of the code https://github.com/mobilityhouse/ocpp/blob/d96d243c8fb3e042f6837aa4ccecda5356598064/ocpp/v201/call.py#L47

fyi, I had trouble with the Clear Profile. But after I power cycled the charger, I found initially it ran full tilt (ie max rate), but if I moved the current setting on the Overview page, the current changed to the setting. So, the secret may be to try changing the current on the overview page,
regards, Doug
On Sat, 20 Apr 2024 21:37:42 -0700
Conradical314 @.***> wrote:

Thanks PeterBofai for the details of firmware update.
And @GuzziDoug for mentioning the current change issue. If you might be able to continue to help, I seem to have that issue, however I can't Clear Profile.
I've tried power cycling the charger (turn break off and on)
Y_CHARGER: send [2,"c54169c6-42fa-46fd-891f-177dbe3c0d3a","ClearChargingProfile",{}]
Y_CHARGER: receive message [3,"c54169c6-42fa-46fd-891f-177dbe3c0d3a",{"status":"Unknown"}]
WARNING (MainThread) [custom_components.ocpp] Failed with response: Unknown

Calling the Clear Profile Service from Home Assistant. I looked at the YAML but I can't figure out what data {} I might want to put in from a crude dig of the code https://github.com/mobilityhouse/ocpp/blob/d96d243c8fb3e042f6837aa4ccecda5356598064/ocpp/v201/call.py#L47
--
Reply to this email directly or view it on GitHub:
https://github.com/lbbrhzn/ocpp/issues/1078#issuecomment-2067901405
You are receiving this because you were mentioned.
Message ID: @.***>


jibri: 8.0-139-g7ab9aa2 -> 8.0-140-gccc7278

Automatic update generated by nixpkgs-update tools. This update was made based on information from passthru.updateScript.
meta.description for jibri is: "JItsi BRoadcasting Infrastructure"
meta.homepage for jibri is: "https://github.com/jitsi/jibri"
meta.changelog for jibri is: ""
Updates performed

Ran passthru.UpdateScript

To inspect upstream changes
Impact

Checks done (click to expand)

built on NixOS
The tests defined in passthru.tests, if any, passed
found 8.0-139-g7ab9aa2 with grep in /nix/store/10qvvfj7lb9gkisvm7l1xa17p9a8pqdp-jibri-8.0-139-g7ab9aa2
found 8.0-139-g7ab9aa2 in filename of file in /nix/store/10qvvfj7lb9gkisvm7l1xa17p9a8pqdp-jibri-8.0-139-g7ab9aa2

Rebuild report (if merged into master) (click to expand)

1 total rebuild path(s)

1 package rebuild(s)

First fifty rebuilds by attrpath
jibri

Instructions to test this update (click to expand)

Either download from Cachix:
nix-store -r /nix/store/10qvvfj7lb9gkisvm7l1xa17p9a8pqdp-jibri-8.0-139-g7ab9aa2 \
  --option binary-caches 'https://cache.nixos.org/ https://nix-community.cachix.org/' \
  --option trusted-public-keys '
  nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=
  cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
  '

(The Cachix cache is only trusted for this store-path realization.)
For the Cachix download to work, your user must be in the trusted-users list or you can use sudo since root is effectively trusted.
Or, build yourself:
nix-build -A jibri https://github.com/r-ryantm/nixpkgs/archive/b0450e1338a063702035bf5dbc66991dd82cf152.tar.gz

After you've downloaded or built it, look at the files and if there are any, run the binaries:
ls -la /nix/store/10qvvfj7lb9gkisvm7l1xa17p9a8pqdp-jibri-8.0-139-g7ab9aa2
ls -la /nix/store/10qvvfj7lb9gkisvm7l1xa17p9a8pqdp-jibri-8.0-139-g7ab9aa2/bin

Pre-merge build results
We have automatically built all packages that will get rebuilt due to
this change.
This gives evidence on whether the upgrade will break dependent packages.
Note sometimes packages show up as failed to build independent of the
change, simply because they are already broken on the target branch.
Result of nixpkgs-review run on x86_64-linux 1

1 package built:

jibri

Maintainer pings
cc @cleeyv @ryantm @yu-re-ka for testing.

Automatic update generated by nixpkgs-update tools. This update was made based on information from passthru.updateScript.
meta.description for jibri is: "JItsi BRoadcasting Infrastructure"
meta.homepage for jibri is: "https://github.com/jitsi/jibri"
meta.changelog for jibri is: ""
Updates performed

Ran passthru.UpdateScript

To inspect upstream changes
Impact

Checks done (click to expand)

built on NixOS
The tests defined in passthru.tests, if any, passed
found 8.0-140-gccc7278 with grep in /nix/store/c4x2rhyk3sxawnz3f6dj6j9crrxcc2jn-jibri-8.0-140-gccc7278
found 8.0-140-gccc7278 in filename of file in /nix/store/c4x2rhyk3sxawnz3f6dj6j9crrxcc2jn-jibri-8.0-140-gccc7278

Rebuild report (if merged into master) (click to expand)

1 total rebuild path(s)

1 package rebuild(s)

First fifty rebuilds by attrpath
jibri

Instructions to test this update (click to expand)

Either download from Cachix:
nix-store -r /nix/store/c4x2rhyk3sxawnz3f6dj6j9crrxcc2jn-jibri-8.0-140-gccc7278 \
  --option binary-caches 'https://cache.nixos.org/ https://nix-community.cachix.org/' \
  --option trusted-public-keys '
  nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=
  cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
  '

(The Cachix cache is only trusted for this store-path realization.)
For the Cachix download to work, your user must be in the trusted-users list or you can use sudo since root is effectively trusted.
Or, build yourself:
nix-build -A jibri https://github.com/r-ryantm/nixpkgs/archive/037b4f09f99831121007ce22bdb9a8b64f6069f8.tar.gz

After you've downloaded or built it, look at the files and if there are any, run the binaries:
ls -la /nix/store/c4x2rhyk3sxawnz3f6dj6j9crrxcc2jn-jibri-8.0-140-gccc7278
ls -la /nix/store/c4x2rhyk3sxawnz3f6dj6j9crrxcc2jn-jibri-8.0-140-gccc7278/bin

Pre-merge build results
We have automatically built all packages that will get rebuilt due to
this change.
This gives evidence on whether the upgrade will break dependent packages.
Note sometimes packages show up as failed to build independent of the
change, simply because they are already broken on the target branch.
Result of nixpkgs-review run on x86_64-linux 1

1 package built:

jibri

Maintainer pings
cc @cleeyv @ryantm @yu-re-ka for testing.


Concrete Command Definitions

[x] I have checked for similar issues.
[x] I have updated to the [latest JDA version][download].
[x] I have checked the branches or the maintainers' PRs for upcoming features.

Feature Request
Define commands in a descriptive way that supports type safety when retrieving argument values.
This would potentially create a high level abstraction over top of what JDA is forwarding from the Discord API, so I understand if this is rejected.
Reasoning
I've always been excited when I heard slash commands are coming with pre-defined parameters.
Now it's awesome that JDA has them implemented but it's not hitting that SPOT for me.
When it comes to Java, I love the type safety. Code in a way which the compiler can verify that you haven't made any typos, and have your code structured, easy to re-use, easy to profile and verify. More towards concrete typing, object oriented.

In the image above, two things there make me feel that the code isn't really embracing what Java is about. And it's more something you'd see in a dynamic language. I get it, it's a quick example to show how slash commands can be implemented, but I don't want it to be the only way because:

Re-typing command names by hand can lead to typos that can't be found until runtime,
Forgetting what type your option is and choosing the wrong accessor is another bug you won't find until runtime.

...And these two don't make sense to have, especially in Java; because we've already spent time and effort defining our commands in the start of the example.
Possible To-Do:

[ ]  Add command skeleton interface
[ ]  Add functionality to register an implemented command skeleton
[ ]  Add type safety (type parameter implementation) to OptionData / OptionMapper
[ ]  Add the ability to deal with an incoming slash command usage by referencing the command skeleton

Possible Example of Type Safe Option
This original example code...
OptionMapping option = event.getOption("del_days");
if (option != null) // null = not provided
      delDays = (int) Math.max(0, Math.min(7, option.getAsLong()));

... Could end up looking similar to ...
process() {
    int delDays = (int) Math.max(0, Math.min(7, this.getDeleteOption());
}

Original:
new OptionData(OptionType.USER, "user", "The user to ban")

After:
new UserOption("user", "The user to ban")

Where, UserOption extends OptionData<User>
CommandData would be a concrete class that defines the command and also is used as a command instance for processing.

This code does not belong to JDA, JDA is a low-level enough library (unlike some others such as discord.py which provides a command framework out of the box) and is intended to be kept low level, providing everything a user could need to build higher level APIs
You can however do your own solution as a 3rd party library, or use an existing one
Also having errors in such thing as a compile time error seems difficult, what should be more doable is a runtime error, but at startup, not when a command is used, this way errors are "catched" fast

I really doubt anyone forgets the arguments they themself typed. And if you're that forgetful should you perhaps take a break.
I can't even see any real way here how commands and especially arguments, which allow pretty much any names possible, more type-safe.
What you ask for is that JDA remembers every single argument of every single command you created, which can be up to 100 commands in total.
JDA does nothing more than sending the generated command info to Discord and patiently waits for Discord to send slash command events back, nothing more.
Storing each command and their optionmappings as values in cache seems really pointless to have.
And you could for your own convenience just make a class with some static methods to retrieve data.
Here is an example I use:
public class CommandUtil {

    public static String getString(SlashCommandEvent event, String key, String def) {
        OptionMapping option = event.getOption(key);
        if(option == null)
            return def;

        return option.getAsString();
    }

    public static long getLong(SlashCommandEvent event, String key, long def) {
        OptionMapping option = event.getOption(key);
        if(option == null)
            return def;

        return option.getAsLong();
    }
}

If you really fear to misstype a option name or similar, then how about making a final String in the class to use?
Like here is an example with JDA-Chewtils' SlashCommand setup:
public class BanCommand extends SlashCommand {

    private final String USER = "user"; // Used for the user options
    private final String DEL_DAYS = "del_days"; // Used for the del_days options

    public BanCommand() {
        this.name = "ban";
        this.help = "Bans the user";

        this.options = Arrays.asList(
            new OptionData(OptionType.STRING, USER, "The user to ban. Either name, or ID", true),
            new OptionData(OptionType.INTEGER, DEL_DAYS, "How many days worth of messages should be removed? Up to 7 days possible")
        );
    }

    @Override
    protected void execute(SlashCommandEvent event) {
        OptionMapping userOption = event.getOption(USER);
        OptionMapping daysOption = event.getOption(DEL_DAYS);

        // Handle the stuff
    }
}

If this is not what you were explaining would I appreciate some more info about this... I had a hard time really understanding your idea.

The example code I posted barely reflects my suggestion so I understand the confusion. Hopefully I can get a PoC in a PR at some point.

It is very unlikely that such a databind system will ever be added to this library, since it is a very opinionated design. Feel free to make an extension library that adds this functionality, but the base library is supposed to be flexible and low level. You also shouldn't be registering your commands via updateCommands on every startup. Commands persist between sessions and should only be updated once they change.

It is very unlikely that such a databind system will ever be added to this library, since it is a very opinionated design. Feel free to make an extension library that adds this functionality, but the base library is supposed to be flexible and low level. You also shouldn't be registering your commands via updateCommands on every startup. Commands persist between sessions and should only be updated once they change.

You are right. Most of the suggestions are out of scope for the API. I got mixed up when I read the Slashbot Example because I thought JDA was already trying to implement a command system. But after deeper analysis, JDA just wants to get the data from the programmer to Discord as efficiently as possible.

It is very unlikely that such a databind system will ever be added to this library, since it is a very opinionated design. Feel free to make an extension library that adds this functionality

This is what I ended up making if anyone's interested. I'll be updating it again sometime soon when I get back into developing my bot.
https://gitlab.com/pawnstudios/libraries/discord-commands


Fix mapped paramteres generation for python

This PR fixes incorectly created paramters for maps in Python.
With this yaml:
my_node:
  my_params:
    params_to_be_mapped: {
      type: string_array,
    }
    __map_params_to_mapped:
      in_map_param: {
        type: bool,
      }

Current Jinja template will create following code:
# declare any new dynamic parameters
for value_1 in updated_params.params_to_mapped:
  updated_params.my_params.add_entry(value_1)

# ...

for value_1 in updated_params.params_to_mapped:
  param_name = f"{self.prefix_}my_params.{value_1}.in_map_param"

# ...

# declare and set all dynamic parameters
for value_1 in updated_params.params_to_mapped:
  updated_params.my_params.add_entry(value_1)

While the expected output is:
# declare any new dynamic parameters
for value_1 in updated_params.my_params.params_to_mapped:
  updated_params.my_params.add_entry(value_1)

# ...
for value_1 in updated_params.my_params.params_to_mapped:
  param_name = f"{self.prefix_}my_params.{value_1}.in_map_param"

# ...

# declare and set all dynamic parameters
for value_1 in updated_params.my_params.params_to_mapped:
  updated_params.my_params.add_entry(value_1)

Namespace of my_params is not taken into account in for loops of the mapped values.

@sea-bass I saw #185, but it did not solve this issue. I tested it once again after you comment and neither edfeb82 nor current main do not work. That is why I still want to keep this PR open.
As you suggested, I added check if {{struct_name}} is not empty, and I also merged main to make sure everything will still work after adding #185.

@Kotochleb Can you share the parameters.yaml file that caused your issue in the first place?

Thank you for clarification. Since the changes I proposed are breaking, I will simply modify my code to match current expectations. Feel free to close this PR without merging.

@Kotochleb Do you mind opening an issue for this? That way, this feature can potentially be added when I have some time.

Since the issue is open now I am closing this PR


Migrate to tokio 1

This introduces a lot of API breaks, and a couple substructures and a new ListeningSocket trait.
I believe it would be closer to what a tokio user would expect as far as API is concerned.

(I haven't plugged that branch in my downstream crate just yet. I'd like to do that before we merge it)

(I haven't plugged that branch in my downstream crate just yet. I'd like to do that before we merge it)

I've done some sample tests rewriting one of my users' crate but it seems as if the listening stops after receiving first message:
$ RUST_LOG=debug cargo run -- -H unix://
/home/wiktor/test.sock
    Finished dev [unoptimized + debuginfo] target(s) in 0.07s
     Running `/home/wiktor/tmp/cargo/debug/openpgp-card-ssh-agent -H 'unix:///home/wiktor/test.sock'`
[2024-02-14T10:40:26Z INFO  ssh_agent_lib::agent] Listening; socket = PollEvented { io: Some(UnixListener { fd: FileDesc(OwnedFd { fd: 9 }), local: "/home/wiktor/test.sock" (pathname) }) }
[2024-02-14T10:40:38Z DEBUG openpgp_card_ssh_agent] Listening done!

I'm wondering if you can reproduce that with your downstream crate. If it works "on your machine" I'll track what's going on here (the rewrite was fairly painless modulo adding back service_binding).

I tracked down the early exit. I was missing a loop ><

About async fn in trait vs 1.75. There is an issue with Send that can't be encoded in the returned Future. async-trait gets away with it by making the return a Box<impl Future + Send>.
I was not able to make the AFIT work yet. There should be https://blog.rust-lang.org/2023/12/21/async-fn-rpit-in-traits.html#async-fn-in-public-traits but I haven't been able to wrap my head around it just yet.

I tracked down the early exit. I was missing a loop ><

Yep, that was it, it works now! :clap:

About async fn in trait vs 1.75. There is an issue with Send that can't be encoded in the returned Future. async-trait gets away with it by making the return a Box<impl Future + Send>.
I was not able to make the AFIT work yet. There should be https://blog.rust-lang.org/2023/12/21/async-fn-rpit-in-traits.html#async-fn-in-public-traits but I haven't been able to wrap my head around it just yet.

So let's keep that in mind in the far future when it get stabilized a little.
I'm overall happy with the PR. I'll wait until you ack that it works on your end (it did for my downstream consumer) and we can merge it.
(hmm... now I think maybe we want to merge the fixup for extensions, release that, so that the last version in 0.2 series is "good" and only then merge this, bumping version to 0.3)

I'm starting to include this in my project and I think I'll revisit the API and expose the session.

Hi, thanks for your changes!
I'm wondering if just adding a Session parameter to Agent's handle function wouldn't allow you to track sessions?
(It's kind of hard to tell without looking at the actual code if that'd help you).
Or if you need to store some state per Session maybe adding a field there that'd be optional would be a good idea...?

One more thing, I'm wondering if we're not making it more complex than necessary by supporting TcpStreams? If the code worked with UnixStreams solely we could get rid of quite a bit of abstraction generics for supporting "more flexibility".
I did a quick search and I don't see any way to even make ssh use a TCP socket for that...

I do intend to have some sort of support for windows. I don't think UnixStreams are going to make the cut there. I'll research that a bit.

I do intend to have some sort of support for windows. I don't think UnixStreams are going to make the cut there. I'll research that a bit.

Yep, I think it requires some digging as my quick search reveals that on Windows the agent uses pipes (not TCP connections): https://stackoverflow.com/a/74497711
Interestingly tokio seems to support named pipes: https://docs.rs/tokio/latest/tokio/net/windows/named_pipe/index.html (NamedPipeServer seems the most relevant).
Still, I wonder if we shouldn't drag this PR for too long. It's already providing good value and maybe we can just merge it and then work on adjustments later? (it's not as if we'll run out of version numbers for API breaks :wink: ).

I'd be happy to see this merge. I'll follow up with the named_pipe thing in another PR.

For the record I've been sent the following resource about named pipes on Windows OpenSSH: https://github.com/PowerShell/Win32-OpenSSH/wiki/About-Win32-OpenSSH-and-Design-Details#af_unix-domain-sockets


Need references/documentation for unit testing

Hi
Looking for documentation/examples on unit testing the operator sdk project.
links referred in some of the bugs seems to be no more available
https://github.com/operator-framework/operator-sdk/blob/master/doc/user/unit-testing.md
Can anyone provide documentation link for unit testing and any example implementations ?
Thanks in advance
Kaushik.

We recommend following this kubebuilder testing guide, which we should link in documentation.
/kind documentation
/milestone v1.1.0

Hi @kaushiksrinivas,
However, the same doc that you are looking for is in : https://sdk.operatorframework.io/docs/golang/legacy/unit-testing/. Note that SDK is in a process to be integrated with KB which means that its project layouts will be aligned. More info : Integrating Kubebuilder and Operator SDK.
So, for the new layout test files for your controller are scaffold and then, you can follow up the docs suggested by @estroz as well.

Hi @camilamacedo86
"Note that SDK is in a process to be integrated with KB which means that its project layouts will be aligned."
Does this mean operator-sdk would get changed to align with kubebuilder ?
Currently if anyone is already using operator-sdk, what changes are expected ?
Thanks,
Kaushik

Hi @kaushiksrinivas,

Does this mean operator-sdk would get changed to align with kubebuilder?

Yes, for 1.0.0 the legacy layout will no longer be supported.

Currently if anyone is already using operator-sdk, what changes are expected?

You can check the migration guide to know how to upgrade your projects. See the PR https://github.com/operator-framework/operator-sdk/pull/3543 for we shape it better. Note that in the first comment has a link where you can preview the doc.
I am closing this one since its topic is Can anyone provide documentation link for unit testing and any example implementations ? which shows answered and we already started to discuss another topic. Ideally, we should have one question/bug/feature per issue. However, please feel free to raise new issues as well with further questions.

/reopen

hi @camilamacedo86, @estroz @joelanford
The above comments are a bit confusing,
Need clarifications for the below concerns,
Operator SDK includes an e2e testing framework that simplifies testing your operator against an actual cluster.
Kubebuilder includes an envtest package that allows operator developers to run simple tests with a standalone etcd and apiserver.
Reference: https://github.com/operator-framework/operator-sdk/issues/1758
Does this mean that the e2e  test framework of operator-sdk will be removed and no longer supported and one needs to follow the kube-builder way of testing ?
Does this mean https://sdk.operatorframework.io/docs/golang/legacy/unit-testing/. this is no longer valid with latest version(v0.19) of operator-sdk  ?

Hi @britoaldan,
I flagged it to be discussed in the Bug Triage meeting. Please, feel free to attend.
We will update it after the meeting as well.

Hi @camilamacedo86
Can you please let us know, how do we attend these meetings ?

Hi @kaushiksrinivas, @beautytiger,
See the details over the meetings in: https://github.com/operator-framework/community
As an update from the discussion made see:

For 1.0.0 we have the Breaking change: Removed test subcommand and the test framework pkg/test. (#3409)
Also, we would like to recommend use controller-runtime's envtest framework instead of it.
Note that the for 1.0.0 and new layout the projects will be scaffolding with its test using the  envtest
And then, it is important to highlight that the test-framework and the old unit doc uses the client-fake which is not actually really testing the changes and because of this the envtest has been used in the Kubernetes projects per default as been recommended to be used.

We will keep this issue to track the need to provide the docs for the unit tests.

Hi @camilamacedo86
If one builds operator with v0.19 with the new scaffolding structure.
when we upgrade to 1.0.0 will it be a smooth upgrade, if not what is expected to break or to be migrated again.
could you please provide some pointers.
Also we see envtest is  for integration testing, will there be a framework available for unit test ?

Hi @britoaldan,
I cannot see how have many files in this dir make the things harder. I hope that I could answer the question made to open the issue. Regards your latest one see that: Following the comments.

If one builds operator with v0.19 with the new scaffolding structure.

You can check the migration guide for GO already. However, it requires some fixes and updates. Because of this, I'd suggest you check and follow it via the changes made in the PR https://github.com/operator-framework/operator-sdk/pull/3543. See that there you will find the preview link for the doc https://deploy-preview-3543--operator-sdk.netlify.app/docs/building-operators/golang/project_migration_guide/.

when we upgrade to 1.0.0 will it be a smooth upgrade, if not what is expected to break or to be migrated again.

See that SDK so far is in a version  < 1.0.0 which means by convention initial development phase which allows breaking changes. However, the goal is to release 1.0.0 and then you will be less impact by breaking changes. The next release with breaking changes would need to be bumped to 2.0.0 following the semver

Also we see envtest is for integration testing, will there be a framework available for the unit test?

Now, the SDK will generate tests for your projects. These tests are using ginkgo/ and gomega, look its imports:
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"

I'd recommend you follow up and use that since this stack is adopted across the k8ss projects used by it and SDK now. To know more about how to test check the doc : https://book.kubebuilder.io/reference/writing-tests.html?highlight=controller,test#writing-controller-tests

I am closing this one as sorted out since shows that the topic raised is already solved and we start to deal with other questions. I'd kindly ask for we try to keep one topic bug/close questions/rfe per issue since it is tracked and can be helpful for others as well.
However, feel free to raise new ones or ping us to re-open this if you think that would be required.

Hi @camilamacedo86
Any update on this since v1.0.0 is already out ?
Is there any unit test framework which can be used or one must follow the link
https://book.kubebuilder.io/reference/writing-tests.html?highlight=controller,test#writing-controller-tests
for writing tests for operators in 1.0 sdk version.
Thanks,
Kaushik.

HI @kaushiksrinivas,
The documentation in upstream was updated with an example. Also, see that a PR was raised to share the info which was already provided here via the docs as well https://github.com/operator-framework/operator-sdk/pull/3823. Also, we are clarifying on it that scorecard and kuttl also can be used to test the project.


new_algo branch: panic on input ending with <

$ echo -n '<' | cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.05s
     Running `target/debug/pulldown-cmark`
thread 'main' panicked at 'index out of bounds: the len is 1 but the index is<PHONE_NUMBER>3709551614', src/parse.rs:2069:8
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

Thanks for filing this!


Add instructions for service providers

Add instructions of what to do if your customers are getting a 403 error when connecting from your ASNs

I still need some confirmations...


Factor the automatic texture filling of dnd5e templates out of the modify-rolling code.

I would be super appreciative if this could be done, I noticed this was the case when I was testing and came to report it only to see this. I want to use the the custom spell template pictures, but my group already uses minorQOL for rolls and so I dont need the modified rolling (and would love to disable it to avoid confusion/issues).
Thanks for all your work on this module though, theres some really neat features.


qTip applied on virtual Dom

Hello,
First, thanks a lot for this lib ! Helped a lot so I hope you'll keep it up !
This post is not really an issue, more like a enhancement. It would be nice to have qTip working on virtual dom (not sure it's correct, I mean a dom created using JS and not yet inserted in the HTML).
I've done a quick codepen to reproduce here http://codepen.io/bqlou/pen/MwKjRO
(Maybe it's already possible and I'm mistaking somewhere too..)
Have a good day!

This is possible, you just need to make sure you append the DOM element you create, not set the innerHTML of the target element to it, since it won't be the same node then :)
See http://codepen.io/anon/pen/LVNjOQ


Please help me again to set outputing tendencies of variables?Thank you!

Hi,
1.In your neuralGCM paper, C.4 says "In all models we predict tendencies of the wind vector,
temperature and moisture species at all levels."
2.In appendix E, both "dynamic tendencies and machine learning tendencies are computed at every time step".
So, can these tendencies be output? Would yo please help me again to set it?
Thank you very much for your attention again!

@kochkov92 @shoyer @yaniyuval Please pay attention to help me, thank you!

Hi,
Currently there is no easy way to get these tendencies. In future work we might include the ability to easily access the predicted tendencies from the NN.

@yaniyuval Thank you, sir!
The tendencies are related to the "hybrid" of dynamic and learned parameterization, which is really confusing. Sorry, I asked 3 questions about the title of neuralGCM paper. I can't understand enough how does they "hybrid"  together? Just like in #52, #24

The third version paper indeed has a fig seperate the tendencies.
So, they can be seperated, but not easy to do yet as you said.


chore: publish binaries in release assets

This could be used by tools like cargo-binstall to install filesfinder faster.

Done


Draft: Implement Voting UI

I am trying to take a look at this branch, I however only see a white page when I try loading it


New probes and some base system fixes

Already merged with the code guidelines PR

Pull Request Test Coverage Report for Build 426305446

80 of 328 (24.39%)  changed or added relevant lines in 61 files are covered.
1 unchanged line in 1 file lost coverage.
Overall coverage decreased (-2.3%) to 66.619%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

packages/Babylonian-UI.package/BPAssertionMorph.class/instance/checkAndConvertValuesMorphIfNecessary..st
0
1
0.0%

packages/Babylonian-Compiler.package/BPCompiler.class/instance/backgroundCompileInstrumentedVersionOf.basedOn..st
0
2
0.0%

packages/Babylonian-UI.package/BPSliderMorph.class/instance/updateFrom..st
0
2
0.0%

packages/Babylonian-UI.package/BPTraceBasedMorph.class/instance/newExampleLabelMorphFor..st
0
3
0.0%

packages/Babylonian-UI.package/BPTraceBasedMorph.class/instance/step.st
0
3
0.0%

packages/Babylonian-Core.package/BPAnnotation.class/instance/isExamples.st
0
4
0.0%

packages/Babylonian-Core.package/BPExampleRecorder.class/instance/installMyselfInProcess.st
0
4
0.0%

packages/Babylonian-Core.package/BPExampleRecorder.class/instance/uninstall.st
0
4
0.0%

packages/Babylonian-Core.package/BPExamplesAnnotation.class/instance/isExamples.st
0
4
0.0%

packages/Babylonian-UI.package/BPAnnotationMorph.class/instance/isExamples.st
0
4
0.0%

Files with Coverage Reduction
New Missed Lines
%

packages/Babylonian-Compiler.package/BPCompiler.class/instance/backgroundCompileInstrumentedVersionOf.basedOn..st
1
0%

Totals

Change from base Build 426248202:
-2.3%

Covered Lines:
3742

Relevant Lines:
5617

💛  - Coveralls


How to ordering more than one filed on ajax.

Summary of problem or feature request
First of all, thank you for your amazing project.
I am using 'laravel-datatables' to set a ajax dataTable,
my database has below fileds.
 'region',  'locality',  'street-address'.
I want to merge three flieds to one column for ajax dataTable and when I click header 'Address' to ordering to asc/desc. just like as below.
>> ORDER BY `region` ASC, `locality` ASC, `street-address` ASC;

How can I do it? thank you.
Code snippet of problem
Controller
    public function index(Request $request, Datatables $datatables)
    {
        abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        if ($request->ajax()) {
			return $this->data($datatables);
		}
        return view('admin.users.index');
    }

	public function data(Datatables $datatables)
	{
		$query = User::select( (new User)->getTable() . '.*');
		return $datatables->eloquent($query)
                          ->setTransformer(new UserTransformer)
                          ->make(true);
	}

UserTransformer
    public function transform(User $user)
    {
        return [
	    'checkbox'         => '',
            'name'               => $user->name,
            'email'               => $user->email,
            'full_address'     => $user->region . '
' .
					   $user->locality. '
' . $user->street-address,
            'action'              => view('admin.users.action', compact('user'))->render(),
        ];
    }

html

                       Name
                       Email
                       Address

js
	$('#users-table').DataTable({
		serverSide: true,
		processing: true,
		ajax: $('#users-data-route').val(),
		columns: [
			{data: 'checkbox', orderable: false, searchable: false,
				className: 'select-checkbox', targets: 0},

			{data: 'name', name: 'name'},
			{data: 'email', name: 'email'},
			//How to ordering more than one filed on ajax?
			{data: 'full_address', name: 'region'},

			{data: 'action', orderable: false, searchable: false},
		],
	});

System details

Operating System CentOS 7
PHP Version 7.2
Laravel Version 5.7
Laravel-Datatables Version 8.0

You can use orderColumn https://github.com/yajra/laravel-datatables-docs/blob/master/order-column.md for this. Something like:
    return DataTables::eloquent($model)
                 ->orderColumn('address', function ($query, $order) {
                     $query->orderBy('region', $order)
                     ->orderBy('locality', $order)
                     ->orderBy('street-address', $order);
                 });

You can use orderColumn https://github.com/yajra/laravel-datatables-docs/blob/master/order-column.md for this. Something like:
    return DataTables::eloquent($model)
                 ->orderColumn('address', function ($query, $order) {
                     $query->orderBy('region', $order)
                     ->orderBy('locality', $order)
                     ->orderBy('street-address', $order);
                 });

I am in need of help, I am trying to sort categories with subcategories for a while, but without success.
I would like my table to look something like this (this I did with 2 foreach):

How could I do this on a table? Originally it looks like this:

what I've managed to do so far is this:

Any ideas on how to fix this? Thank you

I was able to do what I would like by modifying conditions in the SQL code in the Model. I got the result I expected, I will share the code with you.

public static function scopeListarCategoriasSubcategorias($query, $trashed = FALSE)
{
    $prefix     = DB::getTablePrefix();
    $registros  = $query->from('produtos_categorias AS p')
                    ->selectRaw("
                    {$prefix}s.*,
                    CASE
                        WHEN
                            {$prefix}s.id_categoria_principal IS NOT NULL THEN {$prefix}p.nome || ' > ' || {$prefix}s.nome
                        ELSE
                            {$prefix}s.nome
                    END AS categoria")
                    ->rightJoin('produtos_categorias AS s', 'p.id', '=', 's.id_categoria_principal')
                    ->withTrashed();

    if($trashed)
        $registros->whereNotNull('s.deleted_at');
    else
        $registros->whereNull('s.deleted_at');

    return $registros;
}

Only question, I'm using softdelete and Laravel doesn't work very well with table aliases in this case, so I pass it through the parameter when I want only the deleted records.


Driver Station displays wrong WiFi-Direct channel number

When DS is connected to both WiFi (channel 6) and WiFi-Direct (channel 48), DS says WiFi-Direct network is on channel 6.  After disconnecting WiFi, DS says WiFi-Direct network is on channel 48.
RC and DS phones are Moto E5 Play (XT1921-2), Android 8.0.0, DS version 7.0, RC version 7.0.

Thank you for the report; this is already a known issue being tracked internally :)


Enchantments not registered correctly.

Forge made Enchantment extend net.minecraftforge.fml.common.registry.IForgeRegistryEntry.Impl<Enchantment>, meaning it is now possible to register them using GameRegistry#register. While the old way of registering enchantments works, it is better to let Forge handle the IDs rather than handling them yourself through config. Doing things the old way will also cause incompatibilities with Wawla, Enchanting Plus and Enchantment Descriptions, along with any other mod which expects the newer system to be used.
It is very easy to switch to the new system, just call setRegistryName in the enchantment constructor, or use it as a builder method. And then call GameRegistry#register. Same way you do items and blocks. If you don't want to switch to the new system for legacy reasons, adding setRegistryName and keeping your current registry will fix the compatibility issues, or at least the ones with my mods. I would not recommend the mixed solution though, as mods will use that to lookup your enchantment rather than the numeric ID and they will get null results.

That is way easier. Fixed in 2a6f8f86cc2f5b4f27a64dc4bfc6ca07bdb0181b


Added cleanup-vpc-peering command to subctl->cloud

I'm Agree. "Clean" replaced by "Cleanup" as requested


Fails Captcha

Opens a browser which logs me in but prompts Captcha every single time and browser times out before I even get to fill it in.

also, while on this, can we also add an option to support headless login?
although it might be technically difficult to achieve

When it logs you in, does it click "login" by itself, or do you do it manually?
If you've been tempted to do it manually it may be related to an issue I ran in to which I've submitted a pull request in attempt to solve: https://github.com/SzymonLisowiec/node-epicgames-client-login-adapter/pull/6
Other than that, it may be worth increasing the enterCredentialsTimeout option which can be passed in to the init() options.

If you've been tempted to do it manually it may be related to an issue I ran in to which I've submitted a pull request in attempt to solve: #6

I experienced this exact issue but applying your fix worked, thanks. I see the PR is merged but it doesn't seem to be on npm.

If you've been tempted to do it manually it may be related to an issue I ran in to which I've submitted a pull request in attempt to solve: #6

I experienced this exact issue but applying your fix worked, thanks. I see the PR is merged but it doesn't seem to be on npm.


Fix find, do not skip some snapshots

Under certain circumstances, the find command was found to skip snapshots containing directories with files to look for when the directories haven't been modified at all, and were already printed as part of a different snapshot. This is now corrected.
In addition, we've switched to our own matching/pattern implementation, so now things like restic find "/home/user/foo/**/main.go" are possible.
Closes #1825, #1823

Codecov Report

Merging #1839 into master will increase coverage by 0.19%.
The diff coverage is 67.5%.

@@            Coverage Diff             @@
##           master    #1839      +/-   ##
==========================================
+ Coverage    51.2%   51.39%   +0.19%
==========================================
  Files         167      168       +1
  Lines       12912    12966      +54
==========================================
+ Hits         6611     6664      +53
+ Misses       5309     5301       -8
- Partials      992     1001       +9

Impacted Files
Coverage Δ

internal/filter/filter.go
75.9% <100%> (+0.9%)
:arrow_up:

cmd/restic/cmd_backup.go
44.88% <20%> (ø)
:arrow_up:

cmd/restic/cmd_ls.go
59.37% <62.5%> (+1.04%)
:arrow_up:

cmd/restic/cmd_find.go
63.75% <64.58%> (-1.32%)
:arrow_down:

cmd/restic/format.go
36.66% <66.66%> (-1.04%)
:arrow_down:

internal/walker/walker.go
73.58% <73.58%> (ø)

internal/archiver/file_saver.go
84.21% <0%> (-1.76%)
:arrow_down:

internal/backend/rclone/backend.go
64.32% <0%> (-1.76%)
:arrow_down:

internal/archiver/blob_saver.go
100% <0%> (+2.46%)
:arrow_up:

... and 1 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 33dbd0b...321efec. Read the comment docs.


Generate layer files during storage tests

Previously, four layer files (scratch, layer1, layer2, and layer3) were
included in the repo. The storage tests would then test mounting against
these layers. Now, these layer files are generated on the fly by the
test, so that binary files don't need to be included in the repo.
This fixes issue #11

@beweedon,
Thanks for your contribution as a Microsoft full-time employee or intern. You do not need to sign a CLA.
Thanks,
Microsoft Pull Request Bot


#1069 Replace port 8090 with 8080

Description
Standardize by replacing port 8090 with 8080 in Kitura and related repos.
Motivation and Context
#1069
How Has This Been Tested?

Checklist:

[ ] I have submitted a CLA form
[ ] If applicable, I have updated the documentation accordingly.
[ ] If applicable, I have added tests to cover my changes.

Codecov Report

Merging #1077 into master will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##           master    #1077   +/-   ##
=======================================
  Coverage   89.73%   89.73%
=======================================
  Files          35       35
  Lines        1714     1714
=======================================
  Hits         1538     1538
  Misses        176      176

Flag
Coverage Δ

#Kitura
89.73% <ø> (ø)
:arrow_up:

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 b582087...3310cf9. Read the comment docs.


Bump the versions of containerd and go-git dependencies

Proposed changes
Bump the versions of containerd and go-git dependencies.
Checklist
Before creating a PR, run through this checklist and mark each as complete.

[ ] I have read the CONTRIBUTING document
[ ] I have run make install-tools and have attached any dependency changes to this pull request
[ ] If applicable, I have added tests that prove my fix is effective or that my feature works
[ ] If applicable, I have checked that any relevant tests pass after adding my changes
[ ] If applicable, I have updated any relevant documentation (README.md)
[ ] If applicable, I have tested my cross-platform changes on Ubuntu 22, Redhat 8, SUSE 15 and FreeBSD 13

Codecov Report
All modified and coverable lines are covered by tests :white_check_mark:

Comparison is base (6a4748e) 66.00% compared to head (0809992) 66.00%.

:exclamation: Your organization needs to install the Codecov GitHub app to enable full functionality.
Additional details and impacted files
@@           Coverage Diff           @@
##             main     #533   +/-   ##
=======================================
  Coverage   66.00%   66.00%
=======================================
  Files         118      118
  Lines       13468    13468
=======================================
  Hits         8890     8890
  Misses       3977     3977
  Partials      601      601

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.