Clone pyezviz from https://github.com/BaQs/pyEzviz
This commit is contained in:
@@ -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())
|
||||
Reference in New Issue
Block a user