/**
*
* Copyright (c) 2009-2016 Freedomotic team
* http://freedomotic.com
*
* This file is part of Freedomotic
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Freedomotic; see the file COPYING. If not, see
* <http://www.gnu.org/licenses/>.
*/
/*
* -----------------------------------------------------------------
* MyISYInsteonClient.java
* --------------
*
* -----------------------------------------------------------------
* Copyright (C) 2007 Universal Devices
* -----------------------------------------------------------------
*
* -----------------------------------------------------------------
*/
package com.freedomotic.plugins.devices.isy99i;
import com.nanoxml.XMLElement;
import com.udi.insteon.client.InsteonOps;
import com.udi.isy.jsdk.insteon.ISYInsteonClient;
import com.universaldevices.client.NoDeviceException;
import com.universaldevices.common.Constants;
import com.universaldevices.common.properties.UDProperty;
import com.universaldevices.device.model.*;
import com.universaldevices.security.upnp.UPnPSecurity;
import com.universaldevices.upnp.UDProxyDevice;
import com.freedomotic.app.Freedomotic;
import com.freedomotic.events.ProtocolRead;
import com.freedomotic.api.EventTemplate;
/**
*
* This class implements a very simple ISY client which prints out events as
* they occur in ISY
*
* @author UD Architect
*
*/
public class MyISYInsteonClient extends ISYInsteonClient {
/**
* Constructor Registers this class as IModelChangeListener
*
* @see IModelChangeListener
*
*/
public MyISYInsteonClient() {
super();
}
public synchronized MyISYInsteonClient getISY() {
return this;
}
/**
* This method is called when a new ISY is announced or discovered on the
* network. For this sample, we simply authenticate ourselves
*/
public void onNewDeviceAnnounced(UDProxyDevice device) {
Freedomotic.logger.info("NEW DEVICE: " + device.getFriendlyName());
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": New Device found: " + device.getFriendlyName());
}
/**
* This method is invoked when ISY goes into Linking mode
*/
public void onDiscoveringNodes() {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": I am in Linking Mode ...");
}
/**
* This method is invoked when ISY is no longer in Linking mode
*/
public void onNodeDiscoveryStopped() {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": I am no longer in Linking mode ...");
}
/**
* This method is invoked when a group/scene is removed
*/
public void onGroupRemoved(String groupAddress) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Scene: " + groupAddress + " was removed by someone or something!");
Freedomotic.logger.info("Scene: " + groupAddress + " was removed by someone or something!");
}
/**
* This method is invoked when a group/scene is renamed
*/
public void onGroupRenamed(UDGroup group) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Scene: " + group.address + " was removed by someone or something!");
Freedomotic.logger.info("Scene: " + group.address + " was renamed to " + group.name);
}
/**
* This method is invoked everytime there's a change in the state of a
* control for a node (Insteon Device)
*/
public void onModelChanged(UDControl control, Object value, UDNode node) {
if (control == null || value == null || node == null) {
return;
}
Freedomotic.logger.info("Someone or something changed " + ((control.label == null) ? control.name : control.label) + " to " + value + " at " + node.name);
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Someone or something changed " + ((control.label == null) ? control.name : control.label) + " to " + InsteonOps.convertOnLevelToPercent(value.toString()) + " at " + node.address + " type " + node.typeReadable + " uom " + control.numericUnit);
ProtocolRead event = new ProtocolRead(this, "Isy99i", node.address); //IP:PORT:RELAYLINE
int valuePercent = InsteonOps.convertOnLevelToPercent(value.toString());
event.addProperty("type", node.typeReadable);
// lighting support
if (valuePercent > 0) {
event.addProperty("isOn", "true");
} else {
event.addProperty("isOn", "false");
}
event.addProperty("value", Integer.toString(valuePercent));
Isy99i.aux.notifyIsyEvent(event);
}
/**
* This method is invoked when the network is renamed. Network is the top
* most node in the tree in our applet
*/
public void onNetworkRenamed(String newName) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Ah, the network was renamed to " + newName);
}
/**
* This method is called when a new group/scene has been created
*/
public void onNewGroup(UDGroup newGroup) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Yummy: we now have a new scene with address " + newGroup.address + " and name " + newGroup.name);
}
/**
* This method is called when a new node (Insteon Device) has been added
*/
public void onNewNode(UDNode newNode) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Yummy: we now have a new Insteon device with address " + newNode.address + " and name " + newNode.name);
}
/**
* This method is called when an Insteon Device does not correctly
* communicate with ISY
*/
public void onNodeError(UDNode node) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": What's going on? The Insteon device at address " + node.address + " and name " + node.name + " is no longer responding to my communication attempts!");
}
/**
* This method is called with a node is enabled or disabled
*
* @param node
* @param b
*/
public void onNodeEnabled(UDNode node, boolean b) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ":" + String.format("Node %s is now %s", node.name, b ? "enabled" : "disabled"));
}
/**
* This method is called when a node (Insteon Device) has been permanently
* removed from ISY
*/
public void onNodeRemoved(String nodeAddress) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Whooah ... node with address " + nodeAddress + " was permanently removed from ISY");
}
/**
* This method is called when a node (Insteon Device) is removed from a
* scene
*/
public void onNodeRemovedFromGroup(UDNode node, UDGroup group) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Insteon device with address " + node.address + " and name " + node.name + " is no longer part of the " + group.name + " scene!");
}
/**
* This method is called when a node's role changes in the given group
* (master/slave role)
*/
public void onNodeToGroupRoleChanged(UDNode node, UDGroup group, char new_role) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Insteon device with address " + node.address + " now has a new role in group with address " + group.address + " : ");
if (new_role == Constants.UD_LINK_MODE_MASTER) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Controller/Master");
} else {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Responder/Slave");
}
}
/**
* This method is invoked when a node (Insteon Device) is renamed
*/
public void onNodeRenamed(UDNode node) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Insteon device with address " + node.address + " was renamed to " + node.name);
Freedomotic.logger.info("Insteon device with address " + node.address + " was renamed to " + node.name);
}
/**
* This method is invoked when a node (Insteon Device) has been moved to a
* scene as controller/master
*/
public void onNodeMovedAsMaster(UDNode node, UDGroup group) {
Freedomotic.logger.info("Insteon device " + node.name + " is now part of the " + group.name + " scene as a master/controller");
}
/**
* This method is invoked when a node (Insteon Device) has been moved to a
* scene as responder/slave
*/
public void onNodeMovedAsSlave(UDNode node, UDGroup group) {
Freedomotic.logger.info("Insteon device " + node.name + " is now part of the " + group.name + " scene as a slave/responder");
}
/**
* This method is invoked with the library does not receive announcements
* from ISY and considers it offline
*/
public void onDeviceOffLine() {
Freedomotic.logger.info("ISY is offLine. Did you unplug it?");
}
/**
* This method is invoked when a currently known ISY (UDProxyDevice) is back
* on line
*/
public void onDeviceOnLine() {
Freedomotic.logger.info("ISY is online ...");
final UDProxyDevice device = getDevice();
if (device == null) {
return;
}
if (device.isSecurityEnabled() || device.securityLevel > UPnPSecurity.NO_SECURITY) {
if (device.isAuthenticated && device.isOnline) {
return;
}
try {
Freedomotic.logger.info("AUTHENICATING/SUBSCRIBING");
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Authenticating/Subscribing");
// passing user/pass
authenticate("admin", "admin");
Freedomotic.logger.info("AUTHENICATING/SUBSCRIBING DONE");
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Authenticating/Subscribing done");
} catch (NoDeviceException e) {
Freedomotic.logger.severe("Authenticating/Subscribing error");
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Authenticating/Subscribing error");
}
} else {
//just subscribe to events
Freedomotic.logger.info("Subscribing");
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Subscribing");
device.subscribeToEvents(true);
Freedomotic.logger.info("Subscription done");
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Subscription done");
}
}
/**
* This method is invoked when the state of the system (whether or not busy)
* is changed
*
* @param busy - whether or not ISY is busy
*/
public void onSystemStatus(boolean busy) {
if (busy) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": I am busy now; please give me some reprieve and don't ask me for more!");
} else {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": I am ready and at your service");
}
}
/**
* This method is invoked when internet access is disabled on ISY
*/
public void onInternetAccessDisabled() {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": You can no longer reach me through the internet");
}
/**
* This method is invoked with internet access is enabled on ISY
*
* @param url - the external fully qualified url through which ISY can be
* accessed
*/
public void onInternetAccessEnabled(String url) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": You can now reach me remotely at: " + url);
}
/**
* This method is invoked when trigger status changes
*
* @param arg1 - the status
* @param arg2 - extra information
*/
public void onTriggerStatus(String arg1, XMLElement arg2) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Trigger status changed: " + arg1);
}
public void onDeviceSpecific(String arg1, String node, XMLElement arg2) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Device Specific action: ");
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": " + arg2.toString());
}
public void onProgress(String arg1, XMLElement arg2) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Progress Report:");
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": " + arg2.toString());
}
/**
* Implement any cleanup Routines necessary here
*/
@Override
public void cleanUp() {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Clean up whatever other static objects you have around");
}
@Override
public void onSystemConfigChanged(String event, XMLElement eventInfo) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": System configuration changed");
}
@Override
public void onFolderRemoved(String folderAddress) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": " + String.format("Folder removed %s", folderAddress));
}
@Override
public void onFolderRenamed(UDFolder folder) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ":" + String.format("Folder renamed %s, new name %s", folder.address, folder.name));
}
@Override
public void onNewFolder(UDFolder folder) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": " + String.format("New Folder %s, name %s", folder.address, folder.name));
}
@Override
public void onNodeHasPendingDeviceWrites(UDNode node, boolean hasPending) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": " + String.format("Node %s, %s pending device writes", node.name, hasPending ? "has" : "does not have"));
}
@Override
public void onNodeIsWritingToDevice(UDNode node, boolean isWriting) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": " + String.format("Node %s, %s being programmed", node.name, isWriting ? "is" : "is not"));
}
@Override
public void onNodeParentChanged(UDNode node, UDNode newParent) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ":" + String.format("Node %s, has new parent %s", node.name, newParent.name));
}
@Override
public void onNodePowerInfoChanged(UDNode node) {
Isy99iFrame.writeAreaLog(Isy99iUtilities.getDateTime() + ": Not supported ");
}
/*
* (non-Javadoc) @see
* com.universaldevices.device.model.IModelChangeListener#onNodeDeviceIdChanged(com.universaldevices.upnp.UDProxyDevice,
* com.universaldevices.device.model.UDNode)
*/
@Override
public void onNodeDeviceIdChanged(UDProxyDevice device, UDNode node) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc) @see
* com.universaldevices.device.model.IModelChangeListener#onNodeDevicePropertiesRefreshed(com.universaldevices.upnp.UDProxyDevice,
* com.universaldevices.device.model.UDNode)
*/
@Override
public void onNodeDevicePropertiesRefreshed(UDProxyDevice device,
UDNode node) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc) @see
* com.universaldevices.device.model.IModelChangeListener#onNodeDevicePropertiesRefreshedComplete(com.universaldevices.upnp.UDProxyDevice)
*/
@Override
public void onNodeDevicePropertiesRefreshedComplete(
UDProxyDevice proxyDevice) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc) @see
* com.universaldevices.device.model.IModelChangeListener#onNodeDevicePropertyChanged(com.universaldevices.upnp.UDProxyDevice,
* com.universaldevices.device.model.UDNode,
* com.universaldevices.common.properties.UDProperty)
*/
@Override
public void onNodeDevicePropertyChanged(UDProxyDevice device, UDNode node,
UDProperty<?> property) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc) @see
* com.universaldevices.device.model.IModelChangeListener#onNodeRevised(com.universaldevices.upnp.UDProxyDevice,
* com.universaldevices.device.model.UDNode)
*/
@Override
public void onNodeRevised(UDProxyDevice device, UDNode node) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc) @see
* com.universaldevices.device.model.IModelChangeListener#onNodeErrorCleared(com.universaldevices.upnp.UDProxyDevice,
* com.universaldevices.device.model.UDNode)
*/
@Override
public void onNodeErrorCleared(UDProxyDevice arg0, UDNode arg1) {
// TODO Auto-generated method stub
}
}