sincze / Domoticz-Growatt-Webserver-Plugin

16 stars 10 forks source link

API JSON change? #29

Closed Tinus016 closed 1 year ago

Tinus016 commented 1 year ago

After a few years of working perfectly, today i received the following error message. My experience with python is too low to understand what is failing now. The error message came after a few 403 messages.

2022-11-19 11:40:51.259 Error: Growatt: Call to function 'onMessage' failed, exception details:
2022-11-19 11:40:51.260 Error: Growatt: Traceback (most recent call last):
2022-11-19 11:40:51.260 Error: Growatt: File "/home/pi/domoticz/plugins/Domoticz-Growatt-Webserver-Plugin/plugin.py", line 285, in onMessage
2022-11-19 11:40:51.260 Error: Growatt: _plugin.onMessage(Connection, Data)
2022-11-19 11:40:51.260 Error: Growatt: File "/home/pi/domoticz/plugins/Domoticz-Growatt-Webserver-Plugin/plugin.py", line 171, in onMessage
2022-11-19 11:40:51.260 Error: Growatt: apiResponse = json.loads(strData)
2022-11-19 11:40:51.260 Error: Growatt: File "/usr/lib/python3.7/json/__init__.py", line 348, in loads
2022-11-19 11:40:51.260 Error: Growatt: return _default_decoder.decode(s)
2022-11-19 11:40:51.260 Error: Growatt: File "/usr/lib/python3.7/json/decoder.py", line 337, in decode
2022-11-19 11:40:51.260 Error: Growatt: obj, end = self.raw_decode(s, idx=_w(s, 0).end())
2022-11-19 11:40:51.260 Error: Growatt: File "/usr/lib/python3.7/json/decoder.py", line 355, in raw_decode
2022-11-19 11:40:51.261 Error: Growatt: raise JSONDecodeError("Expecting value", s, err.value) from None
2022-11-19 11:40:51.261 Error: Growatt: json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
tonbor commented 1 year ago

Same problem for me 2022-11-19 18:37:59.199 Error: Growatt Inverter: Call to function 'onMessage' failed, exception details: 2022-11-19 18:37:59.200 Error: Growatt Inverter: Traceback (most recent call last): 2022-11-19 18:37:59.200 Error: Growatt Inverter: File "/home/pi/domoticz/plugins/Domoticz-Growatt-Webserver-Plugin/plugin.py", line 275, in onMessage 2022-11-19 18:37:59.200 Error: Growatt Inverter: _plugin.onMessage(Connection, Data) 2022-11-19 18:37:59.200 Error: Growatt Inverter: File "/home/pi/domoticz/plugins/Domoticz-Growatt-Webserver-Plugin/plugin.py", line 172, in onMessage 2022-11-19 18:37:59.201 Error: Growatt Inverter: apiResponse = json.loads(strData) 2022-11-19 18:37:59.201 Error: Growatt Inverter: File "/usr/lib/python3.7/json/init.py", line 348, in loads 2022-11-19 18:37:59.201 Error: Growatt Inverter: return _default_decoder.decode(s) 2022-11-19 18:37:59.201 Error: Growatt Inverter: File "/usr/lib/python3.7/json/decoder.py", line 337, in decode 2022-11-19 18:37:59.201 Error: Growatt Inverter: obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 2022-11-19 18:37:59.201 Error: Growatt Inverter: File "/usr/lib/python3.7/json/decoder.py", line 355, in raw_decode 2022-11-19 18:37:59.201 Error: Growatt Inverter: raise JSONDecodeError("Expecting value", s, err.value) from None 2022-11-19 18:37:59.201 Error: Growatt Inverter: json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Tinus016 commented 1 year ago

I have tried to find it out my self, but no success at this moment. I also put the highest level of debug on and that tells me this:

