From 5cca544d7c8bdca7e489668fcaddfce79a2a3e80 Mon Sep 17 00:00:00 2001 From: Oleg Vivtash Date: Sun, 17 Oct 2021 15:04:47 +0300 Subject: [PATCH] [mikrotik] Basic PPP/LTE interface support (#11395) Signed-off-by: Oleg Vivtash Signed-off-by: Nick Waterton --- .../org.openhab.binding.mikrotik/README.md | 2 + .../MikrotikInterfaceThingHandler.java | 40 +++++++++- .../internal/model/RouterosDevice.java | 4 + .../internal/model/RouterosInterfaceType.java | 4 +- .../internal/model/RouterosLTEInterface.java | 69 +++++++++++++++++ .../model/RouterosPPPCliInterface.java | 77 +++++++++++++++++++ 6 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/model/RouterosLTEInterface.java create mode 100644 bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/model/RouterosPPPCliInterface.java diff --git a/bundles/org.openhab.binding.mikrotik/README.md b/bundles/org.openhab.binding.mikrotik/README.md index c45dbb678bc35..d0fc821db9dbc 100644 --- a/bundles/org.openhab.binding.mikrotik/README.md +++ b/bundles/org.openhab.binding.mikrotik/README.md @@ -106,6 +106,8 @@ At the moment the binding supports the following RouterOS interface types: * `wlan` * `cap` * `pppoe-out` +* `ppp-out` +* `lte` * `l2tp-in` * `l2tp-out` diff --git a/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/handler/MikrotikInterfaceThingHandler.java b/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/handler/MikrotikInterfaceThingHandler.java index ab947d4466241..c9ce0f9a88747 100644 --- a/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/handler/MikrotikInterfaceThingHandler.java +++ b/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/handler/MikrotikInterfaceThingHandler.java @@ -28,6 +28,8 @@ import org.openhab.binding.mikrotik.internal.model.RouterosInterfaceBase; import org.openhab.binding.mikrotik.internal.model.RouterosL2TPCliInterface; import org.openhab.binding.mikrotik.internal.model.RouterosL2TPSrvInterface; +import org.openhab.binding.mikrotik.internal.model.RouterosLTEInterface; +import org.openhab.binding.mikrotik.internal.model.RouterosPPPCliInterface; import org.openhab.binding.mikrotik.internal.model.RouterosPPPoECliInterface; import org.openhab.binding.mikrotik.internal.model.RouterosWlanInterface; import org.openhab.binding.mikrotik.internal.util.RateCalculator; @@ -92,7 +94,7 @@ protected void refreshModels() { RouterosInterfaceBase rosInterface = routeros.findInterface(cfg.name); this.iface = rosInterface; if (rosInterface == null) { - String statusMsg = String.format("Interface %s is not found in RouterOS for thing %s", cfg.name, + String statusMsg = String.format("RouterOS interface %s is not found for thing %s", cfg.name, getThing().getUID()); updateStatus(OFFLINE, GONE, statusMsg); } else { @@ -184,12 +186,16 @@ protected void refreshChannel(ChannelUID channelUID) { newState = getCapIterfaceChannelState(channelID); } else if (iface instanceof RouterosWlanInterface) { newState = getWlanIterfaceChannelState(channelID); + } else if (iface instanceof RouterosPPPCliInterface) { + newState = getPPPCliChannelState(channelID); } else if (iface instanceof RouterosPPPoECliInterface) { newState = getPPPoECliChannelState(channelID); } else if (iface instanceof RouterosL2TPSrvInterface) { newState = getL2TPSrvChannelState(channelID); } else if (iface instanceof RouterosL2TPCliInterface) { newState = getL2TPCliChannelState(channelID); + } else if (iface instanceof RouterosLTEInterface) { + newState = getLTEChannelState(channelID); } } } @@ -274,6 +280,22 @@ protected State getPPPoECliChannelState(String channelID) { } } + protected State getPPPCliChannelState(String channelID) { + RouterosPPPCliInterface pppCli = (RouterosPPPCliInterface) this.iface; + if (pppCli == null) { + return UnDefType.UNDEF; + } + + switch (channelID) { + case MikrotikBindingConstants.CHANNEL_STATE: + return StateUtil.stringOrNull(pppCli.getStatus()); + case MikrotikBindingConstants.CHANNEL_UP_SINCE: + return StateUtil.timeOrNull(pppCli.getUptimeStart()); + default: + return UnDefType.UNDEF; + } + } + protected State getL2TPSrvChannelState(String channelID) { RouterosL2TPSrvInterface vpnSrv = (RouterosL2TPSrvInterface) this.iface; if (vpnSrv == null) { @@ -306,6 +328,22 @@ protected State getL2TPCliChannelState(String channelID) { } } + protected State getLTEChannelState(String channelID) { + RouterosLTEInterface lte = (RouterosLTEInterface) this.iface; + if (lte == null) { + return UnDefType.UNDEF; + } + + switch (channelID) { + case MikrotikBindingConstants.CHANNEL_STATE: + return StateUtil.stringOrNull(lte.getStatus()); + case MikrotikBindingConstants.CHANNEL_UP_SINCE: + return StateUtil.timeOrNull(lte.getUptimeStart()); + default: + return UnDefType.UNDEF; + } + } + @Override protected void executeCommand(ChannelUID channelUID, Command command) { if (iface == null) { diff --git a/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/model/RouterosDevice.java b/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/model/RouterosDevice.java index 473613281671f..0c5fe96ec77d6 100644 --- a/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/model/RouterosDevice.java +++ b/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/model/RouterosDevice.java @@ -87,10 +87,14 @@ private static Optional createTypedInterface(Map props) { + super(props); + } + + @Override + public RouterosInterfaceType getDesignedType() { + return RouterosInterfaceType.LTE; + } + + @Override + public String getApiType() { + return "lte"; + } + + @Override + public boolean hasDetailedReport() { + return false; + } + + @Override + public boolean hasMonitor() { + return false; + } + + public @Nullable String getStatus() { + // I only have an RNDIS/HiLink 4G modem which doesn't report status at all. This should be tested/fixed + // by someone who has PCIe/serial 4G modem. + return getProp("status"); + } + + public @Nullable String getUptime() { + // Same as above. Also a custom info command need to be implemented for this to work. + // https://forum.mikrotik.com/viewtopic.php?t=164035#p808281 + return getProp("session-uptime"); + } + + public @Nullable LocalDateTime getUptimeStart() { + return Converter.routerosPeriodBack(getUptime()); + } +} diff --git a/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/model/RouterosPPPCliInterface.java b/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/model/RouterosPPPCliInterface.java new file mode 100644 index 0000000000000..e0bd6bb33863b --- /dev/null +++ b/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/model/RouterosPPPCliInterface.java @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.mikrotik.internal.model; + +import java.time.LocalDateTime; +import java.util.Map; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.mikrotik.internal.util.Converter; + +/** + * The {@link RouterosPPPCliInterface} is a model class for `pppoe-out` interface models having casting accessors for + * data that is specific to this network interface kind. Is a subclass of {@link RouterosInterfaceBase}. + * + * @author Oleg Vivtash - Initial contribution + */ +@NonNullByDefault +public class RouterosPPPCliInterface extends RouterosInterfaceBase { + public RouterosPPPCliInterface(Map props) { + super(props); + } + + @Override + public RouterosInterfaceType getDesignedType() { + return RouterosInterfaceType.PPP_CLIENT; + } + + @Override + public String getApiType() { + return "ppp-client"; + } + + @Override + public boolean hasDetailedReport() { + return false; + } + + @Override + public boolean hasMonitor() { + return true; + } + + public @Nullable String getMacAddress() { + return null; + } + + public @Nullable String getLocalAddress() { + return getProp("local-address"); + } + + public @Nullable String getRemoteAddress() { + return getProp("remote-address"); + } + + public @Nullable String getStatus() { + return getProp("status"); + } + + public @Nullable String getUptime() { + return getProp("uptime"); + } + + public @Nullable LocalDateTime getUptimeStart() { + return Converter.routerosPeriodBack(getUptime()); + } +}