UNPKG

homebridge-am43-blinds-bluez

Version:

A homebridge plugin to control AM43 based shade motors in HomeKit. These include the A OK and Zemismart bluetooth based motors. This plugin requires a Homebridge host that supports Bluetooth 4.0

81 lines (80 loc) 5.71 kB
import React, { Fragment, useEffect, useState } from "react"; import { useHomebridgeConfig } from "../hooks/useHomebridgeConfig"; import SetLimit from "./setLimit"; import MotorIcon from "./motorIcon"; export const MotorInfo = ({ device }) => { const [newName, setNewName] = useState(device.name); const { config, updateConfig } = useHomebridgeConfig(); const [hasAuthed, setHasAuthed] = useState(false); const [limitUI, setLimitUI] = useState(null); const allowedDevices = config?.allowed_devices || []; const deviceConfig = allowedDevices.find(({ address }) => address.toUpperCase() === device?.address.toUpperCase()); const [passcode, setPasscode] = useState(deviceConfig?.pass_code ?? "8888"); const removeFromAllowedDevices = async () => { await updateConfig({ ...config, allowed_devices: allowedDevices.filter(({ address }) => address !== device.address), }); }; const addToAllowedDevices = async () => { await updateConfig({ ...config, allowed_devices: [ ...allowedDevices, { name: newName, address: device.address, has_tilt: false }, ], }); }; useEffect(() => { const setAuthTrue = (ev) => { if (ev.data.device_id === device.address) setHasAuthed(true); }; homebridge.addEventListener("auth-success", setAuthTrue); return () => homebridge.removeEventListener("auth-success", setAuthTrue); }, []); const submitNewName = async () => { homebridge.request("/rename_device", { device_id: device.address, new_name: newName, }); }; const submitPassCode = () => { homebridge.request("/auth_with_passcode", { device_id: device.address, passcode, }); }; return (React.createElement("div", { className: "card-body d-flex" }, React.createElement("div", { className: "mr-3" }, React.createElement(MotorIcon, null)), device && (React.createElement("div", { className: "w-100" }, React.createElement("div", { className: "input-group mb-3" }, React.createElement("div", { className: "input-group-prepend" }, React.createElement("span", { className: "input-group-text", id: "motor-name" }, "Name")), React.createElement("input", { value: newName, disabled: !hasAuthed, onChange: ({ target }) => setNewName(target.value), type: "text", className: "form-control", placeholder: "Motor Name", "aria-label": "local name", "aria-describedby": "motor-name" }), device.name !== newName && newName?.length > 0 && (React.createElement("div", { className: "input-group-append" }, React.createElement("button", { type: "button", onClick: submitNewName, className: "btn-outline-secondary" }, "Update")))), React.createElement("div", { className: "input-group mb-3" }, React.createElement("div", { className: "input-group-prepend" }, React.createElement("span", { className: "input-group-text", id: "motor-address" }, "Address")), React.createElement("input", { value: device.address, type: "text", disabled: true, className: "form-control", "aria-label": "local name", "aria-describedby": "motor-address" })), !hasAuthed && (React.createElement("div", { className: "input-group mb-3" }, React.createElement("div", { className: "input-group-prepend" }, React.createElement("span", { className: "input-group-text", id: "passcode-label" }, "Passcode")), React.createElement("input", { value: passcode, pattern: "[0-9]{4}", onChange: ({ target }) => setPasscode(target.value), type: "text", className: "form-control", placeholder: "(default 8888)", "aria-label": "passcode", "aria-describedby": "passcode-label" }), React.createElement("div", { className: "input-group-append" }, React.createElement("button", { type: "button", onClick: submitPassCode, className: "btn-outline-secondary" }, "Auth")))), hasAuthed && (React.createElement(Fragment, null, React.createElement("div", { className: "card border-light mb-3" }, React.createElement("button", { type: "button", onClick: () => setLimitUI((l) => (l === null ? "OPENED" : null)), className: "card-header btn btn-outline-secondary btn-sm m-0" }, "Set Open Limit"), limitUI === "OPENED" && (React.createElement(SetLimit, { openOrClose: limitUI, deviceId: device.address, onClose: () => setLimitUI(null) }))), React.createElement("div", { className: "card border-light mb-3" }, React.createElement("button", { type: "button", onClick: () => setLimitUI((l) => (l === null ? "CLOSED" : null)), className: "card-header btn btn-outline-secondary btn-sm m-0" }, "Set Close Limit"), limitUI === "CLOSED" && (React.createElement(SetLimit, { openOrClose: limitUI, deviceId: device.address, onClose: () => setLimitUI(null) }))))), config && (React.createElement("button", { type: "button", className: `btn ${deviceConfig ? "btn-danger" : "btn-secondary"}`, onClick: deviceConfig ? removeFromAllowedDevices : addToAllowedDevices }, deviceConfig ? "Remove from" : "Add to", " Allowed List (on save)")))), !device && (React.createElement("div", null, React.createElement("div", { className: "alert alert-secondary", role: "alert" }, "Attempting to connect to motor..."))))); };