Z-Wave Multi Channel (PE653)

OK. I don't have VSPs, so you'll have to educate me. Have they ever worked? If so, how do you turn them on in the interface? If not, can you tell me what they are? I take it you can set RPMs? Have you ever had any other driver or whatnot work for them?

I've looked at this code for literally zero minutes, but I will dig in. Anything you can tell me about what they have done or are supposed to do will help.

Yeah, the errors there say that you have no child devices. Do you have any of the children? Do you have the 'child switch device' DTH installed? That's erocm123 : Switch Child Device.

@JDogg016

So the VSP represented a series of switches to control 4 levels of the variable speed pump. I am unfamiliar with the RPMs associated with each switch but 0 = off and 4 = highest level.

Yes, they used to work in both ST and HE without issue using @keithriley code until the FW update.

I've installed this DTH, but I am curious as to why I needed to in the first place. @keithriley code worked without the need for a child device handler. In fact, it was stated this was no longer needed in ST or HE.

HE has switched to a 'composite' model that allows combining existing code rather than each DHT writing the same thing over and over. Keith switched this DHT to use the modern standard.

OK, thanks; that makes sense. I think the RPMs are configurable. I managed to knock this out before the kid woke up:

https://github.com/HubitatCommunity/hubitat-zwavemultichannel-pe653/tree/vsp-functionality

Give this a try:

  • Install this
  • Click 'insertLogTrace' button
  • configure VSP as on in the configuration
  • Click 'insertLogTrace' button
  • Click 'recreateChildren'
  • Click 'insertLogTrace' button
  • Click one of the VSP buttons

Be sure to do a hub update first if it is available.

Depending on which FW update you mean, that may be just the broken multichannel encapsulation - which they intend to fix any minute now. It may even be fixed with yesterday's update. But I'll try to do this anyway.

Hey guys, relatives in town so no free time.

I would not focus on the child devices. They are nearly a convenience, not a requirement. For them to work you do need to install the child DTH, but again, that is just so you can expose each of the 5 switches and 4 pump speeds as separate “things”. Maybe in HE it’s not even that relevant.

Also don’t focus on RPMs. The controller supports 4 pump speeds, each can be selected by turning on one of 4 channels in the sane multi-channel interface. The one change @joshua made to hack around the HE defect should have fixed this too, but i’ll Have to double check the channel IDs for the 4 speeds. It’s all the convenience methods near the top of the executable code, but may not be clear.

Why remove modes? They are just a layer on top of the basic functions. I get that RM can orchestrate(so can CoRE), but some users take advantage of the simple mode approach. I even use it myself. Anyway, I see no benefit to further diverging the code. This won’t fix the VSP.

How soon is the HE fix coming. It may be better to see if that fixes the VSP issue. It was working before.

That was fixed in release 1.1.6 as mentioned above.

Here are the release notes:

Chuck's saying they've fixed that.

Well, it's precisely because it's an extra layer that I thought to remove it. It's a lot of code that re-creates a wheel being developed by others. Do one small thing well rather than do everything, and all that.

Given you use it, though, of course I'll chop out that commit and it'll all be back. It may be worth looking at what will likely become a much more full-featured solution.

@JDogg016 With the 1.0.16 update I'm finding this doesn't work - you may want to give me a bit on this. Possibly the 3.0.6 version will 'just work' again with the fix in place.

@keithriley Say hello to your family, and let them know they are keeping you from CRITICAL hot tub controller code! I have an email I'm accumulating to you about changes I'm making as I bang on this. In particular I'm working to separate the logging, delay insertion, delay 'massaging', and command-vs-response sections of delayBetweenLog so each is contained in a separate method. I'm sure I'm changing that section a lot but I think it'll help to separate the responsibilities. In a recent branch, I'm also grouping code together - all commands in one place, all private/utility methods in another, etc. This'll result in big diffs but it's mostly moving things. Thanks again for doing all the hard work to figure out all the manufacturer-specific stuff.

3.06 does not work

