19 Mar 2021, 13:07

@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