NEWS
Brother MFC-7440N - Druckerinformationen auslesen
-
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
view-source:http://brn00807707e5d6.local/main/main.html
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?
-
-
@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":
Ergebnis:
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"> ■■■■■■■■■■ </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]=="■") { 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(/( |<([^>]+)>)/ig, " "); return (rueckgabe); }
-
-
@burg_io
Ich habe die zwei anderen Werte für die Trommel überlesen, sind die noch relevant? -
Wäre super wenn diese auch um zusetzten gehen.
-
@burg_io Kein größeres Problem, ist zumindest einfacher als die Kästchen
...die waren aber auch nicht wirklich schwer -
Wenn du das sagt.
Ich staune nur.
-
@burg_io Sodele, hab wieder paar Werte zum testen eingepatcht und die Datenpunktstruktur angepasst. So ist es wegen der diversen Werte schlüssiger:
/* 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"> ■■■■■■■■■■ </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]=="■") { 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(/( |<([^>]+)>)/ig, " "); return (rueckgabe); }
-
Läuft perfekt. Vielen Dank.
-
@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
-
@helfi9999
Dafür gibt´s den SNMP-Adapter https://github.com/iobroker-community-adapters/ioBroker.snmp/blob/master/docs/de/snmp.md -
@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