OK! The last 'master' in the repository I linked will work except for VSP, then. If you give that a try, it may even work for VSP as well, but if not, I'll keep going on this. Check back in!

Actually, I'm getting suddenly nothing working for all child devices, across this device and others, since I did the hub update. I'm going to give up for a while and then try to isolate the cause later on today.

Ok.

What was the last FW/DH version that worked for you?

1.13.xxx FW and DTH 3.06 worked. 1.14.xxx and higher = broken

OK, I've restarted my hub a few times and restored normal functionality, then gone on and made a few changes. I've pushed them to this branch:

https://github.com/HubitatCommunity/hubitat-zwavemultichannel-pe653/tree/vsp-functionality

This'll be the 'VSP' branch until we get it worked out.

If you have time, @JDogg016, give that a swing and let me know how it works. If you get any errors, tell me what they are, and if you get children to show up once you set VSP mode (on following the steps above - and do be sure to upgrade your hub, and maybe restart again just for good measure), let me know which show up.

Installed your version and 'Recreated Child Devices' and I see the child devices. Selecting 'VSP3' does not turn on the pump.

Here are the logs:

dev:2572018-10-24 07:53:37.642: **debug** Commands:

0 [ [name:airTempFreeze, value:77, unit:F, displayed:true, isStateChange:true]] - String Command

1 [ [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]] - String Command

2 [ [name:clock, value:14:56, displayed:false, descriptionText:PE653 Clock: 14:56]] - String Command

dev:2572018-10-24 07:53:37.640: **debug** <<<<< rspFlg=true dly:1500/1500

<<<<< Event: [name:airTempFreeze, value:77, unit:F, displayed:true, isStateChange:true]

<<<<< Event: [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]

<<<<< Event: [name:clock, value:14:56, displayed:false, descriptionText:PE653 Clock: 14:56]

dev:2572018-10-24 07:53:37.634: **debug** Event necessary. name:clock evt: "14:56" ==> dev:(null)

dev:2572018-10-24 07:53:37.628: **trace** - 13: Map: [name:clock, value:14:56, displayed:false, descriptionText:PE653 Clock: 14:56]

dev:2572018-10-24 07:53:37.626: **trace** - l -> [name:clock, value:14:56, displayed:false, descriptionText:PE653 Clock: 14:56]

dev:2572018-10-24 07:53:37.624: **debug** Event necessary. name:airTempSolar evt: "0" ==> dev:(null)

