Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. zig gleiche Einträge in JS-Protokollanzeige

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.8k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.4k

zig gleiche Einträge in JS-Protokollanzeige

Geplant Angeheftet Gesperrt Verschoben JavaScript
18 Beiträge 6 Kommentatoren 918 Aufrufe 4 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • H hub01

    @asgothian sagte in zig gleiche Einträge in JS-Protokollanzeige:

    @hub01 zeig mal das Skript. Da ist was faul

    Ist ziemlich lang.
    Ich könnte nur den Teil rauskopieren, der die Meldungen erzeugt.

    Aber im Logfile stehen ja alle Meldungen richtig drin.
    Wenn es am Script liegt, müsste dies doch auch im Logfile zu sehen sein?

    T Nicht stören
    T Nicht stören
    ticaki
    schrieb am zuletzt editiert von ticaki
    #9

    @hub01

    ist es länger als das:

    export {};
    const DEBUG = false;
    
    const cMinLux = 1800;
    const luxminFront = 60;
    const luxminBehind = 80;
    const luxminComputer = 20;
    let front = false;
    let behind = false;
    let behindComputer = false;
    
    const miredDiff = 180;
    
    const dimValueOptions: dimValueOptionsType = {
        begin: '21:00',
        end: '23:00',
        reset: '6:00',
        sunset: 340
        // default values here
    }
    
    // für hinteren Bereich
    const cShutterPosForLight = 60;
    
    let hyperion_on = getState('sonoff.0.Gosund Steckdose 8.POWER').val;
    const path = '0_userdata.0.scene'
    const cCurrentLuxState = 'alias.0.zuhause.og.Abstellraum.Lux-Tasmota.lux';
    
    const mySwitch = 'zigbee2mqtt.0.0x001788010635d03f.';
    const mySwitch2 = 'zigbee2mqtt.0.0x0017880104f33a08.';
    var mySwitchTimeout:any = null;
    const axios = require('axios');
    //Objekte;
    const dimmer:{[key: number]: {value: number, timeout: any}} = {};
    let autoModeBright = existsState(`${path}.wohnzimmer.autoModeBright`) ? getState(`${path}.wohnzimmer.autoModeBright`).val : false;
    
    let autoModeOffTimeout = autoModeBright ? 15000 : 3000
    // homematic 6 fach schalter
    // Wandlampe Wohnzimmer
    
    const cShutterPos = 'homepilot20.0.Actuator.2-27601565.Position'
    let shutterPos = getState(cShutterPos).val;
    
    on({id: cShutterPos, change: 'ne'}, (obj) => {
        shutterPos = obj.state.val
    })
    on({ id: 'hm-rpc.1.000B5D89B01C44.1.PRESS_SHORT', change: 'any', val: true }, function (obj) {
       flipState(`${path}.wohnzimmer.autoModeBright`);
    })
    
    on({ id: 'hm-rpc.1.000B5D89B01C44.3.PRESS_SHORT', change: 'any', val: true }, function (obj) {
       flipState('sonoff.0.NOUS 03.POWER')
    })
    
    on({ id: 'hm-rpc.1.000B5D89B01C44.6.PRESS_SHORT', change: 'any', val: true }, function (obj) {
        if (!mySwitchTimeout) {
            mySwitchTimeout = setTimeout(function () {
                autoScene(0);
                mySwitchTimeout = null;
            }, 300);
        }
    })
    on({ id: 'hm-rpc.1.000B5D89B01C44.2.PRESS_SHORT', change: 'any', val: true }, function (obj) {
        flipState('shelly.0.SHSW-1#E8DB84D7B242#1.Relay1.Switch')
    })
    on({ id: 'hm-rpc.1.000B5D89B01C44.4.PRESS_SHORT', change: 'any', val: true }, function (obj) {
        flipState('sonoff.0.NOUS 05.POWER')
    })
    on({ id: 'hm-rpc.1.000B5D89B01C44.5.PRESS_LONG_START', change: 'any', val: true }, function (obj) {
        let lights = $('state(functions=beleuchtung)');
        if (lights) {
            lights.each(async (obj) => {
                await sleep(100)
                const obj2 = getObject(obj, 'rooms');
                let rooms = obj2.enumIds
                if (rooms === undefined) return;
                rooms.forEach(async (room) => {
                    await sleep(20)
                    // workaround manche Geräte enthalten Räume die ich nicht entfernen kann.
                    var enumObj = getObject(room);
                    if (enumObj.common.members.findIndex((a) => { return obj.includes(a) }) == -1) return;
                    const roomName = enumObj.common.name as iobJS.StringOrTranslated;
                    let r = typeof roomName === 'string' ? roomName : roomName.de;
                    if (r != 'Wohnzimmer') setState(obj, false);
                });
            });
        }
    })
    on({ id: 'hm-rpc.1.000B5D89B01C44.5.PRESS_SHORT', change: 'any', val: true }, function (obj) {
        setState('0_userdata.0.currentSceneWZ', -1);;
    })
    
    let essbereichSchalter = getState('shelly.0.SHSW-25#E8DB8480264D#1.Relay0.Input').val
    on({ id: 'shelly.0.SHSW-25#E8DB8480264D#1.Relay0.Input', change: 'ne' }, function (obj) {
       essbereichSchalter = obj.state.val;
       setLights();
    })
    let schreibtischbereichSchalter = getState('shelly.0.SHSW-25#E8DB8480264D#1.Relay1.Input').val
    on({ id: 'shelly.0.SHSW-25#E8DB8480264D#1.Relay1.Input', change: 'ne' }, function (obj) {
       schreibtischbereichSchalter = obj.state.val;
       setLights();
    })
    
    async function flipState(id) {
        setStateAsync(id, !getState(id).val);
    }
    /* Lightsobjects at home
    device, lightSubTyp (Typ) */
    // 0= hue 1= shelly 2= alexa
    //STARTGLOBAL
    type zoneIntersect = 'couch' | 'schreibtisch' | 'essbereich' | 'durchgang' | 'durchgang_schreibtisch' | 'durchgang_essbereich' | 'durchgang_couch';
    type lightNameType = 'Couch' | 'Stehlampe' | 'Esstisch' | 'Computer-Wandlampe' | 'Vitrine' | 'Ambiente 1' | 'Ambiente 2' | 'Deckenstrahler' 
                            | 'Schreibtisch' | 'Fensterbank' | 'Deckenpanel';
    type lightObjectsType = {
        id: string;
        name: lightNameType;
        day: boolean;
        night: boolean;
        timeout?: any;
    } & lightSubType;
    
    type LightZoneType = {}
    
    //type sceneSettings = Record<lightNameType,{}>
    
    
    type subCommandTyp = {
        stateName: string;
        mqttName?: string;
    }
    
    
    type lightSubType = ( { 
            mode: 0;
            state?:   
            {   
                on: subCommandTyp;
                bri: subCommandTyp;
                color?: subCommandTyp;
                colortemp?: subCommandTyp;
            }
        } | { 
            mode: 1;
            state?:   
            {
                on:subCommandTyp;
            }
        } | { 
            mode: 2;
            state?:   
            {  
                on: subCommandTyp;
            }
        } | { 
            mode: 3;
            state?:   
        {
                on: subCommandTyp
            }
        } | { 
            mode: 4;
            state?:   
            {
                on: subCommandTyp;
                bri: subCommandTyp;
                ps: subCommandTyp;
            }
        }
    )
    
    const lightSubMode: lightSubType[] =  [{ 
            mode: 0,
            state:   
            {   
                on:{stateName:".state", mqttName: 'state'},
                bri:{stateName: ".brightness", mqttName:'brightness'},
                color:{stateName:".color", mqttName:'color'},
                colortemp:{stateName:".colortemp", mqttName:'color_temp'},
            }
        } , { 
            mode: 1,
            state:   
            {
                on:{stateName:".Switch",},
            }
        } , { 
            mode: 2,
            state:   
            {  
                on:{stateName:".powerState", },
            }
        } , { 
            mode: 3,
            state:   
        {
            on:{stateName:".STATE",},
            }
        } , { 
            mode: 4,
            state:   
            {
                on:{stateName:".on", mqttName: 'on'},
                bri:{stateName: ".bri", mqttName:'bri'},
                ps:{stateName:".ps", mqttName:'ps'},
            }
        }]
    
    
    type lightControlType = Record<lightNameType, lightSubType>
    
    
    
    const lightObj: lightObjectsType[] = [
        { id: 'zigbee2mqtt.0.0x0017880102887f42', name: 'Couch', mode: 0, day: true, night: true }, // 0 Couch 
        { id: 'zigbee2mqtt.0.0x00178801028fc5cd', name: 'Stehlampe', mode: 0, day: true, night: true }, // 1 Standlicht
        // { id: 'zigbee2mqtt.0.0x0017880102922a60', mode: 0,  name: 'Wohnzimmer', day: false, night: true }, // 1 Kugel
        // { id: 'zigbee2mqtt.0.0x0017880109bde7e3', mode: 0,  name: 'Wohnzimmer', day: true, night: true }, // 2 Computer
        { id: 'zigbee2mqtt.0.group_4', name: 'Esstisch', mode: 0, day: true, night: true }, // 2 Esszimmer
        { id: 'zigbee2mqtt.0.0xb43522fffe55d341', name: 'Computer-Wandlampe', mode: 0, day: true, night: true }, // 3 Computer Wandlampe
        { id: 'alexa2.0.Smart-Home-Devices.54a20611-b863-4a2d-80c5-9b7f3caa2339', name: 'Vitrine', mode: 2, day: false, night: true }, // 4 Vitrine
        { id: 'shelly.0.SHSW-1#E8DB84D7B242#1.Relay0', name: 'Deckenpanel', mode: 1, day: true, night: true }, // 10 Deckenlampe Wohnzimmer
        { id: 'zigbee2mqtt.0.0x001788010bea2ef4', name: 'Ambiente 1', mode: 0, day: true, night: true }, // 11 Ambiente 1
        { id: 'zigbee2mqtt.0.0x001788010bea2ec7', name: 'Ambiente 2', mode: 0, day: true, night: true }, // 12 Ambiente 2
        { id: 'zigbee2mqtt.0.group_3', name: 'Deckenstrahler', mode: 0, day: true, night: true }, // 12 Deckenstrahler
        { id: 'wled.0.0cb815b8af3c', name: 'Schreibtisch', mode: 4, day: true, night: true, timeout: null }, // 13 Schreibtisch
        { id: 'wled.0.2cbcbb4f014c', name: 'Fensterbank', mode: 4, day: true, night: true, timeout: null } // 13 Fensterbank
    ];
    
    
    // Subobj [x][1]
    var lightSubTyp = [['.state', '.brightness', '.sat', '.color', '.colortemp']];
    lightSubTyp.push(['.Switch']);
    lightSubTyp.push(['.powerState']);
    lightSubTyp.push(['.STATE']);
    lightSubTyp.push(['.on','.bri', '.ps'])
    
    const arrayLightSubTypToText = [
        ['On', 'Helligkeit', 'Saturation', 'Farbe', 'Farbtemperatur'],
        ['On'],
        ['On'],
        ['On'],
        ['On', 'Helligkeit', 'Voreinstellung',]
    ]
    
    
    var Y = -1;
    let lightScene:([boolean, number, number, string, number?] | [boolean] | [boolean, number,number])[][] = []; //0
    
    //0
    lightScene.push([[false, 180, 140, '#151200', 450]]); //0
    lightScene[++Y].push([false, 250, 140, '#151200', 450]); //1
    //lightScene[Y].push([false,100,140,'#151200', 2200]]); //1
    //lightScene[Y].push([false,200,140,'#151200', 2200]]); //2
    lightScene[Y].push([false, 230, 0, '', 450]); //8
    lightScene[Y].push([false, 20,0,'',450]); //3
    lightScene[Y].push([false]); //4
    lightScene[Y].push([false]); //5
    lightScene[Y].push([false, 230, 140, '#001237', 450]); //6
    lightScene[Y].push([false, 230, 140, '#001237', 450]); //7
    lightScene[Y].push([true, 230, 0, '', 450]); //8
    lightScene[Y].push([false,200, 1]); //Schreibtisch 9
    lightScene[Y].push([true,10,1]); //Fensterbank
    // +1
    
    
    //Globale Variablen
    var currentScene = getState('0_userdata.0.currentSceneWZ').val;
    var dimmerRef = null;
    //setState('0_userdata.0.currentSceneWZ', currentScene);
    // Wir überprüfen Scene und Lights Array ob sie zusammenpassen und werfen hilfreiche Fehlermeldungen raus, wenn nicht
    pruefeBeideArraysAufFehler();
    // Überprüfung der Array erledigt
    function pruefeBeideArraysAufFehler() {
        var myBreak = false;
        var isError = false;
        for (var i = 0; i < lightScene.length; i++) {
            if (lightScene[i].length != lightObj.length) {
                var myErrorMsg = 'Anzahl der LightScene ' + i + ' Einträge: ' + lightScene[i].length + ' entspricht nicht der Anzahl and LightObjects: ' + lightObj.length;
                log(myErrorMsg, 'error');
                var maxLength;
                isError = true;
                if (lightScene[i].length > lightObj.length) maxLength = lightScene[i].length;
                else maxLength = lightObj.length;
                for (var y = 0; y < maxLength; y++) {
                    myErrorMsg = '';
                    if (y < lightScene[i].length) {
                        myErrorMsg = 'LightScene: ' + i + ' existiert Werte: ' + lightScene[i][y];
                        log(myErrorMsg, 'info');
                    } else {
                        myErrorMsg = 'In LightScene: ' + i + ' existiert Datensatz ' + y + ' nicht!';
                        log(myErrorMsg, 'error');
                        myBreak = true;
                        break;
                    }
                    if (y < lightObj.length) {
                        myErrorMsg = 'LightObjects: ' + y + ' existiert ObjID: ' + lightObj[y][0];
                        log(myErrorMsg, 'info');
                    } else {
                        myErrorMsg = 'LightObjects: ' + y + ' existiert nicht!';
                        log(myErrorMsg, 'error');
                        myBreak = true;
                        break;
                    };
                }
                if (myBreak) break;
            }
        }
        if (isError) {
            myErrorMsg = 'Skript abgebrochen und pausiert. ';
            //@ts-ignore
            stopScript();
        }
    }
    // Überprüfung der Array erledigt
    
    init();
    async function init() {
        if (!await existsObjectAsync(path)) {
            await createFolderAsync(path, 'Szenen');
        }
        if (!await existsObjectAsync(`${path}.wohnzimmer`)) {
            await createDeviceAsync(`${path}.wohnzimmer`, 'Szenen');
        }
        if (!await existsObjectAsync(`${path}.wohnzimmer.autoModeBright`)) {
            await createStateAsync(`${path}.wohnzimmer.autoModeBright`, false, false, {name:'Hohe Helligkeit', role: 'state', type: 'boolean', read: true, write: true});
        }
        on({ id: `${path}.wohnzimmer.autoModeBright`, change: 'ne' }, function (obj) {
            autoModeBright = obj.state.val;
            autoModeOffTimeout = autoModeBright ? 15000 : 2000
            resetAutoMode();
            if (obj.id) setState(obj.id, obj.state.val, true);
        })
        
        for (const a in lightScene) {
            if (!await existsObjectAsync(`${path}.wohnzimmer.${a}`)) {
                await createChannelAsync(`${path}.wohnzimmer.${a}`, 'Szene');
                await createStateAsync(`${path}.wohnzimmer.${a}.dimmer`, 80, false, {name:'Helligkeitseinstellung', role: 'level.dimmer', type: 'number', unit:'%', min:1, max: 100, step:1, read: true, write: true});
            }
            if (!await existsObjectAsync(`${path}.wohnzimmer.${a}.useDimmer`)) {
                await createStateAsync(`${path}.wohnzimmer.${a}.useDimmer`, a != '0', false, {name:'Nutze Dimmer', role: 'switch', type: 'boolean', read: true, write: true});
            }
            dimmer[a] = {value: (getState(`${path}.wohnzimmer.${a}.dimmer`)).val/100, timeout: null};
            on({id: `${path}.wohnzimmer.${a}.dimmer`, change:'any', ack: false}, (dp) => {
                if (!dp || !dp.id) return;
                const arr = dp.id.split('.');
                arr.pop()
                const key = arr.pop();
                if (key !== undefined) {
                    dimmer[key].value = dp.state.val / 100;
                    if (dimmer[key].value <= 0.01 || dimmer[key].value >= 1) {
                        for (const light of lightObj) {
                            if (light.mode === 0 && dimmer[key].timeout == null && getState(light.id + lightSubTyp[light.mode][0]).val) {
                                setState(light.id + '.effect', 'blink');
                                dimmer[key].timeout = setTimeout((light) => {
                                    setState(light.id + '.effect', 'stop_effect');
                                    dimmer[key].timeout = null;
                                }, 1000, light);
                            }
                        }
                    }
                }
                
                if (dp.oldState.val !== dp.state.val) reSetScene(true);
                setState(dp.id, dp.state.val, true);
            })
            for (const b in lightScene[a]) {
                if (!await existsObjectAsync(`${path}.wohnzimmer.${a}.${b}`)) {
                    await createChannelAsync(`${path}.wohnzimmer.${a}.${b}`, lightObj[b].name);
                } else {
                    await extendObjectAsync(`${path}.wohnzimmer.${a}.${b}`, {common:{ name: lightObj[b].name, } });
                }
                for (let cIndex = 0; cIndex < lightScene[a][b].length; cIndex++) {
                    const c = arrayLightSubTypToText[lightObj[b].mode][cIndex]
                    let value: any = undefined;
                    if (await existsObjectAsync(`${path}.wohnzimmer.${a}.${b}.${cIndex}`)) {
                        value = getState(`${path}.wohnzimmer.${a}.${b}.${cIndex}`).val;
                        deleteState(`${path}.wohnzimmer.${a}.${b}.${cIndex}`);
                    }
                    if (!await existsStateAsync(`${path}.wohnzimmer.${a}.${b}.${c}`)) {     
                        value = value === undefined ? lightScene[a][b][cIndex] : value
                        await createStateAsync(`${path}.wohnzimmer.${a}.${b}.${c}`, value, {name: c, role: 'value', type: typeof lightScene[a][b][cIndex], read: true, write: true});
                        setState(`${path}.wohnzimmer.${a}.${b}.${c}`, value, true)
                    } else {
                        if (typeof getState(`${path}.wohnzimmer.${a}.${b}.${c}`).val == 'object'){
                            value =  lightScene[a][b][cIndex];
                        }
                        if (value !== undefined) setState(`${path}.wohnzimmer.${a}.${b}.${c}`, value, true)
                        //if (c == 'Farbtemperatur') setState(`${path}.wohnzimmer.${a}.${b}.${c}`, 450, true)
                        const typ = typeof lightScene[a][b][cIndex];
                        switch (typ) {
                            case 'string':
                            case 'number':
                            case 'boolean':
                                await extendObjectAsync(`${path}.wohnzimmer.${a}.${b}.${c}`, {common:{ name: c, } });
                        }
                        
                    }   
                    await sleep(2) 
                    lightScene[a][b][cIndex] = (getState(`${path}.wohnzimmer.${a}.${b}.${c}`)).val
                }
                on({id: new RegExp(`^${path}\\.wohnzimmer\\.${a}\\.${b}\..+`, 'g'), change:'any', ack: false}, (dp) => {
                    if (!dp || !dp.id) return;
                    const arr = dp.id.split('.');
                    const c = arr.pop()
                    if (c === undefined) return;
                    const lampe = parseInt(arr.pop() ?? '');
                    const scene = arr.pop();
                    const option = arrayLightSubTypToText[lightObj[lampe].mode].findIndex((a) => a === c);
                    if (scene === undefined || lampe === undefined || option === undefined) return;
                    lightScene[scene][lampe][option] = dp.state.val;
                    if (dp.oldState.val !== dp.state.val) {
                        if (currentScene != 0) reSetScene(true);
                        else resetAutoMode();
                    }
                    setState(dp.id, dp.state.val, true);
                })
            }
        }
    }
    
    function getCommandString(a,b) {
        return lightSubTyp[lightObj[a].mode][b]
    }
    
    schedule({ astro: "sunset" }, reSetScene);
    schedule({ astro: "sunrise" }, reSetScene);
    
    function autoScene(x) {
        // setze scene zurück wenn der ON Status der Lampen nicht der Scene entspricht.
        if (currentScene > x - 1 && currentScene < lightScene.length) {
            for (var i = 0; i < lightScene[currentScene].length; i++) {
                let astro = lightObj[i].day && isAstroDay() || !isAstroDay() && lightObj[i].night;
                if (lightObj[i].state && (lightScene[currentScene][i][0] && astro) != lightObj[i].state![getCommandString(i,0)]) {
                    currentScene = x - 1;
                    break;
                }
            }
        }
    
        // Scenen counter 
        currentScene++;
        if (currentScene >= 0 || currentScene >= lightScene.length || currentScene < x) {
            currentScene = x;
        }
        setState('0_userdata.0.currentSceneWZ', currentScene);
    }
    
    on({ id: '0_userdata.0.szene_wohnzimmer', change: 'any', ack: false }, function (obj) {
        switch (obj.state.val) {
            case 'c':
                setState('0_userdata.0.currentSceneWZ', 8);
                break;
            case 'f':
                setState('0_userdata.0.currentSceneWZ', 10);
                break;
            case 'e':
                setState('0_userdata.0.currentSceneWZ', 9);
                break;
            case 's':
                setState('0_userdata.0.currentSceneWZ', 11);
                break;
            case 'o':
                setState('0_userdata.0.currentSceneWZ', -1);
                break;
        }
    })
    
    on({ id: '0_userdata.0.currentSceneWZ', change: 'any', ack: false }, setScene)
    
    function reSetScene(force = false) {
        if (DEBUG) log('current scene: ' + currentScene);
        if (currentScene == -1 || currentScene >= lightScene.length) return;
        for (var i = 0; i < lightScene[currentScene].length; i++) {
    
            if (!force && lightObj[i].state && lightScene[currentScene][i][0] != (lightObj[i].state![getCommandString(i,0)] == (lightObj[i].day && isAstroDay() || !isAstroDay() && lightObj[i].night))) {
                return;
            }
        }
        setScene(undefined)
    }
    
    async function setScene(obj) {
        if (obj !== undefined) {
            currentScene = obj.state.val;
        }
        if (currentScene == lightScene.length) return;
        if (currentScene == -1) { stopScene(); return; };
        if (currentScene === 0) {resetAutoMode(); return;}
        // Aktive Lampen auf Endwert setzen
        for (var i = 0; i < lightScene[currentScene].length; i++) {
            await sleep (25);
            switchLight(lightScene[currentScene][i], lightObj[i].name)
        }
    
        if (DEBUG) log("setScene to: " + currentScene);
        setState('0_userdata.0.currentSceneWZ', currentScene, true);
        switch (currentScene) {
            case 8:
                setState('0_userdata.0.szene_wohnzimmer', 'c', true)
                break;
            case 10:
                setState('0_userdata.0.szene_wohnzimmer', 'f', true);
                break;
            case 9:
                setState('0_userdata.0.szene_wohnzimmer', 'e', true);
                break;
            case 11:
                setState('0_userdata.0.szene_wohnzimmer', 's', true);
                break;
            case -1:
                setState('0_userdata.0.szene_wohnzimmer', 'o', true);
                break;
            default:
                setState('0_userdata.0.szene_wohnzimmer', '', true);
        }
    };
    let lastCommandTimeout: any = null
    let lastCommand:any ={}
    async function switchLight(cArray, lightName: string, overwriteOn: boolean|null = null, overwriteDim: number|null = null) {
        const light = lightObj.find(a => a.name == lightName);
        if (!light) return;
        
        var cTyp = light.mode;
        let astro = light.day && isAstroDay() || !isAstroDay() && light.night;
        let lOn = (overwriteOn === null || overwriteOn === true ? astro && (cArray[0] || !!overwriteOn) : false);
        let dimFix = currentScene != -1 ? (getState(`${path}.wohnzimmer.${currentScene}.useDimmer`).val ? dimmer[currentScene].value : 1) : 1;
        let dim = (overwriteDim !== null ? overwriteDim/100 : 1) * dimFix
        let carray4 = cArray[4]
        
        lastCommandTimeout && clearTimeout(lastCommandTimeout);
        lastCommandTimeout = setTimeout(() => {lastCommand = {}}, 30000)
    
        if (lastCommand[lightName] && lastCommand[lightName].cArray === cArray && lastCommand[lightName].overwriteOn === overwriteOn 
            && lastCommand[lightName].overwriteDim === overwriteDim && lastCommand[lightName].dim === dim && lastCommand[lightName].astro === astro ) {
            return;
        } else {
    
            lastCommand[lightName] = {cArray, overwriteOn, overwriteDim, dim, astro}
        }
    
        // Verweizweigung der Lampen nach Funktion;
        const isOn = getState(light.id + lightSubTyp[cTyp][0]).val;
       
        if (lOn === false && (isOn === false || light.timeout)) return;
         //log (overwriteOn + ' ' + astro + ' ' + cArray[0] + ' ' + lOn + ' '+ (astro && (cArray[0] || !!overwriteOn)) + ' ' + isOn)
        if (lOn) {
            if (cTyp == 0) { 
                let msg:{state:string, brightness: number, transition: number, color?:string, color_temp?: number} = {state: lOn ? 'ON' : 'OFF', brightness:(Math.round((cArray[1]-1) * dim)+1), transition: 1 }
                if (!cArray[4]) {
                    msg.color = cArray[3];
                } else {
                    carray4 = dimValue(cArray[4]-miredDiff, cArray[4]);
                    msg.color_temp = carray4
                }
                if ((isOn && lOn)) {
                    if (dim < dimFix) msg.transition = 3;
                    else msg.transition = 3;
                } else {
                    msg.transition = 1
                }
                if (isOn !== lOn || getState(light.id + lightSubTyp[cTyp][1]).val !== (Math.round((cArray[1]-1) * dim)+1) 
                    || carray4 && getState(light.id + lightSubTyp[cTyp][4]).val !== carray4 || !carray4 && getState(light.id + lightSubTyp[cTyp][3]).val !== cArray[3]) {
                        sendTo('mqtt.0', 'sendMessage2Client', { topic: getTopic(light.id), message: JSON.stringify(msg) });
                    }
                //log(getTopic(light.id) + ': ' + JSON.stringify(msg))
                //log(cArray[3])
            
            } else if (cTyp == 4) {    
                if (light.timeout) clearTimeout(light.timeout);       
                light.timeout = null;
                let bri = Math.round((cArray[1]-1) * dim)+1
                try {
                    if (bri != getState(`${light.id}.bri`).val || lOn != getState(`${light.id}.on`).val || cArray[2] != getState(`${light.id}.ps`).val ) {
                        setState(`${light.id}.action`, JSON.stringify({
                            "bri": bri,
                            "on": lOn,
                            'ps': cArray[2],
                            'transition': 1
                        }))
                    }
                } catch(error) {
                    console.warn(`wled ${light.id} nicht erreichbar! ` + error)
    
                }
    
            } else {
                if (!isOn) setState(light.id + lightSubTyp[cTyp][0], lOn);        
            }
        } else {
            if (cTyp == 0) {
                let msg:{state:string, brightness: number, transition: number, color?:string, color_temp?: number} = {state: lOn ? 'ON' : 'OFF', brightness:(Math.round((cArray[1]-1) * dim)+1), transition: 2 }
                 msg.transition = 6;
                
                if (isOn !== lOn)  sendTo('mqtt.0', 'sendMessage2Client', { topic: getTopic(light.id), message: JSON.stringify(msg) });
            } else if (cTyp === 4) {
                const ip = getState(`${light.id}._info.ip`).val
                try {
                    if (!getState(`${light.id}.on`).val) {
                        if (light.timeout) clearTimeout(light.timeout);
                        return;
                    }
                    setState(`${light.id}.action`, JSON.stringify({
                        "bri": 1,
                        'ps': 5,           
                        })
                    )
                } catch(error) {
                    console.warn(`wled ${light.id} nicht erreichbar! ` + error)
    
                }
                if (light.timeout) clearTimeout(light.timeout);
                light.timeout = setTimeout((id) => {   
                   setState(`${id}.on`, false)
                }, 60000*1, light.id)
            } else {
                if (getState(light.id + lightSubTyp[cTyp][0]).val) setStateDelayed(light.id + lightSubTyp[cTyp][0], false, 100)
            }
        }
        //log(lightObj[i].id+lightSubTyp[cTyp][0] + ' state: ' + lOn)
    }
    function getTopic(id) {
        const r = getTopic2(id);  
        return r.replace('group_3', 'Deckenstrahler').replace('group_4', 'Esstisch')
    }
    
    function getTopic2(id) {
        let a = id.split('.')
        return 'zigbee2mqtt/' + a[a.length - 1] + '/set'
    }
    
    async function stopScene() {
        currentScene = -1;
        for (var i = 0; i < lightObj.length; i++) {
            await sleep(50)
            await switchLight(lightScene[0][i], lightObj[i].name, false)
            //var cTyp = lightObj[i].mode;
            //if (getState(lightObj[i].id + lightSubTyp[cTyp][0]).val) setState(lightObj[i].id + lightSubTyp[cTyp][0], false);
        }
        setState('0_userdata.0.currentSceneWZ', currentScene, true)
        setState('0_userdata.0.szene_wohnzimmer', 'o', true);
    }
    
    function setBriOfLightsTo(value) {
        for (var i = 0; i < lightScene[currentScene].length; i++) {
            var cArray = lightScene[currentScene][i];
            if (cArray[0]) {
                var cTyp = lightObj[i].mode;
                if (cTyp == 0) {
                    setState(lightObj[i].id + lightSubTyp[cTyp][1], value);
                } else {
    
                }
            }
        }
    }
    
    on({ id: 'shelly.0.SHSW-1#E8DB84D7B242#1.Relay0.longpush', change: 'ne' }, function (obj) {
        if (obj.state.val) {
            setState('0_userdata.0.currentSceneWZ', -1);
        }
    })
    
    on({ id: mySwitch + 'on_press', change: 'ne', val: true }, function (obj) {
        if (!mySwitchTimeout) {
            mySwitchTimeout = setTimeout(function () {
                autoScene(0);
                mySwitchTimeout = null;
            }, 300);
        }
    });
    on({ id: mySwitch + 'off_press', change: 'ne', val: true }, function (obj) {
        setState('0_userdata.0.currentSceneWZ', -1)
    });
    on({ id: mySwitch + 'off_hold', change: 'ne', val: true }, function (obj) {
        if (currentScene != -1)  setBriOfLightsTo(1);
    });
    on({ id: mySwitch + 'on_hold', change: 'ne', val: true }, function (obj) {
        if (!mySwitchTimeout) {
            mySwitchTimeout = setTimeout(function () {
                autoScene(7);
                mySwitchTimeout = null;
            }, 300);
        }
    });
    on({ id: mySwitch2 + 'on_press', change: 'ne', val: true }, function (obj) {
        atv(true)
    });
    on({ id: mySwitch2 + 'off_press', change: 'ne', val: true }, function (obj) {
        atv(false)
    });
    on({ id: mySwitch2 + 'down_press', change: 'ne', val: true }, function (obj) {
        if (!getState("hyperion_ng.0.1.components.V4L").val) setState("hyperion_ng.0.1.components.V4L", true);
    });
    on({ id: mySwitch2 + 'up_press', change: 'ne', val: true }, function (obj) {
        if (getState("hyperion_ng.0.1.components.V4L").val) setState("hyperion_ng.0.1.components.V4L", false);
    });
    
    on({ id: '0_userdata.0.Dummys.AppleTV_Licht_einschalten', change: "any", ack: false }, function (obj) {
        if (obj.state.val == true) {
            atv(true)
        }
        else {
            atv(false)
        }
        if (obj.id) setState(obj.id, obj.state.val, true);
    
    })
    let hyperionStartupCheck;
    let appleTvPlaying = getState('homekit-controller.0.IP-68:80:C5:D1:2D:02.1.sensor-motion-52.motion-detected').val;
    let hyperionWledIdOn = getState('sonoff.0.Gosund Steckdose 8.POWER').val;
    let subscriptWled: any = null;
    on({ id: 'sonoff.0.Gosund Steckdose 8.POWER', change: "ne" }, function (obj) {
        if (subscriptWled) clearTimeout(subscriptWled);
        if (!obj.state.val) {
            hyperionWledIdOn = obj.state.val;
            setState('hyperion-connector.0.107a543b-ddfc-5ac9-8f44-051ae0e6db4d.controls.system.suspend', true);
            SetLightsForAppleTV();   
        } else {
            subscriptWled = setTimeout(() => {
                    hyperionWledIdOn = obj.state.val;
                    SetLightsForAppleTV();     
            },500)       
        } 
    })
    let appleTvOffTimeout = null;
    on({id:'homekit-controller.0.IP-68:80:C5:D1:2D:02.1.television-8.active', change:'ne'}, (obj) => {
        if (!hyperionWledIdOn) {
            appleTvOffTimeout = null;
            return;
        }
        if (obj.state.val != 0) {
            if (appleTvOffTimeout) {
                clearTimeout(appleTvOffTimeout)
                appleTvOffTimeout = null;
            }
            return;
        }
        if (appleTvOffTimeout) return;    
        appleTvOffTimeout = setTimeout(()=>{ 
            setState('sonoff.0.Gosund Steckdose 8.POWER', false); 
            appleTvOffTimeout = null;
            }, 120000)
    })
    
    on({id: 'homekit-controller.0.IP-68:80:C5:D1:2D:02.1.sensor-motion-52.motion-detected', change: 'ne'}, function(obj) {
        appleTvPlaying = obj.state.val;
        SetLightsForAppleTV(obj.state.val)
    })
    function SetLightsForAppleTV(isPlaying: boolean | null = null) {
        if (isPlaying === null) isPlaying = appleTvPlaying;
    
        if (isPlaying && hyperionWledIdOn) {
            setState('hyperion-connector.0.107a543b-ddfc-5ac9-8f44-051ae0e6db4d.controls.system.resume', true);
            if (!getState('hyperion-connector.0.107a543b-ddfc-5ac9-8f44-051ae0e6db4d.controls.componentstate.LEDDEVICE').val) setState('hyperion-connector.0.107a543b-ddfc-5ac9-8f44-051ae0e6db4d.controls.componentstate.LEDDEVICE', true);
            hyperion_on = true;
            setLights();
        } else {
            setState('hyperion-connector.0.107a543b-ddfc-5ac9-8f44-051ae0e6db4d.controls.system.idle', true);
            hyperion_on = false;
            setLights();
        }
    }
    
    async function atv(on) {
        if (on) {
            if (!getState('sonoff.0.Gosund Steckdose 3.POWER').val) {
                setState('sonoff.0.Gosund Steckdose 3.POWER', true)
                await sleep(5000)
            }
            if (!getState('sonoff.0.Gosund Steckdose 8.POWER').val) {
                setState('sonoff.0.Gosund Steckdose 8.POWER', true);
            }
            setState('0_userdata.0.Dummys.AppleTV_einschalten', true, false)
    
        } else {
            if (getState('sonoff.0.Gosund Steckdose 8.POWER').val) setState('sonoff.0.Gosund Steckdose 8.POWER', false);
            setStateDelayed('0_userdata.0.currentSceneWZ', currentScene, 800)
            setState('0_userdata.0.Dummys.AppleTV_ausschalten', true)
        }
    }
    
    
    on({ id: 'shelly.0.SHSW-1#E8DB84D7B242#1.Relay0.Input', change:'ne', val:true }, () => {
        DeckenpanelShouldOn = !DeckenpanelShouldOn;
        setLights(true);
    })
    
    let bigLampShouldOn = getState('shelly.0.SHSW-1#E8DB84D7B242#1.Relay0.Switch').val
    let DeckenpanelShouldOn = getLightObjectState('Deckenpanel')
    if (DeckenpanelShouldOn) {
        setLightObjectState('Deckenpanel', false)
        DeckenpanelShouldOn = false;
    }
    
    let presence
    const radarZone = {
        lux: {
            front:'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-light-2672.light-level-current',
            behindComputer:'sonoff.0.lux1_tasmota_638B51.BH1750_Illuminance',
        },
        presence1: {
            id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2688.occupancy-detected',
            count: 0
        },
        presence2: {
            id: 'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-occupancy-2688.occupancy-detected',
            count: 0
        },
        durch: {
            id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2700.occupancy-detected',
            id2: 'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-occupancy-2696.occupancy-detected',
            count:0,
            count2: 0,
            state: false
        },
        couch: {
            id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2704.occupancy-detected',
            id2:'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-occupancy-2704.occupancy-detected',
            count:0,
            count2:0,
            state: false
        },
        computer: {
            id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2692.occupancy-detected',
            id2: 'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-occupancy-2692.occupancy-detected',
            count: 0,
            count2: 0,
            state: false
        },
        ess: {
            id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2696.occupancy-detected',
            id2: 'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-occupancy-2700.occupancy-detected',
            count: 0,
            count2: 0,
            state: false
        },
        durch_ess: {
            id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2712.occupancy-detected',
            count: 0,
            state: false
        },
        durch_computer: {
            id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2708.occupancy-detected',
            count: 0,
            state: false
        }
    }
    
    front = getState(radarZone.lux.front).val < luxminFront;
    behindComputer = getState(radarZone.lux.behindComputer).val < luxminBehind;
    behind = getState(radarZone.lux.front).val < luxminBehind;
    let oldPresense: boolean | undefined = undefined
    function checkPresence() {
        presence = !!radarZone.presence1.count || !!radarZone.presence2.count
        if (currentScene !== 0 && currentScene !== -1) {
            oldPresense = undefined;
            return;
        }
        if (oldPresense !== presence) {
            if (presence) {
                currentScene = 0;        
                //schreibtischLampe(true);
                //esstischLampe(true);
                //durchgang(true);
                setLights(undefined, true);
            }
        }
        oldPresense = presence;
        const dimmode =  getState('0_userdata.0.NSPanel.2.ScreensaverInfo.Trigger_Dimmode').val;
        if (presence ) {     
                if (!dimmode) setState('0_userdata.0.NSPanel.2.ScreensaverInfo.Trigger_Dimmode', true)
                setState('0_userdata.0.currentSceneWZ', 0, true) ;                     
            } else {
                if (dimmode) setState('0_userdata.0.NSPanel.2.ScreensaverInfo.Trigger_Dimmode', false)
                if (currentScene == 0) {
                    setState('0_userdata.0.currentSceneWZ', -1)
                }
            }
    }
    radarZone.presence1.count = getState(radarZone.presence1.id).val;
    radarZone.presence2.count = getState(radarZone.presence2.id).val;
    
    on({id: radarZone.presence1.id, change: 'ne'}, function(obj){
        //log('0 Anwesenheit ' + obj.state.val)
        radarZone.presence1.count = obj.state.val 
        checkPresence();
    });
    on({id: radarZone.presence2.id, change: 'ne'}, function(obj){
        //log('0 Anwesenheit ' + obj.state.val)
        radarZone.presence2.count = obj.state.val 
        checkPresence();
    });
    on({id: radarZone.lux.front, change: 'ne'}, function(obj){
        front = obj.state.val < luxminFront;
        behind = obj.state.val < luxminBehind;
       
       
    });
    on({id: radarZone.lux.behindComputer, change: 'ne'}, function(obj){
        behindComputer = obj.state.val < luxminComputer;
    });
    
    
    on({id: radarZone.computer.id, change: 'ne'}, function(obj){
        //log('1 Schreibtisch ' + obj.state.val)
        radarZone.computer.count = obj.state.val
        if (currentScene != 0) return;
        setLights()
        //schreibtischLampe()
        
    });
    on({id: radarZone.computer.id2, change: 'ne'}, function(obj){
        //log('1 Schreibtisch ' + obj.state.val)
        radarZone.computer.count2 = obj.state.val
        if (currentScene != 0) return;
        setLights()
        //schreibtischLampe()
        
    });
    on({id: radarZone.ess.id, change: 'ne'}, function(obj){
        //log('2 Essbereich' + obj.state.val)
        radarZone.ess.count = obj.state.val
        if (currentScene != 0) return;
        setLights()
        //esstischLampe()
        //durchgang()
    });
    on({id: radarZone.ess.id2, change: 'ne'}, function(obj){
        //log('2 Essbereich' + obj.state.val)
        radarZone.ess.count2 = obj.state.val
        if (currentScene != 0) return;
        setLights()
        //esstischLampe()
        //durchgang()
    });
    on({id: radarZone.durch.id, change: 'ne'}, function(obj){
        //log('3 Durchgangsbereich' + obj.state.val)
        radarZone.durch.count = obj.state.val
        if (currentScene != 0) return;    
        setLights()
        //schreibtischLampe()
        //esstischLampe()
        //couchLampe()
        //durchgang()
    });
    on({id: radarZone.durch.id2, change: 'ne'}, function(obj){
        //log('3 Durchgangsbereich' + obj.state.val)
        radarZone.durch.count2 = obj.state.val
        if (currentScene != 0) return;    
        setLights()
        //schreibtischLampe()
        //esstischLampe()
        //couchLampe()
        //durchgang()
    });
    on({id:radarZone.couch.id, change: 'ne'}, function(obj){
        //log('4 Couch ' + obj.state.val)
        radarZone.couch.count = obj.state.val
        if (currentScene != 0) return;
        setLights()
        //couchLampe()
    });
    on({id: radarZone.durch_computer.id, change: 'ne'}, function(obj){
        //log('3 Durchgangsbereich' + obj.state.val)
        radarZone.durch_computer.count = obj.state.val
        if (currentScene != 0) return;   
         setLights() 
        //schreibtischLampe()
        //durchgang()
    });
    on({id: radarZone.durch_ess.id, change: 'ne'}, function(obj){
        //log('3 Durchgangsbereich' + obj.state.val)
        radarZone.durch_ess.count = obj.state.val
        if (currentScene != 0) return;    
        setLights()
        //esstischLampe()
        //durchgang()
    });
    
    
    on({id:radarZone.couch.id2, change: 'ne'}, function(obj){
        //log('4 Couch ' + obj.state.val)
        radarZone.couch.count2 = obj.state.val
        if (currentScene != 0) return;
        setLights()
        //couchLampe()
    });
    
    resetAutoMode()
    
    function resetAutoMode() {
        if (currentScene != 0) return;
        
        const obj: {state:{val:any}} = {state: {val:0}}
       
        obj.state.val = getState(radarZone.computer.id).val
        radarZone.computer.count = obj.state.val
        
        obj.state.val = getState(radarZone.computer.id2).val
        radarZone.computer.count2 = obj.state.val
    
        obj.state.val = getState(radarZone.ess.id).val
        radarZone.ess.count = obj.state.val
    
        obj.state.val = getState(radarZone.ess.id2).val
        radarZone.ess.count2 = obj.state.val
    
        obj.state.val = getState(radarZone.durch.id).val
        radarZone.durch.count = obj.state.val
    
        obj.state.val = getState(radarZone.durch.id2).val
        radarZone.durch.count2 = obj.state.val
    
        obj.state.val = getState(radarZone.couch.id).val
        radarZone.couch.count = obj.state.val
    
        obj.state.val = getState(radarZone.durch_computer.id).val
        radarZone.durch_computer.count = obj.state.val
    
        obj.state.val = getState(radarZone.durch_ess.id).val
        radarZone.durch_ess.count = obj.state.val
     
        obj.state.val = getState(radarZone.couch.id2).val
        radarZone.couch.count2 = obj.state.val
    
        obj.state.val = getState(radarZone.lux.front).val
        front = obj.state.val < luxminFront;
        behind = obj.state.val < luxminBehind;
        obj.state.val = getState(radarZone.lux.behindComputer).val
        behindComputer = obj.state.val < luxminComputer;
    
        setLights();
    }
    
    const lightZoneSettings:Record<lightNameType, {on: boolean, dim: number, timeout: any, hyperion?:boolean}>  = {
        Couch: {
            on: false,
            hyperion: true,
            dim:0,
            timeout: null,
        },
        Schreibtisch: {
            on: false,
            
            dim:0,
            timeout: null,
        },
        Esstisch: {
            on: false,
            
            dim:0,
            timeout: null,
        },
        Deckenstrahler: {
            on: false,
            
            dim:0,
            timeout: null,
        },
        "Computer-Wandlampe": {
            on: false,
            dim:0,
            timeout: null,
        },
        "Deckenpanel": {
            on: false,
            hyperion: true,
            dim:0,
            timeout: null,
        },
        "Ambiente 1": {
            on: false,
            
            dim:0,
            timeout: null,
        },
        "Ambiente 2": {
            on: false,
            
            dim:0,
            timeout: null,
        },
        Fensterbank: {
            on: false,
            
            dim:0,
            timeout: null,
        },
        Stehlampe: {
            on: false,
            hyperion: true,
            dim:0,
            timeout: null,
        },
        "Vitrine": {
            on: false,
            
            dim:0,
            timeout: null,
        },
        
    }
    
    
    
    /*
    * getLightObject
    * @param name: lightNameType  
    * @returns lightObject
    */
    function getLightObject(name: lightNameType): lightObjectsType {
        const result = lightObj.find(a => a.name === name);
        if (!result) {
            throw new Error(`lightObject ${name} not found`)
        }
        return result;
    }   
    
    function getLightObjectState(name: lightNameType): boolean {
        return getState(getLightObject(name).id + lightSubTyp[getLightObject(name).mode][0]).val
    }
    
    function getLightObjectIndex(name: lightNameType) {
        return lightObj.findIndex(a => a.name === name)
    }
    
    function setLightObjectState(name: lightNameType, on: boolean): void {
        setState(getLightObject(name).id + lightSubTyp[getLightObject(name).mode][0], on)
    }
    
    let timeoutSetLights: any = null;
    function setLights(force: boolean = false, go: boolean = false) {
        try {
            //debounce
            if (timeoutSetLights) {
                clearTimeout(timeoutSetLights)
                timeoutSetLights = null;
            }
            if (!go) {
                timeoutSetLights = setTimeout(() => {
                    setLights(force, true)
                }, 100)
                return;
            }
    
            // reset variables
            for (const key in lightZoneSettings) {
                lightZoneSettings[key].on = false;
                lightZoneSettings[key].dim = 0;
            }
    
            /*
            * 1. Couch
            * 2. Schreibtisch
            * 3. Esstisch
            * 4. Deckenstrahler
            * 5. Computer-Wandlampe
            * 6. Deckenpanel
            * 7. Ambiente 1
            * 8. Ambiente 2
            * 9. Fensterbank
            * 10. Stehlampe
            * 11. Vitrine
            * 
            *  lux is the indoor light sensor value
            *  toDark is true if the outdoor light sensor value is below the minimum lux value
            */
            const toDark = shutterPos > cShutterPosForLight || behind || !isAstroDay();
            const toDarkComputer = shutterPos > cShutterPosForLight || behindComputer || !isAstroDay();
            //Couch
            let on = radarZone.couch.count > 0 || radarZone.couch.count2 > 0;
            let dim = radarZone.couch.count > 0 || radarZone.couch.count2 > 0 ? 100 : 5;
            on = on && front;
            lightZoneSettings.Couch.on = lightZoneSettings.Couch.on || on;
            lightZoneSettings.Couch.dim = Math.max(lightZoneSettings.Couch.dim ,dim);
            lightZoneSettings.Stehlampe.on = lightZoneSettings.Stehlampe.on || on;
            lightZoneSettings.Stehlampe.dim = Math.max(lightZoneSettings.Stehlampe.dim, dim);
            lightZoneSettings.Deckenpanel.on = lightZoneSettings.Deckenpanel.on || on;
            lightZoneSettings.Deckenpanel.dim = Math.max(lightZoneSettings.Deckenpanel.dim, dim);
            
            //Computer
            on =  radarZone.computer.count > 0 || radarZone.computer.count2 > 0 || radarZone.durch_computer.count > 0 ;
            on = on && toDarkComputer || schreibtischbereichSchalter
            dim =  radarZone.computer.count > 0 || radarZone.computer.count2 > 0 || radarZone.durch_computer.count > 0  || schreibtischbereichSchalter? 100 : 15;
            
            let dim2 = schreibtischbereichSchalter ? 100 : on ? 50 : 10;
            lightZoneSettings['Computer-Wandlampe'].on = lightZoneSettings['Computer-Wandlampe'].on || on
            lightZoneSettings['Computer-Wandlampe'].dim = Math.max(lightZoneSettings['Computer-Wandlampe'].dim, dim2) 
            lightZoneSettings['Ambiente 1'].on = lightZoneSettings['Ambiente 1'].on || on
            lightZoneSettings['Ambiente 1'].dim = Math.max(lightZoneSettings['Ambiente 1'].dim, dim)
            lightZoneSettings['Ambiente 2'].on = lightZoneSettings['Ambiente 2'].on || on
            lightZoneSettings['Ambiente 2'].dim = Math.max(lightZoneSettings['Ambiente 2'].dim, dim)
            lightZoneSettings.Schreibtisch.on = lightZoneSettings.Schreibtisch.on || on
            lightZoneSettings.Schreibtisch.dim = Math.max(lightZoneSettings.Schreibtisch.dim, dim)
            
            //Esstisch
            on =  lightZoneSettings.Esstisch.on || radarZone.ess.count > 0 || radarZone.ess.count2 > 0 || radarZone.durch_ess.count > 0;
            on = on && toDark || essbereichSchalter
            dim = Math.max(lightZoneSettings.Esstisch.dim, radarZone.ess.count > 0 || radarZone.ess.count2 > 0 || radarZone.durch_ess.count > 0 || essbereichSchalter ? 100 : 15);
            lightZoneSettings.Esstisch.on = on;
            lightZoneSettings.Esstisch.dim = dim;
    
            // Durchgang
            on = radarZone.durch.count +radarZone.durch.count2 > 0 || radarZone.durch_ess.count > 0 || radarZone.durch_computer.count > 0 || (schreibtischbereichSchalter && DeckenpanelShouldOn);
            on = on && toDark
            dim = Math.max(radarZone.durch.count+radarZone.durch.count2 > 0 ? 85 : 0);
            dim = Math.max(dim, radarZone.durch_ess.count > 0 || radarZone.durch_computer.count > 0 || (schreibtischbereichSchalter && DeckenpanelShouldOn) ? 70 : 0);
            lightZoneSettings.Couch.on = lightZoneSettings.Couch.on || (on && front);
            lightZoneSettings.Stehlampe.on = lightZoneSettings.Stehlampe.on || (on && front);
            lightZoneSettings.Deckenstrahler.on = lightZoneSettings.Deckenstrahler.on || on;
            lightZoneSettings.Deckenstrahler.dim = Math.max(lightZoneSettings.Deckenstrahler.dim, dim);
            lightZoneSettings.Deckenpanel.on = lightZoneSettings.Deckenpanel.on || on;
            lightZoneSettings.Deckenpanel.dim = Math.max(lightZoneSettings.Deckenpanel.dim, dim);
            lightZoneSettings.Fensterbank.on = lightZoneSettings.Fensterbank.on || on;
            lightZoneSettings.Fensterbank.dim = Math.max(lightZoneSettings.Fensterbank.dim, dim);
            lightZoneSettings['Ambiente 1'].on = on  || lightZoneSettings['Ambiente 1'].on;
            lightZoneSettings['Ambiente 1'].dim = Math.max(lightZoneSettings['Ambiente 1'].dim, 3);
            lightZoneSettings['Ambiente 2'].on = on  || lightZoneSettings['Ambiente 2'].on;
            lightZoneSettings['Ambiente 2'].dim = Math.max(lightZoneSettings['Ambiente 2'].dim, 3);
            lightZoneSettings.Schreibtisch.on = on  || lightZoneSettings.Schreibtisch.on;
            lightZoneSettings.Schreibtisch.dim = Math.max(lightZoneSettings.Schreibtisch.dim, 3);
            lightZoneSettings.Esstisch.on =  on  || lightZoneSettings.Esstisch.on;
            lightZoneSettings.Esstisch.dim = Math.max(lightZoneSettings.Esstisch.dim, 3);
            
            // if Durchgang is true dont deactivate lights in Schreibtisch and Esstisch
            on = radarZone.durch.count+radarZone.durch.count2 > 0 || radarZone.durch_ess.count > 0 || radarZone.durch_computer.count > 0
            on = on && toDark
            lightZoneSettings.Couch.on = (getLightObjectState("Couch") && on && front) || lightZoneSettings.Couch.on
            lightZoneSettings.Stehlampe.on = (getLightObjectState("Stehlampe") && on && front) || lightZoneSettings.Stehlampe.on
            lightZoneSettings["Computer-Wandlampe"].on = (getLightObjectState("Computer-Wandlampe") && on) || lightZoneSettings["Computer-Wandlampe"].on;
            lightZoneSettings["Computer-Wandlampe"].dim = Math.max(lightZoneSettings["Computer-Wandlampe"].dim, 10);
            lightZoneSettings['Ambiente 1'].on = (getLightObjectState('Ambiente 1') && on)  || lightZoneSettings['Ambiente 1'].on;
            lightZoneSettings['Ambiente 1'].dim = Math.max(lightZoneSettings['Ambiente 1'].dim, 3);
            lightZoneSettings['Ambiente 2'].on = (getLightObjectState('Ambiente 2') && on)  || lightZoneSettings['Ambiente 2'].on;
            lightZoneSettings['Ambiente 2'].dim = Math.max(lightZoneSettings['Ambiente 2'].dim, 3);
            lightZoneSettings.Schreibtisch.on = (getLightObjectState('Schreibtisch') && on)  || lightZoneSettings.Schreibtisch.on;
            lightZoneSettings.Schreibtisch.dim = Math.max(lightZoneSettings.Schreibtisch.dim, 3);
            lightZoneSettings.Esstisch.on = (getLightObjectState('Esstisch') && on)  || lightZoneSettings.Esstisch.on;
            lightZoneSettings.Esstisch.dim = Math.max(lightZoneSettings.Esstisch.dim, 3);
            
        
            /*
            * Dont activate the light if day is detected
            */
            if (isAstroDay()) {
                lightZoneSettings.Fensterbank.on = getLightObjectState('Fensterbank') || schreibtischbereichSchalter && lightZoneSettings.Fensterbank.on;
                lightZoneSettings.Schreibtisch.on = getLightObjectState('Schreibtisch') || schreibtischbereichSchalter && lightZoneSettings.Schreibtisch.on;
            }
            // Deactive the big light if the value is false
            if (!bigLampShouldOn) {
                lightZoneSettings.Deckenpanel.on = false;
                lightZoneSettings.Deckenpanel.dim = 0;
                //lightZoneSettings['Computer-Wandlampe'].on = false;
                lightZoneSettings['Computer-Wandlampe'].dim = schreibtischbereichSchalter ? 100 : Math.max(lightZoneSettings['Computer-Wandlampe'].dim, 10);
            } else {
                lightZoneSettings.Deckenpanel.on = true;
                lightZoneSettings.Deckenpanel.dim = 0;
                lightZoneSettings['Computer-Wandlampe'].on = true;
                lightZoneSettings['Computer-Wandlampe'].dim = 95;
            }
            // if hyperion is on deactivate the other lights
            if (hyperion_on) {
                lightZoneSettings.Couch.on = false;
                lightZoneSettings.Couch.dim = 0;
                lightZoneSettings.Stehlampe.on = false;
                lightZoneSettings.Stehlampe.dim = 0;
                lightZoneSettings.Deckenpanel.on = false;
                lightZoneSettings.Deckenpanel.dim = 0;
                lightZoneSettings.Deckenstrahler.dim = Math.min(lightZoneSettings.Deckenstrahler.dim, 25);
                lightZoneSettings.Fensterbank.dim = Math.min(lightZoneSettings.Fensterbank.dim, 5);
            }
            // if button is pressed activate the deckenpanel
            if (DeckenpanelShouldOn) {
                lightZoneSettings.Deckenpanel.on = true;
                lightZoneSettings.Deckenpanel.dim = 100;
            }
            // if any light is on activte the deckenspots
            on = false;
            for (const key in lightZoneSettings) {
                on = on || lightZoneSettings[key].on;
            }
            lightZoneSettings.Deckenstrahler.on = toDark && (on || lightZoneSettings.Deckenstrahler.on);
            lightZoneSettings.Deckenstrahler.dim = Math.max(lightZoneSettings.Deckenstrahler.dim, 5);
            
            // write the settings to the lights
            for (const key in lightZoneSettings) {
                if (lightZoneSettings[key].timeout) clearTimeout(lightZoneSettings[key].timeout);
                if (lightZoneSettings[key].on) {
                    switchLight(lightScene[0][getLightObjectIndex(key as any)], key, lightZoneSettings[key].on, lightZoneSettings[key].dim == 100 ? undefined : lightZoneSettings[key].dim);
                } else {
                    if (force || (hyperion_on && lightZoneSettings[key].hyperion)) {
                        switchLight(lightScene[0][getLightObjectIndex(key as any)], key, lightZoneSettings[key].on, lightZoneSettings[key].dim == 100 ? undefined : lightZoneSettings[key].dim)
                    } else {
                        lightZoneSettings[key].timeout = setTimeout((key) => {
                            switchLight(lightScene[0][getLightObjectIndex(key as any)], key, lightZoneSettings[key].on, lightZoneSettings[key].dim == 100 ? undefined : lightZoneSettings[key].dim)
                        }, autoModeOffTimeout, key)
                    }
                }
                
            }
        } catch(error) {
            log(error as string)
        }
    }
    
    function dimValue(from: number, to: number): number {
            return _dimValue({from, to});
    }
    
    type dimValueOptionsType = {
        begin?: string;
        end?: string;
        reset?: string;
        from?: number;
        to?: number;
        sunset?: boolean | number
    }
    
    function _dimValue(options: dimValueOptionsType = {}): number {
        options = {...dimValueOptions, ...options}
        if (!options.begin || !options.end || !options.reset || options.from === undefined || options.to === undefined ) {
            log('missing value')
            return options.from || 0;
        }
        const startArr = options.begin.split(':');
        const endArr = options.end.split(':');
        const resetArr = options.reset.split(':');
        if (startArr.length <= 1 || endArr.length <= 1 || resetArr.length <= 1) {
            log('dimValue: missing string in start, reset or end (xx:xx)')
            return options.to
        }
        const currentTime = new Date().getTime();
        let startTime = new Date().setHours(parseInt(startArr[0]), parseInt(startArr[1]), startArr[2] ? parseInt(startArr[2]) : 0 );
        let endTime = new Date().setHours(parseInt(endArr[0]), parseInt(endArr[1]), endArr[2] ? parseInt(endArr[2]) : 0 );
        let resetTime = new Date().setHours(parseInt(resetArr[0]), parseInt(resetArr[1]), resetArr[2] ? parseInt(resetArr[2]) : 0 );
        
        if (endTime < startTime) {
            if (startTime > currentTime && endTime > currentTime) {
                // end is this day
                startTime -=24 * 60 * 60 * 1000;
            } 
            if (startTime <= currentTime && endTime <= currentTime) {
                // end is next day
                endTime += 24 * 60 * 60 * 1000
    
            }
        }
        let from = options.from;
        const to = options.to;
        const sunset = options.sunset
        from = sunset && typeof sunset === 'number' ? calculateDimSunset(from, sunset) : from;
        if (currentTime <= startTime || currentTime >= endTime) {
            //  20:00 > 6:00 && 20:00 < 21:00 (true) || 6:00 > 2:00 && 1:00 < 2:00 (true)
            if (currentTime >= resetTime && currentTime < startTime || resetTime > startTime && currentTime < startTime ) {
                return from;
            }
            return to;
        }
        const diff = to - from;
        const result = Math.round(diff * (currentTime-startTime) / (endTime-startTime)) + from;
        return result; 
    
    }
    
    function calculateDimSunset(from: number, to: number | number): number {
        const sunsetStartTime = getAstroDate('sunsetStart').getTime();
        const sunsetEndTime = getAstroDate('dusk').getTime();
        const currentTime = new Date().getTime();
        if (currentTime > sunsetEndTime) return to;
        else if (currentTime < sunsetStartTime) return from;
        const diff = to - from;
        const result = Math.round(diff * (currentTime-sunsetStartTime) / (sunsetEndTime-sunsetStartTime)) + from;
        return result;
    }
    

    Man kann hier auch richtig lange sachen posten, außer es ist ein blockly dann es am besten als JS rauskopieren.

    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

    Spenden

    1 Antwort Letzte Antwort
    0
    • P peterfido

      @hub01 Kann sein, dass ein Ausschnitt reicht. Muss es allerdings nicht. Evtl. gibt es noch mehr im Skript zu optimieren, was bei der Gelegenheit gleich passieren könnte.

      Umlaute vermeide ich. Zumindest im Namen des Skripts ist einer enthalten.

      Ansonsten reichen die Meldungen allein nicht.

      H Offline
      H Offline
      hub01
      schrieb am zuletzt editiert von
      #10

      @peterfido
      Möchte eigentlich nicht, dass mein ganzes Script analysiert wird.
      Das wird immer eine endlose Diskussion bei mir.
      Hatte ich z.B. beim Thema „zyklische Routinen“

      Hier mal der Teil, in dem die Meldungen erzeugt werden:
      Aber wie gesagt, im Logfiles taucht ja alles richtig auf.

      // ======================================
      //   Wallbox-Ansteuerung
      //   ( TEST 2, noch nicht fertig )
      //
      //   zukünftige Funktionen:
      //    - erst Abfahren, dann Ausschalten
      //    - beim Laden Auto abgesteckt?
      // ======================================
      const zykWB = 2*1000;    // Wallbox-Ansteuerung (> 1Sek)
      setInterval(async function() {
      
          // Status von WB holen
          // -------------------
          bZusRM    = getState(preWB +".carConnected").val=="Charging";   // Auto lädt
          var bAcsRM= getState(preWB +".AccessState").val=="Open";        // Zugriff frei
          var bPh1  = getState(preWB +".amps1").val>0;                    // 1. Phase an
          var bPh2  = getState(preWB +".amps2").val>0;                    // 2. Phase an
          b3PhRM    = bPh1 && bPh2;                                       // 3-phasiges Laden
          iLStromRM = getState(preWB +".amp").val;                        // Ladestrom
      
          //console.info("RM Zus Strom Phasen: " +bZusRM +"  " +iLStromRM +"  " +b3PhRM);
      
          // Wallbox ansteuern
          // -----------------
      
          if(iLZus==cZusAnlauf) {                             // ====  Anlauf?  ====
              if(!bAcsRM) {                                   // Authent. Ein?
                  setState(preWB +".set_state", "acs;0");     //   j: Authent. Ausschalten
      
                  if(iPhasen==1)                              // Phasen-Vorwahl
                  setState(preWB +".set_state", "psm;1");     // - 1phasig vorwählen
                  else 
                  setState(preWB +".set_state", "psm;2");     // - 3phasig vorwählen
      
                  console.info("Anlauf: Authent. Aus, Phasenvorwahl");
              }
      
              else if(!bZusRM) {                              // Wallbox Aus?
                  setState(preWB +".set_state", "frc;0");     //   j: Wallbox Einschalten
                  console.info("WB einschalten");
              }
          }
      
          if(iLZus==cZusAus) {                                // ====  Ausschalten?  ====
              if(bZusRM) {                                    //   Wallbox Ein?
                  setState(preWB +".set_state", "frc;1");     //   j: Wallbox Ausschalten
                  console.info("WB ausschalten");
              }
              else if(bAcsRM) {                               // Authent. Aus?
                  setState(preWB +".set_state", "acs;1");     //   j: Authent. Ein
                  console.info("Authent. Ein");
              }
          }
      
          if((iLZus==cZusPause) && bZusRM ) {                 // ====  Pause, WB Ein?  ====
              setState(preWB +".set_state", "frc;1");         //   j: Wallbox Ausschalten
              console.info("Pause einschalten");
          }
          
          if((iLZus!=cZusAus) && (iLStrom!=iLStromRM)) {      // ====  Ladestrom ändern?  ====
              setState(preWB +".set_power", iLStrom);         //   j: Ladestrom zur WB
              console.info("Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
          }
      
          if((iPhasen==1) && b3PhRM) {                        // ====  3->1 Phasen?  ====
              setState(preWB +".set_state", "psm;1");         //   auf 1phasig umschalten
              console.info("auf 1-phasig umschalten");
              console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
          }
      
          if((iPhasen==3) && !b3PhRM) {                       // ====  1->3 Phasen?  ====
              setState(preWB +".set_state", "psm;2");         //   auf 3phasig umschalten
              console.info("auf 3-phasig umschalten");
              console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
          }
      
      }, zykWB);
      
      HomoranH OliverIOO 2 Antworten Letzte Antwort
      0
      • H hub01

        @peterfido
        Möchte eigentlich nicht, dass mein ganzes Script analysiert wird.
        Das wird immer eine endlose Diskussion bei mir.
        Hatte ich z.B. beim Thema „zyklische Routinen“

        Hier mal der Teil, in dem die Meldungen erzeugt werden:
        Aber wie gesagt, im Logfiles taucht ja alles richtig auf.

        // ======================================
        //   Wallbox-Ansteuerung
        //   ( TEST 2, noch nicht fertig )
        //
        //   zukünftige Funktionen:
        //    - erst Abfahren, dann Ausschalten
        //    - beim Laden Auto abgesteckt?
        // ======================================
        const zykWB = 2*1000;    // Wallbox-Ansteuerung (> 1Sek)
        setInterval(async function() {
        
            // Status von WB holen
            // -------------------
            bZusRM    = getState(preWB +".carConnected").val=="Charging";   // Auto lädt
            var bAcsRM= getState(preWB +".AccessState").val=="Open";        // Zugriff frei
            var bPh1  = getState(preWB +".amps1").val>0;                    // 1. Phase an
            var bPh2  = getState(preWB +".amps2").val>0;                    // 2. Phase an
            b3PhRM    = bPh1 && bPh2;                                       // 3-phasiges Laden
            iLStromRM = getState(preWB +".amp").val;                        // Ladestrom
        
            //console.info("RM Zus Strom Phasen: " +bZusRM +"  " +iLStromRM +"  " +b3PhRM);
        
            // Wallbox ansteuern
            // -----------------
        
            if(iLZus==cZusAnlauf) {                             // ====  Anlauf?  ====
                if(!bAcsRM) {                                   // Authent. Ein?
                    setState(preWB +".set_state", "acs;0");     //   j: Authent. Ausschalten
        
                    if(iPhasen==1)                              // Phasen-Vorwahl
                    setState(preWB +".set_state", "psm;1");     // - 1phasig vorwählen
                    else 
                    setState(preWB +".set_state", "psm;2");     // - 3phasig vorwählen
        
                    console.info("Anlauf: Authent. Aus, Phasenvorwahl");
                }
        
                else if(!bZusRM) {                              // Wallbox Aus?
                    setState(preWB +".set_state", "frc;0");     //   j: Wallbox Einschalten
                    console.info("WB einschalten");
                }
            }
        
            if(iLZus==cZusAus) {                                // ====  Ausschalten?  ====
                if(bZusRM) {                                    //   Wallbox Ein?
                    setState(preWB +".set_state", "frc;1");     //   j: Wallbox Ausschalten
                    console.info("WB ausschalten");
                }
                else if(bAcsRM) {                               // Authent. Aus?
                    setState(preWB +".set_state", "acs;1");     //   j: Authent. Ein
                    console.info("Authent. Ein");
                }
            }
        
            if((iLZus==cZusPause) && bZusRM ) {                 // ====  Pause, WB Ein?  ====
                setState(preWB +".set_state", "frc;1");         //   j: Wallbox Ausschalten
                console.info("Pause einschalten");
            }
            
            if((iLZus!=cZusAus) && (iLStrom!=iLStromRM)) {      // ====  Ladestrom ändern?  ====
                setState(preWB +".set_power", iLStrom);         //   j: Ladestrom zur WB
                console.info("Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
            }
        
            if((iPhasen==1) && b3PhRM) {                        // ====  3->1 Phasen?  ====
                setState(preWB +".set_state", "psm;1");         //   auf 1phasig umschalten
                console.info("auf 1-phasig umschalten");
                console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
            }
        
            if((iPhasen==3) && !b3PhRM) {                       // ====  1->3 Phasen?  ====
                setState(preWB +".set_state", "psm;2");         //   auf 3phasig umschalten
                console.info("auf 3-phasig umschalten");
                console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
            }
        
        }, zykWB);
        
        HomoranH Nicht stören
        HomoranH Nicht stören
        Homoran
        Global Moderator Administrators
        schrieb am zuletzt editiert von Homoran
        #11

        @hub01 sagte in zig gleiche Einträge in JS-Protokollanzeige:

        console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);

        wie oft kommt das denn im Skript vor?

        kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

        der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

        H 1 Antwort Letzte Antwort
        0
        • HomoranH Homoran

          @hub01 sagte in zig gleiche Einträge in JS-Protokollanzeige:

          console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);

          wie oft kommt das denn im Skript vor?

          H Offline
          H Offline
          hub01
          schrieb am zuletzt editiert von
          #12

          @homoran
          f628bcd4-8513-4160-9e3c-a828b2851cfe-grafik.png

          HomoranH 1 Antwort Letzte Antwort
          0
          • H hub01

            @homoran
            f628bcd4-8513-4160-9e3c-a828b2851cfe-grafik.png

            HomoranH Nicht stören
            HomoranH Nicht stören
            Homoran
            Global Moderator Administrators
            schrieb am zuletzt editiert von Homoran
            #13

            @hub01 das stimmt nicht!
            alleine in den Ausschnitt sind 3
            Screenshot_20250216-185233_Firefox.jpg

            und wie oft werden die aufgerufen?

            kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

            Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

            der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

            H 1 Antwort Letzte Antwort
            0
            • H hub01

              @peterfido
              Möchte eigentlich nicht, dass mein ganzes Script analysiert wird.
              Das wird immer eine endlose Diskussion bei mir.
              Hatte ich z.B. beim Thema „zyklische Routinen“

              Hier mal der Teil, in dem die Meldungen erzeugt werden:
              Aber wie gesagt, im Logfiles taucht ja alles richtig auf.

              // ======================================
              //   Wallbox-Ansteuerung
              //   ( TEST 2, noch nicht fertig )
              //
              //   zukünftige Funktionen:
              //    - erst Abfahren, dann Ausschalten
              //    - beim Laden Auto abgesteckt?
              // ======================================
              const zykWB = 2*1000;    // Wallbox-Ansteuerung (> 1Sek)
              setInterval(async function() {
              
                  // Status von WB holen
                  // -------------------
                  bZusRM    = getState(preWB +".carConnected").val=="Charging";   // Auto lädt
                  var bAcsRM= getState(preWB +".AccessState").val=="Open";        // Zugriff frei
                  var bPh1  = getState(preWB +".amps1").val>0;                    // 1. Phase an
                  var bPh2  = getState(preWB +".amps2").val>0;                    // 2. Phase an
                  b3PhRM    = bPh1 && bPh2;                                       // 3-phasiges Laden
                  iLStromRM = getState(preWB +".amp").val;                        // Ladestrom
              
                  //console.info("RM Zus Strom Phasen: " +bZusRM +"  " +iLStromRM +"  " +b3PhRM);
              
                  // Wallbox ansteuern
                  // -----------------
              
                  if(iLZus==cZusAnlauf) {                             // ====  Anlauf?  ====
                      if(!bAcsRM) {                                   // Authent. Ein?
                          setState(preWB +".set_state", "acs;0");     //   j: Authent. Ausschalten
              
                          if(iPhasen==1)                              // Phasen-Vorwahl
                          setState(preWB +".set_state", "psm;1");     // - 1phasig vorwählen
                          else 
                          setState(preWB +".set_state", "psm;2");     // - 3phasig vorwählen
              
                          console.info("Anlauf: Authent. Aus, Phasenvorwahl");
                      }
              
                      else if(!bZusRM) {                              // Wallbox Aus?
                          setState(preWB +".set_state", "frc;0");     //   j: Wallbox Einschalten
                          console.info("WB einschalten");
                      }
                  }
              
                  if(iLZus==cZusAus) {                                // ====  Ausschalten?  ====
                      if(bZusRM) {                                    //   Wallbox Ein?
                          setState(preWB +".set_state", "frc;1");     //   j: Wallbox Ausschalten
                          console.info("WB ausschalten");
                      }
                      else if(bAcsRM) {                               // Authent. Aus?
                          setState(preWB +".set_state", "acs;1");     //   j: Authent. Ein
                          console.info("Authent. Ein");
                      }
                  }
              
                  if((iLZus==cZusPause) && bZusRM ) {                 // ====  Pause, WB Ein?  ====
                      setState(preWB +".set_state", "frc;1");         //   j: Wallbox Ausschalten
                      console.info("Pause einschalten");
                  }
                  
                  if((iLZus!=cZusAus) && (iLStrom!=iLStromRM)) {      // ====  Ladestrom ändern?  ====
                      setState(preWB +".set_power", iLStrom);         //   j: Ladestrom zur WB
                      console.info("Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                  }
              
                  if((iPhasen==1) && b3PhRM) {                        // ====  3->1 Phasen?  ====
                      setState(preWB +".set_state", "psm;1");         //   auf 1phasig umschalten
                      console.info("auf 1-phasig umschalten");
                      console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                  }
              
                  if((iPhasen==3) && !b3PhRM) {                       // ====  1->3 Phasen?  ====
                      setState(preWB +".set_state", "psm;2");         //   auf 3phasig umschalten
                      console.info("auf 3-phasig umschalten");
                      console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                  }
              
              }, zykWB);
              
              OliverIOO Offline
              OliverIOO Offline
              OliverIO
              schrieb am zuletzt editiert von
              #14

              @hub01

              nimm nicht setIntervall, sonder setTimeout und am Ende des Skripts wieder ein erneutes setTimeout auslösen für den nächsten Zyklus.
              Das sorgt dafür, das beim beenden des Skripts der Code maximal nur noch 1 mal ausgeführt wird.

              mit setInterval registrierst du bei jedem Skriptstart das erneut, ohne das der vorherige Interval vergessen wird. der müsste eigentlich mit clearTimeout gelöscht werden. Das Interval handle wird beimn Aufruf von setInterval zurückgegeben.
              Ohne das, kannst diese vergessenen Intervalle nur stoppen indem du den javascript adapter neu startest.

              Wahrscheinlich hast du das Skript mehrfach aufgerufen und da laufen mehrere Abläufe parallel.

              https://developer.mozilla.org/en-US/docs/Web/API/Window/clearTimeout
              https://developer.mozilla.org/en-US/docs/Web/API/Window/clearTimeout
              https://developer.mozilla.org/en-US/docs/Web/API/Window/setInterval

              Meine Adapter und Widgets
              TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
              Links im Profil

              T 1 Antwort Letzte Antwort
              1
              • OliverIOO OliverIO

                @hub01

                nimm nicht setIntervall, sonder setTimeout und am Ende des Skripts wieder ein erneutes setTimeout auslösen für den nächsten Zyklus.
                Das sorgt dafür, das beim beenden des Skripts der Code maximal nur noch 1 mal ausgeführt wird.

                mit setInterval registrierst du bei jedem Skriptstart das erneut, ohne das der vorherige Interval vergessen wird. der müsste eigentlich mit clearTimeout gelöscht werden. Das Interval handle wird beimn Aufruf von setInterval zurückgegeben.
                Ohne das, kannst diese vergessenen Intervalle nur stoppen indem du den javascript adapter neu startest.

                Wahrscheinlich hast du das Skript mehrfach aufgerufen und da laufen mehrere Abläufe parallel.

                https://developer.mozilla.org/en-US/docs/Web/API/Window/clearTimeout
                https://developer.mozilla.org/en-US/docs/Web/API/Window/clearTimeout
                https://developer.mozilla.org/en-US/docs/Web/API/Window/setInterval

                T Nicht stören
                T Nicht stören
                ticaki
                schrieb am zuletzt editiert von
                #15

                @oliverio

                AFAIK kümmert sich die Javascript Instanz um das beenden von setInterval() und schedule().

                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                Spenden

                OliverIOO 1 Antwort Letzte Antwort
                0
                • HomoranH Homoran

                  @hub01 das stimmt nicht!
                  alleine in den Ausschnitt sind 3
                  Screenshot_20250216-185233_Firefox.jpg

                  und wie oft werden die aufgerufen?

                  H Offline
                  H Offline
                  hub01
                  schrieb am zuletzt editiert von
                  #16

                  @homoran sagte in zig gleiche Einträge in JS-Protokollanzeige:

                  @hub01 das stimmt nicht!
                  alleine in den Ausschnitt sind 3
                  Screenshot_20250216-185233_Firefox.jpg

                  und wie oft werden die aufgerufen?

                  530da197-47b9-45a7-b05a-e6a31152b628-grafik.png

                  a85251cb-77b1-4680-9eb1-787e1feb5fb9-grafik.png

                  alle 2 Sekunden

                  T 1 Antwort Letzte Antwort
                  0
                  • H hub01

                    @homoran sagte in zig gleiche Einträge in JS-Protokollanzeige:

                    @hub01 das stimmt nicht!
                    alleine in den Ausschnitt sind 3
                    Screenshot_20250216-185233_Firefox.jpg

                    und wie oft werden die aufgerufen?

                    530da197-47b9-45a7-b05a-e6a31152b628-grafik.png

                    a85251cb-77b1-4680-9eb1-787e1feb5fb9-grafik.png

                    alle 2 Sekunden

                    T Nicht stören
                    T Nicht stören
                    ticaki
                    schrieb am zuletzt editiert von
                    #17

                    @hub01
                    Gut wegen dem ursprünglichen Problem. Issue aufmachen wenns stört. Kann es aber weder bestätigen noch verneinen, da ich dort keine logs gucke die älter sind. Das wird im Admin oder im Download geguckt. :)

                    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                    Spenden

                    1 Antwort Letzte Antwort
                    0
                    • T ticaki

                      @oliverio

                      AFAIK kümmert sich die Javascript Instanz um das beenden von setInterval() und schedule().

                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von
                      #18

                      @ticaki
                      ja, hab gerade ausprobiert.
                      dann ist das relativ neu.
                      das war früher nicht so.
                      da gab es immer wieder fälle, das sich das aufmultipliziert hat

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      368

                      Online

                      32.4k

                      Benutzer

                      81.5k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe