2 * Copyright (c) 2010-2022 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.dsmr.internal.device;
15 import java.util.List;
16 import java.util.stream.Collectors;
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.openhab.binding.dsmr.internal.device.connector.DSMRConnectorErrorEvent;
20 import org.openhab.binding.dsmr.internal.device.connector.DSMRConnectorListener;
21 import org.openhab.binding.dsmr.internal.device.cosem.CosemObject;
22 import org.openhab.binding.dsmr.internal.device.p1telegram.P1Telegram;
23 import org.openhab.binding.dsmr.internal.device.p1telegram.P1Telegram.TelegramState;
24 import org.openhab.binding.dsmr.internal.device.p1telegram.P1TelegramListener;
25 import org.openhab.binding.dsmr.internal.device.p1telegram.P1TelegramParser;
26 import org.openhab.binding.dsmr.internal.device.p1telegram.TelegramParser;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
31 * Helper listener to receive telegram data from the connector, send it to the parser and forward data or errors from
32 * the parser to the DSMR Device.
34 * @author M. Volaart - Initial contribution
35 * @author Hilbrand Bouwkamp - Moved this code out of the DSMRPort class, fixed some issues and reduced code
38 public class DSMRTelegramListener implements P1TelegramListener, DSMRConnectorListener {
40 private final Logger logger = LoggerFactory.getLogger(DSMRTelegramListener.class);
41 private final TelegramParser parser;
43 private @NonNullByDefault({}) DSMREventListener dsmrEventListener;
48 * @param eventListener listener to send received errors or messages to
50 public DSMRTelegramListener() {
51 parser = new P1TelegramParser(this);
55 * Constructs {@link DSMRTelegramListener} with a Smarty decryptor to first decrypt incoming messages.
57 * @param decryptionKey Smarty decryption key
59 public DSMRTelegramListener(String decryptionKey) {
60 parser = new SmartyDecrypter(new P1TelegramParser(this), this, decryptionKey);
64 * Set the DSMR event listener.
66 * @param eventListener the listener to set
68 public void setDsmrEventListener(DSMREventListener eventListener) {
69 this.dsmrEventListener = eventListener;
73 public void handleData(byte[] data, int length) {
74 parser.parse(data, length);
78 public void handleErrorEvent(DSMRConnectorErrorEvent portEvent) {
79 dsmrEventListener.handleErrorEvent(portEvent);
84 * Handler for cosemObjects received in a P1 telegram
86 * @param telegram the received telegram.
89 public void telegramReceived(P1Telegram telegram) {
90 final TelegramState telegramState = telegram.getTelegramState();
91 final List<CosemObject> cosemObjects = telegram.getCosemObjects();
93 if (logger.isTraceEnabled()) {
94 logger.trace("Received {} Cosem Objects with state: '{}'", cosemObjects.size(), telegramState);
96 if (telegramState == TelegramState.OK || telegramState == TelegramState.INVALID_ENCRYPTION_KEY) {
97 dsmrEventListener.handleTelegramReceived(telegram);
99 if (logger.isDebugEnabled()) {
100 logger.debug("Telegram received with error state '{}': {}", telegramState,
101 cosemObjects.stream().map(CosemObject::toString).collect(Collectors.joining(",")));
107 * @param lenientMode the lenientMode to set
109 public void setLenientMode(boolean lenientMode) {
110 parser.setLenientMode(lenientMode);