mirror of
https://github.com/bwssytems/ha-bridge.git
synced 2025-12-18 08:13:23 +00:00
Added settings for strict upnp mode of checking ig it is a request for a
hue or not before responding. Updated Readme
This commit is contained in:
43
README.md
43
README.md
@@ -34,8 +34,51 @@ POST http://host:8080/api/devices
|
|||||||
"onUrl" : "http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1&DeviceNum=41",
|
"onUrl" : "http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1&DeviceNum=41",
|
||||||
"offUrl" : "http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=41"
|
"offUrl" : "http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=41"
|
||||||
}
|
}
|
||||||
|
Dimming
|
||||||
|
----
|
||||||
|
Dimming is also supported by using the expessions ${intensity.percent} or ${intensity.byte} for 0-100 and 0-255 respectively.
|
||||||
|
e.g.
|
||||||
```
|
```
|
||||||
|
{
|
||||||
|
"name": "entry light",
|
||||||
|
"deviceType": "switch",
|
||||||
|
"offUrl": "http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=31",
|
||||||
|
"onUrl": "http://192.168.1.201:3480/data_request?id=action&output_format=json&DeviceNum=31&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=${intensity.percent}"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
See the echo's documentation for the dimming phrase.
|
||||||
|
|
||||||
|
POST/PUT support
|
||||||
|
-----
|
||||||
|
added optional fields
|
||||||
|
* contentType (currently un-validated)
|
||||||
|
* httpVerb (POST/PUT/GET only supported)
|
||||||
|
* contentBody your post/put body here
|
||||||
|
|
||||||
|
This will allow control of any other application that may need mroe then GET.
|
||||||
|
e.g:
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"name": "test device",
|
||||||
|
"deviceType": "switch",
|
||||||
|
"offUrl": "http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=31",
|
||||||
|
"onUrl": "http://192.168.1.201:3480/data_request?id=action&output_format=json&DeviceNum=31&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=${intensity.percent}",
|
||||||
|
"contentType" : "application/json",
|
||||||
|
"httpVerb":"POST",
|
||||||
|
"contentBody" : "{\"fooBar\":\"baz\"}"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Anything that takes an action as a result of an HTTP request will probably work - like putting Vera in and out of night mode:
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"name": "night mode",
|
||||||
|
"deviceType": "switch",
|
||||||
|
"offUrl": "http://192.168.1.201:3480/data_request?id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=SetHouseMode&Mode=1",
|
||||||
|
"onUrl": "http://192.168.1.201:3480/data_request?id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=SetHouseMode&Mode=3"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Ask Alexa
|
||||||
|
----
|
||||||
After this Tell Alexa: "Alexa, discover my devices"
|
After this Tell Alexa: "Alexa, discover my devices"
|
||||||
|
|
||||||
Then you can say "Alexa, Turn on the office light" or whatever name you have given your configured devices.
|
Then you can say "Alexa, Turn on the office light" or whatever name you have given your configured devices.
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ public class BridgeSettings {
|
|||||||
private String upnpresponseport;
|
private String upnpresponseport;
|
||||||
private String upnpdevicedb;
|
private String upnpdevicedb;
|
||||||
private String veraaddress;
|
private String veraaddress;
|
||||||
|
private boolean upnpStrict;
|
||||||
|
|
||||||
public String getUpnpConfigAddress() {
|
public String getUpnpConfigAddress() {
|
||||||
return upnpconfigaddress;
|
return upnpconfigaddress;
|
||||||
@@ -38,5 +39,10 @@ public class BridgeSettings {
|
|||||||
this.veraaddress = veraAddress;
|
this.veraaddress = veraAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isUpnpStrict() {
|
||||||
|
return upnpStrict;
|
||||||
|
}
|
||||||
|
public void setUpnpStrict(boolean upnpStrict) {
|
||||||
|
this.upnpStrict = upnpStrict;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import com.bwssystems.HABridge.devicemanagmeent.*;
|
|||||||
import com.bwssystems.HABridge.hue.HueMulator;
|
import com.bwssystems.HABridge.hue.HueMulator;
|
||||||
import com.bwssystems.HABridge.upnp.UpnpListener;
|
import com.bwssystems.HABridge.upnp.UpnpListener;
|
||||||
import com.bwssystems.HABridge.upnp.UpnpSettingsResource;
|
import com.bwssystems.HABridge.upnp.UpnpSettingsResource;
|
||||||
import com.bwssystems.vera.VeraInfo;
|
|
||||||
|
|
||||||
public class HABridge {
|
public class HABridge {
|
||||||
|
|
||||||
@@ -55,6 +54,7 @@ public class HABridge {
|
|||||||
bridgeSettings.setUpnpDeviceDb(System.getProperty("upnp.device.db", "data/device.db"));
|
bridgeSettings.setUpnpDeviceDb(System.getProperty("upnp.device.db", "data/device.db"));
|
||||||
bridgeSettings.setUpnpResponsePort(System.getProperty("upnp.response.port", "50000"));
|
bridgeSettings.setUpnpResponsePort(System.getProperty("upnp.response.port", "50000"));
|
||||||
bridgeSettings.setVeraAddress(System.getProperty("vera.address", "192.168.1.100"));
|
bridgeSettings.setVeraAddress(System.getProperty("vera.address", "192.168.1.100"));
|
||||||
|
bridgeSettings.setUpnpStrict(Boolean.parseBoolean(System.getProperty("upnp.strict", "true")));
|
||||||
|
|
||||||
// sparkjava config directive to set ip address for the web server to listen on
|
// sparkjava config directive to set ip address for the web server to listen on
|
||||||
// ipAddress("0.0.0.0"); // not used
|
// ipAddress("0.0.0.0"); // not used
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
package com.bwssystems.HABridge.api;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by arm on 4/13/15.
|
|
||||||
*/
|
|
||||||
public class Device {
|
|
||||||
private String name;
|
|
||||||
private String deviceType;
|
|
||||||
private String offUrl;
|
|
||||||
private String onUrl;
|
|
||||||
private String httpVerb;
|
|
||||||
private String contentType;
|
|
||||||
private String contentBody;
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDeviceType() {
|
|
||||||
return deviceType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDeviceType(String deviceType) {
|
|
||||||
this.deviceType = deviceType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getOffUrl() {
|
|
||||||
return offUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOffUrl(String offUrl) {
|
|
||||||
this.offUrl = offUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getOnUrl() {
|
|
||||||
return onUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOnUrl(String onUrl) {
|
|
||||||
this.onUrl = onUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getHttpVerb() {
|
|
||||||
return httpVerb;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHttpVerb(String httpVerb) {
|
|
||||||
this.httpVerb = httpVerb;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getContentType() {
|
|
||||||
return contentType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setContentType(String contentType) {
|
|
||||||
this.contentType = contentType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getContentBody() {
|
|
||||||
return contentBody;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setContentBody(String contentBody) {
|
|
||||||
this.contentBody = contentBody;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -23,11 +23,14 @@ public class UpnpListener {
|
|||||||
|
|
||||||
private String responseAddress;
|
private String responseAddress;
|
||||||
|
|
||||||
|
private boolean strict;
|
||||||
|
|
||||||
public UpnpListener(BridgeSettings theSettings) {
|
public UpnpListener(BridgeSettings theSettings) {
|
||||||
super();
|
super();
|
||||||
upnpResponsePort = Integer.valueOf(theSettings.getUpnpResponsePort());
|
upnpResponsePort = Integer.valueOf(theSettings.getUpnpResponsePort());
|
||||||
httpServerPort = Integer.valueOf(theSettings.getServerPort());
|
httpServerPort = Integer.valueOf(theSettings.getServerPort());
|
||||||
responseAddress = theSettings.getUpnpConfigAddress();
|
responseAddress = theSettings.getUpnpConfigAddress();
|
||||||
|
strict = theSettings.isUpnpStrict();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startListening(){
|
public void startListening(){
|
||||||
@@ -63,7 +66,8 @@ public class UpnpListener {
|
|||||||
DatagramPacket packet = new DatagramPacket(buf, buf.length);
|
DatagramPacket packet = new DatagramPacket(buf, buf.length);
|
||||||
upnpMulticastSocket.receive(packet);
|
upnpMulticastSocket.receive(packet);
|
||||||
String packetString = new String(packet.getData());
|
String packetString = new String(packet.getData());
|
||||||
log.debug("Got SSDP packet from " + packet.getAddress().getHostAddress() + ":" + packet.getPort() + " body : " + packetString);
|
if(packetString != null && packetString.startsWith("M-SEARCH * HTTP/1.1"))
|
||||||
|
log.debug("Got SSDP packet from " + packet.getAddress().getHostAddress() + ":" + packet.getPort() + " body : " + packetString);
|
||||||
if(isSSDPDiscovery(packetString)){
|
if(isSSDPDiscovery(packetString)){
|
||||||
sendUpnpResponse(responseSocket, packet.getAddress(), packet.getPort());
|
sendUpnpResponse(responseSocket, packet.getAddress(), packet.getPort());
|
||||||
}
|
}
|
||||||
@@ -85,9 +89,11 @@ public class UpnpListener {
|
|||||||
protected boolean isSSDPDiscovery(String body){
|
protected boolean isSSDPDiscovery(String body){
|
||||||
// log.debug("Check if this is a MAN ssdp-discover packet for a upnp basic device: " + body);
|
// log.debug("Check if this is a MAN ssdp-discover packet for a upnp basic device: " + body);
|
||||||
//Only respond to discover request for upnp basic device from echo, the others are for the wemo
|
//Only respond to discover request for upnp basic device from echo, the others are for the wemo
|
||||||
// other check: && body.contains("ST: urn:schemas-upnp-org:device:basic:1")
|
|
||||||
if(body != null && body.startsWith("M-SEARCH * HTTP/1.1") && body.contains("MAN: \"ssdp:discover\"")){
|
if(body != null && body.startsWith("M-SEARCH * HTTP/1.1") && body.contains("MAN: \"ssdp:discover\"")){
|
||||||
return true;
|
if(strict && body.contains("ST: urn:schemas-upnp-org:device:basic:1"))
|
||||||
|
return true;
|
||||||
|
else if (!strict)
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user