2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.hpprinter.internal.api;
15 import org.eclipse.jdt.annotation.NonNullByDefault;
16 import org.w3c.dom.Document;
17 import org.w3c.dom.Element;
18 import org.w3c.dom.Node;
19 import org.w3c.dom.NodeList;
22 * The {@link HPUsage} is responsible for handling reading of usage data.
24 * @author Stewart Cossey - Initial contribution
27 public class HPUsage {
28 public static final String ENDPOINT = "/DevMgmt/ProductUsageDyn.xml";
30 private int totalSubscriptionImpressions;
31 private int mispickEvents;
32 private int totalMonochromeImpressions;
33 private int totalColorImpressions;
34 private int frontpanelCancelCount;
35 private int totalImpressions;
37 private int jamEvents;
40 private int inkMagenta;
41 private int inkYellow;
43 private float inkBlackMarking;
44 private float inkCyanMarking;
45 private float inkMagentaMarking;
46 private float inkYellowMarking;
47 private float inkColorMarking;
49 private int inkBlackPagesRemaining;
50 private int inkColorPagesRemaining;
51 private int inkCyanPagesRemaining;
52 private int inkMagentaPagesRemaining;
53 private int inkYellowPagesRemaining;
56 private int scanAdfCount;
57 private int scanFlatbedCount;
58 private int scanToEmailCount;
59 private int scanToFolderCount;
60 private int scanToHostCount;
63 private int scannerAdfCount;
64 private int scannerFlatbedCount;
65 private int scannerJamEvents;
66 private int scannerMispickEvents;
69 private int copyAdfCount;
70 private int copyFlatbedCount;
71 private int copyTotalImpressions;
72 private int copyTotalMonochromeImpressions;
73 private int copyTotalColorImpressions;
76 private int appWindowsCount;
77 private int appOsxCount;
78 private int appIosCount;
79 private int appAndroidCount;
80 private int appSamsungCount;
81 private int appChromeCount;
84 private int cloudPrintImpressions;
89 public HPUsage(Document document) {
91 NodeList consumableInk = document.getDocumentElement().getElementsByTagName("pudyn:Consumable");
93 for (int i = 0; i < consumableInk.getLength(); i++) {
94 Element currInk = (Element) consumableInk.item(i);
96 String inkName = currInk.getElementsByTagName("dd:MarkerColor").item(0).getTextContent();
98 String consumeType = currInk.getElementsByTagName("dd:ConsumableTypeEnum").item(0).getTextContent();
100 if ("printhead".equalsIgnoreCase(consumeType)) {
104 String inkRemaining = currInk.getElementsByTagName("dd:ConsumableRawPercentageLevelRemaining").item(0)
107 int markAgentLength = currInk.getElementsByTagName("dd2:CumulativeMarkingAgentUsed").getLength();
108 Boolean hasPagesRemaining = currInk.getElementsByTagName("dd:EstimatedPagesRemaining").getLength() > 0;
109 float totalMarking = 0;
110 int pagesRemaining = 0;
111 if (markAgentLength > 0) { // Check to make sure Cumulative Marking Agent exists
112 for (int ai = 0; ai < markAgentLength; ai++) {
113 Element currMarking = (Element) currInk.getElementsByTagName("dd2:CumulativeMarkingAgentUsed")
116 float marking = Integer
117 .parseInt(currMarking.getElementsByTagName("dd:ValueFloat").item(0).getTextContent());
119 switch (currMarking.getElementsByTagName("dd:Unit").item(0).getTextContent().toLowerCase()) {
121 marking = marking / 1000; // Convert from microlitres to millilitres
124 marking = marking * 1000; // Convert to litres to millilitres
127 totalMarking = totalMarking + marking; // Sum the marking counts together
131 if (hasPagesRemaining) {
132 pagesRemaining = Integer.parseInt(((Element) currInk).getElementsByTagName("dd:EstimatedPagesRemaining")
133 .item(0).getTextContent());
136 switch (inkName.toLowerCase()) {
138 inkBlack = Integer.parseInt(inkRemaining);
139 inkBlackMarking = totalMarking;
140 inkBlackPagesRemaining = pagesRemaining;
144 inkYellow = Integer.parseInt(inkRemaining);
145 inkYellowMarking = totalMarking;
146 inkYellowPagesRemaining = pagesRemaining;
150 inkMagenta = Integer.parseInt(inkRemaining);
151 inkMagentaMarking = totalMarking;
152 inkMagentaPagesRemaining = pagesRemaining;
156 inkCyan = Integer.parseInt(inkRemaining);
157 inkCyanMarking = totalMarking;
158 inkCyanPagesRemaining = pagesRemaining;
161 case "cyanmagentayellow":
162 inkColor = Integer.parseInt(inkRemaining);
163 inkColorMarking = totalMarking;
164 inkColorPagesRemaining = pagesRemaining;
169 // Get other usage info
170 NodeList jamEvents = document.getDocumentElement().getElementsByTagName("dd:JamEvents");
171 if (jamEvents.getLength() > 0) {
172 this.jamEvents = Integer.parseInt(jamEvents.item(0).getTextContent());
175 NodeList totalImpressions = document.getDocumentElement().getElementsByTagName("dd:TotalImpressions");
176 if (totalImpressions.getLength() > 0) {
177 this.totalImpressions = Integer.parseInt(totalImpressions.item(0).getTextContent());
180 NodeList totalColorImpressions = document.getDocumentElement().getElementsByTagName("dd:ColorImpressions");
181 if (totalColorImpressions.getLength() > 0) {
182 this.totalColorImpressions = Integer.parseInt(totalColorImpressions.item(0).getTextContent());
185 NodeList totalMonochromeImpressions = document.getDocumentElement()
186 .getElementsByTagName("dd:MonochromeImpressions");
187 if (totalMonochromeImpressions.getLength() > 0) {
188 this.totalMonochromeImpressions = Integer.parseInt(totalMonochromeImpressions.item(0).getTextContent());
191 NodeList totalSubscriptionImpressions = document.getDocumentElement()
192 .getElementsByTagName("pudyn:SubscriptionImpressions");
193 if (totalSubscriptionImpressions.getLength() > 0) {
194 this.totalSubscriptionImpressions = Integer.parseInt(totalSubscriptionImpressions.item(0).getTextContent());
197 NodeList mispickEvents = document.getDocumentElement().getElementsByTagName("dd:MispickEvents");
198 if (mispickEvents.getLength() > 0) {
199 this.mispickEvents = Integer.parseInt(mispickEvents.item(0).getTextContent());
202 NodeList frontpanelCancelCount = document.getDocumentElement()
203 .getElementsByTagName("dd:TotalFrontPanelCancelPresses");
204 if (frontpanelCancelCount.getLength() > 0) {
205 this.frontpanelCancelCount = Integer.parseInt(frontpanelCancelCount.item(0).getTextContent());
209 NodeList printAppsSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:PrintApplicationSubunit");
210 if (printAppsSubUnit.getLength() > 0) {
211 Element currPrintAppsSubUnit = (Element) printAppsSubUnit.item(0);
213 NodeList cloudPrintImpressions = currPrintAppsSubUnit.getElementsByTagName("dd:CloudPrintImpressions");
215 if (cloudPrintImpressions.getLength() > 0) {
216 this.cloudPrintImpressions = Integer.parseInt(cloudPrintImpressions.item(0).getTextContent());
221 NodeList scanSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:ScanApplicationSubunit");
222 if (scanSubUnit.getLength() > 0) {
223 Element currScanSubUnit = (Element) scanSubUnit.item(0);
225 this.scanAdfCount = setInt("dd:AdfImages", currScanSubUnit);
226 this.scanFlatbedCount = setInt("dd:FlatbedImages", currScanSubUnit);
228 this.scanToEmailCount = setInt("dd:ImagesSentToEmail", currScanSubUnit);
229 this.scanToFolderCount = setInt("dd:ImagesSentToFolder", currScanSubUnit);
231 this.scanToHostCount = setInt("dd:ScanToHostImages", currScanSubUnit);
235 NodeList scannerSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:ScannerEngineSubunit");
236 if (scannerSubUnit.getLength() > 0) {
237 Element currScannerSubUnit = (Element) scannerSubUnit.item(0);
239 this.scannerAdfCount = setInt("dd:AdfImages", currScannerSubUnit);
240 this.scannerFlatbedCount = setInt("dd:FlatbedImages", currScannerSubUnit);
241 this.scannerJamEvents = setInt("dd:JamEvents", currScannerSubUnit);
242 this.scannerMispickEvents = setInt("dd:MispickEvents", currScannerSubUnit);
246 NodeList copySubUnit = document.getDocumentElement().getElementsByTagName("pudyn:CopyApplicationSubunit");
247 if (copySubUnit.getLength() > 0) {
248 Element currCopySubUnit = (Element) copySubUnit.item(0);
250 this.copyAdfCount = setInt("dd:AdfImages", currCopySubUnit);
251 this.copyFlatbedCount = setInt("dd:FlatbedImages", currCopySubUnit);
252 this.copyTotalColorImpressions = setInt("dd:ColorImpressions", currCopySubUnit);
253 this.copyTotalMonochromeImpressions = setInt("dd:MonochromeImpressions", currCopySubUnit);
254 this.copyTotalImpressions = setInt("dd:TotalImpressions", currCopySubUnit);
258 NodeList appSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:MobileApplicationSubunit");
259 if (appSubUnit.getLength() > 0) {
260 Element currAppSubUnit = (Element) appSubUnit.item(0);
262 this.appWindowsCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "Windows",
263 "pudyn:TotalImpressions");
264 this.appOsxCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "OSX",
265 "pudyn:TotalImpressions");
266 this.appIosCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "iOS",
267 "pudyn:TotalImpressions");
268 this.appAndroidCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "Android",
269 "pudyn:TotalImpressions");
270 this.appSamsungCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "samsung",
271 "pudyn:TotalImpressions");
272 this.appChromeCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "Chrome",
273 "pudyn:TotalImpressions");
277 private static int setIntCollateDirectChildren(Element parentNode, String collateTagName,
278 String collateTagNameValue, String valueTagName) {
281 for (Node n = parentNode.getFirstChild(); n != null; n = n.getNextSibling()) {
282 if (n instanceof Element) {
283 Element nodeItem = (Element) n;
284 if (nodeItem.getElementsByTagName(collateTagName).item(0).getTextContent()
285 .equalsIgnoreCase(collateTagNameValue)) {
286 int nodeValue = Integer
287 .parseInt(nodeItem.getElementsByTagName(valueTagName).item(0).getTextContent());
297 private int setInt(String tagName, Element parentNode) {
298 NodeList nodeList = parentNode.getElementsByTagName(tagName);
299 if (nodeList.getLength() > 0) {
300 return Integer.parseInt(nodeList.item(0).getTextContent());
305 public int getFrontPanelCancelCount() {
306 return frontpanelCancelCount;
309 public int getTotalSubscriptionImpressions() {
310 return totalSubscriptionImpressions;
313 public int getMispickEvents() {
314 return mispickEvents;
317 public int getTotalMonochromeImpressions() {
318 return totalMonochromeImpressions;
321 public int getTotalColorImpressions() {
322 return totalColorImpressions;
325 public int getTotalImpressions() {
326 return totalImpressions;
329 public int getCloudPrintImpressions() {
330 return cloudPrintImpressions;
333 public int getJamEvents() {
337 public int getInkBlack() {
341 public float getInkBlackMarking() {
342 return inkBlackMarking;
345 public int getInkCyan() {
349 public float getInkCyanMarking() {
350 return inkCyanMarking;
353 public int getInkMagenta() {
357 public float getInkMagentaMarking() {
358 return inkMagentaMarking;
361 public int getInkYellow() {
365 public float getInkYellowMarking() {
366 return inkYellowMarking;
369 public int getInkBlackPagesRemaining() {
370 return inkBlackPagesRemaining;
373 public int getInkColorPagesRemaining() {
374 return inkColorPagesRemaining;
377 public int getInkMagentaPagesRemaining() {
378 return inkMagentaPagesRemaining;
381 public int getInkCyanPagesRemaining() {
382 return inkCyanPagesRemaining;
385 public int getInkYellowPagesRemaining() {
386 return inkYellowPagesRemaining;
389 public int getInkColor() {
393 public float getInkColorMarking() {
394 return inkColorMarking;
397 public int getScanAdfCount() {
401 public int getScanFlatbedCount() {
402 return scanFlatbedCount;
405 public int getScanToEmailCount() {
406 return scanToEmailCount;
409 public int getScanToFolderCount() {
410 return scanToFolderCount;
413 public int getScanToHostCount() {
414 return scanToHostCount;
417 public int getAppWindowsCount() {
418 return appWindowsCount;
421 public int getAppOSXCount() {
425 public int getAppIosCount() {
429 public int getAppAndroidCount() {
430 return appAndroidCount;
433 public int getAppSamsungCount() {
434 return appSamsungCount;
437 public int getAppChromeCount() {
438 return appChromeCount;
441 public int getScannerAdfCount() {
442 return scannerAdfCount;
445 public int getScannerFlatbedCount() {
446 return scannerFlatbedCount;
449 public int getScannerJamEvents() {
450 return scannerJamEvents;
453 public int getScannerMispickEvents() {
454 return scannerMispickEvents;
457 public int getCopyAdfCount() {
461 public int getCopyFlatbedCount() {
462 return copyFlatbedCount;
465 public int getCopyTotalImpressions() {
466 return copyTotalImpressions;
469 public int getCopyTotalColorImpressions() {
470 return copyTotalColorImpressions;
473 public int getCopyTotalMonochromeImpressions() {
474 return copyTotalMonochromeImpressions;