Page 2 of 2

Re: HomeWizard Battery plugin

Posted: Friday 23 May 2025 16:21
by rini52
thanks,

That is the type that is created by the HomeWizard Battery plugin and is called "Active Power" and possible to include in the Electricity Dashboard.
But no possibility to include more than one battery per hardware integration. So you have to do combine them in one single hardware setup,as you did apparently. But that needs a mayor update of the plugin with some extra token/ip settings. Therefor I just combine them with a dzventz script. I used a "usage electric" sensor but apparently I could have better use a "general kwh" dummy sensor.

Regards,

Re: HomeWizard Battery plugin

Posted: Tuesday 27 May 2025 15:07
by mvdp
rini52 wrote: Friday 23 May 2025 11:47 This is really great stuff. I just received 3 batteries and they work great as they were designed. However the p1-senseor is not selectable from the energy dashboard the "active power" sensor is. This sensor shows the Import-Export power of the battery. Since I had 3 batteries i had to sum them and put the result in a "usage electricity" sensor. Similar for the percentage(SOC) sensors. They can both be used in the Energy Dashboard"
Thanks for the feedback. I will mention in README.md that one can combine multiple batteries using some additional event handling code. I don't feel like combining multiple batteries together with the plugin.

I myself have 2 batteries and I just configured them in domoticz as 2 separate hardware devices. And indeed I'm using a dummy device to sum the actual power together using some lua scripting. A similar script runs when the SOC of a battery changes to provide the overal SOC value.

Code: Select all

return
{
    on =
    {
        devices = {1827, 1828}
    },
	execute = function(domoticz, item)
        local battery1Power = domoticz.devices(1827)    -- Battery set 1, existing General kwh device
        local battery2Power = domoticz.devices(1828)    -- Battery set 2, existing General kwh device
        -- Create manually a dummy kWh, Electricity (instant and counter) device in generation mode
        local totalPower = domoticz.devices(1813)       -- Total, to be used in Energy dashboard configuration
        
        totalPower.updateElectricity(
        	battery1Power.actualWatt + battery2Power.actualWatt,
        	battery1Power.WhTotal + battery2Power.WhTotal)
	end
}

Re: HomeWizard Battery plugin

Posted: Tuesday 27 May 2025 19:50
by WilcoEHV
Hi,
Great work.
I have a HW battery and i want to include it into Domoticz.
Although i'm an Domoticz enthusiast since 2017 i'n not femilliar with scripting.
Can someone guide me through setting up this plugin?

PS; I've considered following a course scripting before, any suggestions on where to start are welcome!

Re: HomeWizard Battery plugin

Posted: Tuesday 27 May 2025 20:14
by mvdp
WilcoEHV wrote: Tuesday 27 May 2025 19:50 Can someone guide me through setting up this plugin?
Good news, with 1 battery there is no need for scripting.

To install the python plugin see this wiki page: https://wiki.domoticz.com/Using_Python_plugins
Consider using the domoticz python plugin manager, as that takes the burden away from the git checkout. To be honest, I have not used the plugin manager plugin. See https://wiki.domoticz.com/Python_Plugin_Manager

Read the readme.md of the battery plugin to get a token needed to communicate with it.

Let me know in case of questions.

Re: HomeWizard Battery plugin

Posted: Wednesday 28 May 2025 15:41
by rini52
Thanks for the example.
Attached I included tthe percentage as well.

Regards
HWZ_PlgBat_summary.txt
(1.96 KiB) Downloaded 80 times

Re: HomeWizard Battery plugin

Posted: Monday 23 June 2025 9:29
by zanco
Thanks for your work. It works nicely, added 2 homewizzard batteries to my domoticz.

Yesterday I reworked my internal network after being forced to a double router system by my fiber company delivering a modem / router with no bridge mode possible. So yesterday I moved the Asus router to AP mode and had all my IP addresses moved to another range. The hardware setup to change the battery and P1 IP addresses are easy.

It took me however a few hours and a good night sleep AND your readme.md to get the clue why the batteries did not report since yesterday afternoon. The token generated is based on the original IP adress so I have generated 2 new tokens which I changed in the settings and all is OK now.


One little remark: excecuting the scripts for detect require me to type python3 scriptname.py instead of python (which is python2.7 on my system)

Just in case someone runs into the same problem.

Thanks again,
Ben

Re: HomeWizard Battery plugin

Posted: Tuesday 01 July 2025 4:20
by mvdp
👍
Thank you for the suggestion of using python3 instead of python. I’ve changed it in the readme and code.

Re: HomeWizard Battery plugin

Posted: Thursday 11 September 2025 21:13
by DomoFlits
Thank you for creating the plugin.
Is it possible to add a mode command / readout to the plugin as described in: https://api-documentation.homewizard.co ... /batteries
It can be used to send a "to_full" command to the battery when electricity price is =<€0 and a "zero" command when the price is >€0.
Both are momentary commands. Once the to_full command is sent, the battery will charge itself to full, and then atomatically goes back into "zero" mode.

