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. [gelöst] on-funktionen generieren aus einem object

NEWS

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

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

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

[gelöst] on-funktionen generieren aus einem object

Geplant Angeheftet Gesperrt Verschoben JavaScript
15 Beiträge 5 Kommentatoren 1.2k Aufrufe 5 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.
  • B Offline
    B Offline
    benni27
    schrieb am zuletzt editiert von benni27
    #1

    Hi,
    ich habe folgendes Problem.
    Ich nutze yahka für homekit.
    Meine ganzen Skripte steuern Lampen über eine globale funktion "ansteuern" an, nicht direkt durch setState. in der Funktion wird nach Timeout der Ack-Zustand abgefragt, bei Fehler bekomme ich eine Mitteilung dass die Lampe nicht reagiert. Funzt top.

    Bisher hatte ich in Yahka meine ganzen Geräte erstellt und direkt die Lampen-States geschalten.
    Ich möchte ein Skript, mit dem ich einen selbst generierten Alias über yahka schalte, und durch diesen dann die globale Funktion zum Lampe schalten aufrufe.

    Hier mal die global verfügbaren Skripte:
    defines: hier werden meine globalen Variablen definiert.

        const raum = {
            flur: {
                TreppeLichterkette: {
                    STATE: 'zigbee.0.804b50fffeb72a3b.state',
                    DESCRIPTION: 'Flur Treppe Lichterkette'
                },
                WandlampenUnten: {
                    STATE: 'zigbee.0.84fd27fffe70e192.state',
                    BRIGHTNESS: 'zigbee.0.84fd27fffe70e192.brightness',
                    DESCRIPTION: 'Flur Wandlampen Unten'
                },
                WandlampenOben: {
                    STATE: 'zigbee.0.680ae2fffea535cf.state',
                    BRIGHTNESS: 'zigbee.0.680ae2fffea535cf.brightness',
                    DESCRIPTION: 'Flur Wandlampen Oben'
                },
                Tischlampe: {
                    STATE: 'hue-extended.0.lights.032-tischlampe.action.on',
                    BRIGHTNESS: 'hue-extended.0.lights.032-tischlampe.action.level',
                    DESCRIPTION: 'Flur Tischlampe'
                }
            },
            kueche: {
                Arbeitslicht: {
                    STATE: 'zigbee.0.680ae2fffea44ad6.state',
                    BRIGHTNESS: 'zigbee.0.680ae2fffea44ad6.brightness',
                    DESCRIPTION: 'Küche Arbeitslicht'                    
                },
                Deckenlampe: {
                    STATE: 'zigbee.0.84fd27fffe70cf16.state',
                    DESCRIPTION: 'Küche Deckenlampe'
                },
                Indirekt: {
                    STATE: 'hue-extended.0.lights.026-kuecheindirekt.action.on',
                    BRIGHTNESS: 'hue-extended.0.lights.026-kuecheindirekt.action.level',
                    XY: 'hue-extended.0.lights.026-kuecheindirekt.action.xy',
                    COLORTEMP: 'hue-extended.0.lights.026-kuecheindirekt.action.colorTemperature',
                    DESCRIPTION: 'Küche indirekte Beleuchtung'
                },
                SteckdoseFenster: {
                    STATE: 'shelly.0.SHSW-1#C45BBE564DF9#1.Relay0.Switch',
                    DESCRIPTION: 'Küche Steckdose am Fenster'
                },
                ButtonZirkulation: {
                    CLICK: 'zigbee.0.00124b0029198d06.click',
                    LongCLICK: 'zigbee.0.00124b0029198d06.long_click',
                    DoubleCLICK: 'zigbee.0.00124b0029198d06.double_click',
                    DESCRIPTION: 'Küche Button über der Spüle'
                }
            },
            esszimmer: {
                deckenlampe: {
                    STATE: 'zigbee.0.804b50fffeb73d1c.state',
                    BRIGHTNESS: 'zigbee.0.804b50fffeb73d1c.brightness',
                    DESCRIPTION: 'Esszimmer Deckenlampe'
                },
                barlampe: {
                    STATE: 'zigbee.0.804b50fffeb72408.state',
                    DESCRIPTION: 'Esszimmer Barlampe'
                },
                stehlampe: {
                    STATE: 'hue-extended.0.lights.027-esszimmerstehlampe.action.on',
                    BRIGHTNESS: 'hue-extended.0.lights.027-esszimmerstehlampe.action.level',
                    XY: 'hue-extended.0.lights.027-esszimmerstehlampe.action.xy',
                    COLORTEMP: 'hue-extended.0.lights.027-esszimmerstehlampe.action.colorTemperature',
                    DESCRIPTION: 'Esszimmer Stehlampe'
                },
                steckdoseFenster: {
                    STATE: 'shelly.0.SHSW-1#98CDAC24595B#1.Relay0.Switch',
                    DESCRIPTION: 'Esszimmer Steckdose am Fenster'
                },
                heizung: {
                    VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D844E.ValveTappet.position',
                    SET:'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperature',
                    SET_COMFORT: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperatureForLevelComfort',
                    SET_ECO: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperatureForLevelEco',
                    SUMMER: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.summerMode',
                    DESCRIPTION: 'Esszimmer Heizthermostat'
                }
            },
            wintergarten: {
                wandlampen: {
                    STATE: 'zigbee.0.804b50fffeb72672.state',
                    DESCRIPTION: 'Wintergarten Wandlampen'
                    },
                fensteroeffner: {
                    POSITION: 'shelly.0.SHSW-25#3C6105E4E872#1.Shutter.Position',
                    DESCRIPTION: 'Wintergarten Fensteröffner'
                    },
                markise: {
                    EINFAHREN: 'sonoff.0.Markise.POWER1',
                    AUSFAHREN: 'sonoff.0.Markise.POWER2',
                    DESCRIPTION: 'Wintergarten Markise'
                    },
                automatik: {
                    STATE: 'yahka.meta.eigene_Datenpunkte.FreigabeWintergartenAutomatik',
                    DESCRIPTION: 'Wintergarten Automatikfreigabe für Markise und Fenster'
                    },
                heizung: {
                    VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E52CD.ValveTappet.position',
                    SET:'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperature',
                    SET_COMFORT: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperatureForLevelComfort',
                    SET_ECO: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperatureForLevelEco',
                    SUMMER: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.summerMode',
                    DESCRIPTION: 'Wintergarten Heizthermostat'
                }
            },
            wohnzimmer: {
                Deckenlampe: {
                    STATE: 'zigbee.0.680ae2fffea520fe.state',
                    BRIGHTNESS: 'zigbee.0.680ae2fffea520fe.brightness',
                    DESCRIPTION: 'Wohnzimmer Deckenlampe'
                    },
                StehlampeVorn: {
                    STATE: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.on',
                    BRIGHTNESS: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.level',
                    XY: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.xy',
                    COLORTEMP: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.colorTemperature',
                    DESCRIPTION: 'Wohnzimmer Stehlampe vorne'
                    },
                StehlampeSofa: {
                    STATE: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.on',
                    BRIGHTNESS: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.level',
                    COLORTEMP: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.colorTemperature',
                    DESCRIPTION: 'Wohnzimmer Stehlampe hinterm Sofa'
                    },
                StromFernseher: {
                    STATE: 'shelly.0.SHSW-1#C45BBE778068#1.Relay0.Switch',
                    DESCRIPTION: 'Wohnzimmer Steckdosenschalter Fernseher'
                    },
                SteckdoseFenster: {
                    STATE: 'shelly.0.SHSW-1#483FDAA24004#1.Relay0.Switch',
                    DESCRIPTION: 'Wohnzimmer Steckdose am Fenster'
                    },
                heizung: {
                    VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D8437.ValveTappet.position',
                    SET:'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperature',
                    SET_COMFORT: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperatureForLevelComfort',
                    SET_ECO: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperatureForLevelEco',
                    SUMMER: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.summerMode',
                    DESCRIPTION: 'Wohnzimmer Heizthermostat'
                    }
            },
            bad: {
                deckenlampe: {
                    STATE: 'zigbee.0.804b50fffeb34cf4.state',
                    DESCRIPTION: 'Bad Deckenlampe'
                },
                heizung: {
                    VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E590C.ValveTappet.position',
                    SET:'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperature',
                    SET_COMFORT: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperatureForLevelComfort',
                    SET_ECO: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperatureForLevelEco',
                    SUMMER: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.summerMode',
                    DESCRIPTION: 'Bad Heizthermostat'
                }
            },
            buero: {
                deckenlampe: {
                    STATE: 'zigbee.0.804b50fffeb34cf4.state',
                    DESCRIPTION: 'Büro Deckenlampe'
                },
                heizung: {
                    VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E504F.ValveTappet.position',
                    SET:'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperature',
                    SET_COMFORT: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperatureForLevelComfort',
                    SET_ECO: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperatureForLevelEco',
                    SUMMER: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.summerMode',
                    DESCRIPTION: 'Büro Heizthermostat'
                }
            },
            ankleide: {
                deckenlampe: {
                    STATE: 'zigbee.0.804b50fffeb3550c.state',
                    DESCRIPTION: 'Ankleidezimmer Deckenlampe'
                },
                heizung: {
                    VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D5C17.ValveTappet.position',
                    SET:'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperature',
                    SET_COMFORT: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperatureForLevelComfort',
                    SET_ECO: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperatureForLevelEco',
                    SUMMER: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.summerMode',
                    DESCRIPTION: 'Ankleidezimmer Heizthermostat'
                }
            },
            schlafzimmer: {
                deckenlampe: {
                    STATE: 'zigbee.0.680ae2fffea535c4.state',
                    BRIGHTNESS: 'zigbee.0.680ae2fffea535c4.brightness',
                    DESCRIPTION: 'Schlafzimmer Deckenlampe'
                },
                schranklicht: {
                    STATE: 'zigbee.0.0c4314fffee932d8.state',
                    DESCRIPTION: 'Schlafzimmer Schranklicht'
                },
                buttonTuer: {
                    CLICK: 'zigbee.0.00124b002919bc6a.click',
                    LongCLICK: 'zigbee.0.00124b002919bc6a.long_click',
                    DoubleCLICK: 'zigbee.0.00124b002919bc6a.double_click',
                    DESCRIPTION: 'Schlafzimmer Button an der Tür'
                },
                heizung: {
                    VENTILPOS_BALKON: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E504C.ValveTappet.position',
                    VENTILPOS_FENSTER: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D59FD.ValveTappet.position',
                    SET:'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperature',
                    SET_COMFORT: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperatureForLevelComfort',
                    SET_ECO: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperatureForLevelEco',
                    SUMMER: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.summerMode',
                    DESCRIPTION: 'Schlafzimmer Heizthermostat'
                }
            },
            hobbyraum: {
                deckenlampe: {
                    STATE: 'zigbee.0.804b50fffeb0d4ee.state',
                    DESCRIPTION: 'Hobbyraum Deckenlampe'
                },
                heizung: {
                    VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85DFE77.ValveTappet.position',
                    SET:'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperature',
                    SET_COMFORT: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperatureForLevelComfort',
                    SET_ECO: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperatureForLevelEco',
                    SUMMER: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.summerMode',
                    DESCRIPTION: 'Hobbyraum Heizthermostat'
                }
            },
            keller: {
                deckenlampen: {
                    STATE: 'zigbee.0.804b50fffeb72695.state',
                    DESCRIPTION: 'Keller Deckenlampen'
                }
            },
            garage: {
                deckenlampe: {
                    STATE: 'shelly.0.SHSW-1#E8DB84D24E26#1.Relay0.Switch',
                    INPUT: 'shelly.0.SHSW-1#E8DB84D24E26#1.Relay0.Input',
                    DESCRIPTION: 'Garage Deckenlampe'
                },
                fluter: {
                    STATE: 'shelly.0.SHSW-1#E8DB84D61FFB#1.Relay0.Switch',
                    INPUT: 'shelly.0.SHSW-1#E8DB84D61FFB#1.Relay0.Input',
                    DESCRIPTION: 'Garage Fluter'
                },
                bwMelder: {
                    PRESENCE: 'zigbee.0.001788010649aa21.occupancy',
                    LIGHT: 'zigbee.0.001788010649aa21.illuminance',
                    TEMP: 'zigbee.0.001788010649aa21.temperature',
                    DESCRIPTION: 'Garage Bewegungsmelder'
                }
            },
            aussen: {
                heckenlicht: {
                    STATE: 'zigbee.0.804b50fffeb0d7fa.state',
                    DESCRIPTION: 'Aussen Heckenbeleuchtung'
                },
                haustuerBwMelder: {
                    STATE: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Switch',
                    CLICK: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Input',
                    LongCLICK: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.longpush',
                    EVENT: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Event',
                    EVENTCOUNT: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.EventCount',
                    DESCRIPTION: 'Aussen Bewegungsmelder an der Haustür'
                }
            }
        }
    

    die funktion Ansteuern: das ist die global verfügbare funktion, mit der ich Lampen ansteuere

    //Eingangsvariablen sind Object-IDs, die angesteuert werden sollen und der Schaltzustand
    
    //Variablendeklaration
    let ansteuern_ID;
    let ansteuern_Value;
    let ansteuern_oldValue;
    let ansteuern_desc;  //Beschreibung für die Push-Mitteilung
    
    //Funktion
    function ansteuern (ansteuern_ID, ansteuern_Value, ansteuern_oldValue, ansteuern_desc) {
        var push_desc;
        if (ansteuern_desc == undefined) {
            push_desc = ansteuern_ID;
        } else {
            push_desc = ansteuern_desc;
        };
    
        if (getState(ansteuern_ID).val != ansteuern_Value  ||
            getState(ansteuern_ID).ack == false                 ) {
            
            setState(ansteuern_ID, ansteuern_Value);
    
    
            var timeout = setTimeout(async function() {
                if (getState(ansteuern_ID).ack == false ) {
    
                    setState(ansteuern_ID, ansteuern_oldValue);
    
                    var secondtryTimeout = setTimeout(async function(){
                        setState(ansteuern_ID, ansteuern_Value);
                    }, 30);
    
                    var innerTimeout = setTimeout(async function(){
                        if (getState(ansteuern_ID).ack == false ) {
                            sendTo("pushover.0", {
                            title:      "Gerät reagiert nicht.",
                            message:    "Bitte nochmal schalten oder prüfen: " + push_desc
                            });
                            setState(ansteuern_ID, ansteuern_oldValue);
                        };
                    },3000);
                };
            },3000);
        };
    };
    

    nun zu meinem neuen Skript und damit auch Problem:

    //es werden States erzeugt, die für die Homeapp genutzt werden
    
    var roomindex;
    var deviceindex;
    var statindex;
    
    var homeKitobjectAlias = {};
    
    
    for (roomindex in raum){
        for (deviceindex in raum[roomindex]){
            if (deviceindex != "haustuerBwMelder"){
                for (statindex in raum[roomindex][deviceindex]){
                    if (statindex == "STATE"                ||
                        statindex == "BRIGHTNESS"           ||
                        statindex == "SET"                    ) {
                        var objectName = "javascript.0.eigeneDatenpunkte.HomeKit.lamplist." + roomindex + "_" + deviceindex + "_" + statindex;
                        var objectValue = getState(eval("raum." + roomindex + "." + deviceindex + "." + statindex)).val;
                        var objectType = getObject(eval("raum." + roomindex + "." + deviceindex + "." + statindex)).common.type;
                        
                        if (!existsState(objectName)) {
                            createState(objectName, objectValue, {
                                name: roomindex + "_" + deviceindex + "_" + statindex,
                                type: objectType,
                                read: true,
                                write: true
                            });
                        } else {
                            setState(objectName, objectValue);
                        };
                        var flagName = "flag_" + objectName;
                        homeKitobjectAlias[roomindex + "_" + deviceindex + "_" + statindex] = {
                            orig: "raum." + roomindex + "." + deviceindex + "." + statindex, 
                            alias: objectName,
                            flag: flagName
                        };
                    }
                }
            }
        }
    }
    
    
    var flags = {};
    
    for (var key in homeKitobjectAlias) {
    
      var origID = eval(homeKitobjectAlias[key].orig);
      var aliasID = homeKitobjectAlias[key].alias;
      var flagID = homeKitobjectAlias[key].flag;
    
      on({id: aliasID, change: "ne"}, function (obj) {
        if (flags[flagName]) {
          flags[flagName] = false;
        } else {
          flags[flagName] = true;
          ansteuern(origID, obj.state.val, obj.oldState.val, aliasID);
        }
      });
    
      on({id: origID, change: "ne", ack: true}, function (obj) {
        if (flags[flagName]) {
          flags[flagName] = false;
        } else {
          flags[flagName] = true;
          setState(aliasID, obj.state.val, true);
        }
      });
    }
    

    grundsätzlich funktioniert alles soweit. die Aliase werden erzeugt, das Object homeKitObjectAlias wird auch sauber beschrieben. Habe ich über console.log schon ausgelesen. läuft.

    allerdings werden scheinbar die on-funktionen nicht sauber geschrieben.

    egal, welche Lampe ich schalte (egal ob über Lichtschalter oder in der Object-Liste), wird immer nur auf aussen_Heckenlicht_STATE geschrieben. Die on-Funktionen reagieren auf alle Lampen, schalten aber nur dieses eine State.

    Mir gehen langsam die Ideen aus, ausser mühevoll und umständlich für jeden state eine eigene on-funktion zu schreiben. Das müsste doch so irgendwie gehen?

    Wenn ich mir den homeKitaliasObject[key].orig per console ausgeben lasse, steht auch immer nur aussen_Heckenlicht_STATE drin. obwohl auf eine andere Lampe reagiert wurde.

    Kann jemand weiterhelfen?

    Vielen Dank schonmal, liebe Grüße
    Benni

    CodierknechtC OliverIOO 2 Antworten Letzte Antwort
    0
    • B benni27

      Hi,
      ich habe folgendes Problem.
      Ich nutze yahka für homekit.
      Meine ganzen Skripte steuern Lampen über eine globale funktion "ansteuern" an, nicht direkt durch setState. in der Funktion wird nach Timeout der Ack-Zustand abgefragt, bei Fehler bekomme ich eine Mitteilung dass die Lampe nicht reagiert. Funzt top.

      Bisher hatte ich in Yahka meine ganzen Geräte erstellt und direkt die Lampen-States geschalten.
      Ich möchte ein Skript, mit dem ich einen selbst generierten Alias über yahka schalte, und durch diesen dann die globale Funktion zum Lampe schalten aufrufe.

      Hier mal die global verfügbaren Skripte:
      defines: hier werden meine globalen Variablen definiert.

          const raum = {
              flur: {
                  TreppeLichterkette: {
                      STATE: 'zigbee.0.804b50fffeb72a3b.state',
                      DESCRIPTION: 'Flur Treppe Lichterkette'
                  },
                  WandlampenUnten: {
                      STATE: 'zigbee.0.84fd27fffe70e192.state',
                      BRIGHTNESS: 'zigbee.0.84fd27fffe70e192.brightness',
                      DESCRIPTION: 'Flur Wandlampen Unten'
                  },
                  WandlampenOben: {
                      STATE: 'zigbee.0.680ae2fffea535cf.state',
                      BRIGHTNESS: 'zigbee.0.680ae2fffea535cf.brightness',
                      DESCRIPTION: 'Flur Wandlampen Oben'
                  },
                  Tischlampe: {
                      STATE: 'hue-extended.0.lights.032-tischlampe.action.on',
                      BRIGHTNESS: 'hue-extended.0.lights.032-tischlampe.action.level',
                      DESCRIPTION: 'Flur Tischlampe'
                  }
              },
              kueche: {
                  Arbeitslicht: {
                      STATE: 'zigbee.0.680ae2fffea44ad6.state',
                      BRIGHTNESS: 'zigbee.0.680ae2fffea44ad6.brightness',
                      DESCRIPTION: 'Küche Arbeitslicht'                    
                  },
                  Deckenlampe: {
                      STATE: 'zigbee.0.84fd27fffe70cf16.state',
                      DESCRIPTION: 'Küche Deckenlampe'
                  },
                  Indirekt: {
                      STATE: 'hue-extended.0.lights.026-kuecheindirekt.action.on',
                      BRIGHTNESS: 'hue-extended.0.lights.026-kuecheindirekt.action.level',
                      XY: 'hue-extended.0.lights.026-kuecheindirekt.action.xy',
                      COLORTEMP: 'hue-extended.0.lights.026-kuecheindirekt.action.colorTemperature',
                      DESCRIPTION: 'Küche indirekte Beleuchtung'
                  },
                  SteckdoseFenster: {
                      STATE: 'shelly.0.SHSW-1#C45BBE564DF9#1.Relay0.Switch',
                      DESCRIPTION: 'Küche Steckdose am Fenster'
                  },
                  ButtonZirkulation: {
                      CLICK: 'zigbee.0.00124b0029198d06.click',
                      LongCLICK: 'zigbee.0.00124b0029198d06.long_click',
                      DoubleCLICK: 'zigbee.0.00124b0029198d06.double_click',
                      DESCRIPTION: 'Küche Button über der Spüle'
                  }
              },
              esszimmer: {
                  deckenlampe: {
                      STATE: 'zigbee.0.804b50fffeb73d1c.state',
                      BRIGHTNESS: 'zigbee.0.804b50fffeb73d1c.brightness',
                      DESCRIPTION: 'Esszimmer Deckenlampe'
                  },
                  barlampe: {
                      STATE: 'zigbee.0.804b50fffeb72408.state',
                      DESCRIPTION: 'Esszimmer Barlampe'
                  },
                  stehlampe: {
                      STATE: 'hue-extended.0.lights.027-esszimmerstehlampe.action.on',
                      BRIGHTNESS: 'hue-extended.0.lights.027-esszimmerstehlampe.action.level',
                      XY: 'hue-extended.0.lights.027-esszimmerstehlampe.action.xy',
                      COLORTEMP: 'hue-extended.0.lights.027-esszimmerstehlampe.action.colorTemperature',
                      DESCRIPTION: 'Esszimmer Stehlampe'
                  },
                  steckdoseFenster: {
                      STATE: 'shelly.0.SHSW-1#98CDAC24595B#1.Relay0.Switch',
                      DESCRIPTION: 'Esszimmer Steckdose am Fenster'
                  },
                  heizung: {
                      VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D844E.ValveTappet.position',
                      SET:'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperature',
                      SET_COMFORT: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperatureForLevelComfort',
                      SET_ECO: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperatureForLevelEco',
                      SUMMER: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.summerMode',
                      DESCRIPTION: 'Esszimmer Heizthermostat'
                  }
              },
              wintergarten: {
                  wandlampen: {
                      STATE: 'zigbee.0.804b50fffeb72672.state',
                      DESCRIPTION: 'Wintergarten Wandlampen'
                      },
                  fensteroeffner: {
                      POSITION: 'shelly.0.SHSW-25#3C6105E4E872#1.Shutter.Position',
                      DESCRIPTION: 'Wintergarten Fensteröffner'
                      },
                  markise: {
                      EINFAHREN: 'sonoff.0.Markise.POWER1',
                      AUSFAHREN: 'sonoff.0.Markise.POWER2',
                      DESCRIPTION: 'Wintergarten Markise'
                      },
                  automatik: {
                      STATE: 'yahka.meta.eigene_Datenpunkte.FreigabeWintergartenAutomatik',
                      DESCRIPTION: 'Wintergarten Automatikfreigabe für Markise und Fenster'
                      },
                  heizung: {
                      VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E52CD.ValveTappet.position',
                      SET:'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperature',
                      SET_COMFORT: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperatureForLevelComfort',
                      SET_ECO: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperatureForLevelEco',
                      SUMMER: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.summerMode',
                      DESCRIPTION: 'Wintergarten Heizthermostat'
                  }
              },
              wohnzimmer: {
                  Deckenlampe: {
                      STATE: 'zigbee.0.680ae2fffea520fe.state',
                      BRIGHTNESS: 'zigbee.0.680ae2fffea520fe.brightness',
                      DESCRIPTION: 'Wohnzimmer Deckenlampe'
                      },
                  StehlampeVorn: {
                      STATE: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.on',
                      BRIGHTNESS: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.level',
                      XY: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.xy',
                      COLORTEMP: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.colorTemperature',
                      DESCRIPTION: 'Wohnzimmer Stehlampe vorne'
                      },
                  StehlampeSofa: {
                      STATE: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.on',
                      BRIGHTNESS: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.level',
                      COLORTEMP: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.colorTemperature',
                      DESCRIPTION: 'Wohnzimmer Stehlampe hinterm Sofa'
                      },
                  StromFernseher: {
                      STATE: 'shelly.0.SHSW-1#C45BBE778068#1.Relay0.Switch',
                      DESCRIPTION: 'Wohnzimmer Steckdosenschalter Fernseher'
                      },
                  SteckdoseFenster: {
                      STATE: 'shelly.0.SHSW-1#483FDAA24004#1.Relay0.Switch',
                      DESCRIPTION: 'Wohnzimmer Steckdose am Fenster'
                      },
                  heizung: {
                      VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D8437.ValveTappet.position',
                      SET:'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperature',
                      SET_COMFORT: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperatureForLevelComfort',
                      SET_ECO: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperatureForLevelEco',
                      SUMMER: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.summerMode',
                      DESCRIPTION: 'Wohnzimmer Heizthermostat'
                      }
              },
              bad: {
                  deckenlampe: {
                      STATE: 'zigbee.0.804b50fffeb34cf4.state',
                      DESCRIPTION: 'Bad Deckenlampe'
                  },
                  heizung: {
                      VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E590C.ValveTappet.position',
                      SET:'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperature',
                      SET_COMFORT: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperatureForLevelComfort',
                      SET_ECO: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperatureForLevelEco',
                      SUMMER: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.summerMode',
                      DESCRIPTION: 'Bad Heizthermostat'
                  }
              },
              buero: {
                  deckenlampe: {
                      STATE: 'zigbee.0.804b50fffeb34cf4.state',
                      DESCRIPTION: 'Büro Deckenlampe'
                  },
                  heizung: {
                      VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E504F.ValveTappet.position',
                      SET:'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperature',
                      SET_COMFORT: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperatureForLevelComfort',
                      SET_ECO: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperatureForLevelEco',
                      SUMMER: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.summerMode',
                      DESCRIPTION: 'Büro Heizthermostat'
                  }
              },
              ankleide: {
                  deckenlampe: {
                      STATE: 'zigbee.0.804b50fffeb3550c.state',
                      DESCRIPTION: 'Ankleidezimmer Deckenlampe'
                  },
                  heizung: {
                      VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D5C17.ValveTappet.position',
                      SET:'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperature',
                      SET_COMFORT: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperatureForLevelComfort',
                      SET_ECO: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperatureForLevelEco',
                      SUMMER: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.summerMode',
                      DESCRIPTION: 'Ankleidezimmer Heizthermostat'
                  }
              },
              schlafzimmer: {
                  deckenlampe: {
                      STATE: 'zigbee.0.680ae2fffea535c4.state',
                      BRIGHTNESS: 'zigbee.0.680ae2fffea535c4.brightness',
                      DESCRIPTION: 'Schlafzimmer Deckenlampe'
                  },
                  schranklicht: {
                      STATE: 'zigbee.0.0c4314fffee932d8.state',
                      DESCRIPTION: 'Schlafzimmer Schranklicht'
                  },
                  buttonTuer: {
                      CLICK: 'zigbee.0.00124b002919bc6a.click',
                      LongCLICK: 'zigbee.0.00124b002919bc6a.long_click',
                      DoubleCLICK: 'zigbee.0.00124b002919bc6a.double_click',
                      DESCRIPTION: 'Schlafzimmer Button an der Tür'
                  },
                  heizung: {
                      VENTILPOS_BALKON: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E504C.ValveTappet.position',
                      VENTILPOS_FENSTER: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D59FD.ValveTappet.position',
                      SET:'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperature',
                      SET_COMFORT: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperatureForLevelComfort',
                      SET_ECO: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperatureForLevelEco',
                      SUMMER: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.summerMode',
                      DESCRIPTION: 'Schlafzimmer Heizthermostat'
                  }
              },
              hobbyraum: {
                  deckenlampe: {
                      STATE: 'zigbee.0.804b50fffeb0d4ee.state',
                      DESCRIPTION: 'Hobbyraum Deckenlampe'
                  },
                  heizung: {
                      VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85DFE77.ValveTappet.position',
                      SET:'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperature',
                      SET_COMFORT: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperatureForLevelComfort',
                      SET_ECO: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperatureForLevelEco',
                      SUMMER: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.summerMode',
                      DESCRIPTION: 'Hobbyraum Heizthermostat'
                  }
              },
              keller: {
                  deckenlampen: {
                      STATE: 'zigbee.0.804b50fffeb72695.state',
                      DESCRIPTION: 'Keller Deckenlampen'
                  }
              },
              garage: {
                  deckenlampe: {
                      STATE: 'shelly.0.SHSW-1#E8DB84D24E26#1.Relay0.Switch',
                      INPUT: 'shelly.0.SHSW-1#E8DB84D24E26#1.Relay0.Input',
                      DESCRIPTION: 'Garage Deckenlampe'
                  },
                  fluter: {
                      STATE: 'shelly.0.SHSW-1#E8DB84D61FFB#1.Relay0.Switch',
                      INPUT: 'shelly.0.SHSW-1#E8DB84D61FFB#1.Relay0.Input',
                      DESCRIPTION: 'Garage Fluter'
                  },
                  bwMelder: {
                      PRESENCE: 'zigbee.0.001788010649aa21.occupancy',
                      LIGHT: 'zigbee.0.001788010649aa21.illuminance',
                      TEMP: 'zigbee.0.001788010649aa21.temperature',
                      DESCRIPTION: 'Garage Bewegungsmelder'
                  }
              },
              aussen: {
                  heckenlicht: {
                      STATE: 'zigbee.0.804b50fffeb0d7fa.state',
                      DESCRIPTION: 'Aussen Heckenbeleuchtung'
                  },
                  haustuerBwMelder: {
                      STATE: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Switch',
                      CLICK: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Input',
                      LongCLICK: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.longpush',
                      EVENT: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Event',
                      EVENTCOUNT: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.EventCount',
                      DESCRIPTION: 'Aussen Bewegungsmelder an der Haustür'
                  }
              }
          }
      

      die funktion Ansteuern: das ist die global verfügbare funktion, mit der ich Lampen ansteuere

      //Eingangsvariablen sind Object-IDs, die angesteuert werden sollen und der Schaltzustand
      
      //Variablendeklaration
      let ansteuern_ID;
      let ansteuern_Value;
      let ansteuern_oldValue;
      let ansteuern_desc;  //Beschreibung für die Push-Mitteilung
      
      //Funktion
      function ansteuern (ansteuern_ID, ansteuern_Value, ansteuern_oldValue, ansteuern_desc) {
          var push_desc;
          if (ansteuern_desc == undefined) {
              push_desc = ansteuern_ID;
          } else {
              push_desc = ansteuern_desc;
          };
      
          if (getState(ansteuern_ID).val != ansteuern_Value  ||
              getState(ansteuern_ID).ack == false                 ) {
              
              setState(ansteuern_ID, ansteuern_Value);
      
      
              var timeout = setTimeout(async function() {
                  if (getState(ansteuern_ID).ack == false ) {
      
                      setState(ansteuern_ID, ansteuern_oldValue);
      
                      var secondtryTimeout = setTimeout(async function(){
                          setState(ansteuern_ID, ansteuern_Value);
                      }, 30);
      
                      var innerTimeout = setTimeout(async function(){
                          if (getState(ansteuern_ID).ack == false ) {
                              sendTo("pushover.0", {
                              title:      "Gerät reagiert nicht.",
                              message:    "Bitte nochmal schalten oder prüfen: " + push_desc
                              });
                              setState(ansteuern_ID, ansteuern_oldValue);
                          };
                      },3000);
                  };
              },3000);
          };
      };
      

      nun zu meinem neuen Skript und damit auch Problem:

      //es werden States erzeugt, die für die Homeapp genutzt werden
      
      var roomindex;
      var deviceindex;
      var statindex;
      
      var homeKitobjectAlias = {};
      
      
      for (roomindex in raum){
          for (deviceindex in raum[roomindex]){
              if (deviceindex != "haustuerBwMelder"){
                  for (statindex in raum[roomindex][deviceindex]){
                      if (statindex == "STATE"                ||
                          statindex == "BRIGHTNESS"           ||
                          statindex == "SET"                    ) {
                          var objectName = "javascript.0.eigeneDatenpunkte.HomeKit.lamplist." + roomindex + "_" + deviceindex + "_" + statindex;
                          var objectValue = getState(eval("raum." + roomindex + "." + deviceindex + "." + statindex)).val;
                          var objectType = getObject(eval("raum." + roomindex + "." + deviceindex + "." + statindex)).common.type;
                          
                          if (!existsState(objectName)) {
                              createState(objectName, objectValue, {
                                  name: roomindex + "_" + deviceindex + "_" + statindex,
                                  type: objectType,
                                  read: true,
                                  write: true
                              });
                          } else {
                              setState(objectName, objectValue);
                          };
                          var flagName = "flag_" + objectName;
                          homeKitobjectAlias[roomindex + "_" + deviceindex + "_" + statindex] = {
                              orig: "raum." + roomindex + "." + deviceindex + "." + statindex, 
                              alias: objectName,
                              flag: flagName
                          };
                      }
                  }
              }
          }
      }
      
      
      var flags = {};
      
      for (var key in homeKitobjectAlias) {
      
        var origID = eval(homeKitobjectAlias[key].orig);
        var aliasID = homeKitobjectAlias[key].alias;
        var flagID = homeKitobjectAlias[key].flag;
      
        on({id: aliasID, change: "ne"}, function (obj) {
          if (flags[flagName]) {
            flags[flagName] = false;
          } else {
            flags[flagName] = true;
            ansteuern(origID, obj.state.val, obj.oldState.val, aliasID);
          }
        });
      
        on({id: origID, change: "ne", ack: true}, function (obj) {
          if (flags[flagName]) {
            flags[flagName] = false;
          } else {
            flags[flagName] = true;
            setState(aliasID, obj.state.val, true);
          }
        });
      }
      

      grundsätzlich funktioniert alles soweit. die Aliase werden erzeugt, das Object homeKitObjectAlias wird auch sauber beschrieben. Habe ich über console.log schon ausgelesen. läuft.

      allerdings werden scheinbar die on-funktionen nicht sauber geschrieben.

      egal, welche Lampe ich schalte (egal ob über Lichtschalter oder in der Object-Liste), wird immer nur auf aussen_Heckenlicht_STATE geschrieben. Die on-Funktionen reagieren auf alle Lampen, schalten aber nur dieses eine State.

      Mir gehen langsam die Ideen aus, ausser mühevoll und umständlich für jeden state eine eigene on-funktion zu schreiben. Das müsste doch so irgendwie gehen?

      Wenn ich mir den homeKitaliasObject[key].orig per console ausgeben lasse, steht auch immer nur aussen_Heckenlicht_STATE drin. obwohl auf eine andere Lampe reagiert wurde.

      Kann jemand weiterhelfen?

      Vielen Dank schonmal, liebe Grüße
      Benni

      CodierknechtC Online
      CodierknechtC Online
      Codierknecht
      Developer Most Active
      schrieb am zuletzt editiert von
      #2

      @benni27
      Deine "Aliase" sind aber keine echten Aliase, sondern selbst definierte Datenpunkte.
      Daher auch die in beide Richtungen angelegten Trigger.
      Wenn Du stattdessen "echte" Aliase anlegen würdest, bräuchtest Du das gar nicht. Diese Funktionalität liefern "echte Aliase" von Haus aus.
      Du hast das hier mit mehr oder weniger großem Aufwand nachgebaut.

      Hast Du mal ab Zeile 46 protokolliert, welche Trigger da tatsächlich angelegt werden?
      Und in den beiden Triggern, welcher davon bei welchem Event feuert?

      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
      HmIP|ZigBee|Tasmota|Unifi
      Zabbix Certified Specialist
      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

      B 1 Antwort Letzte Antwort
      0
      • CodierknechtC Codierknecht

        @benni27
        Deine "Aliase" sind aber keine echten Aliase, sondern selbst definierte Datenpunkte.
        Daher auch die in beide Richtungen angelegten Trigger.
        Wenn Du stattdessen "echte" Aliase anlegen würdest, bräuchtest Du das gar nicht. Diese Funktionalität liefern "echte Aliase" von Haus aus.
        Du hast das hier mit mehr oder weniger großem Aufwand nachgebaut.

        Hast Du mal ab Zeile 46 protokolliert, welche Trigger da tatsächlich angelegt werden?
        Und in den beiden Triggern, welcher davon bei welchem Event feuert?

        B Offline
        B Offline
        benni27
        schrieb am zuletzt editiert von
        #3

        @codierknecht

        das mit den "echten" Alias ist mir bewusst.
        Zwei Gründe:
        ich wollte möglichst alles selbst erstellen um meine Programmierfähigkeiten weiter auszubauen. Bin nicht grad Profi... Daher zu meiner eigenen Übung.
        Zweitens: Ein Alias würde sofort den Original-State schalten. Das will ich aber ja nicht, ich will den über die funktion "ansteuern" schalten, um die Überwachung mit drin zu haben.

        Ich hab das mal geloggt.
        Egal welches Gerät ich schalte, die on-funktion wird getriggert.
        Aber wenn ich mir noch vor der if-Bedingung ein log reinsetze, das mir den trigger ausgibt, kommt immer aussen_heckenlicht_State.

        var flags = {};
        
        for (var key in homeKitobjectAlias) {
        
          var origID = eval(homeKitobjectAlias[key].orig);
          var aliasID = homeKitobjectAlias[key].alias;
          var flagID = homeKitobjectAlias[key].flag;
        
          on({id: aliasID, change: "ne"}, function (obj) {
            console.log("alias: " + aliasID)
            console.log("flagAlias: " + flagName)
            if (flags[flagName]) {
              flags[flagName] = false;
            } else {
              flags[flagName] = true;
              ansteuern(origID, obj.state.val, obj.oldState.val, aliasID);
            }
          });
        
          on({id: origID, change: "ne", ack: true}, function (obj) {
            console.log("origID: " + origID)
            console.log("flagOrig: " + flagName)
            if (flags[flagName]) {
              flags[flagName] = false;
            } else {
              flags[flagName] = true;
              setState(aliasID, obj.state.val, true);
            }
          });
        }
        

        Danke für die schnelle Antwort!

        CodierknechtC 1 Antwort Letzte Antwort
        0
        • B benni27

          @codierknecht

          das mit den "echten" Alias ist mir bewusst.
          Zwei Gründe:
          ich wollte möglichst alles selbst erstellen um meine Programmierfähigkeiten weiter auszubauen. Bin nicht grad Profi... Daher zu meiner eigenen Übung.
          Zweitens: Ein Alias würde sofort den Original-State schalten. Das will ich aber ja nicht, ich will den über die funktion "ansteuern" schalten, um die Überwachung mit drin zu haben.

          Ich hab das mal geloggt.
          Egal welches Gerät ich schalte, die on-funktion wird getriggert.
          Aber wenn ich mir noch vor der if-Bedingung ein log reinsetze, das mir den trigger ausgibt, kommt immer aussen_heckenlicht_State.

          var flags = {};
          
          for (var key in homeKitobjectAlias) {
          
            var origID = eval(homeKitobjectAlias[key].orig);
            var aliasID = homeKitobjectAlias[key].alias;
            var flagID = homeKitobjectAlias[key].flag;
          
            on({id: aliasID, change: "ne"}, function (obj) {
              console.log("alias: " + aliasID)
              console.log("flagAlias: " + flagName)
              if (flags[flagName]) {
                flags[flagName] = false;
              } else {
                flags[flagName] = true;
                ansteuern(origID, obj.state.val, obj.oldState.val, aliasID);
              }
            });
          
            on({id: origID, change: "ne", ack: true}, function (obj) {
              console.log("origID: " + origID)
              console.log("flagOrig: " + flagName)
              if (flags[flagName]) {
                flags[flagName] = false;
              } else {
                flags[flagName] = true;
                setState(aliasID, obj.state.val, true);
              }
            });
          }
          

          Danke für die schnelle Antwort!

          CodierknechtC Online
          CodierknechtC Online
          Codierknecht
          Developer Most Active
          schrieb am zuletzt editiert von Codierknecht
          #4

          @benni27 sagte in on-funktionen generieren aus einem object:

          Ich hab das mal geloggt.
          Egal welches Gerät ich schalte, die on-funktion wird getriggert.

          Interessant wäre hier in Zeile 8 zu loggen, welche Trigger überhaupt angelegt werden.
          Also welche Werte in den 3 Variablen stehen.

          @benni27 sagte in on-funktionen generieren aus einem object:

          Ein Alias würde sofort den Original-State schalten

          Das schon - er würde es zumindest versuchen.
          Also könnte man an jeden Alias einen Trigger hängen, der nach einem Timeout prüft, ob das Ack-Flag (des Ziels) sitzt.

          Apropos Timeout: Bevor ein Timeout gestartet wird, löscht man denselben zuerst mal.
          Hintergrund: Wenn Du z.B. innerhalb von 3 Sekunden eine Lampe x-mal schaltest, werden auch x Timeouts gestartet.
          Wirklich "wirken" soll aber immer nur einer (der letzte).

          @benni27 sagte in on-funktionen generieren aus einem object:

          ich wollte möglichst alles selbst erstellen um meine Programmierfähigkeiten weiter auszubauen. Bin nicht grad Profi... Daher zu meiner eigenen Übung.

          Ich auch nicht - jedenfalls nicht mit JavaScript ;-)

          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

          Proxmox 9.1.1 LXC|8 GB|Core i7-6700
          HmIP|ZigBee|Tasmota|Unifi
          Zabbix Certified Specialist
          Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

          B 1 Antwort Letzte Antwort
          0
          • CodierknechtC Codierknecht

            @benni27 sagte in on-funktionen generieren aus einem object:

            Ich hab das mal geloggt.
            Egal welches Gerät ich schalte, die on-funktion wird getriggert.

            Interessant wäre hier in Zeile 8 zu loggen, welche Trigger überhaupt angelegt werden.
            Also welche Werte in den 3 Variablen stehen.

            @benni27 sagte in on-funktionen generieren aus einem object:

            Ein Alias würde sofort den Original-State schalten

            Das schon - er würde es zumindest versuchen.
            Also könnte man an jeden Alias einen Trigger hängen, der nach einem Timeout prüft, ob das Ack-Flag (des Ziels) sitzt.

            Apropos Timeout: Bevor ein Timeout gestartet wird, löscht man denselben zuerst mal.
            Hintergrund: Wenn Du z.B. innerhalb von 3 Sekunden eine Lampe x-mal schaltest, werden auch x Timeouts gestartet.
            Wirklich "wirken" soll aber immer nur einer (der letzte).

            @benni27 sagte in on-funktionen generieren aus einem object:

            ich wollte möglichst alles selbst erstellen um meine Programmierfähigkeiten weiter auszubauen. Bin nicht grad Profi... Daher zu meiner eigenen Übung.

            Ich auch nicht - jedenfalls nicht mit JavaScript ;-)

            B Offline
            B Offline
            benni27
            schrieb am zuletzt editiert von
            #5

            @codierknecht
            zeile 8 hab ich auch mal geloggt. es werden alle trigger sauber angelegt.
            aber auffällig ist, dass der letzte angelegte aussen_heckenlicht_state ist.

            ich probier mal weiter. evtl. hab ich einen Ansatz.

            Danke schonmal!

            und danke für den Tipp mit Timer. Werd ich noch nachziehen, macht Sinn ;)

            1 Antwort Letzte Antwort
            0
            • B benni27

              Hi,
              ich habe folgendes Problem.
              Ich nutze yahka für homekit.
              Meine ganzen Skripte steuern Lampen über eine globale funktion "ansteuern" an, nicht direkt durch setState. in der Funktion wird nach Timeout der Ack-Zustand abgefragt, bei Fehler bekomme ich eine Mitteilung dass die Lampe nicht reagiert. Funzt top.

              Bisher hatte ich in Yahka meine ganzen Geräte erstellt und direkt die Lampen-States geschalten.
              Ich möchte ein Skript, mit dem ich einen selbst generierten Alias über yahka schalte, und durch diesen dann die globale Funktion zum Lampe schalten aufrufe.

              Hier mal die global verfügbaren Skripte:
              defines: hier werden meine globalen Variablen definiert.

                  const raum = {
                      flur: {
                          TreppeLichterkette: {
                              STATE: 'zigbee.0.804b50fffeb72a3b.state',
                              DESCRIPTION: 'Flur Treppe Lichterkette'
                          },
                          WandlampenUnten: {
                              STATE: 'zigbee.0.84fd27fffe70e192.state',
                              BRIGHTNESS: 'zigbee.0.84fd27fffe70e192.brightness',
                              DESCRIPTION: 'Flur Wandlampen Unten'
                          },
                          WandlampenOben: {
                              STATE: 'zigbee.0.680ae2fffea535cf.state',
                              BRIGHTNESS: 'zigbee.0.680ae2fffea535cf.brightness',
                              DESCRIPTION: 'Flur Wandlampen Oben'
                          },
                          Tischlampe: {
                              STATE: 'hue-extended.0.lights.032-tischlampe.action.on',
                              BRIGHTNESS: 'hue-extended.0.lights.032-tischlampe.action.level',
                              DESCRIPTION: 'Flur Tischlampe'
                          }
                      },
                      kueche: {
                          Arbeitslicht: {
                              STATE: 'zigbee.0.680ae2fffea44ad6.state',
                              BRIGHTNESS: 'zigbee.0.680ae2fffea44ad6.brightness',
                              DESCRIPTION: 'Küche Arbeitslicht'                    
                          },
                          Deckenlampe: {
                              STATE: 'zigbee.0.84fd27fffe70cf16.state',
                              DESCRIPTION: 'Küche Deckenlampe'
                          },
                          Indirekt: {
                              STATE: 'hue-extended.0.lights.026-kuecheindirekt.action.on',
                              BRIGHTNESS: 'hue-extended.0.lights.026-kuecheindirekt.action.level',
                              XY: 'hue-extended.0.lights.026-kuecheindirekt.action.xy',
                              COLORTEMP: 'hue-extended.0.lights.026-kuecheindirekt.action.colorTemperature',
                              DESCRIPTION: 'Küche indirekte Beleuchtung'
                          },
                          SteckdoseFenster: {
                              STATE: 'shelly.0.SHSW-1#C45BBE564DF9#1.Relay0.Switch',
                              DESCRIPTION: 'Küche Steckdose am Fenster'
                          },
                          ButtonZirkulation: {
                              CLICK: 'zigbee.0.00124b0029198d06.click',
                              LongCLICK: 'zigbee.0.00124b0029198d06.long_click',
                              DoubleCLICK: 'zigbee.0.00124b0029198d06.double_click',
                              DESCRIPTION: 'Küche Button über der Spüle'
                          }
                      },
                      esszimmer: {
                          deckenlampe: {
                              STATE: 'zigbee.0.804b50fffeb73d1c.state',
                              BRIGHTNESS: 'zigbee.0.804b50fffeb73d1c.brightness',
                              DESCRIPTION: 'Esszimmer Deckenlampe'
                          },
                          barlampe: {
                              STATE: 'zigbee.0.804b50fffeb72408.state',
                              DESCRIPTION: 'Esszimmer Barlampe'
                          },
                          stehlampe: {
                              STATE: 'hue-extended.0.lights.027-esszimmerstehlampe.action.on',
                              BRIGHTNESS: 'hue-extended.0.lights.027-esszimmerstehlampe.action.level',
                              XY: 'hue-extended.0.lights.027-esszimmerstehlampe.action.xy',
                              COLORTEMP: 'hue-extended.0.lights.027-esszimmerstehlampe.action.colorTemperature',
                              DESCRIPTION: 'Esszimmer Stehlampe'
                          },
                          steckdoseFenster: {
                              STATE: 'shelly.0.SHSW-1#98CDAC24595B#1.Relay0.Switch',
                              DESCRIPTION: 'Esszimmer Steckdose am Fenster'
                          },
                          heizung: {
                              VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D844E.ValveTappet.position',
                              SET:'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperature',
                              SET_COMFORT: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperatureForLevelComfort',
                              SET_ECO: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperatureForLevelEco',
                              SUMMER: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.summerMode',
                              DESCRIPTION: 'Esszimmer Heizthermostat'
                          }
                      },
                      wintergarten: {
                          wandlampen: {
                              STATE: 'zigbee.0.804b50fffeb72672.state',
                              DESCRIPTION: 'Wintergarten Wandlampen'
                              },
                          fensteroeffner: {
                              POSITION: 'shelly.0.SHSW-25#3C6105E4E872#1.Shutter.Position',
                              DESCRIPTION: 'Wintergarten Fensteröffner'
                              },
                          markise: {
                              EINFAHREN: 'sonoff.0.Markise.POWER1',
                              AUSFAHREN: 'sonoff.0.Markise.POWER2',
                              DESCRIPTION: 'Wintergarten Markise'
                              },
                          automatik: {
                              STATE: 'yahka.meta.eigene_Datenpunkte.FreigabeWintergartenAutomatik',
                              DESCRIPTION: 'Wintergarten Automatikfreigabe für Markise und Fenster'
                              },
                          heizung: {
                              VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E52CD.ValveTappet.position',
                              SET:'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperature',
                              SET_COMFORT: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperatureForLevelComfort',
                              SET_ECO: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperatureForLevelEco',
                              SUMMER: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.summerMode',
                              DESCRIPTION: 'Wintergarten Heizthermostat'
                          }
                      },
                      wohnzimmer: {
                          Deckenlampe: {
                              STATE: 'zigbee.0.680ae2fffea520fe.state',
                              BRIGHTNESS: 'zigbee.0.680ae2fffea520fe.brightness',
                              DESCRIPTION: 'Wohnzimmer Deckenlampe'
                              },
                          StehlampeVorn: {
                              STATE: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.on',
                              BRIGHTNESS: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.level',
                              XY: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.xy',
                              COLORTEMP: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.colorTemperature',
                              DESCRIPTION: 'Wohnzimmer Stehlampe vorne'
                              },
                          StehlampeSofa: {
                              STATE: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.on',
                              BRIGHTNESS: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.level',
                              COLORTEMP: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.colorTemperature',
                              DESCRIPTION: 'Wohnzimmer Stehlampe hinterm Sofa'
                              },
                          StromFernseher: {
                              STATE: 'shelly.0.SHSW-1#C45BBE778068#1.Relay0.Switch',
                              DESCRIPTION: 'Wohnzimmer Steckdosenschalter Fernseher'
                              },
                          SteckdoseFenster: {
                              STATE: 'shelly.0.SHSW-1#483FDAA24004#1.Relay0.Switch',
                              DESCRIPTION: 'Wohnzimmer Steckdose am Fenster'
                              },
                          heizung: {
                              VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D8437.ValveTappet.position',
                              SET:'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperature',
                              SET_COMFORT: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperatureForLevelComfort',
                              SET_ECO: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperatureForLevelEco',
                              SUMMER: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.summerMode',
                              DESCRIPTION: 'Wohnzimmer Heizthermostat'
                              }
                      },
                      bad: {
                          deckenlampe: {
                              STATE: 'zigbee.0.804b50fffeb34cf4.state',
                              DESCRIPTION: 'Bad Deckenlampe'
                          },
                          heizung: {
                              VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E590C.ValveTappet.position',
                              SET:'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperature',
                              SET_COMFORT: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperatureForLevelComfort',
                              SET_ECO: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperatureForLevelEco',
                              SUMMER: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.summerMode',
                              DESCRIPTION: 'Bad Heizthermostat'
                          }
                      },
                      buero: {
                          deckenlampe: {
                              STATE: 'zigbee.0.804b50fffeb34cf4.state',
                              DESCRIPTION: 'Büro Deckenlampe'
                          },
                          heizung: {
                              VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E504F.ValveTappet.position',
                              SET:'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperature',
                              SET_COMFORT: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperatureForLevelComfort',
                              SET_ECO: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperatureForLevelEco',
                              SUMMER: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.summerMode',
                              DESCRIPTION: 'Büro Heizthermostat'
                          }
                      },
                      ankleide: {
                          deckenlampe: {
                              STATE: 'zigbee.0.804b50fffeb3550c.state',
                              DESCRIPTION: 'Ankleidezimmer Deckenlampe'
                          },
                          heizung: {
                              VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D5C17.ValveTappet.position',
                              SET:'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperature',
                              SET_COMFORT: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperatureForLevelComfort',
                              SET_ECO: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperatureForLevelEco',
                              SUMMER: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.summerMode',
                              DESCRIPTION: 'Ankleidezimmer Heizthermostat'
                          }
                      },
                      schlafzimmer: {
                          deckenlampe: {
                              STATE: 'zigbee.0.680ae2fffea535c4.state',
                              BRIGHTNESS: 'zigbee.0.680ae2fffea535c4.brightness',
                              DESCRIPTION: 'Schlafzimmer Deckenlampe'
                          },
                          schranklicht: {
                              STATE: 'zigbee.0.0c4314fffee932d8.state',
                              DESCRIPTION: 'Schlafzimmer Schranklicht'
                          },
                          buttonTuer: {
                              CLICK: 'zigbee.0.00124b002919bc6a.click',
                              LongCLICK: 'zigbee.0.00124b002919bc6a.long_click',
                              DoubleCLICK: 'zigbee.0.00124b002919bc6a.double_click',
                              DESCRIPTION: 'Schlafzimmer Button an der Tür'
                          },
                          heizung: {
                              VENTILPOS_BALKON: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E504C.ValveTappet.position',
                              VENTILPOS_FENSTER: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D59FD.ValveTappet.position',
                              SET:'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperature',
                              SET_COMFORT: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperatureForLevelComfort',
                              SET_ECO: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperatureForLevelEco',
                              SUMMER: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.summerMode',
                              DESCRIPTION: 'Schlafzimmer Heizthermostat'
                          }
                      },
                      hobbyraum: {
                          deckenlampe: {
                              STATE: 'zigbee.0.804b50fffeb0d4ee.state',
                              DESCRIPTION: 'Hobbyraum Deckenlampe'
                          },
                          heizung: {
                              VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85DFE77.ValveTappet.position',
                              SET:'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperature',
                              SET_COMFORT: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperatureForLevelComfort',
                              SET_ECO: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperatureForLevelEco',
                              SUMMER: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.summerMode',
                              DESCRIPTION: 'Hobbyraum Heizthermostat'
                          }
                      },
                      keller: {
                          deckenlampen: {
                              STATE: 'zigbee.0.804b50fffeb72695.state',
                              DESCRIPTION: 'Keller Deckenlampen'
                          }
                      },
                      garage: {
                          deckenlampe: {
                              STATE: 'shelly.0.SHSW-1#E8DB84D24E26#1.Relay0.Switch',
                              INPUT: 'shelly.0.SHSW-1#E8DB84D24E26#1.Relay0.Input',
                              DESCRIPTION: 'Garage Deckenlampe'
                          },
                          fluter: {
                              STATE: 'shelly.0.SHSW-1#E8DB84D61FFB#1.Relay0.Switch',
                              INPUT: 'shelly.0.SHSW-1#E8DB84D61FFB#1.Relay0.Input',
                              DESCRIPTION: 'Garage Fluter'
                          },
                          bwMelder: {
                              PRESENCE: 'zigbee.0.001788010649aa21.occupancy',
                              LIGHT: 'zigbee.0.001788010649aa21.illuminance',
                              TEMP: 'zigbee.0.001788010649aa21.temperature',
                              DESCRIPTION: 'Garage Bewegungsmelder'
                          }
                      },
                      aussen: {
                          heckenlicht: {
                              STATE: 'zigbee.0.804b50fffeb0d7fa.state',
                              DESCRIPTION: 'Aussen Heckenbeleuchtung'
                          },
                          haustuerBwMelder: {
                              STATE: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Switch',
                              CLICK: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Input',
                              LongCLICK: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.longpush',
                              EVENT: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Event',
                              EVENTCOUNT: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.EventCount',
                              DESCRIPTION: 'Aussen Bewegungsmelder an der Haustür'
                          }
                      }
                  }
              

              die funktion Ansteuern: das ist die global verfügbare funktion, mit der ich Lampen ansteuere

              //Eingangsvariablen sind Object-IDs, die angesteuert werden sollen und der Schaltzustand
              
              //Variablendeklaration
              let ansteuern_ID;
              let ansteuern_Value;
              let ansteuern_oldValue;
              let ansteuern_desc;  //Beschreibung für die Push-Mitteilung
              
              //Funktion
              function ansteuern (ansteuern_ID, ansteuern_Value, ansteuern_oldValue, ansteuern_desc) {
                  var push_desc;
                  if (ansteuern_desc == undefined) {
                      push_desc = ansteuern_ID;
                  } else {
                      push_desc = ansteuern_desc;
                  };
              
                  if (getState(ansteuern_ID).val != ansteuern_Value  ||
                      getState(ansteuern_ID).ack == false                 ) {
                      
                      setState(ansteuern_ID, ansteuern_Value);
              
              
                      var timeout = setTimeout(async function() {
                          if (getState(ansteuern_ID).ack == false ) {
              
                              setState(ansteuern_ID, ansteuern_oldValue);
              
                              var secondtryTimeout = setTimeout(async function(){
                                  setState(ansteuern_ID, ansteuern_Value);
                              }, 30);
              
                              var innerTimeout = setTimeout(async function(){
                                  if (getState(ansteuern_ID).ack == false ) {
                                      sendTo("pushover.0", {
                                      title:      "Gerät reagiert nicht.",
                                      message:    "Bitte nochmal schalten oder prüfen: " + push_desc
                                      });
                                      setState(ansteuern_ID, ansteuern_oldValue);
                                  };
                              },3000);
                          };
                      },3000);
                  };
              };
              

              nun zu meinem neuen Skript und damit auch Problem:

              //es werden States erzeugt, die für die Homeapp genutzt werden
              
              var roomindex;
              var deviceindex;
              var statindex;
              
              var homeKitobjectAlias = {};
              
              
              for (roomindex in raum){
                  for (deviceindex in raum[roomindex]){
                      if (deviceindex != "haustuerBwMelder"){
                          for (statindex in raum[roomindex][deviceindex]){
                              if (statindex == "STATE"                ||
                                  statindex == "BRIGHTNESS"           ||
                                  statindex == "SET"                    ) {
                                  var objectName = "javascript.0.eigeneDatenpunkte.HomeKit.lamplist." + roomindex + "_" + deviceindex + "_" + statindex;
                                  var objectValue = getState(eval("raum." + roomindex + "." + deviceindex + "." + statindex)).val;
                                  var objectType = getObject(eval("raum." + roomindex + "." + deviceindex + "." + statindex)).common.type;
                                  
                                  if (!existsState(objectName)) {
                                      createState(objectName, objectValue, {
                                          name: roomindex + "_" + deviceindex + "_" + statindex,
                                          type: objectType,
                                          read: true,
                                          write: true
                                      });
                                  } else {
                                      setState(objectName, objectValue);
                                  };
                                  var flagName = "flag_" + objectName;
                                  homeKitobjectAlias[roomindex + "_" + deviceindex + "_" + statindex] = {
                                      orig: "raum." + roomindex + "." + deviceindex + "." + statindex, 
                                      alias: objectName,
                                      flag: flagName
                                  };
                              }
                          }
                      }
                  }
              }
              
              
              var flags = {};
              
              for (var key in homeKitobjectAlias) {
              
                var origID = eval(homeKitobjectAlias[key].orig);
                var aliasID = homeKitobjectAlias[key].alias;
                var flagID = homeKitobjectAlias[key].flag;
              
                on({id: aliasID, change: "ne"}, function (obj) {
                  if (flags[flagName]) {
                    flags[flagName] = false;
                  } else {
                    flags[flagName] = true;
                    ansteuern(origID, obj.state.val, obj.oldState.val, aliasID);
                  }
                });
              
                on({id: origID, change: "ne", ack: true}, function (obj) {
                  if (flags[flagName]) {
                    flags[flagName] = false;
                  } else {
                    flags[flagName] = true;
                    setState(aliasID, obj.state.val, true);
                  }
                });
              }
              

              grundsätzlich funktioniert alles soweit. die Aliase werden erzeugt, das Object homeKitObjectAlias wird auch sauber beschrieben. Habe ich über console.log schon ausgelesen. läuft.

              allerdings werden scheinbar die on-funktionen nicht sauber geschrieben.

              egal, welche Lampe ich schalte (egal ob über Lichtschalter oder in der Object-Liste), wird immer nur auf aussen_Heckenlicht_STATE geschrieben. Die on-Funktionen reagieren auf alle Lampen, schalten aber nur dieses eine State.

              Mir gehen langsam die Ideen aus, ausser mühevoll und umständlich für jeden state eine eigene on-funktion zu schreiben. Das müsste doch so irgendwie gehen?

              Wenn ich mir den homeKitaliasObject[key].orig per console ausgeben lasse, steht auch immer nur aussen_Heckenlicht_STATE drin. obwohl auf eine andere Lampe reagiert wurde.

              Kann jemand weiterhelfen?

              Vielen Dank schonmal, liebe Grüße
              Benni

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

              @benni27 sagte in on-funktionen generieren aus einem object:

              Wenn ich mir den homeKitaliasObject[key].orig per console ausgeben lasse, steht auch immer nur aussen_Heckenlicht_STATE drin

              und das ist wahrscheinlich der letzte in der Liste?
              Das hat etwas mit Scope zu tun.
              In Zeile 48 bis 50 holst du dir immer den aktuellen Wert.
              Der reicht auch für das definieren von ON aus.
              Wenn dann der trigger aktiviert wird, dann steht bspw in aliasID
              immer noch der Wert drin, den aliasID als letztes in der Schleife abgespeichert wurde.

              Das beste ist, du erzeugst dir eine Datenstruktur (Array of Objects), welche du diese ganzen Informationen speicherst und dann bei Aufruf des Triggers dir dann aus dem Array wieder holst. Der eindeutige ID des Arrays wäre dann etwas, was du aus obj holst (bspw der getriggerte Datenpunkt)

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

              B 2 Antworten Letzte Antwort
              0
              • OliverIOO OliverIO

                @benni27 sagte in on-funktionen generieren aus einem object:

                Wenn ich mir den homeKitaliasObject[key].orig per console ausgeben lasse, steht auch immer nur aussen_Heckenlicht_STATE drin

                und das ist wahrscheinlich der letzte in der Liste?
                Das hat etwas mit Scope zu tun.
                In Zeile 48 bis 50 holst du dir immer den aktuellen Wert.
                Der reicht auch für das definieren von ON aus.
                Wenn dann der trigger aktiviert wird, dann steht bspw in aliasID
                immer noch der Wert drin, den aliasID als letztes in der Schleife abgespeichert wurde.

                Das beste ist, du erzeugst dir eine Datenstruktur (Array of Objects), welche du diese ganzen Informationen speicherst und dann bei Aufruf des Triggers dir dann aus dem Array wieder holst. Der eindeutige ID des Arrays wäre dann etwas, was du aus obj holst (bspw der getriggerte Datenpunkt)

                B Offline
                B Offline
                benni27
                schrieb am zuletzt editiert von
                #7

                @oliverio
                richtig, das ist der letzte in der Liste.

                vielen Dank für die Hinweise. Ich werde mich morgen nochmal dransetzen.
                hab jetzt spätschicht..

                1 Antwort Letzte Antwort
                0
                • OliverIOO OliverIO

                  @benni27 sagte in on-funktionen generieren aus einem object:

                  Wenn ich mir den homeKitaliasObject[key].orig per console ausgeben lasse, steht auch immer nur aussen_Heckenlicht_STATE drin

                  und das ist wahrscheinlich der letzte in der Liste?
                  Das hat etwas mit Scope zu tun.
                  In Zeile 48 bis 50 holst du dir immer den aktuellen Wert.
                  Der reicht auch für das definieren von ON aus.
                  Wenn dann der trigger aktiviert wird, dann steht bspw in aliasID
                  immer noch der Wert drin, den aliasID als letztes in der Schleife abgespeichert wurde.

                  Das beste ist, du erzeugst dir eine Datenstruktur (Array of Objects), welche du diese ganzen Informationen speicherst und dann bei Aufruf des Triggers dir dann aus dem Array wieder holst. Der eindeutige ID des Arrays wäre dann etwas, was du aus obj holst (bspw der getriggerte Datenpunkt)

                  B Offline
                  B Offline
                  benni27
                  schrieb am zuletzt editiert von
                  #8

                  @oliverio
                  so ich hab jetzt mal nochmal bisschen rumprobiert.
                  ich komme nicht ganz drauf wie du das meinst, kannst du mir evtl ein Beispiel geben?

                  ich habe so viel verschiedenes jetzt probiert..
                  ich habe dann auch versucht, das nicht über eine for schleife zu lösen, sondern eine einzige On-Funktion, die als trigger das gesamte objekt homeKitobjectAlias. also ungefähr in dem stil:

                  on(homeKitobjectAlias, function(obj){
                    var origID = obj.id
                  ...
                  }
                  

                  hat aber auch nicht funktioniert. je nachdem wie ich meine variablen in der funktion deklariere, kommt entweder ein schwall an undefined meldungen im Log, oder es kommen alle states die ich in der gesamten objectliste stehen hab. Unabhängig von dem Object homeKitobjectAlias. Und dementsprechend auch ein ordentlicher Überlauf im Log..

                  hab aber auch viel anderes probiert. Könntest du mir ein kurzes Beispiel geben, dass ich verstehe wie du das meinst konkret?

                  Danke schonmal

                  AsgothianA 1 Antwort Letzte Antwort
                  0
                  • B benni27

                    @oliverio
                    so ich hab jetzt mal nochmal bisschen rumprobiert.
                    ich komme nicht ganz drauf wie du das meinst, kannst du mir evtl ein Beispiel geben?

                    ich habe so viel verschiedenes jetzt probiert..
                    ich habe dann auch versucht, das nicht über eine for schleife zu lösen, sondern eine einzige On-Funktion, die als trigger das gesamte objekt homeKitobjectAlias. also ungefähr in dem stil:

                    on(homeKitobjectAlias, function(obj){
                      var origID = obj.id
                    ...
                    }
                    

                    hat aber auch nicht funktioniert. je nachdem wie ich meine variablen in der funktion deklariere, kommt entweder ein schwall an undefined meldungen im Log, oder es kommen alle states die ich in der gesamten objectliste stehen hab. Unabhängig von dem Object homeKitobjectAlias. Und dementsprechend auch ein ordentlicher Überlauf im Log..

                    hab aber auch viel anderes probiert. Könntest du mir ein kurzes Beispiel geben, dass ich verstehe wie du das meinst konkret?

                    Danke schonmal

                    AsgothianA Offline
                    AsgothianA Offline
                    Asgothian
                    Developer
                    schrieb am zuletzt editiert von
                    #9

                    @benni27 sagte in on-funktionen generieren aus einem object:

                    @oliverio
                    so ich hab jetzt mal nochmal bisschen rumprobiert.
                    ich komme nicht ganz drauf wie du das meinst, kannst du mir evtl ein Beispiel geben?

                    wenn ich das richtig erinnere solltest du in deiner For-Schleife die lokalen Variablen nicht via "var" sondern via "const" definieren. Dann müsste es gehen.

                    Genau erklären kann ich es heute Abend aber nicht mehr.

                    for (var key in homeKitobjectAlias) {
                     
                      const origID = eval(homeKitobjectAlias[key].orig);
                      const aliasID = homeKitobjectAlias[key].alias;
                      const flagID = homeKitobjectAlias[key].flag;
                     
                      on({id: aliasID, change: "ne"}, function (obj) {
                    

                    ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
                    "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

                    B 1 Antwort Letzte Antwort
                    0
                    • AsgothianA Asgothian

                      @benni27 sagte in on-funktionen generieren aus einem object:

                      @oliverio
                      so ich hab jetzt mal nochmal bisschen rumprobiert.
                      ich komme nicht ganz drauf wie du das meinst, kannst du mir evtl ein Beispiel geben?

                      wenn ich das richtig erinnere solltest du in deiner For-Schleife die lokalen Variablen nicht via "var" sondern via "const" definieren. Dann müsste es gehen.

                      Genau erklären kann ich es heute Abend aber nicht mehr.

                      for (var key in homeKitobjectAlias) {
                       
                        const origID = eval(homeKitobjectAlias[key].orig);
                        const aliasID = homeKitobjectAlias[key].alias;
                        const flagID = homeKitobjectAlias[key].flag;
                       
                        on({id: aliasID, change: "ne"}, function (obj) {
                      
                      B Offline
                      B Offline
                      benni27
                      schrieb am zuletzt editiert von
                      #10

                      @asgothian
                      Woow! es funktioniert!
                      Super danke!

                      hab jetzt den Code genau so wie anfangs gepostet, nur mit const anstatt var. jetzt geht alles.

                      an was für kleinigkeiten das immer hängen kann ey.. danke!

                      liebe grüße, Benni

                      AsgothianA 1 Antwort Letzte Antwort
                      0
                      • B benni27

                        @asgothian
                        Woow! es funktioniert!
                        Super danke!

                        hab jetzt den Code genau so wie anfangs gepostet, nur mit const anstatt var. jetzt geht alles.

                        an was für kleinigkeiten das immer hängen kann ey.. danke!

                        liebe grüße, Benni

                        AsgothianA Offline
                        AsgothianA Offline
                        Asgothian
                        Developer
                        schrieb am zuletzt editiert von
                        #11

                        @benni27 sagte in on-funktionen generieren aus einem object:

                        jetzt geht alles.

                        Fein. Inzwischen habe ich auch meine Notizen wieder gefunden warum das so ist:

                        • die mit "var" deklarierten Variablen sind auch ausserhalb des Scope (der For Schleife) bekannt, und damit global. In das "on" wird anscheinend ein Verweis auf diese Variable eingetragen. Am Ende der Schleife steht da genau die ID des letzten Laufs drin - alle Trigger gehen also auf die ID.
                        • durch die Definition mit "const" (sollte auch bei "let" funktionieren) ist der Scope begrenzt auf die for-schleife, weswegen anscheinend der Wert und nicht die Referenzen weiter gegeben werden.

                        ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
                        "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

                        OliverIOO 1 Antwort Letzte Antwort
                        0
                        • AsgothianA Asgothian

                          @benni27 sagte in on-funktionen generieren aus einem object:

                          jetzt geht alles.

                          Fein. Inzwischen habe ich auch meine Notizen wieder gefunden warum das so ist:

                          • die mit "var" deklarierten Variablen sind auch ausserhalb des Scope (der For Schleife) bekannt, und damit global. In das "on" wird anscheinend ein Verweis auf diese Variable eingetragen. Am Ende der Schleife steht da genau die ID des letzten Laufs drin - alle Trigger gehen also auf die ID.
                          • durch die Definition mit "const" (sollte auch bei "let" funktionieren) ist der Scope begrenzt auf die for-schleife, weswegen anscheinend der Wert und nicht die Referenzen weiter gegeben werden.
                          OliverIOO Offline
                          OliverIOO Offline
                          OliverIO
                          schrieb am zuletzt editiert von
                          #12

                          @asgothian

                          ja ist richtig, global ist allerdings das falsche Wort.
                          Die geschweiften Klammern sind immer so ein Indikator dafür,
                          das ein neue Scope für javascript eröffnet wird.
                          Variablen die ausserhalb (scope1) des aktuellen Scopes (scope2) deklariert worden sind, sind auch innerhalb des scopes sichtbar.
                          bei const, kann man das nur einmal zuweisen und passt hier für das Beispiel. Wenn man noch Berechnungen für diese Variable durchführen möchte, könnte man auch noch let verwenden.

                          Der Unterschied zu var ist hier beschrieben var ist function-scoped und const/let ist block-scoped.
                          bei var kommt dann noch das sogenannte hoisting zum tragen.
                          egal wo es innerhalb einer funktion deklariert wird, intern wird die deklaration immer am Anfang der Funktion gemacht. Daher am besten es auch dort notieren

                          const
                          var
                          let
                          hoisting

                          for (var key in homeKitobjectAlias) {
                            //scope 1
                            const origID = eval(homeKitobjectAlias[key].orig);
                            const aliasID = homeKitobjectAlias[key].alias;
                            const flagID = homeKitobjectAlias[key].flag;
                           
                            on({id: aliasID, change: "ne"}, function (obj) {
                            //scope 2
                            }
                          

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

                          A B 2 Antworten Letzte Antwort
                          0
                          • OliverIOO OliverIO

                            @asgothian

                            ja ist richtig, global ist allerdings das falsche Wort.
                            Die geschweiften Klammern sind immer so ein Indikator dafür,
                            das ein neue Scope für javascript eröffnet wird.
                            Variablen die ausserhalb (scope1) des aktuellen Scopes (scope2) deklariert worden sind, sind auch innerhalb des scopes sichtbar.
                            bei const, kann man das nur einmal zuweisen und passt hier für das Beispiel. Wenn man noch Berechnungen für diese Variable durchführen möchte, könnte man auch noch let verwenden.

                            Der Unterschied zu var ist hier beschrieben var ist function-scoped und const/let ist block-scoped.
                            bei var kommt dann noch das sogenannte hoisting zum tragen.
                            egal wo es innerhalb einer funktion deklariert wird, intern wird die deklaration immer am Anfang der Funktion gemacht. Daher am besten es auch dort notieren

                            const
                            var
                            let
                            hoisting

                            for (var key in homeKitobjectAlias) {
                              //scope 1
                              const origID = eval(homeKitobjectAlias[key].orig);
                              const aliasID = homeKitobjectAlias[key].alias;
                              const flagID = homeKitobjectAlias[key].flag;
                             
                              on({id: aliasID, change: "ne"}, function (obj) {
                              //scope 2
                              }
                            
                            A Offline
                            A Offline
                            Ahnungsbefreit
                            schrieb am zuletzt editiert von
                            #13

                            @oliverio bzw. am besten "var" ganz vermeiden, das führt nur zur Unklarheiten.

                            Wenn meine Antwort hilfreich war, dürft Ihr das gerne durch einen "Upvote" (der kleine "^" unten rechts) zum Ausdruck bringen.

                            1 Antwort Letzte Antwort
                            0
                            • OliverIOO OliverIO

                              @asgothian

                              ja ist richtig, global ist allerdings das falsche Wort.
                              Die geschweiften Klammern sind immer so ein Indikator dafür,
                              das ein neue Scope für javascript eröffnet wird.
                              Variablen die ausserhalb (scope1) des aktuellen Scopes (scope2) deklariert worden sind, sind auch innerhalb des scopes sichtbar.
                              bei const, kann man das nur einmal zuweisen und passt hier für das Beispiel. Wenn man noch Berechnungen für diese Variable durchführen möchte, könnte man auch noch let verwenden.

                              Der Unterschied zu var ist hier beschrieben var ist function-scoped und const/let ist block-scoped.
                              bei var kommt dann noch das sogenannte hoisting zum tragen.
                              egal wo es innerhalb einer funktion deklariert wird, intern wird die deklaration immer am Anfang der Funktion gemacht. Daher am besten es auch dort notieren

                              const
                              var
                              let
                              hoisting

                              for (var key in homeKitobjectAlias) {
                                //scope 1
                                const origID = eval(homeKitobjectAlias[key].orig);
                                const aliasID = homeKitobjectAlias[key].alias;
                                const flagID = homeKitobjectAlias[key].flag;
                               
                                on({id: aliasID, change: "ne"}, function (obj) {
                                //scope 2
                                }
                              
                              B Offline
                              B Offline
                              benni27
                              schrieb am zuletzt editiert von
                              #14

                              Vielen Dank für eure Hilfe. Hat mir sehr weitergeholfen. Danke auch für die Erklärungen! Werde in Zukunft primär let/const verwenden! :)

                              Ich weiss leider nicht wo ich die Frage als gelöst markieren kann? Ist mein erster Forenbeitrag..

                              CodierknechtC 1 Antwort Letzte Antwort
                              0
                              • B benni27

                                Vielen Dank für eure Hilfe. Hat mir sehr weitergeholfen. Danke auch für die Erklärungen! Werde in Zukunft primär let/const verwenden! :)

                                Ich weiss leider nicht wo ich die Frage als gelöst markieren kann? Ist mein erster Forenbeitrag..

                                CodierknechtC Online
                                CodierknechtC Online
                                Codierknecht
                                Developer Most Active
                                schrieb am zuletzt editiert von
                                #15

                                @benni27 sagte in on-funktionen generieren aus einem object:

                                Ich weiss leider nicht wo ich die Frage als gelöst markieren kann? Ist mein erster Forenbeitrag..

                                Bearbeite Deinen Eingangspost und setze ein "[gelöst] - " vor den Titel.

                                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                                Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                                HmIP|ZigBee|Tasmota|Unifi
                                Zabbix Certified Specialist
                                Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                                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

                                644

                                Online

                                32.4k

                                Benutzer

                                81.6k

                                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