[RELEASE] Remotec ZXT-120 AC IR Controller (2015)

OK, I have tried to have a look at it myself, but it’s currently out of my league :smile:

OK I think if fixed your issue.
Please pull latest code.
NOTE: No need to modify the slider value anymore just select the slider you want to display as follows, I have both in the code now and you can just show the one you want to. I wish I could wire this to a preference but SmartThings doesn’t have this feature.


// Comment Out next two lines for Celsius Sliders
“heatingSetpoint”, “heatSliderControl”, // Show Fahrenheit Heat Slider
“coolingSetpoint”, “coolSliderControl”, // Show Fahrenheit Heat Slider
// Uncomment next two lines for Celsius Sliders
//“heatingSetpoint”, “heatSliderControlC”, // Show Celsius Heat Slider
//“coolingSetpoint”, “coolSliderControlC”, // Show Celsius Cool Slider

Grab the latest. If you still have an issue please send me the log because I added additional information to my logging to debug this issue.

https://raw.githubusercontent.com/gouldner/SmartThingsPublic/master/devicetypes/gouldner/zxt-120-ir-sender-improved.src/zxt-120-ir-sender-improved.groovy

If you are curious what I needed to change it was this line that should be your fix. Adding the ceil fixes the issue because I checked all the conversion values and from celsius to fahrenheit you need to always round up to get the correct fahrenheit decimal value. In your example 71.6 needs to be 72 another example is 19C = 66.2F so we also need to round UP and not down here to get 67 for the correct ZXT-120 mapping. That is why I used ceil and not round. I checked each value and they all map correctly now.

1 Like

Thanks @Ron, that was quick! Its now setting the correct temp :slight_smile:

1 Like

@csc your edit of the title of this post makes my orininal first post entry make no sense. Perhaps the post should be edited also ? Someone reading the title and then my text is going to think I incorrectly titled this thread.

My intention is to make your excellence device handler easier to be found. I can’t edit your post except the title, perhaps you can help to edit your original first post and includes the link to gitgub there.

OK I thought that was what you were doing, I just figured if you can change Title you can change content. I will alter the content to better match the new Title.

UPDATE: I can’t edit Original Post either. But I found a trick I marked the post I made mid-thread with my current code as the “solution” this way the first post has the solution link to jump to the correct post.

1 Like

Hey Ron -
Thanks for the Code! I’ve been playing with it a bit and I’m working on a tweak that would allow me to increment the remoteCode every time I press a new tile. I can’t seem to figure out how to programatically increment remoteCode. Is there a simple method of setting the remoteCode from the code itself? You had a stub called getCommandParameters() that looked like you were attempting this as well.
Any thoughts?
Best Regards,
Bryan

Yea, I was trying to play with altering preferences programmatically but could not get it to work. I was informed via this forum that preferences can not be altered this way.

Here are two threads that might help.

Good day all,

Can anyone tell me how to get it working? I have added the device type and the smartapps. It is not functioning at all despite having the interface. How do I make it on/off aircon? Do i have to specify the zone?

@marcusqzy you need to give us more to go on to help you. Focus on the device type first. Once you can control the AC via the device interface in the app then the smart apps should be easier to set up.

Did you make sure the zxt-120 flirs mode is changed to “always listenting”? This device doesn’t work with ST correctly without this setting. If you didn’t you have to exclude the device, change the mode and include again.

Did you find aircon codes in the list of codes that came with the ZXT-120?
https://github.com/gouldner/SmartThingsPublic/blob/master/devicetypes/gouldner/docs/zxt-120/rm-zxt-Zipato-Ir-Extender-User-Manual-v1.0.pdf

Did you set the code for your aircon in preferences?
Test with 42,57 or 58 from the above manual, listed as aircon codes.

Did you push the preferences config to the zxt-120?
Did the device screen (things) display the configured code indicating the zxt-120 was correctly configured?

Beyond that test the device and report what the ide logs are displaying.

My aircon is daikin and tested with the codes you mentioned. The live log keep showing this error:

java.lang.NullPointerException: Cannot invoke method multiply() on null object @ line 805

Im a newbie in this field. Can you elaborate more on changing th emode to “always listening”?

Are you using my device code? I don’t have any multiply calls in my entire code base.

Yes Ron, I’ve been using your device code as device handler and added to my device. I run through the codes and couldn’t find any multiply method. For the on/off aircon smartapp, i cant find this method as well.

