]> git.basschouten.com Git - openhab-addons.git/blob
be633a33162caf93adb1deaf3213eef98a3bee81
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.hpprinter.internal.api;
14
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;
20
21 /**
22  * The {@link HPUsage} is responsible for handling reading of usage data.
23  *
24  * @author Stewart Cossey - Initial contribution
25  */
26 @NonNullByDefault
27 public class HPUsage {
28     public static final String ENDPOINT = "/DevMgmt/ProductUsageDyn.xml";
29
30     private int totalSubscriptionImpressions;
31     private int mispickEvents;
32     private int totalMonochromeImpressions;
33     private int totalColorImpressions;
34     private int frontpanelCancelCount;
35     private int totalImpressions;
36
37     private int jamEvents;
38     private int inkBlack;
39     private int inkCyan;
40     private int inkMagenta;
41     private int inkYellow;
42     private int inkColor;
43     private float inkBlackMarking;
44     private float inkCyanMarking;
45     private float inkMagentaMarking;
46     private float inkYellowMarking;
47     private float inkColorMarking;
48
49     private int inkBlackPagesRemaining;
50     private int inkColorPagesRemaining;
51     private int inkCyanPagesRemaining;
52     private int inkMagentaPagesRemaining;
53     private int inkYellowPagesRemaining;
54
55     // Scan
56     private int scanAdfCount;
57     private int scanFlatbedCount;
58     private int scanToEmailCount;
59     private int scanToFolderCount;
60     private int scanToHostCount;
61
62     // Scanner
63     private int scannerAdfCount;
64     private int scannerFlatbedCount;
65     private int scannerJamEvents;
66     private int scannerMispickEvents;
67
68     // Copy
69     private int copyAdfCount;
70     private int copyFlatbedCount;
71     private int copyTotalImpressions;
72     private int copyTotalMonochromeImpressions;
73     private int copyTotalColorImpressions;
74
75     // App
76     private int appWindowsCount;
77     private int appOsxCount;
78     private int appIosCount;
79     private int appAndroidCount;
80     private int appSamsungCount;
81     private int appChromeCount;
82
83     // Other
84     private int cloudPrintImpressions;
85
86     public HPUsage() {
87     }
88
89     public HPUsage(Document document) {
90         // Get Ink Levels
91         NodeList consumableInk = document.getDocumentElement().getElementsByTagName("pudyn:Consumable");
92
93         for (int i = 0; i < consumableInk.getLength(); i++) {
94             Element currInk = (Element) consumableInk.item(i);
95
96             String inkName = currInk.getElementsByTagName("dd:MarkerColor").item(0).getTextContent();
97
98             String consumeType = currInk.getElementsByTagName("dd:ConsumableTypeEnum").item(0).getTextContent();
99
100             if ("printhead".equalsIgnoreCase(consumeType)) {
101                 continue;
102             }
103
104             String inkRemaining = currInk.getElementsByTagName("dd:ConsumableRawPercentageLevelRemaining").item(0)
105                     .getTextContent();
106
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")
114                             .item(ai);
115
116                     float marking = Integer
117                             .parseInt(currMarking.getElementsByTagName("dd:ValueFloat").item(0).getTextContent());
118
119                     switch (currMarking.getElementsByTagName("dd:Unit").item(0).getTextContent().toLowerCase()) {
120                         case "microliters":
121                             marking = marking / 1000; // Convert from microlitres to millilitres
122                             break;
123                         case "liters":
124                             marking = marking * 1000; // Convert to litres to millilitres
125                     }
126
127                     totalMarking = totalMarking + marking; // Sum the marking counts together
128                 }
129             }
130
131             if (hasPagesRemaining) {
132                 pagesRemaining = Integer.parseInt(((Element) currInk).getElementsByTagName("dd:EstimatedPagesRemaining")
133                         .item(0).getTextContent());
134             }
135
136             switch (inkName.toLowerCase()) {
137                 case "black":
138                     inkBlack = Integer.parseInt(inkRemaining);
139                     inkBlackMarking = totalMarking;
140                     inkBlackPagesRemaining = pagesRemaining;
141                     break;
142
143                 case "yellow":
144                     inkYellow = Integer.parseInt(inkRemaining);
145                     inkYellowMarking = totalMarking;
146                     inkYellowPagesRemaining = pagesRemaining;
147                     break;
148
149                 case "magenta":
150                     inkMagenta = Integer.parseInt(inkRemaining);
151                     inkMagentaMarking = totalMarking;
152                     inkMagentaPagesRemaining = pagesRemaining;
153                     break;
154
155                 case "cyan":
156                     inkCyan = Integer.parseInt(inkRemaining);
157                     inkCyanMarking = totalMarking;
158                     inkCyanPagesRemaining = pagesRemaining;
159                     break;
160
161                 case "cyanmagentayellow":
162                     inkColor = Integer.parseInt(inkRemaining);
163                     inkColorMarking = totalMarking;
164                     inkColorPagesRemaining = pagesRemaining;
165                     break;
166             }
167         }
168
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());
173         }
174
175         NodeList totalImpressions = document.getDocumentElement().getElementsByTagName("dd:TotalImpressions");
176         if (totalImpressions.getLength() > 0) {
177             this.totalImpressions = Integer.parseInt(totalImpressions.item(0).getTextContent());
178         }
179
180         NodeList totalColorImpressions = document.getDocumentElement().getElementsByTagName("dd:ColorImpressions");
181         if (totalColorImpressions.getLength() > 0) {
182             this.totalColorImpressions = Integer.parseInt(totalColorImpressions.item(0).getTextContent());
183         }
184
185         NodeList totalMonochromeImpressions = document.getDocumentElement()
186                 .getElementsByTagName("dd:MonochromeImpressions");
187         if (totalMonochromeImpressions.getLength() > 0) {
188             this.totalMonochromeImpressions = Integer.parseInt(totalMonochromeImpressions.item(0).getTextContent());
189         }
190
191         NodeList totalSubscriptionImpressions = document.getDocumentElement()
192                 .getElementsByTagName("pudyn:SubscriptionImpressions");
193         if (totalSubscriptionImpressions.getLength() > 0) {
194             this.totalSubscriptionImpressions = Integer.parseInt(totalSubscriptionImpressions.item(0).getTextContent());
195         }
196
197         NodeList mispickEvents = document.getDocumentElement().getElementsByTagName("dd:MispickEvents");
198         if (mispickEvents.getLength() > 0) {
199             this.mispickEvents = Integer.parseInt(mispickEvents.item(0).getTextContent());
200         }
201
202         NodeList frontpanelCancelCount = document.getDocumentElement()
203                 .getElementsByTagName("dd:TotalFrontPanelCancelPresses");
204         if (frontpanelCancelCount.getLength() > 0) {
205             this.frontpanelCancelCount = Integer.parseInt(frontpanelCancelCount.item(0).getTextContent());
206         }
207
208         // Print Apps
209         NodeList printAppsSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:PrintApplicationSubunit");
210         if (printAppsSubUnit.getLength() > 0) {
211             Element currPrintAppsSubUnit = (Element) printAppsSubUnit.item(0);
212
213             NodeList cloudPrintImpressions = currPrintAppsSubUnit.getElementsByTagName("dd:CloudPrintImpressions");
214
215             if (cloudPrintImpressions.getLength() > 0) {
216                 this.cloudPrintImpressions = Integer.parseInt(cloudPrintImpressions.item(0).getTextContent());
217             }
218         }
219
220         // Scan
221         NodeList scanSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:ScanApplicationSubunit");
222         if (scanSubUnit.getLength() > 0) {
223             Element currScanSubUnit = (Element) scanSubUnit.item(0);
224
225             this.scanAdfCount = setInt("dd:AdfImages", currScanSubUnit);
226             this.scanFlatbedCount = setInt("dd:FlatbedImages", currScanSubUnit);
227
228             this.scanToEmailCount = setInt("dd:ImagesSentToEmail", currScanSubUnit);
229             this.scanToFolderCount = setInt("dd:ImagesSentToFolder", currScanSubUnit);
230
231             this.scanToHostCount = setInt("dd:ScanToHostImages", currScanSubUnit);
232         }
233
234         // Scanner
235         NodeList scannerSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:ScannerEngineSubunit");
236         if (scannerSubUnit.getLength() > 0) {
237             Element currScannerSubUnit = (Element) scannerSubUnit.item(0);
238
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);
243         }
244
245         // Copy
246         NodeList copySubUnit = document.getDocumentElement().getElementsByTagName("pudyn:CopyApplicationSubunit");
247         if (copySubUnit.getLength() > 0) {
248             Element currCopySubUnit = (Element) copySubUnit.item(0);
249
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);
255         }
256
257         // App Usage
258         NodeList appSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:MobileApplicationSubunit");
259         if (appSubUnit.getLength() > 0) {
260             Element currAppSubUnit = (Element) appSubUnit.item(0);
261
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");
274         }
275     }
276
277     private static int setIntCollateDirectChildren(Element parentNode, String collateTagName,
278             String collateTagNameValue, String valueTagName) {
279         int value = 0;
280
281         for (Node n = parentNode.getFirstChild(); n != null; n = n.getNextSibling()) {
282             if (n instanceof Element nodeItem) {
283                 if (nodeItem.getElementsByTagName(collateTagName).item(0).getTextContent()
284                         .equalsIgnoreCase(collateTagNameValue)) {
285                     int nodeValue = Integer
286                             .parseInt(nodeItem.getElementsByTagName(valueTagName).item(0).getTextContent());
287
288                     value += nodeValue;
289                 }
290             }
291         }
292
293         return value;
294     }
295
296     private int setInt(String tagName, Element parentNode) {
297         NodeList nodeList = parentNode.getElementsByTagName(tagName);
298         if (nodeList.getLength() > 0) {
299             return Integer.parseInt(nodeList.item(0).getTextContent());
300         }
301         return 0;
302     }
303
304     public int getFrontPanelCancelCount() {
305         return frontpanelCancelCount;
306     }
307
308     public int getTotalSubscriptionImpressions() {
309         return totalSubscriptionImpressions;
310     }
311
312     public int getMispickEvents() {
313         return mispickEvents;
314     }
315
316     public int getTotalMonochromeImpressions() {
317         return totalMonochromeImpressions;
318     }
319
320     public int getTotalColorImpressions() {
321         return totalColorImpressions;
322     }
323
324     public int getTotalImpressions() {
325         return totalImpressions;
326     }
327
328     public int getCloudPrintImpressions() {
329         return cloudPrintImpressions;
330     }
331
332     public int getJamEvents() {
333         return jamEvents;
334     }
335
336     public int getInkBlack() {
337         return inkBlack;
338     }
339
340     public float getInkBlackMarking() {
341         return inkBlackMarking;
342     }
343
344     public int getInkCyan() {
345         return inkCyan;
346     }
347
348     public float getInkCyanMarking() {
349         return inkCyanMarking;
350     }
351
352     public int getInkMagenta() {
353         return inkMagenta;
354     }
355
356     public float getInkMagentaMarking() {
357         return inkMagentaMarking;
358     }
359
360     public int getInkYellow() {
361         return inkYellow;
362     }
363
364     public float getInkYellowMarking() {
365         return inkYellowMarking;
366     }
367
368     public int getInkBlackPagesRemaining() {
369         return inkBlackPagesRemaining;
370     }
371
372     public int getInkColorPagesRemaining() {
373         return inkColorPagesRemaining;
374     }
375
376     public int getInkMagentaPagesRemaining() {
377         return inkMagentaPagesRemaining;
378     }
379
380     public int getInkCyanPagesRemaining() {
381         return inkCyanPagesRemaining;
382     }
383
384     public int getInkYellowPagesRemaining() {
385         return inkYellowPagesRemaining;
386     }
387
388     public int getInkColor() {
389         return inkColor;
390     }
391
392     public float getInkColorMarking() {
393         return inkColorMarking;
394     }
395
396     public int getScanAdfCount() {
397         return scanAdfCount;
398     }
399
400     public int getScanFlatbedCount() {
401         return scanFlatbedCount;
402     }
403
404     public int getScanToEmailCount() {
405         return scanToEmailCount;
406     }
407
408     public int getScanToFolderCount() {
409         return scanToFolderCount;
410     }
411
412     public int getScanToHostCount() {
413         return scanToHostCount;
414     }
415
416     public int getAppWindowsCount() {
417         return appWindowsCount;
418     }
419
420     public int getAppOSXCount() {
421         return appOsxCount;
422     }
423
424     public int getAppIosCount() {
425         return appIosCount;
426     }
427
428     public int getAppAndroidCount() {
429         return appAndroidCount;
430     }
431
432     public int getAppSamsungCount() {
433         return appSamsungCount;
434     }
435
436     public int getAppChromeCount() {
437         return appChromeCount;
438     }
439
440     public int getScannerAdfCount() {
441         return scannerAdfCount;
442     }
443
444     public int getScannerFlatbedCount() {
445         return scannerFlatbedCount;
446     }
447
448     public int getScannerJamEvents() {
449         return scannerJamEvents;
450     }
451
452     public int getScannerMispickEvents() {
453         return scannerMispickEvents;
454     }
455
456     public int getCopyAdfCount() {
457         return copyAdfCount;
458     }
459
460     public int getCopyFlatbedCount() {
461         return copyFlatbedCount;
462     }
463
464     public int getCopyTotalImpressions() {
465         return copyTotalImpressions;
466     }
467
468     public int getCopyTotalColorImpressions() {
469         return copyTotalColorImpressions;
470     }
471
472     public int getCopyTotalMonochromeImpressions() {
473         return copyTotalMonochromeImpressions;
474     }
475 }