AirZone local API binding [3.4.0;4.2.0)

logo

This binding integrates AirZone controlled HVAC systems via connection to the local API offered by the webserver

Please note this binding is unofficial and not endorsed by AirZone in any way.

Supported things

  • AirZone bridge to represent the actual AirZone webserver. Only its IP address must be provided, discovery would need DHCP sniffing which is intrusive and not reliable.
  • AirZone system to represent the concept of “systems” in the installation. There is generally only one and its most common use is to monitor changes in the Errors channel. If the proper module is installed, it may also report its power consumption.
  • AirZone zone to represent a zone controlled by the HVAC system. This is the thing that has the most channels: name, on-off, temperature, humidity, setpoint-temperature (simple or double), operation mode, fan speed, stage kind, auto sleep, air-quality (value and threshold to react), fluid demand (cold, heat, air, floor), slats (swing and position), eco-adapt (target euro label value, a/a+…) and antifreeze.
  • AirZone “all zone” to allow controlling all zones at once via write only channels.

Changelog

Version 0.2.2

Fixes:

  • Older systems do not provide the master_zoneID field which prevented the “All zones” thing from working properly

Version 0.2.1

Fixes:

  • Prevent dynamic channels from being created more than once which stopped the binding from working properly.

Version 0.2.0

New features:

  • Introduced the “All zones” thing that offers channels controlling all zones at once

Fixes:

  • Support older API versions that do not offer systems information
  • Avoid dancing values by fixing the race condition between auto update and scheduled update
  • Do not blindly wait 3 seconds after each HTTP request but rather wait only if needed.

Version 0.1.0

  • initial release

Resources

JAR file
Source code
Source repository

1 Like

Hello,

Thank you very much for this binding ! It will be very useful.
Currently I’m using rules to communicate with the local API of my Airzone system.
I have a ducted system with an Airzone easyzone plenum with 8 outlets.

I installed the binding, it works.
But it seems there is an issue: I cannot change the setpoints of the zones. When I press + or -, the setpoint does not change on the screen, and it does not change on the Airzone system.

The on/off switch works well for each zone.

Temperatures are rounded to 0.5 degree, a 0.1 degree resolution would be appreciated.

If I understand well, operation mode for each zone is just an indication of the current mode (which is ok regarding the operation of the ducted system).

Also, it would be great to be able to change the overall mode of the system, in particular

  • general ON/OFF
  • mode : STOP, HEATING, COOLING…
  • temperature : set all zone temperatures to the same value
    These general changes can be obtained by sending commands to the zone 0 of the system. It would be great if the binding configuration would allow to declare the zone 0 (value 0 is not allowed, zone number should be at least 1).

Many thanks !
Kind regards,
Jetblack

Thanks for your feedback, I greatly appreciate it.

I just tried, it worked just fine here.
What I have noticed, however, is that sometimes the value “dances” between the new and previous value before settling on the new value like this:

User sets “setpoint” → new value --(4s)–> old value --(20s)–> new value

I believe there is a race condition between the scheduled update (on a 30s period) and the internal openHAB mechanism that tries to predict the value from user input before taking the one from the binding.
I have seen it happen with On/Off as well but I’m yet to find the route cause for it.

“setpoint” temperature is set to have a 0.5 degrees step because it ignores anything else if it’s not with the value for temp_step as returned in the JSON.

On the other hand, the “temperature” channel that indicates the current room temperature is not rounded and I’ve seen it take values with dozen of decimals like this: "roomTemp": 22.299999237060547

You can change it, but it’s only read/write on the Master zone whose id is indicated in the master_zoneID field. You can also see this value in a zone item properties:

Ah, I did not see that in the API documentation.
But then, how do I represent this in openHAB? I mean, I must have a value for a channel, but what is the value for “all zones” on each possible channel?
The same question goes also if you put all “setpoint” channels in an openHAB group. You can send a command to this group, but what is its value? This lead to quite a few debates here and the general consensus is that the group should not have a value, because each user may want something different.
Note that I’m not against having a “all zones” zone but I’m just voicing the issues I foresee to have a discussion before doing anything.