@marcusqzy so either you are not using my device code. You may have installed it but maybe didn’t assign it to the device ?

Or the error you are reporting is for something else? Can’t get an error on a line of code that doesn’t exist :slight_smile:

Also regarding FLIRS mode it’s documented in the manual that came with the zxt-120. You should have placed the device into “Always Listening” mode before including it. Again if you didn’t do this then you need to do an exclude of the device, change the FLIRS mode following the manual instructions, re-include the device and switch it to use my version of the device code. Then configure the preferences with your AC code, press the button on the zxt-120 to have it accepts the code and click configure in the app to send the config. The configured code should then populate in the device tile.

@Ron when i changed the remote code to either 42, 57 or 58, there isn’t an error.

This is the live logging result:
Sending Temp [82.4] for heat mode before enabling mode

It still doesn’t turn on the air-con or does anything. Getting frustrated when everyone else works while I’m getting this.

I can confirm that I am using your device code. Also, attempted to switch the mode to “always listening” which suppose to flash 4 times red led, it doesn’t. Is my device faulty?

Did you exclude the device as I explained before trying to change to “Always listening”? It can’t be changed when paired with Smart Things.
Page 13-14 here

You need to be more patient with this device it takes a lot of trial and error to find your code. I wish the company documented specific models and codes but unfortunately they do not. Is AirCon similar to any other brand? Perhaps another brands codes will work.

You are still not providing enough info to really help you. You gave me on line of output from the log but when you select “Cool” or “Heat” there should be a LOT of loggin. Also when you change the codes to 42, 57 and 58 are you sure it was displayed on the configured code tile in the ST app ? What is the IDE output when you set the codes? If you are not sending the code to the device correctly I wouldn’t know from your provided information.

When I press configure this is the output I get.

