Skip to content

Commit 11c4108

Browse files
committed
tools: cloud: device: KV update schedule
Add a command line tool to schedule a KV entry update for a single device. Signed-off-by: Jordan Yates <jordan@embeint.com>
1 parent 2bfcefd commit 11c4108

1 file changed

Lines changed: 30 additions & 1 deletion

File tree

src/infuse_iot/tools/cloud.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
from infuse_iot.api_client.api.coap import get_coap_files
3434
from infuse_iot.api_client.api.device import (
3535
create_device_application_update_by_device_id,
36+
create_device_kv_entry_update_by_device_id_and_key_id,
3637
get_device_application_state_by_device_id,
3738
get_device_application_updates_by_device_id,
3839
get_device_by_device_id,
@@ -49,7 +50,7 @@
4950
from infuse_iot.api_client.types import File, Unset
5051
from infuse_iot.commands import InfuseCommand
5152
from infuse_iot.credentials import get_api_key
52-
from infuse_iot.util.argparse import InfuseDeviceId, ValidRelease
53+
from infuse_iot.util.argparse import HexString, InfuseDeviceId, ValidRelease
5354
from infuse_iot.util.console import choose_one, user_confirm, user_response
5455
from infuse_iot.util.version import Version
5556

@@ -200,6 +201,12 @@ def add_parser(cls, parser):
200201
"--base64", action="store_true", help="Display values as base64 strings instead of decoding"
201202
)
202203

204+
kv_update = tool_parser.add_parser("kv_update", help="Key-Value update")
205+
kv_update.set_defaults(command_fn=cls.kv_update)
206+
kv_update.add_argument("--id", type=InfuseDeviceId, required=True, help="Infuse-IoT device ID")
207+
kv_update.add_argument("--key", "-k", type=int, required=True, help="Key ID to update")
208+
kv_update.add_argument("--val", "-v", type=HexString, required=True, help="Key value as a hex string")
209+
203210
dfu_parser = tool_parser.add_parser("dfu", help="Manage device firmware upgrades")
204211
dfu_parser.set_defaults(command_fn=cls.dfu)
205212
dfu_parser.add_argument("--id", type=InfuseDeviceId, required=True, help="Infuse-IoT device ID")
@@ -333,6 +340,28 @@ def kv_state(self, client: Client):
333340

334341
print(tabulate(table))
335342

343+
def kv_update(self, client: Client):
344+
id_str = f"{self.args.id:016x}"
345+
346+
val_encoded = base64.b64encode(self.args.val).decode("utf-8")
347+
update = models.NewDeviceKVEntryUpdate(data=val_encoded)
348+
349+
rsp = create_device_kv_entry_update_by_device_id_and_key_id.sync(
350+
client=client,
351+
device_id=id_str,
352+
key_id=self.args.key,
353+
body=update,
354+
)
355+
if rsp is None:
356+
sys.exit("KV update: No response")
357+
elif isinstance(rsp, models.Error):
358+
sys.exit(f"<{rsp.code}>: {rsp.message}")
359+
elif isinstance(rsp, models.DeviceKVEntry):
360+
print(f"Device {id_str} key {self.args.key} already has value {self.args.val.hex()}")
361+
else:
362+
assert isinstance(rsp, models.DeviceKVEntryUpdate)
363+
print(f"Device {id_str} update scheduled with ID {rsp.id}")
364+
336365
def dfu(self, client: Client):
337366
id_str = f"{self.args.id:016x}"
338367

0 commit comments

Comments
 (0)