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. ioBroker Allgemein
  4. [gelöst]Serielle Schnittstelle auslesen Heizölfüllstand Leveljet

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    5
    1
    44

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.4k

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

[gelöst]Serielle Schnittstelle auslesen Heizölfüllstand Leveljet

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
12 Beiträge 3 Kommentatoren 1.8k Aufrufe
  • Ä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.
  • F Offline
    F Offline
    Fussel
    schrieb am zuletzt editiert von
    #1

    Vielleicht kann mir mal jemand auf die Sprünge helfen. Ich möchte über die serielle Schnittstelle ttyUSB0 die Werte meiner Heizöl-Füllstandsanzeige Leveljet auslesen. Über ein Javascript, was ich mir von hier irgendwo kopiert habe, konnte ich feststellen, dass die Schnittstelle die richtigen Daten liefert (es sind nur 12 Byte, die jede Sekunde ausgegeben werden).

    Das script habe ich wieder gelöscht (war vielleicht ein Fehler), und versuche nun, über modbus das Ganze zu machen. Allerdings weiß ich nun gar nicht, wo ich was eintragen soll (K.A., warum das Bild hier dreimal kommt).
    6003_modbus-allgemein.png
    Meine Vermutung war, im Tab Eingangsregister die gelieferten Werte einzutragen:

    6003_modbus-eingangsregister.png

    Das führt allerdings zu keinem Ergebnis, sondern:
    6003_modbus-log.png

    Die Dokumentation zum modBus ist ja sehr rudimentär, ich hoffe , hier kann mir jemand weiterhelfen.

    Oder wäre es vielleicht doch einfacher, das Ganze per Script zu machen?

    Vor ein paar Wochen habe ich hier ein Script gesehen, wo man einfach ein paar seriell gelieferte Werte auswerten und in Datenpunkte schreiben kann, leider habe ich die Seite nicht gespeichert und jetzt finde ich es natürlich nicht mehr…..

    1 Antwort Letzte Antwort
    0
    • wendy2702W Offline
      wendy2702W Offline
      wendy2702
      schrieb am zuletzt editiert von
      #2

      Nehme im ersten Schritt mal den haken bei "Aliase benutzen" raus.

      Bitte keine Fragen per PN, die gehören ins Forum!

      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

      1 Antwort Letzte Antwort
      0
      • F Offline
        F Offline
        Fussel
        schrieb am zuletzt editiert von
        #3

        Hab ich probiert, immer noch "Wrong CRC for frame" und keine Werte.

        1 Antwort Letzte Antwort
        0
        • wendy2702W Offline
          wendy2702W Offline
          wendy2702
          schrieb am zuletzt editiert von
          #4

          Kannst du erstmal mit nur einem Wert versuchen und dann auch mal unter Eingangsregister?

          Sind die Kommunikationseinstellungen im Adapter wirklich identisch zu deiner Füllstandsanzeige (welche überhaupt?) und stimmt "unsigned 16-bit" ?

          Und du bist sicher das es mit Script über Modbus lief und nicht etwas anderes ausgelesen wurde?

          Welche Adapter Version?

          Serialport installiert?

          Bitte keine Fragen per PN, die gehören ins Forum!

          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

          1 Antwort Letzte Antwort
          0
          • F Offline
            F Offline
            Fussel
            schrieb am zuletzt editiert von
            #5

            Die Kommunikationseinstellungen sind 19200,N,8,1, so wie hier www.projet.de/Software/Leveljet_seriell.pdf beschrieben. Dort steht auch die Bedeutung der 12 Bytes.

            Das script lief nicht über modbus, sondern über javascript, dieses hier:

            ! var SerialPort = require("serialport");
            ! var port = new SerialPort("/dev/ttyUSB0", {
            ! baudRate: 19200,
            ! xon: true,
            ! xoff: true,
            ! //flowControl: false
            ! //parser: SerialPort.parsers.byteDelimiter([2,4])
            ! platformOptions: {vmin: 0, vtime: 10, hupcl: false}
            ! },
            ! function (err) {
            ! if (err) {
            ! return console.log('Error: ', err.message);
            ! }
            ! // Flush input
            ! port.flush();
            ! });
            ! port.on('data', function (data) {
            ! console.log('Data: ' + data.toString('hex'));
            ! });
            ! port.on('open', function() {
            ! console.log('Connected');
            ! });
            ! port.on('error', function(err) {
            ! console.log('Error: ', err.message);
            ! });
            ! // close port if the script stopped (to be able to open it again)
            ! onStop(function (callback) {
            ! if (port && port.isOpen()) {
            ! port.close();
            ! console.log('port closed');
            ! }
            ! callback();
            ! });

            Mit dem Script hatte ich fortlaufend diese Werte auf der Schnittstelle:

            javascript.0 script.js.common.Leveljet: Data: 00105d00300092002200da93

            also genau die 12 Bytes:

            0010 Gerätekennung

            5d00 Distanz 0x005d=93

            3000 Füllhöhe 0x0030=48

            9200 Liter 0x0092=146

            22 Prozent 0x22=34

            00

            da93

            was den Werten auf der Anzeige entspricht.

            modbus brint auch bei nur einem Wert im Eingangsregister nichts.

            Wenn ich wüsste, wie man einzelne Bytes aus dem Datenblock rausnimmt und umrechnet und dann in einen Datenpunkt schreibt, würde ich das Ganze auch mit einem Script machen können (ohne modbus).

            1 Antwort Letzte Antwort
            0
            • wendy2702W Offline
              wendy2702W Offline
              wendy2702
              schrieb am zuletzt editiert von
              #6

              Dann kannst du den Modbus Adapter eh nicht nutzen. Scheinbar kann dein Device kein Modbus Protokoll sondern sendet einfach diesen String.

              Du musst das "zerlegen" ist aber ein anderes Thema und hat mal mit Modbus so gar nichts zu tun.

              Schau mal in einem von den beiden Threads findest du ein Script welches auch einen Datenstring zerlegt, das kannst du als Grundlage nehmen und anpassen.

              viewtopic.php?f=21&t=12203&hilit=M%C3%BChsam

              viewtopic.php?f=21&t=12008&hilit=Waterkotte

              Bitte keine Fragen per PN, die gehören ins Forum!

              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

              1 Antwort Letzte Antwort
              0
              • F Offline
                F Offline
                Fussel
                schrieb am zuletzt editiert von
                #7

                OK, das war dann wohl ein Verständnisfehler von mir, ich hatte gedacht mit modbus kann man generell serielle Schnittstellen auslesen.

                Mit dem folgenden Script funktioniert es auch, die Datenpunkte werden geschrieben.

                ! createState('Leveljet.Daten.Raw');
                ! createState('Leveljet.Daten.Distance');
                ! createState('Leveljet.Daten.Fillheight');
                ! createState('Leveljet.Daten.Volume');
                ! createState('Leveljet.Daten.Percent');
                ! createState('Leveljet.Daten.Status');
                ! // To use the ByteLength parser:
                ! const SerialPort = require('serialport');
                ! const ByteLength = SerialPort.parsers.ByteLength;
                ! const port = new SerialPort("/dev/ttyUSB0", {
                ! baudRate: 19200,
                ! dataBits : 8,
                ! parity : 'none',
                ! stopBits: 1
                ! // flowControl : false
                ! }, function (err) {
                ! if (err) {
                ! return console.log('Error1: ', err.message);
                ! }
                ! const parser = port.pipe(new ByteLength({ length: 12 }));
                ! parser.on('data', function (data) {
                ! console.log('Data received: ' + data.toString('hex'));
                ! //Rohdaten speichern
                ! var daten = data.toString('hex');
                ! setState('Leveljet.Daten.Raw', daten, true);
                ! //Distanz Lesekopf
                ! var distanz = parseInt(daten.substr(6,2) + daten.substr(4,2),16);
                ! setState('Leveljet.Daten.Distance',distanz,true);
                ! //Füllhöhe
                ! var fheight = parseInt(daten.substr(10,2) + daten.substr(8,2),16);
                ! setState('Leveljet.Daten.Fillheight',fheight,true);
                ! //Füllmenge, muss mit 10 multiplziert werden
                ! var fvol =10 * (parseInt(daten.substr(14,2) + daten.substr(12,2),16));
                ! setState('Leveljet.Daten.Volume',fvol,true);
                ! //Prozenzangabe Füllmenge, nur 1 Byte
                ! var pct = parseInt(daten.substr(16,2),16);
                ! setState('Leveljet.Daten.Percent',pct,true);
                ! //Status von 0-3 schreiben, zur optischen Anzeige in VIS
                ! var fstate = 0;
                ! if (pct > 40) {fstate = 3;} else
                ! if (pct > 25) {fstate = 2;} else
                ! if (pct > 10) {fstate = 1;} else
                ! fstate = 0;
                ! setState('Leveljet.Daten.Status',fstate,true);
                ! //Wenn ich hier nicht den Port schliesse, schreibt er jede Sekunde Datenpunkte, unnötig….
                ! port.close();
                ! return;
                ! });
                ! // Flush input
                ! port.flush();
                ! // send Data
                ! // port.close();
                ! });
                ! port.on('open', function() {
                ! console.log('Connected');
                ! });
                ! port.on('error', function(err) {
                ! console.log('Error2: ', err.message);
                ! // port.close();
                ! });
                ! // close port if the script stopped (to be able to open it again)
                ! onStop(function (callback) {
                ! if (port && port.isOpen) {
                ! port.close();
                ! console.log('port closed');
                ! }
                ! });

                Jetzt habe ich nur noch das Problem, dass, wenn ich den Port nach dem Einlesen nicht schließe, jede Sekunde Datenpunkte geschrieben werden, was völlig unnötig ist. Einmal am Tag würde reichen. Ein schedule an den Anfang zu stellen, hat nicht funktioniert, aber wahrscheinlich habe ich nur was falsch gemacht.

                1 Antwort Letzte Antwort
                0
                • wendy2702W Offline
                  wendy2702W Offline
                  wendy2702
                  schrieb am zuletzt editiert von
                  #8

                  Ich starte das Script einmal am Tag und beende es über den dazugehörigen Datenpunkt Script.enabled.

                  Dadurch wird auch der com Port sauber geschlossen.

                  Gesendet von iPhone mit Tapatalk Pro

                  Bitte keine Fragen per PN, die gehören ins Forum!

                  Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                  1 Antwort Letzte Antwort
                  0
                  • F Offline
                    F Offline
                    Fussel
                    schrieb am zuletzt editiert von
                    #9

                    Das wars! Der Tipp mit script.enabled war der goldene Hinweis.

                    Nach dem Einlesen der Daten setze ich im script selber .enabled auf 'false', gestartet wird einmal täglich über einen Blockly Zeitplan.

                    Danke schön!

                    So sieht das ganze derzeit in VIS aus:

                    6003_vis-heiz_l.png

                    1 Antwort Letzte Antwort
                    0
                    • wendy2702W Offline
                      wendy2702W Offline
                      wendy2702
                      schrieb am zuletzt editiert von
                      #10

                      Gerne!

                      Bitte den Betreff vom ersten Post noch um ein````
                      Gelöst

                      
                      Gesendet von iPhone mit Tapatalk Pro

                      Bitte keine Fragen per PN, die gehören ins Forum!

                      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                      1 Antwort Letzte Antwort
                      0
                      • A Offline
                        A Offline
                        acidsubway
                        schrieb am zuletzt editiert von
                        #11

                        Hallo,

                        ich bin Newbie was ioBroker angeht.

                        Ich habe auch einen LevelJet jedoch für die Zisterne.

                        Jetzt wollt ich mal fragen wo ich das Script anlegen muss oder gibt es schon einen Adapter?

                        Ich möchte das er die Werte in eine Log schreibt, alle 4h Stunden damit man ein Diagramm erstellen kann.

                        Hab ihr da Ideen? Könnt ihr mir da helfen?

                        MfG

                        AcidSubway

                        1 Antwort Letzte Antwort
                        0
                        • wendy2702W Offline
                          wendy2702W Offline
                          wendy2702
                          schrieb am zuletzt editiert von
                          #12

                          Hi,

                          hast du den denn Javascript Adapter schon installiert auf dem System welches mit dem LevelJet verbunden ist?

                          Wenn ja musst du unter Javascript ein neues Script anlegen (nicht unter "Global"), einen Namen vergeben, es Speichern und bei bedarf starten.

                          Gruß

                          Bitte keine Fragen per PN, die gehören ins Forum!

                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                          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
                          FAQ Cloud / IOT
                          HowTo: Node.js-Update
                          HowTo: Backup/Restore
                          Downloads
                          BLOG

                          363

                          Online

                          32.5k

                          Benutzer

                          81.7k

                          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