Hi,

Thank you very much for your response. I’m just migrating from OH2 to OH4. I will try again your binding based on your answers. I’m more confortable with OH4 than 2 weeks ago.
I’ll keep you posted.

Regarding zone 0 of the system, it is not documented in the API.
This has to be seen as a general broadcast to all zones, as write only changes.
So it has only a meaning for the settings like: operation on/off, setpoint and mode

It could be write-only channels for the system.

Kind regards,
Bernard

Hello,

I tried again the binding and I can confirm my first observations.
I had a look to the logs and there is an error:

2023-08-28 22:39:29.542 [ERROR] [nal.common.AbstractInvocationHandler] - An error occurred while calling method 'ThingHandler.handleCommand()' on 'com.obones.binding.airzone.internal.handler.AirZoneZoneThingHandler@1ddbe0f': Cannot read the array length because the return value of "com.obones.binding.airzone.internal.api.model.AirZoneHvacSystemsResponse.getSystems()" is null
java.lang.NullPointerException: Cannot read the array length because the return value of "com.obones.binding.airzone.internal.api.model.AirZoneHvacSystemsResponse.getSystems()" is null
	at com.obones.binding.airzone.internal.api.AirZoneApiManager.fillLatestSystems(AirZoneApiManager.java:370) ~[?:?]
	at com.obones.binding.airzone.internal.api.AirZoneApiManager.fetchStatus(AirZoneApiManager.java:102) ~[?:?]
	at com.obones.binding.airzone.internal.api.AirZoneApiManager.setChannelValue(AirZoneApiManager.java:403) ~[?:?]
	at com.obones.binding.airzone.internal.api.AirZoneApiManager.setZoneOnOff(AirZoneApiManager.java:180) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneZoneThingHandler.handleActionCommand(AirZoneZoneThingHandler.java:221) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseThingHandler.handleCommand(AirZoneBaseThingHandler.java:207) ~[?:?]

and below the output of the AirZone webserver for all zones of system 1:

