From f618a25eb9e32d9e3ace2be232aa2ef54ed68c5f Mon Sep 17 00:00:00 2001 From: Jeremy Date: Thu, 1 Feb 2024 12:05:03 -0500 Subject: [PATCH] Refactor item state presentation format pattern regexp (#652) Signed-off-by: jsetton --- lambda/openhab/index.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lambda/openhab/index.js b/lambda/openhab/index.js index c26ce2c7..0e7a1cd2 100644 --- a/lambda/openhab/index.js +++ b/lambda/openhab/index.js @@ -21,6 +21,13 @@ import { ItemType, ItemValue, UnitSymbol } from './constants.js'; * Defines openHAB class */ export default class OpenHAB { + /** + * Defines item state presentation format pattern + * @type {RegExp} + */ + static #STATE_PRESENTATION_PATTERN = + /%\d*(?:\.(?\d+))?(?[df])\s*(?:%unit%|[%]?(?.+))?$/; + /** * Constructor * @param {Object} config @@ -246,7 +253,7 @@ export default class OpenHAB { const type = (item.groupType || item.type).split(':')[0]; if (type === ItemType.DIMMER || type === ItemType.NUMBER || type === ItemType.ROLLERSHUTTER) { - const precision = OpenHAB.getStatePresentationPrecision(item.stateDescription?.pattern); + const precision = this.getStatePresentationPrecision(item.stateDescription?.pattern); const value = parseFloat(state); return isNaN(precision) ? value.toString() : value.toFixed(precision); @@ -262,7 +269,7 @@ export default class OpenHAB { * @return {Number} */ static getStatePresentationPrecision(pattern) { - const { precision, specifier } = pattern?.match(/%\d*(?:\.(?\d+))?(?[df])/)?.groups || {}; + const { precision, specifier } = pattern?.match(this.#STATE_PRESENTATION_PATTERN)?.groups || {}; return specifier === 'd' ? 0 : precision <= 16 ? parseInt(precision) : NaN; } @@ -273,8 +280,7 @@ export default class OpenHAB { * @return {String} */ static getStatePresentationUnitSymbol(pattern) { - return Object.values(UnitSymbol).find((symbol) => - new RegExp(`%\\d*(?:\\.\\d+)?[df]\\s*[%]?${symbol}$`).test(pattern) - ); + const { symbol } = pattern?.match(this.#STATE_PRESENTATION_PATTERN)?.groups || {}; + return Object.values(UnitSymbol).includes(symbol) ? symbol : undefined; } }