GithubHelp home page GithubHelp logo

iobroker.nspanel-lovelace-ui's Introduction

Logo

ioBroker.nspanel-lovelace-ui

NPM version Downloads Number of Installations Current version in stable repository

NPM

Tests: Test and Release

Übersetzungsstatus

nspanel-lovelace-ui adapter for ioBroker

NsPanel Lovelace UI is a Firmware for the nextion screen inside of NSPanel in the Design of Lovelace UI Design.

Entwickleränderungen / Erklärung

Merkhilfe:

  • Das icon..value anpassen an das val_min/max verhalten von ion..color

Immer wenn ich Zeit und lust habe Dokumentiere ich hier Sachen.

Eingebaut:

  • cardMedia
  • cardGrid/2
  • cardEntities
  • cardPower
  • cardThermo
  • screensaver
  • cardMedia
  • alle Popups und PageItems

Erklärungen

Icons:

Dateneingang:

Zu Icon.x.color: (nix was mit Licht zu tun hat.) Eingabe geht über folgende common Eigenschaftenmöglichkeiten

Funktion

IconEntryType

Sollte alle Icons betreffen abgesehen vom Screensaver zum aktuellen Zeitpunkt.

  • true: ist der default wert sollte immer angegeben werden
  • false: optional der Wert für boolean false
  • text: optional wird auf einer cardGrid/2 angezeigt anstelle des Icons
  • scale: siehe unten
IconScaleElement

scale bekommt eine eigenen Punkt: das object besteht aus folgenden typen: {val_min: number, val_max: number, val_best?: number, log10?: 'max' | 'min';} um es zu verwenden muß icon.true.color und icon.false.color definiert sein. Value bezeichnet einen Wert der häufig von entity1 kommt.

  • wenn nur val_min definiert ist bedeutet val_min >= Value das die Farbe bei true gewählt wird.
  • wenn nur val_max definiert ist bedeutet val_max <= Value das die Farbe bei true gewählt wird.
  • wenn val_max und val_min definiert sind, wird die Farbe von false (val_min) zu true (val_max) interpoliert
  • val_max und val_min werden getauscht, ebenso die Farben für true und false, wenn max < min ist. Falls min und max gleich sind wird die Farbe von true zurückgegeben.
  • wenn zusätzlich val_best definiert ist, ist val_best die Farbe von true und wird jeweils in die Richtungen von val_min/max zu false interpoliert
  • wenn zusätzlich log10 definiert ist, wird bei max ein log10() 1 false, 10 true ausgeführt, bei min (10-value) -> 10 false, 1 true.

ValueEntryType

besteht aus diesen Typen: {value: string | number |boolean; decimal?: number;factor?: number; unit?: string; minScale?: number; maxScale?: number; set?: string | number |boolean; } | undefined;

Wenn *** verlangert wird

  • boolean läd Value und doppelt verneint es.
  • number wird als nummer geladen oder konvertiert dann * factor und mit minScale und maxScale auf 0-100 skaliert.
  • string wird
    • mit type==number als nummer geladen und decimal angewendet
    • oder als String
    • unit wird in beiden Fällen hinzugefügt.

Beim Schreiben:

  • erst wird setversucht, wenn negativ dann value

Sind natürlich alles Dataitems

PageItems

vormalig CreateEntity()

light
  • entity1 ist der Schalter
  • icon (entity1)
  • iconColor: Leuchtmittelfarbe kommt von dem definierten RGB Wert oder von CT (kelvin/mired) oder von IconEntryType entweder scaliert mit dimmer oder entity1
  • dimmer ist ein Zahlenwert
  • colorMode kann die Eigenschaft undefined | 'hue' | 'ct' haben und bestimmt welcher Modus für das Icon verwendet werden soll.
  • headline ist die Item Beschreibung
shutter
  • entity1 ist das level muß eine Zahl sein 0-100
  • icon & iconColor (IconEntryType)(entity1)
  • headline ist die Item Beschreibung
  • valueList ist ein array mit 3 oder 6 Einträgen die die Iconbezeichnung enthält - '' für disable. Felder werden ebenfalls disabled wenn keine Befehlsstate gefunden wird.