{
	"data":	[{
			"systemID":	1,
			"zoneID":	1,
			"name":	"S�jour",
			"on":	1,
			"maxTemp":	30,
			"minTemp":	24,
			"setpoint":	25,
			"roomTemp":	22.799999237060547,
			"mode":	2,
			"coldStages":	1,
			"coldStage":	1,
			"heatStages":	1,
			"heatStage":	1,
			"humidity":	53,
			"units":	0,
			"errors":	[],
			"air_demand":	0,
			"floor_demand":	0
		}, {
			"systemID":	1,
			"zoneID":	2,
			"name":	"Entr�e",
			"on":	1,
			"maxTemp":	30,
			"minTemp":	24,
			"setpoint":	25,
			"roomTemp":	23.299999237060547,
			"modes":	[1, 4, 2, 3, 5],
			"mode":	2,
			"coldStages":	1,
			"coldStage":	1,
			"heatStages":	1,
			"heatStage":	1,
			"humidity":	49,
			"units":	0,
			"errors":	[],
			"air_demand":	0,
			"floor_demand":	0
		}, {
			"systemID":	1,
			"zoneID":	3,
			"name":	"Lingerie",
			"on":	1,
			"maxTemp":	30,
			"minTemp":	24,
			"setpoint":	25,
			"roomTemp":	23.100000381469727,
			"mode":	2,
			"coldStages":	1,
			"coldStage":	1,
			"heatStages":	1,
			"heatStage":	1,
			"humidity":	54,
			"units":	0,
			"errors":	[],
			"air_demand":	0,
			"floor_demand":	0
		}, {
			"systemID":	1,
			"zoneID":	4,
			"name":	"ZONA 04",
			"on":	1,
			"maxTemp":	30,
			"minTemp":	24,
			"setpoint":	25,
			"roomTemp":	0,
			"mode":	2,
			"coldStages":	1,
			"coldStage":	1,
			"heatStages":	1,
			"heatStage":	1,
			"humidity":	0,
			"units":	0,
			"errors":	[],
			"air_demand":	0,
			"floor_demand":	0
		}, {
			"systemID":	1,
			"zoneID":	5,
			"name":	"Ch. verte",
			"on":	1,
			"maxTemp":	30,
			"minTemp":	24,
			"setpoint":	28.5,
			"roomTemp":	22.399999618530273,
			"mode":	2,
			"coldStages":	1,
			"coldStage":	1,
			"heatStages":	1,
			"heatStage":	1,
			"humidity":	61,
			"units":	0,
			"errors":	[],
			"air_demand":	0,
			"floor_demand":	0
		}, {
			"systemID":	1,
			"zoneID":	6,
			"name":	"Suite",
			"on":	1,
			"maxTemp":	30,
			"minTemp":	24,
			"setpoint":	26.5,
			"roomTemp":	23.5,
			"mode":	2,
			"coldStages":	1,
			"coldStage":	1,
			"heatStages":	1,
			"heatStage":	1,
			"humidity":	59,
			"units":	0,
			"errors":	[],
			"air_demand":	0,
			"floor_demand":	0
		}, {
			"systemID":	1,
			"zoneID":	7,
			"name":	"Ch. orange",
			"on":	1,
			"maxTemp":	30,
			"minTemp":	24,
			"setpoint":	28.5,
			"roomTemp":	23,
			"mode":	2,
			"coldStages":	1,
			"coldStage":	1,
			"heatStages":	1,
			"heatStage":	1,
			"humidity":	60,
			"units":	0,
			"errors":	[],
			"air_demand":	0,
			"floor_demand":	0
		}, {
			"systemID":	1,
			"zoneID":	8,
			"name":	"Bureau",
			"on":	1,
			"maxTemp":	30,
			"minTemp":	24,
			"setpoint":	25,
			"roomTemp":	22,
			"mode":	2,
			"coldStages":	1,
			"coldStage":	1,
			"heatStages":	1,
			"heatStage":	1,
			"humidity":	55,
			"units":	0,
			"errors":	[],
			"air_demand":	0,
			"floor_demand":	0
		}]
}

Kind regards,

Bernard

Hum, interesting.
It actually fails when refreshing the systems, not the zones.
To do that, it sends the following POST request:

curl --request POST \
  --url http://AirZoneIPAddress:3000/api/v1/hvac \
  --header 'Content-Type: application/json' \
  --data '{
	"systemID": 127
}'

Under Windows, that would be this:

curl --request POST --url "http://AirZoneIPAddress:3000/api/v1/hvac"  --header "Content-Type: application/json" --data "{""systemID"": 127}"

And here, I get the following JSON

{
	"systems": [
		{
			"systemID": 1,
			"mc_connected": 0,
			"system_firmware": "3.53",
			"system_type": 1,
			"manufacturer": "Toshiba Commercial",
			"errors": []
		}
	]
}

Could you send the result of the same query on your system?

Hi,

I did the test

curl --request POST \
  --url http://192.168.2.69:3000/api/v1/hvac \
  --header 'Content-Type: application/json' \
  --data '{
        "systemID": 127
}'
{"errors":[{"error":"zoneid not provided"}]}

and some others

curl --request POST \
  --url http://192.168.2.69:3000/api/v1/hvac \
  --header 'Content-Type: application/json' \
  --data '{
        "systemID": 127, "zoneID": 0
}'
{"errors":[{"error":"systemid out of range"}]}




