AlexxIT / SonoffLAN

Control Sonoff Devices with eWeLink (original) firmware over LAN and/or Cloud from Home Assistant
https://github.com/AlexxIT/Blog
MIT License
2.66k stars 412 forks source link

NS Panel Climate Control #979

Closed proxlx closed 1 year ago

proxlx commented 1 year ago

Hello! I have recently added an NS Panel to my system. I have noticed that the climate controls seem to only work correctly one way. NS Panel —-> HA. Every change made on the NS panel thermostat (temp, hvac mode) appears correctly in HA (and instantaneous) but if I set a temperature in HA it doesn’t then appear in the Panel. All HVAC mode works correctly from HA but not target temperature. Any adjustments made in HA just jump back to what is currently set on the NS Panel.

Sonoff For LAN latest version NS Panel Firmware 1.3.1

Many thanks!

AlexxIT commented 1 year ago

Show device diagnostics.

proxlx commented 1 year ago

Hi AlexxIT - Thank you for looking at this. Please see below:-

{
  "home_assistant": {
    "installation_type": "Home Assistant OS",
    "version": "2022.9.5",
    "dev": false,
    "hassio": true,
    "virtualenv": false,
    "python_version": "3.10.5",
    "docker": true,
    "arch": "x86_64",
    "timezone": "Europe/London",
    "os_name": "Linux",
    "os_version": "5.15.67",
    "supervisor": "2022.09.1",
    "host_os": "Home Assistant OS 9.0",
    "docker_version": "20.10.17",
    "chassis": "vm",
    "run_as_root": true
  },
  "custom_components": {
    "iphonedetect": {
      "version": "1.4.0",
      "requirements": []
    },
    "shelly": {
      "version": "1.0.2",
      "requirements": [
        "pyShelly==1.0.2",
        "paho-mqtt==1.6.1",
        "websocket-client"
      ]
    },
    "hive": {
      "version": "2021.7.0",
      "requirements": [
        "pyhiveapi==0.5.13"
      ]
    },
    "hildebrandglow_dcc": {
      "version": "0.6.0",
      "requirements": []
    },
    "jlrincontrol": {
      "version": "2.2.0",
      "requirements": [
        "jlrpy==1.4.1"
      ]
    },
    "alexa_media": {
      "version": "4.1.2",
      "requirements": [
        "alexapy==1.26.3",
        "packaging>=20.3",
        "wrapt>=1.12.1"
      ]
    },
    "sonoff": {
      "version": "3.2.0",
      "requirements": [
        "pycryptodome>=3.6.6"
      ]
    },
    "hacs": {
      "version": "1.27.2",
      "requirements": [
        "aiogithubapi>=22.2.4"
      ]
    }
  },
  "integration_manifest": {
    "domain": "sonoff",
    "name": "Sonoff",
    "config_flow": true,
    "documentation": "https://github.com/AlexxIT/SonoffLAN",
    "issue_tracker": "https://github.com/AlexxIT/SonoffLAN/issues",
    "codeowners": [
      "@AlexxIT"
    ],
    "dependencies": [
      "http",
      "zeroconf"
    ],
    "requirements": [
      "pycryptodome>=3.6.6"
    ],
    "version": "3.2.0",
    "iot_class": "local_push",
    "is_built_in": false
  },
  "data": {
    "version": "38856d1",
    "cloud_auth": true,
    "config": {
      "username": "***",
      "password": "***",
      "reload": "always"
    },
    "options": {},
    "errors": [
      {
        "name": "custom_components.sonoff.core.ewelink.cloud",
        "message": [
          "Cloud processing error"
        ],
        "level": "WARNING",
        "source": [
          "custom_components/sonoff/core/ewelink/cloud.py",
          63
        ],
        "timestamp": 1663922800.3581834,
        "exception": "Traceback (most recent call last):\n  File \"/config/custom_components/sonoff/core/ewelink/cloud.py\", line 286, in run_forever\n    await self._process_ws_msg(resp)\n  File \"/config/custom_components/sonoff/core/ewelink/cloud.py\", line 333, in _process_ws_msg\n    self._set_response(data[\"sequence\"], data[\"error\"])\n  File \"/config/custom_components/sonoff/core/ewelink/cloud.py\", line 63, in _set_response\n    self._waiters[sequence].set_result(result)\nasyncio.exceptions.InvalidStateError: invalid state\n",
        "count": 1,
        "first_occurred": 1663922800.3581834
      },
      {
        "name": "custom_components.sonoff.core.ewelink.cloud",
        "message": [
          "Cloud ERROR: {'error': 504, 'reason': 'Request Timeout', 'deviceid': '1000be61bb', 'apikey': '641e5131-b912-4992-a5f5-2ab76f753df7', 'sequence': '1663925451407'}",
          "Cloud ERROR: {'error': 400, 'deviceid': '100162f9b4', 'apikey': '641e5131-b912-4992-a5f5-2ab76f753df7', 'sequence': '1663926305000'}",
          "Cloud ERROR: {'error': 400, 'deviceid': '100162f9b4', 'apikey': '641e5131-b912-4992-a5f5-2ab76f753df7', 'sequence': '1663928405000'}",
          "Cloud ERROR: {'error': 400, 'deviceid': '100162f9b4', 'apikey': '641e5131-b912-4992-a5f5-2ab76f753df7', 'sequence': '1663956005000'}",
          "Cloud ERROR: {'error': 400, 'deviceid': '100162f9b4', 'apikey': '641e5131-b912-4992-a5f5-2ab76f753df7', 'sequence': '1664002805000'}"
        ],
        "level": "WARNING",
        "source": [
          "custom_components/sonoff/core/ewelink/cloud.py",
          286
        ],
        "timestamp": 1664002805.2928436,
        "exception": "",
        "count": 16,
        "first_occurred": 1663869605.385194
      },
      {
        "name": "custom_components.sonoff.core.ewelink.cloud",
        "message": [
          "Cloud processing error"
        ],
        "level": "WARNING",
        "source": [
          "custom_components/sonoff/core/ewelink/__init__.py",
          159
        ],
        "timestamp": 1664004089.3960657,
        "exception": "Traceback (most recent call last):\n  File \"/config/custom_components/sonoff/core/ewelink/cloud.py\", line 286, in run_forever\n    await self._process_ws_msg(resp)\n  File \"/config/custom_components/sonoff/core/ewelink/cloud.py\", line 340, in _process_ws_msg\n    self.dispatcher_send(SIGNAL_UPDATE, data)\n  File \"/config/custom_components/sonoff/core/ewelink/base.py\", line 59, in dispatcher_send\n    handler(*args, **kwargs)\n  File \"/config/custom_components/sonoff/core/ewelink/__init__.py\", line 159, in cloud_update\n    did = msg[\"deviceid\"]\nKeyError: 'deviceid'\n",
        "count": 1,
        "first_occurred": 1664004089.3960657
      }
    ],
    "device": {
      "uiid": 133,
      "params": {
        "bindInfos": "***",
        "version": 8,
        "pulses": [
          {
            "pulse": "off",
            "width": 1000,
            "outlet": 0
          },
          {
            "pulse": "off",
            "width": 1000,
            "outlet": 1
          }
        ],
        "switches": [
          {
            "switch": "off",
            "outlet": 0
          },
          {
            "switch": "off",
            "outlet": 1
          }
        ],
        "configure": [
          {
            "startup": "off",
            "outlet": 0
          },
          {
            "startup": "off",
            "outlet": 1
          }
        ],
        "lock": 0,
        "fwVersion": "1.3.1",
        "reset_reason": "ESP_RST_POWERON",
        "value": 1,
        "temperature": 20,
        "humidity": "blank",
        "tempUnit": 0,
        "HMI_outdoorTemp": {
          "current": 16,
          "range": "9,16"
        },
        "HMI_weather": 35,
        "cityId": "2292429",
        "dst": 1,
        "dstChange": "2022-10-30T01:00:00.000Z",
        "geo": "52.77263588574351,-4.102939805457597",
        "timeZone": 0,
        "cityStr": "Barmouth",
        "only_device": {
          "ota": "success",
          "ota_fail_reason": 0
        },
        "ctype": "device",
        "id": "1000be61bb",
        "resourcetype": "ATC",
        "HMI_ATCDevice": {
          "ctype": "device",
          "id": "1000be61bb",
          "outlet": 0,
          "etype": "hot",
          "precision": 1
        },
        "ATCEnable": 0,
        "ATCMode": 0,
        "ATCExpect0": 22,
        "HMI_resources": [
          {
            "ctype": "scene",
            "id": "632b746866f88d09f34350db"
          },
          {
            "ctype": "scene",
            "id": "632b749366f88d09f34350df"
          },
          {
            "ctype": "scene",
            "id": "632c54b98b5c16663e1bfb73"
          },
          {
            "ctype": "scene",
            "id": "632b7543ff70f460c0bdf532"
          },
          {
            "ctype": "scene",
            "id": "632b7501ff70f460c0bdf52f"
          },
          {
            "ctype": "scene",
            "id": "632b74da66f88d09f34350e5"
          },
          {
            "ctype": "scene",
            "id": "632b5d8c8b5c16663e1bf08d"
          },
          {
            "ctype": "scene",
            "id": "632b5e2166f88d09f3434e61"
          }
        ],
        "tempCorrection": 1
      },
      "model": "NSPanel",
      "online": true,
      "localtype": null,
      "deviceid": "100162f9b4"
    }
  }
}
proxlx commented 1 year ago

