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. Skripten / Logik
  4. Brother MFC-7440N - Druckerinformationen auslesen

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.3k

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.6k

Brother MFC-7440N - Druckerinformationen auslesen

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
13 Beiträge 5 Kommentatoren 1.1k Aufrufe 5 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.
  • B Offline
    B Offline
    Burg_Io
    schrieb am zuletzt editiert von
    #1

    Bei unserem betagten Drucker (Brother MFC-7440N), lassen sich leider nicht alle Werte per SNMP auslesen und entsprechend verarbeiten.

    Ich suche eine Lösung von der internen Seite des Druckers:

    http://brn00807707e5d6.local/etc/mnt_info.html?kind=item

    drucker01.jpg

    view-source:http://brn00807707e5d6.local/main/main.html

    drucker_02.jpg

    Druckerseite.txt

    drucker_03.jpg


    Werte:
    25a0 = Schwarzes Quadrat
    25a0 = Weißes Quadrat


    die drei rot maskierten Werte auszulesen und in einen DP zu schreiben.

    Der DP für den Tonerfüllstand wären 10 DP´e (10%-100%), die bei einem schwarzen Kästchen eine "1" erhalten, sonst eine "0" enthalten super.

    Gibt es eine Möglichkeit der Umsetzung?

    sigi234S SBorgS 2 Antworten Letzte Antwort
    0
    • B Burg_Io

      Bei unserem betagten Drucker (Brother MFC-7440N), lassen sich leider nicht alle Werte per SNMP auslesen und entsprechend verarbeiten.

      Ich suche eine Lösung von der internen Seite des Druckers:

      http://brn00807707e5d6.local/etc/mnt_info.html?kind=item

      drucker01.jpg

      view-source:http://brn00807707e5d6.local/main/main.html

      drucker_02.jpg

      Druckerseite.txt

      drucker_03.jpg


      Werte:
      25a0 = Schwarzes Quadrat
      25a0 = Weißes Quadrat


      die drei rot maskierten Werte auszulesen und in einen DP zu schreiben.

      Der DP für den Tonerfüllstand wären 10 DP´e (10%-100%), die bei einem schwarzen Kästchen eine "1" erhalten, sonst eine "0" enthalten super.

      Gibt es eine Möglichkeit der Umsetzung?

      sigi234S Online
      sigi234S Online
      sigi234
      Forum Testing Most Active
      schrieb am zuletzt editiert von
      #2

      @burg_io

      https://forum.iobroker.net/topic/46546/gelöst-probleme-bei-brother-dcp-mit-parser-auslesen/9?_=1637474616392

      Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
      Immer Daten sichern!

      1 Antwort Letzte Antwort
      0
      • B Burg_Io

        Bei unserem betagten Drucker (Brother MFC-7440N), lassen sich leider nicht alle Werte per SNMP auslesen und entsprechend verarbeiten.

        Ich suche eine Lösung von der internen Seite des Druckers:

        http://brn00807707e5d6.local/etc/mnt_info.html?kind=item

        drucker01.jpg

        view-source:http://brn00807707e5d6.local/main/main.html

        drucker_02.jpg

        Druckerseite.txt

        drucker_03.jpg


        Werte:
        25a0 = Schwarzes Quadrat
        25a0 = Weißes Quadrat


        die drei rot maskierten Werte auszulesen und in einen DP zu schreiben.

        Der DP für den Tonerfüllstand wären 10 DP´e (10%-100%), die bei einem schwarzen Kästchen eine "1" erhalten, sonst eine "0" enthalten super.

        Gibt es eine Möglichkeit der Umsetzung?

        SBorgS Offline
        SBorgS Offline
        SBorg
        Forum Testing Most Active
        schrieb am zuletzt editiert von
        #3

        @burg_io sagte in Brother MFC-7440N - Druckerinformationen auslesen:

        25a0 = Weißes Quadrat

        Ist zwar nicht relevant, aber IMHO 25a1 ;)
        Habe mal ein Tonerstand "gefaket":
        Toner1.png

        Ergebnis:
        Toner2.png

        Skript:

        /* Tonerfüllstand für einen Brother MFC-7440N auslesen
        
        https://forum.iobroker.net/topic/50647/brother-mfc-7440n-druckerinformationen-auslesen
        
        25.12.2021 (SBorg) first release - ließt den Tonerfüllstand per Webseite ein
        
        */
         
        const DP = "0_userdata.0.Tonerstand";                            // wo sollen die Datenpunkte erstellt werden
        const URL = "http://10.0.1.132:12300/drucker.html";            // die URL der Druckerstatusseite
        const Zeitplan = "0 */1 * * *";                                  // wann soll die Seite gelesen werden (cron-Syntax)?
         
        
        
        // ab hier muss nix mehr geändert werden
        const axios = require('axios');
        await DPsAnlegen(); 
        Fuellstand();
        schedule(Zeitplan, Fuellstand);
        
        
         
        async function DPsAnlegen() {
          if (!existsState(DP)) {createState(DP, '', { name: "Tonerfüllstand" });}
          for(let i=10; i<=100; i+=10) {
            if (!existsState(DP + ".Füllstand_" + i)) {
                createState(DP + ".Füllstand_" + i, "", {
                    "name": "Tonerfüllstand " + i + "%",
                    "type": "number",
                    "role": "state"
                });
            }
          }
        }
         
        function Fuellstand() {
            try {
                const options = { method: 'get', url: URL };
                axios(options).then(function (response) {
                 
                    if (response.status == 200) { // kein Fehler, Inhalt in body
                        /* benötigter HTML Code
                            Toner** 
                            </DD></TD><TD CLASS="elem">
                            &#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;
                            </TD></TR>
                         */
        
                        // Tonerstand extrahieren
         
                        let fuellstand;
                        let fuellstand_start = "Toner**";
                        let fuellstand_ende = "</TR>"; // dazwischen ist der Text für den Füllstand
         
                        let pos_start = response.data.indexOf(fuellstand_start);
                        let pos_ende = response.data.indexOf(fuellstand_ende);
         
                        if (pos_start != -1 && pos_ende != -1) { // wenn gesuchte Strings überhaupt existieren
                            let fuellstand_bereich = response.data.substring(pos_start + fuellstand_start.length, response.data.length); // von/bis, aber ohne ersten Treffer
                            fuellstand_bereich = fuellstand_bereich.substring(0, fuellstand_bereich.indexOf(fuellstand_ende)); // Suchwort am Ende abschneiden
                            fuellstand = strip_tags(fuellstand_bereich).trim(); // kpl. Füllstand
        
                            // Füllstand nun in Einzelwerte parsen + DPs setzen
                            let fuellstand_arr = fuellstand.split(';');
                            for ( let i=0; i<fuellstand_arr.length-1; i++) {
                                if (fuellstand_arr[i]=="&#x25a0") { 
                                    setState(DP + ".Füllstand_" + (i+1)*10 , 1, true); } 
                                else { 
                                    setState(DP + ".Füllstand_" + (i+1)*10 , 0, true); }
                            }
                            
                        } else log("Konnte keinen Tonerfüllstand einlesen!", "error");
         
                    } else {
                        log("StatusCode = " + response.statusCode);
                    }
                });
            } catch (e) {
                log("Fehler (try) beim lesen der Druckerstatusseite: " + e, "error");
            }
            log("Druckerstatusseite eingelesen...", "info");
        }
         
        function strip_tags(data) {
            var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " ");
            return (rueckgabe);
        }
        
        

        LG SBorg ( SBorg auf GitHub)
        Projekte: Lebensmittelwarnung.de | WLAN-Wetterstation | PimpMyStation

        B 1 Antwort Letzte Antwort
        0
        • SBorgS SBorg

          @burg_io sagte in Brother MFC-7440N - Druckerinformationen auslesen:

          25a0 = Weißes Quadrat

          Ist zwar nicht relevant, aber IMHO 25a1 ;)
          Habe mal ein Tonerstand "gefaket":
          Toner1.png

          Ergebnis:
          Toner2.png

          Skript:

          /* Tonerfüllstand für einen Brother MFC-7440N auslesen
          
          https://forum.iobroker.net/topic/50647/brother-mfc-7440n-druckerinformationen-auslesen
          
          25.12.2021 (SBorg) first release - ließt den Tonerfüllstand per Webseite ein
          
          */
           
          const DP = "0_userdata.0.Tonerstand";                            // wo sollen die Datenpunkte erstellt werden
          const URL = "http://10.0.1.132:12300/drucker.html";            // die URL der Druckerstatusseite
          const Zeitplan = "0 */1 * * *";                                  // wann soll die Seite gelesen werden (cron-Syntax)?
           
          
          
          // ab hier muss nix mehr geändert werden
          const axios = require('axios');
          await DPsAnlegen(); 
          Fuellstand();
          schedule(Zeitplan, Fuellstand);
          
          
           
          async function DPsAnlegen() {
            if (!existsState(DP)) {createState(DP, '', { name: "Tonerfüllstand" });}
            for(let i=10; i<=100; i+=10) {
              if (!existsState(DP + ".Füllstand_" + i)) {
                  createState(DP + ".Füllstand_" + i, "", {
                      "name": "Tonerfüllstand " + i + "%",
                      "type": "number",
                      "role": "state"
                  });
              }
            }
          }
           
          function Fuellstand() {
              try {
                  const options = { method: 'get', url: URL };
                  axios(options).then(function (response) {
                   
                      if (response.status == 200) { // kein Fehler, Inhalt in body
                          /* benötigter HTML Code
                              Toner** 
                              </DD></TD><TD CLASS="elem">
                              &#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;
                              </TD></TR>
                           */
          
                          // Tonerstand extrahieren
           
                          let fuellstand;
                          let fuellstand_start = "Toner**";
                          let fuellstand_ende = "</TR>"; // dazwischen ist der Text für den Füllstand
           
                          let pos_start = response.data.indexOf(fuellstand_start);
                          let pos_ende = response.data.indexOf(fuellstand_ende);
           
                          if (pos_start != -1 && pos_ende != -1) { // wenn gesuchte Strings überhaupt existieren
                              let fuellstand_bereich = response.data.substring(pos_start + fuellstand_start.length, response.data.length); // von/bis, aber ohne ersten Treffer
                              fuellstand_bereich = fuellstand_bereich.substring(0, fuellstand_bereich.indexOf(fuellstand_ende)); // Suchwort am Ende abschneiden
                              fuellstand = strip_tags(fuellstand_bereich).trim(); // kpl. Füllstand
          
                              // Füllstand nun in Einzelwerte parsen + DPs setzen
                              let fuellstand_arr = fuellstand.split(';');
                              for ( let i=0; i<fuellstand_arr.length-1; i++) {
                                  if (fuellstand_arr[i]=="&#x25a0") { 
                                      setState(DP + ".Füllstand_" + (i+1)*10 , 1, true); } 
                                  else { 
                                      setState(DP + ".Füllstand_" + (i+1)*10 , 0, true); }
                              }
                              
                          } else log("Konnte keinen Tonerfüllstand einlesen!", "error");
           
                      } else {
                          log("StatusCode = " + response.statusCode);
                      }
                  });
              } catch (e) {
                  log("Fehler (try) beim lesen der Druckerstatusseite: " + e, "error");
              }
              log("Druckerstatusseite eingelesen...", "info");
          }
           
          function strip_tags(data) {
              var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " ");
              return (rueckgabe);
          }
          
          
          B Offline
          B Offline
          Burg_Io
          schrieb am zuletzt editiert von Burg_Io
          #4

          @sborg
          Vielen Dank für die schnelle Lösung. Daten werden ordentlich angelegt.

          bd3163b1-3b87-4605-b8e9-ddc19e2eab48-image.png

          Supie

          SBorgS 1 Antwort Letzte Antwort
          0
          • B Burg_Io

            @sborg
            Vielen Dank für die schnelle Lösung. Daten werden ordentlich angelegt.

            bd3163b1-3b87-4605-b8e9-ddc19e2eab48-image.png

            Supie

            SBorgS Offline
            SBorgS Offline
            SBorg
            Forum Testing Most Active
            schrieb am zuletzt editiert von
            #5

            @burg_io :)
            Ich habe die zwei anderen Werte für die Trommel überlesen, sind die noch relevant?

            LG SBorg ( SBorg auf GitHub)
            Projekte: Lebensmittelwarnung.de | WLAN-Wetterstation | PimpMyStation

            B 1 Antwort Letzte Antwort
            0
            • SBorgS SBorg

              @burg_io :)
              Ich habe die zwei anderen Werte für die Trommel überlesen, sind die noch relevant?

              B Offline
              B Offline
              Burg_Io
              schrieb am zuletzt editiert von
              #6

              @sborg

              Wäre super wenn diese auch um zusetzten gehen.

              SBorgS 1 Antwort Letzte Antwort
              0
              • B Burg_Io

                @sborg

                Wäre super wenn diese auch um zusetzten gehen.

                SBorgS Offline
                SBorgS Offline
                SBorg
                Forum Testing Most Active
                schrieb am zuletzt editiert von
                #7

                @burg_io Kein größeres Problem, ist zumindest einfacher als die Kästchen ;)
                ...die waren aber auch nicht wirklich schwer :joy:

                LG SBorg ( SBorg auf GitHub)
                Projekte: Lebensmittelwarnung.de | WLAN-Wetterstation | PimpMyStation

                B 1 Antwort Letzte Antwort
                0
                • SBorgS SBorg

                  @burg_io Kein größeres Problem, ist zumindest einfacher als die Kästchen ;)
                  ...die waren aber auch nicht wirklich schwer :joy:

                  B Offline
                  B Offline
                  Burg_Io
                  schrieb am zuletzt editiert von
                  #8

                  @sborg

                  Wenn du das sagt. :blush: Ich staune nur.

                  SBorgS 1 Antwort Letzte Antwort
                  0
                  • B Burg_Io

                    @sborg

                    Wenn du das sagt. :blush: Ich staune nur.

                    SBorgS Offline
                    SBorgS Offline
                    SBorg
                    Forum Testing Most Active
                    schrieb am zuletzt editiert von
                    #9

                    @burg_io Sodele, hab wieder paar Werte zum testen eingepatcht und die Datenpunktstruktur angepasst. So ist es wegen der diversen Werte schlüssiger:
                    Drucker.png

                    /* Tonerfüllstand und Daten zur Trommeleinheit für einen Brother MFC-7440N auslesen
                    
                    https://forum.iobroker.net/topic/50647/brother-mfc-7440n-druckerinformationen-auslesen
                    
                    26.12.2021 V0.0.2 - Daten zur Trommeleinheit (Seitenanzahl und Lebensdauer) hinzugefügt
                    25.12.2021 (SBorg) first release - ließt den Tonerfüllstand per Webseite ein
                    */
                     
                    const DP = "0_userdata.0.Brother_Drucker";                       // wo sollen die Datenpunkte erstellt werden
                    const URL = "https://10.0.1.132:12300/drucker.html";             // die URL der Druckerstatusseite
                    const Zeitplan = "0 */1 * * *";                                  // wann soll die Seite gelesen werden (cron-Syntax)?
                     
                    
                    
                    // ab hier muss nix mehr geändert werden
                    const axios = require('axios');
                    DPsAnlegen(); 
                    setTimeout(function() { Fuellstand(); }, 10000);    // 10 Sekunden nach Start mal initial Werte holen
                    schedule(Zeitplan, Fuellstand);
                    
                     
                    function DPsAnlegen() {
                      if (!existsState(DP)) { createStateAsync(DP, '', { name: "Daten für den Drucker" }); }
                      if (!existsState(DP+".Tonerstand")) { createStateAsync(DP+".Tonerstand", '', { name: "Füllstand des Toners" }, function() { 
                                for(let i=10; i<=100; i+=10) {
                                    if (!existsState(DP + ".Tonerstand.Füllstand_" + i)) {
                                        createStateAsync(DP + ".Tonerstand.Füllstand_" + i, 0, {
                                            "name": "Tonerfüllstand " + i + "%",
                                            "type": "number",
                                            "role": "state"
                                        });
                                    }
                                }
                            });
                      }
                      if (!existsState(DP+".Trommeleinheit")) { createStateAsync(DP+".Trommeleinheit", '', { name: "Daten zur Trommeleinheit" }, function() { 
                                    if (!existsState(DP + ".Trommeleinheit.Lebensdauer_Seiten")) {
                                        createStateAsync(DP + ".Trommeleinheit.Lebensdauer_Seiten", 0, {
                                            "name": "verbleibende Lebensdauer in Seiten",
                                            "type": "number",
                                            "role": "state",
                                            "unit": "Seiten"
                                        });
                                    }
                                    if (!existsState(DP + ".Trommeleinheit.Lebensdauer_Prozent")) {
                                        createStateAsync(DP + ".Trommeleinheit.Lebensdauer_Prozent", 0, {
                                            "name": "verbleibende Lebensdauer in Prozent",
                                            "type": "number",
                                            "role": "state",
                                            "unit": "%"
                                        });
                                    }
                        }
                      );}
                    }
                     
                     
                    function Fuellstand() {
                        try {
                            const options = { method: 'get', url: URL };
                            axios(options).then(function (response) {
                             
                                if (response.status == 200) { // kein Fehler, Inhalt in body
                                    /* benötigter HTML Code
                                        Toner** 
                                        </DD></TD><TD CLASS="elem">
                                        &#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;
                                        </TD></TR>
                                     */
                    
                                    // Tonerstand extrahieren
                                    let fuellstand;
                                    let fuellstand_start = "Toner**";
                                    let fuellstand_ende = "</TR>"; // dazwischen ist der Text für den Füllstand
                     
                                    let pos_start = response.data.indexOf(fuellstand_start);
                                    let pos_ende = response.data.indexOf(fuellstand_ende);
                     
                                    if (pos_start != -1 && pos_ende != -1) { // wenn gesuchte Strings überhaupt existieren
                                        let fuellstand_bereich = response.data.substring(pos_start + fuellstand_start.length, response.data.length); // von/bis, aber ohne ersten Treffer
                                        fuellstand_bereich = fuellstand_bereich.substring(0, fuellstand_bereich.indexOf(fuellstand_ende)); // Suchwort am Ende abschneiden
                                        fuellstand = strip_tags(fuellstand_bereich).trim(); // kpl. Füllstand
                    
                                        // Füllstand nun in Einzelwerte parsen + DPs setzen
                                        let fuellstand_arr = fuellstand.split(';');
                                        for ( let i=0; i<fuellstand_arr.length-1; i++) {
                                            if (fuellstand_arr[i]=="&#x25a0") { 
                                                setState(DP + ".Tonerstand.Füllstand_" + (i+1)*10 , 1, true); } 
                                            else { 
                                                setState(DP + ".Tonerstand.Füllstand_" + (i+1)*10 , 0, true); }
                                        }    
                                    } else log("Konnte keinen Tonerfüllstand einlesen!", "error");
                    
                                    /* benötigter HTML Code
                                        Trommeleinheit* 
                                        </DD></TD><TD CLASS="elem">
                                        0
                                        Seiten
                                        </TD></TR>
                                    */
                                    // Trommeleinheit verbleibende Seitenlebensdauer
                                    let trommel_seiten;
                                    let trommel_seiten_start = "Trommeleinheit*";
                                    let trommel_seiten_ende = "</TR>"; // dazwischen ist der Text für den Füllstand
                     
                                    pos_start = response.data.indexOf(trommel_seiten_start);
                                    pos_ende = response.data.indexOf(trommel_seiten_ende);
                     
                                    if (pos_start != -1 && pos_ende != -1) { // wenn gesuchte Strings überhaupt existieren
                                        let trommel_seiten_bereich = response.data.substring(pos_start + trommel_seiten_start.length, response.data.length); // von/bis, aber ohne ersten Treffer
                                        trommel_seiten_bereich = trommel_seiten_bereich.substring(0, trommel_seiten_bereich.indexOf(trommel_seiten_ende)); // Suchwort am Ende abschneiden
                                        trommel_seiten = parseInt(strip_tags(trommel_seiten_bereich).trim()); // verbleibende Seitenanzahl
                                        
                                        setState(DP + ".Trommeleinheit.Lebensdauer_Seiten", trommel_seiten, true);    
                                    } else log("Konnte keine verbleibende Seiten für Trommeleinheit einlesen!", "error");
                    
                       
                                /* benötigter HTML Code
                                    (Verbleibende Lebensdauer in %)
                                    </DD></TD><TD CLASS="elem">
                                    (0.00%)
                                    </TD></TR>
                                */
                                // Trommeleinheit verbleibende Lebensdauer in Prozent
                                    let trommel_prozent;
                                    let trommel_prozent_start = "(Verbleibende Lebensdauer in %)";
                                    let trommel_prozent_ende = "</TR>"; // dazwischen ist der Text für den Füllstand
                     
                                    pos_start = response.data.indexOf(trommel_prozent_start);
                                    pos_ende = response.data.indexOf(trommel_prozent_ende);
                     
                                    if (pos_start != -1 && pos_ende != -1) { // wenn gesuchte Strings überhaupt existieren
                                        let trommel_prozent_bereich = response.data.substring(pos_start + trommel_prozent_start.length, response.data.length); // von/bis, aber ohne ersten Treffer
                                        trommel_prozent_bereich = trommel_prozent_bereich.substring(0, trommel_prozent_bereich.indexOf(trommel_prozent_ende)); // Suchwort am Ende abschneiden
                                        trommel_prozent = strip_tags(trommel_prozent_bereich).trim(); // verbleibende Prozentzahl (0.0%)
                                        trommel_prozent = parseFloat(trommel_prozent.replace(/[%()]/ig, ''));
                    
                                        setState(DP + ".Trommeleinheit.Lebensdauer_Prozent", trommel_prozent, true);    
                                    } else log("Konnte keinen verbleibenden Prozentwert für Trommeleinheit einlesen!", "error");
                    
                                } else { log("StatusCode = " + response.statusCode); }
                    
                            });
                        } catch (e) {
                            log("Fehler (try) beim lesen der Druckerstatusseite: " + e, "error");
                        }
                        log("Druckerstatusseite eingelesen...", "info");
                    }
                     
                    function strip_tags(data) {
                        var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " ");
                        return (rueckgabe);
                    }
                    
                    
                    

                    LG SBorg ( SBorg auf GitHub)
                    Projekte: Lebensmittelwarnung.de | WLAN-Wetterstation | PimpMyStation

                    B H 2 Antworten Letzte Antwort
                    0
                    • SBorgS SBorg

                      @burg_io Sodele, hab wieder paar Werte zum testen eingepatcht und die Datenpunktstruktur angepasst. So ist es wegen der diversen Werte schlüssiger:
                      Drucker.png

                      /* Tonerfüllstand und Daten zur Trommeleinheit für einen Brother MFC-7440N auslesen
                      
                      https://forum.iobroker.net/topic/50647/brother-mfc-7440n-druckerinformationen-auslesen
                      
                      26.12.2021 V0.0.2 - Daten zur Trommeleinheit (Seitenanzahl und Lebensdauer) hinzugefügt
                      25.12.2021 (SBorg) first release - ließt den Tonerfüllstand per Webseite ein
                      */
                       
                      const DP = "0_userdata.0.Brother_Drucker";                       // wo sollen die Datenpunkte erstellt werden
                      const URL = "https://10.0.1.132:12300/drucker.html";             // die URL der Druckerstatusseite
                      const Zeitplan = "0 */1 * * *";                                  // wann soll die Seite gelesen werden (cron-Syntax)?
                       
                      
                      
                      // ab hier muss nix mehr geändert werden
                      const axios = require('axios');
                      DPsAnlegen(); 
                      setTimeout(function() { Fuellstand(); }, 10000);    // 10 Sekunden nach Start mal initial Werte holen
                      schedule(Zeitplan, Fuellstand);
                      
                       
                      function DPsAnlegen() {
                        if (!existsState(DP)) { createStateAsync(DP, '', { name: "Daten für den Drucker" }); }
                        if (!existsState(DP+".Tonerstand")) { createStateAsync(DP+".Tonerstand", '', { name: "Füllstand des Toners" }, function() { 
                                  for(let i=10; i<=100; i+=10) {
                                      if (!existsState(DP + ".Tonerstand.Füllstand_" + i)) {
                                          createStateAsync(DP + ".Tonerstand.Füllstand_" + i, 0, {
                                              "name": "Tonerfüllstand " + i + "%",
                                              "type": "number",
                                              "role": "state"
                                          });
                                      }
                                  }
                              });
                        }
                        if (!existsState(DP+".Trommeleinheit")) { createStateAsync(DP+".Trommeleinheit", '', { name: "Daten zur Trommeleinheit" }, function() { 
                                      if (!existsState(DP + ".Trommeleinheit.Lebensdauer_Seiten")) {
                                          createStateAsync(DP + ".Trommeleinheit.Lebensdauer_Seiten", 0, {
                                              "name": "verbleibende Lebensdauer in Seiten",
                                              "type": "number",
                                              "role": "state",
                                              "unit": "Seiten"
                                          });
                                      }
                                      if (!existsState(DP + ".Trommeleinheit.Lebensdauer_Prozent")) {
                                          createStateAsync(DP + ".Trommeleinheit.Lebensdauer_Prozent", 0, {
                                              "name": "verbleibende Lebensdauer in Prozent",
                                              "type": "number",
                                              "role": "state",
                                              "unit": "%"
                                          });
                                      }
                          }
                        );}
                      }
                       
                       
                      function Fuellstand() {
                          try {
                              const options = { method: 'get', url: URL };
                              axios(options).then(function (response) {
                               
                                  if (response.status == 200) { // kein Fehler, Inhalt in body
                                      /* benötigter HTML Code
                                          Toner** 
                                          </DD></TD><TD CLASS="elem">
                                          &#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;
                                          </TD></TR>
                                       */
                      
                                      // Tonerstand extrahieren
                                      let fuellstand;
                                      let fuellstand_start = "Toner**";
                                      let fuellstand_ende = "</TR>"; // dazwischen ist der Text für den Füllstand
                       
                                      let pos_start = response.data.indexOf(fuellstand_start);
                                      let pos_ende = response.data.indexOf(fuellstand_ende);
                       
                                      if (pos_start != -1 && pos_ende != -1) { // wenn gesuchte Strings überhaupt existieren
                                          let fuellstand_bereich = response.data.substring(pos_start + fuellstand_start.length, response.data.length); // von/bis, aber ohne ersten Treffer
                                          fuellstand_bereich = fuellstand_bereich.substring(0, fuellstand_bereich.indexOf(fuellstand_ende)); // Suchwort am Ende abschneiden
                                          fuellstand = strip_tags(fuellstand_bereich).trim(); // kpl. Füllstand
                      
                                          // Füllstand nun in Einzelwerte parsen + DPs setzen
                                          let fuellstand_arr = fuellstand.split(';');
                                          for ( let i=0; i<fuellstand_arr.length-1; i++) {
                                              if (fuellstand_arr[i]=="&#x25a0") { 
                                                  setState(DP + ".Tonerstand.Füllstand_" + (i+1)*10 , 1, true); } 
                                              else { 
                                                  setState(DP + ".Tonerstand.Füllstand_" + (i+1)*10 , 0, true); }
                                          }    
                                      } else log("Konnte keinen Tonerfüllstand einlesen!", "error");
                      
                                      /* benötigter HTML Code
                                          Trommeleinheit* 
                                          </DD></TD><TD CLASS="elem">
                                          0
                                          Seiten
                                          </TD></TR>
                                      */
                                      // Trommeleinheit verbleibende Seitenlebensdauer
                                      let trommel_seiten;
                                      let trommel_seiten_start = "Trommeleinheit*";
                                      let trommel_seiten_ende = "</TR>"; // dazwischen ist der Text für den Füllstand
                       
                                      pos_start = response.data.indexOf(trommel_seiten_start);
                                      pos_ende = response.data.indexOf(trommel_seiten_ende);
                       
                                      if (pos_start != -1 && pos_ende != -1) { // wenn gesuchte Strings überhaupt existieren
                                          let trommel_seiten_bereich = response.data.substring(pos_start + trommel_seiten_start.length, response.data.length); // von/bis, aber ohne ersten Treffer
                                          trommel_seiten_bereich = trommel_seiten_bereich.substring(0, trommel_seiten_bereich.indexOf(trommel_seiten_ende)); // Suchwort am Ende abschneiden
                                          trommel_seiten = parseInt(strip_tags(trommel_seiten_bereich).trim()); // verbleibende Seitenanzahl
                                          
                                          setState(DP + ".Trommeleinheit.Lebensdauer_Seiten", trommel_seiten, true);    
                                      } else log("Konnte keine verbleibende Seiten für Trommeleinheit einlesen!", "error");
                      
                         
                                  /* benötigter HTML Code
                                      (Verbleibende Lebensdauer in %)
                                      </DD></TD><TD CLASS="elem">
                                      (0.00%)
                                      </TD></TR>
                                  */
                                  // Trommeleinheit verbleibende Lebensdauer in Prozent
                                      let trommel_prozent;
                                      let trommel_prozent_start = "(Verbleibende Lebensdauer in %)";
                                      let trommel_prozent_ende = "</TR>"; // dazwischen ist der Text für den Füllstand
                       
                                      pos_start = response.data.indexOf(trommel_prozent_start);
                                      pos_ende = response.data.indexOf(trommel_prozent_ende);
                       
                                      if (pos_start != -1 && pos_ende != -1) { // wenn gesuchte Strings überhaupt existieren
                                          let trommel_prozent_bereich = response.data.substring(pos_start + trommel_prozent_start.length, response.data.length); // von/bis, aber ohne ersten Treffer
                                          trommel_prozent_bereich = trommel_prozent_bereich.substring(0, trommel_prozent_bereich.indexOf(trommel_prozent_ende)); // Suchwort am Ende abschneiden
                                          trommel_prozent = strip_tags(trommel_prozent_bereich).trim(); // verbleibende Prozentzahl (0.0%)
                                          trommel_prozent = parseFloat(trommel_prozent.replace(/[%()]/ig, ''));
                      
                                          setState(DP + ".Trommeleinheit.Lebensdauer_Prozent", trommel_prozent, true);    
                                      } else log("Konnte keinen verbleibenden Prozentwert für Trommeleinheit einlesen!", "error");
                      
                                  } else { log("StatusCode = " + response.statusCode); }
                      
                              });
                          } catch (e) {
                              log("Fehler (try) beim lesen der Druckerstatusseite: " + e, "error");
                          }
                          log("Druckerstatusseite eingelesen...", "info");
                      }
                       
                      function strip_tags(data) {
                          var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " ");
                          return (rueckgabe);
                      }
                      
                      
                      
                      B Offline
                      B Offline
                      Burg_Io
                      schrieb am zuletzt editiert von
                      #10

                      @sborg

                      Läuft perfekt. Vielen Dank.

                      1 Antwort Letzte Antwort
                      0
                      • SBorgS SBorg

                        @burg_io Sodele, hab wieder paar Werte zum testen eingepatcht und die Datenpunktstruktur angepasst. So ist es wegen der diversen Werte schlüssiger:
                        Drucker.png

                        /* Tonerfüllstand und Daten zur Trommeleinheit für einen Brother MFC-7440N auslesen
                        
                        https://forum.iobroker.net/topic/50647/brother-mfc-7440n-druckerinformationen-auslesen
                        
                        26.12.2021 V0.0.2 - Daten zur Trommeleinheit (Seitenanzahl und Lebensdauer) hinzugefügt
                        25.12.2021 (SBorg) first release - ließt den Tonerfüllstand per Webseite ein
                        */
                         
                        const DP = "0_userdata.0.Brother_Drucker";                       // wo sollen die Datenpunkte erstellt werden
                        const URL = "https://10.0.1.132:12300/drucker.html";             // die URL der Druckerstatusseite
                        const Zeitplan = "0 */1 * * *";                                  // wann soll die Seite gelesen werden (cron-Syntax)?
                         
                        
                        
                        // ab hier muss nix mehr geändert werden
                        const axios = require('axios');
                        DPsAnlegen(); 
                        setTimeout(function() { Fuellstand(); }, 10000);    // 10 Sekunden nach Start mal initial Werte holen
                        schedule(Zeitplan, Fuellstand);
                        
                         
                        function DPsAnlegen() {
                          if (!existsState(DP)) { createStateAsync(DP, '', { name: "Daten für den Drucker" }); }
                          if (!existsState(DP+".Tonerstand")) { createStateAsync(DP+".Tonerstand", '', { name: "Füllstand des Toners" }, function() { 
                                    for(let i=10; i<=100; i+=10) {
                                        if (!existsState(DP + ".Tonerstand.Füllstand_" + i)) {
                                            createStateAsync(DP + ".Tonerstand.Füllstand_" + i, 0, {
                                                "name": "Tonerfüllstand " + i + "%",
                                                "type": "number",
                                                "role": "state"
                                            });
                                        }
                                    }
                                });
                          }
                          if (!existsState(DP+".Trommeleinheit")) { createStateAsync(DP+".Trommeleinheit", '', { name: "Daten zur Trommeleinheit" }, function() { 
                                        if (!existsState(DP + ".Trommeleinheit.Lebensdauer_Seiten")) {
                                            createStateAsync(DP + ".Trommeleinheit.Lebensdauer_Seiten", 0, {
                                                "name": "verbleibende Lebensdauer in Seiten",
                                                "type": "number",
                                                "role": "state",
                                                "unit": "Seiten"
                                            });
                                        }
                                        if (!existsState(DP + ".Trommeleinheit.Lebensdauer_Prozent")) {
                                            createStateAsync(DP + ".Trommeleinheit.Lebensdauer_Prozent", 0, {
                                                "name": "verbleibende Lebensdauer in Prozent",
                                                "type": "number",
                                                "role": "state",
                                                "unit": "%"
                                            });
                                        }
                            }
                          );}
                        }
                         
                         
                        function Fuellstand() {
                            try {
                                const options = { method: 'get', url: URL };
                                axios(options).then(function (response) {
                                 
                                    if (response.status == 200) { // kein Fehler, Inhalt in body
                                        /* benötigter HTML Code
                                            Toner** 
                                            </DD></TD><TD CLASS="elem">
                                            &#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;&#x25a0;
                                            </TD></TR>
                                         */
                        
                                        // Tonerstand extrahieren
                                        let fuellstand;
                                        let fuellstand_start = "Toner**";
                                        let fuellstand_ende = "</TR>"; // dazwischen ist der Text für den Füllstand
                         
                                        let pos_start = response.data.indexOf(fuellstand_start);
                                        let pos_ende = response.data.indexOf(fuellstand_ende);
                         
                                        if (pos_start != -1 && pos_ende != -1) { // wenn gesuchte Strings überhaupt existieren
                                            let fuellstand_bereich = response.data.substring(pos_start + fuellstand_start.length, response.data.length); // von/bis, aber ohne ersten Treffer
                                            fuellstand_bereich = fuellstand_bereich.substring(0, fuellstand_bereich.indexOf(fuellstand_ende)); // Suchwort am Ende abschneiden
                                            fuellstand = strip_tags(fuellstand_bereich).trim(); // kpl. Füllstand
                        
                                            // Füllstand nun in Einzelwerte parsen + DPs setzen
                                            let fuellstand_arr = fuellstand.split(';');
                                            for ( let i=0; i<fuellstand_arr.length-1; i++) {
                                                if (fuellstand_arr[i]=="&#x25a0") { 
                                                    setState(DP + ".Tonerstand.Füllstand_" + (i+1)*10 , 1, true); } 
                                                else { 
                                                    setState(DP + ".Tonerstand.Füllstand_" + (i+1)*10 , 0, true); }
                                            }    
                                        } else log("Konnte keinen Tonerfüllstand einlesen!", "error");
                        
                                        /* benötigter HTML Code
                                            Trommeleinheit* 
                                            </DD></TD><TD CLASS="elem">
                                            0
                                            Seiten
                                            </TD></TR>
                                        */
                                        // Trommeleinheit verbleibende Seitenlebensdauer
                                        let trommel_seiten;
                                        let trommel_seiten_start = "Trommeleinheit*";
                                        let trommel_seiten_ende = "</TR>"; // dazwischen ist der Text für den Füllstand
                         
                                        pos_start = response.data.indexOf(trommel_seiten_start);
                                        pos_ende = response.data.indexOf(trommel_seiten_ende);
                         
                                        if (pos_start != -1 && pos_ende != -1) { // wenn gesuchte Strings überhaupt existieren
                                            let trommel_seiten_bereich = response.data.substring(pos_start + trommel_seiten_start.length, response.data.length); // von/bis, aber ohne ersten Treffer
                                            trommel_seiten_bereich = trommel_seiten_bereich.substring(0, trommel_seiten_bereich.indexOf(trommel_seiten_ende)); // Suchwort am Ende abschneiden
                                            trommel_seiten = parseInt(strip_tags(trommel_seiten_bereich).trim()); // verbleibende Seitenanzahl
                                            
                                            setState(DP + ".Trommeleinheit.Lebensdauer_Seiten", trommel_seiten, true);    
                                        } else log("Konnte keine verbleibende Seiten für Trommeleinheit einlesen!", "error");
                        
                           
                                    /* benötigter HTML Code
                                        (Verbleibende Lebensdauer in %)
                                        </DD></TD><TD CLASS="elem">
                                        (0.00%)
                                        </TD></TR>
                                    */
                                    // Trommeleinheit verbleibende Lebensdauer in Prozent
                                        let trommel_prozent;
                                        let trommel_prozent_start = "(Verbleibende Lebensdauer in %)";
                                        let trommel_prozent_ende = "</TR>"; // dazwischen ist der Text für den Füllstand
                         
                                        pos_start = response.data.indexOf(trommel_prozent_start);
                                        pos_ende = response.data.indexOf(trommel_prozent_ende);
                         
                                        if (pos_start != -1 && pos_ende != -1) { // wenn gesuchte Strings überhaupt existieren
                                            let trommel_prozent_bereich = response.data.substring(pos_start + trommel_prozent_start.length, response.data.length); // von/bis, aber ohne ersten Treffer
                                            trommel_prozent_bereich = trommel_prozent_bereich.substring(0, trommel_prozent_bereich.indexOf(trommel_prozent_ende)); // Suchwort am Ende abschneiden
                                            trommel_prozent = strip_tags(trommel_prozent_bereich).trim(); // verbleibende Prozentzahl (0.0%)
                                            trommel_prozent = parseFloat(trommel_prozent.replace(/[%()]/ig, ''));
                        
                                            setState(DP + ".Trommeleinheit.Lebensdauer_Prozent", trommel_prozent, true);    
                                        } else log("Konnte keinen verbleibenden Prozentwert für Trommeleinheit einlesen!", "error");
                        
                                    } else { log("StatusCode = " + response.statusCode); }
                        
                                });
                            } catch (e) {
                                log("Fehler (try) beim lesen der Druckerstatusseite: " + e, "error");
                            }
                            log("Druckerstatusseite eingelesen...", "info");
                        }
                         
                        function strip_tags(data) {
                            var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " ");
                            return (rueckgabe);
                        }
                        
                        
                        
                        H Offline
                        H Offline
                        helfi9999
                        schrieb am zuletzt editiert von
                        #11

                        @sborg habe im Internet folgendes gefunden. Wäre es möglich daraus ein Script für Iobroker zu bauen. Habe so leider keine Ahnung davon.

                        Hier das Script was ich gefunden habe: auf Github

                        Wäre cool.

                        helfi9999

                        Intel NUC mit Iobroker

                        LatziL SBorgS 2 Antworten Letzte Antwort
                        0
                        • H helfi9999

                          @sborg habe im Internet folgendes gefunden. Wäre es möglich daraus ein Script für Iobroker zu bauen. Habe so leider keine Ahnung davon.

                          Hier das Script was ich gefunden habe: auf Github

                          Wäre cool.

                          helfi9999

                          LatziL Online
                          LatziL Online
                          Latzi
                          schrieb am zuletzt editiert von
                          #12

                          @helfi9999
                          Dafür gibt´s den SNMP-Adapter https://github.com/iobroker-community-adapters/ioBroker.snmp/blob/master/docs/de/snmp.md ;-)

                          1 Antwort Letzte Antwort
                          0
                          • H helfi9999

                            @sborg habe im Internet folgendes gefunden. Wäre es möglich daraus ein Script für Iobroker zu bauen. Habe so leider keine Ahnung davon.

                            Hier das Script was ich gefunden habe: auf Github

                            Wäre cool.

                            helfi9999

                            SBorgS Offline
                            SBorgS Offline
                            SBorg
                            Forum Testing Most Active
                            schrieb am zuletzt editiert von
                            #13

                            @helfi9999 Hi, wie @Latzi schon schrieb, dass ist eine SNMP-Abfrage. Obiges JS ist/war nur nötig, da die gewünschten Werte eben nicht per SNMP übertragen werden, der Rest schon :)

                            LG SBorg ( SBorg auf GitHub)
                            Projekte: Lebensmittelwarnung.de | WLAN-Wetterstation | PimpMyStation

                            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

                            716

                            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