[RELEASE] HubiThings Replica

I am working on Color Bulb Replica Driver. Got it lit and have switch, colorTemp, level commands all working and all attributes working. Trying to troubleshoot why the Capability Color Control commands are not working. It is very tedious.
When done, I should have mono, colorTemp, and color bulb drivers for the replica implementation.

2 Likes

@Bloodtick_Jones Hi Mate,

Any plan to add water sensor replica driver to supported device list?.

Regards,
Sundar

Build a fake Replica Switch against the ST sensor and it will populate the HE Device Handler with various JSON data.

Cut and paste the 'capability' infomation and post and we can build one. When you post to the forum use the preformatted </> text otherwise it will make a mess of the JSON.

The HE Device Handler should look something like this:

I've been working on this as well and also have a working driver, but need to troubleshoot the colorControl with @Bloodtick_Jones, who's been busy getting ready for release. If we figure out anything, or you do first, just post here.

So pleased to see people like yourself building community drivers!! :partying_face:

ETA: Sent you a PM.

@Bloodtick_Jones Please find the Json

capabilities: {"components":[{"id":"waterSensor","version":1,"status":"live","name":"Water Sensor","ephemeral":false,"attributes":{"water":{"schema":{"type":"object","properties":{"value":{"title":"MoistureState","type":"string","enum":["dry","wet"]}},"additionalProperties":false,"required":["value"]},"enumCommands":[]}},"commands":{}},{"id":"battery","version":1,"status":"live","name":"Battery","ephemeral":false,"attributes":{"battery":{"schema":{"title":"IntegerPercent","type":"object","properties":{"value":{"type":"integer","minimum":0,"maximum":100},"unit":{"type":"string","enum":["%"],"default":"%"}},"additionalProperties":false,"required":["value"]},"enumCommands":[]}},"commands":{}},{"id":"legendabsolute60149.signalMetrics","version":1,"status":"proposed","name":"Signal Metrics","ephemeral":false,"attributes":{"signalMetrics":{"schema":{"type":"object","properties":{"value":{"type":"string"}},"additionalProperties":false,"required":["value"]},"setter":"setSignalMetrics","enumCommands":[]}},"commands":{"setSignalMetrics":{"name":"setSignalMetrics","arguments":[{"name":"value","optional":false,"schema":{"type":"string"}}]}}},{"id":"refresh","version":1,"status":"live","name":"Refresh","ephemeral":false,"attributes":{},"commands":{"refresh":{"name":"refresh","arguments":[]}}}]}
commands: {"setSwitchValue":[{"name":"switch*","type":"ENUM"}],"setSwitchOff":[],"setSwitchOn":[],"setHealthStatusValue":[{"name":"healthStatus*","type":"ENUM"}]}
description: {"deviceId":"3e9e44aa-9a0c-4b73-8d30-0b7af700bd2a","name":"water-battery","label":"Salt Indicator Sensor","manufacturerName":"SmartThingsCommunity","presentationId":"69a03b71-4db2-3b09-8d0a-b1247e232c42","deviceManufacturerCode":"LUMI","locationId":"50b6110c-c91d-4d2b-8e7d-43a299524fdf","roomId":"df49001a-e4bc-4e27-b599-20f18791fc30","components":[{"id":"main","label":"main","capabilities":[{"id":"waterSensor","version":1},{"id":"battery","version":1},{"id":"legendabsolute60149.signalMetrics","version":1},{"id":"refresh","version":1}],"categories":[{"name":"LeakSensor","categoryType":"manufacturer"}]}],"createTime":"2022-10-13T21:45:50.677Z","parentDeviceId":"231b48c1-3b05-4ed3-888c-bc687db3ed89","profile":{"id":"fa8f1715-cb8d-372a-b3f9-74617258e8fe"},"zigbee":{"eui":"00158D000726D907","networkId":"3FC8","driverId":"8a5a5586-aa12-4cbb-b7ed-fa3ad735df0d","executingLocally":true,"hubId":"231b48c1-3b05-4ed3-888c-bc687db3ed89","provisioningState":"DRIVER_SWITCH"},"type":"ZIGBEE","restrictionTier":0,"allowed":null}
health: {"deviceId":"3e9e44aa-9a0c-4b73-8d30-0b7af700bd2a","state":"ONLINE","lastUpdatedDate":"2023-01-04T11:13:18.225Z"}
replica: {"deviceId":"3e9e44aa-9a0c-4b73-8d30-0b7af700bd2a","componentId":"main","replicaId":13,"type":"child"}
rules: {"version":1,"components":[{"trigger":{"name":"off","label":"command: off()","type":"command"},"command":{"name":"off","type":"command","capability":"switch","label":"command: off()"},"type":"hubitatTrigger"},{"trigger":{"name":"on","label":"command: on()","type":"command"},"command":{"name":"on","type":"command","capability":"switch","label":"command: on()"},"type":"hubitatTrigger"},{"trigger":{"type":"attribute","properties":{"value":{"title":"SwitchState","type":"string"}},"additionalProperties":false,"required":["value"],"capability":"switch","attribute":"switch","label":"attribute: switch."},"command":{"name":"setSwitchValue","label":"command: setSwitchValue(switch)","type":"command","parameters":[{"name":"switch*","type":"ENUM"}]},"type":"smartTrigger"},{"trigger":{"type":"attribute","properties":{"value":{"title":"HealthState","type":"string"}},"additionalProperties":false,"required":["value"],"capability":"healthCheck","attribute":"healthStatus","label":"attribute: healthStatus."},"command":{"name":"setHealthStatusValue","label":"command: setHealthStatusValue(healthStatus)","type":"command","parameters":[{"name":"healthStatus*","type":"ENUM"}]},"type":"smartTrigger","mute":true}]}
status: {"components":{"main":{"waterSensor":{"water":{"value":"dry","timestamp":"2023-01-06T00:55:29.042Z"}},"refresh":{},"battery":{"battery":{"value":100,"unit":"%","timestamp":"2022-10-13T23:37:51.706Z"}},"legendabsolute60149.signalMetrics":{"signalMetrics":{"value":"<em table style='font-size:70%';'font-weight: bold'GMT: 2023/01/06 Time: 00:01
DNI: 0x3FC8 LQI: 146 RSSI: -54dbm
","timestamp":"2023-01-06T00:01:41.900Z"}}}}}
triggers: {"off":[],"on":[],"refresh":[]}

1 Like

Beta Code Release 1.2.09 posted.

  • New jQuery DataTables to allow for sorting and search
  • Support for multiple component ID SmartThings devices such as Buttons
  • Bug fixes to non-Replica rules support. (must install to support virtual drivers)
  • Bug fixes to mirror device selection

Drop down will appear on Create and Mirror functions for buttons. Each component will become its own HE Device on the HE Hub:

Powerful jQuery DataTables sorting, paging and search:


Note: the jQuery library is local on the HE device firmware and not externally loaded.

How to update:
Load HubiThings Replica first:
https://raw.githubusercontent.com/bloodtick/Hubitat/main/hubiThingsReplica/hubiThingsReplica.groovy

Load HubiThings OAuth next:
https://raw.githubusercontent.com/bloodtick/Hubitat/main/hubiThingsReplica/hubiThingsOauth.groovy

1 Like

https://raw.githubusercontent.com/bloodtick/Hubitat/main/hubiThingsReplica/devices/replicaWaterSensor.groovy

Give this a try. I did include the custom signalMetrics. Not sure what/how that works, but would be rule ignored if others don't include it.

1 Like

@Bloodtick_Jones thanks Mate. I have tested and the water sensor driver is working like a charm.. Kudos to the effort.

2 Likes

Can you explain how its working? Where to start? I have a ST hub with some devices (real) and some virtual devices... I have HE hub too with nothing else than my phone and presence sensor like life360...
Is there a kind of video or something to see what needed to be done?

@Bloodtick_Jones One more request, any idea about the contact sensor replica driver.

Did you try the Replica Multipurpose Sensor? That is designed around the ST native sensor which is primary as a contact. No idea why they named it as such. Probably should rename it...

1 Like

Start at the top!

The Arlo capabilties data information is below

capabilities: {"components":[{"id":"switch","version":1,"status":"live","name":"Switch","ephemeral":false,"attributes":{"switch":{"schema":{"type":"object","properties":{"value":{"title":"SwitchState","type":"string","enum":["on","off"]}},"additionalProperties":false,"required":["value"]},"enumCommands":[{"command":"on","value":"on"},{"command":"off","value":"off"}]}},"commands":{"off":{"name":"off","arguments":[]},"on":{"name":"on","arguments":[]}}},{"id":"refresh","version":1,"status":"live","name":"Refresh","ephemeral":false,"attributes":{},"commands":{"refresh":{"name":"refresh","arguments":[]}}},{"id":"button","version":1,"status":"live","name":"Button","ephemeral":false,"attributes":{"button":{"schema":{"type":"object","properties":{"value":{"title":"ButtonState","type":"string","enum":["pushed","held","double","pushed_2x","pushed_3x","pushed_4x","pushed_5x","pushed_6x","down","down_2x","down_3x","down_4x","down_5x","down_6x","down_hold","up","up_2x","up_3x","up_4x","up_5x","up_6x","up_hold","swipe_up","swipe_down","swipe_left","swipe_right"]}},"additionalProperties":false,"required":["value"]},"enumCommands":[]},"numberOfButtons":{"schema":{"type":"object","properties":{"value":{"title":"PositiveInteger","type":"integer","minimum":0}},"additionalProperties":false,"required":["value"]},"enumCommands":[]},"supportedButtonValues":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"title":"ButtonState","type":"string","enum":["pushed","held","double","pushed_2x","pushed_3x","pushed_4x","pushed_5x","pushed_6x","down","down_2x","down_3x","down_4x","down_5x","down_6x","down_hold","up","up_2x","up_3x","up_4x","up_5x","up_6x","up_hold","swipe_up","swipe_down","swipe_left","swipe_right"]}}},"additionalProperties":false,"required":[]},"enumCommands":[]}},"commands":{}},{"id":"battery","version":1,"status":"live","name":"Battery","ephemeral":false,"attributes":{"battery":{"schema":{"title":"IntegerPercent","type":"object","properties":{"value":{"type":"integer","minimum":0,"maximum":100},"unit":{"type":"string","enum":["%"],"default":"%"}},"additionalProperties":false,"required":["value"]},"enumCommands":[]}},"commands":{}},{"id":"healthCheck","version":1,"status":"live","name":"Health Check","ephemeral":false,"attributes":{"checkInterval":{"schema":{"type":"object","properties":{"value":{"type":"integer","minimum":0,"maximum":604800},"unit":{"type":"string","enum":["s"],"default":"s"},"data":{"type":"object","additionalProperties":false,"required":[],"properties":{"deviceScheme":{"type":"string","enum":["MIXED","TRACKED","UNTRACKED"]},"hubHardwareId":{"type":"string","pattern":"^[0-9a-fA-F]{4}$"},"protocol":{"title":"DeviceHealthProtocol","type":"string","enum":["zigbee","zwave","bluetooth","lan","cloud","unknown","ocf","mqtt"]},"offlinePingable":{"type":"string","enum":["0","1"]},"badProperty":{"type":"string"}}}},"additionalProperties":false,"required":["value"]},"enumCommands":[]},"healthStatus":{"schema":{"type":"object","properties":{"value":{"type":"string","enum":["online","offline"]},"data":{"type":"object","additionalProperties":false,"required":[],"properties":{"deviceScheme":{"type":"string","enum":["MIXED","TRACKED","UNTRACKED"]},"badProperty":{"type":"string"}}}},"additionalProperties":false,"required":["value"]},"enumCommands":[]},"DeviceWatch-Enroll":{"schema":{"type":"object","properties":{"value":{"title":"DeviceHealthEnroll","type":"object","additionalProperties":false,"properties":{"scheme":{"type":"string","enum":["MIXED","TRACKED","UNTRACKED"]},"protocol":{"title":"DeviceHealthProtocol","type":"string","enum":["zigbee","zwave","bluetooth","lan","cloud","unknown","ocf","mqtt"]},"hubHardwareId":{"title":"String","type":"string","maxLength":255}}}},"additionalProperties":false,"required":["value"]},"enumCommands":[]},"DeviceWatch-DeviceStatus":{"schema":{"type":"object","properties":{"value":{"type":"string","enum":["online","offline"]},"data":{"type":"object","additionalProperties":false,"required":[],"properties":{"deviceScheme":{"type":"string","enum":["MIXED","TRACKED","UNTRACKED"]},"badProperty":{"type":"string"}}}},"additionalProperties":false,"required":["value"]},"enumCommands":[]}},"commands":{"ping":{"name":"ping","arguments":[]}}},{"id":"videoStream","version":1,"status":"live","name":"Video Stream","ephemeral":false,"attributes":{"stream":{"schema":{"type":"object","properties":{"value":{"title":"JsonObject","type":"object"}},"additionalProperties":false,"required":["value"]},"enumCommands":[]}},"commands":{"stopStream":{"name":"stopStream","arguments":[]},"startStream":{"name":"startStream","arguments":[]}}},{"id":"motionSensor","version":1,"status":"live","name":"Motion Sensor","ephemeral":false,"attributes":{"motion":{"schema":{"type":"object","properties":{"value":{"title":"ActivityState","type":"string","enum":["active","inactive"]}},"additionalProperties":false,"required":["value"]},"enumCommands":[]}},"commands":{}},{"id":"soundSensor","version":1,"status":"live","name":"Sound Sensor","ephemeral":false,"attributes":{"sound":{"schema":{"type":"object","properties":{"value":{"type":"string","enum":["detected","not detected"]}},"additionalProperties":false,"required":["value"]},"enumCommands":[]}},"commands":{}},{"id":"videoCapture","version":1,"status":"live","name":"Video Capture","ephemeral":false,"attributes":{"stream":{"schema":{"type":"object","properties":{"value":{"title":"JsonObject","type":"object"}},"additionalProperties":false,"required":["value"]},"enumCommands":[]},"clip":{"schema":{"type":"object","properties":{"value":{"title":"JsonObject","type":"object"}},"additionalProperties":false,"required":["value"]},"enumCommands":[]}},"commands":{"capture":{"name":"capture","arguments":[{"name":"startTime","optional":false,"schema":{"title":"Iso8601Date","type":"string","pattern":"^(?:[1-9]\\d{3}-?(?:(?:0[1-9]|1[0-2])-?(?:0[1-9]|1\\d|2[0-8])|(?:0[13-9]|1[0-2])-?(?:29|30)|(?:0[13578]|1[02])-?31)|(?:[1-9]\\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-?02-?29)T(?:[01]\\d|2[0-3]):?[0-5]\\d:?[0-5]\\d(?:\\.\\d{3})?(?:Z|[+-][01]\\d(?::?[0-5]\\d)?)$"}},{"name":"captureTime","optional":false,"schema":{"title":"Iso8601Date","type":"string","pattern":"^(?:[1-9]\\d{3}-?(?:(?:0[1-9]|1[0-2])-?(?:0[1-9]|1\\d|2[0-8])|(?:0[13-9]|1[0-2])-?(?:29|30)|(?:0[13578]|1[02])-?31)|(?:[1-9]\\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-?02-?29)T(?:[01]\\d|2[0-3]):?[0-5]\\d:?[0-5]\\d(?:\\.\\d{3})?(?:Z|[+-][01]\\d(?::?[0-5]\\d)?)$"}},{"name":"endTime","optional":false,"schema":{"title":"Iso8601Date","type":"string","pattern":"^(?:[1-9]\\d{3}-?(?:(?:0[1-9]|1[0-2])-?(?:0[1-9]|1\\d|2[0-8])|(?:0[13-9]|1[0-2])-?(?:29|30)|(?:0[13578]|1[02])-?31)|(?:[1-9]\\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-?02-?29)T(?:[01]\\d|2[0-3]):?[0-5]\\d:?[0-5]\\d(?:\\.\\d{3})?(?:Z|[+-][01]\\d(?::?[0-5]\\d)?)$"}},{"name":"correlationId","optional":true,"schema":{"title":"String","type":"string","maxLength":255}},{"name":"reason","optional":true,"schema":{"title":"String","type":"string","maxLength":255}}]}}},{"id":"alarm","version":1,"status":"live","name":"Alarm","ephemeral":false,"attributes":{"alarm":{"schema":{"type":"object","properties":{"value":{"title":"AlertState","type":"string","enum":["both","off","siren","strobe"]}},"additionalProperties":false,"required":["value"]},"enumCommands":[{"command":"both","value":"both"},{"command":"off","value":"off"},{"command":"siren","value":"siren"},{"command":"strobe","value":"strobe"}]}},"commands":{"siren":{"name":"siren","arguments":[]},"strobe":{"name":"strobe","arguments":[]},"off":{"name":"off","arguments":[]},"both":{"name":"both","arguments":[]}}}]}
commands: {"setSwitchValue":[{"name":"switch*","type":"ENUM"}],"setSwitchOff":[],"setSwitchOn":[],"setMotionValue":[{"name":"motion*","type":"ENUM"}],"setMotionActive":[],"setMotionInactive":[],"setSoundValue":[{"name":"sound*","type":"ENUM"}],"setSoundDetected":[],"setSoundNotDetected":[],"setBatteryValue":[{"name":"battery*","type":"NUMBER"}],"setHealthStatusValue":[{"name":"healthStatus*","type":"ENUM"}]}
description: {"deviceId":"30fb90d7-a507-4a38-80d3-f58ae0a9f895","name":"c2c-arlo-wired-video-doorbell-switch-battery","label":"Front Door Doorbell","manufacturerName":"SmartThings","presentationId":"SmartThings-smartthings-c2c_arlo_doorbell_switch_battery","locationId":"6deb2ff0-5ece-4c2c-9709-fc4e2819c574","ownerId":"573997fb-413b-4478-b153-f750618ef88e","roomId":"fe89c8a7-7a39-4465-99b5-0db72a4ff4ad","components":[{"id":"main","label":"main","capabilities":[{"id":"switch","version":1},{"id":"refresh","version":1},{"id":"button","version":1},{"id":"battery","version":1},{"id":"healthCheck","version":1},{"id":"videoStream","version":1},{"id":"motionSensor","version":1},{"id":"soundSensor","version":1},{"id":"videoCapture","version":1},{"id":"alarm","version":1}],"categories":[{"name":"Camera","categoryType":"manufacturer"}]}],"createTime":"2023-01-01T17:57:32.438Z","profile":{"id":"82c7e00a-b03b-4de0-8b79-aec4db3375e0"},"viper":{"manufacturerName":"Arlo","modelName":"AVD1001B"},"type":"VIPER","restrictionTier":0,"allowed":null}
health: {"deviceId":"30fb90d7-a507-4a38-80d3-f58ae0a9f895","state":"ONLINE","lastUpdatedDate":"2023-01-06T12:56:53.039Z"}
replica: {"deviceId":"30fb90d7-a507-4a38-80d3-f58ae0a9f895","replicaId":714,"type":"child"}
rules: {"version":1,"components":[ {"trigger":{"type":"attribute","properties":{"value":{"title":"ActivityState","type":"string"}},"additionalProperties":false,"required":["value"],"capability":"motionSensor","attribute":"motion","label":"attribute: motion.*"},"command":{"name":"setMotionValue","label":"command: setMotionValue(motion*)","type":"command","parameters":[{"name":"motion*","type":"ENUM"}]},"type":"smartTrigger"}, {"trigger":{"name":"off","label":"command: off()","type":"command"},"command":{"name":"off","type":"command","capability":"switch","label":"command: off()"},"type":"hubitatTrigger"}, {"trigger":{"name":"on","label":"command: on()","type":"command"},"command":{"name":"on","type":"command","capability":"switch","label":"command: on()"},"type":"hubitatTrigger"}, {"trigger":{"type":"attribute","properties":{"value":{"title":"ActivityState","type":"string"}},"additionalProperties":false,"required":["value"],"capability":"soundSensor","attribute":"sound","label":"attribute: sound.*"},"command":{"name":"setSoundValue","label":"command: setSoundValue(sound*)","type":"command","parameters":[{"name":"sound*","type":"ENUM"}]},"type":"smartTrigger"}, {"trigger":{"title":"IntegerPercent","type":"attribute","properties":{"value":{"type":"integer","minimum":0,"maximum":100},"unit":{"type":"string","enum":["%"],"default":"%"}},"additionalProperties":false,"required":["value"],"capability":"battery","attribute":"battery","label":"attribute: battery.*"},"command":{"name":"setBatteryValue","label":"command: setBatteryValue(battery*)","type":"command","parameters":[{"name":"battery*","type":"NUMBER"}]},"type":"smartTrigger","mute":true}, {"trigger":{"type":"attribute","properties":{"value":{"title":"SwitchState","type":"string"}},"additionalProperties":false,"required":["value"],"capability":"switch","attribute":"switch","label":"attribute: switch.*"},"command":{"name":"setSwitchValue","label":"command: setSwitchValue(switch*)","type":"command","parameters":[{"name":"switch*","type":"ENUM"}]},"type":"smartTrigger"}, {"trigger":{"type":"attribute","properties":{"value":{"title":"HealthState","type":"string"}},"additionalProperties":false,"required":["value"],"capability":"healthCheck","attribute":"healthStatus","label":"attribute: healthStatus.*"},"command":{"name":"setHealthStatusValue","label":"command: setHealthStatusValue(healthStatus*)","type":"command","parameters":[{"name":"healthStatus*","type":"ENUM"}]},"type":"smartTrigger","mute":true} ]}
status: {"components":{"main":{"button":{"button":{"value":"up","timestamp":"2023-01-06T12:56:51.615Z"},"numberOfButtons":{"value":null},"supportedButtonValues":{"value":["pushed"],"timestamp":"2023-01-01T17:57:37.880Z"}},"videoCapture":{"stream":{"value":null},"clip":{"value":null}},"videoStream":{"stream":{"value":null}},"healthCheck":{"checkInterval":{"value":60,"unit":"s","data":{"deviceScheme":"UNTRACKED","protocol":"cloud"},"timestamp":"2023-01-01T17:57:32.619Z"},"healthStatus":{"value":null},"DeviceWatch-Enroll":{"value":null},"DeviceWatch-DeviceStatus":{"value":"online","data":{},"timestamp":"2023-01-01T17:57:37.296Z"}},"alarm":{"alarm":{"value":"off","timestamp":"2023-01-01T17:57:37.880Z"}},"refresh":{},"soundSensor":{"sound":{"value":"not detected","timestamp":"2023-01-01T17:57:37.880Z"}},"motionSensor":{"motion":{"value":"inactive","timestamp":"2023-01-06T19:47:53.182Z"}},"battery":{"battery":{"value":35,"unit":"%","timestamp":"2023-01-06T12:56:51.299Z"}},"switch":{"switch":{"value":"on","timestamp":"2023-01-01T17:57:37.880Z"}}}}}
triggers: {"refresh":[]}