https://user-images.githubusercontent.com/64808492/192092499-74dfb1be-6e97-41d2-adc4-1c1f7b5e6f95.mov

Please see short clip showing the NS Panel talking correctly to HA, but HA not sending the temp to the NS Panel. HVAC mode from HA to NS Panel works correctly. Many thanks

MishoOo123 commented 1 year ago

I have the same problem !

sipimokus commented 1 year ago

Here too, but I think this is a bug in Sonoff, looks like the NSPanel is stronger than the cloud command. I try it with other parameters than "ATCExpect0", maybe we can refresh the screen, but failed (ex. HMI_ATCDevice reconfiguration).

No difference between 1.3.0 and 1.3.1 panel FW.

Test: If you don't wake up the panel, and only use the eWelink app, the climate control is "sometimes random" working.

proxlx commented 1 year ago

@sipimokus @MishoOo123 Did anybody manage to find a work around for this issue at all? Many thanks!

sipimokus commented 1 year ago

Maybe I found working method, but not perfect, looks like my HASS don't managing perfectly the cooling / heating mode. 🤔

PR: https://github.com/AlexxIT/SonoffLAN/pull/1014


@MishoOo123 @proxlx I use all NSPanel in heating mode, so the error does not occur.

Check it please, you can testing locally, ex. override /config/custom_components/sonoff/climate.py file with this: https://raw.githubusercontent.com/AlexxIT/SonoffLAN/9d2d2e70655ddc21671fdbf62a1cdd40feb271d5/custom_components/sonoff/climate.py

proxlx commented 1 year ago

@sipimokus Thank you for investigating and sharing the code! I have tried the new climate.py but I seem to lose the temperature control itself. It shows the current temperature reported from the NS Panel but not the target temperature. See both screen shots with Original Climate File & You're New Climate File. It reports cannot call service if you try to move the temperature slider.

I replaced climate.py and then restarted HA, I think that is correct and didn't need to do anything more?

Many thanks!

Original Climate PY Updated Climate PY
MishoOo123 commented 1 year ago

@sipimokus Many thanks! Finally is Work. great job !

proxlx commented 1 year ago

@sipimokus This was my mistake! I was one version behind latest when I changed the file yesterday. I updated to latest Sonoff LAN and then changed the climate.py file and it works perfectly!! Thank you!

Opontios commented 1 year ago

Hi! Regarding the fix, it resolves the problem of HA->NSPanel control, but if you choose one of the NSPanel's channels as an executing device, it turns on/off physically and in HA, but in ewelink it doesn't update the current state of the channel. Just as a remark with hope to be fixed in 3.4.0.

BorjaLL commented 1 year ago

I'm trying to get something like this to work, how did you get the thermostat from HA to show up as a widget in the NSPanel?

proxlx commented 1 year ago

@BorjaLL The NS Panel is just standard so it runs as it normally would out of the box. All the images / videos on this topic is taken from HA

AlexxIT commented 1 year ago

https://github.com/AlexxIT/SonoffLAN/releases/tag/v3.5.1