9f8d8b56-… 10:40:10 PM: warn parse called generating null map…why is this possible ? description=zw device: 0D, command: 3105, payload: 01 01 1B
9f8d8b56-… 10:40:10 PM: debug Sensor Reporting temperatureName Bedroom AC 80° map.value=80, cmdScale=C
9f8d8b56-… 10:40:10 PM: debug cmd.scaledSensorValue=27
9f8d8b56-… 10:40:10 PM: debug cmd.scale=0
9f8d8b56-… 10:40:10 PM: debug SensorMultilevelReport reporting…cmd=SensorMultilevelReport(precision: 0, scale: 0, scaledSensorValue: 27, sensorType: 1, sensorValue: [27], size: 1)
9f8d8b56-… 10:40:10 PM: info Parsing Description=zw device: 0D, command: 3105, payload: 01 01 1B
9f8d8b56-… 10:40:08 PM: debug Parse returned [[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]]
9f8d8b56-… 10:40:08 PM: debug Parse map=[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]
9f8d8b56-… 10:40:08 PM: debug Battery Level Reported=100
9f8d8b56-… 10:40:08 PM: info Parsing Description=zw device: 0D, command: 8003, payload: 64
9f8d8b56-… 10:40:07 PM: warn parse called generating null map…why is this possible ? description=zw device: 0D, command: 3105, payload: 01 01 1B
9f8d8b56-… 10:40:07 PM: debug Sensor Reporting temperatureName Bedroom AC 80° map.value=80, cmdScale=C
9f8d8b56-… 10:40:07 PM: debug cmd.scaledSensorValue=27
9f8d8b56-… 10:40:07 PM: debug cmd.scale=0
9f8d8b56-… 10:40:07 PM: debug SensorMultilevelReport reporting…cmd=SensorMultilevelReport(precision: 0, scale: 0, scaledSensorValue: 27, sensorType: 1, sensorValue: [27], size: 1)
9f8d8b56-… 10:40:07 PM: info Parsing Description=zw device: 0D, command: 3105, payload: 01 01 1B
9f8d8b56-… 10:40:06 PM: warn parse called generating null map…why is this possible ? description=zw device: 0D, command: 4405, payload: 3F
9f8d8b56-… 10:40:06 PM: debug Supported Fan Modes: fanAuto fanLow fanMedium fanHigh
9f8d8b56-… 10:40:06 PM: info Parsing Description=zw device: 0D, command: 4405, payload: 3F
9f8d8b56-… 10:40:05 PM: debug Parse returned [[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]]
9f8d8b56-… 10:40:05 PM: debug Parse map=[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]
9f8d8b56-… 10:40:05 PM: debug Battery Level Reported=100
9f8d8b56-… 10:40:05 PM: info Parsing Description=zw device: 0D, command: 8003, payload: 64
9f8d8b56-… 10:40:03 PM: warn parse called generating null map…why is this possible ? description=zw device: 0D, command: 3105, payload: 01 01 1B
9f8d8b56-… 10:40:03 PM: debug Sensor Reporting temperatureName Bedroom AC 80° map.value=80, cmdScale=C
9f8d8b56-… 10:40:03 PM: debug cmd.scaledSensorValue=27
9f8d8b56-… 10:40:03 PM: debug cmd.scale=0
9f8d8b56-… 10:40:03 PM: debug SensorMultilevelReport reporting…cmd=SensorMultilevelReport(precision: 0, scale: 0, scaledSensorValue: 27, sensorType: 1, sensorValue: [27], size: 1)
9f8d8b56-… 10:40:03 PM: info Parsing Description=zw device: 0D, command: 3105, payload: 01 01 1B
9f8d8b56-… 10:40:02 PM: debug Parse returned [[name:tempOffset, displayed:false, value:0, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC temp offset is 0]]
9f8d8b56-… 10:40:02 PM: debug Parse map=[name:tempOffset, displayed:false, value:0, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC temp offset is 0]
9f8d8b56-… 10:40:02 PM: debug reported offset=0
9f8d8b56-… 10:40:02 PM: info Parsing Description=zw device: 0D, command: 7006, payload: 25 01 00
9f8d8b56-… 10:40:01 PM: debug Parse returned [[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]]
9f8d8b56-… 10:40:01 PM: debug Parse map=[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]
9f8d8b56-… 10:40:01 PM: debug Battery Level Reported=100
9f8d8b56-… 10:40:01 PM: info Parsing Description=zw device: 0D, command: 8003, payload: 64
9f8d8b56-… 10:39:59 PM: debug Parse returned [[name:remoteCode, displayed:false, value:176, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC remote code is 176]]
9f8d8b56-… 10:39:59 PM: debug Parse map=[name:remoteCode, displayed:false, value:176, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC remote code is 176]
9f8d8b56-… 10:39:59 PM: debug reported currentConfigCode=176
9f8d8b56-… 10:39:59 PM: info Parsing Description=zw device: 0D, command: 7006, payload: 1B 02 00 B0
9f8d8b56-… 10:39:58 PM: debug TempOffset: 0
9f8d8b56-… 10:39:58 PM: debug New Remote Code: [0, 176]

When it completes my tile updates and looks like this. Notice that my configured code 176 is displayed.

When I select “Cool” I see the following in the logs. If you don’t see this output you are not using my device version.

