152 lines
4.0 KiB
Python
152 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
"""Desk lamp control CLI for Mijia devices."""
|
|
import argparse
|
|
import os
|
|
import sys
|
|
from mijiaAPI import mijiaAPI, mijiaDevice
|
|
|
|
# Get device ID from environment variable
|
|
LAMP_DID = os.environ.get("MIJIA_LAMP_DID")
|
|
|
|
if not LAMP_DID:
|
|
print("Error: MIJIA_LAMP_DID environment variable not set")
|
|
print("Please set it with: export MIJIA_LAMP_DID='your_device_id'")
|
|
sys.exit(1)
|
|
|
|
def get_lamp(api: mijiaAPI) -> mijiaDevice:
|
|
"""Get the lamp device."""
|
|
return mijiaDevice(api, did=LAMP_DID)
|
|
|
|
def cmd_on(args, api):
|
|
"""Turn on the lamp."""
|
|
lamp = get_lamp(api)
|
|
lamp.on = True
|
|
print("Lamp turned on")
|
|
|
|
def cmd_off(args, api):
|
|
"""Turn off the lamp."""
|
|
lamp = get_lamp(api)
|
|
lamp.on = False
|
|
print("Lamp turned off")
|
|
|
|
def cmd_toggle(args, api):
|
|
"""Toggle lamp power."""
|
|
lamp = get_lamp(api)
|
|
lamp.run_action('toggle')
|
|
print("Lamp toggled")
|
|
|
|
def cmd_status(args, api):
|
|
"""Show lamp status."""
|
|
lamp = get_lamp(api)
|
|
on_status = lamp.get('on')
|
|
brightness = lamp.get('brightness')
|
|
color_temp = lamp.get('color-temperature')
|
|
|
|
status = "On" if on_status else "Off"
|
|
print(f"Status: {status}")
|
|
print(f"Brightness: {brightness}%")
|
|
print(f"Color Temperature: {color_temp}K")
|
|
|
|
def cmd_brightness(args, api):
|
|
"""Set brightness."""
|
|
lamp = get_lamp(api)
|
|
lamp.brightness = args.value
|
|
print(f"Brightness set to {args.value}%")
|
|
|
|
def cmd_temp(args, api):
|
|
"""Set color temperature."""
|
|
lamp = get_lamp(api)
|
|
lamp.color_temperature = args.value
|
|
print(f"Color temperature set to {args.value}K")
|
|
|
|
def cmd_mode(args, api):
|
|
"""Set lighting mode."""
|
|
modes = {
|
|
'reading': 0,
|
|
'computer': 1,
|
|
'night': 2,
|
|
'antiblue': 3,
|
|
'work': 4,
|
|
'candle': 5,
|
|
'twinkle': 6
|
|
}
|
|
mode_names = {
|
|
0: 'Reading',
|
|
1: 'Computer',
|
|
2: 'Night Reading',
|
|
3: 'Anti-blue Light',
|
|
4: 'Work',
|
|
5: 'Candle',
|
|
6: 'Twinkle'
|
|
}
|
|
|
|
if args.value in modes:
|
|
mode_val = modes[args.value]
|
|
else:
|
|
try:
|
|
mode_val = int(args.value)
|
|
if mode_val not in mode_names:
|
|
raise ValueError()
|
|
except ValueError:
|
|
print(f"Invalid mode: {args.value}")
|
|
print("Available modes: reading, computer, night, antiblue, work, candle, twinkle (0-6)")
|
|
sys.exit(1)
|
|
|
|
lamp = get_lamp(api)
|
|
lamp.set('mode', mode_val)
|
|
print(f"Mode set to {mode_names[mode_val]}")
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description='Desk Lamp Control CLI')
|
|
subparsers = parser.add_subparsers(dest='command', help='Commands')
|
|
|
|
# on
|
|
subparsers.add_parser('on', help='Turn on the lamp')
|
|
|
|
# off
|
|
subparsers.add_parser('off', help='Turn off the lamp')
|
|
|
|
# toggle
|
|
subparsers.add_parser('toggle', help='Toggle lamp power')
|
|
|
|
# status
|
|
subparsers.add_parser('status', help='Show lamp status')
|
|
|
|
# brightness
|
|
p_brightness = subparsers.add_parser('brightness', help='Set brightness (1-100)')
|
|
p_brightness.add_argument('value', type=int, choices=range(1, 101), metavar='1-100', help='Brightness value')
|
|
|
|
# temp
|
|
p_temp = subparsers.add_parser('temp', help='Set color temperature (2700-6500K)')
|
|
p_temp.add_argument('value', type=int, help='Color temperature (2700-6500)')
|
|
|
|
# mode
|
|
p_mode = subparsers.add_parser('mode', help='Set lighting mode')
|
|
p_mode.add_argument('value', help='Mode: reading/computer/night/antiblue/work/candle/twinkle or 0-6')
|
|
|
|
args = parser.parse_args()
|
|
|
|
if not args.command:
|
|
parser.print_help()
|
|
sys.exit(1)
|
|
|
|
# Initialize API
|
|
api = mijiaAPI()
|
|
api.login()
|
|
|
|
# Execute command
|
|
cmd_map = {
|
|
'on': cmd_on,
|
|
'off': cmd_off,
|
|
'toggle': cmd_toggle,
|
|
'status': cmd_status,
|
|
'brightness': cmd_brightness,
|
|
'temp': cmd_temp,
|
|
'mode': cmd_mode
|
|
}
|
|
|
|
cmd_map[args.command](args, api)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|