This commit is contained in:
2021-10-06 21:27:35 -06:00
parent 2059073f80
commit c8bc300077
9 changed files with 2152 additions and 0 deletions
+309
View File
@@ -0,0 +1,309 @@
"""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())