Repository: PandABlocks/PandABlocks-client

Issue:
PandABlocks-client raises error when using PandA3.1 (b1) firmware
I have recently updated the Firmware on BL20J-TS-PANDA-01 (172.23.90.24) to 3.1b1 and it produces the following error:
```
pandablocks-ioc softioc BL20J-TS-PANDA-01 BL20J-EA-PANDA-01
INFO: PVXS QSRV2 is loaded, permitted, and ENABLED.
Traceback (most recent call last):
  File "/dls/science/users/ysx26594/venvs/pandaIoc/bin/pandablocks-ioc", line 8, in <module>
    sys.exit(cli())
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks_ioc/__main__.py", line 62, in softioc
    create_softioc(
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks_ioc/ioc.py", line 163, in create_softioc
    ).result()
  File "/dls_sw/apps/python/miniforge/4.10.0-0/envs/python3.10/lib/python3.10/concurrent/futures/_base.py", line 458, in result
    return self.__get_result()
  File "/dls_sw/apps/python/miniforge/4.10.0-0/envs/python3.10/lib/python3.10/concurrent/futures/_base.py", line 403, in __get_result
    raise self._exception
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks_ioc/ioc.py", line 107, in _create_softioc
    (all_records, all_values_dict, block_info_dict) = await create_records(
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks_ioc/ioc.py", line 1885, in create_records
    (panda_dict, all_values_dict) = await introspect_panda(client)
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks_ioc/ioc.py", line 204, in introspect_panda
    returned_infos = await asyncio.gather(
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks/asyncio.py", line 140, in send
    raise response
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks/connections.py", line 164, in _update_contexts
    exchanges = next(context.generator)
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks/commands.py", line 728, in execute
    field_name_info = yield from _zip_with_return(field_generators)
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks/commands.py", line 143, in _zip_with_return
    exchanges = next(gen)
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks/commands.py", line 513, in _time
    desc, units, min = yield from _execute_commands(
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks/commands.py", line 126, in _execute_commands
    ret = yield from _zip_with_return([command.execute() for command in commands])
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks/commands.py", line 143, in _zip_with_return
    exchanges = next(gen)
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks/commands.py", line 232, in execute
    return ex.line
  File "/dls/science/users/ysx26594/venvs/pandaIoc/lib/python3.10/site-packages/pandablocks/_exchange.py", line 30, in line
    assert not self.is_multiline and self.received[0].startswith(
pandablocks.commands.CommandException: GetFieldInfo(block='PULSE', extended_metadata=True) raised error:
AssertionError: 'PULSE1.DELAY.MIN?' -> 'ERR No such attribute'
```
The MIN attribute of Time fields has been removed between 3.0 and 3.1b1 which might be causing this error: https://github.com/PandABlocks/PandABlocks-server/pull/55

Discussion:
codecov[bot]: ## [Codecov](https://app.codecov.io/gh/PandABlocks/PandABlocks-client/pull/96?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PandABlocks) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 97.19%. Comparing base [(`aa2eb1a`)](https://app.codecov.io/gh/PandABlocks/PandABlocks-client/commit/aa2eb1a823c08751b0deba072f39d1b4285d52f6?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PandABlocks) to head [(`c3144b0`)](https://app.codecov.io/gh/PandABlocks/PandABlocks-client/commit/c3144b02daa310234d8e89ea7e3d05d2552e213a?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PandABlocks).

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##           master      #96      +/-   ##
==========================================
- Coverage   97.19%   97.19%   -0.01%     
==========================================
  Files          12       12              
  Lines        1213     1212       -1     
==========================================
- Hits         1179     1178       -1     
  Misses         34       34              
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/PandABlocks/PandABlocks-client/pull/96?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PandABlocks).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PandABlocks).


Patch:
diff --git a/src/pandablocks/commands.py b/src/pandablocks/commands.py
index b94a0f6..7a5d32e 100644
--- a/src/pandablocks/commands.py
+++ b/src/pandablocks/commands.py
@@ -510,13 +510,12 @@ class GetFieldInfo(Command[dict[str, FieldInfo]]):
     def _time(
         self, field_name: str, field_type: str, field_subtype: Optional[str]
     ) -> _FieldGeneratorType:
-        desc, units, min = yield from _execute_commands(
+        desc, units = yield from _execute_commands(
             self._get_desc(field_name),
             GetMultiline(f"*ENUMS.{self.block}.{field_name}.UNITS"),
-            GetLine(f"{self.block}1.{field_name}.MIN"),
         )
 
-        field_info = TimeFieldInfo(field_type, field_subtype, desc, units, float(min))
+        field_info = TimeFieldInfo(field_type, field_subtype, desc, units)
 
         return field_name, field_info
 
diff --git a/src/pandablocks/responses.py b/src/pandablocks/responses.py
index 01d2e55..e4a2d22 100644
--- a/src/pandablocks/responses.py
+++ b/src/pandablocks/responses.py
@@ -90,7 +90,6 @@ class TimeFieldInfo(FieldInfo):
     """Extended `FieldInfo` for fields with type "time"""
 
     units_labels: list[str]
-    min_val: float
 
 
 @dataclass


Test patch:
diff --git a/tests/test_pandablocks.py b/tests/test_pandablocks.py
index a909b8a..9d8c044 100644
--- a/tests/test_pandablocks.py
+++ b/tests/test_pandablocks.py
@@ -752,14 +752,12 @@ def idfn(val):
             None,
             [
                 ("*ENUMS.TEST.TEST_FIELD.UNITS?", "!VAL1\n!VAL2\n."),
-                ("TEST1.TEST_FIELD.MIN?", "OK =5e-8"),
                 ("*DESC.TEST.TEST_FIELD?", "OK =Test Description"),
             ],
             TimeFieldInfo(
                 "time",
                 None,
                 units_labels=["VAL1", "VAL2"],
-                min_val=5e-8,
                 description="Test Description",
             ),
         ),