[mikrotik] Basic PPP/LTE interface support (#11395)
Signed-off-by: Oleg Vivtash <oleg@vivtash.net>
This commit is contained in:
parent
27886d7234
commit
642a2b79dc
|
@ -106,6 +106,8 @@ At the moment the binding supports the following RouterOS interface types:
|
||||||
* `wlan`
|
* `wlan`
|
||||||
* `cap`
|
* `cap`
|
||||||
* `pppoe-out`
|
* `pppoe-out`
|
||||||
|
* `ppp-out`
|
||||||
|
* `lte`
|
||||||
* `l2tp-in`
|
* `l2tp-in`
|
||||||
* `l2tp-out`
|
* `l2tp-out`
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,8 @@ import org.openhab.binding.mikrotik.internal.model.RouterosEthernetInterface;
|
||||||
import org.openhab.binding.mikrotik.internal.model.RouterosInterfaceBase;
|
import org.openhab.binding.mikrotik.internal.model.RouterosInterfaceBase;
|
||||||
import org.openhab.binding.mikrotik.internal.model.RouterosL2TPCliInterface;
|
import org.openhab.binding.mikrotik.internal.model.RouterosL2TPCliInterface;
|
||||||
import org.openhab.binding.mikrotik.internal.model.RouterosL2TPSrvInterface;
|
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.RouterosPPPoECliInterface;
|
||||||
import org.openhab.binding.mikrotik.internal.model.RouterosWlanInterface;
|
import org.openhab.binding.mikrotik.internal.model.RouterosWlanInterface;
|
||||||
import org.openhab.binding.mikrotik.internal.util.RateCalculator;
|
import org.openhab.binding.mikrotik.internal.util.RateCalculator;
|
||||||
|
@ -92,7 +94,7 @@ public class MikrotikInterfaceThingHandler extends MikrotikBaseThingHandler<Inte
|
||||||
RouterosInterfaceBase rosInterface = routeros.findInterface(cfg.name);
|
RouterosInterfaceBase rosInterface = routeros.findInterface(cfg.name);
|
||||||
this.iface = rosInterface;
|
this.iface = rosInterface;
|
||||||
if (rosInterface == null) {
|
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());
|
getThing().getUID());
|
||||||
updateStatus(OFFLINE, GONE, statusMsg);
|
updateStatus(OFFLINE, GONE, statusMsg);
|
||||||
} else {
|
} else {
|
||||||
|
@ -184,12 +186,16 @@ public class MikrotikInterfaceThingHandler extends MikrotikBaseThingHandler<Inte
|
||||||
newState = getCapIterfaceChannelState(channelID);
|
newState = getCapIterfaceChannelState(channelID);
|
||||||
} else if (iface instanceof RouterosWlanInterface) {
|
} else if (iface instanceof RouterosWlanInterface) {
|
||||||
newState = getWlanIterfaceChannelState(channelID);
|
newState = getWlanIterfaceChannelState(channelID);
|
||||||
|
} else if (iface instanceof RouterosPPPCliInterface) {
|
||||||
|
newState = getPPPCliChannelState(channelID);
|
||||||
} else if (iface instanceof RouterosPPPoECliInterface) {
|
} else if (iface instanceof RouterosPPPoECliInterface) {
|
||||||
newState = getPPPoECliChannelState(channelID);
|
newState = getPPPoECliChannelState(channelID);
|
||||||
} else if (iface instanceof RouterosL2TPSrvInterface) {
|
} else if (iface instanceof RouterosL2TPSrvInterface) {
|
||||||
newState = getL2TPSrvChannelState(channelID);
|
newState = getL2TPSrvChannelState(channelID);
|
||||||
} else if (iface instanceof RouterosL2TPCliInterface) {
|
} else if (iface instanceof RouterosL2TPCliInterface) {
|
||||||
newState = getL2TPCliChannelState(channelID);
|
newState = getL2TPCliChannelState(channelID);
|
||||||
|
} else if (iface instanceof RouterosLTEInterface) {
|
||||||
|
newState = getLTEChannelState(channelID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,6 +280,22 @@ public class MikrotikInterfaceThingHandler extends MikrotikBaseThingHandler<Inte
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
protected State getL2TPSrvChannelState(String channelID) {
|
||||||
RouterosL2TPSrvInterface vpnSrv = (RouterosL2TPSrvInterface) this.iface;
|
RouterosL2TPSrvInterface vpnSrv = (RouterosL2TPSrvInterface) this.iface;
|
||||||
if (vpnSrv == null) {
|
if (vpnSrv == null) {
|
||||||
|
@ -306,6 +328,22 @@ public class MikrotikInterfaceThingHandler extends MikrotikBaseThingHandler<Inte
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
@Override
|
||||||
protected void executeCommand(ChannelUID channelUID, Command command) {
|
protected void executeCommand(ChannelUID channelUID, Command command) {
|
||||||
if (iface == null) {
|
if (iface == null) {
|
||||||
|
|
|
@ -87,10 +87,14 @@ public class RouterosDevice {
|
||||||
return Optional.of(new RouterosWlanInterface(interfaceProps));
|
return Optional.of(new RouterosWlanInterface(interfaceProps));
|
||||||
case PPPOE_CLIENT:
|
case PPPOE_CLIENT:
|
||||||
return Optional.of(new RouterosPPPoECliInterface(interfaceProps));
|
return Optional.of(new RouterosPPPoECliInterface(interfaceProps));
|
||||||
|
case PPP_CLIENT:
|
||||||
|
return Optional.of(new RouterosPPPCliInterface(interfaceProps));
|
||||||
case L2TP_SERVER:
|
case L2TP_SERVER:
|
||||||
return Optional.of(new RouterosL2TPSrvInterface(interfaceProps));
|
return Optional.of(new RouterosL2TPSrvInterface(interfaceProps));
|
||||||
case L2TP_CLIENT:
|
case L2TP_CLIENT:
|
||||||
return Optional.of(new RouterosL2TPCliInterface(interfaceProps));
|
return Optional.of(new RouterosL2TPCliInterface(interfaceProps));
|
||||||
|
case LTE:
|
||||||
|
return Optional.of(new RouterosLTEInterface(interfaceProps));
|
||||||
default:
|
default:
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,9 +27,11 @@ public enum RouterosInterfaceType {
|
||||||
BRIDGE("bridge"),
|
BRIDGE("bridge"),
|
||||||
WLAN("wlan"),
|
WLAN("wlan"),
|
||||||
CAP("cap"),
|
CAP("cap"),
|
||||||
|
PPP_CLIENT("ppp-out"),
|
||||||
PPPOE_CLIENT("pppoe-out"),
|
PPPOE_CLIENT("pppoe-out"),
|
||||||
L2TP_SERVER("l2tp-in"),
|
L2TP_SERVER("l2tp-in"),
|
||||||
L2TP_CLIENT("l2tp-out");
|
L2TP_CLIENT("l2tp-out"),
|
||||||
|
LTE("lte");
|
||||||
|
|
||||||
private final String typeName;
|
private final String typeName;
|
||||||
|
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue