Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. digidax

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    D
    • Profile
    • Following 0
    • Followers 0
    • Topics 5
    • Posts 25
    • Best 1
    • Groups 1

    digidax

    @digidax

    Starter

    1
    Reputation
    55
    Profile views
    25
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    digidax Follow
    Starter

    Best posts made by digidax

    • RE: IOBroker MODBUS zu CMI von Technische Alternative

      Mahlzeit zusammen,

      Ich klinke mich mal mit ein. Daten vom CMI an IOB zu senden funktioniert.

      Wenn ich aber im IOB im Input Register einen Datenpunkt mit einem Wert versehe, liest das CMI einmalig nach einem Neustart der Modbus Instanz den Wert ins CMI. Dann nicht mehr.
      Starte ich die Instanz wieder neu, liest das CMI wieder nur ein mal die Werte.

      Hat dafür Jemand eine Lösung?

      Hab herausgefunden, beim setState Befehl muss der letzte Parameter false sein:

      setState('modbus.0.inputRegisters.4_Test', value, false);
      

      Jetzt kommen sofort Werte im CMI an.

      lg Frank

      posted in ioBroker Allgemein
      D
      digidax

    Latest posts made by digidax

    • RE: Settings einer Modbus instanz klonen

      @glasfaser
      Vielen Dank, das ist Perfekt! Ich hatte die Pfeile als "aufsteigend / absteigende" Sortierung gewähnt. Naja, hätte ja mal auch draufklicken können. Danke.

      Beim lesen der Adressen werden Objekte mit den Werten angelegt.
      Der MQTT Client erweitert jedes Objekt mit einem "Zahnrad":
      c13f95dd-e233-4846-9890-1497e6b16af5-grafik.png

      Wenn man dies aktiviert, kann man sich das MQTT Verhalten anpassen:
      3b05573e-9d0e-4f08-b150-239534ba3258-grafik.png

      natürlich benötigt jede Modbus Adresse dann eine eigene Topic. Im Falle der neuen Instanz würde diese dann statt GAB1 -> GAB2 heißen.
      Diese Zuordnung muss ja irgendwo gespeichert sein.

      lg Frank

      posted in ioBroker Allgemein
      D
      digidax
    • Settings einer Modbus instanz klonen

      Hi zusammen,
      Ich habe vom Modbus adapter eine Instanz laufen, wo 152 Adressen im holding register hinterlegt sind, welche ein Gerät per Modbus TCP abfragen.

      Nun möchte ich eine zweite Instanz laufen lassen mit den gleichen Adressen jedoch ist die IP das ModbusTCP Partners eine Andere. Für jedes Objekt gibt es auch eine MQTT topic, welche über den MQTT client published.

      Kann man die Konfiguration der Instanz kopieren, die Kopie unter der neuen Instanz speichern, die IP Adresse des Partners ändern und auch die Topic, die den Objekten zugeordnet ist ändern? Falls ja, wo finde ich die Konfigurationsdateien?

      Vielen Dank, Frank

      posted in ioBroker Allgemein
      D
      digidax
    • RE: IOBroker MODBUS zu CMI von Technische Alternative

      Mahlzeit zusammen,

      Ich klinke mich mal mit ein. Daten vom CMI an IOB zu senden funktioniert.

      Wenn ich aber im IOB im Input Register einen Datenpunkt mit einem Wert versehe, liest das CMI einmalig nach einem Neustart der Modbus Instanz den Wert ins CMI. Dann nicht mehr.
      Starte ich die Instanz wieder neu, liest das CMI wieder nur ein mal die Werte.

      Hat dafür Jemand eine Lösung?

      Hab herausgefunden, beim setState Befehl muss der letzte Parameter false sein:

      setState('modbus.0.inputRegisters.4_Test', value, false);
      

      Jetzt kommen sofort Werte im CMI an.

      lg Frank

      posted in ioBroker Allgemein
      D
      digidax
    • RE: Modbus TCP: Wert in Holdingregister schreiben

      Ich habe gerade mal einen Test gemacht und schreibe in Adresse 53893 (-40001= 13892 dez = 3644 hex ) des Holding Registers, das funktioniert komischerweise.

      posted in ioBroker Allgemein
      D
      digidax
    • RE: Modbus TCP: Wert in Holdingregister schreiben

      @dreistein

      Das ist ein PV Wechselrichter. Auslesen vom Holding Register klappt wunderbar.

      Das zu schreibende Regsiter hat laut Doku die Adresse 8020 hex. Das entspricht 32800 dez.
      Da ich im Adapter Alias aktiviert haben muss ich 40001 addieren und komme auf 72801 dez.
      Mit den so errechneten Werten funktioniert jedenfalls das Lesen aus dem Holding Register.

      laut Doku ist diese Adresse mit eine Wortlänge von 4 schreibbar. In dieser Adresse wird Datum und Uhrzeit gesetzt. z.B. 2015-1-2 10:11:12 müsste mit 07DF 01 02 0A 0B 0C 00 geschrieben werden.

      Selbst wenn es das falsche Regsiter wäre oder das Gerät es nicht verarbeiten könnte, weil es falsche Werte sind, müsste doch im TCP Dump ein Schreibbefehl geloggt werden. Möglich wäre laut Doku:

      0x03:Read multiple registers
      0x06:Write single register
      0x10:Write multiple registers

      Ich sehe aber nur 0x03 Kommunikation (lesen) während CW aktiviert ist und ich per MQTT die Werte aktualisiere, die Objekte werden grün und im Modbus Log von IO Broker sehe ich, dass angeblich Daten übertragen werden, nur im TCP Dump taucht davon nix auf.
      5124feff-93bb-4195-af4f-5c30e81566b3-grafik.png

      Schön, dass ich Dein Interesse geweckt habe und Danke fürs damit beschäftigen.
      Ja, auch ich habe schon wegen Mobus ein Teil meiner Haarpracht eingebüßt. 😁 😁 😁

      posted in ioBroker Allgemein
      D
      digidax
    • RE: Modbus TCP: Wert in Holdingregister schreiben

      @dreistein ja, auch mit CW gesetzt, trotzdem kein TCP traffic.

      posted in ioBroker Allgemein
      D
      digidax
    • RE: Modbus TCP: Wert in Holdingregister schreiben

      Ich habe mal mit TCP dump mitgeloggt. Im Dump taucht immer nur "Read Holding Regsiter" auf. Kein Write, obwohl ich im IO Broker Log

      States user redis pmessage modbus.1.*/modbus.1.holdingRegisters.72801_RTC:{"val":569154562081819400,"ack":true,"ts":1668494771239,"q":0,"c":"script.js.test_datum","from":"system.adapter.javascript.0","user":"system.user.admin","lc":1668494771239}
      

      stehen habe.

      Wert lesen (Read Holding Register) funktioniert nur das Schreiben nicht.

      Einstellung Register:

      {
        "_id": "modbus.1.holdingRegisters.72801_RTC",
        "type": "state",
        "common": {
          "name": "",
          "role": "value",
          "type": "number",
          "read": false,
          "write": true,
          "def": 0,
          "unit": ""
        },
        "native": {
          "regType": "holdingRegs",
          "address": 32800,
          "deviceId": 1,
          "type": "uint64be",
          "len": 4,
          "offset": 0,
          "factor": "1",
          "poll": false
        },
        "acl": {
          "object": 1636,
          "state": 1636,
          "owner": "system.user.admin",
          "ownerGroup": "system.group.administrator"
        },
        "from": "system.adapter.modbus.1",
        "user": "system.user.admin",
        "ts": 1668494751525
      }
      

      PlatformBetriebssystem:linux
      Architektur:arm
      CPUs:4
      Geschwindigkeit:1200 MHz
      Modell:ARMv7 Processor rev 4 (v7l)
      RAM:926 MB
      System-Betriebszeit:90 T. 14:54:37
      Node.js:v16.15.1
      time:1668495277518
      timeOffset:-60
      Adapter-Anzahl:444
      NPM:8.11.0
      Datenträgergröße:14.1 GB
      Freier Festplattenspeicher:10.3 GB
      Betriebszeit:66 T. 23:56:38
      Aktive Instanzen:7
      Pfad:/opt/iobroker/
      aktiv:true
      _nodeCurrent:16.15.1
      _nodeNewest:16.18.1
      _nodeNewestNext:16.18.1
      _npmCurrent:8.11.0
      _npmNewest:8.11.0
      _npmNewestNext:8.19.2

      Adapter Modbus, Installierte Version: 5.0.5

      posted in ioBroker Allgemein
      D
      digidax
    • Modbus TCP: Wert in Holdingregister schreiben

      Hallo zusammen,

      ich schreibe mit einem script einen dezimalwert in ein Holding register.
      Der Wert erscheint im entsprechenden Datenpunk, wird kurz grün. Im Modbus debug log tauchen keine Fehler auf, nur im Modbus Gerät scheint nichts anzukommen.
      Oder muss ich noch etwas aktivieren, dass wenn ein Wert geschrieben wurde, dieser dann per ModbusTCP an das Gerät übertragen wird?

      Gibt es einen Möglichkeit das Debug der Modbus Instanz (aktuell silly) noch zu erweitern, um zu sehen, welcher HEX Befehl an das Gerät übertragen wurde?

      lg Frank

      posted in ioBroker Allgemein
      D
      digidax
    • RE: [gelöst] Modbus Datentyp HEX?

      @paul53

      OT
      nun hat sich herausgestellt, dass das Gerät eine flasche Uhrzeit hat.
      Über ein Modbus Register kann ich eine Zeit vorgeben. Es hat den gleichen Aufbau wie das Register beim Lesen. Also habe ich mir die aus der aktuellen Zeit einen dezimal Wert errechnet, da ja das Gerät eigentlich die HEX Blöcke erwartet und ich über die DEC 64 Bit Umwandlung gehen muss:

      // Date to Dec
      const now = new Date();
      const x_jahr = ('0000'+now.getFullYear().toString(16).toUpperCase()).slice(-4);
      const x_monat = ('00'+(now.getMonth()+1).toString(16).toUpperCase()).slice(-2);
      const x_tag = ('00'+now.getDate().toString(16).toUpperCase()).slice(-2);
      const x_stunde = ('00'+now.getHours().toString(16).toUpperCase()).slice(-2);
      const x_minute = ('00'+now.getMinutes().toString(16).toUpperCase()).slice(-2);
      const x_sekunde = ('00'+now.getSeconds().toString(16).toUpperCase()).slice(-2);
      
      log('ist jahr: '+ now.getFullYear()+' hex: '+ x_jahr);
      log('ist monat: '+ (now.getMonth()+1)+' hex: '+ x_monat);
      log('ist tag: '+ now.getDate()+' hex: '+ x_tag);
      log('ist stunde: ' + now.getHours()+' hex: '+ x_stunde);
      log('ist minute: '+ now.getMinutes()+' hex: '+ x_minute);
      log('ist sekunde: '+ now.getSeconds()+' hex: '+ x_sekunde);
      
      
      // combine Sting: yyyyMMddHHmmsszz 
      //yyyy:year 
      //MM:month 
      //dd:date 
      //HH:hour(24-hour) 
      //mm: minute 
      //ss: second 
      //zz: reserve bit 
      //2015-1-2 10:11:12 
      //corresponding to 
      //07DF 01 02 0A 0B 0C 00
      
      const TimeIdHex = x_jahr+''+x_monat+''+x_tag+''+x_stunde+''+x_minute+''+x_sekunde+'00';
      log('Set to hex: '+TimeIdHex);
      
      const TimeIdDec = parseInt(TimeIdHex,16);
      log('Set to dec: '+TimeIdDec);
      

      Es funktioniert aber nicht. Das Gerät ignoriert die Vorgabe.
      In Zeile 30 baue ich den Hex String ohne Leereichen zwischen den Datum / Zeit Elementen. Das Ergebnis ist dann: 07E60B0E0E093500
      Vermutlich erwartet das Gerät aber 07E6 0B 0E 0E 09 35 00

      Wenn ich das so miitels parseInt() umwandel, ist das Ergebnis 2022.
      Wie mache ich das richtig?

      lg Frank

      posted in ioBroker Allgemein
      D
      digidax
    • RE: [gelöst] Modbus Datentyp HEX?

      @paul53 said in Modbus Datentyp HEX?:

      @digidax
      Ich hatte nicht beachtet, dass Javascript nur Integerwerte bis 2^53 verarbeiten kann. Was ergibt das im Log?

      const idTime = 'modbus.1.holdingRegisters.56385_DateTime';
       
      on(idTime, function(dp) {
          log(dp.state.val.toString(16));
      });
      

      Sehr interessant, wieder was gelernt. Das Script liefert:
      script.js.text_hex: 7e60b0e0c341500

      EDIT: So erhalte ich die richtigen Werte:

      var zahl = 569154557686322400;
      let hex = zahl.toString(16);
      log(hex);
      let time = parseInt(hex.substring(7, 13), 16);
      let date = parseInt(hex.substring(0, 7), 16);
      log('sek: ' + (time & 0xFF));
      log('min: ' + (time >> 8 & 0xFF));
      log('std: ' + (time >> 16 & 0xFF));
      log('tag: ' + (date & 0xFF));
      log('mon: ' + (date >> 8 & 0xFF));
      log('jahr: ' + (date >> 16 & 0xFFF));
      

      Log:

      20:02:41.984	info	javascript.1 (1892) script.js.common.Neuer_Test: 7e60b0e01301500
      20:02:41.984	info	javascript.1 (1892) script.js.common.Neuer_Test: sek: 21
      20:02:41.984	info	javascript.1 (1892) script.js.common.Neuer_Test: min: 48
      20:02:41.984	info	javascript.1 (1892) script.js.common.Neuer_Test: std: 1
      20:02:41.985	info	javascript.1 (1892) script.js.common.Neuer_Test: tag: 14
      20:02:41.985	info	javascript.1 (1892) script.js.common.Neuer_Test: mon: 11
      20:02:41.985	info	javascript.1 (1892) script.js.common.Neuer_Test: jahr: 2022
      

      Jetzt funktioniert es auch bei mir, vielen Dank für die super schnelle Hilfe und das ich wieder etwas lernen konnte.

      lg Frank

      posted in ioBroker Allgemein
      D
      digidax
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo