Z-Wave Multi Channel (PE653)

TDD is a great way to develop, we use it as well, the problem in this instance is that the zwave documentation was misinterpreted, the Multi Instance class was changed and the test was also changed to match.

Ha! Yeah, it happens. At a certain point, it just happens!

A friend of mine worked on a process for automating documentation being linked to specs to prevent this kind of thing. Her dissertation. . . . it's pretty hard to prevent completely!

Do y'all use Spock? Do you have another suggestion?

@JDogg016 in case you are interested, I have this WORKING - thank you @keithriley for the decomposition of the Z-Wave commands!

private List setChanState(ch, on) {
	log("DEBUG", 2, "+++++ setChanState($ch, $on)")
	def cmds =[
		//zwave.multiInstanceV1.multiInstanceCmdEncap(instance: ch).encapsulate(zwave.switchBinaryV1.switchBinarySet(switchValue: (on ? 0xFF : 0))).format() ,
		multichannelSwitchEvent(ch, on) // Temporarily provide encoded MultiInstanceCommandEncapsulation manually while v1.1.5 of HE firmware has it broken.
	]
}

// Temporarily provide encoded MultiInstanceCommandEncapsulation manually while v1.1.5 of HE firmware has it broken.
// MultiInstanceCmdEncap command class is 6006
// switchBinarySet command is 2501
private String multichannelSwitchEvent(ch, on) {
	def onOff = (on ? "FF" : "00")
	def channelString = ch.toString().padLeft(2, "0")
	"6006" + channelString + "2501" + onOff
}

I'm working up changes based on all you two have said that I think can encapsulate the third-party proprietary stuff, provide good logging, but still interface well with the API shared by ST/HE (namely delayBetween - I'll put up a PR at my repo once I am sure.

This is good, because I was legit close to buying a bunch of 240v relays and building my own controller from scratch.

Just noticed this - thank you, @mike.maxwell! I wouldn't ask usually, because I hate being asked that myself, but here I want to decide how to work around it. Thanks again.

I've made some progress on this. I introduced the executeCommands method I mentioned, which allows a 'single point' to hook into the existing delayBetween as @chuck.schwer suggested and which should be compatible with both - any ST/HE specific code could go in there. It's also a place to control logging.

I'm converting methods to use this rather than the delayBetweenLog; executeCommands does its own logging, and this separates those concerns.

I've also (forgive me!) standardized the tabs/indents - my editor kept shouting at me!

At this point I'm working through the methods I can personally test, switching them over. Everything should keep working in both places but I don't have an ST hub to see. I standardized the logging; it's a bit verbose, and I may add another log level shortly to keep it under control!

I've gone pretty far out ahead, pushing through to get my main goal - which is being able to say, "Siri, how hot is the hot tub?". Siri answered just now, so I'm officially victorious!

So now I've got Siri control working, and I'll probably start a custom application to do polling/refreshing of temperature. I may just do this in a custom app rather than in the Intermatic. Then the thermostat device would be configurable - the thermostat on the Intermatic is of dubious value, because it's not in the tub itself, so I plan on adding one.

In particular I haven't done anything with the VSP, and while I'd like to do scheduling, I haven't, because I don't know the format. I'm not sure how set points are intended to work, let alone whether they do! I'd really like to get the fireman's switch set up.

This is the cardinal sin of open source code - I've almost created a fork! I don't want to cause heartache, so hopefully @keithriley and I can talk soon about how to integrate these changes. If you want to take a look stepping through commit-by-commit at the repo above, I'd love any feedback.

If anyone else (@CAL.hub , @JDogg016, anyone?) wants to try this out, I'd love feedback.

Next up is planned:

  • Fireman's timer
  • Updating readme with details about status
  • Logging of temperature to display on a dashboard
  • Custom app? For scheduling/temperature
  • Converting remaining commands to agnostic executeCommands .
  • "Siri, please get the hot tub hot"

