NEWS
kleine Javascript Adaption - Anfrage
-
Wäre hier jemand so nett um mir ein Skript, welches ich auch nur per copy&paste von diesem Forum laufen hab etwas zu adaptieren und als fertige Lösung zu posten? Bei Blockly stelle ich solche anfragen nicht, da suche ich mir die Lösung selbst, aber bei Javascript steige ich aus. Ich hoffe man verzeihe mir das.
Dieses Skript holt mir den Tintenfüllstand meines Druckers. Da der Drucker aber nur bei Bedarf Strom bekommt, finde ich nicht den perfekten Trigger-Zeitpunkt.
Daher wäre meine Idee täglich den Drucker um 2:00 Uhr Nachts einzuschalten, 5 min zu warten, damit er auch sicher hochgefahren ist. Dann das Skript einmalig durchlaufen zu lassen. und um 2:10 Uhr den Drucker wieder auszuschalten.
Das ein/ausschalten würde ganz einfach über diesen HTTP Post Befehl funktionieren:
Ein:http://192.168.0.23/control?cmd=on,typ,it,did,86,aid,3,acmd,1,seq,6&id=3
Aus:http://192.168.0.23/control?cmd=off,typ,it,did,86,aid,3,acmd,1,seq,6&id=3
hier das aktuelle Skript.
/** * Read informations from HP Printers; * 2021-04-16 @ TheAlphaGhost; */ var printername = '192.168.0.29'; var url = 'http://' + printername + '/DevMgmt/ConsumableConfigDyn.xml'; var datapointname = 'HP'; var request = require('request'); var parseString = require('xml2js').parseString; // Create datapoints; createState('0_userdata.0.Drucker.' + datapointname + '.Black.ConsumableLabelCode'); createState('0_userdata.0.Drucker.' + datapointname + '.Black.ConsumablePercentageLevelRemaining'); createState('0_userdata.0.Drucker.' + datapointname + '.CMY.ConsumableLabelCode'); createState('0_userdata.0.Drucker.' + datapointname + '.CMY.ConsumablePercentageLevelRemaining'); function GetData() { request(url, function (error, response, body) { var xml, result; parseString(body, function (err, result) { xml = JSON.stringify(result); var json = JSON.parse(xml); for (var i in json['ccdyn:ConsumableConfigDyn']['ccdyn:ConsumableInfo']) { let node = json['ccdyn:ConsumableConfigDyn']['ccdyn:ConsumableInfo'][i]; let ConsumableFamilyName = node['dd:ConsumableFamilyName'] let ConsumableLabelCode = node['dd:ConsumableLabelCode']; let ConsumablePercentageLevelRemaining = node['dd:ConsumablePercentageLevelRemaining']; let ProductNumber = node['dd:ProductNumber']; var ColorDataPoint = ""; switch (String(ConsumableLabelCode)) { case "K": ColorDataPoint = "Black"; break; case "CMY": ColorDataPoint = "CMY"; break; default: continue; log("[ERROR] ColorDataPoint not found for " + ConsumableLabelCode + "!"); }; setState('0_userdata.0.Drucker.' + datapointname + '.' + ColorDataPoint + '.ConsumableLabelCode', String(ConsumableLabelCode).replace((/[^*a-zA-Z0-9]/g), "")); setState('0_userdata.0.Drucker.' + datapointname + '.' + ColorDataPoint + '.ConsumablePercentageLevelRemaining', String(ConsumablePercentageLevelRemaining).replace((/[^*a-zA-Z0-9]/g), "")); }; }); }); }; schedule("0 14,16,18,20 * * *"), function () { GetData(); })
-
@rtwl sagte: täglich den Drucker um 2:00 Uhr Nachts einzuschalten, 5 min zu warten, damit er auch sicher hochgefahren ist. Dann das Skript einmalig durchlaufen zu lassen. und um 2:10 Uhr den Drucker wieder auszuschalten.
Findest Du es sinnvoll, den Drucker extra einzuschalten, um den Tintenstand zu prüfen? Man kann doch sicherlich prüfen (Ping-Adapter), ob der Drucker eingeschaltet wurde und dann (evtl. mit Verzögerung) die Tintenstandabfrage starten?
-
@paul53 ja, das wäre natürlich die bessere Lösung.
auch das würde ich keinesfalls selber hinbekommen.
mit dem radar2 Adapter hab ich nun mal den Status online true/falsekönntest du mir dabei helfen?
-
@rtwl sagte: mit dem radar2 Adapter hab ich nun mal den Status online true/false
Unten schedule() ab Zeile 58 ersetzen durch
const idOnline = 'radar2.0.xyz'; // ID korrigieren! var timer = null; if(getState(idOnline).val) GetData(); // Skriptstart on(idOnline, function(dp) { if(dp.state.val) { timer = setTimeout(GetData, 60000); // 1 Minute nach online true } else clearTimeout(timer); });
-
@paul53
Vielen vielen Dank!
ich werd es später testen -
@paul53 Hab es nun implementiert, hat auch funktioniert.
Aber eine Verständnisfrage hab ich noch und ich kann es nicht rauslesen.Wird das Skript nun genau 1x ausgeführt wenn der radar2 Datenpunkt von false auf true wechselt? mit der 60 Sek Verzögerung natürlich.
-
@rtwl sagte: Wird das Skript nun genau 1x ausgeführt wenn der radar2 Datenpunkt von false auf true wechselt?
Ja, dies gilt für den Aufruf der Funktion.