Hope that helps

1 Like

Beta Code Release 1.2.10 posted.

  • Update to object command to support color bulbs. Thanks to @djgutheinz for the patch!

How to update:
Load HubiThings Replica first:
https://raw.githubusercontent.com/bloodtick/Hubitat/main/hubiThingsReplica/hubiThingsReplica.groovy

Load HubiThings OAuth next (not required if you have 1.2.09):
https://raw.githubusercontent.com/bloodtick/Hubitat/main/hubiThingsReplica/hubiThingsOauth.groovy

@djgutheinz Replica Device Handler Repo:
Location: https://github.com/DaveGut/HubitatActive/tree/master/HubiThingsReplica%20Drivers

He has designed some amazing color bulb device handlers with more 'HubiThings' to come.

6 Likes

@bradford.clarke There are the drivers you needed!

2 Likes

For the device code of hubitat, do you mean the drivers section? Because in devices section I only have the option to add new device in list or by brand… just wanted to be sure that its not in virtual device or something!

Thanks!

Good catch. That line of the instructions probably should say "Drivers Code" instead of Device Code. Hope that helps.

2 Likes

Another thing, how do we know if some new drivers are added or have new version?

In theory once it is added to HPM it will notify you. It will be intersting wrangling the drivers together for it though.

2 Likes

I'm just starting out on this and cannot seem to get past this step. I get this message when clicking on the link:

400

Bad Request
invalid_request : Invalid query parameter value for state

※ IAMUSSauseast1_1673201600501_99999-5542522526.999

Also, what is "PAT"?

I'm really just trying to set this up so I can use SmartThings app in my phone as the presence sensor because the HE presence sensor doesn't work. (Even though it should and nobody seems to be able to figure out why it doesn't.)