GPS and current activity in background service

This commit is contained in:
Joseph Abbey
2024-01-27 13:11:24 +00:00
parent 2ba102f8dd
commit e3288c9353
4 changed files with 293 additions and 232 deletions

View File

@ -25,7 +25,8 @@
Use "Monkey C: Edit Application" from the Visual Studio Code command palette Use "Monkey C: Edit Application" from the Visual Studio Code command palette
to update the application attributes. to update the application attributes.
--> -->
<iq:application id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0"> <iq:application id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" name="@Strings.AppName"
entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
<!-- <!--
Use the following from the Visual Studio Code comand palette to edit Use the following from the Visual Studio Code comand palette to edit
the build targets: the build targets:
@ -34,115 +35,116 @@
"Monkey C: Edit Products" - Lets you add or remove any product "Monkey C: Edit Products" - Lets you add or remove any product
--> -->
<iq:products> <iq:products>
<iq:product id="approachs7042mm"/> <iq:product id="approachs7042mm" />
<iq:product id="approachs7047mm"/> <iq:product id="approachs7047mm" />
<iq:product id="d2air"/> <iq:product id="d2air" />
<iq:product id="d2airx10"/> <iq:product id="d2airx10" />
<iq:product id="d2delta"/> <iq:product id="d2delta" />
<iq:product id="d2deltapx"/> <iq:product id="d2deltapx" />
<iq:product id="d2deltas"/> <iq:product id="d2deltas" />
<iq:product id="d2mach1"/> <iq:product id="d2mach1" />
<iq:product id="descentg1"/> <iq:product id="descentg1" />
<iq:product id="descentmk2"/> <iq:product id="descentmk2" />
<iq:product id="descentmk2s"/> <iq:product id="descentmk2s" />
<iq:product id="edge1030"/> <iq:product id="edge1030" />
<iq:product id="edge1030bontrager"/> <iq:product id="edge1030bontrager" />
<iq:product id="edge1030plus"/> <iq:product id="edge1030plus" />
<iq:product id="edge1040"/> <iq:product id="edge1040" />
<iq:product id="edge520plus"/> <iq:product id="edge520plus" />
<iq:product id="edge530"/> <iq:product id="edge530" />
<iq:product id="edge820"/> <iq:product id="edge820" />
<iq:product id="edge830"/> <iq:product id="edge830" />
<iq:product id="edgeexplore"/> <iq:product id="edgeexplore" />
<iq:product id="edgeexplore2"/> <iq:product id="edgeexplore2" />
<iq:product id="enduro"/> <iq:product id="enduro" />
<iq:product id="epix2"/> <iq:product id="epix2" />
<iq:product id="epix2pro42mm"/> <iq:product id="epix2pro42mm" />
<iq:product id="epix2pro47mm"/> <iq:product id="epix2pro47mm" />
<iq:product id="epix2pro51mm"/> <iq:product id="epix2pro51mm" />
<iq:product id="fenix5"/> <iq:product id="fenix5" />
<iq:product id="fenix5plus"/> <iq:product id="fenix5plus" />
<iq:product id="fenix5s"/> <iq:product id="fenix5s" />
<iq:product id="fenix5splus"/> <iq:product id="fenix5splus" />
<iq:product id="fenix5x"/> <iq:product id="fenix5x" />
<iq:product id="fenix5xplus"/> <iq:product id="fenix5xplus" />
<iq:product id="fenix6"/> <iq:product id="fenix6" />
<iq:product id="fenix6pro"/> <iq:product id="fenix6pro" />
<iq:product id="fenix6s"/> <iq:product id="fenix6s" />
<iq:product id="fenix6spro"/> <iq:product id="fenix6spro" />
<iq:product id="fenix6xpro"/> <iq:product id="fenix6xpro" />
<iq:product id="fenix7"/> <iq:product id="fenix7" />
<iq:product id="fenix7pro"/> <iq:product id="fenix7pro" />
<iq:product id="fenix7pronowifi"/> <iq:product id="fenix7pronowifi" />
<iq:product id="fenix7s"/> <iq:product id="fenix7s" />
<iq:product id="fenix7spro"/> <iq:product id="fenix7spro" />
<iq:product id="fenix7x"/> <iq:product id="fenix7x" />
<iq:product id="fenix7xpro"/> <iq:product id="fenix7xpro" />
<iq:product id="fenix7xpronowifi"/> <iq:product id="fenix7xpronowifi" />
<iq:product id="fenixchronos"/> <iq:product id="fenixchronos" />
<iq:product id="fr245"/> <iq:product id="fr245" />
<iq:product id="fr245m"/> <iq:product id="fr245m" />
<iq:product id="fr255"/> <iq:product id="fr255" />
<iq:product id="fr255m"/> <iq:product id="fr255m" />
<iq:product id="fr255s"/> <iq:product id="fr255s" />
<iq:product id="fr255sm"/> <iq:product id="fr255sm" />
<iq:product id="fr265"/> <iq:product id="fr265" />
<iq:product id="fr265s"/> <iq:product id="fr265s" />
<iq:product id="fr55"/> <iq:product id="fr55" />
<iq:product id="fr645"/> <iq:product id="fr645" />
<iq:product id="fr645m"/> <iq:product id="fr645m" />
<iq:product id="fr745"/> <iq:product id="fr745" />
<iq:product id="fr935"/> <iq:product id="fr935" />
<iq:product id="fr945"/> <iq:product id="fr945" />
<iq:product id="fr945lte"/> <iq:product id="fr945lte" />
<iq:product id="fr955"/> <iq:product id="fr955" />
<iq:product id="fr965"/> <iq:product id="fr965" />
<iq:product id="gpsmap67"/> <iq:product id="gpsmap67" />
<iq:product id="instinct2"/> <iq:product id="instinct2" />
<iq:product id="instinct2s"/> <iq:product id="instinct2s" />
<iq:product id="instinct2x"/> <iq:product id="instinct2x" />
<iq:product id="instinctcrossover"/> <iq:product id="instinctcrossover" />
<iq:product id="legacyherocaptainmarvel"/> <iq:product id="legacyherocaptainmarvel" />
<iq:product id="legacyherofirstavenger"/> <iq:product id="legacyherofirstavenger" />
<iq:product id="legacysagadarthvader"/> <iq:product id="legacysagadarthvader" />
<iq:product id="legacysagarey"/> <iq:product id="legacysagarey" />
<iq:product id="marq2"/> <iq:product id="marq2" />
<iq:product id="marq2aviator"/> <iq:product id="marq2aviator" />
<iq:product id="marqadventurer"/> <iq:product id="marqadventurer" />
<iq:product id="marqathlete"/> <iq:product id="marqathlete" />
<iq:product id="marqaviator"/> <iq:product id="marqaviator" />
<iq:product id="marqcaptain"/> <iq:product id="marqcaptain" />
<iq:product id="marqcommander"/> <iq:product id="marqcommander" />
<iq:product id="marqdriver"/> <iq:product id="marqdriver" />
<iq:product id="marqexpedition"/> <iq:product id="marqexpedition" />
<iq:product id="marqgolfer"/> <iq:product id="marqgolfer" />
<iq:product id="montana7xx"/> <iq:product id="montana7xx" />
<iq:product id="venu"/> <iq:product id="venu" />
<iq:product id="venu2"/> <iq:product id="venu2" />
<iq:product id="venu2plus"/> <iq:product id="venu2plus" />
<iq:product id="venu2s"/> <iq:product id="venu2s" />
<iq:product id="venu3"/> <iq:product id="venu3" />
<iq:product id="venu3s"/> <iq:product id="venu3s" />
<iq:product id="venud"/> <iq:product id="venud" />
<iq:product id="venusq"/> <iq:product id="venusq" />
<iq:product id="venusq2"/> <iq:product id="venusq2" />
<iq:product id="venusq2m"/> <iq:product id="venusq2m" />
<iq:product id="venusqm"/> <iq:product id="venusqm" />
<iq:product id="vivoactive3"/> <iq:product id="vivoactive3" />
<iq:product id="vivoactive3m"/> <iq:product id="vivoactive3m" />
<iq:product id="vivoactive3mlte"/> <iq:product id="vivoactive3mlte" />
<iq:product id="vivoactive4"/> <iq:product id="vivoactive4" />
<iq:product id="vivoactive4s"/> <iq:product id="vivoactive4s" />
<iq:product id="vivoactive5"/> <iq:product id="vivoactive5" />
</iq:products> </iq:products>
<!-- <!--
Use "Monkey C: Edit Permissions" from the Visual Studio Code command Use "Monkey C: Edit Permissions" from the Visual Studio Code command
palette to update permissions. palette to update permissions.
--> -->
<iq:permissions> <iq:permissions>
<iq:uses-permission id="Background"/> <iq:uses-permission id="Background" />
<iq:uses-permission id="BluetoothLowEnergy"/> <iq:uses-permission id="BluetoothLowEnergy" />
<iq:uses-permission id="Communications"/> <iq:uses-permission id="Communications" />
<iq:uses-permission id="Positioning" />
</iq:permissions> </iq:permissions>
<!-- <!--
Use "Monkey C: Edit Languages" from the Visual Studio Code command Use "Monkey C: Edit Languages" from the Visual Studio Code command
@ -190,6 +192,6 @@
Use "Monkey C: Configure Monkey Barrel" from the Visual Studio Code Use "Monkey C: Configure Monkey Barrel" from the Visual Studio Code
command palette to edit the included barrels. command palette to edit the included barrels.
--> -->
<iq:barrels/> <iq:barrels />
</iq:application> </iq:application>
</iq:manifest> </iq:manifest>