number
  • entity1 ist das level muß eine Zahl sein 0-100
  • text.true ist die Bezeichnung
  • icon & iconColor wie shutter
text
  • entity1 kann zahl,boolean sein. Falls es nicht klappt wird von true ausgegangen.
  • entity2 oder text1 ist der text rechts in cardEntites
  • text.true ist die Bezeichnung
  • icon & iconColor wie shutter
button
  • entity1 bestimmt den button Status oder true
  • icon & iconColor wie shutter
  • setValue1 schaltet den angegebenen State um (optional)
  • setValue2 schaltet den angegebenen State auf false (optional)
  • setNavi springt zur angegebenen NavigationsID
input_sel
  • entityInSel als nummer oder boolean oder undefined
  • Icon/Color wie gehabt
  • headline ist die Beschreibung
  • text ist der text rechts in entities
fan
  • entity1 ist der Schalter
  • icon...
  • headline die Beschreibung
timer
  • im moment nur die interne Version komplett eingebaut
  • entity1 noch zu verstreichende Sekunden oder interner Zähler
  • icon...
  • text alternativer text für die anzeige rechts in entitiys standard ist Zeit.

Changelog

0.1.0-preAlpha.0 (2024-03-09)

  • (ticaki) alot :)

0.0.4-preAlpha.3 (2024-02-20)

  • (ticaki) testversion

0.0.4-preAlpha.2 (2024-02-12)

  • (ticaki) Add button flip to cardThermo

0.0.4-preAlpha.1 (2024-02-12)

  • (ticaki) cardThermo, script config

0.0.4-preAlpha.0 (2024-02-01)

  • (ticaki) admin save - still deep alpha

0.0.3-preAlpha.0 (2024-02-01)

  • (ticaki) alot - still dont install this

0.0.2-JustPlaceholder.0 (2024-01-05)

  • (ticaki) initial release

License

MIT License

Copyright (c) 2024 ticaki [email protected]

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

iobroker.nspanel-lovelace-ui's People

Contributors

dependabot[bot] avatar tt-tom17 avatar ticaki avatar iobrokertranslator avatar ciddi89 avatar

Stargazers

 avatar  avatar  avatar  avatar Ilovegym66 avatar

Watchers

 avatar Ilovegym66 avatar  avatar  avatar  avatar

iobroker.nspanel-lovelace-ui's Issues

Idee zu Adapter Templates

Einbau einer Möglichkeit, das durch die Auswahl von z.B. "accuweather" eine Page erzeugt wird die z.B. eine cardGrid enthält, die die aktuelle Temperatur, Wetter, Regenmenge usw anzeigt und schon auf die richtigen States/Aliase(was auch immer) zeigt

Dazu wäre es nötigt das Template so flexibel zu gestalten das man für z.B. auswählt shelly dann Rollanden und den passenden shelly2 - alle weiteren States sollten im Template vorgegeben sein.

Page: darf keine navigation im template enthalten.

weitere Gedanken dazu folgen.

cardMedia - Spotify Repeat Funktion