9f8d8b56-… 10:44:47 PM: warn parse called generating null map…why is this possible ? description=zw device: 0D, command: 3105, payload: 01 01 1B
9f8d8b56-… 10:44:47 PM: debug Sensor Reporting temperatureName Bedroom AC 80° map.value=80, cmdScale=C
9f8d8b56-… 10:44:47 PM: debug cmd.scaledSensorValue=27
9f8d8b56-… 10:44:47 PM: debug cmd.scale=0
9f8d8b56-… 10:44:47 PM: debug SensorMultilevelReport reporting…cmd=SensorMultilevelReport(precision: 0, scale: 0, scaledSensorValue: 27, sensorType: 1, sensorValue: [27], size: 1)
9f8d8b56-… 10:44:47 PM: info Parsing Description=zw device: 0D, command: 3105, payload: 01 01 1B
9f8d8b56-… 10:44:47 PM: debug Parse returned [[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]]
9f8d8b56-… 10:44:47 PM: debug Parse map=[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]
9f8d8b56-… 10:44:47 PM: debug Battery Level Reported=100
9f8d8b56-… 10:44:47 PM: info Parsing Description=zw device: 0D, command: 8003, payload: 64
9f8d8b56-… 10:44:44 PM: debug Parse returned [[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]]
9f8d8b56-… 10:44:44 PM: debug Parse map=[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]
9f8d8b56-… 10:44:44 PM: debug Battery Level Reported=100
9f8d8b56-… 10:44:44 PM: info Parsing Description=zw device: 0D, command: 8003, payload: 64
9f8d8b56-… 10:44:42 PM: warn parse called generating null map…why is this possible ? description=zw device: 0D, command: 3105, payload: 01 01 1B
9f8d8b56-… 10:44:42 PM: debug Sensor Reporting temperatureName Bedroom AC 80° map.value=80, cmdScale=C
9f8d8b56-… 10:44:42 PM: debug cmd.scaledSensorValue=27
9f8d8b56-… 10:44:42 PM: debug cmd.scale=0
9f8d8b56-… 10:44:42 PM: debug SensorMultilevelReport reporting…cmd=SensorMultilevelReport(precision: 0, scale: 0, scaledSensorValue: 27, sensorType: 1, sensorValue: [27], size: 1)
9f8d8b56-… 10:44:42 PM: info Parsing Description=zw device: 0D, command: 3105, payload: 01 01 1B
9f8d8b56-… 10:44:40 PM: debug Parse returned [[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]]
9f8d8b56-… 10:44:40 PM: debug Parse map=[name:battery, value:100, unit:%, displayed:false, isStateChange:false, linkText:Bedroom AC, descriptionText:Bedroom AC battery is 100%]
9f8d8b56-… 10:44:40 PM: debug Battery Level Reported=100
9f8d8b56-… 10:44:40 PM: info Parsing Description=zw device: 0D, command: 8003, payload: 64
9f8d8b56-… 10:44:40 PM: warn parse called generating null map…why is this possible ? description=zw device: 0D, command: 4303, payload: 02 2A 02 EE
9f8d8b56-… 10:44:39 PM: debug Thermostat Setpoint Report for reportedCoolingSetpoint = 75.0 forcing state change true
9f8d8b56-… 10:44:39 PM: info RRG V1 ThermostatSetpointReport cmd=ThermostatSetpointReport(precision: 1, reserved01: 0, scale: 1, scaledValue: 75.0, setpointType: 2, size: 2, value: [2, 238])
9f8d8b56-… 10:44:39 PM: info Parsing Description=zw device: 0D, command: 4303, payload: 02 2A 02 EE
9f8d8b56-… 10:44:37 PM: debug Sending Temp [75] for cool mode before enabling mode
9f8d8b56-… 10:44:37 PM: debug new temp 75
9f8d8b56-… 10:44:37 PM: debug convertedDegrees=75, degrees=75
9f8d8b56-… 10:44:37 PM: debug No Conversion needed
9f8d8b56-… 10:44:37 PM: debug p=1
9f8d8b56-… 10:44:37 PM: debug state.precision=null
9f8d8b56-… 10:44:37 PM: debug deviceScaleString=F
9f8d8b56-… 10:44:37 PM: debug deviceScale=1
9f8d8b56-… 10:44:37 PM: debug state.scale=null

Finally are you running the zxt-120 on batteries or using USB power source. I
recommend plugging into USB at least until you get it working.

If these three codes don’t work you may have to contact remotec for support telling them which model you have and seeing if they can help with which code you can use.

In the end you may have to go through the process of learning the codes but honestly I don’t think you will find the effort involved tolerable. You have to learn every temp setting, it’s a LOT of work and error prone if not done very carefully.

Dear @Ron,

I have included your device type “properly” this time. Wasn’t aware it was included in another hub.

This is the live log that I got:

