Skip to content

Commit

Permalink
[mikrotik] Basic PPP/LTE interface support (openhab#11395)
Browse files Browse the repository at this point in the history
Signed-off-by: Oleg Vivtash <[email protected]>
  • Loading branch information
duhast authored Oct 17, 2021
1 parent 12c8647 commit 4c641ee
Show file tree
Hide file tree
Showing 6 changed files with 194 additions and 2 deletions.
2 changes: 2 additions & 0 deletions bundles/org.openhab.binding.mikrotik/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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);
}
}
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,14 @@ private static Optional<RouterosInterfaceBase> createTypedInterface(Map<String,
return Optional.of(new RouterosWlanInterface(interfaceProps));
case PPPOE_CLIENT:
return Optional.of(new RouterosPPPoECliInterface(interfaceProps));
case PPP_CLIENT:
return Optional.of(new RouterosPPPCliInterface(interfaceProps));
case L2TP_SERVER:
return Optional.of(new RouterosL2TPSrvInterface(interfaceProps));
case L2TP_CLIENT:
return Optional.of(new RouterosL2TPCliInterface(interfaceProps));
case LTE:
return Optional.of(new RouterosLTEInterface(interfaceProps));
default:
return Optional.empty();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,11 @@ public enum RouterosInterfaceType {
BRIDGE("bridge"),
WLAN("wlan"),
CAP("cap"),
PPP_CLIENT("ppp-out"),
PPPOE_CLIENT("pppoe-out"),
L2TP_SERVER("l2tp-in"),
L2TP_CLIENT("l2tp-out");
L2TP_CLIENT("l2tp-out"),
LTE("lte");

private final String typeName;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/**
* 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 RouterosLTEInterface} is a model class for `lte` 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 RouterosLTEInterface extends RouterosInterfaceBase {
public RouterosLTEInterface(Map<String, String> 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());
}
}
Original file line number Diff line number Diff line change
@@ -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<String, String> 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());
}
}

0 comments on commit 4c641ee

Please sign in to comment.