Hi:
I can return to the screen saver by running the callback rule from inside Openhab.
But the problem is the Card Thermo, if I remove it everything works fine again.
Maybe I just made it too complex? I don’t know how to copy and paste the blockly graphics in one step.
Carlos




This is the code
var returnValue;
function absorb_it_nspanel_cards_startupCheck(functionName) {
console.log("starting script '" + functionName + "' " + ctx);
if (!ctx.target) {
if (!ctx.triggerLoadPage) {
console.error("missing context for loading Card '" + functionName + "' in '" + ctx.ruleUID + "', try 'NSPanel Item' or 'NSPanel Item via CallBack' from Helpers library!");
}
else if (!ctx.triggerLoadPageDone) {
ctx.triggerLoadPageDone = 1;
items.getItem(ctx.triggerLoadPage).postUpdate('loadPage?' + ctx.ruleUID);
}
return 0;
}
return 1;
}
function absorb_it_nspanel_cards_killRefreshTimer() {
if (ctx.timerName && cache.shared.exists(ctx.timerName)) {
console.debug("remove existing refresh timer " + ctx.timerName);
cache.shared.remove(ctx.timerName).cancel();
}
}
function absorb_it_nspanel_cards_checkResult(result) {
if (result && result.sendNow && result.resultString) {
items.getItem(ctx.target).sendCommand(result.resultString);
}
if (result && result.refreshPage) {
items.getItem(ctx.target).postUpdate('refresh');
}
return (result && (result.sendNow || result.refreshPage));
}
function absorb_it_nspanel_cards_startRefreshTimer(refresh) {
if (ctx.timerName) {
if (cache.shared.exists(ctx.timerName)) {
absorb_it_nspanel_cards_killRefreshTimer(); // just to be 100% shure
}
refresh = parseInt(refresh);
if (refresh != 0) {
console.debug("create refresh timer " + ctx.timerName);
cache.shared.put(ctx.timerName,
actions.ScriptExecution.createTimer(
ctx.timerName,
time.ZonedDateTime.now().plusSeconds(refresh),
function () {
items.getItem(ctx.target).postUpdate('refreshTimer');
}
)
);
}
}
}
function absorb_it_nspanel_cards_safeEval(command, returnValue = '', returnMode = '') {
// evaluate command, use returnValue/returnMode as context
let result = "";
// convert to returnValue to Number if possible
if (parseFloat(returnValue) == returnValue)
returnValue = parseFloat(returnValue);
if (command) {
try { result = eval(command); }
catch (e) {
console.error("Error", e.stack);
console.log("Error", e.toString());
console.log("eval failed: '" + command + "'");
}
}
return result;
}
function absorb_it_nspanel_cards_checkParam(param, noOfItems) {
let result = String(param);
if (result.charAt(0) != '~')
result = '~' + result;
while ((result.match(/~/g) || []).length < noOfItems)
result += '~'
while ((result.match(/~/g) || []).length > noOfItems)
result = result.replace(/~/, '');
return result;
}
function absorb_it_nspanel_cards_getPreamble(title, navigation) {
return 'entityUpd' + absorb_it_nspanel_cards_checkParam(title, 1) +
absorb_it_nspanel_cards_checkParam((navigation[0])?navigation[0].resultString:'', 6) +
absorb_it_nspanel_cards_checkParam((navigation[1])?navigation[1].resultString:'', 6);
}
function absorb_it_nspanel_showCardThermo(title, navigation, target_temp, show_second_temp, second_temp, min_temp, max_temp, temp_steps, temp_unit, tCurTempLbl, currentTemp, tStateLbl, status, actions, tempChangeAction, pagePopupAction, refresh) {
if (!absorb_it_nspanel_cards_startupCheck(arguments.callee.name)) return;
absorb_it_nspanel_cards_killRefreshTimer();
if (ctx.request == "pageOpenDetail") {
let result = pagePopupAction[0];
if (absorb_it_nspanel_cards_checkResult(result)) {
absorb_it_nspanel_cards_startRefreshTimer(refresh);
return;
}
}
if (ctx.request == "pageUpdate") {
let result = {};
if (ctx.trigger == "tempUpdHighLow" || ctx.trigger == "tempUpd") {
let newState = ctx.newState.split('|');
let newValue = String(parseInt(newState[0])/10);
if (newState[1] !== undefined)
newValue += '|' + String(parseInt(newState[1])/10);
absorb_it_nspanel_cards_safeEval(tempChangeAction, newValue);
result = { "refreshPage": "1" }
}
if (absorb_it_nspanel_cards_checkResult(result)) {
absorb_it_nspanel_cards_startRefreshTimer(refresh);
return;
}
}
let mqtt = absorb_it_nspanel_cards_getPreamble(title, navigation);
mqtt += absorb_it_nspanel_cards_checkParam(ctx.ruleUID, 1) + absorb_it_nspanel_cards_checkParam(currentTemp, 1) + absorb_it_nspanel_cards_checkParam(target_temp * 10, 1) + absorb_it_nspanel_cards_checkParam(status, 1) + absorb_it_nspanel_cards_checkParam(min_temp * 10, 1) + absorb_it_nspanel_cards_checkParam(max_temp * 10, 1) +
absorb_it_nspanel_cards_checkParam(temp_steps * 10, 1);
for (let i = 0; i < 8; i++) {
let result = actions[i];
if (result === undefined) {
mqtt += absorb_it_nspanel_cards_checkParam("", 4);
continue;
}
if (absorb_it_nspanel_cards_checkResult(result)) {
absorb_it_nspanel_cards_startRefreshTimer(refresh);
return;
}
mqtt += absorb_it_nspanel_cards_checkParam((result.resultString)?result.resultString:'', 4);
}
mqtt += absorb_it_nspanel_cards_checkParam(tCurTempLbl, 1) + absorb_it_nspanel_cards_checkParam(tStateLbl, 1) + '~' + absorb_it_nspanel_cards_checkParam(temp_unit, 1);
mqtt += (show_second_temp == "TRUE")?(absorb_it_nspanel_cards_checkParam(second_temp*10, 1)):'~';
mqtt += (pagePopupAction[0])?'~0':'~1';
if (ctx.previousPage !== ctx.ruleUID)
items.getItem(ctx.target).sendCommand("pageType~cardThermo");
items.getItem(ctx.target).sendCommand(mqtt);
absorb_it_nspanel_cards_startRefreshTimer(refresh);
}
function absorb_it_nspanel_helpers_checkParam(param, noOfItems) {
let result = String(param);
if (result.charAt(0) != '~')
result = '~' + result;
while ((result.match(/~/g) || []).length < noOfItems)
result += '~'
while ((result.match(/~/g) || []).length > noOfItems)
result = result.replace(/~/, '');
return result;
}
function absorb_it_nspanel_helpers_getRGB565(color) {
let result = (parseInt("0x"+color.substr(1, 2)) << 8) & 0xF800;
result |= (parseInt("0x"+color.substr(3, 2)) << 3) & 0x07E0;
result |= (parseInt("0x"+color.substr(5, 2)) >> 3) & 0x001F;
return result;
}
function absorb_it_nspanel_getNavString(intNameEntity, icon, iconColor) {
return {
"sendNow": "1",
"resultString": absorb_it_nspanel_helpers_checkParam('X', 1) + absorb_it_nspanel_helpers_checkParam(intNameEntity, 1) + absorb_it_nspanel_helpers_checkParam(icon, 1) + absorb_it_nspanel_helpers_checkParam(absorb_it_nspanel_helpers_getRGB565(iconColor), 1) + '~~'
}
}
function absorb_it_nspanel_helpers_getEntityPos() {
let ownEntityPos = cache.private.get('entity_pos');
// prepare Position for next entity
cache.private.put('entity_pos', parseInt(ownEntityPos) + 1)
return ownEntityPos;
}
function absorb_it_nspanel_helpers_safeEval(command, returnValue = '') {
// evaluate command, use returnValue as context
let result = "";
// convert to returnValue to Number if possible
if (parseFloat(returnValue) == returnValue)
returnValue = parseFloat(returnValue);
if (command) {
try { result = eval(command); }
catch (e) {
console.error("Error", e.stack);
console.log("Error", e.toString());
console.log("eval failed: '" + command + "'");
}
}
return result;
}
function absorb_it_nspanel_getHVACButtonString(icon, iconColor, getState, setState) {
let ownEntityPos = absorb_it_nspanel_helpers_getEntityPos();
if (ctx.item == ownEntityPos) {
if (ctx.request == 'pageUpdate') {
absorb_it_nspanel_helpers_safeEval(setState);
return { "refreshPage": "1" };
}
}
return {
"resultString": absorb_it_nspanel_helpers_checkParam(icon, 1) + absorb_it_nspanel_helpers_checkParam(absorb_it_nspanel_helpers_getRGB565(iconColor), 1) + absorb_it_nspanel_helpers_checkParam(getState, 1) + absorb_it_nspanel_helpers_checkParam('item?' + ownEntityPos, 1)
}
}
function absorb_it_nspanel_cards_getRGB565(color) {
let result = (parseInt("0x"+color.substr(1, 2)) << 8) & 0xF800;
result |= (parseInt("0x"+color.substr(3, 2)) << 3) & 0x07E0;
result |= (parseInt("0x"+color.substr(5, 2)) >> 3) & 0x001F;
return result;
}
function absorb_it_nspanel_setupPopupThermo(icon, iconColor, topHeading, topOptions, topSelected, topAction, midHeading, midOptions, midSelected, midAction, lowHeading, lowOptions, lowSelected, lowAction) {
if (ctx.newState) {
switch (ctx.trigger) {
case "mode-0":
absorb_it_nspanel_cards_safeEval(topAction, parseInt(ctx.newState) + 1, topOptions.split('?')[ctx.newState]);
break;
case "mode-1":
absorb_it_nspanel_cards_safeEval(midAction, parseInt(ctx.newState) + 1, midOptions.split('?')[ctx.newState]);
break;
case "mode-2":
absorb_it_nspanel_cards_safeEval(lowAction, parseInt(ctx.newState) + 1, lowOptions.split('?')[ctx.newState]);
break;
}
return { "refreshPage": "1" };
}
return {
"sendNow": "1",
"resultString": 'entityUpdateDetail' + absorb_it_nspanel_cards_checkParam(ctx.ruleUID, 1) + absorb_it_nspanel_cards_checkParam(icon, 1) + absorb_it_nspanel_cards_checkParam(absorb_it_nspanel_cards_getRGB565(iconColor), 1) + absorb_it_nspanel_cards_checkParam(topHeading, 1) + absorb_it_nspanel_cards_checkParam("0", 1) + absorb_it_nspanel_cards_checkParam(topSelected, 1) + absorb_it_nspanel_cards_checkParam(topOptions, 1) + absorb_it_nspanel_cards_checkParam(midHeading, 1) + absorb_it_nspanel_cards_checkParam("1", 1) + absorb_it_nspanel_cards_checkParam(midSelected, 1) + absorb_it_nspanel_cards_checkParam(midOptions, 1) + absorb_it_nspanel_cards_checkParam(lowHeading, 1) + absorb_it_nspanel_cards_checkParam("2", 1) + absorb_it_nspanel_cards_checkParam(lowSelected, 1) + absorb_it_nspanel_cards_checkParam(lowOptions, 1)
}
}
cache.private.put('entity_pos', '0'); absorb_it_nspanel_showCardThermo(
'Thermostat',
[
absorb_it_nspanel_getNavString('kitchen_entities', '', '#ffff00'),
absorb_it_nspanel_getNavString('kitchen_blind', '', '#999999')
],
items.getItem('Thermostat_Mode').state == '1' ? parseFloat(items.getItem('Thermostat_Set_Point_Heating').state) : (items.getItem('Thermostat_Mode').state == '2' ? parseFloat(items.getItem('Thermostat_Set_Point_Cooling').state) : null),
'FALSE',
21,
60,
85,
1,
'°F',
['Temp: ',parseFloat(items.getItem('Thermostat_Current_Temprature').state),'°F'].join(''),
['Hum: ',parseFloat(items.getItem('Thermostat_Humidity').state),'%'].join(''),
'Mode: ' + String(items.getItem('Thermostat_Mode').state == '0' ? 'OFF' : (items.getItem('Thermostat_Mode').state == '1' ? 'HEAT' : (items.getItem('Thermostat_Mode').state == '2' ? 'COOL' : (items.getItem('Thermostat_Mode').state == '11' ? 'HEAT-AWAY' : 'COOL-AWAY')))),
'Status: ' + String(items.getItem('Thermostat_Status').state == '0' ? 'IDLE' : (items.getItem('Thermostat_Status').state == '1' ? 'HEATING' : (items.getItem('Thermostat_Status').state == '2' ? 'COOLING' : null))),
[
absorb_it_nspanel_getHVACButtonString(items.getItem('Thermostat_state').state == 'ON' ? '' : '海', '#990000', items.getItem('Thermostat_state').state == 'ON' ? '1' : '0', `items.getItem('Thermostat_state').sendCommand((items.getItem('Thermostat_state').state == 'OFF' ? 'ON' : 'OFF'));`), absorb_it_nspanel_getHVACButtonString(items.getItem('Thermostat_state').state == 'ON' ? 'HO' : 'AW', '#ffffff', items.getItem('Thermostat_state').state == 'ON' ? '1' : '0', ``), absorb_it_nspanel_getHVACButtonString(items.getItem('Thermostat_state').state == 'ON' ? 'ME' : 'AY', '#ffffff', items.getItem('Thermostat_state').state == 'ON' ? '1' : '0', ``),
, , ,
,
],
`items.getItem('ThermostatSetPoint').sendCommand(returnValue);`,
[
absorb_it_nspanel_setupPopupThermo('*', '#ee0000', 'Mode', 'OFF?HEAT?COOL?AWAY_H?AWAY_C', 'opt1', `items.getItem('Thermostat_Mode').sendCommand((returnValue == '1' ? '0' : (returnValue == '2' ? '1' : (returnValue == '3' ? '2' : (returnValue == '4' ? '11' : (returnValue == '5' ? '12' : null))))));
items.getItem('Thermostat_state').sendCommand((returnValue == '4' || returnValue == '5' ? 'OFF' : null));`, 'Fan Mode', 'AUTO?ON?CIRC', 'cold', `items.getItem('Thermostat_Fan').sendCommand((returnValue == '1' ? '0' : (returnValue == '2' ? '1' : (returnValue == '3' ? '6' : null))));`, '', '', '', ``)
],
30
);