curl --request POST \
  --url http://192.168.2.69:3000/api/v1/hvac \
  --header 'Content-Type: application/json' \
  --data '{
        "systemID": 0, "zoneID": 0
}'
{
	"systems":	[{
			"data":	[{
					"systemID":	1,
					"zoneID":	1,
					"name":	"S?jour",
					"on":	1,
					"maxTemp":	30,
					"minTemp":	24,
					"setpoint":	25,
					"roomTemp":	24.700000762939453,
					"mode":	2,
					"coldStages":	1,
					"coldStage":	1,
					"heatStages":	1,
					"heatStage":	1,
					"humidity":	54,
					"units":	0,
					"errors":	[],
					"air_demand":	0,
					"floor_demand":	0
				}, {
					"systemID":	1,
					"zoneID":	2,
					"name":	"Entr?e",
					"on":	1,
					"maxTemp":	30,
					"minTemp":	24,
					"setpoint":	25,
					"roomTemp":	24.600000381469727,
					"modes":	[1, 4, 2, 3, 5],
					"mode":	2,
					"coldStages":	1,
					"coldStage":	1,
					"heatStages":	1,
					"heatStage":	1,
					"humidity":	49,
					"units":	0,
					"errors":	[],
					"air_demand":	0,
					"floor_demand":	0
				}, {
					"systemID":	1,
					"zoneID":	3,
					"name":	"Lingerie",
					"on":	1,
					"maxTemp":	30,
					"minTemp":	24,
					"setpoint":	25,
					"roomTemp":	24,
					"mode":	2,
					"coldStages":	1,
					"coldStage":	1,
					"heatStages":	1,
					"heatStage":	1,
					"humidity":	54,
					"units":	0,
					"errors":	[],
					"air_demand":	0,
					"floor_demand":	0
				}, {
					"systemID":	1,
					"zoneID":	4,
					"name":	"ZONA 04",
					"on":	1,
					"maxTemp":	30,
					"minTemp":	24,
					"setpoint":	25,
					"roomTemp":	0,
					"mode":	2,
					"coldStages":	1,
					"coldStage":	1,
					"heatStages":	1,
					"heatStage":	1,
					"humidity":	0,
					"units":	0,
					"errors":	[],
					"air_demand":	0,
					"floor_demand":	0
				}, {
					"systemID":	1,
					"zoneID":	5,
					"name":	"Ch. verte",
					"on":	1,
					"maxTemp":	30,
					"minTemp":	24,
					"setpoint":	28.5,
					"roomTemp":	23,
					"mode":	2,
					"coldStages":	1,
					"coldStage":	1,
					"heatStages":	1,
					"heatStage":	1,
					"humidity":	61,
					"units":	0,
					"errors":	[],
					"air_demand":	0,
					"floor_demand":	0
				}, {
					"systemID":	1,
					"zoneID":	6,
					"name":	"Suite",
					"on":	1,
					"maxTemp":	30,
					"minTemp":	24,
					"setpoint":	26.5,
					"roomTemp":	24.100000381469727,
					"mode":	2,
					"coldStages":	1,
					"coldStage":	1,
					"heatStages":	1,
					"heatStage":	1,
					"humidity":	61,
					"units":	0,
					"errors":	[],
					"air_demand":	0,
					"floor_demand":	0
				}, {
					"systemID":	1,
					"zoneID":	7,
					"name":	"Ch. orange",
					"on":	1,
					"maxTemp":	30,
					"minTemp":	24,
					"setpoint":	28.5,
					"roomTemp":	23.799999237060547,
					"mode":	2,
					"coldStages":	1,
					"coldStage":	1,
					"heatStages":	1,
					"heatStage":	1,
					"humidity":	62,
					"units":	0,
					"errors":	[],
					"air_demand":	0,
					"floor_demand":	0
				}, {
					"systemID":	1,
					"zoneID":	8,
					"name":	"Bureau",
					"on":	1,
					"maxTemp":	30,
					"minTemp":	24,
					"setpoint":	25,
					"roomTemp":	24.700000762939453,
					"mode":	2,
					"coldStages":	1,
					"coldStage":	1,
					"heatStages":	1,
					"heatStage":	1,
					"humidity":	53,
					"units":	0,
					"errors":	[],
					"air_demand":	0,
					"floor_demand":	0
				}]
		}]
}


