From cad11eed989dce2009ad87b8a45203ef9dd2a255 Mon Sep 17 00:00:00 2001 From: Antoine Prieels Date: Thu, 27 Feb 2020 09:48:21 +0000 Subject: [PATCH] [FIX] hw_drivers: Read weight from IoT Scale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We had two issues when reading the weight from a scale connected to the IoT Box : When using the '/hw_proxy/scale_read' route, if the same weight was read twice, the value in PoS was reset to 0. If the product was placed on the scale before opening the weight screen, the weight was never read. closes odoo/odoo#46432 X-original-commit: a08c5157f0b042e2ee250fc7b431b90451c7781a Signed-off-by: Antoine Prieƫls --- addons/hw_drivers/drivers/SerialScaleDriver.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/addons/hw_drivers/drivers/SerialScaleDriver.py b/addons/hw_drivers/drivers/SerialScaleDriver.py index 42dbd6a9f2d..eb8d30623c1 100644 --- a/addons/hw_drivers/drivers/SerialScaleDriver.py +++ b/addons/hw_drivers/drivers/SerialScaleDriver.py @@ -93,6 +93,7 @@ class ScaleReadOldRoute(http.Controller): class ScaleDriver(SerialDriver): """Abstract base class for scale drivers.""" + last_sent_value = None def __init__(self, device): self._device_type = 'scale' @@ -145,6 +146,7 @@ class ScaleDriver(SerialDriver): """Reads the scale current weight value and pushes it to the frontend.""" self._read_weight() + self.last_sent_value = self.data['value'] event_manager.device_changed(self) def _set_zero_action(self, data): @@ -183,10 +185,11 @@ class ScaleDriver(SerialDriver): self._connection.write(protocol.measureCommand + protocol.commandTerminator) answer = self._get_raw_response(self._connection) match = re.search(self._protocol.measureRegexp, answer) - self.data = { - 'value': float(match.group(1)) if match else None, - 'status': self._status - } + if match: + self.data = { + 'value': float(match.group(1)), + 'status': self._status + } # Ensures compatibility with older versions of Odoo def _scale_read_old_route(self): @@ -200,7 +203,8 @@ class ScaleDriver(SerialDriver): with self._device_lock: self._read_weight() - if self.data['value'] is not None or self._status['status'] == self.STATUS_ERROR: + if self.data['value'] != self.last_sent_value or self._status['status'] == self.STATUS_ERROR: + self.last_sent_value = self.data['value'] event_manager.device_changed(self) @@ -274,7 +278,8 @@ class AdamEquipmentDriver(ScaleDriver): with self._device_lock: self._read_weight() self._check_last_weight_time() - if self.data['value'] is not None or self._status['status'] == self.STATUS_ERROR: + if self.data['value'] != self.last_sent_value or self._status['status'] == self.STATUS_ERROR: + self.last_sent_value = self.data['value'] event_manager.device_changed(self) else: time.sleep(0.5)