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

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Hue Push API für Hue Adapter

NEWS

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

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

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

Hue Push API für Hue Adapter

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
164 Beiträge 46 Kommentatoren 37.2k Aufrufe 57 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.
  • N Offline
    N Offline
    Nikless
    schrieb am zuletzt editiert von
    #112

    @Pman Klasse Script! Hat meine Bewegungsmelder Schaltung erst möglich gemacht.

    Nun habe ich leider ein Problem, dass ich nicht gelöst bekomme:
    Ich habe einen ZGPSwitch (Senic Friends of Hue) der nicht mit push updated (per polling ja, aber langsam). Ein anderer Friends of hue switch updated per push gut. ZLLSwitches gehen ebenfalls. Gibt es da irgendeinen Trick, oder Dinge die ich ausprobieren kann? Im Log finde ich nix...

    N 1 Antwort Letzte Antwort
    0
    • N Nikless

      @Pman Klasse Script! Hat meine Bewegungsmelder Schaltung erst möglich gemacht.

      Nun habe ich leider ein Problem, dass ich nicht gelöst bekomme:
      Ich habe einen ZGPSwitch (Senic Friends of Hue) der nicht mit push updated (per polling ja, aber langsam). Ein anderer Friends of hue switch updated per push gut. ZLLSwitches gehen ebenfalls. Gibt es da irgendeinen Trick, oder Dinge die ich ausprobieren kann? Im Log finde ich nix...

      N Offline
      N Offline
      Nikless
      schrieb am zuletzt editiert von
      #113

      @Pman Nun habe ich nochmal den kompletten Hue Adapter neue installiert, neues token geholt, ins script gepackt und geht. Keine Ahnung wieso...

      1 Antwort Letzte Antwort
      0
      • P Pman

        Bisher hat Philips die Push API nicht offiziell released und sie wird noch nicht vom Hue-Adapter unterstützt. Dieses Skript baut eine Verbindung zur Bridge auf und aktualisiert entsprechende States "live", ich empfehle das polling im Adapter zu deaktivieren. Welche Datenpunkte aktualisiert werden kann man in der UPDATEMAP nachlesen.
        Weitere Hinweise siehe Skript.
        Update
        1.1.0 hue-extended support
        1.1.1 ZGPSwitch support
        1.1.2 bekannte push calls ignorieren um weniger log zu erzeugen
        1.1.3 Zone support (only on)

        /**
        * Version: 1.1.3 (HUE + HUE-EXTENDED)
        * Anleitung: 
        *  - npm-Modul im Javascript-Adapter hinzufügen (Adaptereinstellung): hue-push-client 
        *  - IP: IP der Bridge eintragen
        *  - TOKEN: gültigen User für die Bridge eintragen (z.B. aus der Hue Adapter Konfiguration)
        *  - INSTANCE: korrekte Instanz eingeben, meist hue.0 oder hue-extended.0
        **/
        const IP = '<bridge ip>';
        const TOKEN = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        const INSTANCE = 'hue.0';
        
        /**
        * DO NOT EDIT BELOW
        **/
        const UPDATEMAP_HUE = {
            //lights
            'lights.status.status': {stateName: 'reachable', convert: (val) => {return val === 'connected' ? true : false;}, validTypes: ['Extended color light', 'Color temperature light', 'Dimmable light', 'On/Off plug-in unit'], after: (stateId, value) => {updateHueState(stateId.substring(0, stateId.lastIndexOf('.'))  + '.on', value)}},
            'lights.on.on': {stateName: 'on', validTypes: ['Extended color light', 'Color temperature light', 'Dimmable light', 'On/Off plug-in unit']},
            'lights.dimming.brightness': {stateName: 'level', convert: (val) => {return Math.ceil(val)}, validTypes: ['Extended color light', 'Color temperature light', 'Dimmable light'], after: (stateId, value) => {updateRGBHue(stateId.substring(0, stateId.lastIndexOf('.')))}},
            'lights.color_temperature.mirek': {stateName: 'ct', convert: (val) => {return Math.round(1000000/val)}, validTypes: ['Extended color light', 'Color temperature light']},
            'lights.color.xy': {stateName: 'xy', convert: (val) => {return val.x + ',' + val.y}, validTypes: ['Extended color light'], after: (stateId, value) => {updateRGBHue(stateId.substring(0, stateId.lastIndexOf('.')))}},
        
            //groups
            'groups.on.on': {stateName: 'on', validTypes: ['Room', 'LightGroup', 'Zone']},
        
            //sensors
            'sensors.motion.motion': {stateName: 'presence', validTypes: ['ZLLPresence']},
            'sensors.light.light_level':  {stateName: 'lightlevel', convert: (val) => {return Math.round(val)}, validTypes: ['ZLLLightLevel']},
            'sensors.temperature.temperature': {stateName: 'temperature', convert: (val) => {return Number.parseFloat(val.toPrecision(4))}, validTypes: ['ZLLTemperature']},
            'sensors.power_state.battery_level': {stateName: 'battery', convert: (val) => {return Math.round(val)}, validTypes: ['ZLLPresence', 'ZLLLightLevel', 'ZLLTemperature', 'ZLLSwitch']},
            //buttons
            'sensors.button.last_event': {stateName: 'buttonevent', convert: (val) => {return ((UUIDs[this.idv2] && UUIDs[this.idv2].metadata) ? UUIDs[this.idv2].metadata.control_id : 0) * 1000 + (val === 'repeat' ? 1 : 0) + (val === 'short_release' ? 2 : 0) + (val === 'long_release' ? 3 : 0)}, validTypes: ['ZLLSwitch', 'ZGPSwitch']},
        
            //ignore
            'lights.owner.rid':{},
            'lights.owner.rtype':{},
            'sensors.owner.rid':{},
            'sensors.owner.rtype':{},
            'sensors.power_state.battery_state': {},
        };
        
        const UPDATEMAP_HUE_EXTENDED = {
            //lights
            'lights.status.status': {stateName: 'state.reachable', convert: (val) => {return val === 'connected' ? true : false;}, validTypes: ['Extended color light', 'Color temperature light', 'Dimmable light', 'On/Off plug-in unit']},
            'lights.on.on': {stateName: 'action.on', validTypes: ['Extended color light', 'Color temperature light', 'Dimmable light', 'On/Off plug-in unit']},  
            'lights.dimming.brightness': {stateName: 'action.level', convert: (val) => {return Math.ceil(val)}, validTypes: ['Extended color light', 'Color temperature light', 'Dimmable light'], after: (stateId, value) => {updateRGBHueExtended(stateId.substring(0, stateId.lastIndexOf('.')))}},
            'lights.color_temperature.mirek': {stateName: 'action.colorTemperature', convert: (val) => {return Math.round(1000000/val)}, validTypes: ['Extended color light', 'Color temperature light']},
            'lights.color.xy': {stateName: 'action.xy', convert: (val) => {return val.x + ',' + val.y}, validTypes: ['Extended color light'], after: (stateId, value) => {updateRGBHueExtended(stateId.substring(0, stateId.lastIndexOf('.')))}},
          
            //groups
            'groups.on.on': {stateName: 'state.any_on', validTypes: ['Room', 'LightGroup', 'Zone']},
        
            //sensors
            'sensors.motion.motion': {stateName: 'state.presence', convert: (val) => {return val.toString()}, validTypes: ['ZLLPresence']},
            'sensors.light.light_level':  {stateName: 'state.lightlevel', convert: (val) => {return Math.round(val).toString()}, validTypes: ['ZLLLightLevel']},
            'sensors.temperature.temperature': {stateName: 'state.temperature', convert: (val) => {return Number.parseFloat(val.toPrecision(4))}, validTypes: ['ZLLTemperature']},
            'sensors.power_state.battery_level': {stateName: 'config.battery', convert: (val) => {return Math.round(val)}, validTypes: ['ZLLPresence', 'ZLLLightLevel', 'ZLLTemperature', 'ZLLSwitch']},
            //buttons
            'sensors.button.last_event': {stateName: 'state.buttonevent', convert: (val) => {return ((UUIDs[this.idv2] && UUIDs[this.idv2].metadata) ? UUIDs[this.idv2].metadata.control_id : 0) * 1000 + (val === 'short_release' ? 2 : 0) + (val === 'long_release' ? 3 : 0)}, validTypes: ['ZLLSwitch', 'ZGPSwitch']},
        
            //ignore
            'lights.owner.rid':{},
            'lights.owner.rtype':{},
            'sensors.owner.rid':{},
            'sensors.owner.rtype':{},
            'sensors.power_state.battery_state': {},
        };
        
        //select UPDATEMAP for hue or hue-extended
        const UPDATEMAP = INSTANCE.toLowerCase().includes('extended') ? UPDATEMAP_HUE_EXTENDED : UPDATEMAP_HUE;
        const findState = INSTANCE.toLowerCase().includes('extended') ? findStateHueExtended : findStateHue;
        
        //connect to event stream
        const HuePushClient = require('hue-push-client');
        const client = new HuePushClient({ip: IP, user: TOKEN});
        client.addEventListener('open', function () {
            log('connected');
        });
        client.addEventListener('close', function () {
            log('disconnected', 'warn');
        });
        client.addEventListener('error', function (e) {
            log('connection error: ' + e.message, 'warn');
        });
        client.addEventListener('message', function (packet) {
            parsePacket(packet);
        });
        
        //get resouce ids (required to identify buttons)
        let UUIDs = {};
        async function getUUIDs() {
            try {
                UUIDs = await client.uuids();
            } catch (e) {
                log(e, 'warn');
            }
        };
        getUUIDs();
        
        
        // close connection if script is stopped
        onStop(function (callback) {
            client.close();
            callback();
        }, 2000);
        
        function parsePacket (packet) {
            log('RECEIVED PACKET: ' + "\n" + JSON.stringify(packet), 'debug');
            try {
                if (!packet.data) {
                    log('packet has no data: ' + JSON.stringify(packet), 'warn');
                    return;
                }
                for (let message of JSON.parse(packet.data)) {
                    if (message.type !== 'update') {
                        log ('unknown message type: ' + JSON.stringify(message), 'warn');
                        continue;
                    }
                    if (typeof message.data !== 'object') {
                        log ('message contains no data: '  + JSON.stringify(message), 'warn');
                        continue;
                    }
                    for (let update of message.data) {
                        parseUpdate(update);
                    }
                }
            } catch (e) {
                log('could not read packet: ' + JSON.stringify(packet), 'warn');
                log(e.message, 'warn');
                return;
            }
        }
        
        function parseUpdate(update) {
            log('PARSING UPDATE: ' + "\n" + JSON.stringify(update), 'debug');
        
            if (!update.id_v1) return;
            const [resource, idv1] = update.id_v1.split('/').filter(Boolean);
            const idv2 = update.id;
        
            //remove id, id_v1, type
            delete  update.id;
            delete  update.id_v1;
            delete  update.type;
        
            //status to object as other updates are objects
            if (update.status) {
                update.status = {status: update.status};
            }
        
            processUpdate(resource, idv1, idv2, update);
        }
        
        let IdCache = [];
        function processUpdate(resource, resourceId, idv2, data) {
            this.resource = resource;
            this.resourceId = resourceId;
            this.idv2 = idv2;
            this.data = data;
        
            log('PROCESSING UPDATE: ' + 'resource ' + resource + "\n" + JSON.stringify(data), 'debug');
            //check for values to data
            for (let action in data) {
                if (typeof data[action] !== 'object') {continue;}
        
                //check if update invalid and delete _valid entries
                for (let endpoint in data[action]) {
                    if (endpoint.substr(-6) === '_valid') {
                        if (!data[action][endpoint]) {
                            log('skipping invalid value' + resource + '.' + action + '.' + endpoint, 'debug');
                            return;
                        } else {
                            delete data[action][endpoint];
                        }
                    } 
                }
                //find hue adapter states to update and set new values
                for (let endpoint in data[action]) {
                    if (UPDATEMAP[resource + '.' + action + '.' + endpoint]) {    
                        log('found UPDATEMAP for ' + resource + '.' + action + '.' + endpoint, 'debug');
                        let updateValue = data[action][endpoint];
                        //convert value?
                        if (typeof UPDATEMAP[resource + '.' + action + '.' + endpoint].convert === 'function') {
                            let updateValueOld = updateValue;
                            updateValue = UPDATEMAP[resource + '.' + action + '.' + endpoint].convert.call(this, updateValue);
                            log('converted ' + resource + '.' + action + '.' + endpoint + ' from ' + updateValueOld + ' to ' + updateValue, 'debug');
                        }
                        let stateName = UPDATEMAP[resource + '.' + action + '.' + endpoint].stateName;
                        
                        //check if state id is cached
                        if (!IdCache[resource + '.' + resourceId + '.' + stateName]) {
                            findState(resource, resourceId, stateName, action, endpoint, () => {
                                updateHueState(IdCache[resource + '.' + resourceId + '.' + stateName], updateValue, UPDATEMAP[resource + '.' + action + '.' + endpoint].after);
                            });
                        } else {
                            log('found cache entry for ' + resource + '.' + resourceId + '.' + stateName + ': ' + IdCache[resource + '.' + resourceId + '.' + stateName], 'debug');
                            updateHueState(IdCache[resource + '.' + resourceId + '.' + stateName], updateValue, UPDATEMAP[resource + '.' + action + '.' + endpoint].after);
                        }
        
                    } else {
                        log('missing update instructions for ' + resource + '.' + action + '.' + endpoint);
                        log(JSON.stringify(data));
                    }
                }
            }
        }
        
        async function findStateHue(resource, resourceId, stateName, action, endpoint, callback) {
            log('searching for object with id ' + resourceId + ' and stateName ' + stateName, 'debug');
            $(INSTANCE + '.*' + '.' + stateName).each(function (stateId, i) {  //better way to find matching objects?
                getObject(stateId, (err, obj) => {
                    if (!err) {
                        if (obj.native && obj.native.id && obj.native.id == resourceId) {
                            log('found ' + stateId + ', checking parent for matching type...', 'debug');
                            //get parent object and check type
                            let parentId = stateId.substring(0, stateId.lastIndexOf('.'));
                            getObject(parentId, (err2, obj2) => {
                                if (!err2) {
                                    if (obj2.native && obj2.native.type && UPDATEMAP[resource + '.' + action + '.' + endpoint].validTypes.indexOf(obj2.native.type) !== -1 && !IdCache[resource + '.' + resourceId + '.' + stateName]) {
                                        log('found matching type for ' + parentId + ': ' + obj2.native.type, 'debug');
                                        log('save cache entry "' + resource + '.' + resourceId + '.' + stateName + '":' + stateId, 'debug');
                                        IdCache[resource + '.' + resourceId + '.' + stateName] = stateId;
                                        callback();
                                    }
                                } else {
                                    log('could not find obj: ' + stateId, 'warn');
                                }
                            });    
                        }
                    } else {
                        log('could not find obj: ' + stateId, 'warn');
                    }
                });
            });
        }
        
        async function findStateHueExtended(resource, resourceId, stateName, action, endpoint, callback) {
            log('searching for object with id ' + resourceId + ' and stateName ' + stateName, 'debug');
            $(INSTANCE + '.' + resource + '.*' + '.uid').each(async (stateId, i) => {  //better way to find matching objects?
                const deviceId = await getStateAsync(stateId);
                //check if device id matches
                if (deviceId.val !== resourceId) {
                    return;
                }
                const device = stateId.substr(0,stateId.length-4);
                //make sure final object exists
                const stateExists = await existsObjectAsync(device + '.' + stateName);
                if (!stateExists) {
                    return;
                }
                //check if type is valid and save cache entry
                const deviceType = await getStateAsync(device + '.type');
                if (UPDATEMAP[resource + '.' + action + '.' + endpoint].validTypes.indexOf(deviceType.val) !== -1 && !IdCache[resource + '.' + resourceId + '.' + stateName]) {
                    log('found matching type for ' + resourceId + ': ' + deviceType.val, 'debug');
                    log('save cache entry "' + resource + '.' + resourceId + '.' + stateName + '":' + device + '.' + stateName, 'debug');
                    IdCache[resource + '.' + resourceId + '.' + stateName] = device + '.' + stateName;
                    callback();                    
                }
            });
        }
        
        function updateHueState(stateId, value, after) {
            log('set ' + stateId + ' to ' + value + ' (' + typeof value + ')', 'debug');
            setStateDelayed(stateId, value, true, 50, true, () => {
                if (typeof after === 'function') {
                    log ('running  function after change of ' + stateId, 'debug');
                    after(stateId, value);
                }
            });
        } 
        
        
        //helpers
        async function updateRGBHue(stateId) {
            let xyState = await getStateAsync(stateId + '.xy');
            if (!xyState) return;
            let xy = xyState.val.replace('[', '').replace(']', '').split(',');
            let levelState = await getStateAsync(stateId + '.level');
            let level = levelState.val / 100;
            //let onState = await getStateAsync(stateId + '.on');
            //if (onState.val === false) level = 0;
            let rgb = HelperXYBtoRGB(xy[0], xy[1], level);
        
            updateHueState(stateId + '.r', Math.round(rgb.Red * 255));
            updateHueState(stateId + '.g', Math.round(rgb.Green * 255));
            updateHueState(stateId + '.b', Math.round(rgb.Blue * 255));
        }
        
        async function updateRGBHueExtended(stateId) {
            let xyState = await getStateAsync(stateId + '.xy');
            if (!xyState) return;
            let xy = xyState.val.replace('[', '').replace(']', '').split(',');
            let levelState = await getStateAsync(stateId + '.level');
            let level = levelState.val / 100;
            let rgb = HelperXYBtoRGB(xy[0], xy[1], level);
            updateHueState(stateId + '.rgb', Math.round(rgb.Red * 255) + ',' + Math.round(rgb.Green * 255) + ',' + Math.round(rgb.Blue * 255));
        }
        
        function HelperXYBtoRGB (x, y, Brightness) { // Source: https://github.com/PhilipsHue/PhilipsHueSDK-iOS-OSX/blob/master/ApplicationDesignNotes/RGB%20to%20xy%20Color%20conversion.md
            if (Brightness <= 0) {
                return {Red: 0, Green: 0, Blue: 0};
            }
            Brightness = Brightness || 1.0; // Default full brightness
            const z = 1.0 - x - y;
            const Y = Brightness;
            const X = (Y / y) * x;
            const Z = (Y / y) * z;
            // XYZ to RGB [M]-1 for Wide RGB D65, http://www.developers.meethue.com/documentation/color-conversions-rgb-xy
            let Red = X * 1.656492 - Y * 0.354851 - Z * 0.255038;
            let Green = -X * 0.707196 + Y * 1.655397 + Z * 0.036152;
            let Blue = X * 0.051713 - Y * 0.121364 + Z * 1.011530;
            // Limit RGB on [0..1]
            if (Red > Blue && Red > Green && Red > 1.0) { // Red is too big
                Green = Green / Red;
                Blue = Blue / Red;
                Red = 1.0;
            }
            if (Red < 0) {
                Red = 0;
            }
            if (Green > Blue && Green > Red && Green > 1.0) { // Green is too big
                Red = Red / Green;
                Blue = Blue / Green;
                Green = 1.0;
            }
            if (Green < 0) {
                Green = 0;
            }
            if (Blue > Red && Blue > Green && Blue > 1.0) { // Blue is too big
                Red = Red / Blue;
                Green = Green / Blue;
                Blue = 1.0;
            }
            if (Blue < 0) {
                Blue = 0;
            }
            // Apply reverse gamma correction
            if (Red <= 0.0031308) {
                Red = Red * 12.92;
            } else {
                Red = 1.055 * Math.pow(Red, (1.0 / 2.4)) - 0.055;
            }
            if (Green <= 0.0031308) {
                Green = Green * 12.92;
            } else {
                Green = 1.055 * Math.pow(Green, (1.0 / 2.4)) - 0.055;
            }
            if (Blue <= 0.0031308) {
                Blue = Blue * 12.92;
            } else {
                Blue = 1.055 * Math.pow(Blue, (1.0 / 2.4)) - 0.055;
            }
            // Limit RGB on [0..1]
            if (Red > Blue && Red > Green && Red > 1.0) { // Red is too big
                Green = Green / Red;
                Blue = Blue / Red;
                Red = 1.0;
            }
            if (Red < 0) {
                Red = 0;
            }
            if (Green > Blue && Green > Red && Green > 1.0) { // Green is too big
                Red = Red / Green;
                Blue = Blue / Green;
                Green = 1.0;
            }
            if (Green < 0) {
                Green = 0;
            }
            if (Blue > Red && Blue > Green && Blue > 1.0) { // Blue is too big
                Red = Red / Blue;
                Green = Green / Blue;
                Blue = 1.0;
            }
            if (Blue < 0) {
                Blue = 0;
            }
            return {Red: Red, Green: Green, Blue: Blue};
        };
        
        
        N Offline
        N Offline
        Nikless
        schrieb am zuletzt editiert von
        #114

        @pman Kann auch das objekt colormode (ct oder xy) auch per push abgefragt werden? Brauche das um den aktuellen Status einer Lampe zu speichern und dann später wieder aufzurufen. Nur deswegen habe ich aktuell noch polling parallel an. Das führt bei FoH Schaltern aber zu Problemen da beim Polling andere Werte zurückgegeben werden als beim Push Script.
        Polling gibt 20,21, etc... und beim Script ist es 2000, 2001, etc... (nutze die den Hue adapter)

        Also entweder bei FoH Schaltern das gleiche zurückgeben wie beim polling, oder colormode integrieren ;).

        1 Antwort Letzte Antwort
        0
        • A Offline
          A Offline
          Alveran
          schrieb am zuletzt editiert von
          #115

          Hallo,

          bei mir und einem Kumpel hängt sich das Script nach 14 Tage auf. Heißt die Datenpunkte werden nicht mehr gepollt. Die Konfiguration ist bei beiden gleich. Es werden bei uns nur Hue Bewegungsmelder zur Weiterverarbeitung synchronisiert. Wenn ich den ganzen Java Adapter neustarte besteht das Problem weiterhin. Drücke ich in den Scripten einmal auf Stop und Start funktioniert das ganze wieder. Habe das ganze jetzt mehrfach über Wochen geprüft und gegen gecheckt.
          Gibt es eine Möglichkeit nur das Script Zeitgesteuert neu zu starten?

          T 1 Antwort Letzte Antwort
          0
          • A Alveran

            Hallo,

            bei mir und einem Kumpel hängt sich das Script nach 14 Tage auf. Heißt die Datenpunkte werden nicht mehr gepollt. Die Konfiguration ist bei beiden gleich. Es werden bei uns nur Hue Bewegungsmelder zur Weiterverarbeitung synchronisiert. Wenn ich den ganzen Java Adapter neustarte besteht das Problem weiterhin. Drücke ich in den Scripten einmal auf Stop und Start funktioniert das ganze wieder. Habe das ganze jetzt mehrfach über Wochen geprüft und gegen gecheckt.
            Gibt es eine Möglichkeit nur das Script Zeitgesteuert neu zu starten?

            T Offline
            T Offline
            toralt
            schrieb am zuletzt editiert von
            #116

            @alveran bei mir hält das Script seit mittlerweile mehr als 8 Wochen keinen Tag mehr durch, nicht mal einen halben. Ich lasse es via Blockly jede Stunde neu starten. Unter Objekte/javascript/0/scriptEnabled findest Du alle Scripte und kannst den Datenpunkt einfach auf false setzen und dann wieder auf true.
            Wie gesagt, ich mache das via Blockly Script jede Std.
            Warum es auf einmal nicht mehr funktioniert (davor gab es nie ein Problem) schiebe ich in meinem Fall auf die Nutzung des Zigbee-Adapters, obwohl der Kanal, den er nutzt, frei ist. Aber seitdem der läuft habe ich die Probleme (zumindest ist es mir danach erst aufgefallen).

            << ioBroker im Docker auf Synology DS1821+, 10GBit, 32GB RAM>>

            1 Antwort Letzte Antwort
            0
            • D Offline
              D Offline
              darkblu
              schrieb am zuletzt editiert von
              #117

              Ich habe das Skript seit ca. 1.5 Monaten in Betrieb.
              Schon am dritten Tag funktionierte es nicht mehr.
              Dann das Skript neugestartet und seitdem läuft es.
              Sehr komisch das Ganze.

              Raspi 4, 4GB für Influxdb 1.8 und Grafana
              Raspi 5, 8 GB für ioBroker

              arteckA 1 Antwort Letzte Antwort
              0
              • A Offline
                A Offline
                Alveran
                schrieb am zuletzt editiert von
                #118

                Vielleicht läuft eine Cache oder Tmp voll?

                1 Antwort Letzte Antwort
                0
                • D darkblu

                  Ich habe das Skript seit ca. 1.5 Monaten in Betrieb.
                  Schon am dritten Tag funktionierte es nicht mehr.
                  Dann das Skript neugestartet und seitdem läuft es.
                  Sehr komisch das Ganze.

                  arteckA Offline
                  arteckA Offline
                  arteck
                  Developer Most Active
                  schrieb am zuletzt editiert von
                  #119

                  @darkblu na was ist denn da komisch.. es verbindet sich einmal und ein reconnect ist nicht drin.. wenn die verbindung weg ist.. ist die weg..

                  ist halt nur ein script

                  zigbee hab ich, zwave auch, nuc's genauso und HA auch

                  1 Antwort Letzte Antwort
                  0
                  • T Offline
                    T Offline
                    toralt
                    schrieb am zuletzt editiert von
                    #120

                    Nachdem ich nun eine weitere javascript-Instanz installiert habe und die beiden (ich habe zwei Hue Bridges) Push-Scripte in die Instanz 1 verschoben habe, laufen sie seit 24 Std durch?! Also scheinbar ist irgendwas in meiner javascript.0 Instanz was sie regelmäßig nach ein oder zwei Std stoppen lässt.
                    (Docker Image mit MACVLAN, DS1821+, 32GB RAM)

                    << ioBroker im Docker auf Synology DS1821+, 10GBit, 32GB RAM>>

                    1 Antwort Letzte Antwort
                    0
                    • A Offline
                      A Offline
                      andrebu
                      schrieb am zuletzt editiert von
                      #121

                      Hallo, riesen Dank erstmal für das Script. Endlich funktionieren die BWM ohne ewige Wartezeit. Ich hab jetzt aber das Problem das mir bei einigen Lampen der DP "on" als "true" angezeigt werden obwohl sie ausgeschalten sind. Wenn ich sie dann ein und ausschalte stimmt der DP wieder bis er nach einiger Zeit wieder auf "true" springt ohne das die Lampe geschalten wurde. Ich hab die entsprechenden Lampen schon mal gelöscht und wieder neu angelernt sowie die DP gelöscht. Im Javascript Adapter hab ich "setObject" erlaubt und Polling im HUE Adpter deaktiviert. Ich nutze den normalen HUE Adapter


                      Intel NUC
                      Proxmox
                      Raspberry Pi 4
                      Conbee 2 Stick
                      Adapter: deConz Zigbee


                      1 Antwort Letzte Antwort
                      0
                      • Thorsten MissenbergerT Offline
                        Thorsten MissenbergerT Offline
                        Thorsten Missenberger
                        schrieb am zuletzt editiert von
                        #122

                        Hallo,
                        leider bekomme ich das script nicht zum laufen. Hab alles beachtet aber ich bekomme immer folgende Meldung es aktualisiert rein gar nichts.

                        17:35:21.509	warn	javascript.1 (4623) script.js.common.Hue.pushHue: could not read packet: {"type":"message","data":"[{\"creationtime\":\"2022-11-23T16:35:21Z\",\"data\":[{\"id\":\"5b80b735-89f1-4299-86ec-8e8f3a6a398c\",\"id_v1\":\"/lights/19\",\"on\":{\"on\":true},\"owner\":{\"rid\":\"8600a8a9-4da7-44ce-bae4-2a4d32e1b11a\",\"rtype\":\"device\"},\"type\":\"light\"},{\"id\":\"e62b1ce1-483e-40e5-8aba-9152d780f486\",\"id_v1\":\"/groups/0\",\"on\":{\"on\":true},\"owner\":{\"rid\":\"bf44f813-282a-4189-97f1-559398dc690a\",\"rtype\":\"bridge_home\"},\"type\":\"grouped_light\"},{\"dimming\":{\"brightness\":100.0},\"id\":\"e62b1ce1-483e-40e5-8aba-9152d780f486\",\"id_v1\":\"/groups/0\",\"owner\":{\"rid\":\"bf44f813-282a-4189-97f1-559398dc690a\",\"rtype\":\"bridge_home\"},\"type\":\"grouped_light\"},{\"id\":\"a77c0c6e-4e0b-44f6-bb97-87a2f513e84a\",\"id_v1\":\"/groups/9\",\"on\":{\"on\":true},\"owner\":{\"rid\":\"c40c5d3c-a2b4-412a-b138-37ae94d6b5ad\",\"rtype\":\"zone\"},\"type\":\"grouped_light\"},{\"dimming\":{\"brightness\":100.0},\"id\":\"a77c0c6e-4e0b-44f6-bb97-87a2f513e84a\",\"id_v1\":\"/groups/9\",\"owner\":{\"rid\":\"c40c5d3c-a2b4-412a-b138-37ae94d6b5ad\",\"rtype\":\"zone\"},\"type\":\"grouped_light\"},{\"id\":\"c9875030-a2ab-4f16-b649-20fb727d8b44\",\"id_v1\":\"/groups/24\",\"on\":{\"on\":true},\"owner\":{\"rid\":\"b3876cb3-dff7-44b7-b664-ce80a32f6f45\",\"rtype\":\"room\"},\"type\":\"grouped_light\"},{\"dimming\":{\"brightness\":100.0},\"id\":\"c9875030-a2ab-4f16-b649-20fb727d8b44\",\"id_v1\":\"/groups/24\",\"owner\":{\"rid\":\"b3876cb3-dff7-44b7-b664-ce80a32f6f45\",\"rtype\":\"room\"},\"type\":\"grouped_light\"}],\"id\":\"577afbf3-0e1b-4e5a-a7b9-7dbb2f579925\",\"type\":\"update\"}]","lastEventId":"1669221321:0","origin":"https://192.168.2.77"}
                        17:35:21.509	warn	javascript.1 (4623) script.js.common.Hue.pushHue: Cannot set property 'resource' of undefined
                        
                        1 Antwort Letzte Antwort
                        1
                        • A Offline
                          A Offline
                          antimon
                          schrieb am zuletzt editiert von
                          #123

                          Hallo @Pman ,

                          erst mal vielen Dank für dein Skript - es sieht für mich sehr vielversprechend aus, allerdings habe ich in der aktuellsten(?) Version 1.1.3 TypeScript-Fehler, die ich nicht einordnen kann...

                          Der Fehler lautet "ERROR: Expected 3 arguments, but got 2. " und kommt von der Funktion updateHueState() in Zeile 263. Dort werden 3 Parameter erwartet, aber z.B. in den Zeilen 285-287 der Funktion updateRGBHue() werden auch nur 2 Parameter übergeben.

                          In Zeile 194 beispielsweise wird die Funktion korrekt mit 3 Parametern aufgerufen:

                          updateHueState(IdCache[resource + '.' + resourceId + '.' + stateName], updateValue, UPDATEMAP[resource + '.' + action + '.' + endpoint].after);
                          

                          Was macht der 3. Parameter, ist dieser optional? Was ist dessen Aufgabe? Sollen da Funktionsaufrufe kaskadiert werden?

                          Ich habe den Funktionskopf mal wie folgt abgeändert und teste mal damit, möchte aber natürlich nicht, dass dann eine wichtige Funktion davon betroffen ist...

                          function updateHueState(stateId, value, after = null) {
                          
                          A 1 Antwort Letzte Antwort
                          0
                          • A antimon

                            Hallo @Pman ,

                            erst mal vielen Dank für dein Skript - es sieht für mich sehr vielversprechend aus, allerdings habe ich in der aktuellsten(?) Version 1.1.3 TypeScript-Fehler, die ich nicht einordnen kann...

                            Der Fehler lautet "ERROR: Expected 3 arguments, but got 2. " und kommt von der Funktion updateHueState() in Zeile 263. Dort werden 3 Parameter erwartet, aber z.B. in den Zeilen 285-287 der Funktion updateRGBHue() werden auch nur 2 Parameter übergeben.

                            In Zeile 194 beispielsweise wird die Funktion korrekt mit 3 Parametern aufgerufen:

                            updateHueState(IdCache[resource + '.' + resourceId + '.' + stateName], updateValue, UPDATEMAP[resource + '.' + action + '.' + endpoint].after);
                            

                            Was macht der 3. Parameter, ist dieser optional? Was ist dessen Aufgabe? Sollen da Funktionsaufrufe kaskadiert werden?

                            Ich habe den Funktionskopf mal wie folgt abgeändert und teste mal damit, möchte aber natürlich nicht, dass dann eine wichtige Funktion davon betroffen ist...

                            function updateHueState(stateId, value, after = null) {
                            
                            A Offline
                            A Offline
                            antimon
                            schrieb am zuletzt editiert von
                            #124

                            Leider kommt danach die nächste Fehlermeldung:

                            TypeScript compilation failed: 'sensors.button.last_event': { stateName: 'buttonevent', convert: (val) => { return ((UUIDs[this.idv2] && UUIDs[this.idv2].metadata) ? UUIDs[this.idv2].metadata.control_id : 0) * 1000 + (val === 'repeat' ? 1 : 0) + (val === 'short_release' ? 2 : 0) + (val === 'long_release' ? 3 : 0); }, validTypes: ['ZLLSwitch', 'ZGPSwitch'] }, ^ ERROR: Object is possibly 'undefined'. 
                            

                            Ich kenne mich zu wenig mit TypeScript aus, um beurteilen zu können, was ihm da nicht gefällt. Aber eigentlich wird mit dem Code ja nur eine Zahl generiert, die den Tastendrücken entspricht. Wo da was undefiniert sein könnte, ist mir schleierhaft - es wird ja eigentlich immer was zurückgegeben.
                            Aber vielleicht kann hier jemand mit TypeScript-Erfahrung einen Tip geben?

                            cashC 1 Antwort Letzte Antwort
                            0
                            • A antimon

                              Leider kommt danach die nächste Fehlermeldung:

                              TypeScript compilation failed: 'sensors.button.last_event': { stateName: 'buttonevent', convert: (val) => { return ((UUIDs[this.idv2] && UUIDs[this.idv2].metadata) ? UUIDs[this.idv2].metadata.control_id : 0) * 1000 + (val === 'repeat' ? 1 : 0) + (val === 'short_release' ? 2 : 0) + (val === 'long_release' ? 3 : 0); }, validTypes: ['ZLLSwitch', 'ZGPSwitch'] }, ^ ERROR: Object is possibly 'undefined'. 
                              

                              Ich kenne mich zu wenig mit TypeScript aus, um beurteilen zu können, was ihm da nicht gefällt. Aber eigentlich wird mit dem Code ja nur eine Zahl generiert, die den Tastendrücken entspricht. Wo da was undefiniert sein könnte, ist mir schleierhaft - es wird ja eigentlich immer was zurückgegeben.
                              Aber vielleicht kann hier jemand mit TypeScript-Erfahrung einen Tip geben?

                              cashC Offline
                              cashC Offline
                              cash
                              Most Active
                              schrieb am zuletzt editiert von
                              #125

                              @antimon musst Dich auch nicht in TypeScript auskennen. Besser in Javascript und das Script als solches anlegen…

                              A 1 Antwort Letzte Antwort
                              0
                              • cashC cash

                                Lösung gefunden. Es funktioniert schon nur nicht komplett.

                                Ich habe einen Raum hue_Badezimmer im Raum gibt es nur eine Lampe Deckenleuchte Badezimmer. Schalte ich nun in der App den Raum erkennt das Script das Licht und schaltet die Lampe Deckenleuchte Badezimmer den on-Datenpunkt auf true. Nur der on-Datenpunkt vom Raum hue_Badezimmer bleibt auf false.

                                Ist das generell so oder nur ein Problem bei mir?

                                Bei meinen Tests habe ich immer nur auf den Raum geschaut.

                                P Offline
                                P Offline
                                ptr
                                schrieb am zuletzt editiert von
                                #126

                                habe das gleiche Bild. Der Raum schaltet nicht auf z.B. .on = false, nur die Lampen darin selbst. Das Skript funktioniert also nicht mit Räumen? Ist das so gewollt oder mache ich was falsch?

                                Grüße, schönes neues Jahr und @Pman: danke für das super Skript!

                                cashC 1 Antwort Letzte Antwort
                                0
                                • P ptr

                                  habe das gleiche Bild. Der Raum schaltet nicht auf z.B. .on = false, nur die Lampen darin selbst. Das Skript funktioniert also nicht mit Räumen? Ist das so gewollt oder mache ich was falsch?

                                  Grüße, schönes neues Jahr und @Pman: danke für das super Skript!

                                  cashC Offline
                                  cashC Offline
                                  cash
                                  Most Active
                                  schrieb am zuletzt editiert von
                                  #127

                                  @ptr was heißt das gleiche Bild? Gleiches Bild wie wer? Bei mir funktioniert es meistens. Bei einem Raum habe ich das Problem das es nicht zuverlässig ist. Ich vermute das es nicht 100% von der Bridge kommt wenn die Lampe nicht nur in einem Raum ist sondern auch noch in einer Zone.

                                  Ansonsten wird bei mir auch der Raum richtig umgestellt. Kann aber nur für den normalen Hue-Adapter sprechen.

                                  P 1 Antwort Letzte Antwort
                                  0
                                  • cashC cash

                                    @ptr was heißt das gleiche Bild? Gleiches Bild wie wer? Bei mir funktioniert es meistens. Bei einem Raum habe ich das Problem das es nicht zuverlässig ist. Ich vermute das es nicht 100% von der Bridge kommt wenn die Lampe nicht nur in einem Raum ist sondern auch noch in einer Zone.

                                    Ansonsten wird bei mir auch der Raum richtig umgestellt. Kann aber nur für den normalen Hue-Adapter sprechen.

                                    P Offline
                                    P Offline
                                    ptr
                                    schrieb am zuletzt editiert von ptr
                                    #128

                                    @cash das gleiche Bild, dass der Raum nicht aktualisiert wird, sondern nur die Lampen darin. (Hat „Antworten“ nicht verlinkt)

                                    Das mit der Zonensache werde ich bei mir anschauen.
                                    Es geht um den Hue-Adapter.

                                    Gibt es Unterschiede was man verwenden sollte? ZB keine Gruppen, sondern nur Räume und Zonen zB? Gibt es da kompatibleres zB?

                                    cashC 1 Antwort Letzte Antwort
                                    0
                                    • P ptr

                                      @cash das gleiche Bild, dass der Raum nicht aktualisiert wird, sondern nur die Lampen darin. (Hat „Antworten“ nicht verlinkt)

                                      Das mit der Zonensache werde ich bei mir anschauen.
                                      Es geht um den Hue-Adapter.

                                      Gibt es Unterschiede was man verwenden sollte? ZB keine Gruppen, sondern nur Räume und Zonen zB? Gibt es da kompatibleres zB?

                                      cashC Offline
                                      cashC Offline
                                      cash
                                      Most Active
                                      schrieb am zuletzt editiert von
                                      #129

                                      @ptr wie gesagt kann ich bei mir so nicht bestätigen. Was man verwendet hängt davon ab wie man Hue organisiert. Ich nutze viele Zonen und dort dann Szenen. Somit kann ich pro Raum die Lampen einfach über Szenen unterschiedlich steuern.

                                      Hast Du das Problem bei jeden Raum oder nur bei bestimmten?

                                      P 1 Antwort Letzte Antwort
                                      0
                                      • cashC cash

                                        @antimon musst Dich auch nicht in TypeScript auskennen. Besser in Javascript und das Script als solches anlegen…

                                        A Offline
                                        A Offline
                                        antimon
                                        schrieb am zuletzt editiert von
                                        #130

                                        @cash Danke für die Info! In einem der ersten Beiträge hieß es, dass man es als TypeScript anlegen soll - deswegen bin ich davon ausgegangen...
                                        Jetzt geht es!

                                        1 Antwort Letzte Antwort
                                        0
                                        • cashC cash

                                          @ptr wie gesagt kann ich bei mir so nicht bestätigen. Was man verwendet hängt davon ab wie man Hue organisiert. Ich nutze viele Zonen und dort dann Szenen. Somit kann ich pro Raum die Lampen einfach über Szenen unterschiedlich steuern.

                                          Hast Du das Problem bei jeden Raum oder nur bei bestimmten?

                                          P Offline
                                          P Offline
                                          ptr
                                          schrieb am zuletzt editiert von
                                          #131

                                          @cash Habe nun eine gewisses Muster erkannt: Es gibt nur kein Push-Update von States eines Channels mit "LightGroup"-Rolle. Ist das nachvollziehbar?

                                          cashC 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

                                          787

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          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