Use voice command (Google Assistant and/or Alexa) to initiate Android phone finder feature
“Hey Google, turn on Jim’s Phone Finder”
“Alexa, turn on Bob’s Phone Finder”
Programmatically initiate phone finder feature
When you have multiple android phones, asking Google to find my phone results in it prompting about each phone one by one. It can get quite tedious. Sometimes it would just ring the first phone.
This solution lets you ring the specific phone using an openhab item.
Updates:
2024-01-07 fixed the page parsing again, and make it a self-contained script. It is no longer necessary to manually create the required items.
2023-03-22 fixed find_elements to find multiple phones
2023-03-21 Adapted to Google’s obfuscated class names
2022-12-30 Refactor and move cookie storage into metadata
2022-07-23 Google stopped showing the find my phone feature in the search result. Changed the find my phone url to google.com/android/find - the FindMyPhone#ring method is also updated accordingly
Nice work. Unfortunately I was not able to install selenium standalone docker on openHABian and I dont like JRuby. So I re-implemented the code using Node and used ChromeDriver directly.
How to use?
install app using ‘npm install’ in project’s root directory
Install ChromeDriver using ‘sudo apt-get install chromium-chromedriver’
copy path of chromedriver binary in constructor method of app.js
Support for multiple phones is missing. I invoked the node app like this
/*
This rule scrapes the google's 'find my phone' page to let the phone ring
*/
var Exec = Java.type("org.openhab.core.model.script.actions.Exec");
rules.JSRule({
name: "Ring My Phone",
description: "This rule scrapes the google 'find my phone' page to let the phone ring",
triggers: [triggers.ChannelEventTrigger("deconz:switch:homeserver:tdfr_shortcut_findphone:buttonevent", "1002")],
execute: data => {
console.log("Let your phone ring...");
Exec.executeCommandLine( 'node', '/home/openhabian/selenium-test-app/app.js', 'ring');
}
});
rules.JSRule({
name: "Refresh google cookies",
description: "This rule reloads the google cookies needed for authentification.",
triggers: [triggers.GenericCronTrigger("0 0 */3 ? * *")],
execute: data => {
console.log("Refresh google cookies...");
Exec.executeCommandLine( 'node', '/home/openhabian/selenium-test-app/app.js', 'refresh');
}
});
I’m trying to use your solution as well (the JS one in a dockerized environment). I’ve successfully deployed the selenium container and are able to debug the JS code. All seems fine, except the fact, that I’m not able to sign in to my google account. I’ve a feeling that the cookie string is not good I’m sending. My default cookie value looks like this:
UPDATE: I managed to set the correct cookies using the method from the original repo, so the issue was caused by the incorrect or insufficient cookies.
The script once again breaks because Google changed their device finder page again, presumably due to the new android tracker products being supported.
Between this and the constant need to update the cookies, this time I gave up and switched to using openhab’s Notification actions. I used a special Finder tag / severity with a fixed reference id (a new feature in OH 4.2), and on the phone(s), set the notification sound for the Finder severity to ring despite DND. Lastly I picked a ringtone for that severity that lasts a bit longer, and call it a day.
I hope that one day Google will publish their device finder API, especially now with the “tracker tags” entering the scene.
The script became super simple now
# frozen_string_literal: true
=begin # rubocop:disable Style/BlockComments
A openHAB script to find your Android phone using openHAB's cloud notification
Author: @jimtng
Last updated: 2024-07-12
Fill out the PHONES constant below with the list of phones to find.
This script will create the necessary items and rules at run-time. The following items will be created:
- FindMyPhone_Group: a group item to hold all the phone finder items
- FindMyPhone_Phone_<name>: a switch item for each phone to find.
The phone items will have `ga` and `alexa` metadata set to "Switch" so
they can be discovered by Google Home and Alexa.
These items will be removed when this script is unloaded.
Once discovered, you can say "Hey Google, turn on Jimmy's Phone Finder" to ring the phone.
For more information, see:
https://community.openhab.org/t/android-phone-finder-from-openhab-google-assistant-and-alexa/134723
=end
#########################################################################################################
# Begin configuration
#########################################################################################################
#
# List of phones to find
#
# The first element is the item's label which will be used for voice command, e.g.
# label: "Jimmy's Phone Finder", alexa command: "Alexa, turn on Jimmy's Phone Finder"
#
# The first word from the label will be used to create the item name,
# e.g. for "Jimmy's Phone Finder", an item called "FindMyPhone_Phone_Jimmy" will be created.
#
# A group called FindMyPhone_Group will be created with all the phone finder items
#
# The hash values are the openHAB cloud user id (email) of the phone owner.
#
PHONES = {
"Jimmy's Phone Finder" => "jimmy@gmail.com",
"Johnno's Phone Finder" => "johnno@gmail.com"
}.freeze
#########################################################################################################
# End configuration
#########################################################################################################
items.build do
group_item FindMyPhone_Group do
PHONES.each do |name, user_id|
item_name = name[/^[a-zA-Z]+/]
switch_item "FindMyPhone_Phone_#{item_name}", name, ga: "Switch", alexa: "Switch",
metadata: { user_id:, expire: "3s" }
end
end
end
rule "Find My Phone: Ring the phone" do
received_command FindMyPhone_Group.members, command: ON
run do |event|
user_id = event.item.metadata["user_id"].value
Notification.send("Phone Finder", email: user_id, tag: "Finder", id: "phone-finder", icon: "zoom")
end
end