diff --git a/src/se/hal/plugin/netscan/NetScanController.java b/src/se/hal/plugin/netscan/NetScanController.java index a6328461..fb6e3726 100755 --- a/src/se/hal/plugin/netscan/NetScanController.java +++ b/src/se/hal/plugin/netscan/NetScanController.java @@ -1,7 +1,116 @@ package se.hal.plugin.netscan; +import se.hal.intf.*; +import se.hal.struct.devicedata.SwitchEventData; +import zutil.log.LogUtil; +import zutil.net.InetScanner; +import zutil.net.InetScanner.InetScanListener; +import zutil.osal.MultiCommandExecutor; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; + /** * Created by Ziver on 2016-09-30. */ -public class NetScanController { +public class NetScanController implements HalEventController, HalAutoScannableController, InetScanListener, Runnable{ + public static Logger logger = LogUtil.getLogger(); + private static final int NETWORK_SYNC_INTERVAL = 3 * 60 * 60 * 1000; // 3 hours + private static final int PING_INTERVAL = 10 * 1000; // 10 sec + + private ScheduledExecutorService executor; + private HalEventReportListener listener; + private ArrayList devices = new ArrayList<>(); + + + + @Override + public boolean isAvailable() { + return true; + } + + @Override + public void initialize() throws Exception { + executor = Executors.newScheduledThreadPool(1); + executor.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + try { + logger.fine("Starting network scan..."); + InetScanner scanner = new InetScanner(); + scanner.setListener(NetScanController.this); + scanner.scan(InetAddress.getLocalHost()); + logger.fine("Network scan done"); + } catch (Exception e) { + e.printStackTrace(); + } + } + }, 30_000, NETWORK_SYNC_INTERVAL, TimeUnit.MILLISECONDS); + executor.scheduleAtFixedRate(NetScanController.this, 10_001, PING_INTERVAL, TimeUnit.MILLISECONDS); + } + + @Override + public void run() { + try{ + MultiCommandExecutor executor = new MultiCommandExecutor(); + for (int i = 0; i < devices.size(); i++) { + NetworkDevice device = devices.get(i); + if (listener != null) { + logger.fine("Pinging ip: "+device.getIp()); + boolean online = InetScanner.isReachable(InetAddress.getByName(device.getIp()), executor); + listener.reportReceived(device, new SwitchEventData(online, System.currentTimeMillis())); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + @Override + public void foundInetAddress(InetAddress ip) { + logger.fine("Detected ip: "+ip.getHostAddress()); + if (listener != null) + listener.reportReceived( + new NetworkDevice(ip.getHostAddress()), + new SwitchEventData(true, System.currentTimeMillis())); + } + + + + @Override + public void register(HalEventConfig event) { + if (event instanceof NetworkDevice) + devices.add((NetworkDevice) event); + } + @Override + public void deregister(HalEventConfig event) { + devices.remove(event); + } + @Override + public int size() { + return devices.size(); + } + + + @Override + public void send(HalEventConfig eventConfig, HalEventData eventData) { } + + + @Override + public void setListener(HalEventReportListener listener) { + this.listener = listener; + } + + + @Override + public void close() { + if (executor != null){ + executor.shutdown(); + executor = null; + } + } } diff --git a/src/se/hal/plugin/netscan/NetworkDevice.java b/src/se/hal/plugin/netscan/NetworkDevice.java new file mode 100644 index 00000000..d3dd2abf --- /dev/null +++ b/src/se/hal/plugin/netscan/NetworkDevice.java @@ -0,0 +1,50 @@ +package se.hal.plugin.netscan; + +import se.hal.intf.HalEventConfig; +import se.hal.intf.HalEventController; +import se.hal.intf.HalEventData; +import se.hal.struct.devicedata.SwitchEventData; +import zutil.ui.Configurator; + +import java.net.InetAddress; + +/** + * Created by Ziver on 2016-10-02. + */ +public class NetworkDevice implements HalEventConfig { + + @Configurator.Configurable("IP Address") + private String ip; + + + + public NetworkDevice() { } + public NetworkDevice(String hostAddress) { + this.ip = hostAddress; + } + + + public String getIp() { + return ip; + } + + @Override + public String toString(){ + return "IP: "+ip; + } + @Override + public boolean equals(Object obj){ + if (obj instanceof NetworkDevice) + return ip != null && ip.equals(((NetworkDevice) obj).ip); + return false; + } + + @Override + public Class getEventControllerClass() { + return NetScanController.class; + } + @Override + public Class getEventDataClass() { + return SwitchEventData.class; + } +} diff --git a/src/se/hal/plugin/netscan/plugin.json b/src/se/hal/plugin/netscan/plugin.json new file mode 100644 index 00000000..67e3db04 --- /dev/null +++ b/src/se/hal/plugin/netscan/plugin.json @@ -0,0 +1,8 @@ +{ + "version": 1.0, + "name": "Network Scanner", + "interfaces": [ + {"se.hal.intf.HalAutoScannableController": "se.hal.plugin.netscan.NetScanController"}, + {"se.hal.intf.HalEventConfig": "se.hal.plugin.netscan.NetworkDevice"} + ] +} \ No newline at end of file diff --git a/src/se/hal/plugin/raspberry/hardware/RPiDS18B20.java b/src/se/hal/plugin/raspberry/hardware/RPiDS18B20.java index 77d9f78b..43039649 100755 --- a/src/se/hal/plugin/raspberry/hardware/RPiDS18B20.java +++ b/src/se/hal/plugin/raspberry/hardware/RPiDS18B20.java @@ -57,8 +57,8 @@ public class RPiDS18B20 implements RPiSensor, Runnable { controller.sendDataReport( new RPiTemperatureSensor(w1Address), new TemperatureSensorData( - System.currentTimeMillis(), - device.getTemperature(TemperatureScale.CELSIUS) + device.getTemperature(TemperatureScale.CELSIUS), + System.currentTimeMillis() )); break; } diff --git a/src/se/hal/plugin/tellstick/protocol/NexaSelfLearningProtocol.java b/src/se/hal/plugin/tellstick/protocol/NexaSelfLearningProtocol.java index 5d735a97..8271dafc 100755 --- a/src/se/hal/plugin/tellstick/protocol/NexaSelfLearningProtocol.java +++ b/src/se/hal/plugin/tellstick/protocol/NexaSelfLearningProtocol.java @@ -163,7 +163,7 @@ public class NexaSelfLearningProtocol extends TellstickProtocol { */ list.add(new TellstickDecodedEntry( new NexaSelfLearning(struct.house, struct.group, struct.unit), - new SwitchEventData(struct.enable) + new SwitchEventData(struct.enable, System.currentTimeMillis()) )); /* }*/ return list; diff --git a/src/se/hal/plugin/tellstick/protocol/Oregon0x1A2DProtocol.java b/src/se/hal/plugin/tellstick/protocol/Oregon0x1A2DProtocol.java index 9a719e7c..757aa1b0 100755 --- a/src/se/hal/plugin/tellstick/protocol/Oregon0x1A2DProtocol.java +++ b/src/se/hal/plugin/tellstick/protocol/Oregon0x1A2DProtocol.java @@ -67,6 +67,7 @@ public class Oregon0x1A2DProtocol extends TellstickProtocol { // Create return objects + long timestamp = System.currentTimeMillis(); boolean humidityFound=false, temperatureFound=false; ArrayList list = new ArrayList<>(); for (Oregon0x1A2D device : TellstickSerialComm.getInstance().getRegisteredDevices(Oregon0x1A2D.class)) { @@ -78,20 +79,20 @@ public class Oregon0x1A2DProtocol extends TellstickProtocol { sensorType = OregonSensorType.POWER; switch (sensorType){ case HUMIDITY: - dataObj = new HumiditySensorData(humidity); + dataObj = new HumiditySensorData(humidity, timestamp); humidityFound = true; break; case LIGHT: - dataObj = new LightSensorData(temperature); + dataObj = new LightSensorData(temperature, timestamp); temperatureFound = true; break; case TEMPERATURE: - dataObj = new TemperatureSensorData(temperature); + dataObj = new TemperatureSensorData(temperature, timestamp); temperatureFound = true; break; default: case POWER: - dataObj = new PowerConsumptionSensorData(temperature); + dataObj = new PowerConsumptionSensorData(temperature, timestamp); temperatureFound = true; break; @@ -102,11 +103,11 @@ public class Oregon0x1A2DProtocol extends TellstickProtocol { if (!temperatureFound) list.add(new TellstickDecodedEntry( new Oregon0x1A2D(address, OregonSensorType.TEMPERATURE), - new TemperatureSensorData(temperature))); + new TemperatureSensorData(temperature, timestamp))); if (!humidityFound && humidity>0.0) list.add(new TellstickDecodedEntry( new Oregon0x1A2D(address, OregonSensorType.HUMIDITY), - new HumiditySensorData(humidity))); + new HumiditySensorData(humidity, timestamp))); return list; } diff --git a/src/se/hal/struct/devicedata/DimmerEventData.java b/src/se/hal/struct/devicedata/DimmerEventData.java index a61739c4..7a496877 100755 --- a/src/se/hal/struct/devicedata/DimmerEventData.java +++ b/src/se/hal/struct/devicedata/DimmerEventData.java @@ -33,8 +33,9 @@ public class DimmerEventData extends HalEventData { public DimmerEventData() { } - public DimmerEventData(double dimmValue) { + public DimmerEventData(double dimmValue, long timestamp) { this.dimmValue = dimmValue; + this.setTimestamp(timestamp); } diff --git a/src/se/hal/struct/devicedata/HumiditySensorData.java b/src/se/hal/struct/devicedata/HumiditySensorData.java index 22230fa2..434e3fa0 100755 --- a/src/se/hal/struct/devicedata/HumiditySensorData.java +++ b/src/se/hal/struct/devicedata/HumiditySensorData.java @@ -12,8 +12,9 @@ public class HumiditySensorData extends HalSensorData { public HumiditySensorData() { } - public HumiditySensorData(double humidity) { + public HumiditySensorData(double humidity, long timestamp) { this.humidity = humidity; + this.setTimestamp(timestamp); } diff --git a/src/se/hal/struct/devicedata/LightSensorData.java b/src/se/hal/struct/devicedata/LightSensorData.java index 369c2e44..f358c556 100755 --- a/src/se/hal/struct/devicedata/LightSensorData.java +++ b/src/se/hal/struct/devicedata/LightSensorData.java @@ -11,8 +11,9 @@ public class LightSensorData extends HalSensorData { public LightSensorData(){} - public LightSensorData(double lux){ + public LightSensorData(double lux, long timestamp){ this.lux = lux; + this.setTimestamp(timestamp); } diff --git a/src/se/hal/struct/devicedata/PowerConsumptionSensorData.java b/src/se/hal/struct/devicedata/PowerConsumptionSensorData.java index 27ff787b..32a6fb24 100755 --- a/src/se/hal/struct/devicedata/PowerConsumptionSensorData.java +++ b/src/se/hal/struct/devicedata/PowerConsumptionSensorData.java @@ -12,11 +12,8 @@ public class PowerConsumptionSensorData extends HalSensorData { public PowerConsumptionSensorData() { } - public PowerConsumptionSensorData(double wattHours) { + public PowerConsumptionSensorData(double wattHours, long timestamp) { this.wattHours = wattHours; - } - public PowerConsumptionSensorData(long timestamp, double wattHours) { - this(wattHours); super.setTimestamp(timestamp); } diff --git a/src/se/hal/struct/devicedata/SwitchEventData.java b/src/se/hal/struct/devicedata/SwitchEventData.java index 01dcf588..36c2e8c1 100755 --- a/src/se/hal/struct/devicedata/SwitchEventData.java +++ b/src/se/hal/struct/devicedata/SwitchEventData.java @@ -33,8 +33,9 @@ public class SwitchEventData extends HalEventData { public SwitchEventData() { } - public SwitchEventData(boolean enabled) { + public SwitchEventData(boolean enabled, long timestamp) { this.enabled = enabled; + this.setTimestamp(timestamp); } public void turnOn(){ diff --git a/src/se/hal/struct/devicedata/TemperatureSensorData.java b/src/se/hal/struct/devicedata/TemperatureSensorData.java index 158bb4a9..81fc03ba 100755 --- a/src/se/hal/struct/devicedata/TemperatureSensorData.java +++ b/src/se/hal/struct/devicedata/TemperatureSensorData.java @@ -11,11 +11,8 @@ public class TemperatureSensorData extends HalSensorData { public TemperatureSensorData(){} - public TemperatureSensorData(double temperature){ + public TemperatureSensorData(double temperature, long timestamp){ this.temperature = temperature; - } - public TemperatureSensorData(long timestamp, double temperature){ - this(temperature); super.setTimestamp(timestamp); }