|
20 | 20 | import org.openhab.core.library.types.DecimalType; |
21 | 21 | import org.openhab.core.library.types.QuantityType; |
22 | 22 | import org.openhab.core.library.unit.Units; |
| 23 | +import org.openhab.core.types.State; |
23 | 24 | import org.openhab.core.types.Type; |
24 | 25 |
|
25 | 26 | /** |
@@ -91,6 +92,60 @@ public static BigDecimal operator_divide(Number x, Number y) { |
91 | 92 | return xValue.divide(yValue, 8, RoundingMode.HALF_UP); |
92 | 93 | } |
93 | 94 |
|
| 95 | + // Calculation operators for states |
| 96 | + |
| 97 | + public static Number operator_plus(State x, State y) { |
| 98 | + return plus(stateToNumber(x), stateToNumber(y)); |
| 99 | + } |
| 100 | + |
| 101 | + public static Number operator_plus(State x, Number y) { |
| 102 | + return plus(stateToNumber(x), y); |
| 103 | + } |
| 104 | + |
| 105 | + public static Number operator_plus(Number x, State y) { |
| 106 | + return plus(x, stateToNumber(y)); |
| 107 | + } |
| 108 | + |
| 109 | + public static Number operator_minus(State x) { |
| 110 | + return minus(stateToNumber(x)); |
| 111 | + } |
| 112 | + |
| 113 | + public static Number operator_minus(State x, State y) { |
| 114 | + return minus(stateToNumber(x), stateToNumber(y)); |
| 115 | + } |
| 116 | + |
| 117 | + public static Number operator_minus(State x, Number y) { |
| 118 | + return minus(stateToNumber(x), y); |
| 119 | + } |
| 120 | + |
| 121 | + public static Number operator_minus(Number x, State y) { |
| 122 | + return minus(x, stateToNumber(y)); |
| 123 | + } |
| 124 | + |
| 125 | + public static Number operator_multiply(State x, State y) { |
| 126 | + return multiply(stateToNumber(x), stateToNumber(y)); |
| 127 | + } |
| 128 | + |
| 129 | + public static Number operator_multiply(State x, Number y) { |
| 130 | + return multiply(stateToNumber(x), y); |
| 131 | + } |
| 132 | + |
| 133 | + public static Number operator_multiply(Number x, State y) { |
| 134 | + return multiply(x, stateToNumber(y)); |
| 135 | + } |
| 136 | + |
| 137 | + public static Number operator_divide(State x, State y) { |
| 138 | + return divide(stateToNumber(x), stateToNumber(y)); |
| 139 | + } |
| 140 | + |
| 141 | + public static Number operator_divide(State x, Number y) { |
| 142 | + return divide(stateToNumber(x), y); |
| 143 | + } |
| 144 | + |
| 145 | + public static Number operator_divide(Number x, State y) { |
| 146 | + return divide(x, stateToNumber(y)); |
| 147 | + } |
| 148 | + |
94 | 149 | // Comparison operations between numbers |
95 | 150 |
|
96 | 151 | public static boolean operator_equals(Number left, Number right) { |
@@ -408,4 +463,62 @@ private static boolean oneIsQuantity(Number left, Number right) { |
408 | 463 | private static boolean isAbstractUnitOne(QuantityType<?> left) { |
409 | 464 | return Units.ONE.equals(left.getUnit()); |
410 | 465 | } |
| 466 | + |
| 467 | + private static Number stateToNumber(State state) { |
| 468 | + if (state == null) { |
| 469 | + return null; |
| 470 | + } |
| 471 | + if (state instanceof Number number) { |
| 472 | + return number; |
| 473 | + } |
| 474 | + throw new IllegalArgumentException( |
| 475 | + "State '" + state + "' of type '" + state.getClass().getSimpleName() + "' cannot be used as a number"); |
| 476 | + } |
| 477 | + |
| 478 | + private static Number plus(Number x, Number y) { |
| 479 | + if (x instanceof QuantityType<?> qx && y instanceof QuantityType<?> qy) { |
| 480 | + return operator_plus(qx, qy); |
| 481 | + } |
| 482 | + return operator_plus(x, y); |
| 483 | + } |
| 484 | + |
| 485 | + private static Number minus(Number x) { |
| 486 | + if (x instanceof QuantityType<?> qx) { |
| 487 | + return operator_minus(qx); |
| 488 | + } |
| 489 | + return operator_minus(x); |
| 490 | + } |
| 491 | + |
| 492 | + private static Number minus(Number x, Number y) { |
| 493 | + if (x instanceof QuantityType<?> qx && y instanceof QuantityType<?> qy) { |
| 494 | + return operator_minus(qx, qy); |
| 495 | + } |
| 496 | + return operator_minus(x, y); |
| 497 | + } |
| 498 | + |
| 499 | + private static Number multiply(Number x, Number y) { |
| 500 | + if (x instanceof QuantityType<?> qx && y instanceof QuantityType<?> qy) { |
| 501 | + return operator_multiply(qx, qy); |
| 502 | + } |
| 503 | + if (x instanceof QuantityType<?> qx) { |
| 504 | + return operator_multiply(qx, y); |
| 505 | + } |
| 506 | + if (y instanceof QuantityType<?> qy) { |
| 507 | + return operator_multiply(x, qy); |
| 508 | + } |
| 509 | + return operator_multiply(x, y); |
| 510 | + } |
| 511 | + |
| 512 | + private static Number divide(Number x, Number y) { |
| 513 | + if (x instanceof QuantityType<?> qx && y instanceof QuantityType<?> qy) { |
| 514 | + return operator_divide(qx, qy); |
| 515 | + } |
| 516 | + if (x instanceof QuantityType<?> qx) { |
| 517 | + return operator_divide(qx, y); |
| 518 | + } |
| 519 | + if (y instanceof QuantityType<?> qy) { |
| 520 | + return operator_divide(x, qy); |
| 521 | + } |
| 522 | + return operator_divide(x, y); |
| 523 | + } |
411 | 524 | } |
0 commit comments