View File

@ -28,9 +28,11 @@
Testing in VSCode requires monkey.jungle, so for convenience, swap between Testing in VSCode requires monkey.jungle, so for convenience, swap between
watch-app and widget by changing which of the next two lines are commented out watch-app and widget by changing which of the next two lines are commented out
--> -->
<iq:application id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0"> <iq:application id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app" name="@Strings.AppName"
<!-- entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
<iq:application id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0"> <!--
<iq:application id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" name="@Strings.AppName"
entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
--> -->
<!-- <!--
Use the following from the Visual Studio Code comand palette to edit Use the following from the Visual Studio Code comand palette to edit
@ -40,115 +42,116 @@
"Monkey C: Edit Products" - Lets you add or remove any product "Monkey C: Edit Products" - Lets you add or remove any product
--> -->
<iq:products> <iq:products>
<iq:product id="approachs7042mm"/> <iq:product id="approachs7042mm" />
<iq:product id="approachs7047mm"/> <iq:product id="approachs7047mm" />
<iq:product id="d2air"/> <iq:product id="d2air" />
<iq:product id="d2airx10"/> <iq:product id="d2airx10" />
<iq:product id="d2delta"/> <iq:product id="d2delta" />
<iq:product id="d2deltapx"/> <iq:product id="d2deltapx" />
<iq:product id="d2deltas"/> <iq:product id="d2deltas" />
<iq:product id="d2mach1"/> <iq:product id="d2mach1" />
<iq:product id="descentg1"/> <iq:product id="descentg1" />
<iq:product id="descentmk2"/> <iq:product id="descentmk2" />
<iq:product id="descentmk2s"/> <iq:product id="descentmk2s" />
<iq:product id="edge1030"/> <iq:product id="edge1030" />
<iq:product id="edge1030bontrager"/> <iq:product id="edge1030bontrager" />
<iq:product id="edge1030plus"/> <iq:product id="edge1030plus" />
<iq:product id="edge1040"/> <iq:product id="edge1040" />
<iq:product id="edge520plus"/> <iq:product id="edge520plus" />
<iq:product id="edge530"/> <iq:product id="edge530" />
<iq:product id="edge820"/> <iq:product id="edge820" />
<iq:product id="edge830"/> <iq:product id="edge830" />
<iq:product id="edgeexplore"/> <iq:product id="edgeexplore" />
<iq:product id="edgeexplore2"/> <iq:product id="edgeexplore2" />
<iq:product id="enduro"/> <iq:product id="enduro" />
<iq:product id="epix2"/> <iq:product id="epix2" />
<iq:product id="epix2pro42mm"/> <iq:product id="epix2pro42mm" />
<iq:product id="epix2pro47mm"/> <iq:product id="epix2pro47mm" />
<iq:product id="epix2pro51mm"/> <iq:product id="epix2pro51mm" />
<iq:product id="fenix5"/> <iq:product id="fenix5" />
<iq:product id="fenix5plus"/> <iq:product id="fenix5plus" />
<iq:product id="fenix5s"/> <iq:product id="fenix5s" />
<iq:product id="fenix5splus"/> <iq:product id="fenix5splus" />
<iq:product id="fenix5x"/> <iq:product id="fenix5x" />
<iq:product id="fenix5xplus"/> <iq:product id="fenix5xplus" />
<iq:product id="fenix6"/> <iq:product id="fenix6" />
<iq:product id="fenix6pro"/> <iq:product id="fenix6pro" />
<iq:product id="fenix6s"/> <iq:product id="fenix6s" />
<iq:product id="fenix6spro"/> <iq:product id="fenix6spro" />
<iq:product id="fenix6xpro"/> <iq:product id="fenix6xpro" />
<iq:product id="fenix7"/> <iq:product id="fenix7" />
<iq:product id="fenix7pro"/> <iq:product id="fenix7pro" />
<iq:product id="fenix7pronowifi"/> <iq:product id="fenix7pronowifi" />
<iq:product id="fenix7s"/> <iq:product id="fenix7s" />
<iq:product id="fenix7spro"/> <iq:product id="fenix7spro" />
<iq:product id="fenix7x"/> <iq:product id="fenix7x" />
<iq:product id="fenix7xpro"/> <iq:product id="fenix7xpro" />
<iq:product id="fenix7xpronowifi"/> <iq:product id="fenix7xpronowifi" />
<iq:product id="fenixchronos"/> <iq:product id="fenixchronos" />
<iq:product id="fr245"/> <iq:product id="fr245" />
<iq:product id="fr245m"/> <iq:product id="fr245m" />
<iq:product id="fr255"/> <iq:product id="fr255" />
<iq:product id="fr255m"/> <iq:product id="fr255m" />
<iq:product id="fr255s"/> <iq:product id="fr255s" />
<iq:product id="fr255sm"/> <iq:product id="fr255sm" />
<iq:product id="fr265"/> <iq:product id="fr265" />
<iq:product id="fr265s"/> <iq:product id="fr265s" />
<iq:product id="fr55"/> <iq:product id="fr55" />
<iq:product id="fr645"/> <iq:product id="fr645" />
<iq:product id="fr645m"/> <iq:product id="fr645m" />
<iq:product id="fr745"/> <iq:product id="fr745" />
<iq:product id="fr935"/> <iq:product id="fr935" />
<iq:product id="fr945"/> <iq:product id="fr945" />
<iq:product id="fr945lte"/> <iq:product id="fr945lte" />
<iq:product id="fr955"/> <iq:product id="fr955" />
<iq:product id="fr965"/> <iq:product id="fr965" />
<iq:product id="gpsmap67"/> <iq:product id="gpsmap67" />
<iq:product id="instinct2"/> <iq:product id="instinct2" />
<iq:product id="instinct2s"/> <iq:product id="instinct2s" />
<iq:product id="instinct2x"/> <iq:product id="instinct2x" />
<iq:product id="instinctcrossover"/> <iq:product id="instinctcrossover" />
<iq:product id="legacyherocaptainmarvel"/> <iq:product id="legacyherocaptainmarvel" />
<iq:product id="legacyherofirstavenger"/> <iq:product id="legacyherofirstavenger" />
<iq:product id="legacysagadarthvader"/> <iq:product id="legacysagadarthvader" />
<iq:product id="legacysagarey"/> <iq:product id="legacysagarey" />
<iq:product id="marq2"/> <iq:product id="marq2" />
<iq:product id="marq2aviator"/> <iq:product id="marq2aviator" />
<iq:product id="marqadventurer"/> <iq:product id="marqadventurer" />
<iq:product id="marqathlete"/> <iq:product id="marqathlete" />
<iq:product id="marqaviator"/> <iq:product id="marqaviator" />
<iq:product id="marqcaptain"/> <iq:product id="marqcaptain" />
<iq:product id="marqcommander"/> <iq:product id="marqcommander" />
<iq:product id="marqdriver"/> <iq:product id="marqdriver" />
<iq:product id="marqexpedition"/> <iq:product id="marqexpedition" />
<iq:product id="marqgolfer"/> <iq:product id="marqgolfer" />
<iq:product id="montana7xx"/> <iq:product id="montana7xx" />
<iq:product id="venu"/> <iq:product id="venu" />
<iq:product id="venu2"/> <iq:product id="venu2" />
<iq:product id="venu2plus"/> <iq:product id="venu2plus" />
<iq:product id="venu2s"/> <iq:product id="venu2s" />
<iq:product id="venu3"/> <iq:product id="venu3" />
<iq:product id="venu3s"/> <iq:product id="venu3s" />
<iq:product id="venud"/> <iq:product id="venud" />
<iq:product id="venusq"/> <iq:product id="venusq" />
<iq:product id="venusq2"/> <iq:product id="venusq2" />
<iq:product id="venusq2m"/> <iq:product id="venusq2m" />
<iq:product id="venusqm"/> <iq:product id="venusqm" />
<iq:product id="vivoactive3"/> <iq:product id="vivoactive3" />
<iq:product id="vivoactive3m"/> <iq:product id="vivoactive3m" />
<iq:product id="vivoactive3mlte"/> <iq:product id="vivoactive3mlte" />
<iq:product id="vivoactive4"/> <iq:product id="vivoactive4" />
<iq:product id="vivoactive4s"/> <iq:product id="vivoactive4s" />
<iq:product id="vivoactive5"/> <iq:product id="vivoactive5" />
</iq:products> </iq:products>
<!-- <!--
Use "Monkey C: Edit Permissions" from the Visual Studio Code command Use "Monkey C: Edit Permissions" from the Visual Studio Code command
palette to update permissions. palette to update permissions.
--> -->
<iq:permissions> <iq:permissions>
<iq:uses-permission id="Background"/> <iq:uses-permission id="Background" />
<iq:uses-permission id="BluetoothLowEnergy"/> <iq:uses-permission id="BluetoothLowEnergy" />
<iq:uses-permission id="Communications"/> <iq:uses-permission id="Communications" />
<iq:uses-permission id="Positioning" />
</iq:permissions> </iq:permissions>
<!-- <!--
Use "Monkey C: Edit Languages" from the Visual Studio Code command Use "Monkey C: Edit Languages" from the Visual Studio Code command
@ -196,6 +199,6 @@
Use "Monkey C: Configure Monkey Barrel" from the Visual Studio Code Use "Monkey C: Configure Monkey Barrel" from the Visual Studio Code
command palette to edit the included barrels. command palette to edit the included barrels.
--> -->
<iq:barrels/> <iq:barrels />
</iq:application> </iq:application>
</iq:manifest> </iq:manifest>