curl --request POST \
  --url http://192.168.2.69:3000/api/v1/hvac \
  --header 'Content-Type: application/json' \
  --data '{
        "systemID": 0             
}'
{"errors":[{"error":"zoneid not provided"}]}

Ah, so it seems your installation does not support systems information. What do you get with the following URL?

curl --request POST --url http://192.168.2.69:3000/api/v1/webserver

I’m most interested by the ws_firmware field.

Here is the response

curl --request POST --url http://192.168.2.69:3000/api/v1/webserver
{"errors":[{"error":"Method not provided or not supported"}]}

The Webserver version is 3.39

The system firmware version is 3.31

The system was installed 6 years ago, I asked for a firmware update one year ago

Kind regards,
Bernard

Well, that explains it then, here I have this:

http://192.168.2.69:3000/api/v1/version
{
	"version": "1.64"
}

http://192.168.2.69:3000/api/v1/webserver
{
	"mac": "AB:CD:EF:01:23:45",
	"wifi_channel": 7,
	"wifi_quality": 40,
	"wifi_rssi": -54,
	"interface": "wifi",
	"ws_firmware": "3.44",
	"ws_type": "ws_az"
}

So your installation being a bit older, it’s expected that it does not support the same API level.
I’ll be sure to take this into account in the next version, hopefully by the end of the week.

Thank you very much.

I try this

curl --request POST \
  --url http://192.168.2.69:3000/api/v1/version
{
	"version":	"1.55"
}

Regards,
Bernard

Version 0.2.0 is out, please see top post for changelog

Hello,

I’ve just seen that you made a new version. I’ll try it as soon as possible.

Many thanks !

Bernard

Just an update: I installed the new version. It discovered all my zones as Things (the previous version did not).
I saw that a Thing is also available for the general commands to all zones.
Tonight I should have time to make the full configuration.

Thanks a lot.
Bernard

1 Like

Hello @obones,

I still have a problem with the binding.
Items that read values are Ok (temperature, humidity…). Switches to power on/off the zones work as well. However, setpoint items don’t work. I have this kind of error in the logs