19-11-2022 | 16:55:01.615 | Growatt: >'Status':'200'
19-11-2022 | 16:55:01.615 | Growatt: >'Headers':
19-11-2022 | 16:55:01.615 | Growatt: ---->'Server':'Tengine'
19-11-2022 | 16:55:01.615 | Growatt: ---->'Content-Type':'application/json;charset=UTF-8'
19-11-2022 | 16:55:01.615 | Growatt: ---->'Transfer-Encoding':'chunked'
19-11-2022 | 16:55:01.615 | Growatt: ---->'Connection':'keep-alive'
19-11-2022 | 16:55:01.615 | Growatt: ---->'Vary':'Accept-Encoding'
19-11-2022 | 16:55:01.615 | Growatt: ---->'Date':'Sat, 19 Nov 2022 15:55:01 GMT'
19-11-2022 | 16:55:01.615 | Growatt: ---->'Set-Cookie':
19-11-2022 | 16:55:01.615 | Growatt: --------['JSESSIONID=A830E37613389AF6211DC2513BA2F5A6; Path=/; HttpOnly']
19-11-2022 | 16:55:01.615 | Growatt: --------['SERVERID=c6ce5dcf4bc4a6d94703a96816e904f0\|1668873301\|1668873301;Path=/']
19-11-2022 | 16:55:01.615 | Growatt: ---->'Via':'cache26.l2de2[63,0], cache7.nl2[304,0]'
19-11-2022 | 16:55:01.615 | Growatt: ---->'Timing-Allow-Origin':'*'
19-11-2022 | 16:55:01.615 | Growatt: ---->'EagleId':'2ff6309b16688733012721957e'
19-11-2022 | 16:55:01.616 | Growatt: ---->'Content-Encoding':'gzip'
19-11-2022 | 16:55:01.616 | Growatt: >'Data':'b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03tS\xc1n\xdb0\x0c\xfd\x95A\xe7\xb4\xb0\xe5:N\|Z\x9a\x06C\x80 \x0b\xb6\xb6\x03V\x0c\x03-\xd3\x8e\x10Y\xf2$9EQ\xf4\xdfG\xc9\xce\xbaK\xe1\x8bEQ\xe4\xe3{\x8f\xaf\xac\x02qb\xe5+\xeb\\\xcbJ\xc6f\xcc\x1b\x0f\xea\x0e<P\xf4m\xc6\xea\xf8\xf7\xf4\xcaz\x05\xdaokJ\xe2\xd9\x82\xa7\x05\xa5\xc6\xd0\x1e:\xa4\xe0\xadA\xfb\xfb\xa7\xd1\xec\xed\x17=\xc2\xb3\x14\xb86\x83\xf6t\x95R\xaat_{\xd4w1\xbe\x93\x8e\xc2\xe9\x8c\xfd\x19@I\xffB)ILY\x1fQ\x9c\x1e\x1c\xda\xd5\xe0\x8f\xac\xf4v\xc0\x10\xdeH\x11\x83u\xfd\xbd\x03\xeb\xc7"\xef\xd7\xef\x85\x0f`\xa1s\xacLB\xf8Q\xe2\xf3\x18\xde\xea\xc6\xb0\xb2\x01\xe5(\xdf\rB\xa0s\x97\xe7Tw\xac\x16Q\x0et\x0cd@\x8b\xda\xafM\x1d\xe2\xab\xdd\xfe\xc7&\x0c{4\x1a\xf7C7\xb2$z\xf3\x8c\xf6\xde\x9cPS\x00\xe7\xd5<o\xc4\\p\xc1\x9b"\xab\x8aE.R^\xa0\xe0\xf5\x9c\xd7M(\xed_z\x8c\xc8\xce\xb2?\x18\xa9=AH\xe9\x08}o\xcd\x19\xeb\x7f\x00{p\xee\xd9\xd8@tZ,\x01\xb3<_.\xaa\x9b\x1b\xe4\x15O\xe7I\x86\xcb\xa4i\xe6MSU\r\x95\xb5\xb2=z\x85gT\x91Q\xe9V\x01zl\x14\x86\xd9\n\xa3\x0f\x10\xc8\x0c\xa0\xc3\xb0h\x1f\xac\x1a\x8fR\xd3\xc9\xa3\x1d\xf5x"\xdd$u\xbdIx\xbe(fL\x81\x1f\xd3\xc0"9\x80m\x06kh\x04\xba\xd0\x93SNR\xd7\xb1\x93\x96\xe24\xd9@\x0fJ\x05\xb2\xe8\x91\xf6A\xb5\xed\x98\xe2e\x87\xe4\x0e\x8c(A\x88`\x8d\xe9I\xd0T\xea\xcf\x9d\xd4\xd2\xe6\xf3k\x1d\xde\x87{\x1b\x9d\xb1G\x7fDKF\xab\xdd\x7f\x90\xbfX3\xf4#f18o:\xb4\x93\\\x81\x13li"R\'R\x1e\xbd\x85\x1a*\x15H\x1eUW\xe0\xfc\xce\xb4Ro\xfb@3/\xae\x13\xfa.\x0e\xd8\x81n\x07\xb2@\x10VGc\xde\xcav=\xb5\x19\xa9\rD\xb1)}4\xd9\xfdE_\xa9\x1d-\x90B\xbb\x89=\'g\x91\xcc\x13\x9c8]\xd7\x83~\x99Tp\x8f\xb4\x05\x87c$g4\xc4JIp\x1f0\x83\x1dH\xf5\x11k\xa4\x94G\xda\xdd\xd0\x87\'\xe9\xf2*\xe5Wi\xf1)-\xca,)\xb3\x88Cxy\xc6\x89\xf9\xc0\x95Q8I\xe4:\xb77>.\xc3dE\x1d\x8f\xef\xb8\xa5;LK\xf0\r\xdb\xcb\x9a\x11\xf8\xcd\x88)\xc8<-D\xc2\x93\x04P\x14\xb8\xac\x05\xf0<\x1ci%\x16\xbc\x81\xac\x80\xe4/\x00\x00\x00\xff\xff2NRB\x8a\x83\x90\xcc\\\x88{\x8d\x80\x8e5\xd45\xb4T02\xb625\xb52\x00\xb9\x17d2\xccU\x90\xb8CJ<\xfe\xc5\xb8B\tTj9&\x17"Rv\n\x90U\x94\x99TZ\x92\x8f\x1a/\xc9\xc0T\xe3\x99\x97\x92Z\x01L\x98\xb5\xb0\xd2\x04\\\xcc\xb8%\xe6f\xe6T\xc2\xa2$>\x19\x92\xbc\x0c\x95jk\x01\x00\x00\x00\xff\xff\x03\x00\xa5\x17]\'5\x05\x00\x00''
19-11-2022 | 16:55:01.616 | Error: Growatt: Call to function 'onMessage' failed, exception details:
19-11-2022 | 16:55:01.617 | Error: Growatt: Traceback (most recent call last):
19-11-2022 | 16:55:01.617 | Error: Growatt:   File "/home/pi/domoticz/plugins/Domoticz-Growatt-Webserver-Plugin/plugin.py", line 285, in onMessage
19-11-2022 | 16:55:01.618 | Error: Growatt:     _plugin.onMessage(Connection, Data)
19-11-2022 | 16:55:01.618 | Error: Growatt:   File "/home/pi/domoticz/plugins/Domoticz-Growatt-Webserver-Plugin/plugin.py", line 171, in onMessage
19-11-2022 | 16:55:01.618 | Error: Growatt:     apiResponse = json.loads(strData)
19-11-2022 | 16:55:01.618 | Error: Growatt:   File "/usr/lib/python3.7/json/__init__.py", line 348, in loads
19-11-2022 | 16:55:01.618 | Error: Growatt:     return _default_decoder.decode(s)
19-11-2022 | 16:55:01.618 | Error: Growatt:   File "/usr/lib/python3.7/json/decoder.py", line 337, in decode
19-11-2022 | 16:55:01.618 | Error: Growatt:     obj, end = self.raw_decode(s, idx=_w(s, 0).end())
19-11-2022 | 16:55:01.618 | Error: Growatt:   File "/usr/lib/python3.7/json/decoder.py", line 355, in raw_decode
19-11-2022 | 16:55:01.618 | Error: Growatt:     raise JSONDecodeError("Expecting value", s, err.value) from None
19-11-2022 | 16:55:01.618 | Error: Growatt: json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