or should this better be done with a script?
in that case, could someone guide me how to implement and use this described script from Homewizard?

Code: Select all

curl https://<IP ADDRESS>/api/batteries \
  --insecure \
  -X PUT \
  -H "Authorization: Bearer <TOKEN>" \
  -H "X-Api-Version: 2" \
  -d '{"mode": "to_full"}'
will this be a function like this in Dzvents:

Code: Select all

return {
    on = { ... }, -- some trigger
    execute = function(domoticz)
    domoticz.openURL({
        url = 'https://<IP ADDRESS>/api/batteries',
        method = 'PUT',
	headers = {
		['Authorisation'] = 'Bearer <TOKEN>',
		['X-Api-Version'] = '2'
	},
        postData = '{"mode": "to_full"}'
    })
    end
}
I'm not sure about the syntaxis and how to handle the insecure as well as the response.

I assume now that the <IP ADDRESS> is the IP address of the P1 and not the battery and I'll also need a token from the P1 (due to this information: https://gathering.tweakers.net/forum/li ... 2#82340672)

If it is indeed arranged via the P1 it might not be logic to have this in the battery plugin since the plugin needs to have the P1 address and the P1 token, which gets confusing on the hardware page.

Re: HomeWizard Battery plugin

Posted: Friday 12 September 2025 15:19
by rene2716
Hi when i try tp do
pip install -r requirements.txt
i get
error: externally-managed-environment
any idea whhere this comes from ?

Re: HomeWizard Battery plugin

Posted: Friday 12 September 2025 16:37
by waltervl
rene2716 wrote: Friday 12 September 2025 15:19 Hi when i try tp do
pip install -r requirements.txt
i get
error: externally-managed-environment
any idea whhere this comes from ?
It is coming from recent linux distributions requiring Python Virtual Environments.
See https://wiki.domoticz.com/Using_Python_ ... ules_fails

Re: HomeWizard Battery plugin

Posted: Friday 12 September 2025 18:01
by DomoFlits
DomoFlits wrote: Thursday 11 September 2025 21:13
I assume now that the <IP ADDRESS> is the IP address of the P1 and not the battery and I'll also need a token from the P1 (due to this information: https://gathering.tweakers.net/forum/li ... 2#82340672)

If it is indeed arranged via the P1 it might not be logic to have this in the battery plugin since the plugin needs to have the P1 address and the P1 token, which gets confusing on the hardware page.
The curl indeed has to be send to the P1, so a separate token op the P1 is needed.

When testing on the commandline the below works fine:

Code: Select all

curl -X PUT https://<IP-of-P1>/api/batteries --insecure ^
-H "Authorization: Bearer <token of P1>" ^
-H "X-Api-Version: 2" ^
-H "Content-Type: application/json" ^
-d "{""mode"": ""to_full""}"
gives as result:

Code: Select all

{"mode":"to_full","power_w":0,"max_consumption_w":800,"max_production_w":800,"target_power_w":-48}
At the battery in the app now can be seen that it the battery is controlled by the local API (instead of the 2 options "zero-mode" or "manual charge mode".) :D

so the DzVents script should be something like

Code: Select all

return {
    on = { ... }, -- some trigger
    execute = function(domoticz)
    domoticz.openURL({
        url = 'https://<IP-of-the-P1>/api/batteries --insecure',
        method = 'PUT',
	headers = {
		['Authorisation'] = 'Bearer <token-of-the-P1>',
		['X-Api-Version'] = '2'
	},
        postData = '{"mode": "to_full"}'
    })
    end	
}
However, this gives the error:
Error opening url: https://192.168.1.212/api/batteries --insecure

any help on how to handle the --insecure part when using domoticz.openURL function in DzVents?

Re: HomeWizard Battery plugin

Posted: Thursday 02 October 2025 10:20
by waltervl

Code: Select all

postData = '{"mode": "to_full"}'
should be

Code: Select all

postData = { mode = 'to_full' }
See also topic viewtopic.php?p=322121#p322121

Re: HomeWizard Battery plugin

Posted: Thursday 02 October 2025 13:32
by mvdp
For reference you need to specify post data as `postData = { ['mode'] = 'to_full' },`
Also adding ` --insecure` to the url does not help.
Even so it seems like the dzVent http connection api renders the https call invalid for the p1 device.

As a workaround you could run a shellcommand from dzVents that calls into the curl command. See for example this wiki item: https://wiki.domoticz.com/DzVents:_next ... d_executio

Re: HomeWizard Battery plugin

Posted: Thursday 02 October 2025 13:40
by mvdp
This is the dzVent script I was using to set the mode (fill in your own Bearer string).
It still fails with `2025-10-02 13:39:02.271 Error: dzVents: HTTP/1.1 response: 401 ==>> Unauthorized`

