06-sep: [aspiradora] pack2: vaciado, auto, stats, consumibles, potencia, agua, voz
This commit is contained in:
@@ -21,6 +21,21 @@ MAP_R2205 = {
|
|||||||
"cleaning_time": {"siid": 4, "piid": 2},
|
"cleaning_time": {"siid": 4, "piid": 2},
|
||||||
"cleaning_area": {"siid": 4, "piid": 3},
|
"cleaning_area": {"siid": 4, "piid": 3},
|
||||||
"volume": {"siid": 7, "piid": 1},
|
"volume": {"siid": 7, "piid": 1},
|
||||||
|
"voice_id": {"siid": 7, "piid": 2},
|
||||||
|
"set_voice": {"siid": 7, "aiid": 4},
|
||||||
|
"auto_collect": {"siid": 15, "piid": 1},
|
||||||
|
"start_collect": {"siid": 15, "aiid": 1},
|
||||||
|
"first_clean_time": {"siid": 12, "piid": 1},
|
||||||
|
"total_clean_time": {"siid": 12, "piid": 2},
|
||||||
|
"total_clean_times": {"siid": 12, "piid": 3},
|
||||||
|
"total_clean_area": {"siid": 12, "piid": 4},
|
||||||
|
"brush_left_time": {"siid": 9, "piid": 1},
|
||||||
|
"brush_life_level": {"siid": 9, "piid": 2},
|
||||||
|
"brush_left_time2": {"siid": 10, "piid": 1},
|
||||||
|
"brush_life_level2": {"siid": 10, "piid": 2},
|
||||||
|
"filter_life_level": {"siid": 11, "piid": 1},
|
||||||
|
"filter_left_time": {"siid": 11, "piid": 2},
|
||||||
|
"mop_mode": {"siid": 4, "piid": 5},
|
||||||
"start_clean": {"siid": 2, "aiid": 1},
|
"start_clean": {"siid": 2, "aiid": 1},
|
||||||
"stop_clean": {"siid": 4, "aiid": 2},
|
"stop_clean": {"siid": 4, "aiid": 2},
|
||||||
"pause": {"siid": 2, "aiid": 2},
|
"pause": {"siid": 2, "aiid": 2},
|
||||||
@@ -37,6 +52,7 @@ ESTADOS = {
|
|||||||
}
|
}
|
||||||
CARGAS = {1: "cargando", 2: "no cargando", 5: "volviendo a cargar"}
|
CARGAS = {1: "cargando", 2: "no cargando", 5: "volviendo a cargar"}
|
||||||
MODOS = {0: "silencioso", 1: "estándar", 2: "medio", 3: "fuerte"}
|
MODOS = {0: "silencioso", 1: "estándar", 2: "medio", 3: "fuerte"}
|
||||||
|
AGUAS = {1: "bajo", 2: "medio", 3: "alto"}
|
||||||
|
|
||||||
|
|
||||||
def _env(nombre, defecto=""):
|
def _env(nombre, defecto=""):
|
||||||
@@ -87,11 +103,53 @@ def estado():
|
|||||||
f"Area: {d.get('cleaning_area')} m2{extra}")
|
f"Area: {d.get('cleaning_area')} m2{extra}")
|
||||||
|
|
||||||
|
|
||||||
|
def _get(vac, nombre):
|
||||||
|
d = vac.status().data
|
||||||
|
return d.get(nombre)
|
||||||
|
|
||||||
|
|
||||||
|
def stats():
|
||||||
|
vac = conectar()
|
||||||
|
d = vac.status().data
|
||||||
|
return (f"📊 <b>Estadísticas Dreame</b>\n"
|
||||||
|
f"Limpiezas totales: <b>{d.get('total_clean_times')}</b>\n"
|
||||||
|
f"Tiempo total: <b>{d.get('total_clean_time')} min</b>\n"
|
||||||
|
f"Area total: <b>{d.get('total_clean_area')} m2</b>")
|
||||||
|
|
||||||
|
|
||||||
|
def consumibles():
|
||||||
|
vac = conectar()
|
||||||
|
d = vac.status().data
|
||||||
|
return (f"🔧 <b>Consumibles</b>\n"
|
||||||
|
f"Cepillo: <b>{d.get('brush_life_level')}%</b> "
|
||||||
|
f"({d.get('brush_left_time')}h restantes)\n"
|
||||||
|
f"Lateral: <b>{d.get('brush_life_level2')}%</b> "
|
||||||
|
f"({d.get('brush_left_time2')}h restantes)\n"
|
||||||
|
f"Filtro: <b>{d.get('filter_life_level')}%</b> "
|
||||||
|
f"({d.get('filter_left_time')}h restantes)")
|
||||||
|
|
||||||
|
|
||||||
|
def auto_estado():
|
||||||
|
vac = conectar()
|
||||||
|
d = vac.status().data
|
||||||
|
return ("🗑️ Vaciado automático: "
|
||||||
|
f"<b>{'ON' if d.get('auto_collect') else 'OFF'}</b>")
|
||||||
|
|
||||||
|
|
||||||
|
def voz_estado():
|
||||||
|
vac = conectar()
|
||||||
|
d = vac.status().data
|
||||||
|
return (f"🔊 Voz actual: <b>{d.get('voice_id')}</b> | "
|
||||||
|
f"Volumen: <b>{d.get('volume')}</b>")
|
||||||
|
|
||||||
|
|
||||||
def main(argv):
|
def main(argv):
|
||||||
if len(argv) < 2:
|
if len(argv) < 2:
|
||||||
print("Uso: aspiradora.py estado|start|stop|home|pause|locate")
|
print("Uso: aspiradora.py estado|start|stop|home|pause|locate|"
|
||||||
|
"vaciar|auto|stats|consumibles|potencia|agua|voz")
|
||||||
return 1
|
return 1
|
||||||
cmd = argv[1].lower()
|
cmd = argv[1].lower()
|
||||||
|
arg = argv[2] if len(argv) > 2 else ""
|
||||||
try:
|
try:
|
||||||
vac = conectar()
|
vac = conectar()
|
||||||
if cmd == "estado":
|
if cmd == "estado":
|
||||||
@@ -111,8 +169,46 @@ def main(argv):
|
|||||||
elif cmd == "locate":
|
elif cmd == "locate":
|
||||||
vac.call_action("play_sound")
|
vac.call_action("play_sound")
|
||||||
print("Emitiendo sonido de localizacion.")
|
print("Emitiendo sonido de localizacion.")
|
||||||
|
elif cmd == "vaciar":
|
||||||
|
vac.call_action("start_collect")
|
||||||
|
print("Vaciando en la base.")
|
||||||
|
elif cmd == "auto":
|
||||||
|
if arg.lower() in ("on", "1"):
|
||||||
|
vac.set_property_by(15, 1, 1)
|
||||||
|
print("Vaciado automatico activado.")
|
||||||
|
elif arg.lower() in ("off", "0"):
|
||||||
|
vac.set_property_by(15, 1, 0)
|
||||||
|
print("Vaciado automatico desactivado.")
|
||||||
else:
|
else:
|
||||||
print("Uso: aspiradora.py estado|start|stop|home|pause|locate")
|
print(auto_estado().replace("<b>", "").replace("</b>", ""))
|
||||||
|
elif cmd == "stats":
|
||||||
|
print(stats().replace("<b>", "").replace("</b>", ""))
|
||||||
|
elif cmd == "consumibles":
|
||||||
|
print(consumibles().replace("<b>", "").replace("</b>", ""))
|
||||||
|
elif cmd == "potencia":
|
||||||
|
if arg.isdigit() and int(arg) in MODOS:
|
||||||
|
vac.set_property_by(4, 4, int(arg))
|
||||||
|
print(f"Potencia: {MODOS[int(arg)]}.")
|
||||||
|
else:
|
||||||
|
d = vac.status().data
|
||||||
|
print(f"Potencia actual: {MODOS.get(d.get('cleaning_mode'))} "
|
||||||
|
f"(0-3).")
|
||||||
|
elif cmd == "agua":
|
||||||
|
if arg.isdigit() and int(arg) in AGUAS:
|
||||||
|
vac.set_property_by(4, 5, int(arg))
|
||||||
|
print(f"Agua: {AGUAS[int(arg)]}.")
|
||||||
|
else:
|
||||||
|
d = vac.status().data
|
||||||
|
print(f"Agua actual: {AGUAS.get(d.get('mop_mode'))} (1-3).")
|
||||||
|
elif cmd == "voz":
|
||||||
|
if arg:
|
||||||
|
vac.set_voice(arg)
|
||||||
|
print(f"Voz cambiada a {arg} (si el pack existe).")
|
||||||
|
else:
|
||||||
|
print(voz_estado().replace("<b>", "").replace("</b>", ""))
|
||||||
|
else:
|
||||||
|
print("Uso: aspiradora.py estado|start|stop|home|pause|locate|"
|
||||||
|
"vaciar|auto|stats|consumibles|potencia|agua|voz")
|
||||||
return 1
|
return 1
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"ERROR: {e}")
|
print(f"ERROR: {e}")
|
||||||
|
|||||||
@@ -130,10 +130,32 @@ def teclado_aspi():
|
|||||||
_btn("⏸️ Pausar", PREFIJO + "acc:aspiradora:pause"),
|
_btn("⏸️ Pausar", PREFIJO + "acc:aspiradora:pause"),
|
||||||
_btn("🏠 A la base", PREFIJO + "acc:aspiradora:home"),
|
_btn("🏠 A la base", PREFIJO + "acc:aspiradora:home"),
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
_btn("🗑️ Vaciar", PREFIJO + "acc:aspiradora:vaciar"),
|
||||||
|
_btn("📊 Stats", PREFIJO + "acc:aspiradora:stats"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
_btn("⚡ Potencia…", PREFIJO + "cat:potencia"),
|
||||||
|
_btn("🔧 Consumibles", PREFIJO + "acc:aspiradora:consumibles"),
|
||||||
|
],
|
||||||
[_btn("⬅️ Domótica", PREFIJO + "cat:domotica")],
|
[_btn("⬅️ Domótica", PREFIJO + "cat:domotica")],
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
def teclado_potencia():
|
||||||
|
return _mk([
|
||||||
|
[
|
||||||
|
_btn("🔈 Silencioso", PREFIJO + "acc:potencia:0"),
|
||||||
|
_btn("🔉 Estándar", PREFIJO + "acc:potencia:1"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
_btn("🔊 Medio", PREFIJO + "acc:potencia:2"),
|
||||||
|
_btn("📢 Fuerte", PREFIJO + "acc:potencia:3"),
|
||||||
|
],
|
||||||
|
[_btn("⬅️ Aspiradora", PREFIJO + "cat:aspi")],
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
def teclado_termo():
|
def teclado_termo():
|
||||||
return _mk([
|
return _mk([
|
||||||
[
|
[
|
||||||
@@ -351,6 +373,7 @@ def _header(categoria):
|
|||||||
"parental": "👪 <b>Control parental</b>",
|
"parental": "👪 <b>Control parental</b>",
|
||||||
"domotica": "🏠 <b>Domótica</b>",
|
"domotica": "🏠 <b>Domótica</b>",
|
||||||
"aspi": "🤖 <b>Aspiradora</b>",
|
"aspi": "🤖 <b>Aspiradora</b>",
|
||||||
|
"potencia": "⚡ <b>Potencia aspiradora</b>",
|
||||||
"termo": "🔌 <b>Termo</b>",
|
"termo": "🔌 <b>Termo</b>",
|
||||||
"sistema": "🛠️ <b>Sistema</b>",
|
"sistema": "🛠️ <b>Sistema</b>",
|
||||||
"router": "📡 <b>Router ASUS</b>",
|
"router": "📡 <b>Router ASUS</b>",
|
||||||
@@ -394,6 +417,7 @@ def _teclado_categoria(chat_id, categoria):
|
|||||||
"parental": teclado_parental,
|
"parental": teclado_parental,
|
||||||
"domotica": teclado_domotica,
|
"domotica": teclado_domotica,
|
||||||
"aspi": teclado_aspi,
|
"aspi": teclado_aspi,
|
||||||
|
"potencia": teclado_potencia,
|
||||||
"termo": teclado_termo,
|
"termo": teclado_termo,
|
||||||
"sistema": teclado_sistema,
|
"sistema": teclado_sistema,
|
||||||
"router": teclado_router,
|
"router": teclado_router,
|
||||||
@@ -575,14 +599,19 @@ def _ejecutar_accion(chat_id, message_id, partes):
|
|||||||
_fin_accion(chat_id, "termo")
|
_fin_accion(chat_id, "termo")
|
||||||
return
|
return
|
||||||
if accion == "aspiradora":
|
if accion == "aspiradora":
|
||||||
if sub in ("estado", "start", "stop", "home", "pause", "locate"):
|
if sub in ("estado", "stats", "consumibles"):
|
||||||
if sub == "estado":
|
_reabrir(chat_id, message_id, "aspi", f"aspiradora {sub}")
|
||||||
_reabrir(chat_id, message_id, "aspi", "aspiradora estado")
|
elif sub in ("start", "stop", "home", "pause", "locate", "vaciar"):
|
||||||
else:
|
|
||||||
pi_bot.procesar(f"aspiradora {sub}", chat_id)
|
pi_bot.procesar(f"aspiradora {sub}", chat_id)
|
||||||
_cerrar_menu(chat_id, message_id)
|
_cerrar_menu(chat_id, message_id)
|
||||||
_fin_accion(chat_id, "aspi")
|
_fin_accion(chat_id, "aspi")
|
||||||
return
|
return
|
||||||
|
if accion == "potencia":
|
||||||
|
if sub.isdigit() and int(sub) in (0, 1, 2, 3):
|
||||||
|
pi_bot.procesar(f"aspiradora potencia {sub}", chat_id)
|
||||||
|
_cerrar_menu(chat_id, message_id)
|
||||||
|
_fin_accion(chat_id, "aspi")
|
||||||
|
return
|
||||||
if accion == "tablets":
|
if accion == "tablets":
|
||||||
if sub in ("bloquear", "desbloquear"):
|
if sub in ("bloquear", "desbloquear"):
|
||||||
verbo = "desactivar" if sub == "bloquear" else "activar"
|
verbo = "desactivar" if sub == "bloquear" else "activar"
|
||||||
|
|||||||
@@ -811,8 +811,8 @@ def procesar(texto, chat_id):
|
|||||||
"<b>10.</b> <code>termo on|off|estado</code> — controla el enchufe Tapo\n"
|
"<b>10.</b> <code>termo on|off|estado</code> — controla el enchufe Tapo\n"
|
||||||
" ✏️ Ej: <code>/termo estado</code>\n\n"
|
" ✏️ Ej: <code>/termo estado</code>\n\n"
|
||||||
"━━━ 🏠 DOMÓTICA ━━━\n"
|
"━━━ 🏠 DOMÓTICA ━━━\n"
|
||||||
"<b>10b.</b> <code>aspiradora estado|start|stop|home|pause|locate</code> — Dreame D10 Plus\n"
|
"<b>10b.</b> <code>aspiradora ...</code> — Dreame D10 Plus\n"
|
||||||
" ✏️ Ej: <code>/aspiradora estado</code>\n\n"
|
" ✏️ Ej: <code>/aspiradora estado</code>, <code>/aspiradora vaciar</code>, <code>/aspiradora stats</code>, <code>/aspiradora potencia 3</code>, <code>/aspiradora agua 2</code>, <code>/aspiradora voz</code>\n\n"
|
||||||
"━━━ 📺 TV ━━━\n"
|
"━━━ 📺 TV ━━━\n"
|
||||||
"<b>11.</b> <code>tv <mensaje></code> — mensaje rápido a la tele\n"
|
"<b>11.</b> <code>tv <mensaje></code> — mensaje rápido a la tele\n"
|
||||||
" ✏️ Ej: <code>/tv la cena está lista</code>\n"
|
" ✏️ Ej: <code>/tv la cena está lista</code>\n"
|
||||||
@@ -1028,11 +1028,18 @@ def procesar_novedades(chat_id):
|
|||||||
|
|
||||||
|
|
||||||
def procesar_aspiradora(argumento, chat_id):
|
def procesar_aspiradora(argumento, chat_id):
|
||||||
"""Comandos de la Dreame D10 Plus: estado|start|stop|home|pause|locate."""
|
"""Dreame D10 Plus: estado|start|stop|home|pause|locate|vaciar|
|
||||||
accion = (argumento or "estado").lower().strip()
|
auto on|off|stats|consumibles|potencia 0-3|agua 1-3|voz [id]."""
|
||||||
if accion not in ("estado", "start", "stop", "home", "pause", "locate"):
|
partes = (argumento or "estado").lower().strip().split(None, 1)
|
||||||
enviar("Uso: <code>/aspiradora estado|start|stop|home|pause|locate</code>.",
|
accion = partes[0]
|
||||||
chat_id)
|
arg = partes[1].strip() if len(partes) > 1 else ""
|
||||||
|
validas = ("estado", "start", "stop", "home", "pause", "locate",
|
||||||
|
"vaciar", "auto", "stats", "consumibles", "potencia",
|
||||||
|
"agua", "voz")
|
||||||
|
if accion not in validas:
|
||||||
|
enviar("Uso: <code>/aspiradora estado|start|stop|home|pause|locate|"
|
||||||
|
"vaciar|auto on|off|stats|consumibles|potencia 0-3|agua 1-3|"
|
||||||
|
"voz [id]</code>.", chat_id)
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
import aspiradora
|
import aspiradora
|
||||||
@@ -1043,6 +1050,14 @@ def procesar_aspiradora(argumento, chat_id):
|
|||||||
try:
|
try:
|
||||||
if accion == "estado":
|
if accion == "estado":
|
||||||
enviar(aspiradora.estado(), chat_id)
|
enviar(aspiradora.estado(), chat_id)
|
||||||
|
elif accion == "stats":
|
||||||
|
enviar(aspiradora.stats(), chat_id)
|
||||||
|
elif accion == "consumibles":
|
||||||
|
enviar(aspiradora.consumibles(), chat_id)
|
||||||
|
elif accion == "auto" and not arg:
|
||||||
|
enviar(aspiradora.auto_estado(), chat_id)
|
||||||
|
elif accion == "voz" and not arg:
|
||||||
|
enviar(aspiradora.voz_estado(), chat_id)
|
||||||
else:
|
else:
|
||||||
vac = aspiradora.conectar()
|
vac = aspiradora.conectar()
|
||||||
if accion == "start":
|
if accion == "start":
|
||||||
@@ -1055,12 +1070,44 @@ def procesar_aspiradora(argumento, chat_id):
|
|||||||
vac.home()
|
vac.home()
|
||||||
enviar("🏠 Volviendo a la base.", chat_id)
|
enviar("🏠 Volviendo a la base.", chat_id)
|
||||||
elif accion == "pause":
|
elif accion == "pause":
|
||||||
vac.pause()
|
vac.call_action("pause")
|
||||||
enviar("⏸️ Pausada.", chat_id)
|
enviar("⏸️ Pausada.", chat_id)
|
||||||
elif accion == "locate":
|
elif accion == "locate":
|
||||||
vac.play_sound()
|
vac.call_action("play_sound")
|
||||||
enviar("🔊 Emitiendo sonido de localización.", chat_id)
|
enviar("🔊 Emitiendo sonido de localización.", chat_id)
|
||||||
log(f"ASPIRADORA {accion} ok")
|
elif accion == "vaciar":
|
||||||
|
vac.call_action("start_collect")
|
||||||
|
enviar("🗑️ Vaciando en la base.", chat_id)
|
||||||
|
elif accion == "auto":
|
||||||
|
if arg in ("on", "1"):
|
||||||
|
vac.set_property_by(15, 1, 1)
|
||||||
|
enviar("🗑️ Vaciado automático <b>activado</b>.", chat_id)
|
||||||
|
else:
|
||||||
|
vac.set_property_by(15, 1, 0)
|
||||||
|
enviar("🗑️ Vaciado automático <b>desactivado</b>.",
|
||||||
|
chat_id)
|
||||||
|
elif accion == "potencia":
|
||||||
|
if arg.isdigit() and int(arg) in aspiradora.MODOS:
|
||||||
|
vac.set_property_by(4, 4, int(arg))
|
||||||
|
enviar(f"⚡ Potencia: "
|
||||||
|
f"<b>{aspiradora.MODOS[int(arg)]}</b>.", chat_id)
|
||||||
|
else:
|
||||||
|
enviar("Uso: <code>/aspiradora potencia 0-3</code> "
|
||||||
|
"(0 silencioso, 1 estándar, 2 medio, 3 fuerte).",
|
||||||
|
chat_id)
|
||||||
|
elif accion == "agua":
|
||||||
|
if arg.isdigit() and int(arg) in aspiradora.AGUAS:
|
||||||
|
vac.set_property_by(4, 5, int(arg))
|
||||||
|
enviar(f"💧 Agua: <b>{aspiradora.AGUAS[int(arg)]}</b>.",
|
||||||
|
chat_id)
|
||||||
|
else:
|
||||||
|
enviar("Uso: <code>/aspiradora agua 1-3</code> "
|
||||||
|
"(1 bajo, 2 medio, 3 alto).", chat_id)
|
||||||
|
elif accion == "voz":
|
||||||
|
vac.set_voice(arg)
|
||||||
|
enviar(f"🔊 Voz cambiada a <b>{arg}</b> "
|
||||||
|
f"(si el pack existe).", chat_id)
|
||||||
|
log(f"ASPIRADORA {accion} {arg} ok")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log(f"aspiradora error: {e}")
|
log(f"aspiradora error: {e}")
|
||||||
enviar(f"❌ Error con la aspiradora: {e}", chat_id)
|
enviar(f"❌ Error con la aspiradora: {e}", chat_id)
|
||||||
|
|||||||
Reference in New Issue
Block a user