dev:2572018-10-24 07:53:37.612: **trace** - 12: Map: [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.610: **trace** - l -> [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.609: **debug** Event necessary. name:airTempFreeze evt: "77" ==> dev:(null)

dev:2572018-10-24 07:53:37.607: **debug** Commands:

0 [ [name:airTempFreeze, value:77, unit:F, displayed:true, isStateChange:true]] - String Command

1 [ [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]] - String Command

2 [ [name:clock, value:14:56, displayed:false, descriptionText:PE653 Clock: 14:56]] - String Command

dev:2572018-10-24 07:53:37.601: **debug** <<<<< rspFlg=true dly:1500/1500

<<<<< Event: [name:airTempFreeze, value:77, unit:F, displayed:true, isStateChange:true]

<<<<< Event: [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]

<<<<< Event: [name:clock, value:14:56, displayed:false, descriptionText:PE653 Clock: 14:56]

dev:2572018-10-24 07:53:37.599: **debug** Event necessary. name:clock evt: "14:56" ==> dev:(null)

dev:2572018-10-24 07:53:37.598: **trace** - 11: Map: [name:airTempFreeze, value:77, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.596: **trace** - l -> [name:airTempFreeze, value:77, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.595: **debug** Event unnecessary. name:temperature evt: "71" ==> dev:(71)

dev:2572018-10-24 07:53:37.594: **trace** - 13: Map: [name:clock, value:14:56, displayed:false, descriptionText:PE653 Clock: 14:56]

dev:2572018-10-24 07:53:37.591: **trace** - l -> [name:clock, value:14:56, displayed:false, descriptionText:PE653 Clock: 14:56]

dev:2572018-10-24 07:53:37.589: **trace** - 10: Map: [name:temperature, value:71, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.588: **trace** - l -> [name:temperature, value:71, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.586: **debug** Event necessary. name:airTempSolar evt: "0" ==> dev:(null)

dev:2572018-10-24 07:53:37.585: **debug** Event unnecessary. name:poolSpaMode evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.583: **trace** - 12: Map: [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.582: **trace** - 9: Map: [name:poolSpaMode, value:off, isStateChange:true, displayed:true, descriptionText:(poolSpaMode set to off)]

dev:2572018-10-24 07:53:37.580: **trace** - l -> [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.579: **trace** - l -> [name:poolSpaMode, value:off, isStateChange:true, displayed:true, descriptionText:(poolSpaMode set to off)]

dev:2572018-10-24 07:53:37.577: **debug** Event necessary. name:airTempFreeze evt: "77" ==> dev:(null)

dev:2572018-10-24 07:53:37.576: **debug** Event unnecessary. name:swVSP4 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.574: **trace** - 8: Map: [name:swVSP4, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP4 set to off)]

dev:2572018-10-24 07:53:37.573: **trace** - l -> [name:swVSP4, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP4 set to off)]

dev:2572018-10-24 07:53:37.572: **debug** Event unnecessary. name:swVSP3 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.570: **trace** - 7: Map: [name:swVSP3, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP3 set to off)]

dev:2572018-10-24 07:53:37.569: **trace** - l -> [name:swVSP3, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP3 set to off)]

dev:2572018-10-24 07:53:37.568: **debug** Event unnecessary. name:swVSP2 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.566: **trace** - 6: Map: [name:swVSP2, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP2 set to off)]

dev:2572018-10-24 07:53:37.565: **trace** - l -> [name:swVSP2, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP2 set to off)]

dev:2572018-10-24 07:53:37.563: **trace** - 11: Map: [name:airTempFreeze, value:77, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.562: **debug** Event unnecessary. name:swVSP1 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.561: **trace** - l -> [name:airTempFreeze, value:77, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.559: **debug** Event unnecessary. name:temperature evt: "71" ==> dev:(71)

dev:2572018-10-24 07:53:37.558: **trace** - 5: Map: [name:swVSP1, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP1 set to off)]

dev:2572018-10-24 07:53:37.556: **trace** - l -> [name:swVSP1, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP1 set to off)]

dev:2572018-10-24 07:53:37.555: **debug** Event unnecessary. name:switch5 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.554: **trace** - 10: Map: [name:temperature, value:71, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.552: **trace** - 4: Map: [name:switch5, value:off, isStateChange:true, displayed:true, descriptionText:(switch5 set to off)]

dev:2572018-10-24 07:53:37.551: **trace** - l -> [name:temperature, value:71, unit:F, displayed:true, isStateChange:true]

dev:2572018-10-24 07:53:37.549: **trace** - l -> [name:switch5, value:off, isStateChange:true, displayed:true, descriptionText:(switch5 set to off)]

dev:2572018-10-24 07:53:37.529: **debug** Event unnecessary. name:poolSpaMode evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.528: **debug** Event unnecessary. name:switch4 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.527: **trace** - 3: Map: [name:switch4, value:off, isStateChange:true, displayed:true, descriptionText:(switch4 set to off)]

dev:2572018-10-24 07:53:37.525: **trace** - 9: Map: [name:poolSpaMode, value:off, isStateChange:true, displayed:true, descriptionText:(poolSpaMode set to off)]

dev:2572018-10-24 07:53:37.524: **trace** - l -> [name:switch4, value:off, isStateChange:true, displayed:true, descriptionText:(switch4 set to off)]

dev:2572018-10-24 07:53:37.522: **trace** - l -> [name:poolSpaMode, value:off, isStateChange:true, displayed:true, descriptionText:(poolSpaMode set to off)]

dev:2572018-10-24 07:53:37.521: **debug** Event unnecessary. name:switch3 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.519: **debug** Event unnecessary. name:swVSP4 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.514: **trace** - 8: Map: [name:swVSP4, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP4 set to off)]

dev:2572018-10-24 07:53:37.513: **trace** - l -> [name:swVSP4, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP4 set to off)]

dev:2572018-10-24 07:53:37.512: **trace** - 2: Map: [name:switch3, value:off, isStateChange:true, displayed:true, descriptionText:(switch3 set to off)]

dev:2572018-10-24 07:53:37.510: **debug** Event unnecessary. name:swVSP3 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.509: **trace** - l -> [name:switch3, value:off, isStateChange:true, displayed:true, descriptionText:(switch3 set to off)]

dev:2572018-10-24 07:53:37.507: **debug** Event unnecessary. name:switch2 evt: "on" ==> dev:(on)

dev:2572018-10-24 07:53:37.506: **trace** - 1: Map: [name:switch2, value:on, isStateChange:true, displayed:true, descriptionText:(switch2 set to on)]

dev:2572018-10-24 07:53:37.505: **trace** - 7: Map: [name:swVSP3, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP3 set to off)]