In my opinion there is something wrong with the received data. It's expecting a encoded JSON but it's no JSON or so

tonbor commented 1 year ago

same problem here 2 years aga, they fixed the plugin https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin/issues/521

Tinus016 commented 1 year ago

As temporary fix i use this: domoticz.local:8080/json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=0;Total amount from the Growatt app by 1000 forget the . and add 00 in my case: domoticz.local:8080/json.htm?type=command&param=udevice&idx=17&nvalue=0&svalue=0;6714300 I do this once a day at the end off the day otherwise my "real use counter" is out of sinq

sincze commented 1 year ago

Can you give the following a try: So add a # 2 times in front of the encoding of 'Accept-Encoding': 'gzip'

    def apiRequestHeaders(self):        # Needed headers for Login Function
        return {
            'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
            'Connection': 'keep-alive',
            'Host': 'server-api.growatt.com',
            'User-Agent': 'Domoticz/1.0'
#            'Accept-Encoding': 'gzip'
        }

    def apiRequestHeaders_cookie(self): # Needed headers for Data retrieval
        return {
            'Verb': 'POST',
            'URL': '/newTwoPlantAPI.do?op=getUserCenterEnertyDataByPlantid',
            'Headers' : { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
                          'Connection': 'keep-alive',
                          'Host': 'server-api.growatt.com',
                          'User-Agent': 'Domoticz/1.0',
#                          'Accept-Encoding': 'gzip',
                          'Cookie': ['JSESSIONID='+self.sessionId, 'SERVERID='+self.serverId]
                        },
Superpjeter commented 1 year ago

I had the same problem and the 2 times # works for me, thanks

Tinus016 commented 1 year ago

Can you give the following a try: So add a # 2 times in front of the encoding of 'Accept-Encoding': 'gzip'

    def apiRequestHeaders(self):        # Needed headers for Login Function
        return {
            'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
            'Connection': 'keep-alive',
            'Host': 'server-api.growatt.com',
            'User-Agent': 'Domoticz/1.0'
#            'Accept-Encoding': 'gzip'
        }

    def apiRequestHeaders_cookie(self): # Needed headers for Data retrieval
        return {
            'Verb': 'POST',
            'URL': '/newTwoPlantAPI.do?op=getUserCenterEnertyDataByPlantid',
            'Headers' : { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
                          'Connection': 'keep-alive',
                          'Host': 'server-api.growatt.com',
                          'User-Agent': 'Domoticz/1.0',
#                          'Accept-Encoding': 'gzip',
                          'Cookie': ['JSESSIONID='+self.sessionId, 'SERVERID='+self.serverId]
                        },

This fixed the issue!! Thank you very much!

tonbor commented 1 year ago

Can you give the following a try: So add a # 2 times in front of the encoding of 'Accept-Encoding': 'gzip'

    def apiRequestHeaders(self):        # Needed headers for Login Function
        return {
            'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
            'Connection': 'keep-alive',
            'Host': 'server-api.growatt.com',
            'User-Agent': 'Domoticz/1.0'
#            'Accept-Encoding': 'gzip'
        }

    def apiRequestHeaders_cookie(self): # Needed headers for Data retrieval
        return {
            'Verb': 'POST',
            'URL': '/newTwoPlantAPI.do?op=getUserCenterEnertyDataByPlantid',
            'Headers' : { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
                          'Connection': 'keep-alive',
                          'Host': 'server-api.growatt.com',
                          'User-Agent': 'Domoticz/1.0',
#                          'Accept-Encoding': 'gzip',
                          'Cookie': ['JSESSIONID='+self.sessionId, 'SERVERID='+self.serverId]
                        },

Thanks, is working

bertinholland commented 1 year ago

confirm it is working fine after remark two lines ! Thanks for your quick fi. The code is ready for integration in the production version And no errors in de domoticz logfile anymore

image

sincze commented 1 year ago

Merged into V1.0.1

hofikhof commented 1 year ago

After this update still not working. I have domoticz 2022.2 and growatt pligin 1.0.1 I deleted this hw and create new without success.

2022-11-21 13:02:48.527 Status: growatt: Entering work loop. 2022-11-21 13:02:48.528 Status: growatt: Started. 2022-11-21 13:02:48.781 Status: growatt: Initialized version 1.0.1, author 'sincze' 2022-11-21 13:02:48.802 Error: growatt: Call to function 'onStart' failed, exception details: 2022-11-21 13:02:48.828 Error: growatt: Traceback (most recent call last): 2022-11-21 13:02:48.828 Error: growatt: File "/home/pi/domoticz/plugins/Domoticz-Growatt-Webserver-Plugin/plugin.py", line 265, in onStart 2022-11-21 13:02:48.828 Error: growatt: _plugin.onStart() 2022-11-21 13:02:48.828 Error: growatt: File "/home/pi/domoticz/plugins/Domoticz-Growatt-Webserver-Plugin/plugin.py", line 137, in onStart 2022-11-21 13:02:48.828 Error: growatt: createDevices() 2022-11-21 13:02:48.828 Error: growatt: File "/home/pi/domoticz/plugins/Domoticz-Growatt-Webserver-Plugin/plugin.py", line 354, in createDevices 2022-11-21 13:02:48.828 Error: growatt: image = Images["Growatt"].ID # Get id from database 2022-11-21 13:02:48.828 Error: growatt: KeyError: 'Growatt' 2022-11-21 13:02:58.006 growatt: Pushing 'onHeartbeatCallback' on to queue 2022-11-21 13:02:58.056 growatt: Processing 'onHeartbeatCallback' message ...

sincze commented 1 year ago

@hofikhof did you remove the icons as well before re-adding the plugin ???

hofikhof commented 1 year ago

@hofikhof did you remove the icons as well before re-adding the plugin ???

yes, in www/images

Edit: it has been created 2 devices, growatt Inverter (W) and growatt inverter (kWh) but the 3. not - it will be inverter status

sincze commented 1 year ago

You can do this from the Domoticz Inteface that will probably clean the ID's as well. I always remove via Domoticz interface not on file level.

hofikhof commented 1 year ago

without succes. I deleted via interface this 2 devices (inverter status has not been created as i wrote), remove hw, delete plugin, new git clone and adding, but still the same error...

sincze commented 1 year ago

Not only delete 2 devices... delete Growatt icons as described here image

sincze commented 1 year ago

image Gives me the follwing after I recreate the plugin from the hardware menu.

hofikhof commented 1 year ago

image Gives me the follwing after I recreate the plugin from the hardware menu.

Now it works without errors - I see this 2 devices (inverter status has not been created but earlier yes}.... I don't need status. Thank you for your reply.

image

hofikhof commented 1 year ago

Gives me the follwing after I recreate the plugin from the hardware menu.

I use my own python script with more devices - only run as cronjob python script. If you need to upgrade your plugin please send me message.

image