iobroker.schedule-switcher
Version:
Switch states over scheduler
428 lines (412 loc) • 18.1 kB
JavaScript
/*
ioBroker.vis schedule-switcher Widget-Set
Copyright 2019-2024 walli545 walli5446@gmail.com
*/
/* global vis, $, systemDictionary */
;
// add translations for edit mode
const iobSystemDic = systemDictionary;
let timeSwitchDic;
$.get("../schedule-switcher.admin/words.js", function (script) {
let translation = script.substring(script.indexOf("{"), script.length);
translation = translation.substring(0, translation.lastIndexOf(";"));
try {
timeSwitchDic = JSON.parse(translation);
$.extend(systemDictionary, iobSystemDic);
$.extend(systemDictionary, timeSwitchDic);
} catch (e) {
console.log(`Translate error: ${e}`);
}
});
// export vis binds for widget
vis.binds["schedule-switcher"] = {
version: "0.0.13",
showVersion: showVersion,
createOnOffWidget: createOnOffWidget,
onOffScheduleWidgets: {},
getConditionStateIdsAndAlias: getConditionStateIdsAndAlias,
getElementNameForTriggerType: getElementNameForTriggerType,
getElementNameForActionType: getElementNameForActionType,
onDataIdChange: onDataIdChange,
sendMessage: sendMessage,
translate: translate,
addConditionToAction: addConditionToAction,
getIcon: getIcon,
wid: "",
};
vis.binds["schedule-switcher"].showVersion();
function showVersion() {
if (vis.binds["schedule-switcher"].version) {
console.log(`Version schedule-switcher: ${vis.binds["schedule-switcher"].version}`);
}
}
function sendMessage(cmd, data) {
const sendto = {
command: cmd,
message: data,
};
console.debug(`cmdsend: ${JSON.stringify(sendto)}`);
try {
servConn._socket.emit("sendTo", "schedule-switcher", cmd, data);
} catch {
vis.conn.setState("schedule-switcher.0.sendto", { val: JSON.stringify(sendto), ack: false });
}
}
function translate(word, widgetid) {
if (widgetid) {
const newValue = vis.binds["schedule-switcher"].onOffScheduleWidgets[widgetid]
? vis.binds["schedule-switcher"].onOffScheduleWidgets[widgetid][word]
: null;
if (newValue != null && newValue != "") {
return newValue;
}
}
return translateWord(word, systemLang, timeSwitchDic);
}
function createOnOffWidget(widgetId, view, data, style) {
vis.binds["schedule-switcher"].wid = widgetId;
console.debug(`Create on/off widget ${widgetId}`);
const widgetElement = document.querySelector(`#${widgetId}`);
if (!widgetElement) {
console.warn("Widget not found, waiting ...");
return setTimeout(function () {
vis.binds["schedule-switcher"].createOnOffWidget(widgetId, view, data, style);
}, 100);
}
if (!validateOnOffWidgetSettings(widgetElement, data)) {
return;
}
const element = document.createElement("app-on-off-schedules-widget");
element.setAttribute("widgetid", widgetId);
element.style.setProperty("--ts-widget-astro-icon-display", data.useAstroIcons ? "inline" : "none");
element.style.setProperty("--ts-widget-astro-text-display", data.useAstroIcons ? "none" : "inline");
if (data.widthActionValue != null && data.widthActionValue != "") {
element.style.setProperty("--ts-widget-state-action-width", data.widthActionValue);
}
if (data.useCSS) {
if (data.fTimeIcon && data.fTimeIcon != "none") {
element.style.setProperty("--ts-widget-time-icon-display", data.fTimeIcon);
}
if (data.bgNextTime && data.bgNextTime != "rgba(255,255,255,1)") {
element.style.setProperty("--ts-widget-astro-next-fg-color", data.bgNextTime);
}
if (data.fsNextTime && data.fsNextTime != "2em") {
element.style.setProperty("--ts-widget-astro-next-font-size", data.fsNextTime);
}
if (data.fsDateTime && data.fsDateTime != "230px") {
element.style.setProperty("--ts-widget-datetime-width", data.fsDateTime);
}
if (data.bgwidget && data.bgwidget != "rgba(66,66,66,1)") {
element.style.setProperty("--ts-widget-bg-color", data.bgwidget);
}
if (data.bgwidgetFont && data.bgwidgetFont != "rgba(255,255,255,1)") {
element.style.setProperty("--ts-widget-fg-color", data.bgwidgetFont);
}
if (data.bgTriggerView && data.bgTriggerView != "rgba(39,39,39,1)") {
element.style.setProperty("--ts-widget-trigger-bg-color", data.bgTriggerView);
}
if (data.bgTrigger && data.bgTrigger != "rgba(241,241,241,1)") {
element.style.setProperty("--ts-widget-add-trigger-dropdown-bg-color", data.bgTrigger);
}
if (data.bgOn && data.bgOn != "rgba(51,122,183,1)") {
element.style.setProperty("--ts-widget-primary-color", data.bgOn);
}
if (data.bgOnCo && data.bgOnCo != "rgba(47,47,47,1)") {
element.style.setProperty("--ts-widget-primary-color-container", data.bgOnCo);
}
if (data.bgOff && data.bgOff != "rgba(192,192,192,1)") {
element.style.setProperty("--ts-widget-off-color", data.bgOff);
}
if (data.bgOffCo && data.bgOffCo != "rgba(128,128,128,1)") {
element.style.setProperty("--ts-widget-off-color-container", data.bgOffCo);
}
if (data.bgTriggerFont && data.bgTriggerFont != "rgba(0,0,0,1)") {
element.style.setProperty("--ts-widget-add-trigger-dropdown-fg-color", data.bgTriggerFont);
}
if (data.bgTriggerHover && data.bgTriggerHover != "rgba(221,221,221,1)") {
element.style.setProperty("--ts-widget-add-trigger-dropdown-hover-bg-color", data.bgTriggerHover);
}
if (data.fcSwitched && data.fcSwitched != "rgba(165,165,165,1)") {
element.style.setProperty("--ts-widget-oid-fg-color", data.fcSwitched);
}
if (data.fcbutton && data.fcbutton != "rgba(255,255,255,1)") {
element.style.setProperty("--ts-widget-btn-fg-color", data.fcbutton);
}
if (data.fcDisWeekday && data.fcDisWeekday != "rgba(93,93,93,1)") {
element.style.setProperty("--ts-widget-weekdays-disabled-fg-color", data.fcDisWeekday);
}
if (data.fcAcWeekday && data.fcAcWeekday != "rgba(255,255,255,1)") {
element.style.setProperty("--ts-widget-weekdays-enabled-fg-color", data.fcAcWeekday);
}
if (data.fcName && data.fcName != "rgba(255,255,255,1)") {
element.style.setProperty("--ts-widget-name-fg-color", data.fcName);
}
if (data.fcTime && data.fcTime != "rgba(255,255,255,1)") {
element.style.setProperty("--ts-widget-switched-time-fg-color", data.fcTime);
}
if (data.fcSwitch && data.fcSwitch != "rgba(255,255,255,1)") {
element.style.setProperty("--ts-widget-switched-value-fg-color", data.fcSwitch);
}
if (data.fcAstro && data.fcAstro != "rgba(0,0,0,1)") {
element.style.setProperty("--ts-widget-astro-time-fg-color", data.fcAstro);
}
if (data.fcAstroShift && data.fcAstroShift != "rgba(93,93,93,1)") {
element.style.setProperty("--ts-widget-astro-shift-fg-color", data.fcAstroShift);
}
if (data.fcCondition && data.fcCondition != "rgba(255,255,255,1)") {
element.style.setProperty("--ts-widget-condition-fg-color", data.fcCondition);
}
if (data.fFamily && data.fFamily != "'Roboto', 'Segoe UI', BlinkMacSystemFont, system-ui, -apple-system") {
element.style.setProperty("--ts-widget-font-family", data.fFamily);
}
if (data.fsName && data.fsName != "2em") {
element.style.setProperty("--ts-widget-name-font-size", data.fsName);
}
if (data.fsWeekdays && data.fsWeekdays != "15px") {
element.style.setProperty("--ts-widget-oid-font-size", data.fsSwitched);
}
if (data.fDisplayEdit && data.fDisplayEdit != "block") {
element.style.setProperty("--ts-widget-edit-name-button-display", data.fDisplayEdit);
}
if (data.fDisplayCondition && data.fDisplayCondition != "block") {
element.style.setProperty("-ts-widget-condition-display", data.fDisplayCondition);
}
if (data.fIconFilter && data.fIconFilter != "1") {
element.style.setProperty("--ts-widget-img-btn-filter", `invert(${data.fIconFilter})`);
}
if (data.fsWeekdays && data.fsWeekdays != "23px") {
element.style.setProperty("--ts-widget-weekdays-font-size", data.fsWeekdays);
}
if (data.fsSwitchedValue && data.fsSwitchedValue != "2em") {
element.style.setProperty("--ts-widget-switched-value-font-size", data.fsSwitchedValue);
}
if (data.fsSwitchedTime && data.fsSwitchedTime != "2em") {
element.style.setProperty("--ts-widget-switched-time-font-size", data.fsSwitchedTime);
}
if (data.fsSwitchedAstro && data.fsSwitchedAstro != "1.5em") {
element.style.setProperty("--ts-widget-astro-time-font-size", data.fsSwitchedAstro);
}
if (data.fsSwitchedAstroShift && data.fsSwitchedAstroShift != "1em") {
element.style.setProperty("--ts-widget-astro-shift-font-size", data.fsSwitchedAstroShift);
}
if (data.fsCondition && data.fsCondition != "1em") {
element.style.setProperty("--ts-widget-condition-font-size", data.fsCondition);
}
}
if (data.iconAstroWidth && data.iconAstroWidth != "42px") {
element.style.setProperty("--ts-widget-astro-icon-width", data.iconAstroWidth);
}
if (data.iconAstroHeight && data.iconAstroHeight != "42px") {
element.style.setProperty("--ts-widget-astro-icon-height", data.iconAstroHeight);
}
if (data.iconDisplayWidth && data.iconDisplayWidth != "28px") {
element.style.setProperty("--ts-widget-display-icon-width", data.iconDisplayWidth);
}
if (data.iconDisplayHeight && data.iconDisplayHeight != "28px") {
element.style.setProperty("--ts-widget-display-icon-height", data.iconDisplayHeight);
}
if (data.iconViewWidth && data.iconViewWidth != "28px") {
element.style.setProperty("--ts-widget-trigger-view-icon-width", data.iconViewWidth);
}
if (data.iconViewHeight && data.iconViewHeight != "28px") {
element.style.setProperty("--ts-widget-trigger-view-icon-height", data.iconViewHeight);
}
if (data.iconEditWidth && data.iconEditWidth != "28px") {
element.style.setProperty("--ts-widget-trigger-edit-icon-width", data.iconEditWidth);
}
if (data.iconEditHeight && data.iconEditHeight != "28px") {
element.style.setProperty("--ts-widget-trigger-edit-icon-height", data.iconEditHeight);
}
widgetElement.appendChild(element);
}
/**
* Gets triggered by vis editor when dataId value changes.
*
* @param widgetId widgetId
* @param view view
* @param newId newId
* @param attr attr
* @param isCss isCss
* @param oldId oldId
*/
function onDataIdChange(widgetId, view, newId, attr, isCss, oldId) {
console.debug(
`onDataIdChange: widgetId: ${widgetId} view: ${view} newId: ${newId} attr: ${attr} isCss: ${isCss} oldId: ${oldId}`,
);
// vis.conn.namespace == vis.0 / vis-2.0
const addDataId = {
prefix: vis.projectPrefix ? vis.projectPrefix.replace("/", "") : "",
namespace: vis.conn.namespace,
view: view,
widgetId: widgetId,
newId: newId,
oldId: oldId,
};
if (newId) {
const newIdSplit = newId.split(".");
const id = parseInt(newIdSplit[3]);
if (isNaN(id)) {
addDataId.newId = id;
}
}
if (oldId) {
const newIdSplit = oldId.split(".");
const id = parseInt(newIdSplit[3]);
if (isNaN(id)) {
addDataId.oldId = id;
}
}
this.sendMessage("change-view-dataId", addDataId);
if (vis.conn.namespace.startsWith("vis.")) {
if (newId) {
vis.views[view].widgets[widgetId].data["oid-enabled"] = newId.replace("data", "enabled");
}
}
}
function validateOnOffWidgetSettings(widgetElement, data) {
if (!data["oid-dataId"]) {
showWarningInWidget(widgetElement, "needToSelectDataId");
return false;
}
if (!(data["oid-dataId"].startsWith("schedule-switcher.0.onoff") && data["oid-dataId"].endsWith("data"))) {
showWarningInWidget(widgetElement, "needToSelectValidDataId");
return false;
}
if (!data["oid-stateId1"]) {
showWarningInWidget(widgetElement, "needToSelectStateId");
return false;
}
if (data.valueType === "number") {
if (Number.isNaN(Number.parseFloat(data.onValue))) {
showWarningInWidget(widgetElement, "needToEnterValidNumberOn");
return false;
}
if (Number.isNaN(Number.parseFloat(data.offValue))) {
showWarningInWidget(widgetElement, "needToEnterValidNumberOff");
return false;
}
} else if (data.valueType === "string") {
if (data.onValue === undefined || data.offValue === undefined || data.onValue === "" || data.offValue === "") {
showWarningInWidget(widgetElement, "needToEnterValidStringValue");
return false;
}
}
if (
data["oid-enabled"] == null ||
!(data["oid-enabled"].startsWith("schedule-switcher.0.onoff") && data["oid-enabled"].endsWith("enabled"))
) {
showWarningInWidget(widgetElement, "needToSelectValidEnabled");
return false;
}
return true;
}
function showWarningInWidget(widgetElement, warning) {
const p = document.createElement("p");
p.textContent = vis.binds["schedule-switcher"].translate(warning);
while (widgetElement.firstChild) {
widgetElement.removeChild(widgetElement.firstChild);
}
widgetElement.appendChild(p);
}
function getConditionStateIdsAndAlias(widgetId) {
console.log(`getConditionStateIdsAndAlias: ${widgetId}`);
if (!vis.widgets[widgetId]) {
const widgetElement = document.querySelector(`#${widgetId}`);
if (widgetElement) {
showWarningInWidget(widgetElement, "errorConditions");
}
return [];
}
const data = vis.widgets[widgetId].data;
const count = Number.parseInt(data.conditionStatesCount, 10);
const ids = [];
for (let i = 1; i <= count; i++) {
const id = data[`oid-conditionStateId${i}`];
if (id !== undefined && id !== "") {
ids.push({ id: id, alias: data[`conditionStateAlias${i}`] });
}
}
return ids;
}
function getIcon(icon, widgetId) {
console.log(`WidgetID: ${widgetId}`);
let data = {};
if (vis.widgets[widgetId]) {
data = vis.widgets[widgetId].data;
}
let change = data.path && data.path != "" ? true : false;
change = data.fileExtension && data.fileExtension != "" ? change : false;
switch (icon) {
case "sunrise":
case "solarNoon":
case "sunset":
case "sunriseEnd":
case "goldenHourEnd":
case "goldenHour":
case "sunsetStart":
case "dusk":
case "nauticalDusk":
case "night":
case "nadir":
case "nightEnd":
case "nauticalDawn":
case "dawn":
return change
? `${data.path}/${icon}.${data.fileExtension}`
: `widgets/schedule-switcher/img/astro/${icon}.svg`;
case "add":
return change ? `${data.path}/${icon}.${data.fileExtension}` : `widgets/schedule-switcher/img/${icon}.svg`;
case "cancel":
return change ? `${data.path}/${icon}.${data.fileExtension}` : `widgets/schedule-switcher/img/${icon}.svg`;
case "edit":
return change ? `${data.path}/${icon}.${data.fileExtension}` : `widgets/schedule-switcher/img/${icon}.svg`;
case "delete":
return change ? `${data.path}/${icon}.${data.fileExtension}` : `widgets/schedule-switcher/img/${icon}.svg`;
case "onetime":
return change ? `${data.path}/${icon}.${data.fileExtension}` : `widgets/schedule-switcher/img/${icon}.svg`;
case "remove_circle_outline":
return change ? `${data.path}/${icon}.${data.fileExtension}` : `widgets/schedule-switcher/img/${icon}.svg`;
case "save":
return change ? `${data.path}/${icon}.${data.fileExtension}` : `widgets/schedule-switcher/img/${icon}.svg`;
case "time":
return change ? `${data.path}/${icon}.${data.fileExtension}` : `widgets/schedule-switcher/img/${icon}.svg`;
case "valueCheck":
return change ? `${data.path}/${icon}.${data.fileExtension}` : `widgets/schedule-switcher/img/${icon}.svg`;
case "valueNoCheck":
return change ? `${data.path}/${icon}.${data.fileExtension}` : `widgets/schedule-switcher/img/${icon}.svg`;
default:
return `widgets/schedule-switcher/img/unknown.svg`;
}
}
function addConditionToAction(action, widgetId) {
if (action.type === "OnOffStateAction") {
const conditionAction = {
type: "ConditionAction",
condition: {
type: "StringStateAndConstantCondition",
constant: "true",
stateId: getConditionStateIdsAndAlias(widgetId)[0].id,
sign: "==",
},
action: action,
};
return conditionAction;
}
return null;
}
function getElementNameForTriggerType(type) {
if (type === "TimeTrigger") {
return "app-time-trigger-schedule";
} else if (type === "AstroTrigger") {
return "app-astro-trigger-schedule";
}
throw Error("No widget for trigger found");
}
function getElementNameForActionType(type) {
if (type === "OnOffStateAction") {
return "app-on-off-state-action-schedule";
} else if (type === "ConditionAction") {
return "app-condition-action-schedule";
}
throw Error("No widget for action found");
}