View File

@ -38,12 +38,43 @@ class BackgroundServiceDelegate extends System.ServiceDelegate {
} }
function onTemporalEvent() as Void { function onTemporalEvent() as Void {
if (! System.getDeviceSettings().phoneConnected) { if (!System.getDeviceSettings().phoneConnected) {
// System.println("BackgroundServiceDelegate onTemporalEvent(): No Phone connection, skipping API call."); // System.println("BackgroundServiceDelegate onTemporalEvent(): No Phone connection, skipping API call.");
} else if (! System.getDeviceSettings().connectionAvailable) { } else if (!System.getDeviceSettings().connectionAvailable) {
// System.println("BackgroundServiceDelegate onTemporalEvent(): No Internet connection, skipping API call."); // System.println("BackgroundServiceDelegate onTemporalEvent(): No Internet connection, skipping API call.");
} else { } else {
// System.println("BackgroundServiceDelegate onTemporalEvent(): Making API call.");
var position = Position.getInfo();
// System.println("BackgroundServiceDelegate onTemporalEvent(): gps: " + position.position.toDegrees());
// System.println("BackgroundServiceDelegate onTemporalEvent(): speed: " + position.speed);
// System.println("BackgroundServiceDelegate onTemporalEvent(): course: " + position.heading + "rad (" + (position.heading * 180 / Math.PI) + "°)");
// System.println("BackgroundServiceDelegate onTemporalEvent(): altitude: " + position.altitude);
// System.println("BackgroundServiceDelegate onTemporalEvent(): battery: " + System.getSystemStats().battery);
// System.println("BackgroundServiceDelegate onTemporalEvent(): charging: " + System.getSystemStats().charging);
// System.println("BackgroundServiceDelegate onTemporalEvent(): activity: " + Activity.getProfileInfo().name);
// Don't use Settings.* here as the object lasts < 30 secs and is recreated each time the background service is run // Don't use Settings.* here as the object lasts < 30 secs and is recreated each time the background service is run
Communications.makeWebRequest(
(Properties.getValue("api_url") as Lang.String) + "/webhook/" + (Properties.getValue("webhook_id") as Lang.String),
{
"type" => "update_location",
"data" => {
"gps" => position.position.toDegrees(),
"gps_accuracy" => 10,
"speed" => Math.round(position.speed),
"course" => Math.round(position.heading * 180 / Math.PI),
"altitude" => Math.round(position.altitude),
}
},
{
:method => Communications.HTTP_REQUEST_METHOD_POST,
:headers => {
"Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON
},
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
},
method(:onReturnBatteryUpdate)
);
Communications.makeWebRequest( Communications.makeWebRequest(
(Properties.getValue("api_url") as Lang.String) + "/webhook/" + (Properties.getValue("webhook_id") as Lang.String), (Properties.getValue("api_url") as Lang.String) + "/webhook/" + (Properties.getValue("webhook_id") as Lang.String),
{ {
@ -58,6 +89,11 @@ class BackgroundServiceDelegate extends System.ServiceDelegate {
"state" => System.getSystemStats().charging, "state" => System.getSystemStats().charging,
"type" => "binary_sensor", "type" => "binary_sensor",
"unique_id" => "battery_is_charging" "unique_id" => "battery_is_charging"
},
{
"state" => Activity.getProfileInfo().name,
"type" => "sensor",
"unique_id" => "activity"
} }
] ]
}, },

View File

@ -62,10 +62,12 @@ class WebhookManager {
ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String + "\n" + WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound) as Lang.String); ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String + "\n" + WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound) as Lang.String);
break; break;
case 200:
case 201: case 201:
var id = data.get("webhook_id") as Lang.String or Null; var id = data.get("webhook_id") as Lang.String or Null;
if (id != null) { if (id != null) {
Settings.setWebhookId(id); Settings.setWebhookId(id);
// System.println("WebhookManager onReturnRegisterWebhookSensor(): Registering first sensor: Battery Level");
registerWebhookSensor({ registerWebhookSensor({
"device_class" => "battery", "device_class" => "battery",
"name" => "Battery Level", "name" => "Battery Level",
@ -76,16 +78,7 @@ class WebhookManager {
"state_class" => "measurement", "state_class" => "measurement",
"entity_category" => "diagnostic", "entity_category" => "diagnostic",
"disabled" => false "disabled" => false
}); }, 0);
registerWebhookSensor({
"device_class" => "battery_charging",
"name" => "Battery is Charging",
"state" => System.getSystemStats().charging,
"type" => "binary_sensor",
"unique_id" => "battery_is_charging",
"entity_category" => "diagnostic",
"disabled" => false
});
} else { } else {
// System.println("WebhookManager onReturnRequestWebhookId(): No webhook id in response data."); // System.println("WebhookManager onReturnRequestWebhookId(): No webhook id in response data.");
Settings.unsetIsBatteryLevelEnabled(); Settings.unsetIsBatteryLevelEnabled();
@ -129,7 +122,7 @@ class WebhookManager {
); );
} }
function onReturnRegisterWebhookSensor(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void { function onReturnRegisterWebhookSensor(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String, step as Lang.Number) as Void {
switch (responseCode) { switch (responseCode) {
case Communications.BLE_HOST_TIMEOUT: case Communications.BLE_HOST_TIMEOUT:
case Communications.BLE_CONNECTION_UNAVAILABLE: case Communications.BLE_CONNECTION_UNAVAILABLE:
@ -155,6 +148,7 @@ class WebhookManager {
Settings.unsetWebhookId(); Settings.unsetWebhookId();
// Ignore and see if we can carry on // Ignore and see if we can carry on
break; break;
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE: case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
// System.println("WebhookManager onReturnRegisterWebhookSensor() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned."); // System.println("WebhookManager onReturnRegisterWebhookSensor() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
Settings.unsetWebhookId(); Settings.unsetWebhookId();
@ -169,12 +163,37 @@ class WebhookManager {
ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String + "\n" + WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound) as Lang.String); ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String + "\n" + WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound) as Lang.String);
break; break;
case 200:
case 201: case 201:
if ((data.get("success") as Lang.Boolean or Null) != true) { if ((data.get("success") as Lang.Boolean or Null) != false) {
// When uncommenting, invert the condition above. // System.println("WebhookManager onReturnRegisterWebhookSensor(): Success");
// System.println("WebhookManager onReturnRegisterWebhookSensor(): Success"); switch (step) {
// } else { case 0:
// System.println("WebhookManager onReturnRegisterWebhookSensor(): Failure"); // System.println("WebhookManager onReturnRegisterWebhookSensor(): Registering next sensor: Battery is Charging");
registerWebhookSensor({
"device_class" => "battery_charging",
"name" => "Battery is Charging",
"state" => System.getSystemStats().charging,
"type" => "binary_sensor",
"unique_id" => "battery_is_charging",
"entity_category" => "diagnostic",
"disabled" => false
}, 1);
break;
case 1:
// System.println("WebhookManager onReturnRegisterWebhookSensor(): Registering next sensor: Activity");
registerWebhookSensor({
"name" => "Activity",
"state" => Activity.getProfileInfo().name,
"type" => "sensor",
"unique_id" => "activity",
"disabled" => false
}, 2);
break;
default:
}
} else {
// System.println("WebhookManager onReturnRegisterWebhookSensor(): Failure");
Settings.unsetWebhookId(); Settings.unsetWebhookId();
Settings.unsetIsBatteryLevelEnabled(); Settings.unsetIsBatteryLevelEnabled();
ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String); ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String);
@ -189,7 +208,7 @@ class WebhookManager {
} }
} }
function registerWebhookSensor(sensor as Lang.Object) { function registerWebhookSensor(sensor as Lang.Object, step as Lang.Number) {
// System.println("WebhookManager registerWebhookSensor(): Registering webhook sensor: " + sensor.toString()); // System.println("WebhookManager registerWebhookSensor(): Registering webhook sensor: " + sensor.toString());
Communications.makeWebRequest( Communications.makeWebRequest(
Settings.getApiUrl() + "/webhook/" + Settings.getWebhookId(), Settings.getApiUrl() + "/webhook/" + Settings.getWebhookId(),
@ -202,7 +221,8 @@ class WebhookManager {
:headers => { :headers => {
"Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON
}, },
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON,
:context => step
}, },
method(:onReturnRegisterWebhookSensor) method(:onReturnRegisterWebhookSensor)
); );