Z-Wave Multi Channel (PE653)

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. . . .

Ok.

@joshua, could you say a bit more about your Pool/spa idea? Just want to make sure you realize this “mode” exists in the PE653 itself. It is not just a DTH artifact. Changing modes not only switches which “Setpoint” is updated, but also controls the valve acuators to alter the water flow from pool to spa.

Hope to hear more.

Currently, there are custom commands to configure these two setpoints. The device advertises a thermostat capability, but it really has two thermostat capabilities. Calling setHeatingSetpoint can, at best, set one of them based on the mode. This means that other applications that might want to interact with it as a thermostat have to know about how the PE653 has 'modes'.

I intend to create two virtual thermostats as child devices - one pool, one spa. Setting on each will set the appropriate xxxSetpoint value on the device.

This will expose all standard thermostat behavior so tools made to work with thermostats get to stick to the standard interface without having to know about the modal switch to get it right.

Eventually I'd also like to expose an option to configure external thermometers that would override the internal one. Mine is made to be mounted in a PVC tube, so it's only accurate when the pump is running. There are wireless, etc etc ones that are more accurate.

Love to hear any thoughts you have!

This is a big deal for me as well. The on-board temperature on mine is pretty inaccurate unless the pump is on.

1 Like

I'm curious about "pump is running" scenario.

I can understand that without automation, the temp can only be what is being read and that with the pump off, the pipes drain and you're getting air temp, not water temp.

But with automation, can't you "plot" the temp? Take readings during pump on times, average and then use OAT to "calculate" the likely temp for display?

I like accuracy too but is the "juice worth the squeeze" ? (Around here, the Finance Officer wouldn't release funds for floating wireless thermometers.)

I haven't gotten to writing SetPoint code for my custom, self created Pool controller but I was thinking that I only really care if the water is swim-able or too cold.

scap

My pump is on, and therefore I'm ready to believe the values. I already know it's too cold :slight_smile:

Basically that.

Then when the pumps start, the thermostat says "oh hey your temperature is 60º, which is definitely below the setpoint, so turn on the heater!". Then, three minutes later, it's back over the setpoint because the water has cycled, and the heater turns off. It offends my aesthetic sensibilities.

As for calculating. . . . I'm in the business. I never trust a calculation. Especially not when I'm activating a gas-powered device. . . . also, in a hot tub, the difference between 100º and 102º is pretty significant if I'm putting a kid in, etc.

As for the expense, my wife would far rather I spent $25-40 than a single minute further on this project. :slight_smile:

I plan on using the Fibaro wireless and tossing it under a bench in the tub. With naive polling, the battery should get six months; with intelligent polling (eg, less often at night, ramped up if pumps are running indicating imminent usage, etc etc) I should get a year.

Mine too... because that's obviously an automation error.. :smiley:
Why make a call for heat decision in the first 5 mins of the pump start? I planned on NOT doing that. Which is probably why I haven't gotten 'round to writing that code yet. :slight_smile:

How's things @JDogg016?

It looks as if all is working well. My schedule pump runs, heater and hot tub all work.

Question: What fibaro temperature sensor are you referring to?

Basically, use a door contact sensor with a temperature probe attached.

I'm glad this works! I'll merge in the changes, once I put the 'modes' back in. I do think it's probably more efficient in the long run to use the more fully-featured (and, better yet, 'maintained by someone else'! modes app) to keep this focused on Intermatic-specific stuff, though.

Here's this version, plus modes put back in:

I called it 3.1.0 so I could begin using semantic versioning to keep track of release compatibility, and namespace it so I didn't damage Keith's good name with my scribblings.

  • Switches versioning to semantic versioning
  • Switches namespace to tooluser/nowhereville to avoid intruding on KeithR's good name!
  • Introduce executeCommands , which:
    • encapsulates optionally inserts platform-specific refresh commands
    • encapsulates logging
    • Separates parsing of responses from command execution
    • Works with HE/ST-shared platform standard delayBetween
  • Move command logging into separate command for standardized command execution display
  • Standardizes tabs/spaces
  • Makes explicit and organizes private method declarations

These last two make the diff big, but help make future diffs smaller.

My next projects will probably be:

  • Get firemanDelay working
  • Introduce two virtual thermostats for managing pool/spa temperatures with standardized external interface for working with other tools
  • Adding ability to have external thermometer(s) rather than trusting internal
  • Perhaps, a generic hot-tub/pool control application that can:
    • "Run high jets for one hour" (for mixing chemicals)
    • "Disable/Enable all jets" (for changing filters, etc)

I consider the first two table stakes - I'll keep going on this until I've got those done. At that point, I'll be able to do everything I really need with off-the-shelf/third party apps to knit it together, with relative confidence of safety.

I'm also logging this info to InfluxDB/Grafana if that's of interest to anyone.

Keith (and @csteele, @JDogg016) I'd love to hear your thoughts about the thermometer thing and pool/spa mode. My understanding is that anyone using both modes sets thermostats for each, and that switching between modes on the controller takes some ancillary action - flipping valves, or something - so that water begins flowing through the heater from the indicated source. Does that sound right?