Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Vorlage] Alias per Skript erzeugen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Vorlage] Alias per Skript erzeugen

    This topic has been deleted. Only users with topic management privileges can see it.
    • da_Woody
      da_Woody @Marty56 last edited by

      @marty56 du wirst ja nicht alle 100 gleichzeitig ändern, oder? wenn du eines ändern willst, lösch es aus dem objektbaum und leg es neu an. das kann man auch mit 5, oder 10 machen. wo ist da das problem? im script müsstest du ja auch angeben welchen alias du löschen möchtest...

      M 1 Reply Last reply Reply Quote 0
      • M
        Marty56 @da_Woody last edited by

        @da_woody
        Dieser umständliche Weg war mir natürlich klar, deshalb ja meine Anfrage 😞

        Aber ja, es gibt durchaus Problemstellungen, wo ich alle neuanlegen will.

        Man kann auch nicht alle Aliases auf einmal löschen.

        da_Woody B 2 Replies Last reply Reply Quote 0
        • da_Woody
          da_Woody @Marty56 last edited by

          @marty56 said in [Vorlage] Alias per Skript erzeugen:

          Man kann auch nicht alle Aliases auf einmal löschen.

          ?nein?
          43b801e3-592f-4c5c-8b36-441352443791-grafik.png

          1 Reply Last reply Reply Quote 0
          • B
            bishop @Marty56 last edited by bishop

            wenn ich den erstellten Alias DP lösche und ich ihn dann neu erstellen möchte bekomme ich.

            javascript.0	2021-02-13 09:47:11.248	warn	(1231) script.js.common.Alias_erstellen_paul53: alias.0.Batterien_Prozent.SwitchButton schon vorhanden !
            

            wo muss ich den rauslöschen?
            Der DP ist nicht mehr vorhanden im Objectbaum

            dslraser paul53 2 Replies Last reply Reply Quote 0
            • dslraser
              dslraser Forum Testing Most Active @bishop last edited by dslraser

              @bishop sagte in [Vorlage] Alias per Skript erzeugen:

              wenn ich den erstellten Alias DP lösche und ich ihn dann neu erstellen möchte bekomme ich.

              einmal admin neu starten (nicht stoppen, nur neu starten mit dem Pfeilkreis)

              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 last edited by paul53

                @marty56 sagte: Wäre es möglich, dass man per Script einen Alias löscht und dann wieder neu anlegt?

                Man kann das Script durch Auskommentieren von 3 Zeilen so ändern, dass es überschreibt: Im Orginal Zeilen 29, 30 und 73.
                Anschließend nicht vergessen, die Änderung rückgängig zu machen!

                da_Woody M 2 Replies Last reply Reply Quote 0
                • paul53
                  paul53 @bishop last edited by paul53

                  @bishop sagte: Der DP ist nicht mehr vorhanden im Objectbaum

                  Die Javascript-Instanz neu starten, damit der Datenpunkt auch im Instanz-Puffer gelöscht wird.

                  B 1 Reply Last reply Reply Quote 0
                  • B
                    bishop @paul53 last edited by

                    @paul53
                    danke geht

                    1 Reply Last reply Reply Quote 0
                    • da_Woody
                      da_Woody @paul53 last edited by

                      @paul53 da ich neugierig bin (auskommentieren der 3 zeilen), hab ich das script nochmal kopiert und neu unter scripte eingefügt (firefox). daraufhin haben die zeilen zahlen überhaupt nicht mehr gestimmt. es wurde einfach überall eine leerzeile eingefügt (153 zeilen). das ganze mit chrome am selben PC (Win10) und siehe da, nur mehr 76 zeilen!
                      ist nur als warnung gedacht, falls jemand da was bemängelt...

                      paul53 1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 @da_Woody last edited by

                        @da_woody sagte: es wurde einfach überall eine leerzeile eingefügt

                        Das passiert nur mit Firefox.

                        da_Woody 1 Reply Last reply Reply Quote 0
                        • da_Woody
                          da_Woody @paul53 last edited by

                          @paul53 hab ich ja geschrieben... seltsam ist das allemal...

                          1 Reply Last reply Reply Quote 0
                          • M
                            Marty56 @paul53 last edited by

                            @paul53 Danke funktioniert super.

                            M 1 Reply Last reply Reply Quote 0
                            • M
                              Marty56 @Marty56 last edited by

                              @paul53

                              Beim Erzeugen für den alias eines Homematic Temperaturfühlers bekomme ich

                              javascript.0	2021-02-16 09:34:13.603	warn	(6593) This object will not be created in future versions. Please report this to the developer.
                              javascript.0	2021-02-16 09:34:13.603	warn	(6593) Object alias.0.AS_Thermo_TEMPERATURE is invalid: obj.common.custom has an invalid type! Expected "object", received "object"
                              

                              Bei allen meinen Datenpunkten ist
                              custom = [];

                              Mir ist nicht klar, was ich hier eintragen soll

                              Dieselbe Ausgabe bekomme ich beim Strommessgerät.

                              B paul53 2 Replies Last reply Reply Quote 0
                              • B
                                bishop @Marty56 last edited by

                                @marty56

                                wie in meinem Post oben

                                ist nicht das Script von hier!

                                1 Reply Last reply Reply Quote 0
                                • M
                                  Marty56 last edited by

                                  @bishop mit

                                  custom = undefined
                                  

                                  funktioniert es.

                                  B 1 Reply Last reply Reply Quote 0
                                  • B
                                    bishop @Marty56 last edited by

                                    @marty56

                                    gut zu wissen!

                                    Danke

                                    1 Reply Last reply Reply Quote 0
                                    • paul53
                                      paul53 @Marty56 last edited by paul53

                                      @marty56 sagte: is invalid: obj.common.custom has an invalid type! Expected "object", received "object"

                                      Ändere Zeile 23 in

                                      custom = {}; // verhindert doppelte Ausführung von history, ...
                                      

                                      Die neuen Versionen des js-controller unterscheiden zwischen array und und object, das kein Array ist.

                                      JoJo58 1 Reply Last reply Reply Quote 1
                                      • M
                                        Michi68 @bishop last edited by

                                        @bishop
                                        du hast ja auch das Script von CruziX benutzt wenn ich das richtig sehe, hatte eben die gleichen Fehler hab dann
                                        Zeile 172

                                        obj.common.custom = []; // Damit die Zuordnung zu iQontrol, Sql etc. nicht übernommen wird
                                        

                                        in

                                        obj.common.custom = {}; // Damit die Zuordnung zu iQontrol, Sql etc. nicht übernommen wird
                                        

                                        also die [] gegen die {} getauscht
                                        dann sollte es wieder gehen, kannst du ja mal Testen, hab sonst von Javascript keine ahnung.
                                        einfach mal ausprobiert und es ging
                                        hat mich gerade @Paul53 drauf gebracht Danke dafür

                                        Gruß Michael

                                        B 1 Reply Last reply Reply Quote 0
                                        • B
                                          bishop @Michi68 last edited by

                                          @michi68

                                          Danke, funktioniert 🙂

                                          lobomau 1 Reply Last reply Reply Quote 0
                                          • lobomau
                                            lobomau @bishop last edited by

                                            Ich habe in meinen Alias folgenden Fehler. Im Script muss da wohl etwas angepasst werden. Weiß jemand was? Als Beispiel habe ich einen Alias error hingeschrieben. Ist bei fast allen anderen im Script auch so.

                                            Alias subscription error. Please check your alias definitions: sourceId=tesla-motors.0.LRW3E7EK4MC387xxx.charge_state.usable_battery_level, sourceObj={"type":"state","common":{"name":"usable_battery_level","role":"value","type":"number","write":false,"read":true},"native":{},"from":"system.adapter.tesla-motors.0","user":"system.user.admin","ts":1644763935883,"_id":"tesla-motors.0.LRW3E7EK4MC387xxx.charge_state.usable_battery_level","acl":{"object":1636,"state":1636,"owner":"system.user.admin","ownerGroup":"system.group.administrator"}}
                                            

                                            Script:

                                            // Originalversion: User Paul53, https://forum.iobroker.net/topic/27295/vorlage-alias-per-skript-erzeugen
                                            // Angepasst an die asynchrone Eigenschaft von Javascript, kleine Ergänzungen.
                                            
                                            const vin = "LRW3E7EK4MC387xxx"; // VIN des Teslas eintragen 
                                            const prefix = 'alias.0.';
                                            const custhist = {
                                                 /* "history.0": {
                                                    "enabled": true,
                                                    "changesOnly": true,
                                                    "debounce": "200",
                                                    "maxLength": "960",
                                                    "retention": "1209600",
                                                    "changesRelogInterval": "0",
                                                    "changesMinDelta": 0,
                                                    "aliasId": ""
                                                  }, */
                                                  "influxdb.0": {
                                                    "enabled": true,
                                                    "changesOnly": true,
                                                    "debounce": "200",
                                                    "retention": "63072000", 
                                                    "changesRelogInterval": "0",
                                                    "changesMinDelta": 0,
                                                    "storageType": "",
                                                    "aliasId": ""
                                                  }
                                                };
                                             
                                            // Aliasdefinition als Array of Objects
                                            var aa = [
                                            /***
                                            {
                                                idOrigin : prefix + '',      // Orignal-Datenpunkt
                                                idRead : '',        // Status-Datenpunkt, wenn Status und Kommando getrennt. Leer wenn keine Trennung
                                                idAlias : prefix + '',       // Alias-Datenpunkt
                                                recreate : false,   // true: evtl. existierender Alias wird gelöscht - EXPERIMENTAL
                                                extend : true,      // true: evtl. existierender Alias wird ergänzt - EXPERIMENTAL: extendObject() statt setObject()
                                                typeAlias : '',     // Datentyp für Alias: number, boolean, mixed
                                                read : '',          // "val < 20 ? true : false" // Erkennung "Aus" --> false erfolgt automatisch
                                                write : '',         // "val ? 'Ein' : 'Aus'"
                                                nameAlias : '',     // Bezeichnung
                                                role : '',          // ioBroker Rolle
                                                desc : '',          // Beschreibung
                                                min : 0,            // Minimalwert, nur bei Datentyp number
                                                max : 100,          // Maximalwert, nur bei Datentyp number
                                                unit : '',          // Einheit bei Datentyp number: %, W, °C, usw.
                                                states : '',        // {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
                                                custom : [];        // leeres Array wird automatisch gesetzt, falls nichts angegeben. Verhindert doppelte Ausführung von
                                                history, ...
                                                raum : '',          // enum.room, Groß-/Kleinschreibung in der ID beachten
                                                gewerk : '',        // enum.function, Groß-/Kleinschreibung in der ID beachten
                                                owner : '',         // Owner, etwa system.user.admin
                                                group : '',         // Group, etwa system.group.familie
                                            },
                                            ***/
                                             
                                            // ---------------------------------------------------------------------------
                                            // Tesla charge
                                            // ----------------------------------------------------------------------------
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.charge_port_latch',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charge_port_latch',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla charge_port_latch',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.battery_heater_on',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.battery_heater_on',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla battery_heater_on',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.battery_level',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.battery_level',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla battery_level',
                                                unit : '%',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.battery_range_km',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.battery_range_km',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla battery_range',
                                                unit : 'km',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.charge_energy_added',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charge_energy_added',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla charge_energy_added',
                                                unit : 'kWh',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.charge_limit_soc',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charge_limit_soc',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla charge_limit_soc',
                                                unit : '%',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.charge_km_added_rated',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charge_miles_added_rated',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla charge_km_added_rated',
                                                unit : 'km',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.charge_rate',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charge_rate',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla charge_rate',
                                                //unit : 'km',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.charger_power',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charger_power',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla charger_power',
                                                //unit : 'km',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.charging_state',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charging_state',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla charging_state',
                                                //unit : 'km',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.est_battery_range_km',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.est_battery_range_km',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla est_battery_range_km',
                                                unit : 'km',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.fast_charger_present',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.fast_charger_present',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla fast_charger_present',
                                                //unit : 'km',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.ideal_battery_range_km',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.ideal_battery_range_km',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla ideal_battery_range_km',
                                                unit : 'km',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.minutes_to_full_charge',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.minutes_to_full_charge',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla minutes_to_full_charge',
                                                unit : 'min',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.preconditioning_enabled',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.preconditioning_enabled',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla preconditioning_enabled',
                                                //unit : 'min',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            {
                                            	idAlias : prefix + 'Tesla.charge_state.usable_battery_level',
                                            	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.usable_battery_level',
                                            	recreate : true,
                                            	extend : true,
                                            	nameAlias : 'Tesla usable_battery_level',
                                                unit : '%',
                                            	raum : 'tesla',
                                            	custom : custhist,
                                            	owner : "system.user.admin",
                                            	group : "system.group.user"
                                            },
                                            ];
                                             
                                             
                                            // ******************************
                                             
                                            // -------------------------------------------------
                                            // -------------------------------------------------
                                            function alias2enum(a, en, cb) {
                                                cb = (typeof(cb) === 'function') ? cb : function() {};
                                                if (en) {
                                                    var o = getObject(en); 
                                                    if(o) {
                                                        if (!o.common.members.includes(a)) {
                                                            o.common.members.push(a);
                                                            setObject(en, o, function(e, o) { cb(); });
                                                        } else cb();
                                                    } else {
                                                        log('alias2enum: ' + en + ' cannot get object', 'warn');
                                                        cb();
                                                    }
                                            	} else {
                                                    log('alias2enum: ' + en + ' is invalid', 'warn');
                                                    cb();
                                                }
                                            }    
                                             
                                             
                                            // ---------------------------------------------------
                                            // ---------------------------------------------------
                                            function createAlias(o, cb) {
                                                var obj = {};
                                                
                                                cb = (typeof(cb) === 'function') ? cb : function() {};
                                             
                                                if (!o || ! o.idOrigin || !o.idAlias) {
                                                    log(o, 'error');
                                                }
                                                
                                                if (!existsState(o.idOrigin)) {
                                                    log(o.idOrigin + ' existiert nicht', 'warn');
                                                    cb();
                                                    return;
                                                }
                                             
                                                if (existsState(o.idAlias)) {
                                                    if (o.recreate) {
                                                        log(o.idAlias + ' wird gelöscht', 'warn');    
                                                        // EXPERIMENTAL
                                                        // deleteObject() gibt keinen Fehler aus, löscht aber auch nicht.
                                                        // falsche Anwendung? --> Recherchieren... ;-)
                                                        // workaround: recreate auf false und extend auf true setzen.
                                                        deleteObject(o.idAlias, false, function(err, obj) {
                                                            o.recreate = false;
                                                            o.extend = true;
                                                            createAlias(o, cb);
                                                            return;
                                                        });
                                                    } else if (!o.extend) {
                                                        log(o.idAlias + ' schon vorhanden')
                                                        cb();
                                                        return;
                                                    } else {
                                                        log(o.idAlias + ' wird ergänzt');
                                                    }
                                                } else {
                                                    log(o.idAlias + ' wird angelegt');
                                                }
                                             
                                                obj.type = 'state';
                                                obj.common = getObject(o.idOrigin).common;
                                                obj.acl = getObject(o.idOrigin).acl;
                                                obj.common.alias = {};
                                             
                                                if(o.idRead) {
                                                    obj.common.alias.id = {};
                                                    obj.common.alias.id.read = o.idRead;
                                                    obj.common.alias.id.write = o.idOrigin;
                                                    obj.common.read = true;
                                                } else obj.common.alias.id = o.idOrigin;
                                                
                                                if(o.typeAlias) obj.common.type = o.typeAlias;
                                                if(obj.common.read !== false && o.read) obj.common.alias.read = o.read;
                                                if(obj.common.write !== false && o.write) obj.common.alias.write = o.write;
                                                if(o.nameAlias) obj.common.name = o.nameAlias;
                                                if(o.role) obj.common.role = o.role;
                                                if(o.desc) obj.common.desc = o.desc;
                                                if(o.min !== undefined) obj.common.min = o.min;
                                                if(o.max !== undefined) obj.common.max = o.max;
                                                if(o.unit) obj.common.unit = o.unit;
                                                if(o.states) obj.common.states = o.states;
                                                if(o.owner && obj.acl.owner) obj.acl.owner = o.owner;
                                                if(o.group && obj.acl.ownerGroup) obj.acl.ownerGroup = o.group;
                                              
                                                if(o.custom) {
                                                    obj.common.custom = o.custom;
                                                } else {
                                                    obj.common.custom = [];
                                                }
                                                
                                                obj.native = {};
                                            	
                                                // EXPERIMENTAL
                                                // Auswirkung von extendObject() auf Historydaten?
                                                extendObject(o.idAlias, obj, function(e, oa) {
                                                    if (e) {
                                                        log('Alias ' + o.idAlias + ' nicht angelegt - Fehler ' + e, 'error');
                                                        cb();
                                                        return;
                                                    }
                                                    log(o.idAlias + ' wird zum Raum ' + o.raum + ' hinzugefügt', 'info');
                                                    alias2enum(o.idAlias, 'enum.rooms.' + o.raum, function() {
                                                        if (o.gewerk) {
                                                            log(o.idAlias + ' wird zur Funktion ' + o.gewerk + ' hinzugefügt', 'info');
                                                            alias2enum(o.idAlias, 'enum.funtions.' + o.gewerk, cb);
                                                        } else cb();
                                                    });
                                                }); 
                                            }
                                             
                                             
                                            // ---------------------------------------------------
                                            // ---------------------------------------------------
                                            function createAliases() {
                                            	if (!aa) return;
                                            	if (!aa.length) return;
                                            	createAlias(aa.shift(), createAliases);
                                            }
                                             
                                             
                                            // *******************************
                                             
                                            createAliases();
                                            
                                            Garfonso 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            869
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            38
                                            314
                                            48496
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo