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
JavaScript
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...")))));
};