/* bringt den Druckertintenstand von WEB enabled HP Tintenstrahler in ioBroker Drucker HP Tintenstand für iobroker ermitteln Basierend auf CCU2 Script fuer HP Drucker http://homematic-forum.de/forum/viewtopic.php?f=31&t=25140 und dem angepassten Script von PiX aus iobroker http://forum.iobroker.de/viewtopic.php?f=21&t=910&p=6931&hilit=drucker&sid=6780c0b33361e199846dcb584c8dc289&sid=6780c0b33361e199846dcb584c8dc289#p6931 Author : looxer01 - 22.12.2015 Version 0.2 29.01.2015 Druckerparameter jetzt einstellbar im Bereich der Einstellungen kosmetik ykuendig Version 1.0 23.08.2024 - Looxer01 - Optimierungen */ //------------------------------------------------------------------------------------------------------------------------------ // Einstellungen // Druckerparameter einstellen const druckerIP = "192.168.0.94"; // Drucker IP (LAN) const druckermod = "8900Pro"; // Drucker Modell const TinteID = "950XL"; // Tintenbezeichnung // Tintenbezeichnungen const TintenBezeichnungen = { Cyan: "CN046AE", Magenta: "CN047AE", Yellow: "CN048AE", Black: "CN045AE" }; // URL für den Abruf des Tintenstandes const druckerURL = `http://${druckerIP}/DevMgmt/ConsumableConfigDyn.xml`; // Einstellbare Häufigkeit für die Updates const updateFrequencyHours = 1; // Hier kann die Häufigkeit in Stunden eingestellt werden für die updates (z.B alle 6 Stunden) // XML Tags für das Parsing const Tags = { Capacity: "dd:Capacity", // Marker für capacity LabelCode: "dd:ConsumableLabelCode", // Marker für color PercentageLevel: "dd:ConsumablePercentageLevelRemaining"// Marker für level }; const path = "Drucker.HP"; // Pfade für die States für ioBroker bei den Objekten unter javascript..... // Ende der Einsttellungen //------------------------------------------------------------------------------------------------------------------------------ const States = { DruckIP: `${path}.${druckermod}.IP`, DruckerName: `${path}.${druckermod}.Name`, Tinte: `${path}.${druckermod}.Tinte`, CyanInk: `${path}.${druckermod}.Color1Cyan.Ink`, MagentaInk: `${path}.${druckermod}.Color2Magenta.Ink`, YellowInk: `${path}.${druckermod}.Color3Yellow.Ink`, BlackInk: `${path}.${druckermod}.Color4Black.Ink`, CyanLevel: `${path}.${druckermod}.Color1Cyan.Level`, MagentaLevel: `${path}.${druckermod}.Color2Magenta.Level`, YellowLevel: `${path}.${druckermod}.Color3Yellow.Level`, BlackLevel: `${path}.${druckermod}.Color4Black.Level` }; // Initialisierung der States createStateIfNotExists(States.DruckIP, druckerIP); createStateIfNotExists(States.DruckerName, druckermod); createStateIfNotExists(States.Tinte, TinteID); // Initialisierung der Tintenstände und -pegel for (let color in TintenBezeichnungen) { const inkState = States[`${color}Ink`]; const levelState = States[`${color}Level`]; createStateIfNotExists(inkState, TintenBezeichnungen[color]); createStateIfNotExists(levelState, 0); } fetchPrinterData(); // Sofortiger Start für Initialisierung der Stände // -------------------------------------------------------------------------------------- // Funktion: cronExpression - Erstellt den Schedule zur regelmäßigen ermittlung der Tingenstände // -------------------------------------------------------------------------------------- const cronExpression = `0 */${updateFrequencyHours} * * *`; schedule(cronExpression, fetchPrinterData); // Schedule für die Updates basierend auf der Frequenz // -------------------------------------------------------------------------------------- // Funktion: createStates - Erstellt die States falls nicht vorhanden // -------------------------------------------------------------------------------------- function createStateIfNotExists(stateName, initialValue) { if (!existsState(stateName)) { createState(stateName, initialValue); } } // -------------------------------------------------------------------------------------- // Funktion: fetchPrinterData - Zentrale Funktion Holt die Datei vom Drucker - // ruft Funktion zum Ermitteln der Stände auf und speichert das Ergebnis je Farbe // -------------------------------------------------------------------------------------- function fetchPrinterData() { httpGet(druckerURL, function (error, response) { if (error) { log('Fehler beim Abrufen der Druckerdaten: ' + error, 'error'); return; } const body = response.data; const levels = parseInkLevels(body); // Loggen und Speichern der Tintenstände for (let color in levels) { const level = levels[color]; const stateName = States[`${color}Level`]; if (stateName !== undefined) { log(`Drucker Level ${color}: ${level}`, 'info'); setState(stateName, parseInt(level, 10)); } else { log(`State for ${color} is undefined.`, 'warn'); } } setState(States.DruckIP, druckerIP); }); } // -------------------------------------------------------------------------------------- // Funktion: parseInkLevels: Ermittelt die Level je Farbe - // -------------------------------------------------------------------------------------- function parseInkLevels(body) { const levels = {}; const colorMap = { C: 'Cyan', M: 'Magenta', Y: 'Yellow', K: 'Black' }; let lastPos = 0; for (let color in colorMap) { const colorPos = body.indexOf(Tags.LabelCode, lastPos) + Tags.LabelCode.length + 1; const levelPos = body.indexOf(Tags.PercentageLevel, colorPos) + Tags.PercentageLevel.length + 1; const levelValue = body.substring(levelPos, body.indexOf('<', levelPos)).trim(); levels[colorMap[color]] = levelValue || '0'; // Default zu '0' bei Fehlern lastPos = levelPos + 10; } return levels; }