denpamusic / PyPlumIO

PyPlumIO is a native ecoNET library for Plum ecoMAX controllers.
MIT License
15 stars 2 forks source link

ValueError: filedescriptor out of range in select() #15

Closed swex closed 1 year ago

swex commented 1 year ago

Is there an existing issue for this?

I'm having the following issue:

probably its pyserial-asyncio bug, but... some random time after hass running it becomes unresponsive and I see in logs SEE BELOW Something in my setup acquiring file descriptors and not closing them... I guess its you...

I have following devices connected:

I'm connecting to my devices using:

USB to RS-485 adapter

I'm seeing following log messages:

Sep 25 00:46:35  hass[356102]:   File "/usr/lib/python3.11/asyncio/events.py", line 80, in _run
Sep 25 00:46:35  hass[356102]:     self._context.run(self._callback, *self._args)
Sep 25 00:46:35  hass[356102]:   File "/home/swex/.homeassistant/deps/lib/python3.11/site-packages/serial_asyncio/__init__.py", line 115, in _read_ready
Sep 25 00:46:35  hass[356102]:     data = self._serial.read(self._max_read_size)
Sep 25 00:46:35  hass[356102]:            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Sep 25 00:46:35  hass[356102]:   File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 565, in read
Sep 25 00:46:35  hass[356102]:     ready, _, _ = select.select([self.fd, self.pipe_abort_read_r], [], [], timeout.time_left())
Sep 25 00:46:35  hass[356102]:                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Sep 25 00:46:35  hass[356102]: ValueError: filedescriptor out of range in select()


### My diagnostics data:

{
  "home_assistant": {
    "installation_type": "Unknown",
    "version": "2023.9.2",
    "dev": false,
    "hassio": false,
    "virtualenv": false,
    "python_version": "3.11.0rc1",
    "docker": false,
    "arch": "x86_64",
    "os_name": "Linux",
    "os_version": "5.15.0-84-generic",
    "run_as_root": false
  },
  "custom_components": {
    "plum_ecomax": {
      "version": "0.3.8",
      "requirements": [
        "pyplumio==0.4.2.post1"
      ]
    },
    "tcl_tv_remote": {
      "version": "0.1.3",
      "requirements": [
        "TCL-TV-Remote==0.0.1"
      ]
    },
    "hacs": {
      "version": "1.32.1",
      "requirements": [
        "aiogithubapi>=22.10.1"
      ]
    },
    "yi_hack": {
      "version": "0.4.6",
      "requirements": []
    }
  },
  "integration_manifest": {
    "domain": "plum_ecomax",
    "name": "Plum ecoMAX",
    "codeowners": [
      "@denpamusic"
    ],
    "config_flow": true,
    "dependencies": [
      "network"
    ],
    "documentation": "https://github.com/denpamusic/homeassistant-plum-ecomax",
    "integration_type": "hub",
    "iot_class": "local_push",
    "issue_tracker": "https://github.com/denpamusic/homeassistant-plum-ecomax/issues",
    "loggers": [
      "pyplumio"
    ],
    "requirements": [
      "pyplumio==0.4.2.post1"
    ],
    "version": "0.3.8",
    "is_built_in": false
  },
  "data": {
    "entry": {
      "title": "ecoMAX 350P2-C",
      "data": {
        "device": "/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0",
        "baudrate": "115200",
        "connection_type": "Serial",
        "uid": "**REDACTED**",
        "model": "ecoMAX 350P2-C",
        "product_type": 0,
        "product_id": 138,
        "software": "3.12.20.K1",
        "sub_devices": [
          "thermostats"
        ]
      }
    },
    "pyplumio": {
      "version": "0.4.2.post1"
    },
    "data": {
      "connected": false,
      "frame_versions": {
        "49": 3,
        "50": 3,
        "54": 1,
        "56": 2,
        "57": 1,
        "61": 9070,
        "80": 1,
        "81": 1,
        "82": 1,
        "83": 1
      },
      "regdata_decoder": true,
      "ecomax_control": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxBinaryParameter'>",
        "repr": "EcomaxBinaryParameter(device=EcoMAX, description=EcomaxParameterDescription(name='ecomax_control', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxBinaryParameter'>, multiplier=1, offset=0), value=on, min_value=off, max_value=on)"
      },
      "state": 3,
      "fan": true,
      "feeder": false,
      "heating_pump": true,
      "water_heater_pump": false,
      "circulation_pump": false,
      "lighter": false,
      "alarm": false,
      "outer_boiler": false,
      "fan2_exhaust": false,
      "feeder2": false,
      "outer_feeder": false,
      "solar_pump": false,
      "fireplace_pump": false,
      "gcz_contact": false,
      "blow_fan1": false,
      "blow_fan2": false,
      "heating_pump_flag": true,
      "water_heater_pump_flag": true,
      "circulation_pump_flag": true,
      "solar_pump_flag": false,
      "heating_temp": 60.751739501953125,
      "feeder_temp": 26.1065673828125,
      "optical_temp": 100.0,
      "heating_target": 70,
      "heating_status": 0,
      "water_heater_target": 45,
      "water_heater_status": 128,
      "pending_alerts": 0,
      "fuel_level": 100,
      "transmission": 0,
      "fan_power": 32.04085159301758,
      "load": 58,
      "power": 27.90319061279297,
      "fuel_burned": 0.0014456380461813543,
      "fuel_consumption": 5.356383323669434,
      "thermostat": 1,
      "modules": {
        "__type": "<class 'pyplumio.structures.modules.ConnectedModules'>",
        "repr": "ConnectedModules(module_a='3.12.20.K1', module_b=None, module_c=None, ecolambda=None, ecoster=None, panel=None)"
      },
      "thermostats": {},
      "thermostat_sensors": true,
      "thermostat_count": 3,
      "sensors": true,
      "schema": [
        [
          1792,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Byte'>",
            "repr": "Byte(data=b'\\x02', size=1)"
          }
        ],
        [
          1536,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\t', size=0)"
          }
        ],
        [
          1538,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\t', size=0)"
          }
        ],
        [
          1542,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\t', size=0)"
          }
        ],
        [
          1541,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\t', size=0)"
          }
        ],
        [
          5,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\t', size=0)"
          }
        ],
        [
          3,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\t', size=0)"
          }
        ],
        [
          1543,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\t', size=0)"
          }
        ],
        [
          1544,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\t', size=1)"
          }
        ],
        [
          1545,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\x00', size=0)"
          }
        ],
        [
          1546,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\x00', size=0)"
          }
        ],
        [
          1547,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\x00', size=0)"
          }
        ],
        [
          1548,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\x00', size=0)"
          }
        ],
        [
          1549,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\x00', size=0)"
          }
        ],
        [
          2,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\x00', size=0)"
          }
        ],
        [
          6,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\x00', size=0)"
          }
        ],
        [
          6,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Boolean'>",
            "repr": "Boolean(data=b'\\x00', size=1)"
          }
        ],
        [
          1024,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\xc8\\x01sB', size=4)"
          }
        ],
        [
          1027,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'h\\xdcv\\xc3', size=4)"
          }
        ],
        [
          1026,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'@\\xda\\xd0A', size=4)"
          }
        ],
        [
          26,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\x00\\x00\\xc8B', size=4)"
          }
        ],
        [
          1025,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b' \\xbeC\\xc3', size=4)"
          }
        ],
        [
          29,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b' \\xbeC\\xc3', size=4)"
          }
        ],
        [
          1028,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\x00\\x00\\x00\\x00', size=4)"
          }
        ],
        [
          1032,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\x00\\x00\\x00\\x00', size=4)"
          }
        ],
        [
          1031,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\x00\\x00\\x00\\x00', size=4)"
          }
        ],
        [
          1029,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\x00\\x00\\x00\\x00', size=4)"
          }
        ],
        [
          25,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\x00\\x00\\x00\\x00', size=4)"
          }
        ],
        [
          27,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\x00\\x00\\x00\\x00', size=4)"
          }
        ],
        [
          29,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\x00\\x00\\x00\\x00', size=4)"
          }
        ],
        [
          29,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\x00\\x00\\x00\\x00', size=4)"
          }
        ],
        [
          29,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\x00\\x00\\x00\\x00', size=4)"
          }
        ],
        [
          29,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Float'>",
            "repr": "Float(data=b'\\x00\\x00\\x00\\x00', size=4)"
          }
        ],
        [
          1280,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Byte'>",
            "repr": "Byte(data=b'F', size=1)"
          }
        ],
        [
          1283,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Byte'>",
            "repr": "Byte(data=b'\\x00', size=1)"
          }
        ],
        [
          1282,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Byte'>",
            "repr": "Byte(data=b'\\x00', size=1)"
          }
        ],
        [
          1287,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Byte'>",
            "repr": "Byte(data=b'(', size=1)"
          }
        ],
        [
          1281,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Byte'>",
            "repr": "Byte(data=b'-', size=1)"
          }
        ],
        [
          1288,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Byte'>",
            "repr": "Byte(data=b'(', size=1)"
          }
        ],
        [
          2048,
          {
            "__type": "<class 'pyplumio.helpers.data_types.Byte'>",
            "repr": "Byte(data=b'\\x00', size=1)"
          }
        ]
      ],
      "alerts": [
        {
          "__type": "<class 'pyplumio.structures.alerts.Alert'>",
          "repr": "Alert(code=<AlertType.POWER_LOSS: 0>, from_dt=datetime.datetime(2023, 9, 24, 16, 38), to_dt=datetime.datetime(2023, 9, 25, 0, 26, 28))"
        },
        {
          "__type": "<class 'pyplumio.structures.alerts.Alert'>",
          "repr": "Alert(code=<AlertType.POWER_LOSS: 0>, from_dt=datetime.datetime(2023, 9, 22, 9, 6), to_dt=datetime.datetime(2023, 9, 22, 11, 15, 7))"
        },
        {
          "__type": "<class 'pyplumio.structures.alerts.Alert'>",
          "repr": "Alert(code=<AlertType.POWER_LOSS: 0>, from_dt=datetime.datetime(2023, 9, 19, 14, 43), to_dt=datetime.datetime(2023, 9, 19, 14, 51, 37))"
        },
        {
          "__type": "<class 'pyplumio.structures.alerts.Alert'>",
          "repr": "Alert(code=<AlertType.POWER_LOSS: 0>, from_dt=datetime.datetime(2023, 9, 10, 15, 58), to_dt=datetime.datetime(2023, 9, 10, 18, 0, 43))"
        },
        {
          "__type": "<class 'pyplumio.structures.alerts.Alert'>",
          "repr": "Alert(code=<AlertType.POWER_LOSS: 0>, from_dt=datetime.datetime(2023, 9, 9, 14, 43), to_dt=datetime.datetime(2023, 9, 9, 14, 47, 50))"
        },
        {
          "__type": "<class 'pyplumio.structures.alerts.Alert'>",
          "repr": "Alert(code=<AlertType.KINDLING_FAILURE: 7>, from_dt=datetime.datetime(2023, 9, 9, 14, 33, 38), to_dt=datetime.datetime(2023, 9, 9, 14, 33, 50))"
        },
        {
          "__type": "<class 'pyplumio.structures.alerts.Alert'>",
          "repr": "Alert(code=<AlertType.KINDLING_FAILURE: 7>, from_dt=datetime.datetime(2023, 9, 9, 14, 11, 54), to_dt=datetime.datetime(2023, 9, 9, 14, 12, 26))"
        },
        {
          "__type": "<class 'pyplumio.structures.alerts.Alert'>",
          "repr": "Alert(code=<AlertType.POWER_LOSS: 0>, from_dt=datetime.datetime(2023, 8, 31, 15, 6), to_dt=datetime.datetime(2023, 8, 31, 15, 19, 33))"
        },
        {
          "__type": "<class 'pyplumio.structures.alerts.Alert'>",
          "repr": "Alert(code=<AlertType.POWER_LOSS: 0>, from_dt=datetime.datetime(2023, 8, 24, 1, 10), to_dt=datetime.datetime(2023, 8, 29, 19, 49, 10))"
        },
        {
          "__type": "<class 'pyplumio.structures.alerts.Alert'>",
          "repr": "Alert(code=<AlertType.POWER_LOSS: 0>, from_dt=datetime.datetime(2023, 8, 24, 0, 57), to_dt=datetime.datetime(2023, 8, 24, 1, 0, 29))"
        }
      ],
      "schedules": {
        "heating": {
          "__type": "<class 'pyplumio.helpers.schedule.Schedule'>",
          "repr": "Schedule(name='heating', device=<pyplumio.devices.ecomax.EcoMAX object at 0x7fdc680efd50>, monday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), tuesday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), wednesday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), thursday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), friday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), saturday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), sunday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]))"
        },
        "boiler_work": {
          "__type": "<class 'pyplumio.helpers.schedule.Schedule'>",
          "repr": "Schedule(name='boiler_work', device=<pyplumio.devices.ecomax.EcoMAX object at 0x7fdc680efd50>, monday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), tuesday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), wednesday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), thursday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), friday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), saturday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]), sunday=ScheduleDay([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]))"
        }
      },
      "heating_schedule_switch": {
        "__type": "<class 'pyplumio.structures.schedules.ScheduleBinaryParameter'>",
        "repr": "ScheduleBinaryParameter(device=EcoMAX, description=ScheduleParameterDescription(name='heating_schedule_switch', cls=<class 'pyplumio.structures.schedules.ScheduleBinaryParameter'>), value=off, min_value=off, max_value=on)"
      },
      "heating_schedule_parameter": {
        "__type": "<class 'pyplumio.structures.schedules.ScheduleParameter'>",
        "repr": "ScheduleParameter(device=EcoMAX, description=ScheduleParameterDescription(name='heating_schedule_parameter', cls=<class 'pyplumio.structures.schedules.ScheduleParameter'>), value=0, min_value=0, max_value=30)"
      },
      "boiler_work_schedule_switch": {
        "__type": "<class 'pyplumio.structures.schedules.ScheduleBinaryParameter'>",
        "repr": "ScheduleBinaryParameter(device=EcoMAX, description=ScheduleParameterDescription(name='boiler_work_schedule_switch', cls=<class 'pyplumio.structures.schedules.ScheduleBinaryParameter'>), value=off, min_value=off, max_value=on)"
      },
      "boiler_work_schedule_parameter": {
        "__type": "<class 'pyplumio.structures.schedules.ScheduleParameter'>",
        "repr": "ScheduleParameter(device=EcoMAX, description=ScheduleParameterDescription(name='boiler_work_schedule_parameter', cls=<class 'pyplumio.structures.schedules.ScheduleParameter'>), value=0, min_value=0, max_value=30)"
      },
      "schedule_parameters": true,
      "mixer_parameters": false,
      "product": {
        "__type": "<class 'pyplumio.structures.product_info.ProductInfo'>",
        "repr": "ProductInfo(type=<ProductType.ECOMAX_P: 0>, id=138, uid='**REDACTED**', logo=35328, image=2816, model='EM350P2-C')"
      },
      "airflow_power_100": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='airflow_power_100', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=36.0, min_value=31.0, max_value=70.0)"
      },
      "airflow_power_50": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='airflow_power_50', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=30.0, min_value=26.0, max_value=35.0)"
      },
      "airflow_power_30": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='airflow_power_30', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=25.0, min_value=19.0, max_value=29.0)"
      },
      "cycle_time": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='cycle_time', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=15.0, min_value=1.0, max_value=250.0)"
      },
      "h2_hysteresis": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='h2_hysteresis', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=3.0, min_value=1.0, max_value=30.0)"
      },
      "h1_hysteresis": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='h1_hysteresis', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=1.0, min_value=1.0, max_value=30.0)"
      },
      "heating_hysteresis": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='heating_hysteresis', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=5.0, min_value=1.0, max_value=30.0)"
      },
      "fuzzy_logic": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxBinaryParameter'>",
        "repr": "EcomaxBinaryParameter(device=EcoMAX, description=EcomaxParameterDescription(name='fuzzy_logic', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxBinaryParameter'>, multiplier=1, offset=0), value=on, min_value=off, max_value=on)"
      },
      "min_fuzzy_logic_power": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='min_fuzzy_logic_power', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=0.0, min_value=0.0, max_value=100.0)"
      },
      "max_fuzzy_logic_power": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='max_fuzzy_logic_power', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=100.0, min_value=0.0, max_value=100.0)"
      },
      "min_fan_power": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='min_fan_power', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=19.0, min_value=10.0, max_value=100.0)"
      },
      "airflow_power_grate": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='airflow_power_grate', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=30.0, min_value=19.0, max_value=100.0)"
      },
      "boiler_hysteresis_grate": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='boiler_hysteresis_grate', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=4.0, min_value=1.0, max_value=30.0)"
      },
      "supervision_work_airflow": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='supervision_work_airflow', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=20.0, min_value=0.0, max_value=100.0)"
      },
      "supervision_work_airflow_brake": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='supervision_work_airflow_brake', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=8.0, min_value=1.0, max_value=250.0)"
      },
      "heating_temp_grate": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='heating_temp_grate', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=40.0, min_value=40.0, max_value=85.0)"
      },
      "fuel_detection_time_grate": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='fuel_detection_time_grate', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=15.0, min_value=0.0, max_value=250.0)"
      },
      "airflow_power_kindle": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='airflow_power_kindle', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=28.0, min_value=19.0, max_value=45.0)"
      },
      "scavenge_kindle": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='scavenge_kindle', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=10.0, min_value=10.0, max_value=240.0)"
      },
      "kindle_time": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='kindle_time', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=6.0, min_value=1.0, max_value=20.0)"
      },
      "warming_up_time": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='warming_up_time', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=20.0, min_value=1.0, max_value=250.0)"
      },
      "kindle_finish_threshold": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='kindle_finish_threshold', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=5.0, min_value=1.0, max_value=100.0)"
      },
      "min_kindle_power_time": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='min_kindle_power_time', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=2.0, min_value=0.0, max_value=100.0)"
      },
      "scavenge_after_kindle": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='scavenge_after_kindle', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=50.0, min_value=1.0, max_value=200.0)"
      },
      "airflow_power_after_kindle": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='airflow_power_after_kindle', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=26.0, min_value=19.0, max_value=35.0)"
      },
      "supervision_time": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='supervision_time', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=5.0, min_value=0.0, max_value=60.0)"
      },
      "supervision_cycle_duration": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='supervision_cycle_duration', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=40.0, min_value=1.0, max_value=250.0)"
      },
      "airflow_power_supervision": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='airflow_power_supervision', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=22.0, min_value=19.0, max_value=100.0)"
      },
      "max_extinguish_time": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='max_extinguish_time', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=12.0, min_value=1.0, max_value=60.0)"
      },
      "min_extinguish_time": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='min_extinguish_time', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=4.0, min_value=1.0, max_value=60.0)"
      },
      "airflow_power_extinguish": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='airflow_power_extinguish', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=80.0, min_value=19.0, max_value=100.0)"
      },
      "airflow_work_extinguish": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='airflow_work_extinguish', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=40.0, min_value=1.0, max_value=100.0)"
      },
      "airflow_brake_extinguish": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='airflow_brake_extinguish', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=15.0, min_value=10.0, max_value=250.0)"
      },
      "scavenge_start_extinguish": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='scavenge_start_extinguish', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=10.0, min_value=1.0, max_value=100.0)"
      },
      "scavenge_stop_extinguish": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='scavenge_stop_extinguish', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=5.0, min_value=1.0, max_value=100.0)"
      },
      "clean_begin_time": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='clean_begin_time', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=10.0, min_value=10.0, max_value=250.0)"
      },
      "extinguish_clean_time": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='extinguish_clean_time', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=2.0, min_value=1.0, max_value=30.0)"
      },
      "airflow_power_clean": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='airflow_power_clean', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=100.0, min_value=19.0, max_value=100.0)"
      },
      "warming_up_brake_time": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='warming_up_brake_time', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=24.0, min_value=1.0, max_value=250.0)"
      },
      "fuel_flow_kg_h": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='fuel_flow_kg_h', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=10, offset=0), value=5.3, min_value=0.1, max_value=25.0)"
      },
      "fuel_factor": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='fuel_factor', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=2.0, min_value=1.0, max_value=100.0)"
      },
      "fuel_calorific_value_kwh_kg": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='fuel_calorific_value_kwh_kg', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=10, offset=0), value=5.2, min_value=0.1, max_value=25.0)"
      },
      "fuel_detection_time": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='fuel_detection_time', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=1.0, min_value=0.0, max_value=5.0)"
      },
      "heating_target_temp": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='heating_target_temp', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=70.0, min_value=36.0, max_value=85.0)"
      },
      "min_heating_target_temp": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='min_heating_target_temp', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=36.0, min_value=30.0, max_value=80.0)"
      },
      "max_heating_target_temp": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='max_heating_target_temp', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=85.0, min_value=30.0, max_value=90.0)"
      },
      "heating_pump_on_temp": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='heating_pump_on_temp', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=40.0, min_value=30.0, max_value=80.0)"
      },
      "pause_heating_for_water_heater": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='pause_heating_for_water_heater', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=0.0, min_value=0.0, max_value=99.0)"
      },
      "increase_heating_temp_for_water_heater": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='increase_heating_temp_for_water_heater', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=5.0, min_value=3.0, max_value=15.0)"
      },
      "term_boiler_mode": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxBinaryParameter'>",
        "repr": "EcomaxBinaryParameter(device=EcoMAX, description=EcomaxParameterDescription(name='term_boiler_mode', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxBinaryParameter'>, multiplier=1, offset=0), value=off, min_value=off, max_value=on)"
      },
      "boiler_alert_temp": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='boiler_alert_temp', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=90.0, min_value=85.0, max_value=95.0)"
      },
      "max_feeder_temp": {
        "__type": "<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>",
        "repr": "EcomaxParameter(device=EcoMAX, description=EcomaxParameterDescription(name='max_feeder_temp', cls=<class 'pyplumio.structures.ecomax_parameters.EcomaxParameter'>, multiplier=1, offset=0), value=60.0, min_value=40.0, max_value=90.0)"
      },
      "ecomax_parameters": true,
      "thermostat_profile": null,
      "thermostat_parameters": false,
      "thermostat_parameters_decoder": true,
      "password": "**REDACTED**",
      "frame_errors": [],
      "loaded": true,
      "regdata": {
        "1792": 2,
        "1536": true,
        "1538": false,
        "1542": false,
        "1541": true,
        "5": false,
        "3": false,
        "1543": false,
        "1544": false,
        "1545": false,
        "1546": false,
        "1547": false,
        "1548": false,
        "1549": false,
        "2": false,
        "6": false,
        "1024": 60.751739501953125,
        "1027": -246.8609619140625,
        "1026": 26.1065673828125,
        "26": 100.0,
        "1025": -195.74267578125,
        "29": 0.0,
        "1028": 0.0,
        "1032": 0.0,
        "1031": 0.0,
        "1029": 0.0,
        "25": 0.0,
        "27": 0.0,
        "1280": 70,
        "1283": 0,
        "1282": 0,
        "1287": 40,
        "1281": 45,
        "1288": 40,
        "2048": 0
      }
    }
  }
}

### Code of Conduct

- [X] I agree to follow this project's Code of Conduct
denpamusic commented 1 year ago

Hi,

Thank you for the feedback!

I believe I found missing close() call in reconnect logic. This explains why the issue is only happening after HASS runs for a while, since open descriptors accumulate with each connection attempt.

The issue should now be fixed in https://github.com/denpamusic/PyPlumIO/commit/122ba049f36e7a6f5b400fb1ea7546f01e004d18. This fix will be included in PyPlumIO v0.4.3 and corresponding v0.3.9 of HASS integration.

Thanks again for your help!

denpamusic commented 1 year ago

PyPlumIO v0.4.3 is released and integration manifest is updated to point at new version. You can now try to install main branch of the integration via HACS as described here and check if this issue is fixed.

swex commented 1 year ago

looks ok now, thanks