Die Repeat Funktion hat 3 Zustände im Spotiy-Premium Adapter

                icon: {
                    true: { // Repeat hat im Spotify drei Zustände (off, track, context)
                        value: {
                            type: 'triggered',
                            dp: 'spotify-premium.0.player.repeat',
                            read: `{
                                        switch (val) {
		                                    case 'off':
                                                return 'repeat-variant';
                                            case 'context'
                                                return 'repeat-variant';
			                                case 'track'
                                                return 'repeat-once';
                                            default:
                                                return 'alert-circle-outline';
                                        }
                                    }`,
                        },
                        color: {
                            type: 'triggered',
                            dp: 'spotify-premium.0.player.repeat',
                            read: `{
                                        switch (val) {
		                                    case 'off':
                                                return Color.HMIOff;
                                            case 'context'
                                                return Color.HMIOn;
			                                case 'track'
                                                return Color.HMIOn;
                                            default:
                                                return Color.Red;
                                        }
                                    }`,
                        },
                    },

Das NSPanelTs.ts ist hier einfach unterwegs und taktet einfach die Zustände von spotify-premium.0.player.repeat durch:

                                    switch (deviceAdapterRP) {
                                        case 'spotify-premium':
                                            if (Debug) log(getState(id + '.REPEAT').val);
                                            let stateSpotifyRepeat = getState(id + '.REPEAT').val;
                                            if (stateSpotifyRepeat == 'off') {
                                                setIfExists(id + '.REPEAT', 'context');
                                            } else if (stateSpotifyRepeat == 'context') {
                                                setIfExists(id + '.REPEAT', 'track');
                                            } else if (stateSpotifyRepeat == 'track') {
                                                setIfExists(id + '.REPEAT', 'off');
                                            }

cardMedia - Spotify Tracklist kann "?" im Track enthalten

image

image

JSON-Baum
spotify-premium (2).json

Kurz vorab: Es ist die Frage, ob der Name Spotify-Playlist korrekt ist, da diese InSel nur Tracks enthält und es eine weiter Liste (weiterer Feature Request) gibt, die Playlists zur Auswahl enthält? Ich würde um im Code den Unterschied schneller zu finden, den Begriff TrackLists oder TitleTracks verwenden.

Die InSel-Einträge werden durch "?" getrennt an das Panel gesendet. Wenn ein Track ein "?" enthält, dann wird ein leerer Eintrag erzeugt.

Beispiel:

Aktuell:
Brüder?God of War?My Mother Told Me?Wo sind die Clowns??KEiNE REGELN?Odins Raben?Kaufmann und Maid?Pray To The Hunter?The Dragonborn Comes?Heute Nacht?Loki?Heimdall?Taugenichts?Hypa Hypa?Für immer jung?Große Träume?Königsgarde?Alive now?Nachts weinen die Solda?Dorn im Ohr?Mittelfinger Richtung Z?Ein Wort fliegt wie ein?Rattenfänger?Brunhild?Löwenherz?Nichts bleibt mehr?Der haarige Kobold?Brot und Spiele?Seitdem du weg bist?Wellerman?Mauern aus Angst?Besorgter Bürger?Spielmannsschwur?Hypa Hypa?Geboren um frei zu sein?Eulenspiegel?Vermessung des Glücks?Unsere Zeit?Satans Fall?Pack?Prometheus?Bring mich zurück?Wachstum über alles?Veitstanz?We Drink Your Blood?Nie allein?IX?Maria

Korrekt:
Brüder?God of War?My Mother Told Me?Wo sind die Clowns?KEiNE REGELN?Odins Raben?Kaufmann und Maid?Pray To The Hunter?The Dragonborn Comes?Heute Nacht?Loki?Heimdall?Taugenichts?Hypa Hypa?Für immer jung?Große Träume?Königsgarde?Alive now?Nachts weinen die Solda?Dorn im Ohr?Mittelfinger Richtung Z?Ein Wort fliegt wie ein?Rattenfänger?Brunhild?Löwenherz?Nichts bleibt mehr?Der haarige Kobold?Brot und Spiele?Seitdem du weg bist?Wellerman?Mauern aus Angst?Besorgter Bürger?Spielmannsschwur?Hypa Hypa?Geboren um frei zu sein?Eulenspiegel?Vermessung des Glücks?Unsere Zeit?Satans Fall?Pack?Prometheus?Bring mich zurück?Wachstum über alles?Veitstanz?We Drink Your Blood?Nie allein?IX?Maria

Abgewandeltes Beispiel aus dem NSPanelTs.ts:

Wichtig ist das Einschränken, der Max Einträge und das Bereinigen des Inhaltes

let val = getState('spotify-premium.0.player.playlist.trackListArray').val;
                                
let temp_array: string[] = [];
for (let track_index = 0; track_index < 48; track_index++) {
    let temp_cut_array = getAttr(val, track_index + ".title");
    if (temp_cut_array != undefined) {
        temp_cut_array = (temp_cut_array.replace("?", "")).split(" -");
        temp_cut_array = temp_cut_array[0].split(" (");
        temp_cut_array = temp_cut_array[0];
        if (String(temp_cut_array[0]).length >= 22) {
            temp_array[track_index] = temp_cut_array.substring(0, 20) + "..";
        } else {
            temp_array[track_index] = temp_cut_array.substring(0, 23);
        }
    }
    else {
        break;
    }
}

log(temp_array.join("?"));
  • spotify-premium.0.player.playlist.trackListArray = Playlist, die unter .title den Titel beinhaltet
  • mit der Rückgabe des Index aus der InSel muss der Wert um 1 inkremetiert werden

Beispiel

setState(spotify-premium.0.playlist.trackNo', parseInt(words[4]) + 1); 
  • Um den aktuell abgespielten Titel in der Tracklist blau hinterlegt anzuzeigen wird folgender Datenpunkt benutzt:
    spotify-premium.0.player.trackName

Damit dieser in der Playlist korrekt hinterlegt wird, muss dieser ebenfalls bereinigt werden (siehe Auszug NSPanelTs.ts):

 actualState = getState(pageItem.adapterPlayerInstance + 'player.trackName').val;
 actualState = (actualState.replace('?', '')).split(' -');
 actualState = actualState[0].split(" (");
 actualState = formatInSelText(actualState[0]);

aktuell ist diese immer Im 2. Eintrag der InSel

Achtung:
image
Titel auch im Template falsch geschrieben --> title wäre korrekt

Gruppen für Räume definieren

Das gehört nicht zu meinen Stärken daher deligiert

Wenn wir ein später irgendwann mal das Hausmenü automatisch erstellen wollen brauchen wir eine sinnvolle Untergruppierung. Wenn jemand zum Beispiel 8 Lampen im Raum hat, muss auf der Raumübersicht ein "Licht" Menü sein. Dazu wäre schon jetzt eine Kategorisierung sinnvoll, damit wir diese bei der Erstellung von Templates gleich mit angeben können.

light | shutter | scene | ...

Wäre nett wenn sich da jemand den Kopf drüber zerbricht, vielleicht der mit dem endlos menü ^^

cardMedia - Spotify Playlists dynamisch laden

image

image

Gleicher iob Object-Baum wie bei Tracklist
spotify-premium (2).json

Als Icon verwende ich 'playlist-play'

InSel laden

                valueList: {
                    type: 'state', 
                    dp: 'spotify-premium.0.playlists.playlistListString',
                    read:  `{
                        return val.replaceAll(";","?");
                    }`, 
                },

Die aktuell abgespielte Playlist ist:

if (existsObject(spotify-premium.0.player.playlist.name')) {
    actualState = formatInSelText(getState(spotify-premium.0.player.playlist.name').val);
}

Eine Playlist kann ausgewählt werden über:

let playlistListString = ('spotify-premium.0.playlists.playlistListString').val).split(';');
let playlistListIds = ('spotify-premium.0.playlists.playlistListIds').val).split(';');
let playlistIndex = playlistListString.indexOf(strDevicePI);
setState(spotify-premium.0.playlists.playlistList', playlistListIds[playlistIndex]);

Migration - Denkzettel

Functionalities of NSPanelTs.ts to NSPanel Adapter

The list will be processed gradually

Installation:

  • Tasmota
    • send Template (use with hardware-switches)
    • send Template (use with hardware-buttons)
    • install MQTT-Config
    • setOption146 1 (enable ESP32-Temp)
    • install Berry-Driver
    • install FlashNextion (TFT-Firmware)
    • set Rules
      • No Connection
      • Detach Buttons/Relays

Update:

  • update Tasmota
  • update Berry
  • update TFT

Initialization:

  • pageType~pageStartup
  • find Crash-Ports

Screensaver/Screensaver2:

  • standard
  • alternate
  • advanced
  • ScreensaverNotify - internal triggered
  • ScreensaverNotify - external triggered

Cards:

  • cardMedia
  • cardGrid
  • cardGrid2
  • cardEntities
  • cardPower
  • cardThermo
  • cardMedia
  • cardChart
  • cardLChart
  • cardAlarm
  • cardQR
  • cardUnlock --> modifizierte cardAlarm --> Template

Popups:

  • popupNotify Layout1
  • popupNotify Layout2
  • popupInSel
  • popupFan
  • popuppThermo
  • popupShutter
  • popupLight
  • popupLightNew --> in HMI nicht komplett funktional (Störungen)
  • popupTimer

Entities:

  • delete
  • light mit popup Light
  • shutter mit popupShutter
  • text
  • button
  • timer mit popupTimer
  • number
  • input_sel mit popupInSel
  • fan mit popupFan

Channel Templates:

  • light
    • socket
    • light
    • dimmer
    • dimmer/ct
    • hue
    • rgbSingle
    • rgb
    • xy (cie)
  • shutter
    • cover
      • IKEA Fyrtur
    • blinds with tilt
    • shutter
      • Shelly 2PM
  • text (combined with Prefix, SecondValue, Postfix)
    • window
      • Zigbee2MQTT
      • deConz
      • HmIP
    • door
    • gate
    • motion
    • info
    • humidty
    • temperature
    • pressure
    • thermostat
    • warning
    • timeTable
    • battery
      • Zigbee2MQTT
      • deConz
      • bydhvs
  • button
    • button (Press Button)
    • monoButton (emuliert true/false als Taster)
    • lock (Verschluss)
    • navigation
  • timer
    • timer --> Set Countdown
    • alarmClock --> Set Time
  • fan
    • fan
  • number (Slider)
    • volume
    • volumeGroup
    • slider (generell)

Service

  • Sevice Menu --> Admin
    • set Dimmode
    • set Language
    • make Updates
    • reboot NSPanel
    • ...

Gateways

  • Dimmode
    • const
    • triggered
    • time events
  • Notifications on Popup (external)
  • Notifications on Screensaver (external)
  • Trigger Active Brightness
  • MRIconsFont small/large
  • Jump 2 Page external
  • Control Relays from DP

Page Templates

  • cardMedia
    • Alexa
      • Basic Functionality (headline, logo, title, artist, album, play, pause, stop, on/off)
      • Shuffle
      • Speakerlist
      • Define manual favorites in Playlists
      • EQ
      • Repeat
      • Volume
    • Spotify-Premium
      • Basic Functionality (headline, logo, title, artist, album, play, pause, stop, on/off)
      • Shuffle
      • Speakerlist
      • Playlists
      • Playlist/Tracklist
      • Seek
      • EQ
      • Repeat
      • Volume
    • Sonos
      • Basic Functionality (headline, logo, title, artist, album, play, pause, stop, on/off)
      • Shuffle
      • Speakerlist
      • Playlists
      • Playlist/Tracklist
      • Favorite List
      • Seek
      • Crossfade
      • Repeat
      • Volume
    • Bose-Soundtouch
      • Basic Functionality (headline, logo, title, artist, album, play, pause, stop, on/off)
      • Shuffle
      • Favorites
      • Repeat
      • Volume
    • SqueezeboxRPC
      • Basic Functionality (headline, logo, title, artist, album, play, pause, stop, on/off)
      • Shuffle
      • Playlists
      • Playlist/Tracklist
      • Seek
      • Repeat
      • Volume
    • Volumio (Adapter crashed)
  • cardThermo
    • Wall Thermostat
      • Sonoff NSPanel (Control with NFC, Underfloor heating)
      • HmIP with AP
      • HmIP with CCU
    • Radiator Thermostat (Valve)
      • HmIP with AP
      • HmIP with CCU
      • Homatic
      • Tado
      • Max!
      • Zigbee2MQTT
      • Zigbee
      • deConz
    • Climate
    • Pool Climate
    • Heatpump
      • daikin-cloud
    • cardAlarm
      • Alarm system
      • Page Protection (Unlock)
    • cardQR
      • Wifi with Switch
      • Wifi with Text (show/hide Password)
    • cardChart
      • Power/Time
      • Battery-Load
      • ...
    • cardLChart
      • Temperature
      • Humidity
      • ...
    • Screensaver
      • Unlimeted Entities
      • Rolling Entities
      • Accuweather Icons
      • Changing Icon on next Sunrise/Sunset event
      • Das Wetter Icons
      • Jump 2 Page from Indicator
      • Leave on Single Click
      • Leave on Double Click

Special Page Templates based on cardEntities/cardGrid)

  • Waste Calendar (on iCal)
  • WLED
  • Scene Changer
  • timetableDeparture (on Fahrplan)
  • Routes (on Fahrplan)

popUpThermo - Serial nicht korrekt

image

NSPanelTS.ts Adapter
entityUpdateDetail~ entityUpdateDetail~
alias.0.NSPanel_1.TestKlimaanlage~ 3~
~ ~
11487~ 11487~
Schwenk-Modus~ ~
modus1~ preset_modes~
null~ 3?1~
Auto?0?1?2?3~ preset_modes~
Speed~ 1?2?3?4?5?6?7?8?9?10?11?12?13~
modus2~ swing_modes~
null~ 3?2~
Auto?0?1?2?3?4?5~ swing_modes~
Temperatur~ 1?2?3?4?5?6?7?8?9?10?11?12?13~
modus3~  
null~  
Auto?Manual?Boost  

Aus CustomSend

NSPanelTS.ts
entityUpdateDetail~alias.0.NSPanel_1.TestKlimaanlage~~11487~Schwenk-Modus~modus1~null~Auto?0?1?2?3~Speed~modus2~null~Auto?0?1?2?3?4?5~Temperatur~modus3~null~Auto?Manual?Boost

Adapter (sind da Steuerzeichen drin?)

entityUpdateDetail~3~~11487~~preset_modes~3?1~preset_modes~1
?2
?3
?4
?5
?6
?7
?8
?9
?10
?11
?12
?13
~swing_modes~3?2~swing_modes~1
?2
?3
?4
?5
?6
?7
?8
?9
?10
?11
?12
?13
~

Fehler beim laden der AdapterUpdate Detailseite

Meldung :
nspanel-lovelace-ui.0 (30638) [StatesDB.///AdapterUpdate.29?0.true] Read for dp: admin.0.info.updatesJson is invalid! read: if (!val || !val.startsWith('{') || !val.endsWith('}')) return '';
const v = JSON.parse(val)
return (
v.device-watcher ? ('v' + v.device-watcher.installedVersion.trim() + "\r\nv" + (v.device-watcher.availableVersion.trim() + ' ' )) : 'done'
); Error: ReferenceError: watcher is not defined

Weblate could not merge upstream changes while updating the repository.

Could not merge the repository.
Weblate could not merge upstream changes while updating the repository.
Rebasing (1/2)
error: could not apply b476ecb... Translated using Weblate (German)
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply b476ecb... Translated using Weblate (German)
Auto-merging admin/i18n/de/translations.json
CONFLICT (content): Merge conflict in admin/i18n/de/translations.json
(1)
Typical workflow for fixing merge conflicts

  1. Commit all pending changes in Weblate and lock the translation component.
    wlc commit; wlc lock
  2. Add Weblate exported repository as a remote.
    git remote add weblate https://weblate.iobroker.net/git/adapters/nspanel-lovelace-ui/ ; git remote update weblate
  3. Merge Weblate changes and resolve any conflicts.
    git merge weblate/main
  4. Push changes into upstream repository.
    git push origin main
  5. Weblate should now be able to see updated repository and you can unlock it.
    wlc pull ; wlc unlock

Weblate has merge conflict

Rebasing (1/2)
error: could not apply c83a6ff... Translated using Weblate (English)
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply c83a6ff... Translated using Weblate (English)
Auto-merging admin/i18n/en/translations.json
CONFLICT (content): Merge conflict in admin/i18n/en/translations.json

write: false zu createStateAsync hinzufügen

Ihr könntet mir den Gefallen tun und bei allen createState... im common.write hinzufügen. true für States die der Nutzer beschreiben kann, sollen könne und false für alles was er nur lesen soll.

await createStateAsync(NSPanel_Path + 'IoBroker.ScriptName', 'v' + javaScriptVersion, { type: 'string', write: false });

cardMedia - Spotify Seek Funktion

image

image

verwendetes Icon: 'play-speed'

InSel befüllen
valueList: {type: 'const', constVal: '0%?10%?20%?30%?40%?50%?60%?70%?80%?90%?100%'},

InSel Rückgabe mit 10 multiplizieren
setState('soptify-premium.0.player.progressPercentage', parseInt(words[4]) * 10);

cardMedia - Spotify Speakerlist dynamisch laden

image

image

Gleicher Objektbaum wie bei Tracklist und Playlist
spotify-premium (2).json

Verwendetes Icon:

                icon: {
                    true: {
                        value: {type: 'const', constVal: 'speaker'},
                        color: {type: 'const', constVal: Color.HMIOn},
                    },
                    false: undefined,
                    scale: undefined,
                    maxBri: undefined,
                    minBri: undefined,
                },

Laden der InSel:

                valueList: {
                    type: 'triggered',
                    dp: 'spotify-premium.0.devices.availableDeviceListString',
                    read:  `{
                                return val.replaceAll(";","?");
                            }`, //funktioniert
                },
                headline: {type: 'const', constVal: 'Speakerauswahl'}

Markieren des aktuellen Speakers (Muss ebenfalls durch InSel-Formatierung:

   currentSpeaker = getState('spotfy-premium.0.player.device.name').val;

Auswahl eines Speakers zum Abspielen:

                            let strDevicePI = pageItem.speakerList![words[4]];
                            let strDeviceID = spotifyGetDeviceID(strDevicePI);
                            setState(adapterInstance + 'devices.' + strDeviceID + ".useForPlayback", true);
                            break;

Hilfsfunktion:

function spotifyGetDeviceID(vDeviceString: string): string {
    const availableDeviceIDs: string = getState("spotify-premium.0.devices.availableDeviceListIds").val;
    const availableDeviceNames: string = getState("spotify-premium.0.devices.availableDeviceListString").val;
    let arrayDeviceListIds: string[] = availableDeviceIDs.split(";");
    let arrayDeviceListSting: string[] = availableDeviceNames.split(";");
    let indexPos: number = arrayDeviceListSting.indexOf(vDeviceString);
    let strDevID = arrayDeviceListIds[indexPos];
    return strDevID;
}

image

cardMedia - Spotify - oberer Bereich - Funktionen und Inhalt

Dieses Issue ist ein Mix aus Bugs und Wünschen...

Die Zuordnung der Inhalte lässt sich ja ändern

Nextion_Editor_eNb1uBkfFE

Was im oberen Bild beim Scrollen auffällt, ist:

  • Der Text in der 1. Zeile wird geladen und
    • schiebt, weil zu lang Elapsed und Duration in den negativen rechten Bereich
    • entfernt die Zeichen von links nach rechts bis nichts mehr da ist (kommt erst wieder mit nächstem Track)
    • Die Aktualisierung von Elapsed ist nicht Zeitsynchron
  • Headline alles Prima, aber auch nicht Zeitsynchron (Als würde da eine Funktion das auf 2 Sekunden zu Drücken versuchen)
  • Der Text in der 2. Zeile ist in der Farbe nicht änderbar

Der Adapter liefert jedoch mehr Informationen als title, album und artist.

In der Regel habe ich z.B. für die nachfolgende DP-Zuordnung folgende Einstellung
headline: contentDescription
Zeile 1: title
Zeile 2: artist ' | ' album

Beispiel für Informationen und Datenpunkte:

* spotify-premium.0.player.contextDescription --> Beispiel: 'Playlist: This Is Saltatio Mortis'
* spotify-premium.0.player.album --> Beispiel: 'Das Schwarze Einmaleins'
* spotify-premium.0.player.artistName --> Beispiel: 'Saltatio Mortis'
* spotify-premium.0.player.trackName --> Beispiel: 'Früher war alles besser'

Da die Texte ja Scrollen können, wäre das also auch für die 2. Zeile ein Scrollen möglich, falls dies gewollt ist, die Zeile länger als X Zeichen ist und das Scrollen eingeschaltet ist

Falls das Scrollen aus ist, sollte die maximale Anzahl begrenzt werden, damit der Text nicht in den (negativen) rechten Bereich verschwindet. Evtl kann man ja Punkte '...' hinten dran setzen, um zu signalisieren, dass es gekürzt ist.

Color Scale ändert im Icon nur mit entity1 und entity2

Describe the bug
A clear and concise description of what the bug is.

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '...'
  3. Scroll down to '....'
  4. See error

Expected behavior

        // Indicator 5 - Wasserstand an der Ems
        {
            role: 'text',
            dpInit: '',
            type: 'text',
            modeScr: 'indicator',
            data: {
                entity1: {
                    value: {
                        type: 'triggered',
                        dp: '0_userdata.0.Wasserstand.KNOCK.Wert',
                    },
                    decimal: undefined,
                    factor: undefined,
                    unit: undefined
                },
                entity2: {
                    value: {
                        type: 'triggered',
                        dp: '0_userdata.0.Wasserstand.KNOCK.Wert',
                    },
                    decimal: undefined,
                    factor: undefined,
                    unit: undefined
                },
                icon: {
                    true: {
                        value: {
                            type: 'const',
                            constVal: 'waves-arrow-up'
                        },
                        color: {
                            type: 'const',
                            constVal: Color.MSGreen
                        }
                    },
                    false: {
                        value: {
                            type: 'const',
                            constVal: 'waves-arrow-up'
                        },
                        color: {
                            type: 'const',
                            constVal: Color.MSRed
                        }
                    },
                    scale: {
                        type: 'const',
                        constVal: {'val_min': 0, 'val_max': 985, 'val_best': 500}
                    },
                    maxBri: undefined,
                    minBri: undefined,
                },
                text: {
                    true: {
                        type: 'const',
                        constVal: 'Wasserstand',
                    },
                    false: undefined,
                },
            },
        },

wie gewünscht... Das Issue mit der Config

Farben für Scale ändern sich nur, wenn beide Entitäten (entity1 und entity2) angelegt sind.

Screenshots & Logfiles
If applicable, add screenshots and logfiles to help explain your problem.

Versions:

  • Adapter version:
  • JS-Controller version:
  • Node version:
  • Operating system:

Additional context
Add any other context about the problem here.

Admin TODO für jeden

Ich stelle mit die Adminkonfiguration für Screensaver so vor:

oben hat man ein Auswahlfeld und ein Bild von dem aktuell ausgewählten Screensaver und eine Numerierung/Beschriftung der Felder. Bei weitere Auswahl von Feld Links 1. wird dann left ganz oben optisch hervorgehoben und der Nutzer kann in weiteren Konfigurationsfeldern die Einstellung für dieses Feld anpassen.

Dazu sind ein Haufen Bilder nötig die base64 codiert sein müssen. Welche Format sie haben sollten muß besprochen werden und ob png etc. weiß ich noch nicht, das müsste man testen:

wird dann per imageSendTo vom Adapter an den Admin geschickt: https://github.com/ioBroker/ioBroker.admin/blob/master/packages/jsonConfig/SCHEMA.md

cardMedia - Equalizer-List in Template hinterlegen

image

Wäre schön, wenn der Equalizer (On/Off) im Template Platz finden würde...

Lässt sich super mit Alexa-Devices kombinieren, da die bereits per Adapter eine Klangsteuerung haben

valueList: {type: 'const', constVal: 'Bassboost?Klassik?Dance?Deep?Electronic?Flat?Hip-Hop?Rock?Metal?Jazz?Latin?Tonstärke?Lounge?Piano'}

Rückgabe Index in DP

cardMedia - Spotify - Mittlerer Bereich und Kleinigkeiten

image

  • Next/Prev/Pause/Play arbeiten einwandfrei

  • Logo fehlt ('spotify' in colorSpotify)

  • Merker für VolumeSlider - gemeinsame Anpassungen Tests

  • Power Button: Spotify hat kein On/Off, daher sollte der analog Pause reagieren aber dann auch die Farbe wechseln.

  • Es sind im Template Verweise auf 0_userdata.0.
    image

  • Spotfy hat kein Stop

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.