You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
309 lines
10 KiB
309 lines
10 KiB
"""pyezviz command line.""" |
|
import argparse |
|
import http.client |
|
import json |
|
import logging |
|
import sys |
|
|
|
import pandas |
|
from pyezviz import EzvizCamera, EzvizClient, MQTTClient |
|
from pyezviz.constants import DefenseModeType |
|
|
|
|
|
def main(): |
|
"""Initiate arg parser.""" |
|
parser = argparse.ArgumentParser(prog="pyezviz") |
|
parser.add_argument("-u", "--username", required=True, help="Ezviz username") |
|
parser.add_argument("-p", "--password", required=True, help="Ezviz Password") |
|
parser.add_argument( |
|
"-r", |
|
"--region", |
|
required=False, |
|
default="apiieu.ezvizlife.com", |
|
help="Ezviz API region", |
|
) |
|
parser.add_argument( |
|
"--debug", "-d", action="store_true", help="Print debug messages to stderr" |
|
) |
|
|
|
subparsers = parser.add_subparsers(dest="action") |
|
|
|
parser_device = subparsers.add_parser( |
|
"devices", help="Play with all devices at once" |
|
) |
|
parser_device.add_argument( |
|
"device_action", |
|
type=str, |
|
default="status", |
|
help="Device action to perform", |
|
choices=["device", "status", "switch", "connection"], |
|
) |
|
|
|
parser_home_defence_mode = subparsers.add_parser( |
|
"home_defence_mode", help="Set home defence mode" |
|
) |
|
|
|
parser_mqtt = subparsers.add_parser("mqtt", help="Set home defence mode") |
|
|
|
parser_home_defence_mode.add_argument( |
|
"--mode", required=False, help="Choose mode", choices=["HOME_MODE", "AWAY_MODE"] |
|
) |
|
|
|
parser_camera = subparsers.add_parser("camera", help="Camera actions") |
|
parser_camera.add_argument("--serial", required=True, help="camera SERIAL") |
|
|
|
subparsers_camera = parser_camera.add_subparsers(dest="camera_action") |
|
|
|
parser_camera_status = subparsers_camera.add_parser( |
|
"status", help="Get the status of the camera" |
|
) |
|
parser_camera_move = subparsers_camera.add_parser("move", help="Move the camera") |
|
parser_camera_move.add_argument( |
|
"--direction", |
|
required=True, |
|
help="Direction to move the camera to", |
|
choices=["up", "down", "right", "left"], |
|
) |
|
parser_camera_move.add_argument( |
|
"--speed", |
|
required=False, |
|
help="Speed of the movement", |
|
default=5, |
|
type=int, |
|
choices=range(1, 10), |
|
) |
|
|
|
parser_camera_switch = subparsers_camera.add_parser( |
|
"switch", help="Change the status of a switch" |
|
) |
|
parser_camera_switch.add_argument( |
|
"--switch", |
|
required=True, |
|
help="Switch to switch", |
|
choices=["audio", "ir", "state", "privacy", "sleep", "follow_move"], |
|
) |
|
parser_camera_switch.add_argument( |
|
"--enable", |
|
required=False, |
|
help="Enable (or not)", |
|
default=1, |
|
type=int, |
|
choices=[0, 1], |
|
) |
|
|
|
parser_camera_alarm = subparsers_camera.add_parser( |
|
"alarm", help="Configure the camera alarm" |
|
) |
|
parser_camera_alarm.add_argument( |
|
"--notify", required=False, help="Enable (or not)", type=int, choices=[0, 1] |
|
) |
|
parser_camera_alarm.add_argument( |
|
"--sound", |
|
required=False, |
|
help="Sound level (2 is silent, 1 intensive, 0 soft)", |
|
type=int, |
|
choices=[0, 1, 2], |
|
) |
|
parser_camera_alarm.add_argument( |
|
"--sensibility", |
|
required=False, |
|
help="Sensibility level (Non-Cameras = from 1 to 6) or (Cameras = 1 to 100)", |
|
type=int, |
|
choices=range(0, 100), |
|
) |
|
parser_camera_alarm.add_argument( |
|
"--schedule", required=False, help="Schedule in json format *test*", type=str |
|
) |
|
|
|
args = parser.parse_args() |
|
|
|
# print("--------------args") |
|
# print("--------------args: %s",args) |
|
# print("--------------args") |
|
|
|
client = EzvizClient(args.username, args.password, args.region) |
|
|
|
if args.debug: |
|
|
|
http.client.HTTPConnection.debuglevel = 5 |
|
# You must initialize logging, otherwise you'll not see debug output. |
|
logging.basicConfig() |
|
logging.getLogger().setLevel(logging.DEBUG) |
|
requests_log = logging.getLogger("requests.packages.urllib3") |
|
requests_log.setLevel(logging.DEBUG) |
|
requests_log.propagate = True |
|
|
|
if args.action == "devices": |
|
|
|
if args.device_action == "device": |
|
try: |
|
client.login() |
|
print(json.dumps(client.get_device(), indent=2)) |
|
except Exception as exp: # pylint: disable=broad-except |
|
print(exp) |
|
finally: |
|
client.close_session() |
|
|
|
elif args.device_action == "status": |
|
try: |
|
client.login() |
|
print( |
|
pandas.DataFrame(client.load_cameras()).to_string( |
|
columns=[ |
|
"serial", |
|
"name", |
|
# version, |
|
# upgrade_available, |
|
"status", |
|
"device_category", |
|
"device_sub_category", |
|
"sleep", |
|
"privacy", |
|
"audio", |
|
"ir_led", |
|
"state_led", |
|
# follow_move, |
|
# alarm_notify, |
|
# alarm_schedules_enabled, |
|
# alarm_sound_mod, |
|
# encrypted, |
|
"local_ip", |
|
"local_rtsp_port", |
|
"detection_sensibility", |
|
"battery_level", |
|
"alarm_schedules_enabled", |
|
"alarm_notify", |
|
"Motion_Trigger", |
|
# last_alarm_time, |
|
# last_alarm_pic |
|
] |
|
) |
|
) |
|
except Exception as exp: # pylint: disable=broad-except |
|
print(exp) |
|
finally: |
|
client.close_session() |
|
|
|
elif args.device_action == "switch": |
|
try: |
|
client.login() |
|
print(json.dumps(client.get_switch(), indent=2)) |
|
except Exception as exp: # pylint: disable=broad-except |
|
print(exp) |
|
finally: |
|
client.close_session() |
|
|
|
elif args.device_action == "connection": |
|
try: |
|
client.login() |
|
print(json.dumps(client.get_connection(), indent=2)) |
|
except Exception as exp: # pylint: disable=broad-except |
|
print(exp) |
|
finally: |
|
client.close_session() |
|
|
|
else: |
|
print("Action not implemented: %s", args.device_action) |
|
|
|
elif args.action == "home_defence_mode": |
|
|
|
if args.mode: |
|
try: |
|
client.login() |
|
print( |
|
json.dumps( |
|
client.api_set_defence_mode( |
|
getattr(DefenseModeType, args.mode).value |
|
), |
|
indent=2, |
|
) |
|
) |
|
except Exception as exp: # pylint: disable=broad-except |
|
print(exp) |
|
finally: |
|
client.close_session() |
|
|
|
elif args.action == "mqtt": |
|
|
|
try: |
|
token = client.login() |
|
mqtt = MQTTClient(token) |
|
mqtt.start() |
|
|
|
except Exception as exp: # pylint: disable=broad-except |
|
print(exp) |
|
finally: |
|
client.close_session() |
|
|
|
elif args.action == "camera": |
|
|
|
# load camera object |
|
try: |
|
client.login() |
|
camera = EzvizCamera(client, args.serial) |
|
logging.debug("Camera loaded") |
|
except Exception as exp: # pylint: disable=broad-except |
|
print(exp) |
|
client.close_session() |
|
|
|
if args.camera_action == "move": |
|
try: |
|
camera.move(args.direction, args.speed) |
|
except Exception as exp: # pylint: disable=broad-except |
|
print(exp) |
|
finally: |
|
client.close_session() |
|
|
|
elif args.camera_action == "status": |
|
try: |
|
print(json.dumps(camera.status(), indent=2)) |
|
|
|
except Exception as exp: # pylint: disable=broad-except |
|
print(exp) |
|
finally: |
|
client.close_session() |
|
|
|
elif args.camera_action == "switch": |
|
try: |
|
if args.switch == "ir": |
|
camera.switch_device_ir_led(args.enable) |
|
elif args.switch == "state": |
|
print(args.enable) |
|
camera.switch_device_state_led(args.enable) |
|
elif args.switch == "audio": |
|
camera.switch_device_audio(args.enable) |
|
elif args.switch == "privacy": |
|
camera.switch_privacy_mode(args.enable) |
|
elif args.switch == "sleep": |
|
camera.switch_sleep_mode(args.enable) |
|
elif args.switch == "follow_move": |
|
camera.switch_follow_move(args.enable) |
|
except Exception as exp: # pylint: disable=broad-except |
|
print(exp) |
|
finally: |
|
client.close_session() |
|
|
|
elif args.camera_action == "alarm": |
|
try: |
|
if args.sound is not None: |
|
camera.alarm_sound(args.sound) |
|
if args.notify is not None: |
|
camera.alarm_notify(args.notify) |
|
if args.sensibility is not None: |
|
camera.alarm_detection_sensibility(args.sensibility) |
|
if args.schedule is not None: |
|
camera.change_defence_schedule(args.schedule) |
|
except Exception as exp: # pylint: disable=broad-except |
|
print(exp) |
|
finally: |
|
client.close_session() |
|
|
|
else: |
|
print("Action not implemented, try running with -h switch for help") |
|
|
|
else: |
|
print("Action not implemented: %s", args.action) |
|
|
|
|
|
if __name__ == "__main__": |
|
sys.exit(main())
|
|
|