2 Commits
Author SHA1 Message Date
zimonianhua 47b46be217 添加HACS文件 2024-07-30 13:42:01 +08:00
EastWood Yang c1db6b30b0 deploy 2024-07-26 16:55:43 +08:00
6 changed files with 105 additions and 88 deletions
Vendored
BIN
View File
Binary file not shown.
+6
View File
@@ -1 +1,7 @@
# State Grid
问题反馈可至 HassBox 小程序联系客服
或 入群反馈(本群仅用于国家电网集成问题反馈,严禁其他话题,违者❎)
![image](https://github.com/user-attachments/assets/4f6d3d54-0948-4e44-8465-e3751e846b40)
+1 -1
View File
@@ -1,4 +1,4 @@
DOMAIN = "state_grid"
PACKAGE_NAME = "custom_components.state_grid"
VERSION = "0.1.7"
VERSION = "0.1.9"
VERSION_STORAGE = 1
+92 -86
View File
@@ -51,17 +51,17 @@ _A9='querytypeCode'
_A8='01010049'
_A7='account'
_A6='daily_bill_list'
_A5='account_balance'
_A4='userName'
_A3='acctId'
_A2='resultCode'
_A1='quInfo'
_A0='BCP_000026'
_z='app'
_y='WEBALIPAY_01'
_x='order'
_w='state_grid'
_v='latestBillMonth'
_A5='userName'
_A4='acctId'
_A3='resultCode'
_A2='quInfo'
_A1='BCP_000026'
_A0='app'
_z='WEBALIPAY_01'
_y='order'
_x='state_grid'
_w='latestBillMonth'
_v='account_balance'
_u='list'
_t='authFlag'
_s='09'
@@ -114,7 +114,7 @@ from.const import VERSION
from.utils.logger import LOGGER
from.utils.store import async_save_to_store
from.utils.crypt import a,b,c,d,e
configuration={_K:{_W:_M,_Z:'',_a:'',_X:_w},_E:_b,_S:'32101',_I:_M,_AO:_M,'toPublish':_c,'siteId':'2012000000033700',_L:'',_N:'',_D:'',_C:{_x:_n,'uploadPic':'0101296','pauseSCode':'0101250','pauseTCode':'0101251','listconsumers':'0101093','messageList':'0101343','submit':'0101003','sbcMsg':'0101210','powercut':'0104514','BkAuth01':'f15','BkAuth02':'f18','BkAuth03':'f02','BkAuth04':'f17','BkAuth05':'f05','BkAuth06':'f16','BkAuth07':'f01','BkAuth08':'f03'},'electricityArchives':{'servicecode':'0104505',_E:_M},'subscriptionList':{_L:'APP_SGPMS_05_030',_N:'22',_I:_M,_D:'22',_S:'-1'},'userInformation':{_C:'01008183',_E:_b},'userInform':{_C:_r,_E:_b},'elesum':{_I:_M,_D:_y,_d:_G,_T:_G,_C:'0101143',_E:_z},_A7:{_I:_M,_D:'WEBA1007200'},_Ac:{_E:_M,_S:'-1',_I:_s,_AO:_s,_C:_A8,_D:'WEBA40050000',_K:{_W:_M,_Z:'',_a:'',_X:_w}},'doorAuth':{_E:_b,_C:'f04'},'xinZ':{_O:'101',_Ad:'101','fJ_busiTypeCode':'102',_Ae:'03','fJ_custType':'02',_Af:_c,_P:'',_D:_AP,_x:_n,_E:_b,_A9:_G},'onedo':{_C:_AD,_E:_b,_D:_AP,'queryType':'03'},'xinHuTongDian':{_O:'110',_J:'211',_P:'21102',_D:'WEBA10071200',_I:_M,_E:_s,_C:_r},'company':{_O:'104',_D:_AP,_Af:'02',_A9:_G,_t:_G,_E:_b,_x:_n},'charge':{_I:_s,_D:'WEBA10071300',_AO:'0901',_O:'102',_Ae:_c,_Ad:'102'},'other':{_I:_s,_D:'WEBA10079700',_O:'129',_J:'999',_P:'21501',_C:_A0,_L:'',_N:''},'vatchange':{'submit':'0101003',_J:'320',_P:'',_O:'115',_D:'WEBA10074000',_t:_G},'bill':{_e:_G,_D:_y,_T:_G,_C:_A0},_V:{_I:_M,_D:_y,_T:_G,_e:_s,_C:_A0,_E:_z},_m:{_I:_M,_e:'11',_D:_y,_d:_G,_T:_G,_C:_A0,_E:_z},'mouthOut':{_I:_M,_e:'11',_D:_y,_d:_G,_T:_G,_C:_A0,_E:_z},'meter':{_O:'114',_J:'304',_D:'WEBA10071000',_P:'',_C:_AD,_N:''},'complaint':{_J:'005','srvMode':_M,'anonymousFlag':'0','replyMode':_c,'retvisitFlag':_c},'report':{_J:'006'},'tradewinds':{_J:'019'},'somesay':{_J:'091'},'faultrepair':{_D:_Ag,_C:_r,_O:'111',_J:'001',_P:'21505'},'electronicInvoice':{_O:'105',_J:'0'},'rename':{_C:_AD,_D:'WEBA10076100',_J:'210',_O:'109',_t:_G,'gh_busiTypeCode':'211','gh_subusi':'21101',_N:'',_L:''},'pause':{_P:'',_C:_A8,_D:'WEBA10073600',_O:'107',_J:'203','jr_busi':'201',_N:'',_L:''},'capacityRecovery':{_C:_A8,_E:_b,_L:'',_N:'',_D:'WEBA10073700','busiTypeCode_stop':'204','busiTypeCode_less':'202',_J:'202',_P:'',_O:'108',_AQ:'5',_t:_G},'electricityPriceChange':{_C:_r,_J:'215',_P:'21502',_O:'113',_t:_G,_AQ:'15',_D:'WEBA10073900WEB',_L:'',_N:''},'electricityPriceStrategyChange':{_C:'01008183',_J:'215',_P:'21506',_O:'160',_D:'WEBV00000517WEB',_L:'',_N:''},'eemandValueAdjustment':{_C:_r,_L:'',_N:'',_O:'112',_D:'WEBA10073800',_J:'215',_P:'21504',_t:_G,_AQ:'5','getMonthServiceCode':_AD},'businessProgress':{_C:_r,_L:_c,_D:'WEB01'},'increase':{_E:_b,_N:'',_L:'',_Ah:_A8,_C:_n,_x:_n,_D:_AR,_A9:_G,_O:'106',_J:'111',_P:''},'fjincrea':{_O:'105',_J:'110',_P:'',_E:_b,_D:_AR,_N:'',_L:'',_Ah:_A8,_C:_n,_x:_n,_A9:_G},'persIncrea':{_O:'105',_J:'109',_x:_n,_P:'',_E:_b,_D:_AR,_A9:_G},'fgdChange':{_C:_r,_L:_c,_I:_s,_D:_Ag,_J:'215',_P:'21505',_O:'111',_t:_G},'createOrder':{_I:_M,_D:_y,_L:'BCP_000001','chargeMode':'02','conType':_c,'bizTypeId':'BT_ELEC'},'largePopulation':{_J:'383',_D:'WEBA10076800',_P:'',_L:'',_T:'',_d:'',_I:'0901',_O:'383',_C:'',_N:''},'biaoJiCode':{_C:'0104507',_E:'1704',_I:'1704'},'twoGuar':{_J:'402',_P:'40201',_D:'web_twoGuar'},'electTrend':{_C:_Ai,_I:_M},'emergency':{_C:_Ai,_D:'A10000000',_I:_M},'infoPublic':{_C:'2545454',_E:_z}}
configuration={_K:{_W:_M,_Z:'',_a:'',_X:_x},_E:_b,_S:'32101',_I:_M,_AO:_M,'toPublish':_c,'siteId':'2012000000033700',_L:'',_N:'',_D:'',_C:{_y:_n,'uploadPic':'0101296','pauseSCode':'0101250','pauseTCode':'0101251','listconsumers':'0101093','messageList':'0101343','submit':'0101003','sbcMsg':'0101210','powercut':'0104514','BkAuth01':'f15','BkAuth02':'f18','BkAuth03':'f02','BkAuth04':'f17','BkAuth05':'f05','BkAuth06':'f16','BkAuth07':'f01','BkAuth08':'f03'},'electricityArchives':{'servicecode':'0104505',_E:_M},'subscriptionList':{_L:'APP_SGPMS_05_030',_N:'22',_I:_M,_D:'22',_S:'-1'},'userInformation':{_C:'01008183',_E:_b},'userInform':{_C:_r,_E:_b},'elesum':{_I:_M,_D:_z,_d:_G,_T:_G,_C:'0101143',_E:_A0},_A7:{_I:_M,_D:'WEBA1007200'},_Ac:{_E:_M,_S:'-1',_I:_s,_AO:_s,_C:_A8,_D:'WEBA40050000',_K:{_W:_M,_Z:'',_a:'',_X:_x}},'doorAuth':{_E:_b,_C:'f04'},'xinZ':{_O:'101',_Ad:'101','fJ_busiTypeCode':'102',_Ae:'03','fJ_custType':'02',_Af:_c,_P:'',_D:_AP,_y:_n,_E:_b,_A9:_G},'onedo':{_C:_AD,_E:_b,_D:_AP,'queryType':'03'},'xinHuTongDian':{_O:'110',_J:'211',_P:'21102',_D:'WEBA10071200',_I:_M,_E:_s,_C:_r},'company':{_O:'104',_D:_AP,_Af:'02',_A9:_G,_t:_G,_E:_b,_y:_n},'charge':{_I:_s,_D:'WEBA10071300',_AO:'0901',_O:'102',_Ae:_c,_Ad:'102'},'other':{_I:_s,_D:'WEBA10079700',_O:'129',_J:'999',_P:'21501',_C:_A1,_L:'',_N:''},'vatchange':{'submit':'0101003',_J:'320',_P:'',_O:'115',_D:'WEBA10074000',_t:_G},'bill':{_e:_G,_D:_z,_T:_G,_C:_A1},_V:{_I:_M,_D:_z,_T:_G,_e:_s,_C:_A1,_E:_A0},_m:{_I:_M,_e:'11',_D:_z,_d:_G,_T:_G,_C:_A1,_E:_A0},'mouthOut':{_I:_M,_e:'11',_D:_z,_d:_G,_T:_G,_C:_A1,_E:_A0},'meter':{_O:'114',_J:'304',_D:'WEBA10071000',_P:'',_C:_AD,_N:''},'complaint':{_J:'005','srvMode':_M,'anonymousFlag':'0','replyMode':_c,'retvisitFlag':_c},'report':{_J:'006'},'tradewinds':{_J:'019'},'somesay':{_J:'091'},'faultrepair':{_D:_Ag,_C:_r,_O:'111',_J:'001',_P:'21505'},'electronicInvoice':{_O:'105',_J:'0'},'rename':{_C:_AD,_D:'WEBA10076100',_J:'210',_O:'109',_t:_G,'gh_busiTypeCode':'211','gh_subusi':'21101',_N:'',_L:''},'pause':{_P:'',_C:_A8,_D:'WEBA10073600',_O:'107',_J:'203','jr_busi':'201',_N:'',_L:''},'capacityRecovery':{_C:_A8,_E:_b,_L:'',_N:'',_D:'WEBA10073700','busiTypeCode_stop':'204','busiTypeCode_less':'202',_J:'202',_P:'',_O:'108',_AQ:'5',_t:_G},'electricityPriceChange':{_C:_r,_J:'215',_P:'21502',_O:'113',_t:_G,_AQ:'15',_D:'WEBA10073900WEB',_L:'',_N:''},'electricityPriceStrategyChange':{_C:'01008183',_J:'215',_P:'21506',_O:'160',_D:'WEBV00000517WEB',_L:'',_N:''},'eemandValueAdjustment':{_C:_r,_L:'',_N:'',_O:'112',_D:'WEBA10073800',_J:'215',_P:'21504',_t:_G,_AQ:'5','getMonthServiceCode':_AD},'businessProgress':{_C:_r,_L:_c,_D:'WEB01'},'increase':{_E:_b,_N:'',_L:'',_Ah:_A8,_C:_n,_y:_n,_D:_AR,_A9:_G,_O:'106',_J:'111',_P:''},'fjincrea':{_O:'105',_J:'110',_P:'',_E:_b,_D:_AR,_N:'',_L:'',_Ah:_A8,_C:_n,_y:_n,_A9:_G},'persIncrea':{_O:'105',_J:'109',_y:_n,_P:'',_E:_b,_D:_AR,_A9:_G},'fgdChange':{_C:_r,_L:_c,_I:_s,_D:_Ag,_J:'215',_P:'21505',_O:'111',_t:_G},'createOrder':{_I:_M,_D:_z,_L:'BCP_000001','chargeMode':'02','conType':_c,'bizTypeId':'BT_ELEC'},'largePopulation':{_J:'383',_D:'WEBA10076800',_P:'',_L:'',_T:'',_d:'',_I:'0901',_O:'383',_C:'',_N:''},'biaoJiCode':{_C:'0104507',_E:'1704',_I:'1704'},'twoGuar':{_J:'402',_P:'40201',_D:'web_twoGuar'},'electTrend':{_C:_Ai,_I:_M},'emergency':{_C:_Ai,_D:'A10000000',_I:_M},'infoPublic':{_C:'2545454',_E:_A0}}
appKey='3def6c365d284881bf1a9b2b502ee68c'
appSecret='ab7357dae64944a197ace37398897f64'
baseApi='https://www.95598.cn/api'
@@ -159,12 +159,12 @@ class StateGridDataClient:
def encrypt_post_data(A,data):B={_Ap:A.accessToken[len(A.accessToken)//2:]if A.accessToken else'','_t':A.token[len(A.token)//2:]if A.token else'','_data':data,_j:A.timestamp};return A.encrypt_wapper_data(B)
def encrypt_wapper_data(A,data):B=a(json_dumps(data),A.keyCode);return{_A:B+c(B+str(A.timestamp)),_AF:d(A.keyCode,A.publicKey),_j:str(A.timestamp)}
def handle_request_result_message(E,api,result):
D='message';C='resultMessage';A=result;B=_F
D='message';C='resultMessage';A=result;LOGGER.error(api+'-'+json_dumps(A));B=_F
if _A in A and _Q in A[_A]and C in A[_A][_Q]:B=A[_A][_Q][C]
elif _Q in A and C in A[_Q]:B=A[_Q][C]
elif D in A:B=A[D]
else:B=json_dumps(A)
LOGGER.error(api+': '+B);LOGGER.error(json_dumps(A));return B
return B
async def __fetch_safe(C,api,data):
B=await C.__fetch(api,data)
if _H not in B:return B
@@ -202,9 +202,9 @@ class StateGridDataClient:
if B[_H]==_G:A.keyCode=B[_A][_AA];A.publicKey=B[_A][_AS];return{_B:0}
return{_B:1,_f:C}
async def __get_qr_code(B):
C={_K:{_Z:'',_X:_w,_W:_M,_a:''},_A1:{'optType':_c,_N:e(28,10,1)}};A=await B.__fetch(get_qr_code_api,C);D=B.handle_request_result_message('get_qr_code_api',A)
C={_K:{_Z:'',_X:_x,_W:_M,_a:''},_A2:{'optType':_c,_N:e(28,10,1)}};A=await B.__fetch(get_qr_code_api,C);D=B.handle_request_result_message('get_qr_code_api',A)
if A[_H]==1:
if A[_A]and A[_A][_Q]and A[_A][_Q][_A2]==_AH:B.qrCodeSerial=A[_A][_k][_Ar];E=A[_A][_k]['qrCode'];return{_B:0,_A:E}
if A[_A]and A[_A][_Q]and A[_A][_Q][_A3]==_AH:B.qrCodeSerial=A[_A][_k][_Ar];E=A[_A][_k]['qrCode'];return{_B:0,_A:E}
return{_B:1,_f:D}
async def __get_qr_code_status(B):
C={_k:{_Ar:B.qrCodeSerial}};D={_p:'98'+e(10,10,1)};A=await B.__fetch(get_qr_code_status_api,C,D);E=B.handle_request_result_message('get_qr_code_status_api',A)
@@ -213,17 +213,17 @@ class StateGridDataClient:
else:return{_B:1,_f:'未使用网上国网 App 扫码或确认登录'}
return{_B:1,_f:E}
async def __get_qr_code_token(B):
C={_K:{_X:_w,_W:_M,'isEncrypt':_o},_p:B.token};A=await B.__fetch(get_qr_code_token_api,C);D=B.handle_request_result_message('get_qr_code_token_api',A)
if _Q in A and _A2 in A[_Q]and A[_Q][_A2]==_AH:B.userInfo=A[_k][_AE];return{_B:0}
C={_K:{_X:_x,_W:_M,'isEncrypt':_o},_p:B.token};A=await B.__fetch(get_qr_code_token_api,C);D=B.handle_request_result_message('get_qr_code_token_api',A)
if _Q in A and _A3 in A[_Q]and A[_Q][_A3]==_AH:B.userInfo=A[_k][_AE];return{_B:0}
return{_B:1,_f:D}
async def __send_code(B,phone):
C=phone;B.phone=C;D={_K:{_Z:'',_X:_w,_W:_M,_a:''},_A1:{'sendType':'0',_A7:C,_As:'login','accountType':''},'Channels':'web'};A=await B.__fetch(send_code_api,D);E=B.handle_request_result_message('send_code_api',A)
C=phone;B.phone=C;D={_K:{_Z:'',_X:_x,_W:_M,_a:''},_A2:{'sendType':'0',_A7:C,_As:'login','accountType':''},'Channels':'web'};A=await B.__fetch(send_code_api,D);E=B.handle_request_result_message('send_code_api',A)
if A[_H]==1:
if A[_A]and A[_A][_Q]and A[_A][_Q][_A2]==_AH:B.codeKey=A[_A][_k]['codeKey'];return{_B:0}
if A[_A]and A[_A][_Q]and A[_A][_Q][_A3]==_AH:B.codeKey=A[_A][_k]['codeKey'];return{_B:0}
return{_B:1,_f:E}
async def __verfiy_code(A,code):
C={_K:{_Z:'',_X:_w,_W:_M,_a:''},_A1:{_A7:A.phone,_As:'login',_H:code,'optSys':'ios','pushId':'00000','codeKey':A.codeKey},'Channels':'web'};B=await A.__fetch(code_login_api,C);D=A.handle_request_result_message('code_login_api',B)
if _Q in B and _A2 in B[_Q]and B[_Q][_A2]==_AH:A.token=B[_k][_p];A.userInfo=B[_k][_AE][0];return{_B:0}
C={_K:{_Z:'',_X:_x,_W:_M,_a:''},_A2:{_A7:A.phone,_As:'login',_H:code,'optSys':'ios','pushId':'00000','codeKey':A.codeKey},'Channels':'web'};B=await A.__fetch(code_login_api,C);D=A.handle_request_result_message('code_login_api',B)
if _Q in B and _A3 in B[_Q]and B[_Q][_A3]==_AH:A.token=B[_k][_p];A.userInfo=B[_k][_AE][0];return{_B:0}
return{_B:1,_f:D}
async def __get_request_authorize(B):
A=await B.__fetch(get_request_authorize_api,{});E=B.handle_request_result_message('get_request_authorize_api',A)
@@ -238,7 +238,7 @@ class StateGridDataClient:
if _H in A and A[_H]==_G:B.accessToken=A[_A][_At];B.refreshToken=A[_A][_AG];return{_B:0}
return{_B:1,_f:C}
async def __get_door_number(A):
B=configuration[_Ac];G={_C:B[_C],_E:B[_E],_S:B[_S],_K:{_W:B[_K][_W],_Z:B[_K][_Z],_a:B[_K][_a],_X:B[_K][_X]},_A1:{_R:A.userInfo[_R]},_p:A.token};C=await A.__fetch_safe(get_door_number_api,G);H=A.handle_request_result_message('get_door_number_api',C)
B=configuration[_Ac];G={_C:B[_C],_E:B[_E],_S:B[_S],_K:{_W:B[_K][_W],_Z:B[_K][_Z],_a:B[_K][_a],_X:B[_K][_X]},_A2:{_R:A.userInfo[_R]},_p:A.token};C=await A.__fetch_safe(get_door_number_api,G);H=A.handle_request_result_message('get_door_number_api',C)
if _H in C and C[_H]==1 and _A in C and _k in C[_A]:
E={}
if A.powerUserList is not _F:E={A[_g]:A for A in A.powerUserList}
@@ -249,12 +249,12 @@ class StateGridDataClient:
A.powerUserList=F;return{_B:0}
return{_B:1,_f:H}
async def __get_door_balance(B,door_account):
A=door_account;E={_A:{_L:'',_N:'',_I:configuration[_A7][_I],_D:configuration[_A7][_D],_A3:B.userInfo[_R],_A4:B.userInfo.get(_AB,B.userInfo.get('nickname',_F)),_T:_G,_d:_G,_AI:B.userInfo[_R],_u:[{'consNoSrc':A[_g],_AJ:A.get(_U,A.get(_AK,_F)),'sceneType':A.get('consSortCode',A.get(_AU,_F)),_q:A[_q],_Y:A[_Y]}]},_C:'0101143',_E:configuration[_E],_S:A.get(_U,A.get(_AK,_F))};C=await B.__fetch_safe(get_door_balance_api,E);B.handle_request_result_message('get_door_balance_api',C)
A=door_account;E={_A:{_L:'',_N:'',_I:configuration[_A7][_I],_D:configuration[_A7][_D],_A4:B.userInfo[_R],_A5:B.userInfo.get(_AB,B.userInfo.get('nickname',_F)),_T:_G,_d:_G,_AI:B.userInfo[_R],_u:[{'consNoSrc':A[_g],_AJ:A.get(_U,A.get(_AK,_F)),'sceneType':A.get('consSortCode',A.get(_AU,_F)),_q:A[_q],_Y:A[_Y]}]},_C:'0101143',_E:configuration[_E],_S:A.get(_U,A.get(_AK,_F))};C=await B.__fetch_safe(get_door_balance_api,E);B.handle_request_result_message('get_door_balance_api',C)
if _H in C and C[_H]==1 and _A in C and _u in C[_A]:
D=C[_A][_u]
if len(D)!=0:A[_A5]=D[0]
if len(D)!=0:A[_v]=D[0]
async def __get_door_bill(C,door_account,monthDate):
I='dataInfo';G='mothEleList';E=monthDate;A=door_account;J={_A:{_A3:C.userInfo[_R],_I:configuration[_I],_e:'11',_AL:A[_AW],_D:'ALIPAY_01',_Y:A[_Y],_AJ:A[_U],_d:_G,_T:_G,_N:'',_L:'',_A4:'',_AV:A[_U],_AI:C.userInfo[_R],_q:A[_q],_Au:E.year},_C:_A0,_E:_z,_S:A[_U]};B=await C.__fetch_safe(get_door_bill_api,J);C.handle_request_result_message('get_door_bill_api',B)
I='dataInfo';G='mothEleList';E=monthDate;A=door_account;J={_A:{_A4:C.userInfo[_R],_I:configuration[_I],_e:'11',_AL:A[_AW],_D:'ALIPAY_01',_Y:A[_Y],_AJ:A[_U],_d:_G,_T:_G,_N:'',_L:'',_A5:'',_AV:A[_U],_AI:C.userInfo[_R],_q:A[_q],_Au:E.year},_C:_A1,_E:_A0,_S:A[_U]};B=await C.__fetch_safe(get_door_bill_api,J);C.handle_request_result_message('get_door_bill_api',B)
if _H in B and B[_H]==1 and _A in B:
if I in B[_A]:A[_AM]=B[_A][I]
if G in B[_A]:
@@ -264,32 +264,35 @@ class StateGridDataClient:
for D in H:
if D.month in F and _h in F[D.month]:D[_h]=F[D.month][_h]
A[_l]=H
if len(A[_l])>0:A[_v]=A[_l][-1]
if len(A[_l])>0:A[_w]=A[_l][-1]
async def __get_door_ladder(C,door_account,monthBill):
E=monthBill;A=door_account;I=A[_g];F=datetime.datetime.strptime(E[_AN],'%Y%m');G=f"{F.year}-{F.month:02d}";H={_A:{_I:configuration[_V][_I],_D:configuration[_V][_D],_T:configuration[_V][_T],_e:configuration[_V][_e],_q:A[_g],_d:A[_U],_Y:A[_Y],_Av:G,_AV:A[_U],_AL:A[_AW],_AI:C.userInfo[_R],_N:'',_L:'',_A4:C.userInfo[_AB],_A3:C.userInfo[_R]},_C:configuration[_V][_C],_E:configuration[_V][_E],_S:A[_U]};B=await C.__fetch(get_door_ladder_api,H);J=C.handle_request_result_message(_Aw,B)
E=monthBill;A=door_account;I=A[_g];F=datetime.datetime.strptime(E[_AN],'%Y%m');G=f"{F.year}-{F.month:02d}";H={_A:{_I:configuration[_V][_I],_D:configuration[_V][_D],_T:configuration[_V][_T],_e:configuration[_V][_e],_q:A[_g],_d:A[_U],_Y:A[_Y],_Av:G,_AV:A[_U],_AL:A[_AW],_AI:C.userInfo[_R],_N:'',_L:'',_A5:C.userInfo[_AB],_A4:C.userInfo[_R]},_C:configuration[_V][_C],_E:configuration[_V][_E],_S:A[_U]};B=await C.__fetch(get_door_ladder_api,H);J=C.handle_request_result_message(_Aw,B)
if _H in B and B[_H]==1 and _A in B and _u in B[_A]:
D=B[_A][_u]
if len(D)!=0:D=D[0];E['ladder']=D
async def __get_door_mouth_bill(F,door_account,monthBill):
S='pointList';K=monthBill;J='amtList';I='readList';H='quantity';G='priceName';B=door_account;L=datetime.datetime.strptime(K[_AN],'%Y%m');T=f"{L.year}-{L.month:02d}";U={_A:{_I:configuration[_V][_I],_D:configuration[_V][_D],_T:configuration[_V][_T],_e:configuration[_V][_e],_q:B[_g],_d:B[_U],_Y:B[_Y],_Av:T,_AV:B[_U],_AL:B[_AW],_AI:F.userInfo[_R],_N:'',_L:'',_A4:F.userInfo[_AB],_A3:F.userInfo[_R]},_C:configuration[_V][_C],_E:configuration[_V][_E],_S:B[_U]};C=await F.__fetch(get_door_ladder_api,U);W=F.handle_request_result_message(_Aw,C)
if _H in C and C[_H]==1 and _A in C and _u in C[_A]:
D=C[_A][_u][0]
if I in D:M=D[I][0]
else:M=D[S][0][I][0]
V=catchFloat(M,'activeCount')
if J in D:N=D[J]
else:N=D[S][0]['amtGroupList'][0][J]
O=0;P=0;Q=0;R=0
for A in N:
if A[G]=='':O=catchFloat(A,H)
elif A[G]=='':P=catchFloat(A,H)
elif A[G]=='':Q=catchFloat(A,H)
elif A[G]=='':R=catchFloat(A,H)
E={};E[_AX]=normal_round(V,2);E[_AY]=normal_round(O,2);E[_AZ]=normal_round(P,2);E[_Aa]=normal_round(Q,2);E[_Ab]=normal_round(R,2);K[_h]=E
async def __get_door_mouth_bill(I,door_account,monthBill):
S=monthBill;O='quantity';N='priceName';K='amtGroupList';H='readList';E=door_account;C='amtList';B='pointList';T=datetime.datetime.strptime(S[_AN],'%Y%m');V=f"{T.year}-{T.month:02d}";W={_A:{_I:configuration[_V][_I],_D:configuration[_V][_D],_T:configuration[_V][_T],_e:configuration[_V][_e],_q:E[_g],_d:E[_U],_Y:E[_Y],_Av:V,_AV:E[_U],_AL:E[_AW],_AI:I.userInfo[_R],_N:'',_L:'',_A5:I.userInfo[_AB],_A4:I.userInfo[_R]},_C:configuration[_V][_C],_E:configuration[_V][_E],_S:E[_U]};F=await I.__fetch(get_door_ladder_api,W);X=I.handle_request_result_message(_Aw,F)
if _H in F and F[_H]==1 and _A in F and _u in F[_A]:
A=F[_A][_u][0];U=0;P=0;Q=0;L=0;R=0;M=[]
if H in A and len(A[H])>0:M=A[H]
elif B in A and len(A[B])>0 and H in A[B][0]and len(A[B][0][H])>0:M=A[B][0][H]
if len(M)>0:U=catchFloat(M[0],'activeCount')
J=[]
if C in A and len(A[C])>0:J=A[C]
elif B in A and len(A[B])>0 and C in A[B][0]and len(A[B][0][C])>0:J=A[B][0][C]
elif B in A and len(A[B])>0 and K in A[B][0]and len(A[B][0][K])>0 and C in A[B][0][K][0]and len(A[B][0][K][0][C])>0:J=A[B][0][K][0][C]
if len(J)>0:
for D in J:
if D[N]=='':P=catchFloat(D,O)
elif D[N]=='':Q=catchFloat(D,O)
elif D[N]=='':L=catchFloat(D,O)
elif D[N]=='':R=catchFloat(D,O)
if L==0:L=P+Q+R
G={};G[_AX]=normal_round(U,2);G[_AY]=normal_round(P,2);G[_AZ]=normal_round(Q,2);G[_Aa]=normal_round(L,2);G[_Ab]=normal_round(R,2);S[_h]=G
async def __get_door_daily_bill(B,door_account,year,start_date,end_date):
D='sevenEleList';A=door_account;E={'params1':{_C:configuration[_C],_E:configuration[_E],_S:configuration[_S],_K:{_W:configuration[_K][_W],_Z:configuration[_K][_Z],_a:configuration[_K][_a],_X:configuration[_K][_X]},_A1:{_R:B.userInfo[_R]},_p:B.token},'params3':{_A:{_A3:B.userInfo[_R],_q:A[_g],_AL:_c,'endTime':end_date,_Y:A[_Y],_Au:year,_AJ:A.get(_U,A.get(_AK,_F)),_N:'',_L:'','startTime':start_date,_A4:B.userInfo[_AB],_D:configuration[_m][_D],_I:configuration[_m][_I],_e:configuration[_m][_e],_d:configuration[_m][_d],_T:configuration[_m][_T]},_C:configuration[_m][_C],_E:configuration[_m][_E],_S:A.get(_U,A.get(_AK,_F))},'params4':'010103'};C=await B.__fetch_safe(get_door_daily_bill_api,E);F=B.handle_request_result_message('get_door_daily_bill_api',C)
D='sevenEleList';A=door_account;E={'params1':{_C:configuration[_C],_E:configuration[_E],_S:configuration[_S],_K:{_W:configuration[_K][_W],_Z:configuration[_K][_Z],_a:configuration[_K][_a],_X:configuration[_K][_X]},_A2:{_R:B.userInfo[_R]},_p:B.token},'params3':{_A:{_A4:B.userInfo[_R],_q:A[_g],_AL:_c,'endTime':end_date,_Y:A[_Y],_Au:year,_AJ:A.get(_U,A.get(_AK,_F)),_N:'',_L:'','startTime':start_date,_A5:B.userInfo[_AB],_D:configuration[_m][_D],_I:configuration[_m][_I],_e:configuration[_m][_e],_d:configuration[_m][_d],_T:configuration[_m][_T]},_C:configuration[_m][_C],_E:configuration[_m][_E],_S:A.get(_U,A.get(_AK,_F))},'params4':'010103'};C=await B.__fetch_safe(get_door_daily_bill_api,E);F=B.handle_request_result_message('get_door_daily_bill_api',C)
if _H in C and C[_H]==1 and _A in C and D in C[_A]:A[_A6]=C[_A][D]
async def __get_door_pay_record(A,door_account):B=door_account;D=B[_g];C={'params1':{_C:configuration[_C],_E:configuration[_E],_S:configuration[_S],_K:{_W:configuration[_K][_W],_Z:configuration[_K][_Z],_a:configuration[_K][_a],_X:configuration[_K][_X]},_A1:{_R:A.userInfo[_R]},_p:A.token},'params3':{_A:{_A3:A.userInfo[_R],'bgnPayDate':'2023-04-24',_I:configuration[_I],_q:B[_g],'endPayDate':'2024-04-24',_D:'webALIPAY_01','number':100,_Y:B[_Y],'page':_G,_AJ:B[_U],_d:_G,_T:_G,_N:'',_L:'',_A4:A.userInfo[_AB]},_C:'0101051',_E:_c,_S:B[_U]},'params4':'010104'};E=await A.__fetch(getJiaoFeiRecordApi,C)
async def __get_door_pay_record(A,door_account):B=door_account;D=B[_g];C={'params1':{_C:configuration[_C],_E:configuration[_E],_S:configuration[_S],_K:{_W:configuration[_K][_W],_Z:configuration[_K][_Z],_a:configuration[_K][_a],_X:configuration[_K][_X]},_A2:{_R:A.userInfo[_R]},_p:A.token},'params3':{_A:{_A4:A.userInfo[_R],'bgnPayDate':'2023-04-24',_I:configuration[_I],_q:B[_g],'endPayDate':'2024-04-24',_D:'webALIPAY_01','number':100,_Y:B[_Y],'page':_G,_AJ:B[_U],_d:_G,_T:_G,_N:'',_L:'',_A5:A.userInfo[_AB]},_C:'0101051',_E:_c,_S:B[_U]},'params4':'010104'};E=await A.__fetch(getJiaoFeiRecordApi,C)
async def get_qr_code(B):
A=await B.__get_request_key()
if _B in A and A[_B]!=0:return A
@@ -326,65 +329,68 @@ class StateGridDataClient:
elif A.retry_times>=3:A.need_login=_o
else:A.retry_times=A.retry_times+1
async def refresh_data(B,setup=_i,force_refresh=_i):
t='last_month_ele_cost';s='year_ele_cost';r='thisTPq';q='thisNPq';p='thisVPq';o='thisPPq';n='%Y%m%d';m='day';l='refresh_time';a=setup;Z='last_month_ele_num';Y='dayElePq';T='year_ele_num';G='balance'
if a is _o:
t='last_month_ele_cost';s='year_ele_cost';r='thisTPq';q='thisNPq';p='thisVPq';o='thisPPq';n='%Y%m%d';m='day';l='refresh_time';f=setup;e='last_month_ele_num';d='dayElePq';U='year_ele_num';G='balance'
if f is _o:
if B.dataVersion!=VERSION:B.powerUserList=_F
b=await B.__get_door_number()
if _B in b and b[_B]!=0:B.need_login=_o
g=await B.__get_door_number()
if _B in g and g[_B]!=0:B.need_login=_o
if B.need_login is _o:
if B.powerUserList is not _F:
for A in B.get_door_account_list():A[l]='Token刷新失败,请重新登录'
LOGGER.error('国家电网 - Token刷新失败,请重新登录!');return
u=a or force_refresh or int(time.time()*1000)-B.timestamp>B.refresh_interval*3600*1000
u=f or force_refresh or int(time.time()*1000)-B.timestamp>B.refresh_interval*3600*1000
if u is _i:return
U=datetime.datetime.now();F=U-datetime.timedelta(days=1);v=f"{F.year}-{F.month:02d}-{F.day:02d}";V=F-datetime.timedelta(days=40);w=f"{V.year}-{V.month:02d}-{V.day:02d}"
V=datetime.datetime.now();H=V-datetime.timedelta(days=1);v=f"{H.year}-{H.month:02d}-{H.day:02d}";W=H-datetime.timedelta(days=40);w=f"{W.year}-{W.month:02d}-{W.day:02d}"
for A in B.powerUserList:
x=A[_g];B.doorAccountDict[x]=A;await B.__get_door_balance(A)
if B.retry_times!=0:return
if _A5 in A:
y=catchFloat(A[_A5],'estiAmt');W=catchFloat(A[_A5],'prepayBal');c=catchFloat(A[_A5],'sumMoney')
if W==0 or W==c:A[G]=c
else:A[G]=W-y
d=catchFloat(A[_A5],'historyOwe')
if d>0:A[G]=-d
if _v in A:
y=catchFloat(A[_v],'accountBalance');z=catchFloat(A[_v],'estiAmt');X=catchFloat(A[_v],'prepayBal');Y=catchFloat(A[_v],'sumMoney')
if y!=0:A[G]=Y
elif X==0 or X==Y:A[G]=Y
else:A[G]=X-z
h=catchFloat(A[_v],'historyOwe')
if h>0:A[G]=-h
else:LOGGER.error('国家电网账户余额获取失败!')
if G not in A:A[G]=0
await B.__get_door_daily_bill(A,U.year,w,v)
await B.__get_door_daily_bill(A,V.year,w,v)
if _A6 not in A:LOGGER.error('国家电网无法获取日用电数据!');continue
X=0;H=_i
for e in range(10):
D=A[_A6][e]
try:float(D[Y]);H=_o;break
except:X=X+1
f=0;g=0;h=0;i=0;j=0
if H:
for e in range(X):A[_A6].pop(0)
D=A[_A6][0];E=datetime.datetime.strptime(D[m],n);A['daily_lasted_date']=f"{E.year}-{E.month:02d}-{E.day:02d}";f=catchFloat(D,Y);g=catchFloat(D,o);h=catchFloat(D,p);i=catchFloat(D,q);j=catchFloat(D,r)
A['daily_ele_num']=normal_round(f,2);A['daily_p_ele_num']=normal_round(g,2);A['daily_v_ele_num']=normal_round(h,2);A['daily_n_ele_num']=normal_round(i,2);A['daily_t_ele_num']=normal_round(j,2);I=0;J=0;K=0;L=0;M=0
if H:
Z=0;L=_i
for i in range(10):
D=A[_A6][i]
try:float(D[d]);L=_o;break
except:Z=Z+1
j=0;a=0;b=0;M=0;c=0
if L:
for i in range(Z):A[_A6].pop(0)
D=A[_A6][0];E=datetime.datetime.strptime(D[m],n);A['daily_lasted_date']=f"{E.year}-{E.month:02d}-{E.day:02d}";j=catchFloat(D,d);a=catchFloat(D,o);b=catchFloat(D,p);M=catchFloat(D,q);c=catchFloat(D,r)
if M==0:M=a+b+c
A['daily_ele_num']=normal_round(j,2);A['daily_p_ele_num']=normal_round(a,2);A['daily_v_ele_num']=normal_round(b,2);A['daily_n_ele_num']=normal_round(M,2);A['daily_t_ele_num']=normal_round(c,2);N=0;I=0;J=0;F=0;K=0
if L:
for C in A[_A6]:
z=datetime.datetime.strptime(C[m],n)
if z.month!=E.month:break
I+=catchFloat(C,Y);J+=catchFloat(C,o);K+=catchFloat(C,p);L+=catchFloat(C,q);M+=catchFloat(C,r)
A[_AX]=normal_round(I,2);A[_AY]=normal_round(J,2);A[_AZ]=normal_round(K,2);A[_Aa]=normal_round(L,2);A[_Ab]=normal_round(M,2)
if H:
N=E-datetime.timedelta(days=E.day);A0=f"{N.year}{N.month:02d}"
if _AC not in A or A[_AC]!=N.year or _v not in A or A[_v][_AN]!=A0:await B.__get_door_bill(A,N)
A0=datetime.datetime.strptime(C[m],n)
if A0.month!=E.month:break
N+=catchFloat(C,d);I+=catchFloat(C,o);J+=catchFloat(C,p);F+=catchFloat(C,q);K+=catchFloat(C,r)
if F==0:F=I+J+K
A[_AX]=normal_round(N,2);A[_AY]=normal_round(I,2);A[_AZ]=normal_round(J,2);A[_Aa]=normal_round(F,2);A[_Ab]=normal_round(K,2)
if L:
O=E-datetime.timedelta(days=E.day);A1=f"{O.year}{O.month:02d}"
if _AC not in A or A[_AC]!=O.year or _w not in A or A[_w][_AN]!=A1:await B.__get_door_bill(A,O)
if _l in A:
for C in A[_l]:
if _h not in C:await B.__get_door_mouth_bill(A,C)
if _AM in A:A[T]=catchFloat(A[_AM],'totalEleNum');A[s]=catchFloat(A[_AM],'totalEleCost')
if T not in A:A[T]=0;A[s]=0
if _v in A:A[Z]=catchFloat(A[_v],'monthEleNum');A[t]=catchFloat(A[_v],'monthEleCost');k=datetime.datetime.strptime(A[_v][_AN],'%Y%m')
if Z not in A:A[Z]=0;A[t]=0;k=F.month
O=0;P=0;Q=0;R=0;S=0
if k.month==12:O=I;P=J;Q=K;R=L;S=M
if _AM in A:A[U]=catchFloat(A[_AM],'totalEleNum');A[s]=catchFloat(A[_AM],'totalEleCost')
if U not in A:A[U]=0;A[s]=0
if _w in A:A[e]=catchFloat(A[_w],'monthEleNum');A[t]=catchFloat(A[_w],'monthEleCost');k=datetime.datetime.strptime(A[_w][_AN],'%Y%m')
if e not in A:A[e]=0;A[t]=0;k=H
P=0;Q=0;R=0;S=0;T=0
if k.month==12:P=N;Q=I;R=J;S=F;T=K
else:
if _l in A:
for C in A[_l]:
if _h in C:O+=C[_h][_AX];P+=C[_h][_AY];Q+=C[_h][_AZ];R+=C[_h][_Aa];S+=C[_h][_Ab]
O+=I;P+=J;Q+=K;R+=L;S+=M
A[T]=normal_round(O,2);A['year_p_ele_num']=normal_round(P,2);A['year_v_ele_num']=normal_round(Q,2);A['year_n_ele_num']=normal_round(R,2);A['year_t_ele_num']=normal_round(S,2);A[l]=datetime.datetime.strftime(U,'%Y-%m-%d %H:%M:%S')
if _h in C:P+=C[_h][_AX];Q+=C[_h][_AY];R+=C[_h][_AZ];S+=C[_h][_Aa];T+=C[_h][_Ab]
P+=N;Q+=I;R+=J;S+=F;T+=K
A[U]=normal_round(P,2);A['year_p_ele_num']=normal_round(Q,2);A['year_v_ele_num']=normal_round(R,2);A['year_n_ele_num']=normal_round(S,2);A['year_t_ele_num']=normal_round(T,2);A[l]=datetime.datetime.strftime(V,'%Y-%m-%d %H:%M:%S')
await B.save_data()
def get_door_account_list(A):return list(A.doorAccountDict.values())
def get_door_account(A):return A.doorAccountDict
+1 -1
View File
@@ -5,5 +5,5 @@
"config_flow": true,
"documentation": "https://hassbox.cn/",
"iot_class": "cloud_polling",
"version": "0.1.7"
"version": "0.1.9"
}
+5
View File
@@ -0,0 +1,5 @@
{
"name": "state_grid",
"homeassistant": "2024.2.0",
"render_readme": true
}