f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:29 AM: debug Parse returned [[value:25, unit:C, name:temperature, isStateChange:false, displayed:false, linkText:ZXT-120, descriptionText:ZXT-120 temperature is 25°C]]
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:29 AM: debug Parse map=[value:25, unit:C, name:temperature, isStateChange:false, displayed:false, linkText:ZXT-120, descriptionText:ZXT-120 temperature is 25°C]
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:29 AM: debug Sensor Reporting temperatureName ZXT-120 25°
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:29 AM: debug SensorMultilevelReport reporting…cmd=SensorMultilevelReport(precision: 0, scale: 0, scaledSensorValue: 25, sensorType: 1, sensorValue: [25], size: 1)
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:29 AM: info Parsing Description=zw device: 0A, command: 3105, payload: 01 01 19
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:27 AM: debug Parse returned [[name:battery, value:82, unit:%, displayed:false, isStateChange:true, linkText:ZXT-120, descriptionText:ZXT-120 battery is 82%]]
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:27 AM: debug Parse map=[name:battery, value:82, unit:%, displayed:false, isStateChange:true, linkText:ZXT-120, descriptionText:ZXT-120 battery is 82%]
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:27 AM: debug Battery Level Reported=82
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:27 AM: info Parsing Description=zw device: 0A, command: 8003, payload: 52
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:25 AM: warn parse called generating null map…why is this possible ? description=zw device: 0A, command: 4405, payload: 3F
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:25 AM: debug Supported Fan Modes: fanAuto fanLow fanMedium fanHigh
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:25 AM: info Parsing Description=zw device: 0A, command: 4405, payload: 3F
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:22 AM: warn parse called generating null map…why is this possible ? description=zw device: 0A, command: 4005, payload: 67 05
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:22 AM: debug Supported Modes: off heat cool dry
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:22 AM: info Parsing Description=zw device: 0A, command: 4005, payload: 67 05
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:20 AM: debug Parse returned [[name:tempOffset, displayed:false, value:0, isStateChange:false, linkText:ZXT-120, descriptionText:ZXT-120 temp offset is 0]]
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:20 AM: debug Parse map=[name:tempOffset, displayed:false, value:0, isStateChange:false, linkText:ZXT-120, descriptionText:ZXT-120 temp offset is 0]
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:20 AM: debug reported offset=0
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:20 AM: info Parsing Description=zw device: 0A, command: 7006, payload: 25 01 00
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:19 AM: debug Parse returned [[name:remoteCode, displayed:false, value:367, isStateChange:true, linkText:ZXT-120, descriptionText:ZXT-120 remote code is 367]]
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:19 AM: debug Parse map=[name:remoteCode, displayed:false, value:367, isStateChange:true, linkText:ZXT-120, descriptionText:ZXT-120 remote code is 367]
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:19 AM: debug reported currentConfigCode=367
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:19 AM: info Parsing Description=zw device: 0A, command: 7006, payload: 1B 02 01 6F
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:17 AM: debug TempOffset: 0
f0b2bcf1-a60b-47ec-b5aa-039c9a8face2 10:40:17 AM: debug New Remote Code: [1, 111]

Whenever I press Cool, I am still having the null pointer error. Trying to find out where this error came from.

I believe my problem lies with the remote code and configuring to “always listening” mode.

The device doesn’t flash 4 times when I attempt the steps to change the mode.

Not really sure if I am using the remote code. My air-con is Daikin, Split Unit i suppose.

From the logs it looks like you configured code 367 which is for Daikin, Daikin has 30 possible codes so that will be challenging to trial and error.

If your device isn’t in “Always Listening” it ISN’T going to work !

I have asked so many times now…Did you exclude the device before following the instructions in the manual link I provided. (Many device come with instructions with errors)

  1. Remove device from smart apps
  2. Exclude device
  3. Switch device to “Always Listenting”
  4. Re-include
  5. Configure preference with code
  6. Press button on zxt-120 and send config

If you can’t get the device into Always Listening mode the I would suggest you return it.

When you press cool you get this error ?
java.lang.NullPointerException: Cannot invoke method multiply() on null object @ line 805

I really can not explain that. Line 805 doesn’t have a call to multiply so I am lost for what is going on.

Yes I have exclude the device before following the instructions, it does not flash 4 times that manual indicates.

As for the cool button, I will try to figure out where is the multiply method.

@marcusqzy it really is critical you get “Always Listening” mode working before you move any further. I had issues getting this to work also. Try excluding and then resetting the device.

Reset - Page 19
https://github.com/gouldner/SmartThingsPublic/blob/master/devicetypes/gouldner/docs/zxt-120/rm-zxt-Zipato-Ir-Extender-User-Manual-v1.0.pdf

Then set Flirs “Always Listening” - Page 14
https://github.com/gouldner/SmartThingsPublic/blob/master/devicetypes/gouldner/docs/zxt-120/rm-zxt-Zipato-Ir-Extender-User-Manual-v1.0.pdfd

Regarding the Multiply issue Line 804 and 805 are as follows.
log.debug "Converting celsius to fahrenheit"
convertedDegrees = Math.ceil(celsiusToFahrenheit(degrees))

Do you see “Converting celsius to fahrenheit” one line before the null exception ?

It looks like you don’t have degrees set before you are pressing “Cool” are you using the device sliders to set your desired temperature before you issue the call to “Cool” ?