Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. IoBroker mit Warema WMS Web Control

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    IoBroker mit Warema WMS Web Control

    This topic has been deleted. Only users with topic management privileges can see it.
    • R
      radiorichter last edited by

      so ich nochmal:

      Gibt es denn auch die Möglichkeit aus dem Quelltext vom Webcontrol was zu basteln?

      hier mal der ein Bild von der Website bzw vom Code:

      3364_2.jpg

      
        <title>Warema - Bedienen</title>
      
              ![](Images/warema_flag_rot 220x40.png)
      
      *   [Bedienung](index.html)
      
      *   |
      
      *   [Einstellungen](einstellungen.html)
      
      *   |
      
      *   [Konfiguration](konfigurieren.html)
      
      *   |
      
      *   [System](system.html)
      
                
                
                
      
            
            
                    
             
      
            Automatiken
      
            
      
                     |
      
                   |
                     |
      
                     |
      
                   |
                     |
      
                     |
      
                   |
                     |
      
                     |
      
                   |
                     |
      
                     |
      
                   |
                     |
      
            Message
      
            Möchten Sie wirklich die Szene einlernen? Die alte Szene wird überschrieben.
      
      
      1 Reply Last reply Reply Quote 0
      • P
        Pman last edited by

        @radiorichter:

        20:59:30.166 [info] javascript.0 Stop script script.js.common.Skript2_2

        20:59:30.321 [info] javascript.0 Start javascript script.js.common.Skript2_2

        20:59:30.322 [info] javascript.0 script.js.common.Skript2_2: registered 0 subscriptions and 0 schedules

        20:59:30.332 [info] javascript.0 script.js.common.Skript2_2: port opened

        20:59:30.354 [info] javascript.0 script.js.common.Skript2_2: Stick Version: v37605107 `

        Es startet erstmal alles korrekt, dann wird aber kein Gerät gefunden. Das kann jetzt viele Gründe haben:

        • alle angelernte Geräte sind außer Funkreichweite des Sticks. Besonders wenn du den Stick in einem Schrank oder Metallregal versteckst kann das passieren. Der Stick ist leider nicht auf starke Sendeleistung ausgelegt, ggf. kann ein USB-Verlängerungskabel helfen oder diverse 2.4 GHz Antennen-Mods.

        • Key, PANID oder CHANNEL sind falsch

        • Es befinden sich keine weiteren Geräte (wie z.B. Raffstore) im selben System, in das du den Stick eingelernt hast (das nehme ich mal nicht an)

        Versuche am besten die Fehlerquellen in der oben beschriebenen Reihenfolge auszuschließen und schalte den Javascript-Adapter auf debug-Ausgabe, damit das Skript mehr Infos ausspuckt.

        Ich hänge unten mal das Skript an, so wie bei mir in Verwendung (mit verfälschtem Key). So in etwa müsste das Skript ausgeben (ohne Debug):
        ` > 0:28:11.073 [info] javascript.1 Start javascript script.js.Devices.WMS

        00:28:11.073 [info] javascript.1 script.js.Devices.WMS: registered 0 subscriptions and 0 schedules

        00:28:11.082 [info] javascript.1 script.js.Devices.WMS: port opened

        00:28:11.110 [info] javascript.1 script.js.Devices.WMS: Stick Version: v37605100

        00:28:16.259 [info] javascript.1 script.js.Devices.WMS: device type 20 found: 699906

        00:28:16.295 [info] javascript.1 script.js.Devices.WMS: device type 20 found: F99906

        00:28:16.296 [info] javascript.1 script.js.Devices.WMS: device type 20 found: 1E9996 `

        var namespace = 'Custom.WMS';
        var SerialPort = require('serialport');
        
        //config
        const PATH = "/dev/ttyUSB0";
        const CHANNEL = 17;
        const PANID = "F228"; //inclusion mode: FFFF
        const KEY = "0E99EB48AB0AEDBB5682857D933D294D"; //inclusion mode: "00112233445566778899AABBCCDDEEFF"
        var positionInterval = 60; //how often current position is requested (seconds)
        var scanInterval = 600;  //how often to scan for devices (seconds)
        //listPorts();  //uncomment to list all available serial ports
        
        /* do not edit below! */
        //globals
        var knownDevices = {}; //stores known devices
        var lastData = ''; //contains last packet
        var writeQueue = []; //stores data to be sent to serial port
        var timers = {};
        
        /* open serial port and setup parser */
        function init() {
            //scan 3 times
            setTimeout(function () {
                wmsScan();
            }, 5000);
            setTimeout(function () {
                wmsScan();
            }, 10000);
            setTimeout(function () {
                wmsScan();
            }, 30000);
            //scan again every scanInterval seconds
            setInterval(function () {
                wmsScan();
            }, scanInterval * 1000);
        }
        
        //connect to serial port
        const port = new SerialPort(PATH, {
            baudRate: 125000,
            parity: 'none',
            dataBits: 8,
            stopBits: 1,
            autoOpen: false,
        });
        //create parser with '}' as delemiter
        const parser = port.pipe(new SerialPort.parsers.Readline({delimiter: '}'}));
        
        // handle serial port errors
        port.on('error', function () {
            log('serial port error!', 'warn');
            closePort();
        });
        
        //parse incomming packets
        parser.on('data', parseData);
        
        //open serial port
        portOpen().then((msg) => {
            log(msg);
            writeAndWaitFor('{G}', 'gWMS USB-Stick', true).then((line) => {
                return writeAndWaitFor('{V}', 'v', true);
            }).then((line) => {
                log('Stick Version: ' + line);
                return writeAndWaitFor(encodeWMS('setKey', {key: KEY}), 'a', true);
            }).then((line) => {
                return writeAndWaitFor(encodeWMS('switchChannel', {
                    channel: CHANNEL,
                    panId: PANID
                }), 'a', true);
            }).then((line) => {
                init();
            }).catch((err) => {
                log(err, 'warn');
                closePort();
            });
        }).catch((err) => {
            log(err, 'warn');
        });
        
        /* serialport helper functions */
        
        //opens port with promise
        function portOpen() {
            return new Promise((resolve, reject) => {
                port.open((err) => {
                    err ? reject(err) : resolve('port opened');
                })
            });
        }
        
        //close port if open
        function closePort() {
            return new Promise((resolve, reject) => {
                log('closing open serial ports', 'warn');
                if (port && port.isOpen) {
                    // close connection
                    port.close(() => {
                        resolve('port closed')
                    });
                } else {
                    reject('no port was opened');
                }
            });
        }
        
        //on script stop close port
        onStop(closePort, 2000);
        
        //handle incomming data
        function parseData(data) {
            //trim data
            data = wmsTrim(data);
            //do nothing, if packet is received twice
            if (lastData === data) return
            lastData = data;
            log('received message: ' + data, 'debug');
            //decode data into object
            var obj = decodeWMS(data);
            log(JSON.stringify(obj), 'debug');
            //process object
            processWMS(obj);
        }
        
        //list available serial ports
        function listPorts() {
            SerialPort.list().then((ports) => {
                log('Serial Ports: ' + JSON.stringify(ports));
            }).catch((err) => {
                log('error listing ports: ' + JSON.stringify(err));
            });
        }
        
        //write to serial port and wait for answer
        function writeAndWaitFor(data, expect, rejectOnTimeout, timeout) {
            return new Promise((resolve, reject) => {
                if (isNaN(timeout)) timeout = 5000;
                log('sending ' + data, 'debug');
                listener = (line) => {
                    if (wmsTrim(line).substr(0, expect.length) === expect) {
                        log('received expected answer: ' + expect, 'debug');
                        parser.removeListener('data', listener);
                        resolve(wmsTrim(line));
                    } else {
                        log('received unexpected answer (still waiting): ' + wmsTrim(line).substr(0, expect.length) + '!=' + expect, 'debug');
                    }
                };
                parser.on('data', listener);
                enqueue(data);
                //remove listener after 5 seconds
                setTimeout(() => {
                    parser.removeListener('data', listener);
                    rejectOnTimeout ? reject(expect) : resolve(false);
                }, timeout);
            });
        }
        
        function enqueue(data) {
            if (typeof data === 'string') writeQueue.push(data);
            if (writeQueue.length === 1) {
                port.write(writeQueue.shift());
                port.drain((err) => {
                    if (writeQueue.length) enqueue();
                });
            }
        }
        
        /* WMS helper functions */
        
        //trim wms string
        function wmsTrim(data) {
            return data.trim().substr(1);
        }
        
        //decode wms strings into an object
        function decodeWMS(packet) {
            var obj = {};
            switch (packet.substr(0, 1)) {
                case 'g':
                    obj.type = 'stickType';
                    obj.payload = {name: packet.substr(1)};
                    break;
                case 'v':
                    obj.type = 'stickVersion';
                    obj.payload = {version: packet.substr(1)};
                    break;
                case 'f':
                    obj.type = 'error';
                    break;
                case 'a':
                    obj.type = 'ack';
                    break;
                case 'r':
                    obj.type = 'message';
                    obj.payload = decodeWMSMessage(packet.substr(1));
                    break;
                default:
                    obj.type = 'unknown';
                    obj.payload = packet.substr(1);
            }
            return obj;
        }
        
        //decode wms messages into an object
        function decodeWMSMessage(message) {
            var obj = {};
            obj.src = message.substr(0, 6);
            var type = message.substr(6, 4);
            var payload = message.substr(10);
            switch (type) {
                case '5018':
                    obj.type = 'joinNetworkRequest';
                    obj.messagePayload = {
                        panId: payload.substr(0, 4),
                        networkKey: payload.substr(4, 32).match(/../g).reverse().join(""),
                        unknown: payload.substr(36, 2),
                        channel: parseInt(payload.substr(38, 2), 16)
                    };
                    break;
                case '5060':
                    obj.type = 'switchChannelRequest';
                    obj.messagePayload = {
                        panId: payload.substr(0, 4),
                        deviceType: payload.substr(4, 2),
                        channel: parseInt(payload.substr(6, 2), 16)
                    };
                    break;
                case '50AC':
                    obj.type = 'ack';
                    obj.messagePayload = {
                        unknown: payload.substr(0, 4)
                    };
                    break;
                case '7020':
                    obj.type = 'scanRequest';
                    obj.messagePayload = {
                        panId: payload.substr(0, 4),
                        deviceType: payload.substr(4, 2)
                    };
                    break;
                case '7021':
                    obj.type = 'scanResponse';
                    obj.messagePayload = {
                        panId: payload.substr(0, 4),
                        deviceType: payload.substr(4, 2), //63: wetterstation, 06: webcontrol, 02: stick/software, 20: zwischenstecker
                        unknown: payload.substr(6) //optional
                    };
                    break;
                case '7080':
                    obj.type = 'weatherBroadcast';
                    obj.messagePayload = {
                        unknown_1: payload.substr(0, 2),
                        wind: parseInt(payload.substr(2, 2), 16),
                        lumen: payload.substr(4, 2) === '00' ? parseInt(payload.substr(12, 2), 16) * 2 : parseInt(payload.substr(4, 2), 16) * parseInt(payload.substr(12, 2), 16) * 2,
                        unknown_2: payload.substr(6, 6),
                        unknown_3: payload.substr(14, 2),
                        rain: payload.substr(16, 2) === 'C8',
                        temp: parseInt(payload.substr(18, 2), 16) / 2 - 35,
                        unknown_4: payload.substr(20)
                    };
                    break;
                case '7050':
                    obj.type = 'beckonRequest';
                    break;
                case '7070':
                    obj.type = 'controlRequest';
                    obj.messagePayload = {
                        unknown: payload.substr(0, 2),
                        position: parseInt(payload.substr(2, 2), 16) / 2,
                        angle: parseInt(payload.substr(4, 2), 16) - 127,
                        valance_1: payload.substr(6, 2),
                        valance_2: payload.substr(8, 2)
                    };
                    break;
                case '7071':
                    obj.type = 'controlResponse';
                    obj.messagePayload = payload;
                    break;
                case '8010':
                    obj.type = 'parameterGetRequest';
                    obj.messagePayload = {
                        parameter: payload.substr(0) //01000005: position, 26000046: clock timer settings, 0C000006: auto modes & limits
                    };
                    break;
                case '8011':
                    obj.type = 'parameterGetResponse';
                    obj.messagePayload = {
                        parameter: payload.substr(0, 8)
                    };
                    switch (obj.messagePayload.parameter) {
                        case '01000003': //position
                        case '01000005': //position
                            obj.messagePayload.type = 'position';
                            obj.messagePayload.position = parseInt(payload.substr(8, 2), 16) / 2;
                            obj.messagePayload.angle = parseInt(payload.substr(10, 2), 16) - 127;
                            obj.messagePayload.valance_1 = payload.substr(12, 2);
                            obj.messagePayload.valance_2 = payload.substr(14, 2);
                            break;
                        case '0C000006': //auto modes & limits
                            obj.messagePayload.type = 'autoSettings';
                            obj.messagePayload.wind = parseInt(payload.substr(8, 2), 16);
                            obj.messagePayload.rain = parseInt(payload.substr(10, 2), 16);
                            obj.messagePayload.sun = parseInt(payload.substr(12, 2), 16);
                            obj.messagePayload.dusk = parseInt(payload.substr(14, 2), 16);
                            obj.messagePayload.op = parseInt(payload.substr(16, 2), 16);
                            break;
                        case '26000046':
                            obj.messagePayload.type = 'clock';
                            obj.messagePayload.unknown = payload.substr(8);
                            break;
                        default:
                            obj.messagePayload.type = 'unknown';
                            obj.messagePayload.unknown = payload.substr(8);
                    }
                    break;
                case '8020':
                    obj.type = 'parameterSetRequest';
                    obj.messagePayload = {
                        parameter: payload.substr(0, 8)
                    };
                    switch (obj.messagePayload.parameter) {
                        case '0B080009':
                            obj.messagePayload.type = 'clock';
                            obj.messagePayload.year = parseInt(payload.substr(8, 2), 16);
                            obj.messagePayload.month = parseInt(payload.substr(10, 2), 16);
                            obj.messagePayload.day = parseInt(payload.substr(12, 2), 16);
                            obj.messagePayload.hour = parseInt(payload.substr(14, 2), 16);
                            obj.messagePayload.minute = parseInt(payload.substr(16, 2), 16);
                            obj.messagePayload.second = parseInt(payload.substr(18, 2), 16);
                            obj.messagePayload.day_of_week = parseInt(payload.substr(20, 2), 16);
                            obj.messagePayload.unknown = payload.substr(22);
                            break;
                        default:
                            obj.messagePayload.type = 'unknown';
                            obj.messagePayload.unknown = payload.substr(8);
                    }
                    break;
                default:
                    obj.type = 'unknown';
                    obj.messagePayload = payload;
            }
            return obj;
        }
        
        //create wms strings
        function encodeWMS(type, parameter) {
            if (!parameter) parameter = {};
            switch (type) {
                case 'setKey':
                    if (!parameter.key) return false;
                    return '{K401' + parameter.key + '}';
                    break;
                case 'setScanMode':
                    if (isNaN(parameter.channel) || !parameter.panId) return false;
                    return '{M#' + parameter.channel + parameter.panId.match(/../g).reverse().join("") + '}';
                    break;
                case 'switchChannel':
                    if (isNaN(parameter.channel) || !parameter.panId) return false;
                    return '{M%' + parameter.channel + parameter.panId + '}';
                    break;
                case 'ack':
                    if (!parameter.dst) return false;
                    return '{R21' + parameter.dst + '50AC}';
                    break;
                case 'switchChannelRequest': //channel 17 fixed
                    if (!parameter.panId) return false;
                    return '{R04FFFFFF5060' + parameter.panId + '021100}'; // dst or FFFFFF???
                    break;
                case 'scanRequest':
                    return '{R04FFFFFF7020' + parameter.panId + '02}';
                    break;
                case 'scanResponse':
                    if (!parameter.panId || !parameter.dst) return false;
                    return '{R01' + parameter.dst + '7021' + parameter.panId + '02}'; //fixed to deviceType 02 for now
                    break;
                case 'beckonRequest':
                    if (!parameter.dst) return false;
                    return '{R06' + parameter.dst + '7050}';
                    break;
                case 'controlRequest':
                    if (!parameter.dst || isNaN(parameter.position) || isNaN(parameter.angle)) return false;
                    return '{R04' + parameter.dst + '7070' + '03'
                        + ('0' + (Math.min(Math.max(parameter.position, 0), 100) * 2).toString(16)).substr(-2).toUpperCase()
                        + ('0' + (Math.min(Math.max(parameter.angle, 0), 90) + 127).toString(16)).substr(-2).toUpperCase()
                        + 'FFFF}'; //no idea how valance works
                    break;
                case 'parameterGetRequest':
                    if (!parameter.dst || !parameter.parameter) return false;
                    return '{R06' + parameter.dst + '8010' + parameter.parameter + '}';
                    break;
                case 'parameterGetRequestPosition':
                    if (!parameter.dst) return false;
                    return '{R06' + parameter.dst + '8010' + '01000005}';
                    break;
                case 'parameterGetRequestClock':
                    if (!parameter.dst) return false;
                    return '{R06' + parameter.dst + '8010' + '26000046}';
                    break;
                case 'parameterGetRequestAutoSettings':
                    if (!parameter.dst) return false;
                    return '{R06' + parameter.dst + '8010' + '0C000006}';
                    break;
                case 'parameterSetRequestAutoSettings':
                    if (!parameter.dst || !parameter.parameter
                        || isNaN(parameter.wind) || isNaN(parameter.rain)
                        || isNaN(parameter.sun) || isNaN(parameter.dusk))
                        return false;
                    return '{R06' + parameter.dst + '8020' + '0D000004'
                        + ('0' + Math.min(Math.max(parameter.wind, 0), 9).toString(16)).substr(-2).toUpperCase()
                        + ('0' + Math.min(Math.max(parameter.rain, 0), 9).toString(16)).substr(-2).toUpperCase()
                        + ('0' + Math.min(Math.max(parameter.sun, 0), 9).toString(16)).substr(-2).toUpperCase()
                        + ('0' + Math.min(Math.max(parameter.dusk, 0), 9).toString(16)).substr(-2).toUpperCase()
                        + (parameter.op ? '01' : '00')
                        + '}';
                    break;
                case 'parameterSetRequestAutoAll':
                    if (!parameter.dst) return false;
                    return '{R06' + parameter.dst + '8020' + '0D040001' + (parameter.op ? '01' : '00') + '}';
                    break;
                default: //unkown message type
                    return false;
                    break;
            }
        }
        
        //process packets
        function processWMS(obj) {
            //log(JSON.stringify(obj));
            if (obj.type !== 'message') return;
            switch (obj.payload.type) {
                case 'switchChannelRequest':
                    log('received switchChannelRequest, switching channel to ' + obj.payload.messagePayload.channel, 'debug');
                    writeAndWaitFor(encodeWMS('switchChannel', {
                        channel: obj.payload.messagePayload.channel,
                        panId: PANID
                    }), 'a');
                    break;
                case 'scanRequest':
                    // send scanResponse
                    log('received scanRequest, sending scanResponse', 'debug');
                    writeAndWaitFor(encodeWMS('scanResponse', {dst: obj.payload.src, panId: PANID}), 'a');
                    break;
                case 'joinNetworkRequest':
                    log('received joinNetworkRequest:', 'debug');
                    log('KEY: ' + obj.payload.messagePayload.networkKey);
                    log('CHANNEL: ' + obj.payload.messagePayload.channel);
                    log('PANID: ' + obj.payload.messagePayload.panId);
                    writeAndWaitFor(encodeWMS('ack', {dst: obj.payload.src}), 'a');
                    break;
                case 'scanResponse':
                    log('received scanResponse', 'debug');
                    log('TYPE: ' + obj.payload.messagePayload.deviceType, 'debug');
                    log('SNR:' + obj.payload.src, 'debug');
                    if (obj.payload.messagePayload.deviceType === '20') {
                        createState(this.namespace + '.Raffstore.' + obj.payload.src + '.position', 0, false, {
                            type: 'number',
                            min: 0,
                            max: 100,
                            unit: '%'
                        });
                        createState(this.namespace + '.Raffstore.' + obj.payload.src + '.angle', 0, false, {
                            type: 'number',
                            min: 0,
                            max: 90,
                            unit: '°'
                        }, function () {
                            if (knownDevices[obj.payload.src]) return;
                            knownDevices[obj.payload.src] = true;
                            var src = obj.payload.src;
                            log('device type 20 found: ' + src);
                            var deviceId = 'javascript.' + instance + '.' + this.namespace + '.Raffstore.' + src;
                            on({id: deviceId + '.position', change: 'ne', ack: false}, function (obj) {
                                //send parameter
                                writeAndWaitFor(
                                    encodeWMS('controlRequest', {
                                        dst: src,
                                        position: obj.state.val,
                                        angle: getState(deviceId + '.angle').val
                                    }),
                                    'r' + src + '7071'
                                ).then(() => {
                                    var lastValue = getState(deviceId + '.position').val;
                                    writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                                    var timer = setInterval(function () {
                                        //get parameter periodicaly until no change is detected
                                        log(getState(deviceId + '.position').val + ':' + lastValue, 'debug')
                                        if (getState(deviceId + '.position').val === lastValue)
                                            clearInterval(timer);
                                        lastValue = getState(deviceId + '.position').val;
                                        writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                                    },  3500);
                                    //setState(deviceId + '.position', getState(deviceId + '.position').val, true);
                                });
                            });
                            on({id: deviceId + '.angle', change: 'ne', ack: false}, function (obj) {
                                //send parameter
                                writeAndWaitFor(encodeWMS('controlRequest', {
                                        dst: src,
                                        position: getState(deviceId + '.position').val,
                                        angle: obj.state.val
                                    }),
                                    'r' + src + '7071'
                                ).then(() => {
                                    var lastValue = getState(deviceId + '.angle').val;
                                    writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                                    var timer = setInterval(function () {
                                        //get parameter periodicaly until no change is detected
                                        log(getState(deviceId + '.angle').val + ':' + lastValue, 'debug')
                                        if (getState(deviceId + '.angle').val === lastValue)
                                            clearInterval(timer);
                                        lastValue = getState(deviceId + '.angle').val;
                                        writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                                    },  3500);
                                    //setState(deviceId + '.angle', getState(deviceId + '.angle').val, true);
                                });
                            });
                            setTimeout(function () {
                                //get parameter once
                                writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                            }, 5000 + Math.random() * 5000);
                            setInterval(function () {
                                //get parameter periodicaly
                                writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                            }, positionInterval * 1000 + Math.random() * 5000);
                        });
                    }
                    break;
                case 'parameterGetResponse':
                    log('received parameterGetResponse', 'debug');
                    switch (obj.payload.messagePayload.type) {
                        case 'position':
                            setStateDelayed(this.namespace + '.Raffstore.' + obj.payload.src + '.position', obj.payload.messagePayload.position, true, 100, true);
                            setStateDelayed(this.namespace + '.Raffstore.' + obj.payload.src + '.angle', obj.payload.messagePayload.angle, true, 100, true);
                        default:
                            break;
                    }
                    break;
                case 'weatherBroadcast':
                    log('received weatherBroadcast', 'debug');
                    createState(this.namespace + '.Wetter.' + obj.payload.src + '.temp', 0, false, {
                        type: 'number',
                        unit: '°C',
                        write: false
                    }, function () {
                        setStateDelayed(this.namespace + '.Wetter.' + obj.payload.src + '.temp', obj.payload.messagePayload.temp, true, 100, true);
                    });
                    createState(this.namespace + '.Wetter.' + obj.payload.src + '.wind', 0, false, {
                        type: 'number',
                        min: 0,
                        unit: 'm/s',
                        write: false
                    }, function () {
                        setStateDelayed(this.namespace + '.Wetter.' + obj.payload.src + '.wind', obj.payload.messagePayload.wind, true, 100, true);
                    });
                    createState(this.namespace + '.Wetter.' + obj.payload.src + '.lux', 0, false, {
                        type: 'number',
                        min: 0,
                        unit: 'lux',
                        write: false
                    }, function () {
                        setStateDelayed(this.namespace + '.Wetter.' + obj.payload.src + '.lux', obj.payload.messagePayload.lumen, true, 100, true);
                    });
                    createState(this.namespace + '.Wetter.' + obj.payload.src + '.rain', false, false, {
                        type: 'boolean',
                        write: false
                    }, function () {
                        setStateDelayed(this.namespace + '.Wetter.' + obj.payload.src + '.rain', obj.payload.messagePayload.rain, true, 100, true);
                    });
                    break;
                default:
                    break;
            }
        }
        
        //scan for devices
        function wmsScan() {
            writeAndWaitFor(encodeWMS('scanRequest', {panId: PANID}), 'a');
        }
        
        
        1 Reply Last reply Reply Quote 0
        • R
          radiorichter last edited by

          komme immernoch nicht weiter… 😢

          also reichweite sollte passen, der Stick ist nun 10 cm vorm dem Aktor... PANID, CHANNEL und KEY habe ich nun nochmal eingelernt, kam genau das gleiche raus.

          Das einzige was mich stutzig macht ist, dass ich den Stick nicht wirklich in der Fernbedienung speichern kann.

          Bei mir leuchten sozusagen gar keine der Produkttasten (wie in der Anleitung beschrieben) also ob die Fernbedienung dann irgendwas abspeichert weiß ich nicht...Wenn ich einen Aktor nehme der schon zum normalen Netzwerk gehört, klappt das mit den Produkttasten wunderbar.

          3364_unbenannt.jpg

          1 Reply Last reply Reply Quote 0
          • P
            Pman last edited by

            Schalt mal auf debug und poste nochmal den Start des Adapters.

            1 Reply Last reply Reply Quote 0
            • R
              radiorichter last edited by

              hey pman,

              hier mal alles was bei mir so passiert:

              also wms stick:

              3364_warema_1.jpg

              danach in der FB ein neues gerät suchen:

              3364_warema_22.jpg

              panid, channel und key eintragen und skript neustarten:

              3364_warema_33.jpg

              aber danach passiert dann nichts mehr…

              bekomme auch immer den selben key raus, also glaub ich schon dass ich im richtigen netz bin, sofern die FB ja die anderen Rolläden steuern kann.

              1 Reply Last reply Reply Quote 0
              • P
                Pman last edited by

                Diesen Debug-Knoopf direkt dort kannte ich noch gar nicht, weiß auch nicht was der genau macht. Was ich meinte ist: Im ioBroker Admin und Instanzen den ganzen Javascript-Adapter (bzw. die Instanz) auf Debug-Ausgabe schalten. Dazu musst du oben noch den "Expertenmodus" aktivieren.

                Es sollte dann idealerweise wie unten aussehen, du kannst ja mal vergleichen wo es stoppt oder anders aussieht.
                ` > 17:11:51.320 [info] javascript.1 Stop script script.js.Devices.WMS

                17:11:51.321 [warn] javascript.1 script.js.Devices.WMS: closing open serial ports

                17:11:53.348 [info] javascript.1 Start javascript script.js.Devices.WMS

                17:11:53.348 [info] javascript.1 script.js.Devices.WMS: registered 0 subscriptions and 0 schedules

                17:11:53.368 [info] javascript.1 script.js.Devices.WMS: port opened

                17:11:53.373 [debug] javascript.1 script.js.Devices.WMS: sending {G}

                17:11:53.416 [debug] javascript.1 script.js.Devices.WMS: received message: gWMS USB-Stick

                17:11:53.416 [debug] javascript.1 script.js.Devices.WMS: {"type":"stickType","payload":{"name":"WMS USB-Stick"}}

                17:11:53.416 [debug] javascript.1 script.js.Devices.WMS: received expected answer: gWMS USB-Stick

                17:11:53.417 [debug] javascript.1 script.js.Devices.WMS: sending {V}

                17:11:53.426 [debug] javascript.1 script.js.Devices.WMS: received message: v37605100

                17:11:53.427 [debug] javascript.1 script.js.Devices.WMS: {"type":"stickVersion","payload":{"version":"37605100"}}

                17:11:53.427 [debug] javascript.1 script.js.Devices.WMS: received expected answer: v

                17:11:53.427 [info] javascript.1 script.js.Devices.WMS: Stick Version: v37605100

                17:11:53.427 [debug] javascript.1 script.js.Devices.WMS: sending {K<key>}

                17:11:53.448 [debug] javascript.1 script.js.Devices.WMS: received message: a

                17:11:53.448 [debug] javascript.1 script.js.Devices.WMS: {"type":"ack"}

                17:11:53.448 [debug] javascript.1 script.js.Devices.WMS: received expected answer: a

                17:11:53.449 [debug] javascript.1 script.js.Devices.WMS: sending {M%<channel><panid>}

                17:11:53.462 [debug] javascript.1 script.js.Devices.WMS: received expected answer: a

                17:11:58.464 [debug] javascript.1 script.js.Devices.WMS: sending {R04FFFFFF7020<panid>02}

                17:11:58.474 [debug] javascript.1 script.js.Devices.WMS: received expected answer: a

                17:11:58.566 [debug] javascript.1 script.js.Devices.WMS: received message: r6997057021<panid>208FFF03000000000000000000000201010000000000000000

                17:11:58.566 [debug] javascript.1 script.js.Devices.WMS: {"type":"message","payload":{"src":"699705","type":"scanResponse","messagePayload":{"panId":"<panid>","deviceType":"20","unknown":"8FFF03000000000000000000000201010000000000000000"}}}

                17:11:58.567 [debug] javascript.1 script.js.Devices.WMS: received scanResponse

                17:11:58.567 [debug] javascript.1 script.js.Devices.WMS: TYPE: 20

                17:11:58.567 [debug] javascript.1 script.js.Devices.WMS: SNR:699705</panid></panid></panid></panid></channel></key> `

                1 Reply Last reply Reply Quote -1
                • R
                  radiorichter last edited by

                  puh… im log wird nach wie vor nicht mehr angezeigt... bekomme keine debug ausgabe, ich denke mein skript kommt gar nicht bis zu dem punkt...

                  punkt 6 sozusagen bei dir, soweit komme ich nicht:

                  17:11:53.373 [debug] javascript.1 script.js.Devices.WMS: sending {G}

                  hier der log:

                  3364_111.jpg
                  wenn ich zudem die Hilfe ausgabe aktiviere kommt das hier raus:

                  3364_112.jpg

                  1 Reply Last reply Reply Quote 0
                  • P
                    Pman last edited by

                    Die Stick-Version steht ja in deinem Log und vorher müssten schon einige DEBUG Meldungen kommen!

                    z.B. :
                    > [debug] javascript.1 script.js.Devices.WMS: sending {V}
                    Ich glaube du hast noch immer nicht den Javascript-Adapter auf Debug gestellt.

                    1 Reply Last reply Reply Quote 0
                    • R
                      radiorichter last edited by

                      :roll: okay wieder was gelernt mit der debug ausgabe… habs natürlich falsch gemacht....

                      nun hier das richtige Log. Hab alles verglichen aber keine Unterschiede feststellen können...

                      Heist ja nun das er Geräte findet, aber keine Datenpunkte anlegt... kann das eine Einstellung im Javascript-Adapter sein?

                      ` > javascript.0 2018-10-29 06:42:43.939 debug script.js.common.warema_versuch3: SNR:F33605

                      javascript.0 2018-10-29 06:42:43.939 debug script.js.common.warema_versuch3: TYPE: 21

                      javascript.0 2018-10-29 06:42:43.939 debug script.js.common.warema_versuch3: received scanResponse

                      javascript.0 2018-10-29 06:42:43.939 debug script.js.common.warema_versuch3: {"type":"message","payload":{"src":"F33605","type":"scanResponse","messagePayload":{"panId":"1529","deviceType":"21","unknown":"8FFF03000000000000000000020300010000000000000000'}}}

                      javascript.0 2018-10-29 06:42:43.939 debug script.js.common.warema_versuch3: received message: rF3360570211529218FFF03000000000000000000020300010000000000000000

                      javascript.0 2018-10-29 06:42:43.938 debug script.js.common.warema_versuch3: SNR:463705

                      javascript.0 2018-10-29 06:42:43.938 debug script.js.common.warema_versuch3: TYPE: 21

                      javascript.0 2018-10-29 06:42:43.938 debug script.js.common.warema_versuch3: received scanResponse

                      javascript.0 2018-10-29 06:42:43.938 debug script.js.common.warema_versuch3: {"type":"message","payload":{"src":"463705","type":"scanResponse","messagePayload":{"panId":"1529","deviceType":"21","unknown":"8FFF03000000000000000000020300010000000000000000'}}}

                      javascript.0 2018-10-29 06:42:43.935 debug script.js.common.warema_versuch3: received message: r46370570211529218FFF03000000000000000000020300010000000000000000

                      javascript.0 2018-10-29 06:42:43.806 debug script.js.common.warema_versuch3: received expected answer: a

                      javascript.0 2018-10-29 06:42:43.792 debug script.js.common.warema_versuch3: sending {R04FFFFFF7020152902}

                      javascript.0 2018-10-29 06:42:38.790 debug script.js.common.warema_versuch3: received expected answer: a

                      javascript.0 2018-10-29 06:42:38.767 debug script.js.common.warema_versuch3: sending {M%171529}

                      javascript.0 2018-10-29 06:42:38.767 debug script.js.common.warema_versuch3: received expected answer: a

                      javascript.0 2018-10-29 06:42:38.767 debug script.js.common.warema_versuch3: {"type":"ack"}

                      javascript.0 2018-10-29 06:42:38.766 debug script.js.common.warema_versuch3: received message: a

                      javascript.0 2018-10-29 06:42:38.737 debug script.js.common.warema_versuch3: sending {%%%%%%%%%%449D8FFE6BE301ED27377FE9F0}

                      javascript.0 2018-10-29 06:42:38.736 info script.js.common.warema_versuch3: Stick Version: v37605107

                      javascript.0 2018-10-29 06:42:38.736 debug script.js.common.warema_versuch3: received expected answer: v

                      javascript.0 2018-10-29 06:42:38.736 debug script.js.common.warema_versuch3: {"type":"stickVersion","payload":{"version":"37605107"}}

                      javascript.0 2018-10-29 06:42:38.735 debug script.js.common.warema_versuch3: received message: v37605107

                      javascript.0 2018-10-29 06:42:38.710 debug script.js.common.warema_versuch3: sending {V}

                      javascript.0 2018-10-29 06:42:38.709 debug script.js.common.warema_versuch3: received expected answer: gWMS USB-Stick

                      javascript.0 2018-10-29 06:42:38.709 debug script.js.common.warema_versuch3: {"type":"stickType","payload":{"name":"WMS USB-Stick"}}

                      javascript.0 2018-10-29 06:42:38.708 debug script.js.common.warema_versuch3: received message: gWMS USB-Stick

                      javascript.0 2018-10-29 06:42:38.689 debug script.js.common.warema_versuch3: sending {G}

                      javascript.0 2018-10-29 06:42:38.687 info script.js.common.warema_versuch3: port opened

                      javascript.0 2018-10-29 06:42:38.675 info script.js.common.warema_versuch3: registered 0 subscriptions and 0 schedules

                      javascript.0 2018-10-29 06:42:38.674 info Start javascript script.js.common.warema_versuch3

                      javascript.0 2018-10-29 06:42:34.944 info Stop script script.js.common.warema_versuch3 `

                      1 Reply Last reply Reply Quote 0
                      • P
                        Pman last edited by

                        Super das hilft jetzt weiter. Bei dir Antworten die Zwischenstecker mit Device Type 21, bisher waren die nur unter 20 bekannt, daher kann das Skript nichts mit 21 anfangen.

                        Hoffen wir mal, dass es nur eine neue Version ist, aber gleich zu steuern. Hast du Sonderfunktionen, wie z.B. präzise Winkelsteuerung (habe das Marketing-Wort davon grad nicht parat) ?

                        Ändere mal in Zeile 456:

                        if (obj.payload.messagePayload.deviceType === '20') {
                        

                        in

                        if (obj.payload.messagePayload.deviceType === '21') {
                        
                        1 Reply Last reply Reply Quote 0
                        • R
                          radiorichter last edited by

                          alles klar, mach ich dann gleich wenn ich später wieder zuhause bin, ich werde berichten 😄

                          ich habe diese Aktoren für die Rollos und eben das Webcontrol-Kästchen.

                          Laut Warema Homepage:

                          3364_22.png
                          3364_23.png

                          1 Reply Last reply Reply Quote 0
                          • R
                            radiorichter last edited by

                            nun es läuft es 😄

                            habe aber gestern keine Zeit mehr gehabt damit ein wenig rumzuspielen. ich melde mich dann vermutlich am Wochenende mal wieder 😉

                            Pman, vielen Dank für deine Unterstüzung und Geduld 😉

                            1 Reply Last reply Reply Quote 0
                            • R
                              radiorichter last edited by

                              so, nun konnte ich mal ein wenig rumspielen, bei mir werden zwar 12 Datenpunkte angelegt, aber iwie fahren dann immer alle Rollos… oder auch nur 10 von 12 oder wie auch immer. wirklich schlau werd ich draus noch nicht. jetzt würde ich gerne die Aktoren einzeln mal ansteuern und schauen was da dann passiert.

                              wie kann ich den im script einen einzelen Befehl schicken? Die Seriennummer der aktoren hätte ich ja.

                              ` > Zwischestecker auf Position fahren:

                              "{R06AAAAAA707003PPWWV1V2}"

                              AAAAAA = SNR (Seriennummer) vom abgefragten Zwischenstecker in HEX.

                              7070 = Nachrichten Typ hier Fahrbefehl

                              PP = Position in % * 2 (HEX) muss daher durch 2 geteilt werden

                              WW = Winkel +127 in HEX. 127 entspricht daher 0°.

                              V1 = Position Volant 1. FF entspricht nicht vorhanden.

                              V2 = Position Volant 2. FF entspricht nicht vorhanden. `

                              Was muss ich im Javascript eingeben, dass der Befehl geschickt wird?

                              Danke 😉

                              1 Reply Last reply Reply Quote 0
                              • P
                                Pman last edited by

                                Ändere mal in Zeile 384 "R04" in "R06". Kann sein, dass da ein Fehler im Skript ist. Es war glaube ich noch nicht ganz klar, was genau R04 macht.

                                R 1 Reply Last reply Reply Quote 0
                                • R
                                  radiorichter last edited by

                                  und es läuft 😄 vielen Dank Pman 😄

                                  ich werd mal die wochen noch ein wenig damit rumspielen und dann mal meine Erfahrung berichten 😉

                                  wäre es möglich, dann diesen Befehl für alle Rollos mit in das Script bzw in die abgelegten Objekte mit einzufügen?

                                  1 Reply Last reply Reply Quote 0
                                  • L
                                    LaBamba last edited by

                                    Hallo,

                                    ich möchte gerne das WMS in meinen neuen Haus integrieren und mit dem IO-Broker nutzen.

                                    Für die Raffstores möchte ich die WMS Unterputzaktoren Aktoren mit dem WMS Webkontroll einsetzen. Diese werden in der nächsten Woche bestellen.

                                    Grundsätzlich wurde hier im Forum gezeigt, dass es funktionieren kann mit dem IO-Broker und einer Sprachsteuerung das System zu steuern.

                                    Eine Inbetriebnahme ist laut den Beschreibungen mit einer Fernsteuerung möglich.

                                    Mit der Software WMS Studio pro sollte mittlerweile auch eine Inbetriebnahme möglich sein.

                                    https://www.warema.de/Produkte/Steuerun … ftware.php

                                    Ist der Handsender dann überhaupt notwendig? Bzw. braucht man einen bestimmten Handsender?

                                    Zudem würde mich interessieren ob es möglich ist die Daten der Wetterstation auch auszulesen und im IO-Broker zu nutzen?

                                    Welchen Javascript Adapter habt Ihr im IO-Broker dafür genutzt? Ist dies Javascript to file?

                                    Ich wäre sehr dankbar wenn jemand eine sehr genaue Anleitung erstellen könnte wie ich dies genau installieren muss.

                                    Pman hat hier ja schon einmal angefangen. Besten Dank dafür!

                                    Leider bin ich mit dem Umgang von Scripten unerfahren.

                                    Besten Dank im voraus!

                                    1 Reply Last reply Reply Quote 0
                                    • R
                                      Roger2k last edited by

                                      Hallo,

                                      ich nutze auch WMS für Rollläden und habe dafür den WMS Stick und die WMS Zentrale. Ich habe bisher alles mit dem Warema Studio Pro eingestellt und habe auch meine Projekt-Datei.

                                      Hat jemand rausgefunden wie man die benötigten Daten aus der Datei auslesen kann?

                                      1 Reply Last reply Reply Quote 0
                                      • R
                                        radiorichter last edited by radiorichter

                                        Hallo Beisammen,

                                        @LaBamba du brauchst hierfür den normalen Javascript adapter.

                                        @Roger2k Ob du den Key aus der Software heraus bekommst weiß ich nicht. mit der Fernbedienung geht es auf jeden Fall wie in der Anleitung beschrieben. wie weit bist du denn schon gekommen?

                                        1 Reply Last reply Reply Quote 0
                                        • R
                                          radiorichter last edited by

                                          Hallo Beisammen, jetzt bräcuhte ich nochmal eure Hilfe, nach umzug vom pi auf den rock mag die Rollosteuerung nicht mehr. Hier mal Auszug aus dem LOG file: pfad/key etzc sollte alles passen. nur findet er keine objekte mehr... steh ein wenig auf dem Schlauch 😞

                                          hm-rpc.1	2019-02-17 10:51:20.220	info	xmlrpc <- listDevices ["hm-rpc.1"]
                                          javascript.0	2019-02-17 10:51:15.363	debug	script.js.Warema.warema_script(1): {"type":"ack"}
                                          javascript.0	2019-02-17 10:51:15.362	debug	script.js.Warema.warema_script(1): received message: a
                                          javascript.0	2019-02-17 10:51:15.351	debug	script.js.Warema.warema_script(1): sending {R04FFFFFF7020152902}
                                          javascript.0	2019-02-17 10:51:13.717	debug	script.js.Warema.warema_script(1): {"type":"message","payload":{"src":"E5AD07","type":"parameterSetRequest","messagePayload":{"parameter":"0B080009","type":"clock","year":19,"month":2,"day":17,"hour"
                                          javascript.0	2019-02-17 10:51:13.714	debug	script.js.Warema.warema_script(1): received message: rE5AD0780200B0800091302110A340E060001
                                          javascript.0	2019-02-17 10:51:10.371	debug	script.js.Warema.warema_script(1): received expected answer: a
                                          javascript.0	2019-02-17 10:51:10.351	debug	script.js.Warema.warema_script(1): sending {R04FFFFFF7020152902}
                                          javascript.0	2019-02-17 10:51:05.487	info	script.js.Warema.warema_script(1): Serial Ports: [{"comName":"/dev/ttyS2"},{"manufacturer":"FTDI","serialNumber":"AI04F042","pnpId":"usb-FTDI_FT232R_USB_UART_AI04F042-if00-port0","vendorId":"0403","p
                                          javascript.0	2019-02-17 10:51:05.349	debug	script.js.Warema.warema_script(1): received expected answer: a
                                          javascript.0	2019-02-17 10:51:05.319	debug	script.js.Warema.warema_script(1): sending {M%171529}
                                          javascript.0	2019-02-17 10:51:05.318	debug	script.js.Warema.warema_script(1): received expected answer: a
                                          javascript.0	2019-02-17 10:51:05.317	debug	script.js.Warema.warema_script(1): {"type":"ack"}
                                          javascript.0	2019-02-17 10:51:05.317	debug	script.js.Warema.warema_script(1): received message: a
                                          javascript.0	2019-02-17 10:51:05.295	debug	script.js.Warema.warema_script(1): sending {K401A86E62449D8FFE6BE301ED27377FE9F0}
                                          javascript.0	2019-02-17 10:51:05.292	info	script.js.Warema.warema_script(1): Stick Version: v37605107
                                          javascript.0	2019-02-17 10:51:05.291	debug	script.js.Warema.warema_script(1): received expected answer: v
                                          javascript.0	2019-02-17 10:51:05.290	debug	script.js.Warema.warema_script(1): {"type":"stickVersion","payload":{"version":"37605107"}}
                                          javascript.0	2019-02-17 10:51:05.289	debug	script.js.Warema.warema_script(1): received message: v37605107
                                          javascript.0	2019-02-17 10:51:05.276	debug	script.js.Warema.warema_script(1): sending {V}
                                          javascript.0	2019-02-17 10:51:05.275	debug	script.js.Warema.warema_script(1): received expected answer: gWMS USB-Stick
                                          javascript.0	2019-02-17 10:51:05.271	debug	script.js.Warema.warema_script(1): {"type":"stickType","payload":{"name":"WMS USB-Stick"}}
                                          javascript.0	2019-02-17 10:51:05.269	debug	script.js.Warema.warema_script(1): received message: gWMS USB-Stick
                                          javascript.0	2019-02-17 10:51:05.253	debug	script.js.Warema.warema_script(1): sending {G}
                                          javascript.0	2019-02-17 10:51:05.251	info	script.js.Warema.warema_script(1): port opened
                                          javascript.0	2019-02-17 10:51:05.235	info	script.js.Warema.warema_script(1): registered 0 subscriptions and 0 schedules
                                          javascript.0	2019-02-17 10:51:05.194	info	Start javascript script.js.Warema.warema_script(1)
                                          javascript.0	2019-02-17 10:50:59.498	warn	script.js.Warema.warema_script(1): closing open serial ports
                                          
                                          1 Reply Last reply Reply Quote 0
                                          • R
                                            rendgeor @Pman last edited by

                                            @Pman:

                                            1. Is the binding's code in a central module/github available so that changes/bugfixes can be corrected and to monitor stable versions?
                                            2. Can the binding used only to read data or also to send data to the WMS station. for example simulationg a sensor?
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            994
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

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