-
Notifications
You must be signed in to change notification settings - Fork 130
Items AlexaBridge
See original
Module emulates the Phillips Hue to allow for direct connectivity from the Amazon Echo, Google Home, and any other devices that support the Phillips Hue Bridge.
The AlexaBridge_Item object holds the configured MisterHouse objects that are presented to the Amazon Echo or Google Home. See AlexaBridge_Item
Note: You must use port 80 for Google Home, it is locked down to port 80. The user running MisterHouse must be root to run on port 80 or you have to give the MisterHouse user rights to use the port.
For Google Home and a reverse proxy (Apache/IIS/etc):
alexa_enable = 1
alexaHttpPortCount = 0 # disables all proxy ports
alexaHttpPort = 80 # tells the module to send port 80 in the SSDP response and look for port 80 in the HTTP host header
alexaObjectsPerGet = 300 # Google Home can handle us returning all objects in a single response
For Google Home using the builtin proxy port:
alexa_enable = 1
alexaHttpPortCount = 1 # Open 1 proxy port on port 80 (We default to port 80 so no need to define it)
alexaNoDefaultHttp = 1 # Disable responding on the default MisterHouse web port because Google Home will not use it any way.
alexaObjectsPerGet = 300 # Google Home can handle us returning all objects in a single response
For Echo (Chunked method):
alexa_enable = 1
alexaEnableChunked = 1
For Echo (Multi-port method): This method should not be needed unless for some reason your Echo does not work with the Chunked method.
alexa_enable = 1
alexaHttpPortCount = 1 # Open 1 proxy port for a total of 2 ports including the default MisterHouse web port. We only support 1 for now unless I see a need for more.
alexaHttpPort=8085 # The proxy port will be on port 8085, this port should be higher than the MisterHouse web port so it is used first.
For All options
alexa_enable # Enable the module
alexaEnableChunked # Enable chunked return method (For the Echo)
alexaHttpPortCount # Amount of proxy ports to open
alexaNoDefaultHttp # Disable responding on the default MisterHouse web port
alexaObjectsPerGet # Amount of MisterHouse objects we return per GET from the Echo/GH
alexaHttpPort # First proxy port number
alexaMac # This is used in the SSDP response, We discover it so it does not need to be defined unless something goes wrong
alexaHttpIp # This is the IP of the local MisterHouse server, We discover it so it does not need to be defined unless something goes wrong
The object can be defined in the user code or in items.mht file.
Defined in items.mht
as
#ALEXA_BRIDGE, name
ALEXA_BRIDGE, Alexa
Or in user code:
$Alexa = new AlexaBridge(); # parent object
The most important part of the configuration is mapping the objects/code you want to present to the module (Echo/Google Home/Etc.). This allows the user to map pretty much anything in MisterHouse to a Echo/GH command.
ALEXABRIDGE_ADD, <actual object name>, <name you want Echo/GH to see>, <sub used to change the object state>,
<State mapped to Echo/GH ON command>, <State mapped to Echo/GH OFF command>, <sub used to get the object state>
<actual object name>
This is the only required parameter. If you are good with the defaults, you can add an object like:
#ALEXABRIDGE_ADD, AlexaItems, actual_object_name
ALEXABRIDGE_ADD, AlexaItems, light1
or in user code
$AlexaItems->add('$light1');
<name you want Echo/GH to see>
This defaults to using the without the $. If want to change the name you say to the Echo/GH to control the object, you can define it here. You can also make aliases for objects so it's easier to remember.
<sub used to change the object state>
This defaults to 'set' which works for most objects. You can also put a code reference or 'run_voice_cmd'.
<State mapped to Echo/GH on command>
If you want to set an object to something other than 'on' when you say 'on' to the Echo/GH, you can define it here. Defaults to 'on'.
<State mapped to Echo/GH OFF command>
If you want to set an object to something other than 'off' when you say 'off' to the Echo/GH, you can define it here. Defaults to 'off'.
<sub used to get the object state>
If your object uses a custom sub to get the state, define it here. Defaults to 'state' which works for most objects.
The dim % is the actual number you say to Alexa, so if you say "Alexa,Set Light 1 to 75 %" then the dim % value will be 75.
The module supports 300 devices which is the max supported by the Echo
items.mht examples:
ALEXA_BRIDGE, Alexa
ALEXABRIDGE_ITEM, AlexaItems, Alexa
ALEXABRIDGE_ADD, AlexaItems, light1 light1, set, on, off, state # these are the defaults
ALEXABRIDGE_ADD, AlexaItems, light1 # same as the line above
ALEXABRIDGE_ADD, AlexaItems, light3, Test_Light_3 # if you want to change the name you say
ALEXABRIDGE_ADD, AlexaItems, testsub, Test_Sub, \&testsub
# "!" will be replaced with the action ( on/off/<level number> ), so if you say "turn on test voice" then the module will run run_voice_cmd("test voice on")
ALEXABRIDGE_ADD, AlexaItems, test_voice_!, Test_Voice, run_voice_cmd
User code examples:
$Alexa = new AlexaBridge(); # parent object
$AlexaItems = new AlexaBridge_Item($Alexa); # child object
$AlexaItems->add('$light1','light1','set','on','off','state'); # This is the same as $AlexaItems->add('$light1')
To change the name of an object to a more natural name that you would say to the Echo/GH:
$AlexaItems->add('$GarageHall_light_front','Garage_Hall_light');
To map a voice command, # is replaced by the Echo/GH command (on/off/dim%). My actual voice command in MisterHouse is "set night mode on", so I configure it like:
$AlexaItems->add('set night mode !','NightMode','run_voice_cmd');
If I say "Alexa, Turn on Night Mode", run_voice_cmd("set night mode on") is run in MisterHouse. To configure a user code sub: The actual name (argument 1) can be anything. A code ref must be used. When the sub is run 2 arguments are passed to it: Argument 1 is (state or set) Argument 2 is: (on/off/<dim % interger>).
#ALEXABRIDGE_ADD, AlexaItems, testsub, Test_Sub, &testsub
ALEXABRIDGE_ADD, AlexaItems, testsub, Test_Sub, &testsub
or in code
$AlexaItems->add('testsub','Test_Sub',\&testsub); # say "Alexa, Turn on Test Sub", &testsub('set','on') is run in MisterHouse.
# I have an Insteon thermostat, the Insteon object name is $thermostat and I configured it like:
ALEXABRIDGE_ADD, AlexaItems, thermostat, Heat, heat_setpoint, on, off, get_heat_sp
# say "Alexa, Set Heat to 73", $thermostat->heat_setpoint("73") is run in MisterHouse.
ALEXABRIDGE_ADD, AlexaItems, thermostat, Cool, cool_setpoint, on, off, get_cool_sp
In order to be able to say things like "Alexa, set thermostat up by 2", a sub must be created in user code When the above is said to the Echo, it first gets the current state, then subtracts or adds the amount that was said.
sub temperature {
my ($type, $state) = @_;
# $type is state or set
# $state is the number, on, off, etc
# we are changing heat and cool so just return a static number, we just need the diff
# because the Echo will add or subtact the amount that was said to it.
# so if we say "set thermostat up by 2", 52 will be returned in $state
if ($type eq 'state') { return 50; }
return '' unless ($state =~ /\d+/); Make sure we have a number
return '' if ($state > 65); # Dont allow changes over 15
return '' if ($state < 35); # Dont allow changes over 15
my ( $heatsp, $coolsp );
$state = ($state - 50); # subtract the amount we return above to get the actual amount to change.
$coolsp = ((state $thermo_setpoint_c) + $state);
$heatsp = ((state $thermo_setpoint_h) + $state);
# The Insteon thermostat has an issue when setting both heat and cool at the same time, so the timer is a work around.
$alexa_temp_timer = new Timer;
$thermostat->cool_setpoint($coolsp);
set $alexa_temp_timer '7', sub { $thermostat->heat_setpoint($heatsp) }
}
# Map our new temperature sub in the .mht file so the Echo/Google Home can discover it
ALEXABRIDGE_ADD, AlexaItems, thermostat, thermostat, &temperature
I have a script that I use to control my AV equipment and I can run it via ssh, so I made a voice command in MisterHouse:
$v_set_tv_mode = new Voice_Cmd("set tv mode [on,off,hbo,netflix,roku,directtv,xbmc,wii]");
$p_set_tv_mode = new Process_Item;
if (my $state = said $v_set_tv_mode) {
set $p_set_tv_mode "/usr/bin/ssh wayne\@192.168.1.10 \"sudo /usr/local/HomeAVControl/bin/input_change $state\"";
start $p_set_tv_mode;
}
## Items.mht
Defined in `items.mht` as
```perl
ALEXABRIDGE_ADD, AlexaItems, set_tv_mode_!, DirectTv, run_voice_cmd, directtv, directtv
ALEXABRIDGE_ADD, AlexaItems, set_tv_mode_!, Roku, run_voice_cmd, roku, roku
ALEXABRIDGE_ADD, AlexaItems, set_tv_mode_!, xbmc, run_voice_cmd, xbmc, xbmc
ALEXABRIDGE_ADD, AlexaItems, set_tv_mode_!, wii, run_voice_cmd, wii, wii
ALEXABRIDGE_ADD, AlexaItems, set_tv_mode_!, Hbo, run_voice_cmd, hbo, hbo
ALEXABRIDGE_ADD, AlexaItems, set_tv_mode_!, Netflix, run_voice_cmd, netflix, netflix
Generic_Item, HTTP::Date, IO::Compress::Gzip, Time::HiRes, Net::Address::Ethernet, Storable IO::Socket::INET
The AlexaBridge_Item object holds the configured MisterHouse objects that are presented to the Amazon Echo or Google Home
See AlexaBridge
The object can be defined in the user code or in a .mht file.
Defined in items.mht
as
#ALEXABRIDGE_ITEM, <object name>, <primary object name>
ALEXABRIDGE_ITEM, AlexaItems, Alexa
Or in user code:
#<object name> = new AlexaBridge_Item(<primary object name>);
$AlexaItems = new AlexaBridge_Item($Alexa);
See AlexaBridge for complete examples
Method | Description |
---|---|
add() |
Presents MisterHouse objects, subs, or voice commands to the Echo, Google Home, or any thing that supports the HUE bridge. add('<actual object name>','<name you want Echo/GH to see>', '<sub used to change the object state>','<State mapped to Echo/GH ON command>', '<State mapped to Echo/GH OFF command>','<sub used to get the object state>');
|
Wayne Gatlin [email protected]
None