Интегрировал Wi-Fi розетку в WB, делюсь наработкой. Авто-обновляется статус каждые 30 секунд, но и кнопку ручную приделал.
Имею розетку Gauss Умная розетка Smart Home(артикул 5510122) и для её интеграции следующий wb-rule:
var WIZ_IP = "IP адрес розетки";
var WIZ_PORT = 38899;
defineVirtualDevice("rozetka_room1_wifi", {
title: "Розетка комната 1 WiFi",
cells: {
online: {
title: "Статус",
type: "switch",
value: false,
readonly: true,
order: 1
},
rssi: {
title: "Сигнал",
type: "value",
value: 0,
units: "dBm",
order: 2
},
power: {
title: "Питание",
type: "switch",
value: false,
order: 3
},
refresh: {
title: "Обновить",
type: "pushbutton",
order: 4
}
}
});
function wizSendRaw(json) {
var payload = json.replace(/'/g, "'\\''");
runShellCommand("printf '" + payload + "' | nc -u -w2 " + WIZ_IP + " " + WIZ_PORT);
}
function wizSetState(isOn) {
wizSendRaw(JSON.stringify({
method: "setState",
params: {
state: !!isOn
}
}));
}
function wizRefreshState() {
runShellCommand("/usr/local/bin/wifi_rozetka_room1.sh");
}
// управление розеткой
defineRule("rozetka_room1_wifi_write", {
whenChanged: "rozetka_room1_wifi/power",
then: function (val) {
wizSetState(val);
log.info("[WIZ_ROOM1] set " + (val ? "ON" : "OFF"));
setTimeout(function () {
wizRefreshState();
}, 1000);
}
});
// ручное обновление
defineRule("rozetka_room1_wifi_refresh", {
whenChanged: "rozetka_room1_wifi/refresh",
then: function (v) {
if (!v) return;
wizRefreshState();
log.info("[WIZ_ROOM1] refresh requested");
}
});
// автоопрос каждые 30 секунд
defineRule("rozetka_room1_wifi_poll", {
when: cron("*/30 * * * * *"),
then: function () {
wizRefreshState();
}
});
для опроса состояния(в сети или не в сети, сигнал wi-fi) скрипт sh, который положил сюда:
/usr/local/bin/wifi_rozetka_room1.sh:
#!/bin/bash
IP="IP адрес Wi-Fi розетки"
PORT="38899"
DEVICE="rozetka_room1_wifi"
RESP=$(printf '{"method":"getPilot"}' | nc -u -w2 "$IP" "$PORT")
if [ -z "$RESP" ]; then
mosquitto_pub -t "/devices/$DEVICE/controls/online" -m "0"
mosquitto_pub -t "/devices/$DEVICE/controls/rssi" -m "0"
mosquitto_pub -t "/devices/$DEVICE/controls/power" -m "0"
exit 0
fi
mosquitto_pub -t "/devices/$DEVICE/controls/online" -m "1"
STATE=$(echo "$RESP" | sed -n 's/.*"state":\(true\|false\).*/\1/p')
RSSI=$(echo "$RESP" | sed -n 's/.*"rssi":\(-\?[0-9]\+\).*/\1/p')
if [ -n "$STATE" ]; then
if [ "$STATE" = "true" ]; then
mosquitto_pub -t "/devices/$DEVICE/controls/power" -m "1"
else
mosquitto_pub -t "/devices/$DEVICE/controls/power" -m "0"
fi
fi
if [ -n "$RSSI" ]; then
mosquitto_pub -t "/devices/$DEVICE/controls/rssi" -m "$RSSI"
fi