Code: Select all

return {
    on = { timer = {
			'every minute',          
	   },
       httpResponses = { 'batteries' }
    },
    execute = function(domoticz, item)
        if (item.isTimer) then
            domoticz.openURL({
                url = 'https://192.168.1.6/api/batteries',
                method = 'PUT',
        	headers = {
            		['Authorisation'] = 'Bearer *********************',
            		['X-Api-Version'] = '2'
        	},
                postData = { ['mode'] = 'to_full' },
                callback = 'batteries'
            })
            print("batteries set to to_full")
        elseif (item.isHTTPResponse) then
            print('batteries: ') 
            print(item.ok)
            print(item.json)
            print('end batteries')
        end
    end	
}

Re: HomeWizard Battery plugin

Posted: Thursday 02 October 2025 14:07
by mvdp
I (and a bit of chatgpt) managed to switch the mode using a python event script.
You may want to change the trigger type of the script to time or when a user variable changes.

Code: Select all

import DomoticzEvents as DE

import http.client
import ssl
import json

# API details
host = "192.168.1.6"    # fill in your p1 ip number
port = 443
url = "/api/batteries"
bearer_token = "**************" # fill in your bearer_token
body = '{"mode": "to_full"}'

# Create an SSL context that ignores certificate verification (-k)
context = ssl._create_unverified_context()

# Create HTTPS connection
conn = http.client.HTTPSConnection(host, port, context=context, timeout=10)

# Headers
headers = {
    "Authorization": f"Bearer {bearer_token}",
    "X-Api-Version": "2",
    "Content-Type": "application/json",
    "Accept": "*/*"
}

# Make GET request with a body
conn.request("PUT", url, body=body, headers=headers)
response = conn.getresponse()

# Print status
DE.Log(f"HTTP {response.status} {response.reason}\n")

# Read response
data = response.read()
try:
    parsed = json.loads(data)
    DE.Log(json.dumps(parsed, indent=2, ensure_ascii=False))
except Exception:
    DE.Log(data.decode('utf-8', errors='ignore'))


Re: HomeWizard Battery plugin

Posted: Thursday 02 October 2025 19:34
by DomoFlits
Thanks for putting me on the right track.
It is working now with the flip of a switch in domoticz. :D

This is what I did:
I've made a dummy selector switch with 2 selections: "to-full" and "zero"

Action for "to-full" is: script:///home/pi/domoticz/scripts/HW_full.py
Action for "zero" is: script:///home/pi/domoticz/scripts/HW_zero.py

I've put the below 2 scripts in the scripts-folder and made them executable (update the IP adress of the P1 and insert the token)
The switch can now be used in further automation.

HW_full.py

Code: Select all

#!/usr/bin/python

import http.client
import ssl
import json

# API details
host = "192.168.1.212"    # fill in your p1 ip number
port = 443
url = "/api/batteries"
bearer_token = "--------------" # fill in your bearer_token
body = '{"mode": "to_full"}'

# Create an SSL context that ignores certificate verification (-k)
context = ssl._create_unverified_context()

# Create HTTPS connection
conn = http.client.HTTPSConnection(host, port, context=context, timeout=10)

# Headers
headers = {
    "Authorization": f"Bearer {bearer_token}",
    "X-Api-Version": "2",
    "Content-Type": "application/json",
    "Accept": "*/*"
}

# Make GET request with a body
conn.request("PUT", url, body=body, headers=headers)
response = conn.getresponse()
HW_zero.py

Code: Select all

#!/usr/bin/python

import http.client
import ssl
import json

# API details
host = "192.168.1.212"    # fill in your p1 ip number
port = 443
url = "/api/batteries"
bearer_token = "--------------" # fill in your bearer_token
body = '{"mode": "zero"}'

# Create an SSL context that ignores certificate verification (-k)
context = ssl._create_unverified_context()

# Create HTTPS connection
conn = http.client.HTTPSConnection(host, port, context=context, timeout=10)

# Headers
headers = {
    "Authorization": f"Bearer {bearer_token}",
    "X-Api-Version": "2",
    "Content-Type": "application/json",
    "Accept": "*/*"
}

# Make GET request with a body
conn.request("PUT", url, body=body, headers=headers)
response = conn.getresponse()

Re: HomeWizard Battery plugin

Posted: Friday 03 October 2025 9:31
by mvdp
Nice! Glad it works now.

2 small nit remarks:
* The comment says GET but the code uses PUT (my bad).
* You could improve the set up with 1 script only where the mode is provided as an program argument. This is to prevent to maintain the same information like ip and bearer token in multiple places.

Re: HomeWizard Battery plugin

Posted: Sunday 25 January 2026 13:00
by gvandick
Thx it works great!!