@tottitoad Ich habe den Fehler gefunden, die Variable "TagEndMarker" wird bei der ersten Farbe in Zeile 78 verwendet, aber erst in Zeile 81 deklariert. Habe noch eine nicht genutzte Zeile rausgeworfen, so läuft es jetzt bei mir für HP OfficeJet 8600 Pro:
/* 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
*/
// hier Drucker parameter einstellen - vor dem ersten Speichern des Scripts
var druckerIP = '192.168.178.33'; // Drucker IP
var druckermod = "HPOJ8600"; // Drucker Modell - Strukturelement in den Variablen
var TinteID = "950XL"; // Tinte - Tintenbezeichnung
var TinteCyanBez = "CN046A"; // Bezeichnung fuer Cyan
var TinteMagentaBez = "CN047A"; // Bezeichnung fuer Magenta
var TinteYellowBez = "CN048A"; // Bezeichnung fuer Yellow
var TinteBlackBez = "CN045A"; // Bezeichnung fuer Black
// ENDE der Einstellungen
var druckerURL = "http://" + druckerIP + "/DevMgmt/ConsumableConfigDyn.xml"; // URL nicht ändern
var request = require('request'); // Enabling for URL Request
var cut0 = "dd:Capacity"; // Marker für capacity
var cut1 = "dd:ConsumableLabelCode"; // Marker für color
var cut2 = "dd:ConsumablePercentageLevelRemaining"; // Marker für Level
var level_C = 0; // Tintenlevel
var level_M = 0; // Tintenlevel
var level_Y = 0; // Tintenlevel
var level_K = 0; // Tintenlevel
var DruckIP = "Drucker.HP." + druckermod + ".IP"; // Variable für create states
var DruckerName = "Drucker.HP." + druckermod + ".Name"; // Variable für create states
var Modell = "Drucker.HP." + druckermod + ".Modell"; // Variable für create states
var Tinte = "Drucker.HP." + druckermod + ".Tinte"; // Variable für create states
var CyanInk = "Drucker.HP." + druckermod + ".Color1Cyan.Ink"; // Variable für create states
var MagentaInk = "Drucker.HP." + druckermod + ".Color2Magenta.Ink"; // Variable für create states
var YellowInk = "Drucker.HP." + druckermod + ".Color3Yellow.Ink"; // Variable für create states
var BlackInk = "Drucker.HP." + druckermod + ".Color4Black.Ink"; // Variable für create states
var CyanLevel = "Drucker.HP." + druckermod + ".Color1Cyan.Level"; // Variable für create states
var MagentaLevel = "Drucker.HP." + druckermod + ".Color2Magenta.Level"; // Variable für create states
var YellowLevel = "Drucker.HP." + druckermod + ".Color3Yellow.Level"; // Variable für create states
var BlackLevel = "Drucker.HP." + druckermod + ".Color4Black.Level"; // Variable für create states
// Anlegen der Variablen
createState(DruckIP,druckerIP);
createState(DruckerName,druckermod);
createState(Tinte,TinteID);
createState(CyanInk,TinteCyanBez);
createState(MagentaInk,TinteMagentaBez);
createState(YellowInk,TinteYellowBez);
createState(BlackInk,TinteBlackBez);
createState(CyanLevel,0);
createState(MagentaLevel,0);
createState(YellowLevel,0);
createState(BlackLevel),0;
// Schedule für die Updates
schedule("0 */6 * * *", Drucker); // Schedule alle 6 Stunden
Drucker(); // Sofort beim Scriptstart einmal laufen lassen
function Drucker () {
request(druckerURL, function (error, response, body) { // Einlesen der XML Information
if (!error && response.statusCode == 200) { // error check
// Farbe nummer 1
var TagEndMarker = '<';
var null_position = body.indexOf(cut0) + cut0.length + 1 ;
var eins_position = body.indexOf(cut1, null_position) + cut1.length + 1; // erste Position finden
var color = body.substring(eins_position, eins_position+1) ; // erste Position ist die Farbe
var zwei_position = body.indexOf(cut2)+ cut2.length + 1; // zweite Position finden
var level_string = body.substring(zwei_position, body.indexOf(TagEndMarker, zwei_position));
var eins_lastpos = eins_position; // merken position eins
var zwei_lastpos = zwei_position; // merken position zwei
if("C" == color){ level_C = level_string; }
if("M" == color){ level_M = level_string; }
if("Y" == color){ level_Y = level_string; }
if("K" == color){ level_K = level_string; }
eins_lastpos = eins_position + 10;
zwei_lastpos = zwei_position + 10;
// Farbe nummer 2
eins_position = body.indexOf(cut1, eins_lastpos) + cut1.length + 1 ;
color = body.substring(eins_position, eins_position+1) ;
zwei_position = body.indexOf(cut2,zwei_lastpos)+ cut2.length + 1;
level_string = body.substring(zwei_position, body.indexOf(TagEndMarker, zwei_position));
if("C" == color){ level_C = level_string; }
if("M" == color){ level_M = level_string; }
if("Y" == color){ level_Y = level_string; }
if("K" == color){ level_K = level_string; }
eins_lastpos = eins_position + 10;
zwei_lastpos = zwei_position + 10;
// Farbe nummer 3
eins_position = body.indexOf(cut1, eins_lastpos) + cut1.length + 1;
color = body.substring(eins_position, eins_position+1) ;
zwei_position = body.indexOf(cut2,zwei_lastpos)+ cut2.length + 1;
level_string = body.substring(zwei_position, body.indexOf(TagEndMarker, zwei_position));
if("C" == color){ level_C = level_string; }
if("M" == color){ level_M = level_string; }
if("Y" == color){ level_Y = level_string; }
if("K" == color){ level_K = level_string; }
eins_lastpos = eins_position + 10;
zwei_lastpos = zwei_position + 10;
// Farbe nummer 4
eins_position = body.indexOf(cut1, eins_lastpos) + cut1.length + 1;
color = body.substring(eins_position, eins_position+1) ;
zwei_position = body.indexOf(cut2,zwei_lastpos)+ cut2.length + 1;
level_string = body.substring(zwei_position, body.indexOf(TagEndMarker, zwei_position));
if("C" == color){ level_C = level_string; }
if("M" == color){ level_M = level_string; }
if("Y" == color){ level_Y = level_string; }
if("K" == color){ level_K = level_string; }
eins_lastpos = eins_position + 10;
zwei_lastpos = zwei_position + 10;
log('Drucker Level C ' + level_C , "info");
log('Drucker Level M ' + level_M , "info");
log('Drucker Level Y ' + level_Y , "info");
log('Drucker Level K ' + level_K , "info");
// der folgende Bereich muss für ggf abweichenden Druckertyp angepasst werden
setState(CyanLevel, level_C);
setState(MagentaLevel, level_M);
setState(YellowLevel, level_Y);
setState(BlackLevel, level_K);
setState(DruckIP, druckerIP);
} else { // if (!error && response.statusCode == 200) {
log(error);
log('Kein Drucker gefunden');
}
}); // end of request
} // end of function