NEWS


  • Ich habe hier im Forum ein Script gefunden mit dem man Aliasse anlegen kann
    Leider weiss ich nicht mehr wo

    Hier mal das Script

    // Original-Datenpunkt
    const idOrigin = 'sonoff.0.Lichtschalter-Stube.POWER1'; 
    // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
    // Bei Nicht-Verwendung Leerstring '' zuweisen
    const idRead = '';
     
    // Alias-Datenpunkt
    const idAlias = '01_Stube.01_Schalter.Schalter-Esstisch';
     
    var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
     
    // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
    nameAlias = 'Schalter - Esstisch';
    desc = 'per Script erstellt';
    // typeAlias = 'boolean'; // oder 'number'
    // read = "val < 0 ? -val : 0"; // Erkennung "Aus" --> false erfolgt automatisch  
    // write = "val ? String(1) : String(0)";
    // role = 'value';
    // min = 0; // nur Zahlen
    // max = 100; // nur Zahlen
    // unit = '%'; // nur für Zahlen
    // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
    custom = []; // verhindert doppelte Ausführung von history, ...
    // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten !
    // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten !
     
    // Ab hier nichts ändern !!
    function createAlias(idDst, idSrc, idRd) {
       if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn');
       else {
          var obj = {};
          obj.type = 'state';
          obj.common = getObject(idSrc).common;
          obj.common.alias = {};
          if(idRd) {
              obj.common.alias.id = {};
              obj.common.alias.id.read = idRd;
              obj.common.alias.id.write = idSrc;
              obj.common.read = true;
          } else obj.common.alias.id = idSrc;
          if(typeAlias) obj.common.type = typeAlias;
          if(obj.common.read !== false && read) obj.common.alias.read = read;
          if(obj.common.write !== false && write) obj.common.alias.write = write;
          if(nameAlias) obj.common.name = nameAlias;
          if(role) obj.common.role = role;
          if(desc) obj.common.desc = desc;
          if(obj.common.type == 'number') {
             if(min !== undefined) obj.common.min = min;
             if(max !== undefined) obj.common.max = max;
             if(unit) obj.common.unit = unit;
          } else {
             if(obj.common.min !== undefined) delete obj.common.min;
             if(obj.common.max !== undefined) delete obj.common.max;
             if(obj.common.unit) delete obj.common.unit;
          }
          if(states) obj.common.states = states;
          if(custom && obj.common.custom) obj.common.custom = custom;
          obj.native = {};
          setObject(idDst, obj, function() {
             if(idRd) setState(idRd, getState(idRd).val, true);
             else setState(idSrc, getState(idSrc).val, true); 
          });
          if(raum && existsObject('enum.rooms.' + raum)) {
             let obj = getObject('enum.rooms.' + raum)
             obj.common.members.push(idDst);
             setObject('enum.rooms.' + raum, obj);
          }
          if(gewerk && existsObject('enum.functions.' + gewerk)) {
             let obj = getObject('enum.functions.' + gewerk)
             obj.common.members.push(idDst);
             setObject('enum.functions.' + gewerk, obj);
          }
       } 
    }
     
    createAlias('alias.0.' + idAlias, idOrigin, idRead);
    

    Das funktioniert so perfekt
    Ich kann mit den Alias z.B, Dein AV-Receiver lauter machen
    Aber nur wenn ich direkt drauf drucke also im Browser direkt auf den Button

    Wenn ich den Button jetzt aber per Blockly anspreche funktioniert leider nichts
    Das betrifft aber nur Alias mit der Rolle "button" andere mit z.B. Rolle "switch" funktionieren.

    Hatte das schon jemand und hat dafür eine Lösung für mich?

    PS:
    Wenn ich im Blocky den Alias gegen den Originalen DP austausche funktioniert es

  • Forum Testing Most Active


  • @wszene sagte: Wenn ich den Button jetzt aber per Blockly anspreche funktioniert leider nichts

    Zeige bitte das Blockly und die RAW-Ansicht der Eigenschaften des Alias-DP (in Code tags).


  • @paul53
    Hier die RAW Ansicht

    {
      "type": "state",
      "common": {
        "name": "AV-Receiver - Leiser",
        "role": "button",
        "type": "number",
        "write": true,
        "read": true,
        "min": 0,
        "alias": {
          "id": "harmony.0.Fernbedienung.Bose-AV-Receiver.VolumeDown"
        },
        "desc": "per Script erstellt"
      },
      "native": {},
      "from": "system.adapter.javascript.0",
      "user": "system.user.admin",
      "ts": 1611037285630,
      "_id": "alias.0.01_Stube.04_Fernbedienung.AV_Receiver-Leiser",
      "acl": {
        "object": 1636,
        "state": 1636,
        "owner": "system.user.admin",
        "ownerGroup": "system.group.administrator"
      }
    }
    

    und Hier das Blockly wie es funktioniert
    Bildschirmfoto 2021-01-20 um 19.39.28.png
    und hier wie ich es gern hätte (nur im erst falls Block geändert)
    Bildschirmfoto 2021-01-20 um 19.42.42.png


  • @wszene
    Fehler 1:

        "type": "number",
    

    Fehler 2: "wiederhole 8 mal" sendet 8 mal im ms-Abstand
    Fehler 3: Button schaltet man nicht mit "umschalten", sondern mit "steuere" mit "wahr"


  • @paul53
    Das Script übernimmt doch aber die Daten vom Original DP oder täusche ich mich da und mit dem funktioniert es

    Das mit der Wiederholung ist weil einmal zu wenig ist
    Wie würdest du das denn machen wenn der der Button 8x gedrückt werden soll?

    Das mit steuere habe ich auch erst gehabt aber das hat leider nicht funktioniert


  • @wszene sagte: Das mit steuere habe ich auch erst gehabt aber das hat leider nicht funktioniert

    Dann ist es kein Button, also ist die Rolle falsch.


  • @paul53

    Der Orginal DP ist vom Harmony Adapter da ist es auch ein button

    EDIT:
    Ich habe es jetzt nochmal mit steuere probiert
    Mit dem Originalen DP geht es aber wieder nicht mit dem Alias

    Hier mal das was das Log dazu sagt

    javascript.0	2021-01-20 20:22:30.122	warn	(1070) at processTimers (internal/timers.js:497:7)
    javascript.0	2021-01-20 20:22:30.122	warn	(1070) at listOnTimeout (internal/timers.js:556:17)
    javascript.0	2021-01-20 20:22:30.118	warn	(1070) at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1475:29)
    javascript.0	2021-01-20 20:22:30.118	warn	(1070) at Object.setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1417:20)
    javascript.0	2021-01-20 20:22:30.116	warn	(1070) You are assigning a boolean to the state "harmony.0.Fernbedienung.Bose-AV-Receiver.VolumeUp" which expects a number. Please fix your code to use a number or change the state type to boolean. T
    

  • @wszene sagte: Ich kann mit den Alias z.B, Dein AV-Receiver lauter machen. Aber nur wenn ich direkt drauf drucke also im Browser direkt auf den Button

    Prüfe mal mit dem Test-Blockly wie sich der Datenpunkt "VolumeDown" verhält, wenn man den Button manuell (Tab Objekte) betätigt.

    Bild_2021-01-20_203053.png

  • Forum Testing Most Active

    @paul53
    ich habe bei mir gerade mal nachgesehen. Im Harmony Adapter sind die Button tatsächlich alle mit type number.
    Ist das eigentlich okay ?


  • @dslraser sagte: Im Harmony Adapter sind die Button tatsächlich alle mit type number.
    Ist das eigentlich okay ?

    Nein

  • Forum Testing Most Active

    @paul53
    nur ein Beispiel...

    Screenshot_20210120-203711_Chrome.jpg


  • @wszene sagte in Alias mit Script erstellen - Button funktionieren nicht:

    Hier mal das was das Log dazu sagt

    Die Warnung ist normal, wenn true auf einen Datenpunkt vom Typ "number" geschrieben wird.

    Ändere mal den Alias common (type, min raus, read und alias.write), damit er nach "boolean" wandelt:

      "common": {
        "name": "AV-Receiver - Leiser",
        "role": "button",
        "type": "boolean",
        "write": true,
        "read": false,
        "alias": {
          "id": "harmony.0.Fernbedienung.Bose-AV-Receiver.VolumeDown",
          "write": "val ? 1 : 0"
        },
        "desc": "per Script erstellt"
      },
    

  • @paul53 sagte in Alias mit Script erstellen - Button funktionieren nicht:

    @wszene sagte: Ich kann mit den Alias z.B, Dein AV-Receiver lauter machen. Aber nur wenn ich direkt drauf drucke also im Browser direkt auf den Button

    Prüfe mal mit dem Test-Blockly wie sich der Datenpunkt "VolumeDown" verhält, wenn man den Button manuell (Tab Objekte) betätigt.

    Bild_2021-01-20_203053.png

    Hier die Ausgabe

    javascript.0	2021-01-20 20:42:53.243	info	(1070) script.js.Zum_Testen.Test-Skript: Leiser: 0 , ack: true
    harmony.0	2021-01-20 20:42:53.225	info	(1055) hub busy, stateChange delayed: harmony.0.Fernbedienung.Bose-AV-Receiver.VolumeUp = true
    

  • @wszene sagte: javascript.0 2021-01-20 20:42:53.243 info (1070) script.js.Zum_Testen.Test-Skript: Leiser: 0 , ack: true

    Da muss vorher noch ein Log mit ack: false kommen.

  • Forum Testing Most Active

    @paul53 sagte in Alias mit Script erstellen - Button funktionieren nicht:

    @dslraser sagte: Im Harmony Adapter sind die Button tatsächlich alle mit type number.
    Ist das eigentlich okay ?

    Nein

    ich habe mal ein issue angelegt

    https://github.com/Pmant/ioBroker.harmony/issues/68

    dslraser created this issue in Pmant/ioBroker.harmony

    open Button mit type number #68


  • @paul53 sagte in Alias mit Script erstellen - Button funktionieren nicht:

    @wszene sagte in Alias mit Script erstellen - Button funktionieren nicht:

    Hier mal das was das Log dazu sagt

    Die Warnung ist normal, wenn true auf einen Datenpunkt vom Typ "number" geschrieben wird.

    Ändere mal den Alias common (type, min raus, read und alias.write), damit er nach "boolean" wandelt:

      "common": {
        "name": "AV-Receiver - Leiser",
        "role": "button",
        "type": "boolean",
        "write": true,
        "read": false,
        "alias": {
          "id": "harmony.0.Fernbedienung.Bose-AV-Receiver.VolumeDown",
          "write": "val ? 1 : 0"
        },
        "desc": "per Script erstellt"
      },
    

    Mit der Änderung klappt es
    Gibt es eine Mäglichkeit diese auch direkt mit dem Script zu machen also beim erstellen des Alias?


  • @wszene sagte: Gibt es eine Mäglichkeit diese auch direkt mit dem Script zu machen also beim erstellen des Alias?

    Ja, außer common.read = false. Hier der Anfang:

    // Original-Datenpunkt
    const idOrigin = 'sonoff.0.Lichtschalter-Stube.POWER1'; 
    // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
    // Bei Nicht-Verwendung Leerstring '' zuweisen
    const idRead = '';
     
    // Alias-Datenpunkt
    const idAlias = '01_Stube.01_Schalter.Schalter-Esstisch';
     
    var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
     
    // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
    nameAlias = 'Schalter - Esstisch';
    desc = 'per Script erstellt';
    typeAlias = 'boolean'; // oder 'number'
    // read = "val < 0 ? -val : 0"; // Erkennung "Aus" --> false erfolgt automatisch  
    write = "val ? 1 : 0";
    

  • @paul53 sagte in Alias mit Script erstellen - Button funktionieren nicht:

    common.read = false

    Was macht dieses Kommando nur für mein Verständniss


  • @wszene sagte: nur für mein Verständniss

    Das bedeutet "write only", hat aber keine Auswirkung auf die Button-Funktionalität.

Suggested Topics

814
Online

38.4k
Users

43.9k
Topics

613.2k
Posts