dev:2572018-10-24 07:53:37.503: **trace** - l -> [name:switch2, value:on, isStateChange:true, displayed:true, descriptionText:(switch2 set to on)]

dev:2572018-10-24 07:53:37.501: **trace** - l -> [name:swVSP3, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP3 set to off)]

dev:2572018-10-24 07:53:37.499: **debug** Event unnecessary. name:switch1 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.498: **debug** Event unnecessary. name:swVSP2 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.494: **trace** - 6: Map: [name:swVSP2, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP2 set to off)]

dev:2572018-10-24 07:53:37.493: **trace** - l -> [name:swVSP2, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP2 set to off)]

dev:2572018-10-24 07:53:37.492: **debug** Event unnecessary. name:swVSP1 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.491: **trace** - 0: Map: [name:switch1, value:off, isStateChange:true, displayed:true, descriptionText:(switch1 set to off)]

dev:2572018-10-24 07:53:37.489: **trace** - l -> [name:switch1, value:off, isStateChange:true, displayed:true, descriptionText:(switch1 set to off)]

dev:2572018-10-24 07:53:37.488: **debug** +++++ delayBetweenLog parm[14] dly=1500 responseFlg=true

dev:2572018-10-24 07:53:37.486: **trace** - 5: Map: [name:swVSP1, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP1 set to off)]

dev:2572018-10-24 07:53:37.485: **trace** - l -> [name:swVSP1, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP1 set to off)]

dev:2572018-10-24 07:53:37.484: **debug** Event unnecessary. name:switch5 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.476: **trace** - 4: Map: [name:switch5, value:off, isStateChange:true, displayed:true, descriptionText:(switch5 set to off)]

dev:2572018-10-24 07:53:37.475: **debug** ----- createMultipleEvents: devObj = Switch 6

dev:2572018-10-24 07:53:37.474: **trace** - l -> [name:switch5, value:off, isStateChange:true, displayed:true, descriptionText:(switch5 set to off)]

dev:2572018-10-24 07:53:37.472: **debug** Event unnecessary. name:switch4 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.469: **trace** - 3: Map: [name:switch4, value:off, isStateChange:true, displayed:true, descriptionText:(switch4 set to off)]

dev:2572018-10-24 07:53:37.467: **trace** - l -> [name:switch4, value:off, isStateChange:true, displayed:true, descriptionText:(switch4 set to off)]

