[Alpha] Community-maintained Google Home integration

You can set the sensors to use the Google "Thermostat" device type and add a query-only Temperature Setting trait.

Works,

weirdly, i'm sure i tried it but with all the debug i did today... not sure of anything

this being said, your help is really appreciated !
thanks a lot

Just checking - there still isn't a way to convert motion notifications from the Nest Hello doorbell into something Hubitat can use is there?

No, this app only goes the other direction: it adds devices from Hubitat to Google Home. It cannot add devices from Google Home to Hubitat.

Thanks. Do you know anything that would?

2 Likes

New Release: 0.33.0

This release fixes the Camera Stream trait to work with Google's API changes and adds support for the Arm/Disarm trait. It also adds the ability for devices to query PIN codes from the device driver rather than having them configured directly in Google Home Community.

Big thanks to @lpakula for these new features

5 Likes

New Release: 0.34.0

This release adds the Sensor State trait to allow you to query various types of sensors such as CO, smoke, or leak sensors. Thanks to @lpakula for this one as well.

There was also a small patch, 0.33.1, earlier today which normalizes handling of temperatures so they always get rounded to one decimal digit.

4 Likes

I like this solution but 2 questions:

  1. What is the flag to limit caching? Because the stream starts at the oldest cached .ts file

  2. My Chromecast devices (Nvidia Shield or Nest Hub) do not seem to like the stream, and I end up with the same issue. I have a feeling it could be a resolution issue? I can't use the Hubitat app "Chromecast Integration (Beta)" Play Track to work. It just brings up a blank screen. If I use pychromecast in Python, it seems to work fine.

I'm trying to be able to use Hubitat to control streaming, rather than running a Python script on a BlueIris alert.

I have found an issue with the App with regards to using lock / unlock with pin codes. executeCommand_LockUnlock method passes in the codePosition after matching against a device PinCode. However, this then causes a failure as lock() and unlock() methods do not take the parameter codePosition. The solution to this is to replace the parameter codePosition with null. The Mfa still validates that the pin code matches. See code changes below.

@SuppressWarnings('UnusedPrivateMethod')
private executeCommand_LockUnlock(deviceInfo, command) {
    def lockUnlockTrait = deviceInfo.deviceType.traits.LockUnlock
    def checkValue
    def codePosition
    if (command.params.lock) {
        codePosition = checkMfa(deviceInfo, "Lock", command)
        checkValue = lockUnlockTrait.lockedValue
        issueCommandWithCodePosition(deviceInfo, lockUnlockTrait.lockCommand, null, lockUnlockTrait.returnUserIndexToDevice)
        //issueCommandWithCodePosition(deviceInfo, lockUnlockTrait.lockCommand, codePosition, lockUnlockTrait.returnUserIndexToDevice)
    } else {
        codePosition = checkMfa(deviceInfo, "Unlock", command)
        checkValue = { it != lockUnlockTrait.lockedValue }
        issueCommandWithCodePosition(deviceInfo, lockUnlockTrait.unlockCommand, null, lockUnlockTrait.returnUserIndexToDevice)
        //issueCommandWithCodePosition(deviceInfo, lockUnlockTrait.unlockCommand, codePosition, lockUnlockTrait.returnUserIndexToDevice)        
    }

    return [
        [
            (lockUnlockTrait.lockedUnlockedAttribute): checkValue,
        ],
        [
            isJammed: false,
            isLocked: command.params.lock,
        ],
    ]
}

There's a setting that was added to the Lock/Unlock trait to control that. Disable the "Select to return the user index with the device command on a pincode match." toggle to prevent the app from trying to pass the PIN code index back to the driver. That's supposed to default to being off, but maybe something's not quite right if you have a Lock/Unlock trait from before it existed.

Perfect, thanks so much. That worked.

Now we just need to convince Google to add lock state and lock keypad in GHA so we do not have to use voice every time.

Are you sure it starts at the oldest? It will lag 15-30 seconds from real time with m3u8. It's just part of the spec that it needs to cache some stream before it can play.

What is the resolution of your source? Below is an image on what have set for my 3D printer camera which works fine on Nest hub and Nest Hub max (they each have different resolutions). One big one is you need to enable audio on your video stream in BI (even if the camera doesn't have it). Google expects a video+audio stream, or it will play nothing.

I was having issues with BI and a memory leak when using m3u8 so I switched to running ffmpeg to create the m3u8 stream, while fixing the resolution and adding blank audio. That's been working flawless for me for the other 8 cameras I mapped to Hubitat.

1 Like

My God, you are a genius. I was trying every possible setting to figure out why Chromecast didn't like the m3u8 stream and it turned out it was the disabled audio channel in BlueIris....

As soon as I enabled that it worked!

I don't seem to have the same memory leak issue so I can continue to just use BlueIris to stream.

What I can't seem to do is get a Camera Group to stream. Despite all audio channels being enabled on all the cameras in that stream. EDIT: I confirmed no matter what I do, VLC is showing an audio stream with the group. I have Webcast Audio enabled.

Having a problem after installing this latest .34 version. I get this in the logs after "sync my devices"

app:30132022-06-23 04:15:03.901 pm errorError retreiving state for device House Thermostat (Controller) on C4 RF Zigbee: java.lang.NullPointerException: Cannot invoke method multiply() on null object at line 4591 (roundTo)

app:30132022-06-23 04:14:57.682 pm errorjava.lang.NullPointerException: Cannot invoke method multiply() on null object on line 4591 (method handleAction)

Many many hours of projectile swearing until I found out the finicky issue with Google and streams!

I'll have to re-check BlueIris. I had the leak about a year ago, but the developers couldn't readily find it.

How are you doing camera groups? Is that in BlueIris? (I've never did it, so I can try to see if I can figure it out).

That sync issue might be a thermostat returning int vs float. Might just need:
return Math.round(number.toFloat() * factor) / factor

It looks like some setting isn't set when I was expecting it to be. Can you post a screenshot of your thermostat's Temperature Setting trait?

@jrfarrar I just pushed a patch that will allow the app to tolerate whatever null temperature it is attempting to round. It will also log when it attempts to do so. Can you update, turn on debug logging, sync with Google, and post the exception trace that gets printed to the Hubitat log?

The thermostat is the built in "Thermostat Controller" app built into HE. It creates a virtual thermostat that allows me to use many temp sensors around the house. Not exactly sure of what you are wanting me to screenshot?

Also @mbudnek Thanks I just tried to install it...and it errored out on HPM so I tried to manually install it...and I get this:

unexpected token: catch @ line 4594, column 5.

but yes for some reason "number" is coming in as null.

1 Like