2023-09-07 08:42:50.299 [ERROR] [nal.common.AbstractInvocationHandler] - An error occurred while calling method 'ThingHandler.initialize()' on 'com.obones.binding.airzone.internal.handler.AirZoneZoneThingHandler@87de14': Duplicate channels airzone:zone:520c631942:s1-z5:setpoint
java.lang.IllegalArgumentException: Duplicate channels airzone:zone:520c631942:s1-z5:setpoint
	at org.openhab.core.thing.util.ThingHelper.ensureUniqueChannels(ThingHelper.java:135) ~[?:?]
	at org.openhab.core.thing.util.ThingHelper.ensureUniqueChannels(ThingHelper.java:127) ~[?:?]
	at org.openhab.core.thing.util.ThingHelper.ensureUniqueChannels(ThingHelper.java:123) ~[?:?]
	at org.openhab.core.thing.binding.builder.ThingBuilder.withChannel(ThingBuilder.java:123) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseThingHandler.createOptionalChannel(AirZoneBaseThingHandler.java:137) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseThingHandler.createOptionalChannel(AirZoneBaseThingHandler.java:142) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseZoneThingHandler.createOptionalChannels(AirZoneBaseZoneThingHandler.java:71) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneZoneThingHandler.createOptionalChannels(AirZoneZoneThingHandler.java:84) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseZoneThingHandler.createOptionalChannels(AirZoneBaseZoneThingHandler.java:163) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneZoneThingHandler.createOptionalChannels(AirZoneZoneThingHandler.java:78) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseThingHandler.createOptionalChannels(AirZoneBaseThingHandler.java:117) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseThingHandler.initialize(AirZoneBaseThingHandler.java:85) ~[?:?]
	at jdk.internal.reflect.GeneratedMethodAccessor27.invoke(Unknown Source) ~[?:?]
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
	at org.openhab.core.internal.common.AbstractInvocationHandler.invokeDirect(AbstractInvocationHandler.java:147) ~[?:?]
	at org.openhab.core.internal.common.Invocation.call(Invocation.java:52) ~[?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
	at java.lang.Thread.run(Thread.java:833) ~[?:?]
2023-09-07 08:42:50.321 [ERROR] [core.thing.internal.ThingManagerImpl] - Exception occurred while initializing handler of thing 'airzone:zone:520c631942:s1-z5': Duplicate channels airzone:zone:520c631942:s1-z5:setpoint
java.lang.IllegalArgumentException: Duplicate channels airzone:zone:520c631942:s1-z5:setpoint
	at org.openhab.core.thing.util.ThingHelper.ensureUniqueChannels(ThingHelper.java:135) ~[?:?]
	at org.openhab.core.thing.util.ThingHelper.ensureUniqueChannels(ThingHelper.java:127) ~[?:?]
	at org.openhab.core.thing.util.ThingHelper.ensureUniqueChannels(ThingHelper.java:123) ~[?:?]
	at org.openhab.core.thing.binding.builder.ThingBuilder.withChannel(ThingBuilder.java:123) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseThingHandler.createOptionalChannel(AirZoneBaseThingHandler.java:137) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseThingHandler.createOptionalChannel(AirZoneBaseThingHandler.java:142) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseZoneThingHandler.createOptionalChannels(AirZoneBaseZoneThingHandler.java:71) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneZoneThingHandler.createOptionalChannels(AirZoneZoneThingHandler.java:84) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseZoneThingHandler.createOptionalChannels(AirZoneBaseZoneThingHandler.java:163) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneZoneThingHandler.createOptionalChannels(AirZoneZoneThingHandler.java:78) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseThingHandler.createOptionalChannels(AirZoneBaseThingHandler.java:117) ~[?:?]
	at com.obones.binding.airzone.internal.handler.AirZoneBaseThingHandler.initialize(AirZoneBaseThingHandler.java:85) ~[?:?]
	at jdk.internal.reflect.GeneratedMethodAccessor27.invoke(Unknown Source) ~[?:?]
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
	at org.openhab.core.internal.common.AbstractInvocationHandler.invokeDirect(AbstractInvocationHandler.java:147) ~[?:?]
	at org.openhab.core.internal.common.Invocation.call(Invocation.java:52) ~[?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
	at java.lang.Thread.run(Thread.java:833) ~[?:?]

Thank you very much,
Bernard

EDIT : I rebooted several times Openhab and nows Airzone Things for zones are uninitialized

Hello,

I have seen this as well while developing the binding and I was able to fix it by doing this:

  1. Disable the bridge thing
  2. Go back to settings
  3. Wait for a few seconds (10?)
  4. Enable the bridge thing

Then everything would come back online and work properly.

But I’m still wondering why I get those errors about duplicate channels.

@obones

Thank you for your response. I tried several times your procedure. Unfortunately it does not work. Now openhab complains for duplicate channels for every zone for the setpoint. All zone things appear as “ERROR HANDLER” in the UI.

I can copy paste here the logs if needed.

Thank you,
Bernard

Hum… strange, I can’t reproduce this any longer.
But there might be another thing to try:

  1. Disable all things one after the other
  2. Wait for 10 seconds
  3. Enable the bridge only
  4. Wait for it to be back online
  5. Enable one zone
  6. Wait for it to be back online
  7. Repeat for other zones

This might bring back the system to a working situation.
But I have to figure out what’s causing all this pain when updating the plugin.

I believe I have found the source of the issue and have uploaded version 0.2.1 with a fix for this.

1 Like

Hello,

@obones, I didn’t manage to make 0.2.0 work, I"m going to try 0.2.1 !
I keep you posted.

Many thanks !
Bernard