* Save a tast reference
Important: Save a reference of the created task,
to avoid a task disappearing mid-execution. The
event loop only keeps weak references to tasks.
A task that isn’t referenced elsewhere may get
garbage collected at any time, even before it’s
done. For reliable “fire-and-forget” background
tasks, gather them in a collection
* add links to add-on urls
* Add translations
* set app.testing to get exceptions during test
* improve unit-tests for the web-UI
* update changelog
* extend languages tests
* workaround for github runner
* setup logger for hypercorn and dashboard
* use logger.ini to setup dashboard logger
* workaround: restore the hypercorn logger config
- quart/hyercorn overwrites the logger config.
as a workaround we restore the config at the
beginning of a request
* fix the hypercorn log handler only once
* change proxy into a ASGI application
- move Quart init from server.py into app.py
- create Server class for config and loggin setup
- restore hypercorn logging configuration after
start of Quart/Hypercorn
* move get_log_level into Server class
* define config in test_emu_init_close
* remove Web() instance from the testcase
- with importing app.py The blueprint Web() will
automatically created and a second call in test-
cases must avoided
* add unit tests
* move code from app.py into server.py
* test the init_logging_system() method
* add HypercornLogHndl tests
* fix deprecated pytest async warning
- Cleanup pending async tasks
- fix deprecated warning about event_loop
* add unit test for error handling in build_config()
* coverage: ignore quart template files
* check print output in test_save_and_restore
* update changelog
* display proxy version on dashboard
* add MQTT page
* styles adjusted on the different pages
- use same colors
- add bordered shadow to all cards and tables
* fix unit tests
* migrate the conn table to a general table
- rename the template file
- get headline from table description
* remove footer from index page
* make version string translateable
* cleanup
* remove stripped table rows
* add mqtt info table
* translate mqtt page
* don't fetch notes list for the log-page
* fix Mqtt init call for unit tests
* add mqtt-fetch test
* check received counter in unit test
* store logging path in Config class
* rename template files and page files
* jump to referer page
- after changing the language, we jump to
the referer page, if the attribute exists
* build and send list of log-files
* rename Download page into Log files
* initialize log-path in test config
* improve dashboard unit tests
- add log file tests
- check content-languages after language switch
* initialize config structure for log-file tests
* add test log file to project
* add sub_dir to test log path
- non files must be skipped. To test this we add
a sub directory to the test log directory
* add german translations
* set quart debug flag for debug versions
* update changelog
* add button for languages setting
* build a web module for the dashboard
- load all python module from local dir
- initialize Blueprint and Babel
* set a default key for secure cookies
* add translations to docker container
* improve translation build
- clean target erases the *.pot
- don't modify the resurt of url_for() calls
- don't translate the language description
* translate connection table, fix icon
* build relative urls for HA ingress
* fix unit test, increase coverage
* design counter on connection board
* display time of last update and add reload button
* chance `Updated` field to a real button
* Provide counter values for the dashboard
* change background color ot the top branch
- use dark-grey instead of black to reduce the contrast
* change color of counter tiles
* test proxy connection counter handling
* prepare conn-table and notes list building
* remove obsolete menue points
* store client mode for dashboard
* store inverters serial number for the dashboard
* store inverters serial number
* build connection table for dashboard
* add connection table to dashboard
* fix responsiveness of the tiles
* adapt unit tests
* remove test fake code
* increase test coverage, remove obsolete if statement
* ignore translation and log files
* add quart-babel
* build and install translation files
* don't export the web-ui port 8127
- for security reason the user should use the
HA ingress and not the direkt access to the web
dashboard
* set 'lang' in html tag
* configure path to web files for Quart
* copy web-file into the add-on container
* add test template and stylesheet
* add w3.css dashboard
* fix unit test for test dashboard
* add Roboto font
* add awesome web font
* add all favicon formats
* load fonts locally
* adapt unit tests
* add all font and favicons to add-on
* fix sonarqube warnings
* add unit tests for all favicons
* remove apostrophes from fmt strings
- thanks to @onkelenno for the suggestion
* improve the logger initializing
- don't overwrite the logging.ini settings if the
env variable LOG_LVL isn't well defined
- Thanks to @onkelenno for the idea to improve
* set default argument for LOG_LVL to INFO in docker files
* adapt unit test
* add ha_addons repository to cscode workspace
* Issue220 ha addon dokumentation update (#232)
* initial DOCS.md for Addon
* links to Mosquitto and Adguard
* replaced _ by . for PV-Strings
* mentioned add-on installation method in README.md
* fix most of the markdown linter warnings
* add missing alt texts
* added nice add repository to my Home Assistant badges
---------
Co-authored-by: Michael Metz <michael.metz@siemens.com>
Co-authored-by: Stefan Allius <stefan.allius@t-online.de>
* S allius/issue216 (#235)
* improve docker run
- establish multistage Dockerfile
- build a python wheel for all needed packages
- remove unneeded tools like apk for runtime
* pin versions, fix hadolint warnings
* merge from dev-0.12
---------
Co-authored-by: Michael Metz <michael.metz@siemens.com>
* Issue220 ha addon dokumentation update (#245)
* revised config disclaimer
* add newline at end of file to fix linter warning
---------
Co-authored-by: Michael Metz <michael.metz@siemens.com>
* 238 ha addon repository check (#244)
* move Makefile and bake file into parent folder
* build config.yaml from template
* use Makefile instead of build shell script
* ignore temporary or created files
* add rules for building the add-on repository
* add rel version of add-on
* add jinja2-cli
* ignore inverter replays which a older than 1 day (#246)
* S allius/issue7 (#248)
* report alarm and fault bitfield to ha
* define the alarm and fault names
* configure log path and max number of daily log files (#243)
* configure log path and max number of daily log files
* don't use a subfolder for configs
* use make instead of a build script
* mount /homeassistant/tsun-proxy
* Add venv to base image
* give write access to mounted folder
* intial checkin, ignore SC1091
* set advanced and stage value in config.yaml
* fix typo
* added watchdog and removed Port 8127 from mapping
* fixed typo and use new add-on repro
- change the install button to install from
https://github.com/s-allius/ha-addons
* add addon-rel target
* disable watchdog due to exceptions in the ha supervisor
* update changelog
---------
Co-authored-by: Michael Metz <michael.metz@siemens.com>
* Update README.md (#251)
install `https://github.com/s-allius/ha-addons` as repro for our add-on
* add german language file (#253)
* fix return type get_extra_info in FakeWriter
* move global startup code into main methdod
* pin version of base image
* avoid forwarding to a private (lokal) IP addr (#256)
* avoid forwarding to a private (lokal) IP addr
* test DNS resolver issues
* increase test coverage
* update changelog
* fix client_mode configuration block (#252)
* fix client_mode block
* add client mode
* fix tests with client_mode values
* log client_mode configuration
* add forward flag for client_mode
* improve startup logging
* added client_mode example
* adjusted translation files
* AT commands added
* typo
* missing "PLUS"
* link to config details
* improve log msg for config problems
* improve log msg on config errors
* improve log msg for config problems
* copy CHANGELOG.md into add-on repro
---------
Co-authored-by: Michael Metz <michael.metz@siemens.com>
* rename "ConfigErr" to match naming convention
* disable test coverage for __main__
* update changelog version 0.12
---------
Co-authored-by: metzi <147942647+mime24@users.noreply.github.com>
Co-authored-by: Michael Metz <michael.metz@siemens.com>
* add some reader classes to get the configuration
* adapt unittests
* get config from json or toml file
* loop over all config readers to get the configuration
* rename config test files
* use relative paths for coverage test in vscode
* do not throw an error for missing config files
* remove obsolete tests
* use dotted key notation for pv sub dictonary
* log config reading progress
* remove create_config_toml.py
* remove obsolete tests for the ha_addon
* disable mosquitto tests if the server is down
* ignore main method for test coverage
* increase test coverage
* pytest-cov: use relative_files only on github, so coverage will work with vscode locally
* remove unneeded imports
* add missing test cases
* disable branch coverage, cause its not reachable
* Code Cleanup (#158)
* print coverage report
* create sonar-project property file
* install all py dependencies in one step
* code cleanup
* reduce cognitive complexity
* do not build on *.yml changes
* optimise versionstring handling (#159)
- Reading the version string from the image updates
it even if the image is re-pulled without re-deployment
* fix linter warning
* exclude *.pyi filese
* ignore some rules for tests
* cleanup (#160)
* Sonar qube 3 (#163)
fix SonarQube warnings in modbus.py
* Sonar qube 3 (#164)
* fix SonarQube warnings
* Sonar qube 3 (#165)
* cleanup
* Add support for TSUN Titan inverter
Fixes#161
* fix SonarQube warnings
* fix error
* rename field "config"
* SonarQube reads flake8 output
* don't stop on flake8 errors
* flake8 scan only app/src for SonarQube
* update flake8 run
* ignore flake8 C901
* cleanup
* fix linter warnings
* ignore changed *.yml files
* read sensor list solarman data packets
* catch 'No route to' error and log only in debug mode
* fix unit tests
* add sensor_list configuration
* adapt unit tests
* fix SonarQube warnings
* Sonar qube 3 (#166)
* add unittests for mqtt.py
* add mock
* move test requirements into a file
* fix unit tests
* fix formating
* initial version
* fix SonarQube warning
* Sonar qube 4 (#169)
* add unit test for inverter.py
* fix SonarQube warning
* Sonar qube 5 (#170)
* fix SonarLints warnings
* use random IP adresses for unit tests
* Docker: The description ist missing (#171)
Fixes#167
* S allius/issue167 (#172)
* cleanup
* Sonar qube 6 (#174)
* test class ModbusConn
* Sonar qube 3 (#178)
* add more unit tests
* GEN3: don't crash on overwritten msg in the receive buffer
* improve test coverage und reduce test delays
* reduce cognitive complexity
* fix merge
* fix merge conflikt
* fix merge conflict
* S allius/issue182 (#183)
* GEN3: After inverter firmware update the 'Unknown Msg Type' increases continuously
Fixes#182
* add support for Controller serial no and MAC
* test hardening
* GEN3: add support for new messages of version 3 firmwares
* bump libraries to latest versions
- bump aiomqtt to version 2.3.0
- bump aiohttp to version 3.10.5
* improve test coverage
* reduce cognective complexity
* fix target preview
* remove dubbled fixtures
* increase test coverage
* Update README.md (#185)
update badges
* S allius/issue186 (#187)
* Parse more values in Server Mode
Fixes#186
* read OUTPUT_COEFFICIENT and MAC_ADDR in SrvMode
* fix unit test
* increase test coverage
* S allius/issue186 (#188)
* increase test coverage
* update changelog
* add dokumentation
* change default config
* Update README.md (#189)
Config file is now foldable
* GEN3: Invalid Contact Info Msg (#192)
Fixes#191
* Refactoring async stream (#194)
* GEN3: Invalid Contact Info Msg
Fixes#191
* introduce ifc with FIFOs
* add object factory
* use AsyncIfc class with FIFO
* declare more methods as classmethods
* - refactoring
- remove _forward_buffer
- make async_write private
* remove _forward_buffer
* refactoring
* avoid mqtt handling for invalid serial numbers
* add two more callbacks
* FIX update_header_cb handling
* split AsyncStream in two classes
* split ConnectionG3(P) in server and client class
* update class diagramm
* refactor server creation
* remove duplicated imports
* reduce code duplication
* move StremPtr instances into Inverter class
* resolution of connection classes
- remove ConnectionG3Client
- remove ConnectionG3Server
- remove ConnectionG3PClient
- remove ConnectionG3PServer
* fix server connections
* fix client loop closing
* don't overwrite self.remote in constructor
* update class diagramm
* fixes
- fixes null pointer accesses
- initalize AsyncStreamClient with proper
StreamPtr instance
* add close callback
* refactor close handling
* remove connection classes
* move more code into InverterBase class
* remove test_inverter_base.py
* add abstract inverter interface class
* initial commit
* fix sonar qube warnings
* rename class Inverter into Proxy
* fix typo
* move class InverterIfc into a separate file
* add more testcases
* use ProtocolIfc class
* add unit tests for AsyncStream class
* icrease test coverage
* reduce cognitive complexity
* increase test coverage
* increase tes coverage
* simplify heartbeat handler
* remove obsolete tx_get method
* add more unittests
* update changelog
* remove __del__ method for proper gc runs
* check releasing of ModbusConn instances
* call garbage collector to release unreachable objs
* decrease ref counter after the with block
* S allius/issue196 (#198)
* fix healthcheck
- on infrastructure with IPv6 support localhost
might be resolved to an IPv6 adress. Since the
proxy only support IPv4 for now, we replace
localhost by 127.0.0.1, to fix this
* merge from main
* S allius/issue117 (#118)
* add shutdown flag
* add more register definitions
* add start commando for client side connections
* add first support for port 8899
* fix shutdown
* add client_mode configuration
* read client_mode config to setup inverter connections
* add client_mode connections over port 8899
* add preview build
* Update README.md
describe the new client-mode over port 8899 for GEN3PLUS
* MODBUS: the last digit of the inverter version is a hexadecimal number (#121)
* S allius/issue117 (#122)
* add shutdown flag
* add more register definitions
* add start commando for client side connections
* add first support for port 8899
* fix shutdown
* add client_mode configuration
* read client_mode config to setup inverter connections
* add client_mode connections over port 8899
* add preview build
* add documentation for client_mode
* catch os error and log thme with DEBUG level
* update changelog
* make the maximum output coefficient configurable (#124)
* S allius/issue120 (#126)
* add config option to disable the modbus polling
* read more modbus regs in polling mode
* extend connection timeouts if polling mode is disabled
* update changelog
* S allius/issue125 (#127)
* fix linter warning
* move sequence diagramm to wiki
* catch asyncio.CancelledError
* S allius/issue128 (#130)
* set Register.NO_INPUTS fix to 4 for GEN3PLUS
* don't set Register.NO_INPUTS per MODBUS
* fix unit tests
* register OUTPUT_COEFFICIENT at HA
* update changelog
* - Home Assistant: improve inverter status value texts
* - GEN3: add inverter status
* on closing send outstanding MQTT data to the broker
* force MQTT publish on every conn open and close
* reset inverter state on close
- workaround which reset the inverter status to
offline when the inverter has a very low
output power on connection close
* improve client modified
- reduce the polling cadence to 30s
- set controller statistics for HA
* client mode set controller IP for HA
* S allius/issue131 (#132)
* Make __publish_outstanding_mqtt public
* update proxy counter
- on client mode connection establishment or
disconnecting update tje counection counter
* Update README.md (#133)
* reset inverter state on close
- workaround which reset the inverter status to
offline when the inverter has a very low
output power on connection close
* S allius/issue134 (#135)
* add polling invertval and method ha_remove()
* add client_mode arg to constructors
- add PollingInvervall
* hide some topics in client mode
- we hide topics in HA by sending an empty register
MQTT topic during HA auto configuration
* add client_mode value
* update class diagram
* fix modbus close handler
- fix empty call and cleanup que
- add unit test
* don't sent an initial 1710 msg in client mode
* change HA icon for inverter status
* increase test coverage
* accelerate timer tests
* bump aiomqtt and schema to latest release (#137)
* MQTT timestamps and protocol improvements (#140)
* add TS_INPUT, TS_GRID and TS_TOTAL
* prepare MQTT timestamps
- add _set_mqtt_timestamp method
- fix hexdump printing
* push dev and debug images to docker.io
* add unix epoche timestamp for MQTT pakets
* set timezone for unit tests
* set name für setting timezone step
* trigger new action
* GEN3 and GEN3PLUS: handle multiple message
- read: iterate over the receive buffer
- forward: append messages to the forward buffer
- _update_header: iterate over the forward buffer
* GEN3: optimize timeout handling
- longer timeout in state init and reveived
- got to state pending only from state up
* update changelog
* cleanup
* print coloured logs
* Create sonarcloud.yml (#143)
* Update sonarcloud.yml
* Update sonarcloud.yml
* Update sonarcloud.yml
* Update sonarcloud.yml
* Update sonarcloud.yml
* build multi arch images with sboms (#146)
* don't send MODBUS request when state is not up (#147)
* adapt timings
* don't send MODBUS request when state is note up
* adapt unit test
* make test code more clean (#148)
* Make test code more clean (#149)
* cleanup
* Code coverage for SonarCloud (#150)
* cleanup code and unit tests
* add test coverage for SonarCloud
* configure SonarCloud
* update changelog
* Do no build on *.yml changes
* prepare release 0.10.0
* disable MODBUS_POLLING for GEN§PLUS in example config
* bump aiohttp to version 3.10.2
* code cleanup
* Fetch all history for all tags and branches
* add tsun_v2 default configuration
* Add port 10000 for gen 3 plus inverters
* add monitor_sn for solarman support
* listen on port 10000 for solarman inverters
* initial version for gen 3 plus support
* refactoring split gen3 and gen3plus
* refactoring
* refactoring classes
* refactor proxy statistic counter
* - fix loggin levels
- user super() in close() and __del__()
* add config for gen 3 plus
* Add solarman config support
* refacot Message.. classes
* rename class MessageG3 into Talent
* refactor close() handler
* refactor disc() handler
* move loop() into the base class AsyncStream
* move async_read, _write and _forward into base class
* Cleanup
* move server_loop and client_loop into basic class
* add msg forwarding for solarman V5 protocol
* move server_loop() and client_loop to class AsyncStream
* rename AsyncStreamxx ton Connectionxx
* fix unit tests
* make more attributes privae
* load .env file
* wait after last test
* ignore .env
* add response handler
* Update README.md
* update unreleased changes
* home assistant add more diagnostic values
* fix typo
* Update README.md
Definition of the inverter generations added to the compatibility table
* add ha couter for 'Internal SW Exceptions'
* Update README.md
Fixes an incorrect marking in the display of the configuration file
* Update README.md
Planning documented for MS-2000 support
* S allius/issue33 (#34)
* - fix issue 33
The TSUN Cloud now responds to contact_info and get_time messages with
an empty display message and not with a response message as before.
We tried to parse data from the empty message, which led to an
exception
* Add test with empty conn_ind from inverter
* version 0.5.5
* add tsun_v2 default configuration
* Add port 10000 for gen 3 plus inverters
* add monitor_sn for solarman support
* listen on port 10000 for solarman inverters
initial version for gen 3 plus support
* refactoring split gen3 and gen3plus
* refactoring
* refactoring classes
* refactor proxy statistic counter
* - fix loggin levels
- user super() in close() and __del__()
* add config for gen 3 plus
* Add solarman config support
* refacot Message.. classes
* rename class MessageG3 into Talent
* refactor close() handler
* refactor disc() handler
* move loop() into the base class AsyncStream
* move async_read, _write and _forward into base class
* Cleanup
* move server_loop and client_loop into basic class
* add msg forwarding for solarman V5 protocol
* move server_loop() and client_loop to class AsyncStream
* rename AsyncStreamxx ton Connectionxx
* fix unit tests
* make more attributes privae
load .env file
* wait after last test
* ignore .env
* add response handler