NEWS
SONOFF NSPanel mit Lovelace UI
-
Guten Morgen, ich habe seit einiger zeit diesen Fehler in meinem Log. Habt ihr eine Idee was das sein könnte?
error: javascript.0 (3090) script.js.NS_Panels.Panel_Erdgeschoss_1_0: existsObject has been called with id of type "object" but expects a string -
@venice
version des scripts? Da müsste auch ne Zeilennummer hinter dem Fehler gestanden haben. -
@venice
Wann tritt der Fehler auf. Bei welcher Seite?
Welche Script Version und welche TFT Version?? -
@armilar,
Wollte dir noch mal Rückmeldung geben und dir sagen dass das Problem nicht mehr vorgekommen ist.
Danke für den Support. -
Meine Card für das Ein-/ Ausschalten des Gäste-WLAN-Zuganges und zur Darstellung des QR-Codes sieht so aus:
let WLAN:PageType= { 'type': 'cardQR', 'heading': 'Gäste WLAN', 'subPage': true, 'parent': Start_Panel1, 'items': [ { id: "alias.0.NSPanel.1.GuestWifi", hidePassword: true, // true = Switch; false = Password hideEntity2: false // true = Switch or Password is hide } ] };
Gibt es eine Möglichkeit, beim Ein-/Ausschalter (hideEntity2) dynamisch festzulegen, ob der Schalter dargestellt werden soll oder nicht?
-
@ticaki sagemal ist es ein Bug oder soll so
{ id: 'alias.0.NSPanel.Garten.horstOnline', name: 'Status', offColor: Red, onColor: MSGreen, useValue: true, fontSize: 3}
der alias klann offline und online sein.. wird auch angezeigt allerdings immer in der Farbe MSGreen.. würde bei offline das ding gerne in Rot haben
so ist der alias definiert
{ "_id": "alias.0.NSPanel.Garten.horstOnline.ACTUAL", "common": { "name": "ACTUAL", "role": "state", "type": "mixed", "read": true, "write": false, "alias": { "id": "worx.0.2019501385029008727F.mower.online", "read": "val==true?\"online\":val==false?\"offline\":null" } }, "native": {}, "type": "state", "acl": { "object": 1638, "state": 1638, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.1", "user": "system.user.admin", "ts": 1758280070290 }
-
Kein Bug - bei dir ist das val = 'online' oder 'offline' das ist laut code... - ok also wenn nicht
true
ist es onColorCodeausschnitt:
case 'info': iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon('gesture-tap-button'); iconId2 = pageItem.icon2 !== undefined ? Icons.GetIcon(pageItem.icon2) : iconId; buttonText = pageItem.buttonText !== undefined ? pageItem.buttonText : existsState(pageItem.id + '.BUTTONTEXT') ? getState(pageItem.id + '.BUTTONTEXT').val : 'PRESS'; if (existsState(pageItem.id + '.COLORDEC')) { iconColor = getState(pageItem.id + '.COLORDEC').val; } else { if (val === true || val === 'true') { iconColor = GetIconColor(pageItem, false, useColors); } else { iconColor = GetIconColor(pageItem, true, useColors); } }
mit COLORDEC sollte es gehen, da muß aber die dec rein:
/** * Converts an RGB color to a 16-bit 565 color format. * * This function takes an RGB color object and converts it to a 16-bit 565 color format. * * @function rgb_dec565 * @param {RGB} rgb - The RGB color object. * @returns {number} The 16-bit 565 color value. */ function rgb_dec565 (rgb: RGB): number { //return ((Math.floor(rgb.red / 255 * 31) << 11) | (Math.floor(rgb.green / 255 * 63) << 5) | (Math.floor(rgb.blue / 255 * 31))); return ((rgb.red >> 3) << 11) | ((rgb.green >> 2) << 5) | (rgb.blue >> 3); }
Also nen Alias anlegen der COLORDEC heißt und die Farbe vorgeben mit der read Funktion mit schalten.
hm COLORDEC muß beschrieben sein, wenn ACTUAL aktualisiert wird - da ist kein delay auf dem Pfad soweit ich sehe.
-
-
Dann passt es ja, ich hab nicht den Pfad von COLORDEC geguckt sondern nur den von ACTUAL.
das hier sieht aber "ist zwar falsch aber kompatible" aus:
if (val === true || val === 'true') { iconColor = GetIconColor(pageItem, false, useColors); } else { iconColor = GetIconColor(pageItem, true, useColors); }
EDIT:
Welche Rolle hat dein Channel? Vielleicht liegt da schon der Fehler.
da kommt als Wert
online
undoffline
die sind bei einem üblichen true vergleich immer wahr und bei einem=== true
Vergleich immer false. -
die Info rolle unterstütz nur Number und boolean.
-
-
@arteck
So rumwühlen ergebnis - geht nichtÄndere hier den code:
EDIT - das ist Käse drunter ist besser
if (existsState(pageItem.id + '.ACTUAL') && (pageItem.icon2 != undefined || pageItem.useValue)) { // Read Alias Datapoint Objectdata let obj = getObject(pageItem.id + ".ACTUAL"); // Read origin Datapoint Objectdata if (existsState(obj.common.alias.id)) { let obj2 = getObject(obj.common.alias.id); // Register Origin Datapoint RegisterEntityWatcher(obj.common.alias.id); // Check Data-Type (This must be boolean) if (obj2.type === 'state' && obj2.common.type == "boolean") { if (Debug) log(getState(obj.common.alias.id).val, 'info'); if (getState(obj.common.alias.id).val) { if (!pageItem.useValue) iconId = pageItem.icon != un defined ? Icons.GetIcon(pageItem.icon) : iconId; iconColor = pageItem.onColor != undefined ? rgb_dec565(pageItem.onColor) : iconColor; } else { if (!pageItem.useValue) iconId = pageItem.icon2 != undefined ? Icons.GetIcon(pageItem.icon2) : iconId; iconColor = pageItem.offColor != undefined ? rgb_dec565(pageItem.offColor) : iconColor; } } } }
Käse ende
Kopiere den if hier der aktuell oberhalb von ^der funktion steht, einfach drunter und füge das useValue in den If ^ wie da ein.
if (pageItem.useValue) { if (pageItem.fontSize != undefined) { if (pageItem.suffixName == undefined) { iconId = optVal + '¬' + pageItem.fontSize; } else { iconId = optVal + pageItem.suffixName + '¬' + pageItem.fontSize; } } else { iconId = optVal; } }
EDIT2 - das müsste eigentlcih dann doch ein BUG sein - Armilar und TT-Tom sind da mehr drin als ich.
-
@ticaki sagte in SONOFF NSPanel mit Lovelace UI:
if (existsState(pageItem.id + '.ACTUAL') && pageItem.icon2 != undefined) {
die Funktion lauft bei der Konfiguration nicht da kein icon2 definiert ist.
{ id: 'alias.0.NSPanel.Garten.horstOnline', name: 'Status', offColor: Red, onColor: MSGreen, useValue: true, fontSize: 3}
also läuft das normal durch
if (pageItem.useValue) { if (pageItem.fontSize != undefined) { if (pageItem.suffixName == undefined) { iconId = optVal + '¬' + pageItem.fontSize; } else { iconId = optVal + pageItem.suffixName + '¬' + pageItem.fontSize; } } else { iconId = optVal; } }
EDIT: Problem ist wirkliche der Text in ACTUAL
EDIT2 bin jetzt am überlegen warum wir nicht COLORDEC da haben, ist doch die Info-rolle, diese Universell sein sollte. -
Bei dem C&P Vorschlag müsste man noch icon2 definieren - richtig - aber dann würde es halt laufen - zum Colordec hab ich ja schon was im discord geschrieben
Wurde gezwungen im adapter überall colordec und buttontext einzubauen ^^
-
if (existsState(pageItem.id + '.COLORDEC')) { if (Debug) log('iconcolor von ' + pageItem.id + '.COLORDEC: ' + getState(pageItem.id + '.COLORDEC').val, 'info'); RegisterEntityWatcher(pageItem.id + '.COLORDEC'); iconColor = getState(pageItem.id + '.COLORDEC').val; }
ich würde das so ans Ende des Case setzen
-
@tt-tom Würde ich so ins Skript übernehmen, das ist auch kompatibel zum Adapter.
-
Ich darf verkünden, das @TT-Tom in seiner Weisheit sich herabgelassen hat die Funktion für @arteck anzupassen
Bitte die aktuell dev testen
https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/DEV/NSPanelTs.ts
FYI: @Armilar
EDIT:
COLORDEC geht jetzt da
Sowie wenn useValue=true und wenn der State, der die Quelle des alias ist, vom common.type='boolean' ist - wird onColor, offColor verwendet. -
Hi Leutz
Ich bin auch mal wieder hier. Über 7600 posts. Respekt meine Damen und Herren.
Ich hatte mitbekommen, dass akkuweather abgeschaltet werden soll. Also wollte ich direkt auf das neuste skript updaten. Hat auch alles super geklapp. Natürlich nur wegen eurer Hilfestellung. Danke schön dafür.
Als ich alle NSPanel angepasst hatte (13 Stück) hab ich noch den javaskript Adapter geuppt. Als er fertig war, kam ein weißer Bildschirm mit einer Fehlermeldung und mein iobroker ist abgeschmiert. Läuft aber alles wieder.
Obwohl alles funktioniert und das Wetter auch richtig auf den NSPaneln angezeigt wird bekomme ich folgende Fehlermeldunk im Log:
Ich habe nachgeschaut. Die aliase sind aber vorhanden.
Ich habe pirate-weather installiert und auch im Panel eingetragen.
Weiß jemand, warum das so ist oder gibt es hierzu schon einen extra fred?
So wie es aussieht kommen die Alarme jede Stunde einmal.
LG aus dem Sauerland
Jörg
-
Benenne mal den Wetter-Alias im Skript um. Deiner steht auf OWMWetter (openweathermap.0...) und wird nicht aktualisiert. Daher muss der für den anderen Wetteradapter neu geschrieben werden.
Für Pirate-Weather so:
/***** 3. Weather adapter Config *****/ // DE: Mögliche Wetteradapter 'pirate-weather.0.' oder 'brightsky.0.' oder 'openweathermap.0.' oder 'daswetter.0.' (deprecated) oder 'accuweather.0.' (deprecated) // EN: Possible weather adapters 'pirate-weather.0.' or 'brightsky.0.' or 'openweathermap.0.' or 'daswetter.0.' (deprecated) or 'accuweather.0.' (deprecated) const weatherAdapterInstance: string = 'pirate-weather.0.'; // DE: Mögliche Werte: 'Min', 'Max' oder 'MinMax' im Screensaver // EN: Possible values: 'Min', 'Max' or 'MinMax' in the screensaver const weatherScreensaverTempMinMax: string = 'MinMax'; // DE: Dieser Alias wird automatisch für den gewählten Wetter erstellt und kann entsprechend angepasst werden // EN: This alias is automatically created for the selected weather and can be adjusted accordingly const weatherEntityPath: string = 'alias.0.PirateWeather'; //Please rename if change weatherAdapterInstance!
-
@armilar Vielen Dank für die schnelle Antwort.
Meinst du das hier? Das steht alles auf pirate-weather.***** 3. Weather adapter Config *****/ // DE: Mögliche Wetteradapter 'pirate-weather.0.' oder 'brightsky.0.' oder 'openweathermap.0.' oder 'daswetter.0.' (deprecated) oder 'accuweather.0.' (deprecated) // EN: Possible weather adapters 'pirate-weather.0.' or 'brightsky.0.' or 'openweathermap.0.' or 'daswetter.0.' (deprecated) or 'accuweather.0.' (deprecated) const weatherAdapterInstance: string = 'pirate-weather.0.'; // DE: Mögliche Werte: 'Min', 'Max' oder 'MinMax' im Screensaver // EN: Possible values: 'Min', 'Max' or 'MinMax' in the screensaver const weatherScreensaverTempMinMax: string = 'MinMax'; // DE: Dieser Alias wird automatisch für den gewählten Wetter erstellt und kann entsprechend angepasst werden // EN: This alias is automatically created for the selected weather and can be adjusted accordingly const weatherEntityPath: string = 'alias.0.Pirate_Weather'; //Please rename if change weatherAdapterInstance!
???
LG aus dem Sauerland
Jörg