Compare commits

...

19 Commits

Author SHA1 Message Date
Armilar
60f31595d4 v4.3.3.36 - Update NSPanelTs.ts 2024-01-10 22:39:48 +01:00
Armilar
7194d7f613 v4.3.3.36 - Update NSPanelTs.ts
Fix Alexa Elapsed
2024-01-10 22:31:29 +01:00
Armilar
af02a70600 Merge pull request #1138 from ticaki/main
Fixed: schedule with objects starts only 1 time
2024-01-10 22:27:01 +01:00
ticaki
77d8e0607d Merge branch 'joBr99:main' into main 2024-01-10 22:21:08 +01:00
ticaki
d6d12bc93c Fixed: schedule with objects starts only 1 time 2024-01-10 22:19:44 +01:00
Armilar
ead1def4bb Merge pull request #1134 from tt-tom17/main
v4.3.3.36 Update NSPanel.ts
2024-01-09 22:57:12 +01:00
Thomas
14e944885f v4.3.3.36 Update NSPanel.ts
- Fix: change ScreensaverTimeout and activeBrightness
- Fix: schedule SendTime
- Fix: Function _schedule SummerTime/WinterTime
2024-01-09 22:37:18 +01:00
Armilar
a075e0cba8 Merge pull request #1133 from ticaki/main
2 Fixes
2024-01-09 21:46:44 +01:00
ticaki
dd14e66f10 update summer/winter fix 2024-01-09 21:24:52 +01:00
ticaki
ce0892b986 Fixed: update every minute
Fixed:  Schedule: {hour: minutes:} works with summer/winter time
2024-01-09 21:09:56 +01:00
Armilar
71b84cc8d3 Merge pull request #1131 from ticaki/main
schedule, 1 extendObject, relay show status of tasmota
2024-01-09 18:03:02 +01:00
ticaki
fd3ce243a6 update on replace 2024-01-08 22:29:08 +01:00
ticaki
aa3e90ef98 Get dp from NSPanelSendTopic 2024-01-08 22:23:06 +01:00
ticaki
2621b22ffd fix schedule 2024-01-08 21:55:53 +01:00
ticaki
6460f5f4ff Merge branch 'joBr99:main' into main 2024-01-08 20:28:46 +01:00
ticaki
e45560c27f add relays show status 2024-01-08 20:22:41 +01:00
ticaki
0c6cd158dd change schedule (testing needed)
add 1 extendObjectfor bgColorIndicator
2024-01-08 18:52:33 +01:00
dependabot[bot]
f11de05eb3 Bump github/codeql-action from 2 to 3 (#1094)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-08 16:38:05 +01:00
Armilar
ef47efb9aa Merge pull request #1130 from joBr99/Armilar-patch-4
v4.3.3.34 - Bose Soundtouch final Proto
2024-01-08 11:33:06 +01:00
2 changed files with 148 additions and 46 deletions

View File

@@ -47,7 +47,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -58,7 +58,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
uses: github/codeql-action/autobuild@v3
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@@ -72,4 +72,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v3

View File

@@ -1,5 +1,5 @@
/*-----------------------------------------------------------------------
TypeScript v4.3.3.34 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @ticaki / @Britzelpuf / @Sternmiere / @ravenS0ne
TypeScript v4.3.3.36 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @ticaki / @Britzelpuf / @Sternmiere / @ravenS0ne
- abgestimmt auf TFT 53 / v4.3.3 / BerryDriver 9 / Tasmota 13.3.0
@joBr99 Projekt: https://github.com/joBr99/nspanel-lovelace-ui/tree/main/ioBroker
NsPanelTs.ts (dieses TypeScript in ioBroker) Stable: https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/NsPanelTs.ts
@@ -89,10 +89,14 @@ ReleaseNotes:
- 04.01.2024 - v4.3.3.32 Add more details to types for: leftScreensaverEntity, indicatorScreensaverEntity, PageThermo, PageMedia
- 04.01.2024 - v4.3.3.32 Remove not uses propertys from PageItem
- 05.01.2024 - v4.3.3.32 Add Body for BoseSoundtouch-Player
- 05.01.2024 - v4.3.3.33 Add BoseSoundtouch Functions
- 05.01.2024 - v4.3.3.33 Screensaver Fix max Number of indicatorScreensaverEntity
- 07.01.2024 - v4.3.3.33 Fix BoseSoundtouch Proto
- 08.01.2024 - v4.3.3.34 Fix: Disabled Icon Status while bug in updating data points in ioBroker (reason unknown)
- 05.01.2024 - v4.3.3.33 Add BoseSoundtouch Functions
- 05.01.2024 - v4.3.3.33 Screensaver Fix max Number of indicatorScreensaverEntity
- 07.01.2024 - v4.3.3.33 Fix BoseSoundtouch Proto
- 08.01.2024 - v4.3.3.34 Fix: Disabled Icon Status while bug in updating data points in ioBroker (reason unknown)
- 08.01.2024 - v4.3.3.35 Add: relay.1/relay.2 show the confirmed status
- 09.01.2024 - v4.3.3.36 Fix: change ScreensaverTimeout and activeBrightness
- 09.01.2024 - v4.3.3.36 Fix: schedule SendTime
- 09.01.2024 - v4.3.3.36 Fix: Function _schedule SummerTime/WinterTime
Todo:
- XX.XX.XXXX - v5.0.0 Change the bottomScreensaverEntity (rolling) if more than 6 entries are defined
@@ -911,10 +915,11 @@ export const config: Config = {
ScreensaverEntityOnColor: On,
ScreensaverEntityOffColor: HMIOff
},
// ------ DE: Ende der Screensaver Einstellungen --------------------
// ------ EN: End of screensaver settings ---------------------------
//-------DE: Anfang Einstellungen für Hardware Button, wenn Sie softwareseitig genutzt werden (Rule2) -------------
//-------EN: Start Settings for Hardware Button, if used in software (Rule2) --------------------------------------
// ------ DE: Ende der Screensaver Einstellungen --------------------
// ------ EN: End of screensaver settings ---------------------------
//-------DE: Anfang Einstellungen für Hardware Button, wenn Sie softwareseitig genutzt werden (Rule2) -------------
//-------EN: Start Settings for Hardware Button, if used in software (Rule2) --------------------------------------
// DE: Konfiguration des linken Schalters des NSPanels
// EN: Configuration of the left switch of the NSPanel
button1: {
@@ -940,8 +945,10 @@ export const config: Config = {
entity: null,
setValue: null
},
//--------- DE: Ende - Einstellungen für Hardware Button, wenn Sie softwareseitig genutzt werden (Rule2) -------------
//--------- EN: End - settings for hardware button if they are used in software (Rule2) ------------------------------
//--------- DE: Ende - Einstellungen für Hardware Button, wenn Sie softwareseitig genutzt werden (Rule2) -------------
//--------- EN: End - settings for hardware button if they are used in software (Rule2) ------------------------------
// DE: WICHTIG !! Parameter nicht ändern WICHTIG!!
// EN: IMPORTANT !! Do not change parameters IMPORTANT!!
panelRecvTopic: NSPanelReceiveTopic,
@@ -956,7 +963,7 @@ export const config: Config = {
// _________________________________ DE: Ab hier keine Konfiguration mehr _____________________________________
// _________________________________ EN: No more configuration from here _____________________________________
const scriptVersion: string = 'v4.3.3.34';
const scriptVersion: string = 'v4.3.3.36';
const tft_version: string = 'v4.3.3';
const desired_display_firmware_version = 53;
const berry_driver_version = 9;
@@ -976,6 +983,8 @@ const moment = require('moment');
const parseFormat = require('moment-parseformat');
moment.locale(getState(NSPanel_Path + 'Config.locale').val);
const scheduleList:{[key:string]: any} = {};
const globalTextColor: any = White;
const Sliders2: number = 0;
let checkBlindActive: boolean = false;
@@ -1014,13 +1023,13 @@ let scheduleInitDimModeDay: any;
let scheduleInitDimModeNight: any;
onStop (function scriptStop () {
if (scheduleSendTime!=null) clearSchedule(scheduleSendTime);
if (scheduleSendDate!=null) clearSchedule(scheduleSendDate);
if (scheduleSwichScreensaver!=null) clearSchedule(scheduleSwichScreensaver);
if (scheduleStartup!=null) clearSchedule(scheduleStartup);
if (scheduleCheckUpdates!=null) clearSchedule(scheduleCheckUpdates);
if (scheduleInitDimModeDay!=null) clearSchedule(scheduleInitDimModeDay);
if (scheduleInitDimModeNight!=null) clearSchedule(scheduleInitDimModeNight);
if (scheduleSendTime!=null) _clearSchedule(scheduleSendTime);
if (scheduleSendDate!=null) _clearSchedule(scheduleSendDate);
if (scheduleSwichScreensaver!=null) _clearSchedule(scheduleSwichScreensaver);
if (scheduleStartup!=null) _clearSchedule(scheduleStartup);
if (scheduleCheckUpdates!=null) _clearSchedule(scheduleCheckUpdates);
if (scheduleInitDimModeDay!=null) _clearSchedule(scheduleInitDimModeDay);
if (scheduleInitDimModeNight!=null) _clearSchedule(scheduleInitDimModeNight);
UnsubscribeWatcher();
}, 1000);
@@ -1387,8 +1396,27 @@ Init_ActivePageData();
//switch BackgroundColors for Screensaver Indicators
async function Init_Screensaver_Backckground_Color_Switch() {
try {
if (existsState(NSPanel_Path + 'ScreensaverInfo.bgColorIndicator') == false ) {
await createStateAsync(NSPanel_Path + 'ScreensaverInfo.bgColorIndicator', 0, true, { type: 'number' });
const objDef: iobJS.StateObject = {
_id: '',
type: "state",
common: {
type: "number",
name: "Color Indicator",
role: "level",
states: {0:'black', 1:'red', 2:'green', 3:'attention', 4: 'pink', 5: 'dark red'},
read: true,
write: true
},
"native": {},
};
await extendObjectAsync(NSPanel_Path + 'ScreensaverInfo.bgColorIndicator', objDef)
if (await existsStateAsync(NSPanel_Path + 'ScreensaverInfo.bgColorIndicator')) {
const obj = await getStateAsync(NSPanel_Path + 'ScreensaverInfo.bgColorIndicator');
if (obj && obj.val !== null && obj.val !== undefined) {
bgColorScrSaver = obj.val;
} else {
setStateAsync(NSPanel_Path + 'ScreensaverInfo.bgColorIndicator', bgColorScrSaver)
}
}
} catch (err: any) {
log('error at function Init_Screensaver_Backckground_Color_Switch: ' + err.message, 'warn');
@@ -1471,6 +1499,19 @@ async function InitActiveBrightness() {
}
InitActiveBrightness();
on({id: [NSPanel_Path + 'ScreensaverInfo.activeBrightness'], change: 'ne'}, async function (obj) {
try {
let active = getState(NSPanel_Path + 'ScreensaverInfo.activeDimmodeBrightness').val;
if (obj.state.val >= 0 || obj.state.val <= 100) {
log('action at trigger activeBrightness: ' + obj.state.val + ' - activeDimmodeBrightness: ' + active, 'info');
SendToPanel({ payload: 'dimmode~' + active + '~' + obj.state.val + '~' + rgb_dec565(config.defaultBackgroundColor) + '~' + rgb_dec565(globalTextColor) + '~' + Sliders2 });
InitDimmode();
}
} catch (err:any) {
log('error at trigger activeBrightness: ' + err.message, 'warn');
}
});
on({id: [NSPanel_Path + 'ScreensaverInfo.activeDimmodeBrightness'], change: "ne"}, async function (obj) {
try {
let active = getState(NSPanel_Path + 'ScreensaverInfo.activeBrightness').val;
@@ -1704,8 +1745,19 @@ on({id: [String(NSPanel_Path) + 'Config.Dateformat.Switch.weekday',
}
});
//Set Relays from Tasmota
const NSPanelStatTopic = NSPanelSendTopic.replace('.cmnd.','.stat.').replace(/\.CustomSend$/g,'.');
on({id: [String(NSPanelStatTopic) + 'POWER1',String(NSPanelStatTopic) + 'POWER2'], change: "ne"}, (obj) => {
if (!obj || !obj.id) return
const n = obj.id.substring(obj.id.length-1);
if ( n === '1' || n === '2') {
if (getState(NSPanel_Path + 'Relay.' + n).val != obj.state.val) {
setState(NSPanel_Path + 'Relay.' + n, obj.state.val == 'ON' ? true : false, true);
}
}
})
//Control Relays from DP's
on({id: [String(NSPanel_Path) + 'Relay.1',String(NSPanel_Path) + 'Relay.2'], change: "ne"}, async function (obj) {
on({id: [String(NSPanel_Path) + 'Relay.1',String(NSPanel_Path) + 'Relay.2'], change: "ne", ack: false}, async function (obj) {
try {
let Button = obj.id!.split('.');
let urlString: string = ['http://',get_current_tasmota_ip_address(),'/cm?cmnd=Power',Button[Button.length - 1],' ',(obj.state ? obj.state.val : "")].join('');
@@ -1939,11 +1991,11 @@ async function InitDimmode() {
timeNight: (vTimeNight < 10) ? `0${vTimeNight}:00` : `${vTimeNight}:00`
};
// timeDimMode Day
scheduleInitDimModeDay = schedule({ hour: getState(NSPanel_Path + 'NSPanel_Dimmode_hourDay').val, minute: 0 }, () => {
scheduleInitDimModeDay = adapterSchedule({ hour: getState(NSPanel_Path + 'NSPanel_Dimmode_hourDay').val, minute: 0}, 24 * 60 * 60, () => {
ScreensaverDimmode(timeDimMode);
});
// timeDimMode Night
scheduleInitDimModeNight = schedule({ hour: getState(NSPanel_Path + 'NSPanel_Dimmode_hourNight').val, minute: 0 }, () => {
scheduleInitDimModeNight = adapterSchedule({ hour: getState(NSPanel_Path + 'NSPanel_Dimmode_hourNight').val, minute: 0 }, 24 * 60 * 60, () => {
ScreensaverDimmode(timeDimMode);
});
if (getState(NSPanel_Path + 'ScreensaverInfo.activeDimmodeBrightness').val != null && getState(NSPanel_Path + 'ScreensaverInfo.activeDimmodeBrightness').val != -1) {
@@ -2142,7 +2194,7 @@ let pageId = 0;
let activePage: PageType | undefined = undefined;
//Send time to NSPanel
let scheduleSendTime = schedule('* * * * *', () => {
let scheduleSendTime = adapterSchedule(new Date().setSeconds(0,0), 60, () => {
try {
SendTime();
HandleScreensaverUpdate();
@@ -2152,7 +2204,7 @@ let scheduleSendTime = schedule('* * * * *', () => {
});
//Switch between Screensaver Entities and WeatherForecast
let scheduleSwichScreensaver = schedule('*/' + getState(NSPanel_Path + 'ScreensaverInfo.entityChangeTime').val + ' * * * * *', () => {
let scheduleSwichScreensaver = adapterSchedule(undefined, parseInt(getState(NSPanel_Path + 'ScreensaverInfo.entityChangeTime').val), () => {
try {
//WeatherForecast true/false Switchover delayed
if (getState(NSPanel_Path + "ScreensaverInfo.popupNotifyHeading").val == '' && getState(NSPanel_Path + "ScreensaverInfo.popupNotifyText").val == '' && getState(NSPanel_Path + "ScreensaverInfo.weatherForecast").val == true && getState(NSPanel_Path + "ScreensaverInfo.weatherForecastTimer").val == true) {
@@ -2211,17 +2263,17 @@ on({id: [config.weatherEntity + '.TEMP',
}
});
let scheduleSendDate = schedule('0 * * * *', () => {
let scheduleSendDate = adapterSchedule((new Date().setMinutes(0,0)),60*60, () => {
SendDate();
});
// 3:30 a.m. Perform startup and receive current TFT version
let scheduleStartup = schedule({ hour: 3, minute: 30 }, async () => {
let scheduleStartup = adapterSchedule({ hour: 3, minute: 30 }, 24*60*60, async () => {
setIfExists(config.panelSendTopic, 'pageType~pageStartup');
});
// Updates currently compare every 12 hours
let scheduleCheckUpdates = schedule('{"time":{"start":"00:00","end":"23:59","mode":"hours","interval":12},"period":{"days":1}}', () => {
let scheduleCheckUpdates = adapterSchedule(undefined,60*60*12, () => {
get_tasmota_status0();
get_panel_update_data();
check_updates();
@@ -3330,19 +3382,19 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean =
// ioBroker
if (pageItem.id && existsObject(pageItem.id) || pageItem.navigate === true) {
let iconColor = rgb_dec565(config.defaultColor);
let optVal = '0';
let iconColor:number = rgb_dec565(config.defaultColor);
let optVal:string = '0';
let val: any = null;
let o:any
let o:any = undefined;
if (pageItem.id != null && existsObject(pageItem.id)) {
o = getObject(pageItem.id);
}
// Fallback if no name is given
name = pageItem.name !== undefined ? pageItem.name : o.common.name.de == undefined ? o.common.name : o.common.name.de;
let prefix = pageItem.prefixName !== undefined ? pageItem.prefixName : '';
let suffix = pageItem.suffixName !== undefined ? pageItem.suffixName : '';
const prefix = pageItem.prefixName !== undefined ? pageItem.prefixName : '';
const suffix = pageItem.suffixName !== undefined ? pageItem.suffixName : '';
// If name is used with changing values
if ((name || '').indexOf('getState(') != -1) {
@@ -3350,6 +3402,10 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean =
name = getState(dpName).val;
RegisterEntityWatcher(dpName);
}
else if ((name || '').split('.').length > 3 && existsState(name)) {
name = getState(name).val;
RegisterEntityWatcher(name);
}
name = prefix + name + suffix;
if (existsState(pageItem.id + '.GET')) {
@@ -5074,6 +5130,9 @@ function GenerateMediaPage(page: NSPanel.PageMedia): NSPanel.Payload[] {
vElapsed = vElapsed.slice(1);
}
}
if (vElapsed == 0) {
vElapsed = '0:00';
}
let vDuration = Duration;
if (vDuration.length == 5) {
if(parseInt(vDuration.slice(0,2)) < 9) {
@@ -6204,11 +6263,8 @@ function HandleButtonEvent(words: any): void {
if (words[2] == 'bNext' || words[2] == 'bPrev' || words[2] == 'bUp' || words[2] == 'bHome' || words[2] == 'bSubNext' || words[2] == 'bSubPrev' ) {
buttonAction = words[2];
pageCounter = 0;
// Turn off the display if the alwaysOnDisplay parameter was specified
if (alwaysOn == true) {
alwaysOn = false;
SendToPanel({ payload: 'timeout~' + getState(NSPanel_Path + 'Config.Screensaver.timeoutScreensaver').val });
}
alwaysOn = false;
SendToPanel({ payload: 'timeout~' + getState(NSPanel_Path + 'Config.Screensaver.timeoutScreensaver').val });
}
if (Debug) {
@@ -8594,7 +8650,6 @@ function HandleScreensaverUpdate(): void {
//Alternativ Layout bekommt zusätzlichen Status
if (config.bottomScreensaverEntity[4] && getState(NSPanel_Path + 'Config.Screensaver.alternativeScreensaverLayout').val) {
log('alternativ');
let val = getState(config.bottomScreensaverEntity[4].ScreensaverEntity).val;
if (parseFloat(val+"") == val) {
val = parseFloat(val);
@@ -9024,8 +9079,12 @@ function HandleScreensaverColors(): void {
scrSvrBGCol = rgb_dec565(scbackgroundInd2);
} else if (bgColorScrSaver == 3) {
scrSvrBGCol = rgb_dec565(scbackgroundInd3);
} else if (bgColorScrSaver == 4) {
scrSvrBGCol = rgb_dec565({red:255, green:16, blue:240});
} else if (bgColorScrSaver == 5) {
scrSvrBGCol = rgb_dec565({ red: 100, green: 0, blue: 0 });
}
let payloadString = 'color' + '~' +
scrSvrBGCol + '~' + //background
rgb_dec565(sctime) + '~' + //time
@@ -9632,6 +9691,48 @@ type PageUnlock = NSPanel.PageUnlock;
type PageAlarm = NSPanel.PageAlarm;
/**
*
* @param time object { hour: number, minutes: number } | number: Time as number in ms
* @param repeatTime in seconds
* @param callback what todo
* @returns
*/
function adapterSchedule(time: {hour?: number, minute?: number} | undefined | number, repeatTime: number, callback: () => void): number|null {
if (typeof callback !== 'function') return null
const ref = Math.random() + 1;
scheduleList[ref] = setTimeout(_schedule, 1, time, ref, repeatTime, callback), true;
return ref;
}
function _schedule(time: {hour?: number, minute?: number} | undefined | number, ref: number, repeatTime: number, callback, init: boolean = false) {
if (!scheduleList[ref]) return;
if (!init) callback();
let targetTime: number;
if ( time === undefined) {
targetTime = new Date().setMilliseconds(0) + repeatTime * 1000;
time = targetTime;
} else if (typeof time === 'number') {
targetTime = time + repeatTime * 1000;
time = targetTime;
} else {
time.hour = time.hour !== undefined ? time.hour : -1;
time.minute = time.minute !== undefined ? time.minute : 0;
targetTime = time.hour !== -1 ? new Date().setHours(time.hour, time.minute, 0, 0) : new Date().setMinutes(time.minute, 0, 0);
if (new Date().getTime() >= targetTime) {
targetTime += repeatTime * 1000;
targetTime = time.hour !== -1 ? new Date(targetTime).setHours(time.hour, time.minute, 0, 0) : new Date(targetTime).setMinutes(time.minute, 0, 0);
}
}
const timeout = targetTime - new Date().getTime();
scheduleList[ref] = setTimeout(_schedule, timeout, time, ref, repeatTime, callback);
}
function _clearSchedule(ref: number): null {
if (scheduleList[ref]) clearTimeout(scheduleList[ref]);
delete scheduleList[ref];
return null;
}
const ArrayPlayerTypeWithMediaDevice = ['alexa2', 'sonos', 'squeezeboxrpc'] as const
const ArrayPlayerTypeWithOutMediaDevice = ['spotify-premium', 'volumio', 'bosesoundtouch'] as const
@@ -9844,7 +9945,8 @@ namespace NSPanel {
setThermoAlias?: string[],
setThermoDestTemp2?: string,
} & PageBaseItem
// mean string start with getState(' and end with ').val
type getStateID = string;
export type PageBaseItem = {
id?: string | null,
icon?: string,
@@ -9866,7 +9968,7 @@ namespace NSPanel {
stepValue?: number,
prefixName?: string,
suffixName?: string,
name?: string,
name?: string | getStateID,
secondRow?: string,
buttonText?: string,
unit?: string,