dev:2572018-10-24 07:53:37.466: **debug** +++++ createMultipleEvents( endpoint:6, name:poolSpaMode, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.465: **debug** Event unnecessary. name:switch3 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.460: **trace** - 2: Map: [name:switch3, value:off, isStateChange:true, displayed:true, descriptionText:(switch3 set to off)]

dev:2572018-10-24 07:53:37.459: **trace** - l -> [name:switch3, value:off, isStateChange:true, displayed:true, descriptionText:(switch3 set to off)]

dev:2572018-10-24 07:53:37.458: **debug** Event unnecessary. name:switch2 evt: "on" ==> dev:(on)

dev:2572018-10-24 07:53:37.456: **debug** ----- createMultipleEvents: devObj = Switch 10

dev:2572018-10-24 07:53:37.452: **trace** - 1: Map: [name:switch2, value:on, isStateChange:true, displayed:true, descriptionText:(switch2 set to on)]

dev:2572018-10-24 07:53:37.451: **trace** - l -> [name:switch2, value:on, isStateChange:true, displayed:true, descriptionText:(switch2 set to on)]

dev:2572018-10-24 07:53:37.450: **debug** Event unnecessary. name:switch1 evt: "off" ==> dev:(off)

dev:2572018-10-24 07:53:37.444: **debug** +++++ createMultipleEvents( endpoint:10, name:swVSP4, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.441: **trace** - 0: Map: [name:switch1, value:off, isStateChange:true, displayed:true, descriptionText:(switch1 set to off)]

dev:2572018-10-24 07:53:37.440: **trace** - l -> [name:switch1, value:off, isStateChange:true, displayed:true, descriptionText:(switch1 set to off)]

dev:2572018-10-24 07:53:37.438: **debug** +++++ delayBetweenLog parm[14] dly=1500 responseFlg=true

dev:2572018-10-24 07:53:37.435: **debug** ----- createMultipleEvents: devObj = Switch 9

dev:2572018-10-24 07:53:37.430: **debug** ----- createMultipleEvents: devObj = Switch 6

dev:2572018-10-24 07:53:37.427: **debug** +++++ createMultipleEvents( endpoint:9, name:swVSP3, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.425: **debug** +++++ createMultipleEvents( endpoint:6, name:poolSpaMode, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.419: **debug** ----- createMultipleEvents: devObj = Switch 10

dev:2572018-10-24 07:53:37.418: **debug** ----- createMultipleEvents: devObj = Switch 8

dev:2572018-10-24 07:53:37.410: **debug** +++++ createMultipleEvents( endpoint:10, name:swVSP4, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.409: **debug** +++++ createMultipleEvents( endpoint:8, name:swVSP2, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.406: **debug** ----- createMultipleEvents: devObj = Switch 9

dev:2572018-10-24 07:53:37.405: **debug** ----- createMultipleEvents: devObj = Switch 7

dev:2572018-10-24 07:53:37.399: **debug** +++++ createMultipleEvents( endpoint:7, name:swVSP1, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.397: **debug** +++++ createMultipleEvents( endpoint:9, name:swVSP3, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.394: **debug** ----- createMultipleEvents: devObj = Switch 5

dev:2572018-10-24 07:53:37.393: **debug** ----- createMultipleEvents: devObj = Switch 8

dev:2572018-10-24 07:53:37.390: **debug** +++++ createMultipleEvents( endpoint:5, name:switch5, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.389: **debug** +++++ createMultipleEvents( endpoint:8, name:swVSP2, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.386: **debug** ----- createMultipleEvents: devObj = Switch 4

dev:2572018-10-24 07:53:37.384: **debug** ----- createMultipleEvents: devObj = Switch 7

dev:2572018-10-24 07:53:37.380: **debug** +++++ createMultipleEvents( endpoint:7, name:swVSP1, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.379: **debug** +++++ createMultipleEvents( endpoint:4, name:switch4, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.375: **debug** ----- createMultipleEvents: devObj = Switch 3

dev:2572018-10-24 07:53:37.374: **debug** ----- createMultipleEvents: devObj = Switch 5

dev:2572018-10-24 07:53:37.368: **debug** +++++ createMultipleEvents( endpoint:5, name:switch5, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.367: **debug** +++++ createMultipleEvents( endpoint:3, name:switch3, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.363: **debug** ----- createMultipleEvents: devObj = Switch 4

dev:2572018-10-24 07:53:37.358: **debug** ----- createMultipleEvents: devObj = Switch 2

dev:2572018-10-24 07:53:37.353: **debug** +++++ createMultipleEvents( endpoint:2, name:switch2, externalParm:255, myParm:on)

dev:2572018-10-24 07:53:37.351: **debug** +++++ createMultipleEvents( endpoint:4, name:switch4, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.347: **debug** ----- createMultipleEvents: devObj = Switch 1

dev:2572018-10-24 07:53:37.343: **debug** ----- createMultipleEvents: devObj = Switch 3

dev:2572018-10-24 07:53:37.339: **debug** +++++ createMultipleEvents( endpoint:1, name:switch1, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.257: **debug** payload for switches is 2

dev:2572018-10-24 07:53:37.255: **debug** +++++ process84Event payload: [5, 64, 2, 2, -124, 0, 0, 0, 2, 0, 0, 1, 71, 77, 0, 14, 56, 1, 0, 0, 0, 3, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

dev:2572018-10-24 07:53:37.253: **debug** ManufacturerProprietary event, [1]:40 [4]:84 payload: 05 40 02 02 84 00 00 00 02 00 00 01 47 4D 00 0E 38 01 00 00 00 03 04 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

dev:2572018-10-24 07:53:37.251: **trace** <<< Incoming: [zw device: 38, command: 9100, payload: 05 40 02 02 84 00 00 00 02 00 00 01 47 4D 00 0E 38 01 00 00 00 03 04 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]

dev:2572018-10-24 07:53:37.246: **debug** +++++ createMultipleEvents( endpoint:3, name:switch3, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.237: **debug** ----- createMultipleEvents: devObj = Switch 2

dev:2572018-10-24 07:53:37.225: **debug** +++++ createMultipleEvents( endpoint:2, name:switch2, externalParm:255, myParm:on)

dev:2572018-10-24 07:53:37.218: **debug** ----- createMultipleEvents: devObj = Switch 1

dev:2572018-10-24 07:53:37.211: **debug** +++++ createMultipleEvents( endpoint:1, name:switch1, externalParm:0, myParm:off)

dev:2572018-10-24 07:53:37.210: **debug** payload for switches is 2

dev:2572018-10-24 07:53:37.208: **debug** +++++ process84Event payload: [5, 64, 2, 2, -124, 0, 0, 0, 2, 0, 0, 1, 71, 77, 0, 14, 56, 1, 0, 0, 0, 3, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

dev:2572018-10-24 07:53:37.204: **debug** ManufacturerProprietary event, [1]:40 [4]:84 payload: 05 40 02 02 84 00 00 00 02 00 00 01 47 4D 00 0E 38 01 00 00 00 03 04 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

dev:2572018-10-24 07:53:37.202: **trace** <<< Incoming: [zw device: 38, command: 9100, payload: 05 40 02 02 84 00 00 00 02 00 00 01 47 4D 00 0E 38 01 00 00 00 03 04 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]

dev:2572018-10-24 07:53:36.242: **debug** Commands:

0 [ [name:heater, value:off, isStateChange:true, displayed:true, descriptionText:Heater is off]] - String Command

dev:2572018-10-24 07:53:36.241: **debug** <<<<< rspFlg=true dly:1500/1500

<<<<< Event: [name:heater, value:off, isStateChange:true, displayed:true, descriptionText:Heater is off]

dev:2572018-10-24 07:53:36.239: **debug** Event necessary. name:heater evt: "off" ==> dev:(null)

dev:2572018-10-24 07:53:36.235: **trace** - 0: Map: [name:heater, value:off, isStateChange:true, displayed:true, descriptionText:Heater is off]

dev:2572018-10-24 07:53:36.234: **trace** - l -> [name:heater, value:off, isStateChange:true, displayed:true, descriptionText:Heater is off]

dev:2572018-10-24 07:53:36.233: **debug** +++++ delayBetweenLog parm[1] dly=1500 responseFlg=true

dev:2572018-10-24 07:53:36.231: **debug** +++++ process87Event payload: [5, 64, 2, 2, -121, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 14, 56, 1, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0]

dev:2572018-10-24 07:53:36.226: **debug** ManufacturerProprietary event, [1]:40 [4]:87 payload: 05 40 02 02 87 00 00 00 00 00 00 07 00 00 00 00 00 00 04 00 00 00 00 00 0E 38 01 01 00 00 20 00 00 00 00 00 00 00 00 00

dev:2572018-10-24 07:53:36.224: **trace** <<< Incoming: [zw device: 38, command: 9100, payload: 05 40 02 02 87 00 00 00 00 00 00 07 00 00 00 00 00 00 04 00 00 00 00 00 0E 38 01 01 00 00 20 00 00 00 00 00 00 00 00 00 ]

dev:2572018-10-24 07:53:35.080: **debug** Commands:

0 [ 6006182501FF ] - String Command

1 [ delay 1000 ] - String Command

2 [ 910005400102870301 ] - String Command

3 [ delay 1000 ] - String Command

4 [ 910005400101830101 ] - String Command

dev:2572018-10-24 07:53:35.077: **debug** ----- executeCommands final set:

dev:2572018-10-24 07:53:35.075: **debug** Commands:

0 [ 6006182501FF ] - String Command

dev:2572018-10-24 07:53:35.073: **debug** +++++ executeCommands

dev:2572018-10-24 07:53:35.071: **debug** +++++ setChanState(18, 255)

dev:2572018-10-24 07:53:35.068: **debug** +++++ setVSPSpeedInternal() speed=3

I also meant to tell you this. I had some more time to test everything and I can tell you the version I just installed allows me to view/update temperature and control switches 1-5.

The only thing missing is VSP1 - VSP4.

Thanks @JDogg016 for your patience and the logs.

@joshua, I see the issue in the log. The “channel” being passed to setChanState (18) is correct for VSP speed 3, but the generated command (still your hacked version? Or removed in favor of HE fix?) is wrong. The third byte is now correctly showing the channel but this must be a Hex byte, therefore should show as “12” (hex for 18). If this is the hack code then it should be easy to fix. If not, then there is a new defect in HE. Since @JDogg016 said 3.0.6 is not working then I suspect the latter.

One note, all the event logging is creating a lot of noise in the log and events are not relevant to this issue. The only important items are way down at the very bottom. I would turn this down a bit.

@JDogg016, that was a great detail to include - as Keith pointed out, my hacked version was a quick fix for the 1-5 switches, and didn't even try for others. I just posted (same branch) a version that goes back to the stock one. It works on switches 1-5, so grab it and give it a try!

As for the logs @keithriley they are verbose! I've found that sometimes the configuration allows checking multiple levels, sometimes only one. If it stabilized, I'd use it to enable logging of specific categories of commands. Until then, I'm leaving it verbose. It's easier to delete things than to get people to do things over, and the amount of logging is going down now.

I've got a list of the things I've been doing, I'll send it by for your review! The biggest focus has been to try to end up pointing to the delayBetween method shared by both platforms. I created various other methods for the responsibilities in the delayBetweenLog method to separate those out and hook into that. Love to hear what you thought, so I'll send that along - there's also a PR up at the repo above.

.... AND WE'RE IN BUSINESS!! I can turn on the VSP pump. I am away from the house but I can see the water moving in the pool (after 3 weeks)!!!

I will confirm other functions today.

Hot diggity!

"Reply" to make sure I hear about it, and I'll merge this officially.

My next project will be to target pool/spa 'mode', potentially making two virtual thermostats to control the two individually in a standardized way.

I'm also graphing temperature/etc data in a Grafana/Influx setup - it's a great way to get a dashboard of what's going on. I am always a bit leery of automating natural-gas-powered devices. . . .