Yours in hot water;

tooluser

Do you have a link to your repository?

@JDogg016 yup!

So I installed your version and the logs are really long. However when I press VSP 4 (for example). Nothing happens.

2 572018-10-20 10:15:49.630:debug - Events as sent:
0: [name:airTempFreeze, value:118, unit:F, displayed:true, isStateChange:true]
1: [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]
2: [name:clock, value:17:18, displayed:false, descriptionText:PE653 Clock: 17:18]
dev:2572018-10-20 10:15:49.625:debug<<<<< rspFlg=true dly:1500/1500
<<<<< Event: [name:airTempFreeze, value:118, unit:F, displayed:true, isStateChange:true]
<<<<< Event: [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]
<<<<< Event: [name:clock, value:17:18, displayed:false, descriptionText:PE653 Clock: 17:18]
dev:2572018-10-20 10:15:49.619:debug<<<<< Event NECESSARY. name:clock evt: "17:18" ==> dev:(null)
dev:2572018-10-20 10:15:49.613:trace - 13: Map: [name:clock, value:17:18, displayed:false, descriptionText:PE653 Clock: 17:18]
dev:2572018-10-20 10:15:49.611:trace - l -> [name:clock, value:17:18, displayed:false, descriptionText:PE653 Clock: 17:18]
dev:2572018-10-20 10:15:49.604:debug<<<<< Event NECESSARY. name:airTempSolar evt: "0" ==> dev:(null)
dev:2572018-10-20 10:15:49.601:trace - 12: Map: [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.598:trace - l -> [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.595:debug<<<<< Event NECESSARY. name:airTempFreeze evt: "118" ==> dev:(null)
dev:2572018-10-20 10:15:49.593:trace - 11: Map: [name:airTempFreeze, value:118, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.590:trace - l -> [name:airTempFreeze, value:118, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.588:debug<<<<< Event unnecessary. name:temperature evt: "108" ==> dev:(108)
dev:2572018-10-20 10:15:49.585:trace - 10: Map: [name:temperature, value:108, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.583:trace - l -> [name:temperature, value:108, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.580:debug<<<<< Event unnecessary. name:poolSpaMode evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:49.578:trace - 9: Map: [name:poolSpaMode, value:off, isStateChange:true, displayed:true, descriptionText:(poolSpaMode set to off)]
dev:2572018-10-20 10:15:49.575:trace - l -> [name:poolSpaMode, value:off, isStateChange:true, displayed:true, descriptionText:(poolSpaMode set to off)]
dev:2572018-10-20 10:15:49.573:debug<<<<< Event unnecessary. name:swVSP4 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:49.570:trace - 8: Map: [name:swVSP4, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP4 set to off)]
dev:2572018-10-20 10:15:49.567:trace - l -> [name:swVSP4, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP4 set to off)]
dev:2572018-10-20 10:15:49.565:debug<<<<< Event unnecessary. name:swVSP3 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:49.562:trace - 7: Map: [name:swVSP3, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP3 set to off)]
dev:2572018-10-20 10:15:49.559:trace - l -> [name:swVSP3, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP3 set to off)]
dev:2572018-10-20 10:15:49.557:debug<<<<< Event unnecessary. name:swVSP2 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:49.555:trace - 6: Map: [name:swVSP2, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP2 set to off)]
dev:2572018-10-20 10:15:49.552:trace - l -> [name:swVSP2, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP2 set to off)]
dev:2572018-10-20 10:15:49.550:debug<<<<< Event unnecessary. name:swVSP1 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:49.547:trace - 5: Map: [name:swVSP1, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP1 set to off)]
dev:2572018-10-20 10:15:49.543:trace - l -> [name:swVSP1, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP1 set to off)]
dev:2572018-10-20 10:15:49.541:debug<<<<< Event unnecessary. name:switch5 evt: "on" ==> dev:(on)
dev:2572018-10-20 10:15:49.538:trace - 4: Map: [name:switch5, value:on, isStateChange:true, displayed:true, descriptionText:(switch5 set to on)]
dev:2572018-10-20 10:15:49.536:trace - l -> [name:switch5, value:on, isStateChange:true, displayed:true, descriptionText:(switch5 set to on)]
dev:2572018-10-20 10:15:49.533:debug<<<<< Event unnecessary. name:switch4 evt: "on" ==> dev:(on)
dev:2572018-10-20 10:15:49.531:trace - 3: Map: [name:switch4, value:on, isStateChange:true, displayed:true, descriptionText:(switch4 set to on)]
dev:2572018-10-20 10:15:49.528:trace - l -> [name:switch4, value:on, isStateChange:true, displayed:true, descriptionText:(switch4 set to on)]
dev:2572018-10-20 10:15:49.525:debug<<<<< Event unnecessary. name:switch3 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:49.521:trace - 2: Map: [name:switch3, value:off, isStateChange:true, displayed:true, descriptionText:(switch3 set to off)]
dev:2572018-10-20 10:15:49.518:trace - l -> [name:switch3, value:off, isStateChange:true, displayed:true, descriptionText:(switch3 set to off)]
dev:2572018-10-20 10:15:49.516:debug<<<<< Event unnecessary. name:switch2 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:49.513:trace - 1: Map: [name:switch2, value:off, isStateChange:true, displayed:true, descriptionText:(switch2 set to off)]
dev:2572018-10-20 10:15:49.490:trace - l -> [name:switch2, value:off, isStateChange:true, displayed:true, descriptionText:(switch2 set to off)]
dev:2572018-10-20 10:15:49.487:debug<<<<< Event unnecessary. name:switch1 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:49.484:trace - 0: Map: [name:switch1, value:off, isStateChange:true, displayed:true, descriptionText:(switch1 set to off)]
dev:2572018-10-20 10:15:49.482:trace - l -> [name:switch1, value:off, isStateChange:true, displayed:true, descriptionText:(switch1 set to off)]
dev:2572018-10-20 10:15:49.479:debug+++++ delayBetweenLog parm[14] dly=1500 responseFlg=true
dev:2572018-10-20 10:15:49.477:debugrespType:84 differences:2
__ __ --- --- --- --- --- --- --- --- --- --- --- --- 12 13 --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
new-: 05 40 02 02 84 00 00 00 18 00 00 01 6C 76 00 11 12 01 00 00 00 03 04 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
old-- : 05 40 02 02 84 00 00 00 18 00 00 01 5B 63 00 10 15 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-20 10:15:49.466:warnCME: CAN'T FIND CHILD DEVICE: 38-ep6:poolSpaMode
dev:2572018-10-20 10:15:49.463:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:49.449:debug..... createMultipleEvents( endpoint:6, name:poolSpaMode, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:49.446:warnCME: CAN'T FIND CHILD DEVICE: 38-ep10:swVSP4
dev:2572018-10-20 10:15:49.443:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:49.440:debug..... createMultipleEvents( endpoint:10, name:swVSP4, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:49.437:warnCME: CAN'T FIND CHILD DEVICE: 38-ep9:swVSP3
dev:2572018-10-20 10:15:49.435:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:49.432:debug..... createMultipleEvents( endpoint:9, name:swVSP3, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:49.430:warnCME: CAN'T FIND CHILD DEVICE: 38-ep8:swVSP2
dev:2572018-10-20 10:15:49.427:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:49.425:debug - Events as sent:
0: [name:temperature, value:108, unit:F, displayed:true, isStateChange:true]
1: [name:airTempFreeze, value:118, unit:F, displayed:true, isStateChange:true]
2: [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]
3: [name:clock, value:17:18, displayed:false, descriptionText:PE653 Clock: 17:18]
dev:2572018-10-20 10:15:49.422:debug<<<<< rspFlg=true dly:1500/1500
<<<<< Event: [name:temperature, value:108, unit:F, displayed:true, isStateChange:true]
<<<<< Event: [name:airTempFreeze, value:118, unit:F, displayed:true, isStateChange:true]
<<<<< Event: [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]
<<<<< Event: [name:clock, value:17:18, displayed:false, descriptionText:PE653 Clock: 17:18]
dev:2572018-10-20 10:15:49.419:debug<<<<< Event NECESSARY. name:clock evt: "17:18" ==> dev:(null)
dev:2572018-10-20 10:15:49.416:debug..... createMultipleEvents( endpoint:8, name:swVSP2, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:49.413:trace - 13: Map: [name:clock, value:17:18, displayed:false, descriptionText:PE653 Clock: 17:18]
dev:2572018-10-20 10:15:49.410:warnCME: CAN'T FIND CHILD DEVICE: 38-ep7:swVSP1
dev:2572018-10-20 10:15:49.407:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:49.404:debug..... createMultipleEvents( endpoint:7, name:swVSP1, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:49.401:trace - l -> [name:clock, value:17:18, displayed:false, descriptionText:PE653 Clock: 17:18]
dev:2572018-10-20 10:15:49.259:debug<<<<< Event NECESSARY. name:airTempSolar evt: "0" ==> dev:(null)
dev:2572018-10-20 10:15:49.256:warnCME: CAN'T FIND CHILD DEVICE: 38-ep5:switch5
dev:2572018-10-20 10:15:49.254:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:49.251:debug..... createMultipleEvents( endpoint:5, name:switch5, externalParm:255, myParm:on)
dev:2572018-10-20 10:15:49.249:trace - 12: Map: [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.246:trace - l -> [name:airTempSolar, value:0, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.199:debug<<<<< Event NECESSARY. name:airTempFreeze evt: "118" ==> dev:(null)
dev:2572018-10-20 10:15:49.197:warnCME: CAN'T FIND CHILD DEVICE: 38-ep4:switch4
dev:2572018-10-20 10:15:49.194:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:49.191:debug..... createMultipleEvents( endpoint:4, name:switch4, externalParm:255, myParm:on)
dev:2572018-10-20 10:15:49.168:trace - 11: Map: [name:airTempFreeze, value:118, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.165:warnCME: CAN'T FIND CHILD DEVICE: 38-ep3:switch3
dev:2572018-10-20 10:15:49.162:trace - l -> [name:airTempFreeze, value:118, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.160:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:49.157:debug..... createMultipleEvents( endpoint:3, name:switch3, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:49.138:warnCME: CAN'T FIND CHILD DEVICE: 38-ep2:switch2
dev:2572018-10-20 10:15:49.132:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:49.096:debug..... createMultipleEvents( endpoint:2, name:switch2, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:49.087:debug<<<<< Event NECESSARY. name:temperature evt: "108" ==> dev:(91)
dev:2572018-10-20 10:15:49.085:warnCME: CAN'T FIND CHILD DEVICE: 38-ep1:switch1
dev:2572018-10-20 10:15:49.082:trace - 10: Map: [name:temperature, value:108, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.080:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:49.068:trace - l -> [name:temperature, value:108, unit:F, displayed:true, isStateChange:true]
dev:2572018-10-20 10:15:49.065:debug<<<<< Event unnecessary. name:poolSpaMode evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:49.063:debug..... createMultipleEvents( endpoint:1, name:switch1, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:49.060:trace - 9: Map: [name:poolSpaMode, value:off, isStateChange:true, displayed:true, descriptionText:(poolSpaMode set to off)]
dev:2572018-10-20 10:15:49.047:trace - l -> [name:poolSpaMode, value:off, isStateChange:true, displayed:true, descriptionText:(poolSpaMode set to off)]
dev:2572018-10-20 10:15:49.044:debug<<<<< Event unnecessary. name:swVSP4 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:49.042:debugpayload for switches is 24
dev:2572018-10-20 10:15:49.029:debug+++++ process84Event payload: [5, 64, 2, 2, -124, 0, 0, 0, 24, 0, 0, 1, 108, 118, 0, 17, 18, 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-20 10:15:49.026:debugManufacturerProprietary event, [1]:40 [4]:84 payload: 05 40 02 02 84 00 00 00 18 00 00 01 6C 76 00 11 12 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-20 10:15:49.024:trace<<< Incoming: [zw device: 38, command: 9100, payload: 05 40 02 02 84 00 00 00 18 00 00 01 6C 76 00 11 12 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-20 10:15:49.021:trace - 8: Map: [name:swVSP4, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP4 set to off)]
dev:2572018-10-20 10:15:49.018:trace - l -> [name:swVSP4, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP4 set to off)]
dev:2572018-10-20 10:15:49.003:debug<<<<< Event unnecessary. name:swVSP3 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:49.000:trace - 7: Map: [name:swVSP3, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP3 set to off)]
dev:2572018-10-20 10:15:48.977:trace - l -> [name:swVSP3, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP3 set to off)]
dev:2572018-10-20 10:15:48.974:debug<<<<< Event unnecessary. name:swVSP2 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:48.972:trace - 6: Map: [name:swVSP2, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP2 set to off)]
dev:2572018-10-20 10:15:48.949:trace - l -> [name:swVSP2, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP2 set to off)]
dev:2572018-10-20 10:15:48.947:debug<<<<< Event unnecessary. name:swVSP1 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:48.944:trace - 5: Map: [name:swVSP1, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP1 set to off)]
dev:2572018-10-20 10:15:48.928:trace - l -> [name:swVSP1, value:off, isStateChange:true, displayed:true, descriptionText:(swVSP1 set to off)]
dev:2572018-10-20 10:15:48.925:debug<<<<< Event unnecessary. name:switch5 evt: "on" ==> dev:(on)
dev:2572018-10-20 10:15:48.922:trace - 4: Map: [name:switch5, value:on, isStateChange:true, displayed:true, descriptionText:(switch5 set to on)]
dev:2572018-10-20 10:15:48.889:trace - l -> [name:switch5, value:on, isStateChange:true, displayed:true, descriptionText:(switch5 set to on)]
dev:2572018-10-20 10:15:48.886:debug<<<<< Event unnecessary. name:switch4 evt: "on" ==> dev:(on)
dev:2572018-10-20 10:15:48.883:trace - 3: Map: [name:switch4, value:on, isStateChange:true, displayed:true, descriptionText:(switch4 set to on)]
dev:2572018-10-20 10:15:48.880:trace - l -> [name:switch4, value:on, isStateChange:true, displayed:true, descriptionText:(switch4 set to on)]
dev:2572018-10-20 10:15:48.875:debug<<<<< Event unnecessary. name:switch3 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:48.873:trace - 2: Map: [name:switch3, value:off, isStateChange:true, displayed:true, descriptionText:(switch3 set to off)]
dev:2572018-10-20 10:15:48.870:trace - l -> [name:switch3, value:off, isStateChange:true, displayed:true, descriptionText:(switch3 set to off)]
dev:2572018-10-20 10:15:48.850:debug<<<<< Event unnecessary. name:switch2 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:48.838:trace - 1: Map: [name:switch2, value:off, isStateChange:true, displayed:true, descriptionText:(switch2 set to off)]
dev:2572018-10-20 10:15:48.835:trace - l -> [name:switch2, value:off, isStateChange:true, displayed:true, descriptionText:(switch2 set to off)]
dev:2572018-10-20 10:15:48.833:debug<<<<< Event unnecessary. name:switch1 evt: "off" ==> dev:(off)
dev:2572018-10-20 10:15:48.811:trace - 0: Map: [name:switch1, value:off, isStateChange:true, displayed:true, descriptionText:(switch1 set to off)]
dev:2572018-10-20 10:15:48.808:trace - l -> [name:switch1, value:off, isStateChange:true, displayed:true, descriptionText:(switch1 set to off)]
dev:2572018-10-20 10:15:48.805:debug+++++ delayBetweenLog parm[14] dly=1500 responseFlg=true
dev:2572018-10-20 10:15:48.803:debugrespType:84 differences:2
__ __ --- --- --- --- --- --- --- --- --- --- --- --- 12 13 --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
new-: 05 40 02 02 84 00 00 00 18 00 00 01 6C 76 00 11 12 01 00 00 00 03 04 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
old-- : 05 40 02 02 84 00 00 00 18 00 00 01 5B 63 00 10 15 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-20 10:15:48.782:warnCME: CAN'T FIND CHILD DEVICE: 38-ep6:poolSpaMode
dev:2572018-10-20 10:15:48.780:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:48.763:debug..... createMultipleEvents( endpoint:6, name:poolSpaMode, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:48.761:warnCME: CAN'T FIND CHILD DEVICE: 38-ep10:swVSP4
dev:2572018-10-20 10:15:48.758:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:48.755:debug..... createMultipleEvents( endpoint:10, name:swVSP4, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:48.753:warnCME: CAN'T FIND CHILD DEVICE: 38-ep9:swVSP3
dev:2572018-10-20 10:15:48.750:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:48.735:debug..... createMultipleEvents( endpoint:9, name:swVSP3, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:48.732:warnCME: CAN'T FIND CHILD DEVICE: 38-ep8:swVSP2
dev:2572018-10-20 10:15:48.719:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:48.717:debug..... createMultipleEvents( endpoint:8, name:swVSP2, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:48.714:warnCME: CAN'T FIND CHILD DEVICE: 38-ep7:swVSP1
dev:2572018-10-20 10:15:48.711:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:48.699:debug..... createMultipleEvents( endpoint:7, name:swVSP1, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:48.696:warnCME: CAN'T FIND CHILD DEVICE: 38-ep5:switch5
dev:2572018-10-20 10:15:48.694:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:48.691:debug..... createMultipleEvents( endpoint:5, name:switch5, externalParm:255, myParm:on)
dev:2572018-10-20 10:15:48.679:warnCME: CAN'T FIND CHILD DEVICE: 38-ep4:switch4
dev:2572018-10-20 10:15:48.669:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:48.658:debug..... createMultipleEvents( endpoint:4, name:switch4, externalParm:255, myParm:on)
dev:2572018-10-20 10:15:48.647:warnCME: CAN'T FIND CHILD DEVICE: 38-ep3:switch3
dev:2572018-10-20 10:15:48.644:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:48.640:debug..... createMultipleEvents( endpoint:3, name:switch3, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:48.631:warnCME: CAN'T FIND CHILD DEVICE: 38-ep2:switch2
dev:2572018-10-20 10:15:48.620:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:48.614:debug..... createMultipleEvents( endpoint:2, name:switch2, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:48.611:warnCME: CAN'T FIND CHILD DEVICE: 38-ep1:switch1
dev:2572018-10-20 10:15:48.609:debug----- createMultipleEvents: devObj = null
dev:2572018-10-20 10:15:48.563:debug..... createMultipleEvents( endpoint:1, name:switch1, externalParm:0, myParm:off)
dev:2572018-10-20 10:15:48.560:debugpayload for switches is 24
dev:2572018-10-20 10:15:48.549:debug+++++ process84Event payload: [5, 64, 2, 2, -124, 0, 0, 0, 24, 0, 0, 1, 108, 118, 0, 17, 18, 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-20 10:15:48.530:debugManufacturerProprietary event, [1]:40 [4]:84 payload: 05 40 02 02 84 00 00 00 18 00 00 01 6C 76 00 11 12 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-20 10:15:48.520:trace<<< Incoming: [zw device: 38, command: 9100, payload: 05 40 02 02 84 00 00 00 18 00 00 01 6C 76 00 11 12 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-20 10:15:47.303:debug - Events as sent:
0: [name:heater, value:off, isStateChange:true, displayed:true, descriptionText:Heater is off]
dev:2572018-10-20 10:15:47.300:debug<<<<< rspFlg=true dly:1500/1500
<<<<< Event: [name:heater, value:off, isStateChange:true, displayed:true, descriptionText:Heater is off]
dev:2572018-10-20 10:15:47.296:debug<<<<< Event NECESSARY. name:heater evt: "off" ==> dev:(null)
dev:2572018-10-20 10:15:47.282:trace - 0: Map: [name:heater, value:off, isStateChange:true, displayed:true, descriptionText:Heater is off]
dev:2572018-10-20 10:15:47.276:trace - l -> [name:heater, value:off, isStateChange:true, displayed:true, descriptionText:Heater is off]
dev:2572018-10-20 10:15:47.273:debug+++++ delayBetweenLog parm[1] dly=1500 responseFlg=true
dev:2572018-10-20 10:15:47.255: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, 17, 18, 1, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0]
dev:2572018-10-20 10:15:47.250:debugManufacturerProprietary 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 11 12 01 01 00 00 20 00 00 00 00 00 00 00 00 00
dev:2572018-10-20 10:15:47.240: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 11 12 01 01 00 00 20 00 00 00 00 00 00 00 00 00 ]
dev:2572018-10-20 10:15:45.084:debug - Events as sent:
0: 6006192501FF
1: delay 1500
2: 910005400102870301
3: delay 1500
4: 910005400101830101
dev:2572018-10-20 10:15:45.080:debug<<<<< rspFlg=false dly:1500/1500, 6006192501FF, delay 1500
<<<<< HubAction: 910005400102870301, delay 1500
<<<<< HubAction: 910005400101830101
dev:2572018-10-20 10:15:45.075:trace - 2: instanceof hubitat.device.HubAction
dev:2572018-10-20 10:15:45.073:trace - l -> 910005400101830101
dev:2572018-10-20 10:15:45.066:trace - 1: instanceof hubitat.device.HubAction
dev:2572018-10-20 10:15:45.064:trace - l -> 910005400102870301
dev:2572018-10-20 10:15:45.061:trace - 0: String: 6006192501FF
dev:2572018-10-20 10:15:45.058:trace - l -> 6006192501FF
dev:2572018-10-20 10:15:45.050:debug+++++ delayBetweenLog parm[3] dly=1500 responseFlg=false
dev:2572018-10-20 10:15:45.043:debug+++++ getRefreshCmds
dev:2572018-10-20 10:15:45.037:debug+++++ setChanState(19, 255)
dev:2572018-10-20 10:15:45.030:debug+++++ setVSPSpeedInternal() speed=4

That makes sense - I haven't touched the VSP code, as I don't have one. I haven't set them to do the other command structure, so you're seeing a mix of log 'types'.

Looking at the above, it appears you also don't have child devices created, JDogg. Are any listed for the device? If not, I will add a 'recreateChildren' button and ship it up.

I'll put this on my list of things to do. Here's what I'm currently thinking:

  1. Make VSP work for @JDogg016 - naive attempt, let's see where we get
  2. recreateChildren button.
  3. Remove 'modes' - it's a lot of code, and HE's native "Groups and Modes" seems like a better place to do this (to me - but I haven't gotten into it myself) Votes?
  4. Thermostats. The device can present two, but HE sees only one. I think the way to do this is to create some virtual child devices, one for pool, one for hot tub. Alternatively, I could just remove one if people don't use both. Vote?
  5. Fireman's timeout. Doesn't appear to work at all, but I'd really like it to.

I have this working with Siri. It is very gratifying to tell Siri to turn up the hot tub, let me tell you.

My thoughts.

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.