Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Brother MFC-7440N - Druckerinformationen auslesen

    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

    Brother MFC-7440N - Druckerinformationen auslesen

    This topic has been deleted. Only users with topic management privileges can see it.
    • sigi234
      sigi234 Forum Testing Most Active @Burg_Io last edited by

      @burg_io

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

      1 Reply Last reply Reply Quote 0
      • SBorg
        SBorg Forum Testing Most Active @Burg_Io last edited by

        @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 1 Reply Last reply Reply Quote 0
        • B
          Burg_Io @SBorg last edited by Burg_Io

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

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

          Supie

          SBorg 1 Reply Last reply Reply Quote 0
          • SBorg
            SBorg Forum Testing Most Active @Burg_Io last edited by

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

            B 1 Reply Last reply Reply Quote 0
            • B
              Burg_Io @SBorg last edited by

              @sborg

              Wäre super wenn diese auch um zusetzten gehen.

              SBorg 1 Reply Last reply Reply Quote 0
              • SBorg
                SBorg Forum Testing Most Active @Burg_Io last edited by

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

                B 1 Reply Last reply Reply Quote 0
                • B
                  Burg_Io @SBorg last edited by

                  @sborg

                  Wenn du das sagt. 😊 Ich staune nur.

                  SBorg 1 Reply Last reply Reply Quote 0
                  • SBorg
                    SBorg Forum Testing Most Active @Burg_Io last edited by

                    @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 H 2 Replies Last reply Reply Quote 0
                    • B
                      Burg_Io @SBorg last edited by

                      @sborg

                      Läuft perfekt. Vielen Dank.

                      1 Reply Last reply Reply Quote 0
                      • H
                        helfi9999 @SBorg last edited by

                        @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

                        Latzi SBorg 2 Replies Last reply Reply Quote 0
                        • Latzi
                          Latzi @helfi9999 last edited by

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

                          1 Reply Last reply Reply Quote 0
                          • SBorg
                            SBorg Forum Testing Most Active @helfi9999 last edited by

                            @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 🙂

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            795
                            Online

                            31.9k
                            Users

                            80.1k
                            Topics

                            1.3m
                            Posts

                            5
                            13
                            795
                            Loading More Posts
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes
                            Reply
                            • Reply as topic
                            Log in to reply
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            The ioBroker Community 2014-2023
                            logo