mirror of
https://github.com/suaveolent/hoymiles-wifi.git
synced 2024-09-20 03:10:11 +00:00
firmware update
This commit is contained in:
parent
85b88e91ed
commit
b55859e9b1
@ -1,6 +1,5 @@
|
||||
import argparse
|
||||
from hoymiles_wifi.inverter import Inverter
|
||||
import time
|
||||
|
||||
def get_real_data_new(inverter):
|
||||
return inverter.get_real_data_new()
|
||||
@ -65,15 +64,58 @@ def set_wifi(inverter):
|
||||
return
|
||||
return inverter.set_wifi(wifi_ssid, wifi_password)
|
||||
|
||||
def firmware_update(inverter):
|
||||
RED = '\033[91m'
|
||||
END = '\033[0m'
|
||||
|
||||
print(RED + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + END)
|
||||
print(RED + "!!! Danger zone! This will update the firmeware of the inverter. !!!" + END)
|
||||
print(RED + "!!! Please be careful and make sure you know what you are doing. !!!" + END)
|
||||
print(RED + "!!! Only proceed if you know what you are doing. !!!" + END)
|
||||
print(RED + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + END)
|
||||
print("")
|
||||
|
||||
cont = input("Do you want to continue? (y/n): ")
|
||||
if(cont != 'y'):
|
||||
return
|
||||
|
||||
print()
|
||||
print("Updating firmware to version: V00.01.11...")
|
||||
print()
|
||||
|
||||
cont = input("Do you want to continue? (y/n): ")
|
||||
if(cont != 'y'):
|
||||
return
|
||||
|
||||
return inverter.firmware_update()
|
||||
|
||||
def print_invalid_command(command):
|
||||
print(f"Invalid command: {command}")
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Hoymiles HMS Monitoring")
|
||||
parser.add_argument("--host", type=str, required=True, help="IP address or hostname of the inverter")
|
||||
parser.add_argument("command", type=str, choices=['get-real-data-new', 'get-real-data-hms', 'get-real-data', 'get-config', 'network-info', 'app-information-data', 'app-get-hist-power', 'set-power-limit', 'set-wifi'], help="Command to execute")
|
||||
parser.add_argument(
|
||||
"--host", type=str, required=True, help="IP address or hostname of the inverter"
|
||||
)
|
||||
parser.add_argument(
|
||||
"command",
|
||||
type=str,
|
||||
choices=[
|
||||
"get-real-data-new",
|
||||
"get-real-data-hms",
|
||||
"get-real-data",
|
||||
"get-config",
|
||||
"network-info",
|
||||
"app-information-data",
|
||||
"app-get-hist-power",
|
||||
"set-power-limit",
|
||||
"set-wifi",
|
||||
"firmware-update",
|
||||
],
|
||||
help="Command to execute",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
inverter = Inverter(args.host)
|
||||
|
||||
# Execute the specified command using a switch case
|
||||
@ -87,6 +129,7 @@ def main():
|
||||
'app-get-hist-power': app_get_hist_power,
|
||||
'set-power-limit': set_power_limit,
|
||||
'set-wifi': set_wifi,
|
||||
'firmware-update': firmware_update
|
||||
}
|
||||
|
||||
command_func = switch.get(args.command, print_invalid_command)
|
||||
|
@ -28,5 +28,7 @@ CMD_DEV_CONFIG_PUT_RES_DTO_2 = b'\x83\x08'
|
||||
CMD_GET_CONFIG_RES = b'\xdb\x08'
|
||||
CMD_SET_CONFIG_RES = b'\xdb\x07'
|
||||
|
||||
CMD_CLOUD_COMMAND_RES_DTO = b'\x23\x05'
|
||||
|
||||
CMD_ACTION_FIRMWARE_UPGRADE = 2
|
||||
CMD_ACTION_POWER_LIMIT = 8
|
||||
|
@ -1,5 +1,6 @@
|
||||
import socket
|
||||
import struct
|
||||
from typing import Any
|
||||
from crcmod import mkCrcFun
|
||||
from datetime import datetime
|
||||
import time
|
||||
@ -33,8 +34,9 @@ from hoymiles_wifi.const import (
|
||||
CMD_APP_GET_HIST_POWER_RES,
|
||||
CMD_ACTION_POWER_LIMIT,
|
||||
CMD_COMMAND_RES_DTO,
|
||||
CMD_ACTION_FIRMWARE_UPGRADE,
|
||||
CMD_SET_CONFIG,
|
||||
CMD_SET_CONFIG_RES,
|
||||
CMD_CLOUD_COMMAND_RES_DTO,
|
||||
)
|
||||
|
||||
|
||||
@ -49,7 +51,7 @@ class NetworkState:
|
||||
Offline = 2
|
||||
|
||||
class Inverter:
|
||||
def __init__(self, host):
|
||||
def __init__(self, host: str):
|
||||
self.host = host
|
||||
self.state = NetworkState.Unknown
|
||||
self.sequence = 0
|
||||
@ -57,7 +59,7 @@ class Inverter:
|
||||
def get_state(self):
|
||||
return self.state
|
||||
|
||||
def set_state(self, new_state):
|
||||
def set_state(self, new_state: NetworkState):
|
||||
if self.state != new_state:
|
||||
self.state = new_state
|
||||
logger.debug(f"Inverter is {new_state}")
|
||||
@ -113,7 +115,7 @@ class Inverter:
|
||||
command = CMD_APP_GET_HIST_POWER_RES
|
||||
return self.send_request(command, request, AppGetHistPower_pb2.AppGetHistPowerReqDTO)
|
||||
|
||||
def set_power_limit(self, power_limit):
|
||||
def set_power_limit(self, power_limit: int):
|
||||
|
||||
if(power_limit < 0 or power_limit > 100):
|
||||
logger.error("Error. Invalid power limit!")
|
||||
@ -140,7 +142,6 @@ class Inverter:
|
||||
logger.error("Failed to get config")
|
||||
return
|
||||
|
||||
|
||||
request = initialize_set_config(get_config_req)
|
||||
|
||||
request.time = int(time.time())
|
||||
@ -153,8 +154,20 @@ class Inverter:
|
||||
command = CMD_SET_CONFIG
|
||||
return self.send_request(command, request, SetConfig_pb2.SetConfigReqDTO)
|
||||
|
||||
|
||||
def firmware_update(self):
|
||||
|
||||
request = CommandPB_pb2.CommandResDTO()
|
||||
request.action = CMD_ACTION_FIRMWARE_UPGRADE
|
||||
request.package_nub = 1
|
||||
request.tid = 8806660
|
||||
request.data = 'http://fwupdate.hoymiles.com/cfs/bin/2311/06/,1488725943932555264.bin\r'.encode('utf-8')
|
||||
|
||||
command = CMD_CLOUD_COMMAND_RES_DTO
|
||||
return self.send_request(command, request, CommandPB_pb2.CommandReqDTO)
|
||||
|
||||
|
||||
def send_request(self, command, request, response_type):
|
||||
def send_request(self, command: bytes, request: Any, response_type: Any):
|
||||
self.sequence = (self.sequence + 1) & 0xFFFF
|
||||
|
||||
request_as_bytes = request.SerializeToString()
|
||||
@ -186,7 +199,7 @@ class Inverter:
|
||||
|
||||
except Exception as e:
|
||||
logger.debug(f"Failed to parse response: {e}")
|
||||
self.set_state(NetworkState.Offline)
|
||||
self.set_state(NetworkState.Unknown)
|
||||
return None
|
||||
|
||||
self.set_state(NetworkState.Online)
|
||||
|
4
setup.py
4
setup.py
@ -2,8 +2,8 @@ from setuptools import find_packages, setup
|
||||
|
||||
setup(
|
||||
name='hoymiles-wifi',
|
||||
packages=find_packages(),
|
||||
version='0.0.7',
|
||||
packages=['hoymiles_wifi', 'hoymiles_wifi.protobuf'],
|
||||
version='0.0.8',
|
||||
description='A python library for interfacing with Hoymiles HMS-XXXXW-T2 series of micro-inverters.',
|
||||
author='suaveolent',
|
||||
include_package_data=True,
|
||||
|
Loading…
Reference in New Issue
Block a user