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

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

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Entwicklung
  4. Wolf-Adapter Sollwertkorrektur in 0.5er Schritten

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.8k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    893

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

Wolf-Adapter Sollwertkorrektur in 0.5er Schritten

Geplant Angeheftet Gesperrt Verschoben Entwicklung
wolftypescriptfehler
1 Beiträge 1 Kommentatoren 841 Aufrufe 1 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.
  • A Offline
    A Offline
    aemwell
    schrieb am zuletzt editiert von
    #1

    Moin zusammen,

    ich bin noch sehr frisch hier im Forum, also hauptsächlich lesender Teilhaber.. ;) Nehmt es mir also bitte nicht krumm, wenn meine Beiträge nicht das richtige "wording" oder die richtige Formatierung haben..

    Ich habe mir gestern den Wolf-Adapter für meine Heizung installiert und das ISM8i erfolgreich angebunden. Leider ist mir aufgefallen, dass die Sollwertkorrektur (also quasi die Heizleistung) nicht in 0.5er Schritten einstellbar ist. Wenn ich die entsprechende Variable (wolf0.bm1.65) auf 0.5 oder 1.5 eingestellt habe, wird bei der Heizung auf -4 angepasst, oder gar nichts ändert sich..

    Bevor ich hier grundlegende Fragen stelle, wollte ich kurz selber suchen und bin auf die Funktion "encodeDPT9" im Modul Encode (/opt/iobroker/node-modules/iobroker.wolf/js/encoder.js) aufmerksam geworden. Dort wird der übergebene Wert in das für die Schnittstelle notwendige Format (Anleitung Seite 33) übersetzt.

    Encoder.prototype.encodeDPT9 = function(value, exp) {
      const data = [0,0];
      
      if(exp === undefined) {
        exp = 2;
      }
      
      let mant = value * 100 / (1 << exp);
      
      //Fill in sign bit
      if (value < 0) {
        data[0] |= 0x80;
        mant = (~(mant * -1) + 1) & 0x07ff;
      }
      
      //Fill in exp (4bit)
      data[0] |= (exp & 0x0F) << 3;
      
      //Fill in mant
      data[0] |= (mant >> 8) & 0x7;
      data[1] |= mant & 0xFF;
      
      const buffer = new Buffer(2);
      buffer.writeUInt8(data[0], 0);
      buffer.writeUInt8(data[1], 1);
      return buffer;
    };
    

    Das Problem (laut meiner knappen, stümperhaften Analyse) an der Stelle ist, dass der Funktion in keinem Aufruf ein Exponent mitgegeben wird. Wenn der Exponent-Parameter aber 'undefined' ist, wird immer 2 angenommen. Was meiner Meinung nach zu Fehlern führt.

    Ich habe daher ein paar Zeilen Code hinzugefügt und konnte den Wert 0.5 erfolgreich als Sollwertkorrektur übergeben.

    Encoder.prototype.encodeDPT9 = function(value, exp) {
      const data = [0,0];
      
      // Mantisse hat 11 Bit, also -2048 bis 2047
      // exp berechnen wenn darüber oder darunter
      // NEU ===========================================
      if(exp === undefined) {
        exp = 0;
        let mant = (value*100)/2;
        while (mant.toString(2).length > 11) {
          mant = mant/2;
          exp = exp+1;
        }
      }
      // ALT ===========================================
      /*
      if(exp === undefined) {
        exp = 2;
      }
      */
      // ===============================================
      
      let mant = value * 100 / (1 << exp);
      
      //Fill in sign bit
      if (value < 0) {
        data[0] |= 0x80;
        mant = (~(mant * -1) + 1) & 0x07ff;
      }
      
      //Fill in exp (4bit)
      data[0] |= (exp & 0x0F) << 3;
      
      //Fill in mant
      data[0] |= (mant >> 8) & 0x7;
      data[1] |= mant & 0xFF;
      
      const buffer = new Buffer(2);
      buffer.writeUInt8(data[0], 0);
      buffer.writeUInt8(data[1], 1);
      return buffer;
    };
    

    Vielleicht steckt ja einer von euch so tief im Code, dass er mir kurz erklären kann warum der Exponent an der Stelle nicht berechnet werden muss, oder was ich anderes übersehen habe.

    Viele Grüße
    Max

    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

    513

    Online

    32.6k

    Benutzer

    82.1k

    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