Compare commits

..

4108 Commits

Author SHA1 Message Date
Paulus Schoutsen
e9fa1f1f83 Merge pull request #1182 from balloob/dev
0.13
2016-02-12 21:55:24 -08:00
Paulus Schoutsen
724d5bfe9d Version bump to 0.13 2016-02-12 21:51:34 -08:00
Paulus Schoutsen
938c9888a6 Merge pull request #918 from happyleavesaoc/snapcast
snapcast media player
2016-02-12 19:31:07 -08:00
Paulus Schoutsen
b91e4cfb4a Merge pull request #1195 from persandstrom/kodi_thumbnails
kodi thumbnails
2016-02-12 19:03:22 -08:00
Paulus Schoutsen
7dd51034cd Merge pull request #1213 from MartinHjelmare/mysensors-light
Add mysensors light platform
2016-02-12 19:01:41 -08:00
Paulus Schoutsen
2f60ff224f Merge pull request #1223 from MartinHjelmare/update-mysensors-version
Update pymysensors version to 0.5
2016-02-12 18:55:06 -08:00
Paulus Schoutsen
fc3a37cba2 Merge pull request #1224 from MartinHjelmare/fix-mysensors-version-error
Fix error in update method for V_STATUS
2016-02-12 18:54:12 -08:00
Paulus Schoutsen
223b7f85ee Merge pull request #1225 from nkgilley/ecobee-fix
fix ecobee sensor unique id.
2016-02-12 18:53:58 -08:00
happyleavesaoc
13b0beee31 snapcast 2016-02-12 18:35:32 -05:00
nkgilley@gmail.com
ba530e5a16 fix ecobee sensor unique id. 2016-02-12 17:24:00 -05:00
Per SandstrÃom
aafd36d2ce change url to host 2016-02-12 21:19:27 +00:00
MartinHjelmare
0492f0abd0 Fix error in update method for V_STATUS
* Remove check against V_STATUS to avoid error when using version 1.4
    of mysensors. V_LIGHT has the same integer value so V_STATUS is not
    needed.
2016-02-12 22:05:31 +01:00
MartinHjelmare
940799d0da Update pymysensors version to 0.5 2016-02-12 21:59:24 +01:00
Paulus Schoutsen
1ba60dc898 Update .coveragerc 2016-02-12 09:01:48 -08:00
Paulus Schoutsen
75d3d25969 Merge pull request #1129 from nkgilley/speedtest
Speedtest.net component
2016-02-12 08:59:19 -08:00
Paulus Schoutsen
06bd812b7b Make state unknown if None returned 2016-02-12 08:58:07 -08:00
nkgilley@gmail.com
7cb57583e2 fix line too long 2016-02-12 11:44:24 -05:00
nkgilley@gmail.com
3e3f5db2a5 use a windows & linux compatible regex 2016-02-12 11:30:55 -05:00
nkgilley@gmail.com
88fe28ea1b add update service 2016-02-12 09:55:28 -05:00
Paulus Schoutsen
8857c48c17 Merge pull request #1206 from turbokongen/rfxtrx-newprotocols
Supporting electricity sensors with ELEC2/3 protocol from latest pyRFXtrx (0.4)
2016-02-11 23:30:40 -08:00
Paulus Schoutsen
3c582d1e3c Merge pull request #1143 from balloob/rfxtrx
Rfxtrx
2016-02-11 23:30:34 -08:00
Fabian Affolter
19d12716ef Update docstrings 2016-02-12 08:21:39 +01:00
Fabian Affolter
57446cfb08 Add link to docs 2016-02-12 07:55:20 +01:00
Paulus Schoutsen
ff6cb2b452 Update frontend icons + proximity icon 2016-02-11 22:21:06 -08:00
Paulus Schoutsen
a3ec7998b1 Update frontend with garage door support 2016-02-11 21:55:50 -08:00
Paulus Schoutsen
d892716bfa Merge pull request #1218 from kk7ds/influx-tests
Add tests for influxdb and fix a bug
2016-02-11 21:45:37 -08:00
Dan Smith
61e2da8827 Add tests for influxdb and fix a bug
This adds tests for the influxdb component. It also fixes a bug,
where username and password are required, but not gracefully
handled if they're missing from config.
2016-02-12 05:34:13 +00:00
Paulus Schoutsen
abc039a3d0 Check coverage for statsd and splunk 2016-02-11 20:22:01 -08:00
Paulus Schoutsen
7ba7747ce8 Merge pull request #1217 from jaharkes/nest_heating
Nest binary sensor fixes
2016-02-11 20:15:02 -08:00
Jan Harkes
b04ff7207c Make sure Nest is setup before the binary sensors. 2016-02-11 21:28:08 -05:00
Dan Smith
72235c48fb Merge pull request #1216 from kk7ds/fix-dan-broke-splunk
Re-allow splunk to report string states
2016-02-11 18:26:24 -08:00
Jan Harkes
3f7ff2b1d4 The Nest binary sensor can also track when heating system is running. 2016-02-11 21:24:51 -05:00
Dan Smith
484b7b64d7 Re-allow splunk to report string states
Splunk *can* take string states, so un-fix that wrong fix.
2016-02-12 02:20:15 +00:00
Paulus Schoutsen
7241762bcc Merge pull request #1209 from kk7ds/abstract-numeric-state
Abstract numeric state
2016-02-11 18:16:57 -08:00
Dan Smith
0a904acd4d Add some tests for splunk
This also fixes issue #1214, and I think another bug. The splunk
code will just take the value of state.state and try to serialize
it to json if it can't make it into a number. It did this before
I generalized that code. Since json.dumps() will fail on most anything
complicated, I think the right thing to do is *not* try to do that.
2016-02-12 01:45:30 +00:00
Dan Smith
76df759f4c Add simple statsd tests
These are not very amazing, but at least exercise the code a little
to make sure I didn't break anything. Hopefully they're useful in the
future too.
2016-02-12 01:45:30 +00:00
Dan Smith
4a2b956493 Convert statsd, influx, splunk, and graphite to use state_as_number()
Fixes #1205
2016-02-12 01:45:25 +00:00
Dan Smith
3aa34deaa2 Add state_as_number() helper
This adds state_as_number(), a helper method that tries to interpret
state as a number, for cases we can predict. It's a generalization of
what is copy-and-paste-ed into multiple other places.
2016-02-12 00:41:32 +00:00
nkgilley@gmail.com
b00cad7095 fix travisci errors. 2016-02-11 19:27:05 -05:00
MartinHjelmare
2cf061c768 Add mysensors light platform
* Make light controllable independently with types V_LIGHT, V_DIMMER,
    V_RGB and V_RGBW. V_RGBW is not implemented in the frontend yet.
* Add discovery for light platform.
* Add optimistic mode config setting for switch and light
    to allow feedback state from actuator.
* Move S_LIGHT, V_LIGHT, V_STATUS types from switch to light platform.
* Change node update logging to debug from info level.
* Fix some inaccurate comments.
2016-02-12 01:22:35 +01:00
nkgilley@gmail.com
e837e97c9d use track_time_change 2016-02-11 19:09:51 -05:00
Paulus Schoutsen
df8afe51f4 Merge pull request #1212 from MartinHjelmare/fix-validate-config
Fix validate config in mysensors
2016-02-11 12:39:16 -08:00
Greg Dowling
c8e6f89302 Merge pull request #1210 from balloob/fix_owntracks_passive_zone
Handle passive zones correctly.
2016-02-11 20:35:21 +00:00
pavoni
2e75a58372 Fix outtracks bug with passive zones. 2016-02-11 20:28:02 +00:00
MartinHjelmare
ae2fd149a5 Fix validate config in mysensors
* Add check of port in config.
2016-02-11 21:03:13 +01:00
Greg Dowling
ee62c2cc2b Merge pull request #1208 from kk7ds/static-wemos
Support manually-defined WeMo devices
2016-02-11 18:46:58 +00:00
Dan Smith
4cfa14c29d Support manually-defined WeMo devices
This is extremely useful if you want to support wemos that are on
another subnet or across a VPN. It also lets you sidestep the discovery
process, which is problematic for a lot of people and situations.

In order for this to work, we need to bump the pywemo requirement to
0.3.10, which includes my changes to make this possible.

WeMo devices can be manually configured by adding a static section to
the config, like this:

  switch:
    platform: wemo
    static:
       - 192.168.100.5
       - 192.168.100.6
2016-02-11 17:23:20 +00:00
Paulus Schoutsen
4ce1a67c13 Merge pull request #1077 from xrolfex/wink_garage_door_support
Wink Garage Door Support
2016-02-11 07:59:57 -08:00
Dan Smith
962463c1ab Merge pull request #1196 from kk7ds/honeywell-enumerate
Make Honeywell module enumerate all available thermostats
2016-02-11 07:53:05 -08:00
Paulus Schoutsen
74f06b6862 Merge pull request #1190 from flyte/apcupsd-component
Add APCUPSd component
2016-02-11 07:35:43 -08:00
Dan Smith
d3d7d458e1 Make Honeywell module enumerate all available thermostats
This extends the HoneywellUSThermostat functionality to find and add
all thermostats in your account. So, we add a new config element called
'region' that is the primary trigger for this, and remove the 'id'
trigger since it was never in a released version.

This does a few extra things:
 - It names the thermostat what you have it named in your account,
   which is not something we get to know *unless* we emumerate.
 - It makes all thermostats on a given account use the same session,
   and thus we have to avoid doing an explicit login every time we
   refresh our data. That was causing some rate-limiting on their
   side when I was debugging, so this is probably good. Now, we use
   their existing keepalive pinger to determine if we're still logged
   in and only re-login if we need to.
2016-02-11 15:26:41 +00:00
Eric Rolf
cca6b0c287 Test Fix. 2016-02-11 10:16:57 -05:00
Eric Rolf
23e3b8d2f2 Fixed Style Issue 2016-02-11 10:00:12 -05:00
Eric Rolf
be9a2a043e Refactored Method Names. 2016-02-11 09:57:56 -05:00
Dan Smith
cc4fa6cd38 Merge pull request #1194 from kk7ds/add-graphite-feeder
Add graphite feeder component
2016-02-11 06:36:19 -08:00
John Arild Berentsen
4d15367956 Supporting electricity sensors with ELEC2/3 protocol from latest pyRFXtrx (0.4) 2016-02-11 15:35:05 +01:00
Eric Rolf
175b49236c Fixed style attribute with redefined built in method names. 2016-02-11 09:20:47 -05:00
Eric Rolf
fd0afaa204 Fixed Test Case Logic 2016-02-11 09:12:28 -05:00
Eric Rolf
034cec7152 Fixed Demo Test Cases 2016-02-11 09:06:35 -05:00
Eric Rolf
f464d591c9 Update python wink requirement 2016-02-11 08:49:07 -05:00
Eric Rolf
06cb97adee Merge branch 'wink_garage_door_support' of https://github.com/xrolfex/home-assistant into wink_garage_door_support 2016-02-11 08:39:20 -05:00
Eric Rolf
cab46b91e3 Updated Requirements All. 2016-02-11 08:38:05 -05:00
Eric Rolf
0da09b85de refactored test case 2016-02-11 08:37:17 -05:00
Eric Rolf
95d9bc48ea Updated Demo 2016-02-11 08:37:17 -05:00
Eric Rolf
6b962a2207 Updated coveragec, cleaned up constants, added test for demo. 2016-02-11 08:37:16 -05:00
Eric Rolf
18b3d3df57 Forgot to refactor demo. 2016-02-11 08:37:16 -05:00
Eric Rolf
5f6977acda Refactor Method Name For Open and Close. 2016-02-11 08:37:16 -05:00
Eric Rolf
89f6ef9f6c Updated requirements_all.txt 2016-02-11 08:37:16 -05:00
Eric Rolf
d2ad0620ee Wink Garage Door Support 2016-02-11 08:37:16 -05:00
Eric Rolf
aa13392983 refactored test case 2016-02-11 08:30:33 -05:00
Eric Rolf
6cbf19934f Updated Demo 2016-02-11 08:23:04 -05:00
Daniel
f938134069 updated rfxtrx lib 2016-02-11 14:15:51 +01:00
Eric Rolf
7cdcb800a9 Updated coveragec, cleaned up constants, added test for demo. 2016-02-11 07:41:42 -05:00
Flyte
91fb2764cc Use a cache object to reduce the frequency of calls to APCUPSd 2016-02-11 07:33:53 +00:00
Paulus Schoutsen
82c5e2cf3c Merge pull request #1177 from Theb-1/dev-notify-rest
REST notify component
2016-02-10 23:05:34 -08:00
Flyte
bb8981b611 Add apcupsd component. 2016-02-11 06:33:23 +00:00
Paulus Schoutsen
b350f22a77 Update frontend to fix color picker 2016-02-10 22:18:08 -08:00
Paulus Schoutsen
40da28a0c7 Merge pull request #1192 from i-c/add-delay-to-launchtl-load
Add delay to launchtl load
2016-02-10 21:39:36 -08:00
Paulus Schoutsen
3bdb50510a Merge pull request #1202 from huanga/change_nest_battery-level_unit
Changing battery level unit to "V" instead of "%"
2016-02-10 21:33:10 -08:00
Dan Smith
7478c36b27 Add graphite feeder component
Like recorder, this component listens to all events and reports any
that it can to a graphite installation. This makes it easy to use
graphite for all your data collection and analysis. If you run
carbon-cache (the backend for graphite) on the local machine, no
configuration is required other than enabling the component.

For more info on graphite: http://graphite.wikidot.com/
2016-02-11 05:28:40 +00:00
Paulus Schoutsen
b1f2c90bd0 Add MQTT service description 2016-02-10 21:23:27 -08:00
Ian Copp
e53785f30c Fix __main__.py permissions change 2016-02-10 21:20:56 -08:00
Paulus Schoutsen
1a38354ed5 Merge pull request #1138 from flyte/mqtt-publish-template
Add template support to mqtt.publish service payload.
2016-02-10 21:13:02 -08:00
Andy Huang
02609d0ab5 Changing battery level unit to "V" instead of "%" as the API reports output voltage, not percentage.
This value matches with Settings > Technical Information's Battery information.
2016-02-10 21:12:43 -08:00
Paulus Schoutsen
ce4f5ff29c Merge pull request #1197 from maxdrift/expose-baud-rate-mysensors-component
Expose baud rate config for MySensors component
2016-02-10 20:51:18 -08:00
Paulus Schoutsen
5190cc74c5 Merge pull request #1200 from MartinHjelmare/mysensors-unavailable
Use entity property available in mysensors
2016-02-10 20:45:48 -08:00
Paulus Schoutsen
e83f8da342 Merge pull request #1185 from balloob/perf-states
Make State class more immutable
2016-02-10 18:53:02 -08:00
Paulus Schoutsen
ddaeeba68b Merge pull request #1186 from balloob/remove-deprecated-methods
Remove deprecated methods from core
2016-02-10 18:52:57 -08:00
MartinHjelmare
75775a561b Use entity property available 2016-02-11 03:27:02 +01:00
Fabian Affolter
058315720f Fix typo 2016-02-10 23:59:34 +01:00
Flyte
4e0c7f8a3d Create additional mqtt helper function for using template payload. 2016-02-10 22:38:33 +00:00
Riccardo Massari
c705ca4288 Expose baud rate config for mysensors component 2016-02-10 23:16:41 +01:00
Per SandstrÃom
15ad48a7a0 kodi thumbnails 2016-02-10 19:48:41 +00:00
Ian Copp
c9c15c4cf7 Fix comment phrasing
Somehow I left out the "some". Whoops.
2016-02-10 11:32:56 -08:00
Ian Copp
3046bfce7b Add small time delay to restart-osx command 2016-02-10 11:29:25 -08:00
Flyte
d52e2019c0 Update mqtt.publish() function to use template_payload. Reorganise publish service. Use mqtt.publish() in tests. 2016-02-10 11:11:02 +00:00
Paulus Schoutsen
af8f6bcaba Remove deprecated methods from core 2016-02-09 23:59:31 -08:00
Daniel
cdf0e80773 Improve the robustness of the rfxtrx module, and solve issue #1116 2016-02-10 08:44:34 +01:00
Paulus Schoutsen
b0948bef5f Make State class immutable 2016-02-09 23:27:01 -08:00
Paulus Schoutsen
70a528c04b Merge pull request #1184 from balloob/group-of-groups
Support expanding nested groups
2016-02-09 22:56:30 -08:00
Theb-1
d796625098 flake8 fix 2016-02-09 22:51:44 -08:00
Paulus Schoutsen
dc44ef7356 Support expanding nested groups 2016-02-09 22:43:07 -08:00
Theb-1
c5c4085ad4 upper/arg list/response improvements 2016-02-09 22:27:54 -08:00
Paulus Schoutsen
09b3aba51b Merge pull request #1136 from turbokongen/verisure-locks
Added support for lock connected to Verisure system.
2016-02-09 21:20:52 -08:00
Paulus Schoutsen
6f3aefde64 Merge pull request #1179 from roqeer/patch-1
Add name property to DHT sensor
2016-02-09 21:14:23 -08:00
Theb-1
b3a1491482 pylint: ignore 'too-many-arguments' 2016-02-09 21:12:33 -08:00
Theb-1
b7ff79da24 Fixes and updates
Remove setting defaults twice
Add timeout
Add optional title and target
2016-02-09 20:48:17 -08:00
roqeer
4bf4d94344 Changed to dict lookup with default value
Corrected on request
2016-02-09 22:09:44 +01:00
roqeer
3e26af5ff1 Correct bad-indentation 2016-02-09 19:09:48 +01:00
roqeer
c1270cf0bb Add name property to DHT sensor
Add name to distinguish between multiple connected DHT sensors
2016-02-09 18:58:04 +01:00
Flyte
26fc637ab5 Add payload_template to mqtt 'publish' service call. 2016-02-09 15:41:31 +00:00
Fabian Affolter
66c5d96b43 Upgrade influxdb to 2.12.0 2016-02-09 16:32:05 +01:00
turbokongen@hotmail.com
41f908ed39 Added support for lock connected to Verisure system. 2016-02-09 13:17:05 +01:00
Theb-1
0f5487b95a Add REST notify component 2016-02-08 22:24:11 -08:00
Paulus Schoutsen
23c5159f6c Update frontend to fix map CSS 2016-02-08 21:58:41 -08:00
Paulus Schoutsen
4840dd297a Add unique ID to ecobee sensor 2016-02-08 20:39:09 -08:00
Dan Smith
4605742bb7 Merge pull request #1176 from kk7ds/mfi-tests
Add mFi tests
2016-02-08 19:07:48 -08:00
Paulus Schoutsen
f222340c8e Merge pull request #1174 from balloob/wink-light
Wink light to inherit from light
2016-02-08 19:05:39 -08:00
Dan Smith
b17df44402 Add tests for mFi switches 2016-02-09 03:03:26 +00:00
Dan Smith
895ddc8433 Add tests for mFi sensors
Note that some of the indirection here is so that I can reuse
a few things for mFi switch tests to follow.
2016-02-09 02:59:34 +00:00
Per Sandström
d867d26612 Merge pull request #1168 from persandstrom/sigterm_handler
fix sigterm crash
2016-02-08 19:27:26 +01:00
Per SandstrÃom
564e328698 fix sigterm crash 2016-02-08 18:09:46 +00:00
Paulus Schoutsen
160b811ddf Wink light to inherit from light 2016-02-08 08:53:22 -08:00
Paulus Schoutsen
2e164e519a Merge pull request #1160 from stjohnjohnson/live-camera-stream
Fixes #1062 - If supported, directly stream the MJPEG from the remote camera
2016-02-07 14:43:00 -08:00
Paulus Schoutsen
779188ad27 Merge pull request #1167 from kk7ds/mfi-improvements
Mfi improvements
2016-02-07 14:40:47 -08:00
Paulus Schoutsen
3f6349d663 Merge pull request #1170 from balloob/fix_vera_dimmer_bug
Refactor VeraLight to inherit from Light, rather then VeraSwitch.
2016-02-07 14:39:16 -08:00
pavoni
ac0dc10377 Refactor VeraLight to inherit from Light, rather then VeraSwitch. 2016-02-07 21:45:15 +00:00
Dan Smith
0a7db98b0e Round mFi sensor values to reasonable levels of precision
Most of the mFi sensors are able to reasonably provide accurate
readings to a tenth of a unit or so. This patch rounds them for
better display in the UI. Normally, I would expect this to be a view
action instead of altering the actual data emitted, but since these
values are reasonable for sensor precision, we're not really losing
anything. I followed the model from the openweathermap component, which
rounds for readability in the backend.
2016-02-07 20:51:00 +00:00
Dan Smith
8f690ff077 Add support for mPort input sensors
The mPort device has input pins that can be configured as digital or
analog inputs. We should support those as sensors.
2016-02-07 20:49:02 +00:00
Dan Smith
951fa603ff Support mPort voltage output switch types
An mPort device has a voltage output port that, if configured,
we should support like a switch.
2016-02-07 20:48:57 +00:00
Dan Smith
c113997609 Tweak mFi switch behavior to avoid false states
When we update the mFi server for the state of a switch, the new
state is not always reported immediately if we update right after
the action (the server is not RESTful).

This patch adds some internal target-state handling to report the
desired state on the next poll, allowing any subsequent polls to
override that state.

Also, bump the version requirement for mficlient to 0.2.2 to absorb
a bug fix.
2016-02-07 20:48:51 +00:00
St. John Johnson
f700635445 Add support for mjpeg component to proxy it's own stream 2016-02-07 12:02:52 -08:00
Paulus Schoutsen
d49fae86e4 Update frontend with entity picture fix 2016-02-07 11:33:01 -08:00
Paulus Schoutsen
64611ab2be Merge pull request #1157 from balloob/device-state-attributes
Clean up state_attributes vs device_state_attributes
2016-02-07 10:16:34 -08:00
Paulus Schoutsen
27dc2f61fb Merge pull request #1163 from balloob/migration-5-fix
Fix recorder migration 5
2016-02-07 10:16:24 -08:00
Paulus Schoutsen
cd25c8f72d Clean up some query stuff 2016-02-07 10:07:27 -08:00
Paulus Schoutsen
9ad1d290af Fix migration 5 2016-02-07 10:07:08 -08:00
Fabian Affolter
90ef81d8d5 Merge pull request #1161 from fabaff/bitcoin
Add icon
2016-02-07 15:37:40 +01:00
Fabian Affolter
02efe903ab Add icon 2016-02-07 12:43:02 +01:00
Fabian Affolter
0bb63bf3f0 Move configuration details to docs and add link 2016-02-07 12:36:29 +01:00
Fabian Affolter
e23db5d972 Some small changes 2016-02-07 12:03:01 +01:00
Fabian Affolter
e311f89056 Move details to docs and update docstrings/comments 2016-02-07 12:00:35 +01:00
Fabian Affolter
757946293e Move configuration details to docs 2016-02-07 11:52:17 +01:00
Paulus Schoutsen
98c6e56ea4 Merge pull request #1159 from nickwaring/proximity
Proximity component
2016-02-07 00:54:47 -08:00
Nick Waring
cd0cef6403 Component to track the proximity of devices to a zone 2016-02-07 08:52:32 +00:00
Nick Waring
0d2891ebcc Test file for the proximity component 2016-02-07 08:51:21 +00:00
Paulus Schoutsen
fb6aded2e1 Update frontend with new dependencies 2016-02-07 00:15:09 -08:00
Paulus Schoutsen
8b7cfc831d Merge pull request #1133 from balloob/cast-fix
Fix Chromecast discovery
2016-02-06 23:06:23 -08:00
Paulus Schoutsen
987be65d55 Update frontend to support default_view 2016-02-06 23:01:44 -08:00
Paulus Schoutsen
f08b77dc4c Clean up state_attributes vs device_state_attributes 2016-02-06 22:34:24 -08:00
Paulus Schoutsen
681b84e1bd Update frontend with FF url-sync fix 2016-02-06 22:07:30 -08:00
Paulus Schoutsen
4103d7463b Merge pull request #1155 from balloob/fix-kb-interrupt
Fix Ctrl+C with Subprocesses
2016-02-06 20:12:27 -08:00
Paulus Schoutsen
428750eeda Merge pull request #1151 from kk7ds/add-mfi
Add support for Ubiquiti mFi sensors and switches
2016-02-06 20:11:53 -08:00
Paulus Schoutsen
0ae36e1d28 Merge pull request #1140 from kk7ds/add-nx584-alarm
Add Caddx/GE/Interlogix NetworX alarm panel support
2016-02-06 20:09:25 -08:00
Philip Lundrigan
d2e8721918 Merge pull request #1124 from philipbl/fix_influx
Fix InfluxDB field type conflict
2016-02-06 20:49:20 -07:00
Philip Lundrigan
bbdc196127 Use entity_id attribute 2016-02-06 20:33:43 -07:00
Paulus Schoutsen
a417156d84 Merge pull request #1154 from balloob/fix-time-utils
Fixed time zone conversion with no TZ specified
2016-02-06 19:10:14 -08:00
Dan Smith
3575ddb6ef Add Caddx/GE/Interlogix NetworX alarm panel support
This adds support for NetworX-based alarm panels and should work for
any such panel equipped with a NX584 serial interface module. This
includes NX-4/6/8/8E, where the NX8E has this interface built-in.

It requires the pynx584 module, and requires running the server
component somewhere that has connectivity to the panel via serial,
which may include a serial-over-lan connection.
2016-02-07 03:06:58 +00:00
Dan Smith
ffc4822f50 Add support for Ubiquiti mFi switchable devices
This adds support for mFi devices that are swichable,
such as the mFi Outlet device.
2016-02-07 03:02:49 +00:00
Dan Smith
a147304be9 Add support for Ubiquiti mFi sensors
This adds support for sensors based on Ubiquiti's mFi platform.
All ports/sensors are detected from the mFi controller and exposed.
2016-02-07 02:58:04 +00:00
Ryan Kraus
a001780afb Fix Ctrl+C with Subprocesses
Added KeyboardInterrupt handling back to block_till_stopped method.
This is because Keyboard Interrupts are sent to both the parent and
child process in no particular order so both need to handle the
interrupt.
2016-02-06 21:50:06 -05:00
Ryan Kraus
7a00bf8696 Fixed time zone conversion with no TZ specified
Using .replace to set the current time zone appears to not handle
things correctly. The proper way to do this is apparently .localize.
2016-02-06 21:31:07 -05:00
Paulus Schoutsen
7eef831ff3 Merge pull request #1141 from kk7ds/add-uvc-cameras
Add Ubiquiti Unifi Video Camera support
2016-02-06 18:21:44 -08:00
Paulus Schoutsen
9fde97efed Merge pull request #1152 from balloob/bump-pyvera-version
Bump pyvera, pywemo, add available for wemo
2016-02-06 16:43:42 -08:00
MartinHjelmare
d773ad1ecb Fix mysensors version errors
* The application of the version check in unit_of_measurement was
	messed up after the last refactor. Fix that again.
* An error could occur in device_state_attributes if there was a
	mismatch between used value_type in the device and mysensors
	version in config. Add try... except to handle that.

Bump pyvera version.

Bump pywemo version.

Add unavailable status before properly initialised for maker and insight.
2016-02-07 00:28:12 +00:00
Dan Smith
cab1100a51 Add Ubiquiti Unifi Video Camera support
This adds support for Ubiquiti's UniFi Video cameras via their
NVR device (or service). By configuring just the address of the
NVR and a valid API key, all cameras are discovered and enabled,
including direct-to-camera image snapshot-based video support.
2016-02-06 22:57:44 +00:00
Dan Smith
3616d7a7ea Fix alarm service handler state updates
This changes the service handler dispatch code to always
call update_ha_state(), and cleans up the alarm platforms that
were calling it themselves.
2016-02-06 21:11:28 +00:00
Paulus Schoutsen
d38ad57b7d Merge pull request #1142 from kk7ds/add-honeywellus-thermostat
Add Honeywell US thermostat support
2016-02-06 13:05:53 -08:00
Paulus Schoutsen
b3e966665a Merge pull request #1150 from bradsk88/master
Updating to python-wink 0.5.0
2016-02-06 13:04:42 -08:00
bradsk88
6e69737e88 Updating to python-wink 0.5.0
Major bugfix.  ``` get_bulbs ``` and similar methods were always returning empty lists.

Better unit tests have been added to https://github.com/bradsk88/python-wink to avoid this regression.
2016-02-06 14:22:46 -06:00
Dan Smith
062fe79b3f Add Honeywell US thermostat support
This adds support for the US variant of the Honeywell connected
thermostat. The interface is super simple, so this doesn't add
any external dependencies. It supports basic temperature, setpoint,
and control.

Issue #998 notes that the existing honeywell module doesn't work
for US models, which is because they are totally different. In order
to indicate to the honeywell platform module that the thermostat
is a US-type, we key off of whether or not the thermostat id is
provided. This is something that US people have (and require to
identify one of potentially multiple thermostats in their account)
and EU people will not.
2016-02-06 20:14:40 +00:00
Paulus Schoutsen
af0a44d976 Merge pull request #1144 from MartinHjelmare/fix-mysensors-errors
Fix mysensors version errors
2016-02-06 11:35:49 -08:00
Paulus Schoutsen
43613f000d Merge pull request #1147 from balloob/debug-flag
Fix Interactive Debuggers
2016-02-06 09:56:12 -08:00
Paulus Schoutsen
dde80850a6 Merge pull request #1112 from balloob/switch-template
First cut of switch.template
2016-02-06 09:12:13 -08:00
Ryan Kraus
11a2b8888b Fixes for issue #1114
1. Moved RESTART_EXIT_CODE to constants so it can safely be used by
__main__.py.
2. Allowed __main__/main to return the desired exit code.
3. Forwarded the child processes exit code to the parent process to be
duplicated.
4. Added —debug flag to pass command to force Home Assistant to run in
only one process. A warning is printed to STDERR to indicate HASS is in
debug mode. Another is printed if HASS requests a restart in debug
mode. A restart request in debug mode will quit.
5. Added an argument to __main__/main/setup_and_run_hass to indicate
that it is running in the top process. This tells it to return the exit
code rather than exiting.
2016-02-06 09:48:36 -05:00
MartinHjelmare
b700ec4faa Fix mysensors version errors
* The application of the version check in unit_of_measurement was
	messed up after the last refactor. Fix that again.
* An error could occur in device_state_attributes if there was a
	mismatch between used value_type in the device and mysensors
	version in config. Add try... except to handle that.
2016-02-06 10:57:42 +01:00
Fabian Affolter
614034d196 Update docstrings 2016-02-06 08:23:30 +01:00
Paulus Schoutsen
c9d145cb13 Merge pull request #1120 from haraldnagel/dev
Add BloomSky weather station support
2016-02-05 20:06:53 -08:00
Harald Nagel
b6a32098d1 Add BloomSky weather station support 2016-02-06 01:37:32 +00:00
Flyte
4cf85294db Add template support to mqtt.publish service payload. 2016-02-05 21:47:27 +00:00
Eric Rolf
6fc68e9c8a Forgot to refactor demo. 2016-02-05 15:16:56 -05:00
Eric Rolf
ec88733b57 Refactor Method Name For Open and Close. 2016-02-05 15:10:53 -05:00
Eric Rolf
7ef2075520 Updated requirements_all.txt 2016-02-05 14:20:06 -05:00
Eric Rolf
fbd0dbf8ee Wink Garage Door Support 2016-02-05 12:53:57 -05:00
Paulus Schoutsen
2ba237eac8 Merge pull request #1134 from fabaff/icons
Add icon
2016-02-05 07:33:31 -08:00
Fabian Affolter
6bf4532608 Add icon 2016-02-05 13:08:17 +01:00
pavoni
2622cf2e53 Use available, remove state, improve true,false tests. 2016-02-05 11:18:50 +00:00
Paulus Schoutsen
a5db23afa4 Mock util.location by default 2016-02-04 22:26:02 -08:00
Paulus Schoutsen
2c4166b5f2 Update splunk.py 2016-02-04 22:06:27 -08:00
Paulus Schoutsen
8be9aaba4f Fix Chromecast discovery 2016-02-04 21:36:37 -08:00
Paulus Schoutsen
1b16d76c40 Merge pull request #1128 from miniconfig/splunk
Added a new component to log state changes to a Splunk instance using…
2016-02-04 20:58:12 -08:00
Paulus Schoutsen
1a6539ad41 Merge pull request #1110 from lukas-hetzenecker/feature-zwave-poll-and-scene
Z-Wave: Scene activation & Polling
2016-02-04 20:51:52 -08:00
Paulus Schoutsen
96066e94ab Merge pull request #1122 from molobrakos/tellduslive
reworked telldus live support
2016-02-04 20:46:23 -08:00
nkgilley@gmail.com
78e758925b remove commented lines. 2016-02-04 18:42:38 -05:00
nkgilley@gmail.com
19fc48f4a0 use raw regex 2016-02-04 18:39:09 -05:00
nkgilley@gmail.com
d469970e5a Speedtest.net component 2016-02-04 18:21:37 -05:00
Erik
50a9b3a7c0 reworked telldus live support 2016-02-05 00:07:12 +01:00
miniconfig
ab837f9070 Added a new component to log state changes to a Splunk instance using the HTTP Event Collector 2016-02-04 16:13:55 -05:00
Paulus Schoutsen
6149e509c3 Merge pull request #1127 from molobrakos/timedate
provide default icon
2016-02-04 13:04:09 -08:00
Erik
f3b74079e0 provide default icon 2016-02-04 21:55:22 +01:00
Philip Lundrigan
c580953bd8 Fix MQTT sensor 2016-02-04 12:38:48 -07:00
Philip Lundrigan
fc3741911c Fix problem with field type conflict in influxdb 2016-02-04 12:38:48 -07:00
Lukas Hetzenecker
2589e78e84 Z-Wave: This small refactor adds the following features:
* The poll interval got fixed and the poll intensity gets configurable in the settings
* Activated scenes now fire an event
2016-02-04 19:54:43 +01:00
pavoni
ced380f0cd Remove unneeded entity_id check and blank lines. 2016-02-04 17:24:38 +00:00
Paulus Schoutsen
a33f1c61e5 Merge pull request #1108 from lukas-hetzenecker/regression-zwave-light
Z-Wave Regression: Fix state attributes of lights and switches.
2016-02-03 21:25:13 -08:00
Lukas Hetzenecker
8cf5ca0ba8 Regression: The device specific attributes of ZWave devices got lost.
Light and ZWaveDeviceEntity both have overwritten the property state_attributes
This includes the device specific attributes in the state_attributes again
2016-02-04 02:12:33 +01:00
pavoni
b20d3f8b3a Update docstrings. 2016-02-03 23:23:19 +00:00
Paulus Schoutsen
1f34b3586e Merge pull request #1117 from philipbl/influx_ssl
Add ability to specify SSL for InfluxDB connection
2016-02-03 13:33:08 -08:00
Paulus Schoutsen
37dadd1ae0 Merge pull request #974 from sdague/domains
Add recording of domain to state tables
2016-02-03 12:26:31 -08:00
Paulus Schoutsen
fac8d4b969 Merge pull request #1115 from sdague/test
add pytest-timeout to test runs
2016-02-03 12:24:35 -08:00
Sean Dague
efcba8f1ca add pytest-timeout to test runs
This adds a default 30 second timeout on every test method so that
deadlocks or broken threads are move obvious in travis. It also passes
-v by default to make things a little more verbose on where things
fail when they are failing.
2016-02-03 15:13:30 -05:00
Sean Dague
abc253c4c5 implement get_significant_states
This adds a new function to history module which returns significant
states. For most domains this is the list of state changes. For the
thermostat domain this also includes attribute changes, so that
changes in the current_temperature are exposed to the graphing layer.

Closes #881
2016-02-03 15:05:43 -05:00
Sean Dague
3d00735341 Add recording of domain to state tables
Some domains, like thermostat, need all state records, not just state
change ones, to provide accurate graphs. This introduces a new db
migration which adds a 'domain' column to all states so that is a fast
query.

Indexes were added to help with query performance.

This includes a data migration which post-date populates domain. On
large HA dbs this might take real time, as it has to touch every state
row. 100 MB db (91k states) updated in a couple of seconds on my
reasonably fast server. Be forewarned.

This is part of bug #881
2016-02-03 15:05:43 -05:00
Paulus Schoutsen
ce75c590b1 Merge pull request #1109 from lukas-hetzenecker/bugfix-zwave-fibaro-wall-plug
Z-Wave: Bugfix for Fibaro Wall Plug component
2016-02-03 08:34:06 -08:00
pavoni
6e6c3c5cd5 Tidy. 2016-02-03 14:30:58 +00:00
pavoni
5521096c02 Add actions. 2016-02-03 14:29:25 +00:00
Fabian Affolter
356013118d Update docstrings 2016-02-03 15:13:53 +01:00
pavoni
9a9dbcfaea Refactor, support template logic values, add tests. 2016-02-03 13:16:13 +00:00
Lukas Hetzenecker
1c33e01b99 styleguide fix 2016-02-03 13:03:01 +01:00
Lukas Hetzenecker
d09837fef6 Zwave: This is a bugfix for the Fibaro Wall Plug component
As discussed here ( https://www.domoticz.com/forum/viewtopic.php?f=6&t=5661 ) this components reports two different power consumption values.
Unfortunately only one of them is correct. Both of them map to the exactly same object id.
This bugfix gets rid of the incorrect one.
2016-02-03 12:44:11 +01:00
Paulus Schoutsen
f5e736d271 Merge pull request #1105 from balloob/disable-location-in-tests
Disable location queries
2016-02-02 21:38:20 -08:00
Paulus Schoutsen
61630783f1 Disable location queries 2016-02-02 21:33:59 -08:00
Paulus Schoutsen
077797ac4f Merge pull request #1086 from carlosmgr/dev
update SSH for aruba device tracker
2016-02-02 18:33:49 -08:00
Paulus Schoutsen
b14f7f7ed0 Merge pull request #1099 from balloob/sensor_template_startup_error
Sensor template startup error
2016-02-02 18:32:09 -08:00
carlosmgr
3d695405b7 pep8 2 time 2016-02-03 00:03:50 +00:00
carlosmgr
55932b048e fix pep8 2016-02-02 23:54:32 +00:00
Fabian Affolter
b19fbd8e72 Update docstrings 2016-02-03 00:35:53 +01:00
Fabian Affolter
635369ad65 Update docstrings 2016-02-03 00:23:59 +01:00
Fabian Affolter
bd8881cbe1 Add icon 2016-02-03 00:12:01 +01:00
Fabian Affolter
847e92f57a Update docstrings 2016-02-03 00:01:26 +01:00
Fabian Affolter
5cea8fda9f Update link to docs and add docstrings 2016-02-02 23:55:44 +01:00
carlosmgr
7f87df20c2 ssh aruba 2016-02-02 22:40:04 +00:00
carlosmgr
e91c8e4143 ssh aruba.py
req pexpect
2016-02-02 21:49:11 +00:00
carlosmgr
cd00ff8b56 Merge remote-tracking branch 'upstream/dev' into dev 2016-02-02 20:07:31 +00:00
Philip Lundrigan
018329b12b Add ability to specify ssl 2016-02-02 12:58:38 -07:00
pavoni
a955f3db08 WIP commit - template state working, on / off still to do. 2016-02-02 19:25:17 +00:00
pavoni
d344defc7e Switch to warning. 2016-02-02 16:26:17 +00:00
Paulus Schoutsen
2da422fd77 Merge pull request #1098 from balloob/media-player-test
Clean up and test media player
2016-02-02 08:09:40 -08:00
pavoni
93a38d39ef Add test for missimng attributes. 2016-02-02 14:15:06 +00:00
pavoni
3aad223c95 Change to warning if attributes missing. 2016-02-02 14:14:29 +00:00
Ryan Kraus
1a5d18fd66 Merge pull request #1012 from balloob/restart-service
Restart service
2016-02-02 07:15:40 -05:00
Paulus Schoutsen
e7e540d4bb Clean up and test media player 2016-02-02 00:31:36 -08:00
Paulus Schoutsen
35613d7fbf Merge pull request #1097 from molobrakos/add-test
add test for unsafe yaml
2016-02-02 00:22:19 -08:00
Erik
00d1cab091 add test for unsafe yaml 2016-02-02 08:41:18 +01:00
Paulus Schoutsen
26efaa91a3 Merge pull request #1090 from balloob/fix_sensor_template_entity_id
Fix bug in sensor.template entity_id
2016-02-01 21:21:57 -08:00
Paulus Schoutsen
3c37ecc477 Merge pull request #1091 from TangoAlpha/dev
Improvements to device detection
2016-02-01 21:21:15 -08:00
Paulus Schoutsen
274aaabd93 Merge pull request #1094 from balloob/cast-multi-room
No longer ignore ports for Chromecasts
2016-02-01 21:16:50 -08:00
Paulus Schoutsen
c8bfd27182 No longer ignore ports for Chromecasts 2016-02-01 21:07:33 -08:00
Tim
08ab7dba2c Fix whitespace 2016-02-02 00:21:15 +00:00
Tim
54cc35d729 Merge branch 'dev' of https://github.com/TangoAlpha/home-assistant into dev 2016-02-02 00:17:03 +00:00
Tim
031e7a4013 New liffylights release improves device detection
Increase device polling to 30 seconds
2016-02-02 00:15:38 +00:00
Paulus Schoutsen
41165695f0 Merge pull request #1071 from deisi/onewireupdate
Little improvement for the onewire platform
2016-02-01 15:26:22 -08:00
pavoni
9c33af60f2 Fix unreachable code! 2016-02-01 18:38:11 +00:00
pavoni
7c1241c1f8 Add another test, revise another. Improve coverage. 2016-02-01 18:30:39 +00:00
Tim
9caa4752a4 New liffylights release improves device detection
Increase device polling to 30 seconds
2016-02-01 18:29:43 +00:00
Malte Deiseroth
cb2e75befd removed trailing whitespace 2016-02-01 19:24:08 +01:00
pavoni
d54e10e54a Improve test coverage of error conditions. 2016-02-01 18:18:51 +00:00
pavoni
95748a6880 Generate entity id correctly, was using friendly_name. 2016-02-01 17:45:18 +00:00
Paulus Schoutsen
10a41a22dc Merge pull request #1084 from molobrakos/tellduslive
handle situation where no name is set yet for the sensor
2016-02-01 08:55:39 -08:00
Erik
ac0b6ca50c handle situation where no name is set yet for the sensor 2016-02-01 17:42:08 +01:00
Paulus Schoutsen
a0f6f3ac22 Merge pull request #1085 from molobrakos/yaml_safe_load
use yaml safe loader
2016-02-01 08:15:32 -08:00
Paulus Schoutsen
d9aff0c76d Merge pull request #1089 from balloob/yr
Added and fixed yr tests
2016-02-01 08:11:18 -08:00
Daniel
5005b20122 Added and fixed yr tests 2016-02-01 15:50:17 +01:00
carlosmgr
b3ef2bd2d9 Update aruba.py 2016-02-01 12:23:20 +00:00
Fabian Affolter
e29a2fa45a Fix typo 2016-02-01 11:49:44 +01:00
Fabian Affolter
395743005a Add link to docs, new docstrings, and update docstrings 2016-02-01 11:47:09 +01:00
Fabian Affolter
8de56bc8e2 Fix docstrings 2016-02-01 11:31:27 +01:00
Paulus Schoutsen
79b6269aa2 Merge pull request #1083 from balloob/fix-requirements
Fix gen_requirements_all
2016-02-01 00:00:51 -08:00
Paulus Schoutsen
525b206e1b Fix gen_requirements_all 2016-01-31 23:55:02 -08:00
Paulus Schoutsen
2f4e40db27 Merge pull request #1076 from MartinHjelmare/add-entity-online-prop
Fix 'unavailable' entity
2016-01-31 17:26:12 -08:00
MartinHjelmare
38c9f7a37a Fix 'unavailable' entity
* Report friendly_name, icon and customized attributes for 'unavailable'
  entities.
2016-02-01 02:16:56 +01:00
Paulus Schoutsen
c725f7883a Merge pull request #1063 from stefan-jonasson/samsungtv
Added a new media_player platform for controlling Samsung TVs
2016-01-31 16:57:11 -08:00
Paulus Schoutsen
10f79ab45d Merge pull request #1073 from MartinHjelmare/add-entity-online-prop
Add new 'available' property to entity.py
2016-01-31 15:59:28 -08:00
MartinHjelmare
455593017d Add new 'available' property to entity.py
* Add 'available' property. Return True by default.
* Use new property in update_ha_state(). If available is False, set
  state to 'unavailable', through constant.
* Add STATE_UNAVAILABLE constant 'unavailable' in const.py.
* Fix docstrings in entity.py and const.py, according to PEP257.
  Ignore D203 and D105.
2016-01-31 23:58:19 +01:00
Malte Deiseroth
d6b19aae48 - check for reasonable temperature values
- round temperature to one digit
2016-01-31 22:56:48 +01:00
Paulus Schoutsen
6519333e1d Merge pull request #1070 from balloob/input-select
Add input_select component
2016-01-31 13:44:32 -08:00
Paulus Schoutsen
41919e7339 Update frontend for input_select 2016-01-31 13:39:50 -08:00
Stefan Jonasson
1c10f218de Fixed duplicate import statements and made use of the config_helper 2016-01-31 22:17:00 +01:00
Paulus Schoutsen
96710ad410 Add input_select component 2016-01-31 12:52:51 -08:00
Paulus Schoutsen
c95c3d9198 Update frontend with weblink support 2016-01-31 12:00:45 -08:00
Stefan Jonasson
5719743ec7 Fixed .coveragerc and requirements_all.txt 2016-01-31 20:02:51 +01:00
Per Sandström
e2e8d4276f Merge pull request #1069 from persandstrom/vsure0.5.0
vsure 0.5.0
2016-01-31 19:33:09 +01:00
Per Sandström
3f03fefd35 vsure 0.5.0 2016-01-31 19:23:53 +01:00
Stefan Jonasson
2dab815f90 Fixes imports, styles and other misstates 2016-01-31 19:12:00 +01:00
Paulus Schoutsen
6a4b63f807 Merge pull request #1056 from flavio/scsgate
Add support for the SCSGate device
2016-01-31 09:34:07 -08:00
Flavio Castelli
8eef978241 Add support for the SCSGate device
Support the SCSGate device. This will allow home-assistant to interact
with BTicino/Legrand MyHome system.

Signed-off-by: Flavio Castelli <flavio@castelli.me>
2016-01-31 18:30:43 +01:00
Paulus Schoutsen
1789a08d21 Merge pull request #1065 from kennedyshead/weblink
Weblink component
2016-01-31 09:20:17 -08:00
magnusknutas
de4dab74b1 Adding weblink component
Adding weblink component tests
2016-01-31 18:13:04 +01:00
Paulus Schoutsen
16b1529d14 Merge pull request #1059 from balloob/entity-component-enhancements
Add tests and custom interval for entity component
2016-01-31 09:03:55 -08:00
Paulus Schoutsen
0b8e097705 Remove unused environment util 2016-01-31 08:58:30 -08:00
Paulus Schoutsen
b21be63220 Merge pull request #1066 from TangoAlpha/dev
Update for new liffylights release
2016-01-31 08:32:51 -08:00
Tim
e6a8746dba Update requirements_all 2016-01-31 15:07:06 +00:00
Tim
1974eda51d Update for new liffylights release
Fix incorrect packet timeout/ack code causing flooding when no bulbs were online, which consumed all WorkerPool threads
2016-01-31 13:31:12 +00:00
Stefan Jonasson
bd475f5db1 Added a new media_player platform for controlling Samsung TVs with a lan interface.
Configured like this
 media_player:
  platform: samsungtv
  host: <IP OF TV>
  name: <Name of the tv>
2016-01-31 10:06:39 +01:00
Paulus Schoutsen
fce8815ab4 Support custom interval for platforms 2016-01-31 01:01:23 -08:00
Paulus Schoutsen
90e17fc77f Add tests for entity component 2016-01-31 01:01:23 -08:00
Paulus Schoutsen
6418634f3a Merge pull request #1049 from balloob/new-tests
Adding more unit tests
2016-01-30 23:32:34 -08:00
Ryan Kraus
a230d00ed0 Added test for Introduction component
This test may seem useless, but it is good to ensure that default
components don’t ever crash HASS.
2016-01-30 22:50:56 -05:00
Ryan Kraus
5fdbe5fd9a More tests for Binary Command Sensor
1. Added a test for detecting STATE_OFF
2. Fixed tests for detecting STATE_ON
2016-01-30 22:41:29 -05:00
Ryan Kraus
283d621e90 Added tests for Binary Command Sensor 2016-01-30 22:32:25 -05:00
Ryan Kraus
2d0004f46a Another test for for command sensor
Added a test for command sensors with bad configurations.
2016-01-30 22:16:22 -05:00
Ryan Kraus
6a08f14120 Additional tests for Command Sensor.
1. Moved template testing out of main test.
2. Added test for bad command.
2016-01-30 22:13:42 -05:00
Ryan Kraus
97e867052d Added tests for command sensor
Added tests to create and check basic functionality of command sensor.
2016-01-30 22:01:10 -05:00
Ryan Kraus
2651021461 Added test for entity customization
Added test for entity customization from configuration. Processes a
sample configuration to hide an entity, creates the entity, updates ha
state, and then verifies customization made it through.
2016-01-30 21:27:00 -05:00
Erik
4b253d17ba use yaml safe loader 2016-01-31 00:46:08 +01:00
Paulus Schoutsen
b7722ec452 Allow usage of words domain, service, call_id in service data 2016-01-30 15:18:26 -08:00
magnusknutas
fd6086a5d6 Testing logbook service 2016-01-30 15:18:26 -08:00
Paulus Schoutsen
3e35bc06fc Merge pull request #1055 from TangoAlpha/dev
Update to new release of liffylights
2016-01-30 12:56:22 -08:00
Tim
f76dee8a05 Update to new release of liffylights 2016-01-30 20:48:57 +00:00
Ryan Kraus
56ac4281c7 Better tear down of util/package tests
Explicitly removed temp directory at the end of util/package unit tests.
2016-01-30 14:39:17 -05:00
Ryan Kraus
b8e149fe7d Cleaned up universal MP tests
Changed all assertEquals in universal media player tests to have
assumed value first.
2016-01-30 14:38:27 -05:00
Ryan Kraus
4a8f55e630 Revised package util tests
The package util tests were revised to pull the external library
pyhelloworld3 from an internal source rather than external. This speeds
up tests, makes tests more reliable, and removes dependency on internet
connection.
2016-01-30 14:08:32 -05:00
Ryan Kraus
de61bcb80e Additional testing for logger component
Added an additional test for the logger component the validates the
filtering logic of the filters that were created during setup.
2016-01-30 13:23:35 -05:00
Ryan Kraus
4cc9606bcc Added test for logger component. 2016-01-30 13:03:46 -05:00
Ryan Kraus
8ac763c6f6 Added test for universal mp service routing.
Added tests to ensure that the Universal Media Player is routing
service calls correctly.
2016-01-30 12:26:28 -05:00
Ryan Kraus
6a75b524cb Removed unused private method from universal media player
The universal media player contained a private method that was replaced
by the update method. It was meant to be removed and wasn’t. This
commit removed that method.
2016-01-30 11:57:46 -05:00
Ryan Kraus
c1d057407b Fixed typo in universal media player test. 2016-01-30 11:53:15 -05:00
Ryan Kraus
c396dbb570 Added tests to check setup and config of universal media player. 2016-01-30 07:18:37 -05:00
Ryan Kraus
0631f5c59d Added tests for package utilities 2016-01-30 06:44:22 -05:00
Paulus Schoutsen
10f9c049bb Version bump to 0.13.0.dev0 2016-01-29 22:38:01 -08:00
Paulus Schoutsen
d0bcec12b9 Merge pull request #1001 from balloob/dev
0.12
2016-01-29 22:37:38 -08:00
Paulus Schoutsen
9fc62c1851 Version bump to 0.12 2016-01-29 22:33:46 -08:00
Paulus Schoutsen
23d88cd4ad Merge pull request #1047 from haraldnagel/dev
Fix #1046 by correcting platform name
2016-01-29 22:14:21 -08:00
Harald Nagel
86f433067c Fix #1046 by correcting platform name 2016-01-30 06:05:09 +00:00
Ryan Kraus
106c53abf1 Revised HASS Core test
Changed the HASS Core test that tested KeyboardInterrupt handling to
now test SIGTERM handling. KeyboardInterrupts are no longer handled in
the HASS application process as they are handled in the HASS parent
process. SIGTERM is the proper way to now stop HASS.
2016-01-29 22:42:39 -05:00
Paulus Schoutsen
75232c43ce Merge pull request #1044 from w1ll1am23/googlevoice
Google Voice SMS notification support
2016-01-29 19:32:23 -08:00
Ryan Kraus
b56369855a Cleaned up restart handling in __main__.py
1. Fixed logged message about SIGTERM binding failure.
2. Set to only restart HASS with an exit code of 100.
3. Fixed typo in comment.
2016-01-29 22:11:11 -05:00
William Scanlon
01a743c7d4 Log if target == NULL 2016-01-29 22:09:59 -05:00
William Scanlon
28f4283b40 Validate target 2016-01-29 22:04:02 -05:00
Ryan Kraus
a41b66bb94 Cleaned up block_till_stop in core.py
1. Removed handling of KeyboardInterrupt. This will no longer happen
now that HASS is run in a subprocess. The KeyboardInterrupt will not be
sent to the parent process which will send a SIGTERM to the HASS
process.
2. Fixed logger warning about not being able to bind to SIGTERM.
3. Removed check for Windows OSs when binding to SIGTERM. This check
was originally put in place when HASS was binding to SIGQUIT. SIGTERM
exists in NT OSs, so the check is no longer required.
3. Now returning exit code of 100 when requesting a restart. This will
allow the parent process to only restart HASS if it is specifically
requested and not just on any encountered crash.
2016-01-29 22:02:39 -05:00
William Scanlon
375faa9c91 Fixed style error 2016-01-29 21:53:06 -05:00
Paulus Schoutsen
ef132e4583 Add tests for color util 2016-01-29 18:44:21 -08:00
Paulus Schoutsen
05cbe54db3 Remove owntracks from coverage 2016-01-29 18:02:42 -08:00
Paulus Schoutsen
ae7697b900 Merge pull request #1037 from balloob/owntracks_mobile_beacons
Owntracks - mobile ibeacon tracking.
2016-01-29 18:01:31 -08:00
Martin Hjelmare
a8f7bc2324 Merge pull request #1034 from MartinHjelmare/refactor-s_v_types
Mysensors: Refactor s_types and v_types mapping
2016-01-30 01:04:06 +01:00
MartinHjelmare
9db0987e53 Refactor s_types and v_types mapping
To be able to handle new platforms with multiple used v_types but
single states, a new more strict mapping was required. Each s_type is
now mapped to its corresponding v_type(s) in a dict of lists.
2016-01-30 00:55:13 +01:00
pavoni
515307b404 Remove dev/null from build script. 2016-01-29 22:11:01 +00:00
pavoni
03e7ac2a0e Fix typo. 2016-01-29 22:11:00 +00:00
pavoni
c5cdf6d7cf Copy kwargs, remove traces. 2016-01-29 22:11:00 +00:00
pavoni
a3abd8bb08 Revise tracked beacon name. 2016-01-29 22:11:00 +00:00
pavoni
5a7e380396 Revise beacon name. Add debug. 2016-01-29 22:11:00 +00:00
pavoni
09ef2e1b8c Add docstring, remove trace. 2016-01-29 22:11:00 +00:00
pavoni
80d2f35cc5 First cut mobile beacon tracking. 2016-01-29 22:11:00 +00:00
William Scanlon
ad57f27989 Added test exclude in .coveragerc 2016-01-29 16:54:56 -05:00
William Scanlon
a6720f54b3 Fixed style errors 2016-01-29 16:48:01 -05:00
William Scanlon
aaf75c7e45 Added target support for googlevoice 2016-01-29 14:14:27 -05:00
Martin Hjelmare
c5de42e7b5 Merge pull request #1033 from MartinHjelmare/refactor-unit-of-measurement
Mysensors: Refactor unit of measurement
2016-01-29 18:21:15 +01:00
Paulus Schoutsen
d6bb6a0777 Merge pull request #1020 from kennedyshead/dev
Adding service for logbook
2016-01-29 09:19:34 -08:00
Paulus Schoutsen
f87c7d6732 Merge pull request #1023 from flyte/zigbee-pr
Add ZigBee integration and components.
2016-01-29 09:18:10 -08:00
MartinHjelmare
575e97a051 Refactor unit of measurement
* Add dict with map of units to v_types.
* Avoid numerous if, elif branches and return statements.
* Add custom unit decoupled from other units.
2016-01-29 18:11:58 +01:00
Flyte
902077d78b Catch ZigBee exceptions when communicating with the devices and log appropriate messages. 2016-01-29 16:45:49 +00:00
Flyte
c17a4fca80 ZigBee: Ensure correct entity types are used for each component. 2016-01-29 12:00:53 +00:00
Flyte
241a768983 ZigBee: Remove extraneous update_ha_state() usage and use it more appropriately for initial state update. 2016-01-29 11:33:15 +00:00
Flyte
72cca0a91a ZigBee: Handle case in which Serial port is unable to open 2016-01-29 10:48:15 +00:00
Greg Dowling
dd7a7f4c75 Merge pull request #1036 from balloob/owntracks_beacon2
Improve owntracks events, add support for stationary ibeacons.
2016-01-29 09:47:20 +00:00
pavoni
468a8a1013 Improve owntracks events, add support for stationary ibeacons. 2016-01-29 09:39:00 +00:00
magnusknutas
24d84dbb42 Added entity_id and domain 2016-01-29 08:13:46 +01:00
Paulus Schoutsen
893a14e8db Merge pull request #1035 from balloob/fix-imports
Fix imports and rename insteon to insteon_hub
2016-01-28 21:53:21 -08:00
Paulus Schoutsen
cbc6323438 Fix imports 2016-01-28 21:45:26 -08:00
Paulus Schoutsen
d6db00b55a Merge pull request #1022 from haraldnagel/dev
Move Insteon API KEY into configuration.yaml
2016-01-28 21:36:35 -08:00
Harald Nagel
eebb736bf8 Add ability to control dimmable sources 2016-01-29 04:36:40 +00:00
Harald Nagel
f192a15a8f Remove unnecessary try around import 2016-01-29 02:35:04 +00:00
William Scanlon
9ec44fbe32 Updated googlevoicesms version 2016-01-28 21:19:15 -05:00
William Scanlon
ffc06e8bcb pygooglevoice-sms support 2016-01-28 21:07:59 -05:00
William Scanlon
9c7b2ce9fd pygooglevoice-sms support 2016-01-28 21:07:16 -05:00
Paulus Schoutsen
1de7dcdb5f Merge pull request #1025 from molobrakos/yr-position
allow monitoring weather at other location than home
2016-01-28 08:49:48 -08:00
Erik
9e7886b909 allow monitoring weather at other location than home (such as summer house) 2016-01-28 17:16:02 +01:00
Flyte
4045fb6862 Fix import-before-install of xbee-helper dependency. 2016-01-28 13:44:37 +00:00
Flyte
dda4f84150 Add zigbee components. 2016-01-28 13:18:29 +00:00
magnusknutas
fda88f8fda logbook.log the name of the game 2016-01-28 09:51:05 +01:00
Harald Nagel
3c05c8d1db Use validate_config, watch for import exception 2016-01-28 05:55:36 +00:00
Harald Nagel
21ec435430 Move Insteon API KEY into configuration.yaml 2016-01-28 03:01:32 +00:00
magnusknutas
24893bc28d Less complex service setup 2016-01-27 18:03:37 +01:00
magnusknutas
403b9cbe3e And with template support 2016-01-27 17:37:15 +01:00
magnusknutas
8b0d19835c Cleanup 2016-01-27 17:32:57 +01:00
magnusknutas
c31522eea9 Logbook service 2016-01-27 17:27:55 +01:00
Paulus Schoutsen
ee33aa73e1 Merge pull request #1017 from fabaff/psutil-upgrade
Upgrade psutil to 3.4.2
2016-01-27 08:08:21 -08:00
Paulus Schoutsen
47498e4aa9 Merge pull request #1016 from fabaff/cpuinfo-upgrade
Upgrade py-cpuinfo to 0.1.8
2016-01-27 08:07:55 -08:00
Fabian Affolter
ef4661f1e6 Upgrade psutil to 3.4.2 2016-01-27 12:26:38 +01:00
Fabian Affolter
b4070cfb78 Upgrade py-cpuinfo to 0.1.8 2016-01-27 11:43:49 +01:00
Fabian Affolter
c750f16275 Update docstings 2016-01-27 09:34:14 +01:00
Fabian Affolter
2248c271fa Add link to docs 2016-01-27 09:25:44 +01:00
Fabian Affolter
87b33d5098 Move configuration details to docs 2016-01-27 09:23:44 +01:00
Fabian Affolter
cf7c06d307 Update docstring and fix typos 2016-01-27 09:21:21 +01:00
Fabian Affolter
70d95cb6aa Add link to docs 2016-01-27 09:08:04 +01:00
Fabian Affolter
2c151c6db9 Update docstring 2016-01-27 09:01:08 +01:00
Fabian Affolter
3fc5a60634 Add link to docs 2016-01-27 09:00:01 +01:00
Fabian Affolter
94d2f23cfc Add link to docs and remove configuration details 2016-01-27 08:08:04 +01:00
Fabian Affolter
4bd102ddf5 Add twitter docs 2016-01-27 08:08:04 +01:00
Fabian Affolter
232aa792f1 Add link to docs and update docstrings 2016-01-27 08:08:04 +01:00
Paulus Schoutsen
ce9f76a0be Add onewire to coverage 2016-01-26 23:07:01 -08:00
Paulus Schoutsen
f3f592cdec Merge pull request #982 from stefan-jonasson/dev
Updated the entity names for all z-wave devices.
2016-01-26 22:51:34 -08:00
Stefan Jonasson
1d2cd0811b Updated Imports.
ZWave modules now import the domain from the base domain.
2016-01-27 07:37:41 +01:00
Paulus Schoutsen
886b581d2a Merge pull request #1002 from kennedyshead/dev
Running periodic tasks
2016-01-26 21:42:06 -08:00
Paulus Schoutsen
88387d3123 Merge branch 'pr/78' into dev
Conflicts:
	homeassistant/const.py
2016-01-26 21:07:53 -08:00
Ryan Kraus
3534c975f3 Added missing CONF_ICON constant 2016-01-26 22:46:01 -05:00
Ryan Kraus
519abbbfa2 Better handling of second KeyboardInterrupt
Now the second KeyboardInterrupt will be cleanly handled by the parent
process.
2016-01-26 22:41:57 -05:00
Ryan Kraus
b596fa33d6 Implemented restart service
Implemented an OS and environment safe restart service. This works by
running Home Assistant in a child process. If the child process
terminates with an exit code > 0, HASS is restarted. SIGTERM and
KeyboardInterrupts to the parent process are forwarded to the child
process. KeyboardInterrupts will only be forwarded once. The second
KeyboardInterrupt will be handled by the parent.
2016-01-26 22:39:59 -05:00
Martin Hjelmare
14cd27aaa7 Merge pull request #1011 from MartinHjelmare/fix-unit-of-measurement
Fix unit of measurement
2016-01-27 03:40:50 +01:00
MartinHjelmare
2e175b88bc Fix unit of measurement
* Add version check in unit_of_measurement, to avoid error.
* Remove not needed metric check in unit_of_measurement.
* Add more value types to unit_of_measurement.
* Fix unit prefix
* Remove unused SCAN_INTERVAL variable.
2016-01-27 03:18:59 +01:00
Paulus Schoutsen
537a7789fd Merge pull request #1005 from fabaff/astral-upgrade
Updgrade to astral 0.9
2016-01-26 17:48:14 -08:00
Paulus Schoutsen
80d1ab78dd Merge pull request #1006 from fabaff/influxdb-upgrade
Upgrade influxdb to 2.11.0
2016-01-26 17:47:59 -08:00
Paulus Schoutsen
821238f889 Merge pull request #1007 from fabaff/telegram-upgrade
Upgrade python-telegram-bot to 3.2.0
2016-01-26 17:47:42 -08:00
Paulus Schoutsen
33a9ec0106 Merge pull request #1008 from fabaff/blockchain-upgrade
Upgrade blockchain to 1.2.1
2016-01-26 17:47:14 -08:00
Paulus Schoutsen
a8f0f313c8 Merge pull request #1009 from fabaff/docstrings
Update docstrings
2016-01-26 17:46:56 -08:00
Martin Hjelmare
6796219f37 Merge pull request #1010 from MartinHjelmare/fix-device-attr
Fix device_state_attributes
2016-01-27 02:43:34 +01:00
MartinHjelmare
1dae22a465 Fix device_state_attributes
* Return a dict with keys as the names of the enum members instead of
	the member values.
* This fixes a TypeError: unorderable types: int() < str()
2016-01-27 02:33:21 +01:00
Fabian Affolter
7aba78f96e Update docstrings 2016-01-27 00:08:06 +01:00
Fabian Affolter
06cf07b097 Upgrade blockchain to 1.2.1 2016-01-26 23:53:30 +01:00
Fabian Affolter
271af2c608 Upgrade python-telegram-bot to 3.2.0 2016-01-26 23:47:06 +01:00
Fabian Affolter
8c6ce217e6 Upgrade influxdb to 2.11.0 2016-01-26 23:45:39 +01:00
Fabian Affolter
5410a0c8f6 Updgrade to astral 0.9 2016-01-26 23:34:25 +01:00
Stefan Jonasson
1a422ecd5a Moved common z-wave node functionality to a common z-wave class 2016-01-26 22:11:27 +01:00
magnusknutas
6add5e387b Remove unused import 2016-01-26 21:41:12 +01:00
magnusknutas
ca070a36e3 Dont wrap '/int' parameters with tuple 2016-01-26 21:38:07 +01:00
magnusknutas
2c3a6e7905 Remove not needed log warning 2016-01-26 21:30:00 +01:00
magnusknutas
0a4e857901 And a test just to see if nothing works if not providing any vars 2016-01-26 21:21:54 +01:00
magnusknutas
d4b444823c Tests for time and a fix for wrong access of _LOGGER 2016-01-26 21:11:30 +01:00
magnusknutas
2382dffbf4 pushed test code :) fixed now 2016-01-26 20:49:51 +01:00
magnusknutas
33b0f4d05d Fixes bug in time trigger and adds test for ex. /two 2016-01-26 20:43:29 +01:00
Stefan Jonasson
5b6371ecda Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	homeassistant/components/light/zwave.py
#	homeassistant/components/switch/zwave.py
2016-01-26 20:31:42 +01:00
magnusknutas
6f1f8ffea0 Merge remote-tracking branch 'upstream/dev' into dev 2016-01-26 20:23:48 +01:00
magnusknutas
1f6f2de9c6 Sorry, I was wrong they are needed 2016-01-26 19:37:53 +01:00
Martin Hjelmare
b13e48bd71 Merge pull request #999 from MartinHjelmare/fix-not-adding-devices
Fix adding devices on the fly
2016-01-26 19:30:31 +01:00
magnusknutas
9a79ecf2d3 Remove warnings no longer needed (I think :D) 2016-01-26 19:25:41 +01:00
magnusknutas
ebd475b380 Unused import was the problem 2016-01-26 18:50:25 +01:00
magnusknutas
cff77a175d Year periodic test (just to trigger travis but should maybe be here anyway) 2016-01-26 18:44:41 +01:00
magnusknutas
726637b867 New and improved handling of the matching! Kudos to @balloob 2016-01-26 18:37:19 +01:00
MartinHjelmare
9117fa6eb8 Fix adding devices on the fly
Devices were not added without persistence enabled and restart of HA.
Node id was added to defaultdict(list) by mistake when checking if list
of defaultdict was empty.

* Fix adding devices in mysensors_callback.
* Change devices to regular dict.
2016-01-26 18:12:13 +01:00
magnusknutas
6ae57b5aaf Some warnings if input is wrong for periodic tasks 2016-01-26 17:35:12 +01:00
magnusknutas
e8e2814313 Warnings for not divisible settings 2016-01-26 17:30:55 +01:00
magnusknutas
a918be517d test past midnight support for hours 2016-01-26 17:13:18 +01:00
magnusknutas
ec5d88b98e hourly periodic task 2016-01-26 17:06:50 +01:00
magnusknutas
13fbefcdf8 Running periodic tasks 2016-01-26 10:28:31 +01:00
Stefan Jonasson
f4c9540a1b Updated teh entity_id generation
Entity ids will now look like this:
sensor.philio_technology_corporation_psm021_slim_multisensor_doorwindow_sensor_7
sensor.philio_technology_corporation_psm021_slim_multisensor_luminance_7
sensor.philio_technology_corporation_psm021_slim_multisensor_motion_sensor_7
sensor.philio_technology_corporation_psm021_slim_multisensor_tamper_sensor_7
sensor.philio_technology_corporation_psm021_slim_multisensor_temperature_7

sensor.philio_technology_corporation_psm021_slim_multisensor_doorwindow_sensor_8
sensor.philio_technology_corporation_psm021_slim_multisensor_luminance_8
sensor.philio_technology_corporation_psm021_slim_multisensor_motion_sensor_8
sensor.philio_technology_corporation_psm021_slim_multisensor_tamper_sensor_8
sensor.philio_technology_corporation_psm021_slim_multisensor_temperature_8

And if there is several values of the same type in a node the instance id will be appended like this (three switches in the same device):
switch.fibaro_system_unknown_type0202_id1002_switch_9
switch.fibaro_system_unknown_type0202_id1002_switch_9_2
switch.fibaro_system_unknown_type0202_id1002_switch_9_3
2016-01-26 09:33:26 +01:00
Fabian Affolter
e72f61ce73 Update docstring 2016-01-26 09:11:04 +01:00
Paulus Schoutsen
4c056db3bb Fix Chrome url sync 2016-01-25 23:56:43 -08:00
Paulus Schoutsen
c10a86d1bf Merge branch 'master' into dev
Conflicts:
	homeassistant/const.py
2016-01-25 22:58:06 -08:00
Paulus Schoutsen
b97de5cef6 Merge pull request #1000 from balloob/view-url-sync
Update frontend with view url sync
2016-01-25 22:54:00 -08:00
Paulus Schoutsen
4233c0bc66 Update frontend with view url sync 2016-01-25 22:47:13 -08:00
Paulus Schoutsen
b13008201e Fix lint issue 2016-01-25 21:31:21 -08:00
Paulus Schoutsen
125ad8630d Add views to demo 2016-01-25 21:27:36 -08:00
Paulus Schoutsen
5c3ad5d4c0 Update frontend 2016-01-25 17:57:33 -08:00
Paulus Schoutsen
414aa8563d Merge pull request #930 from TangoAlpha/dev
Add LIFX bulb support
2016-01-25 17:51:47 -08:00
happyleavesaoc
d08a181c72 Merge pull request #994 from happyleavesaoc/orvibo_bump
Orvibo version bump
2016-01-25 19:34:21 -05:00
happyleavesaoc
80c6bf6744 bump orvibo version 2016-01-25 16:40:27 -05:00
Tim
b1ba792715 Brightness from HA overrides brightness from HSV conversion 2016-01-25 21:19:27 +00:00
Per Sandström
b99f6c1a46 Merge pull request #995 from persandstrom/vsure0.4.8
update python-verisure to version 0.4.8
2016-01-25 22:04:02 +01:00
Tim
1397f9e588 Fix logging typo 2016-01-25 20:58:10 +00:00
Tim
bb7f92330d Update liffylights version 2016-01-25 20:53:21 +00:00
Per Sandström
7cbd780748 update vsure version 2016-01-25 21:39:41 +01:00
Tim
784fea2d56 Update for new liffylights version 2016-01-25 19:08:48 +00:00
Tim
97f0425252 Update requirements_all 2016-01-25 15:20:23 +00:00
Tim
11120a8743 Fix liffylights import 2016-01-25 15:19:50 +00:00
Tim
8009542b3e Add extra debugging
Add duration to power on
2016-01-25 13:30:52 +00:00
Tim
32cfa6998c Update requirements_all 2016-01-25 12:13:24 +00:00
Tim
d10a5cf5e9 Update to v0.8.3 of liffylights 2016-01-25 11:54:41 +00:00
Tim
4089a7a0d3 Update requirements_all 2016-01-25 10:02:03 +00:00
Tim
5a926913d3 Update to v0.6 of liffylights 2016-01-25 10:00:15 +00:00
Paulus Schoutsen
6c91831baa Hide groups when they are views or auto defined 2016-01-24 23:45:06 -08:00
Tim
069dafa3a5 Update requirements_all 2016-01-25 07:38:37 +00:00
Paulus Schoutsen
4abc5c97cd Merge pull request #988 from auchter/thermostat-fan
Add service to control a thermostat's fan
2016-01-24 23:24:32 -08:00
Paulus Schoutsen
bb3dd47088 Merge pull request #992 from balloob/sections
Add support for sections in the frontend [Fixes #100705168]
2016-01-24 22:58:27 -08:00
Paulus Schoutsen
f6c53896e3 Allow groups to be used as views 2016-01-24 22:54:45 -08:00
Paulus Schoutsen
ad2e2d916b Merge pull request #979 from rmkraus/automation-decorator
Automation Decorator for custom components
2016-01-24 21:22:19 -08:00
Ryan Kraus
8406f81811 Removed decorator callback
The decorator callback was not actually necessary so it was removed and
replaced with a partial function instead.
2016-01-25 00:14:16 -05:00
Ryan Kraus
bcdfc555e0 Removed service decorator from event decorators 2016-01-24 23:09:09 -05:00
Ryan Kraus
3b89102338 Fixed lint issue from merge
extract_entity_ids from the service helpers was overwriting the service
decorator with one of its attributes. This was fixed.
2016-01-24 23:00:43 -05:00
Ryan Kraus
60dd2d441d Merge remote-tracking branch 'balloob/dev' into automation-decorator
# Conflicts:
#	homeassistant/helpers/service.py
#	tests/helpers/test_service.py
2016-01-24 22:51:00 -05:00
Ryan Kraus
5830da63b1 Moved service decorator to service helpers
Moved the service decorator to the service helpers module and moved the
associated tests.
2016-01-24 22:46:30 -05:00
Tim
50561ffe97 Fix long line 2016-01-25 03:39:13 +00:00
Tim
74e8446556 Bump version of liffylights 2016-01-25 03:34:24 +00:00
Tim
d94db5388c Add preliminary support for transition time 2016-01-25 03:32:55 +00:00
Ryan Kraus
f66aeb2e73 Added event helper tests
1. Added tests for all event decorators
2. Added tests for sunrise and sunset event helpers
2016-01-24 22:23:56 -05:00
Ryan Kraus
54b82ecd91 Lint fixes and additions to event decorators
1. service decorator was overwriting the function name with one of its
arguments.
2. Accidentally left an extra argument in track_sunrise.
3. Added track_utc_time_change decorator.
2016-01-24 21:06:15 -05:00
Ryan Kraus
2fa98167c2 Updated example.py component
Cleaned up example.py to better handle failed loads.
2016-01-24 20:05:40 -05:00
Ryan Kraus
57725136c0 Many updates regarding event decorators
1. Added HASS to the arguments for callbacks that are created with
event decorators.
2. Added a service decorator.
3. Updated example.py in the example config to use the event decorators.
2016-01-24 19:52:22 -05:00
Ryan Kraus
40dbeb0b60 Another revision on event decorators
This revision of event decorators removes much of the complexity. The
decorated functions are no longer wrapped with a class that tracks
last_run, etc. Bootstrap now gives hass to the event_decorators module
before initializing components so the decorators no longer require
activation.
2016-01-24 17:46:05 -05:00
Ryan Kraus
ef92940ffb A few lint fixes to event decorators. 2016-01-24 16:45:35 -05:00
Erik
e7865c1d67 Merge pull request #990 from molobrakos/squeezebox-fix
bugfix for squeezebox cover art regression
2016-01-24 21:56:21 +01:00
Ryan Kraus
02e634c6a2 Fixed bugs to allow HA to boot again
1) helpers/event should not import the sun component unless it is
requested. This prevents circular import.
2) fixed import typo in bootstrap
2) bootstrap cannot import event_decorators until it is needed because
this leads to a circular import.
2016-01-24 15:55:47 -05:00
Ryan Kraus
0f937cad74 Initial pass at event decorators
Created event decorators for custom components. Decorators were created
for the events: track_state_change, track_sunrise, track_sunset, and
track_time_change.
2016-01-24 15:28:09 -05:00
Ryan Kraus
81dd1515ae Moved sunrise/sunset tracking to helpers
The automation component contained some very handy and generic
functions for tracking sunset and sunrise. This was moved to
helpers/event.py.
2016-01-24 15:07:09 -05:00
Ryan Kraus
a65d0f0549 Reverting Automation decorator in favor of a new approach. 2016-01-24 14:44:48 -05:00
Michael Auchter
881c82c2df nest: implement fan control 2016-01-24 12:47:21 -06:00
Michael Auchter
df94c909f7 thermostat: add service to control fan mode 2016-01-24 12:47:21 -06:00
Michael Auchter
a0ed469aa2 thermostat: move fan attribute up to thermostat 2016-01-24 12:47:20 -06:00
Michael Auchter
afa4fc4ef5 thermostat: split up services 2016-01-24 12:47:20 -06:00
Paulus Schoutsen
df450c3d1f Merge pull request #987 from balloob/update-pynetgear
Update version pynetgear
2016-01-24 09:46:23 -08:00
Paulus Schoutsen
dc5d652d31 Update version pynetgear 2016-01-24 09:43:06 -08:00
Paulus Schoutsen
e4fe19fff0 Merge pull request #986 from turbokongen/dev
Small errorlog fix.
2016-01-24 08:54:54 -08:00
John Arild Berentsen
f6f3f54228 flake8 complaint fix 2016-01-24 16:43:24 +01:00
John Arild Berentsen
6df67d2852 Send correct command to pyrfxtrx
Although it seems to work with send_on, it throws an logged error. Using correct command against pyrfxtrx removes this error.
2016-01-24 16:37:38 +01:00
Tim
2411d1f2c8 Fix wrongly generated requirements 2016-01-24 10:07:56 +00:00
Tim
9f6a1c75fa Fix wrongly generated requirements 2016-01-24 10:01:23 +00:00
Stefan Jonasson
1842e5909e Updated the entity names for all z-wave devices.
Z-Wave have a unique node id, this is now added to the entity name.

This is a change will break old configs.  The Z-Wave entity_id will have to be updated in configurations.

The reason for this change is that the old behavior created duplicate entity_ids if you have several similar devices. The order devices is included is not consistent so when the service was restarted the entity ids could change and the configuration for entities will be invalid.

There was also inconsistencies between the naming for sensors and switches.
(cherry picked from commit 33a78df)
2016-01-24 10:20:51 +01:00
John Arild Berentsen
6f31aacb90 Merge pull request #1 from balloob/dev
Updating base
2016-01-24 09:58:51 +01:00
Paulus Schoutsen
e541b9ba77 Merge pull request #981 from balloob/ordered-yaml
Load YAML config into an ordered dict
2016-01-23 23:04:41 -08:00
Paulus Schoutsen
53484e46a3 Move generate_entity_id to entity helpers 2016-01-23 23:00:46 -08:00
Paulus Schoutsen
de79a46d43 Move extract_entity_id to service helpers 2016-01-23 22:57:14 -08:00
Paulus Schoutsen
bc19ef66bf Move split_entity_id to helpers 2016-01-23 22:49:49 -08:00
Paulus Schoutsen
de08f0afaa Load YAML config into an ordered dict 2016-01-23 22:41:01 -08:00
Tim
706bbeae16 Add to .coveragerc 2016-01-24 02:17:52 +00:00
Paulus Schoutsen
e5497d89f4 Merge pull request #980 from balloob/upgrade-cast
Upgrade PyChromecast version
2016-01-23 18:15:12 -08:00
Paulus Schoutsen
048ec0aa66 Merge pull request #964 from balloob/passive-zones
Allow passive zones
2016-01-23 18:15:06 -08:00
Paulus Schoutsen
03ed85b0a7 Merge pull request #971 from trollkarlen/smtp-fix
smtp: make smtp component thread safe
2016-01-23 18:08:03 -08:00
Paulus Schoutsen
9d92707fd7 Merge pull request #973 from turbokongen/dev
Added support for Dimming with lights in Rfxtrx module
2016-01-23 18:03:37 -08:00
Paulus Schoutsen
90c392e270 Upgrade PyChromecast version 2016-01-23 17:29:40 -08:00
Tim
6cb6cbfefd Update requirements 2016-01-24 01:18:18 +00:00
Tim
6d2bca0fd1 Import 3rd party library inside method 2016-01-24 01:13:51 +00:00
Tim
99286391e1 Fixes for lint 2016-01-24 01:00:02 +00:00
Tim
711f2da496 Update liffylights version 2016-01-24 00:43:50 +00:00
Ryan Kraus
fbd68b6f89 Created automation decorator prototype
Created an initial iteration of an Automation decorator.
2016-01-23 19:39:59 -05:00
Paulus Schoutsen
85ebd0ab59 Merge pull request #977 from sdague/dev
fix typo in log message
2016-01-23 14:27:37 -08:00
Tim
58034219b6 Bump version liffylights 2016-01-23 22:23:46 +00:00
Tim
17f5a466d9 Separate LIFX code and HA component 2016-01-23 22:14:57 +00:00
Sean Dague
90ca6a0998 fix typo in log message
The plex component logs an htts url, which is confusing to people, as
they think something is broken, when it is not.

Closes #959
2016-01-23 16:06:50 -05:00
Erik
ec2b433733 should be _id 2016-01-23 18:55:43 +01:00
Erik
492c4b7f00 style 2016-01-23 18:14:03 +01:00
Erik
b3beb9f3c9 style 2016-01-23 18:08:54 +01:00
Erik
837e7affa7 only query artwork by track_id if id is available (7.7 vs 7.9 version issue?) 2016-01-23 17:48:14 +01:00
turbokongen
6d527842dd Another flake8 fix too long line 2016-01-23 12:14:00 +01:00
turbokongen
e30915eb2c flake8 complaint fix 2016-01-23 12:08:21 +01:00
turbokongen
43e2b58f20 Fixing of various test errors 2016-01-23 12:00:03 +01:00
turbokongen
d3c6c892a8 Small intendation fix 2016-01-23 11:50:09 +01:00
turbokongen
a63edcf505 Added support for Dimming with lights in Rfxtrx module 2016-01-23 11:18:11 +01:00
Robert Marklund
0e7088ce3b smtp: make smtp component thread safe
Also fix so it does not require ip, port, username and password when using local smtp server.
Add debug config.

Signed-off-by: Robert Marklund <robbelibobban@gmail.com>
2016-01-23 10:43:10 +01:00
Paulus Schoutsen
0042e7725d Merge pull request #967 from HydrelioxGitHub/NetAtmo-icons
Add icons to NetAtmo sensors
2016-01-22 12:56:43 -08:00
hydreliox
613f8d0bd2 Add icons to NetAtmo sensors 2016-01-22 21:15:07 +01:00
Greg Dowling
61ca1ab2c1 Merge pull request #948 from balloob/sensor_template
First draft of sensor.template.
2016-01-22 16:49:49 +00:00
pavoni
ad62591f43 Change error state to be 'error' rather than 'unknown', trace error. 2016-01-22 16:30:02 +00:00
Paulus Schoutsen
5ba33bc40e Merge pull request #950 from michaelkuty/dev
Add statsd component.
2016-01-22 07:41:04 -08:00
Michael Kutý
143b08d661 Add statsd component. 2016-01-22 16:18:15 +01:00
pavoni
87a9fd8252 Handle race condition on startup. 2016-01-22 11:30:04 +00:00
pavoni
b1f7b5c6d7 Tidy, add test for ValueException logic. 2016-01-22 09:37:20 +00:00
Paulus Schoutsen
bb97af1504 Allow passive zones 2016-01-22 00:00:36 -08:00
Paulus Schoutsen
9a092654e9 Merge pull request #962 from FreekingDean/dev
Adding Support for Insteon Hub
2016-01-21 23:31:16 -08:00
Dean
d59b98ee2b Added Insteon Support 2016-01-22 02:28:36 -05:00
Paulus Schoutsen
6bbbbd9e17 Update mdi icons 2016-01-21 23:07:43 -08:00
Paulus Schoutsen
9fbedd8b5f Merge pull request #963 from balloob/scrip-service-helper
Script: use config service helper
2016-01-21 22:55:28 -08:00
Paulus Schoutsen
a91163877f Script: use config service helper 2016-01-21 22:47:25 -08:00
Paulus Schoutsen
0acce86596 Merge pull request #958 from balloob/itunes-updates
iTunes Updates
2016-01-21 18:44:55 -08:00
William Scanlon
c95b03f240 Fixed style 2016-01-21 18:32:10 -08:00
William Scanlon
56ce3e5f5a Wink siren support 2016-01-21 18:32:10 -08:00
pavoni
8b5751ad44 Merge branch 'dev' into sensor_template 2016-01-21 23:17:53 +00:00
pavoni
c615272c06 Tidy. 2016-01-21 23:17:19 +00:00
Jon Maddox
a3b8122707 not using these 2016-01-21 17:54:26 -05:00
Jon Maddox
682e3460e0 use custom material icons to represent speaker state 2016-01-21 17:45:30 -05:00
Jon Maddox
71dbd10b39 let port be optional 2016-01-21 17:18:52 -05:00
Paulus Schoutsen
7f143bcdf9 Merge pull request #957 from trollkarlen/yr.no-fix
yr.no: fix some bugs in the component
2016-01-21 13:33:36 -08:00
Robert Marklund
f19a46dcfe yr.no: fix some bugs in the component
Someone forgot some in:s and ()
Also added windGust sensor.

Signed-off-by: Robert Marklund <robbelibobban@gmail.com>
2016-01-21 22:04:18 +01:00
Paulus Schoutsen
625f69443a Merge pull request #953 from trollkarlen/kodi-fix
kodi: remove traceback on state check
2016-01-21 12:18:28 -08:00
Robert Marklund
0bdd293572 kodi: remove traceback on state check
If the computer is sleeping that are running xbmc then
the traceback is printed in the log all the time.
Keep the traceback in debug mode of the module if needed.

Signed-off-by: Robert Marklund <robbelibobban@gmail.com>
2016-01-21 20:59:58 +01:00
pavoni
f8072aae68 Merge branch 'dev' into sensor_template 2016-01-21 18:34:13 +00:00
pavoni
92afcae9be Add test. 2016-01-21 18:31:44 +00:00
pavoni
a6f37c032b Revise to not need dependencies (or quoting)! 2016-01-21 17:35:33 +00:00
pavoni
e66d15b71d First drafy of sensor.template. 2016-01-21 16:31:23 +00:00
Paulus Schoutsen
1098194a89 Merge pull request #937 from trollkarlen/sonos-multicast
sonos: add hosts and interface_addr to sonos config
2016-01-21 07:30:40 -08:00
Paulus Schoutsen
66d23cd15f Merge pull request #945 from zmrow/fix-exception-in-openweather
Fix #863 - Added a check for good pull from OWM and return if the object is None
2016-01-20 19:57:57 -08:00
zmrowicki@hotmail.com
c3a1193ef9 Fix #863 - Added a check for good pull from OWM and return if the object is None 2016-01-20 19:36:33 -08:00
Paulus Schoutsen
ec2d9af8dc Merge pull request #943 from trollkarlen/influxdb-fix
influxdb: fix the need of admin to run
2016-01-20 19:22:40 -08:00
Paulus Schoutsen
f0e44728d7 Merge pull request #944 from HydrelioxGitHub/twitter_notify
Add Twitter as a notification platform
2016-01-20 19:21:38 -08:00
hydreliox
f67747456f Clean some errors 2016-01-21 02:14:11 +01:00
hydreliox
f6017a17b2 Add Twitter as a notification platform 2016-01-21 02:02:32 +01:00
Robert Marklund
89aa3cbc62 influxdb: fix the need of admin to run
Use select statment to show if db exits instead of
'SHOW DATABASES' which cant be run by a non admin user.
See https://github.com/influxdata/influxdb/issues/4785 for more info.

Also influxdb dont like empty writes('') so ignore state changes of that kind,
this happens on startup of home assistant.

Signed-off-by: Robert Marklund <robbelibobban@gmail.com>
2016-01-21 00:19:16 +01:00
Robert Marklund
543190dfb0 sonos: add hosts and interface_addr to sonos config
Config can now specify one or more hosts to connect and
also a interface_addr to multicast on if multiple interfaces exists.

Signed-off-by: Robert Marklund <robbelibobban@gmail.com>
2016-01-20 22:55:08 +01:00
Paulus Schoutsen
fdc8c45a69 Merge pull request #940 from balloob/remove_sensor_state
Remove sensor state
2016-01-20 12:52:23 -08:00
pavoni
d2d421ca8f Remove ghost debug code. 2016-01-20 20:02:03 +00:00
pavoni
7ad5b3a17b Fix bug related to maker_param types 2016-01-20 19:13:29 +00:00
Paulus Schoutsen
c8dd9696b4 Merge pull request #939 from molobrakos/squeezebox-fix
artwork fixes
2016-01-20 09:16:32 -08:00
Erik
58ef69b95d less hacky way of getting unique cover art 2016-01-20 16:31:51 +01:00
pavoni
0de9229d75 More tidying. 2016-01-20 11:25:20 +00:00
pavoni
f4c3ac2a62 Tidy 2016-01-20 11:19:00 +00:00
pavoni
6c5ceaf686 Remove sensor state from switch and wemo 2016-01-20 11:06:08 +00:00
Erik
54f65ae87d 1) artwork_url might be a relative url (such as /imageproxy). in that case, join it with the base url. note: urllib.parse.urljoin will handle case when the artwork url is absolute. 2) artwork would not be replaced in the user interface because the url did not change between tracks (http://.../cover.jpg). solved by appending internal hash of the media title to the url to force reload 2016-01-20 10:57:39 +01:00
Paulus Schoutsen
4f2dc3cc2a Merge pull request #934 from balloob/mqtt-protocol
Allow forcing MQTT protocol v3.1
2016-01-19 20:20:04 -08:00
Paulus Schoutsen
a4ee2bd8ef Merge pull request #935 from balloob/0.11.1
0.11.1
2016-01-19 12:20:26 -08:00
MartinHjelmare
d4629a7efe Fix missing binary sensor types
* Add missing binary sensor types to sensor/mysensors.
* Remove unneeded pylint disable.
2016-01-19 12:13:34 -08:00
Paulus Schoutsen
441ae73344 Merge pull request #936 from MartinHjelmare/fix-mysensors-sensors
Fix missing binary sensor types
2016-01-19 12:11:33 -08:00
MartinHjelmare
9249dc6dd3 Fix missing binary sensor types
* Add missing binary sensor types to sensor/mysensors.
* Remove unneeded pylint disable.
2016-01-19 19:26:40 +01:00
Paulus Schoutsen
4c4539caff Version bump to 0.11.1 2016-01-19 09:12:03 -08:00
Paulus Schoutsen
4c0ff0e0d0 Allow forcing MQTT protocol v3.1 2016-01-19 09:07:54 -08:00
Paulus Schoutsen
1ceee2d6c5 Fix MQTT reconnecting 2016-01-19 09:07:35 -08:00
Paulus Schoutsen
cbb74d50ce Enforce entity attribute types 2016-01-19 09:07:27 -08:00
Erik
c2d72bbf09 fix issue where sensors and switches were duplicated because of component getting initialized twice. closes #913 2016-01-19 09:06:57 -08:00
Paulus Schoutsen
f97ba263c4 Allow forcing MQTT protocol v3.1 2016-01-19 09:00:40 -08:00
Paulus Schoutsen
85df9e98bd Merge pull request #922 from balloob/mqtt-fixes
Fix MQTT reconnecting
2016-01-19 08:45:49 -08:00
Paulus Schoutsen
2faafb9c0f Merge pull request #931 from molobrakos/fix-tellduslive-duplicates
proper initialization
2016-01-18 18:01:12 -08:00
Erik
d43101f22a fix issue where sensors and switches were duplicated because of component getting initialized twice. closes #913 2016-01-18 19:41:41 +01:00
Tim
3d23cd10fc Attempt to fix ungrouped-imports pylint error 2016-01-18 18:30:09 +00:00
Tim
66cd8d264e Remove use of warn() 2016-01-18 18:27:46 +00:00
Tim
291910d74e Add LIFX bulb support 2016-01-18 18:10:32 +00:00
Paulus Schoutsen
7ac648d0ab Merge pull request #889 from Bart274/dev
Create command_sensor.py
2016-01-18 07:47:00 -08:00
Bart274
3b42390062 Update command_sensor.py 2016-01-18 13:48:09 +01:00
Bart274
a80917f530 Update command_sensor.py 2016-01-18 09:24:38 +01:00
Paulus Schoutsen
8fbb585874 Fix MQTT reconnecting 2016-01-17 21:39:25 -08:00
Ryan Kraus
027d97321f Merge pull request #911 from rmkraus/service-toggle
Added toggle service
2016-01-17 21:11:35 -05:00
Paulus Schoutsen
62a1c9687e Merge pull request #920 from balloob/enforce-entity-types
Enforce entity attribute types
2016-01-17 18:01:20 -08:00
Paulus Schoutsen
a9c6f8c1d9 Enforce entity attribute types 2016-01-17 17:50:20 -08:00
Paulus Schoutsen
06b4fcc2cf Fix lint errors 2016-01-17 16:36:25 -08:00
Paulus Schoutsen
6dc2501116 ps - fix RPi GPIO imports 2016-01-17 16:29:41 -08:00
Paulus Schoutsen
54060f27ef Merge pull request #893 from joshughes/nest_sensor
Add the nest sensor for tracking data from nest
2016-01-17 15:16:25 -08:00
Ryan Kraus
85aa4fdd2e Revised entity toggle to use is_on
The toggle function in the Entity ABC was using state == STATE_ON to
determine whether the entity was on. This was revised to use the is_on
property instead.
2016-01-17 16:59:22 -05:00
Ryan Kraus
0624445627 Added tests for toggle service.
1) Added tests to toggle service.
2) Removed color_util import in light tests. It was not being used.
2016-01-17 16:42:18 -05:00
Joseph Hughes
4ca4941c82 fix pylint errors in sensor/nest 2016-01-16 12:56:38 -07:00
Joseph Hughes
4dbd84ead0 make sure everything inherits from NesSensor 2016-01-16 12:53:42 -07:00
Joseph Hughes
0495776a22 merge upstream dev 2016-01-16 12:52:22 -07:00
Joseph Hughes
dd35551047 fix order of inhertiance 2016-01-16 12:47:08 -07:00
Paulus Schoutsen
9f61369156 Version bump to 0.12.0.dev0 2016-01-16 11:23:55 -08:00
Paulus Schoutsen
bd536be66d Merge pull request #883 from balloob/dev
0.11.0
2016-01-16 11:23:40 -08:00
Paulus Schoutsen
c5b69a0ee4 Update version to 0.11 2016-01-16 11:20:02 -08:00
Paulus Schoutsen
206b3a88a2 Merge pull request #910 from rmkraus/nginx-config
Added nginx sample configuration
2016-01-16 09:44:42 -08:00
Paulus Schoutsen
880bd011a9 Merge pull request #908 from persandstrom/verisure_code_digits
Verisure - code digits settings
2016-01-16 09:04:53 -08:00
Paulus Schoutsen
7de91a270a Merge pull request #905 from Xorso/alarmdotcom_bugfix
Alarmdotcom bugfix
2016-01-16 08:48:07 -08:00
Paulus Schoutsen
09973abe8a Merge pull request #897 from balloob/input-boolean
New component: input_boolean
2016-01-16 08:47:29 -08:00
Ryan Kraus
342a819fd4 Added toggle service
Added a toggle service to the homeassistant, light, switch, and
media_player domains.
2016-01-16 10:45:05 -05:00
Ryan Kraus
4bf185c868 Added nginx sample configuration
Added a sample nginx configuration with instructions detailing how to
setup a very secure HTTPS server for HA that servers over standard
ports without requiring HA to run as root.
2016-01-16 10:17:26 -05:00
Per Sandström
78742c016b code digits settings 2016-01-16 15:12:54 +01:00
Greg Dowling
1ed314f6f6 Merge pull request #906 from balloob/bump_vera_version
Bump pywemo version.
2016-01-16 11:40:10 +00:00
pavoni
be23c6c86d Bump pywemo version. 2016-01-16 11:35:17 +00:00
Daren Lord
a194c4f1bd Merge branch 'dev' of https://github.com/balloob/home-assistant into alarmdotcom_bugfix 2016-01-15 22:16:01 -07:00
Daren Lord
edb24add6b Fixed but when alarm is trying to change state the state gets updated and changes the page. 2016-01-15 22:15:31 -07:00
Paulus Schoutsen
bc88985889 Merge pull request #901 from philipbl/ssl
Increase security of using SSL
2016-01-15 17:32:51 -08:00
Greg Dowling
3d27dd3ec4 Merge pull request #902 from balloob/fix_vera_sensor_subscriptions
Another Vera fix
2016-01-15 21:46:27 +00:00
pavoni
c2f5eb3073 Missed change. 2016-01-15 21:42:51 +00:00
pavoni
541b268721 Update to use refactored pyvera, fixes subscription issues - esp sensors. 2016-01-15 21:30:58 +00:00
Philip Lundrigan
e77daed086 Merge pull request #900 from philipbl/fix_locative
Fix bug in Locative logic
2016-01-15 13:43:52 -07:00
Philip Lundrigan
fdbb409331 Increase security of using SSL 2016-01-15 13:39:54 -07:00
Philip Lundrigan
f96c5aa62f Fix bug in locative logic 2016-01-15 13:19:53 -07:00
Paulus Schoutsen
c07a096e57 Merge pull request #899 from sfam/dev
Update RPi.GPIO version and code refactoring
2016-01-15 11:56:27 -08:00
sfam
48b6c5b5cb fix import BinarySensorDevice 2016-01-15 18:14:46 +00:00
sfam
d8d59d9a66 remove rpi_gpio sensor 2016-01-15 18:05:48 +00:00
sfam
702dddbb2f update requirements_all 2016-01-15 17:28:32 +00:00
sfam
127488004c update coveragerc and requirements_all 2016-01-15 17:16:02 +00:00
sfam
7c925ac295 update comments 2016-01-15 16:53:46 +00:00
sfam
8617b92d1b Update RPi.GPIO version and code refactoring 2016-01-15 16:53:45 +00:00
Paulus Schoutsen
bb80e3a9fc Merge pull request #898 from balloob/vera_fixes
Vera fixes
2016-01-15 07:43:03 -08:00
Joseph Hughes
80023f62d9 Merge remote-tracking branch 'upstream/dev' into nest_sensor
# Conflicts:
#	.coveragerc
#	requirements_all.txt
2016-01-15 08:18:16 -07:00
Joseph Hughes
9617288bd5 multiple inheritance for nest binary sensor 2016-01-15 08:16:33 -07:00
pavoni
4fd79afa42 Bump pyvera version. 2016-01-15 11:45:17 +00:00
pavoni
719f9a63d9 Fix style issue 2016-01-15 10:52:58 +00:00
pavoni
4bc33d0352 Bump pyvera version. 2016-01-15 10:34:14 +00:00
pavoni
c4e1035638 Add humidity sensor, add units for humidity and light sensors. 2016-01-15 09:21:48 +00:00
Bart274
d40e889d3b Update command_sensor.py
Importing CommandSensorData from the command_sensor in sensors in order not to duplicate code
2016-01-15 09:01:58 +01:00
Bart274
41acc8fa43 Update .coveragerc
This shouldn't be excluded according to @balloob because it's a pure python component
2016-01-15 08:59:11 +01:00
Fabian Affolter
90c2aed7b4 Update docstrings 2016-01-15 08:55:59 +01:00
Fabian Affolter
5108602de3 Update link to docs and docstrings 2016-01-15 08:55:59 +01:00
Paulus Schoutsen
5ee17ffc58 Update frontend 2016-01-14 23:47:55 -08:00
Paulus Schoutsen
6b899ddc1d 100% test coverage for input_boolean 2016-01-14 23:25:25 -08:00
Paulus Schoutsen
0a711922ef Remove unnecessary instance variable 2016-01-14 23:19:08 -08:00
Paulus Schoutsen
475b631d9c Initial version input_boolean 2016-01-14 23:18:52 -08:00
Paulus Schoutsen
40c75f0a51 Merge pull request #887 from sdague/dev
Add support for Proliphix thermostat
2016-01-14 22:03:09 -08:00
Paulus Schoutsen
1dd99a6d5d Update frontend 2016-01-14 22:02:02 -08:00
Paulus Schoutsen
bed9b038c8 Merge pull request #856 from w1ll1am23/Wink_power_strip_support
Wink power strip support
2016-01-14 19:23:41 -08:00
Joseph Hughes
9210c57c2d Fix lint errors and PR comments 2016-01-14 14:32:43 -07:00
Joseph Hughes
313cbda0aa fix multiple PR issues 2016-01-14 14:17:28 -07:00
Paulus Schoutsen
86b0e49995 Merge pull request #894 from Xorso/alarmdotcom
Adding in alarm control panel for Alarm.com accounts.
2016-01-14 13:01:58 -08:00
Joseph Hughes
a39148dd38 fix pylint errors for Nest Sensor 2016-01-14 11:37:17 -07:00
Joseph Hughes
b8c8c71b78 run requirements_all again for nest sensor 2016-01-14 11:28:28 -07:00
Joseph Hughes
65a3bf2325 fix merge error 2016-01-14 11:01:53 -07:00
Joseph Hughes
ac34db3c8a Merge remote-tracking branch 'upstream/dev' into nest_sensor
# Conflicts:
#	.coveragerc
#	requirements_all.txt
2016-01-14 11:00:34 -07:00
Joseph Hughes
f2e86ecd8e Merge remote-tracking branch 'upstream/master' into nest_sensor
# Conflicts:
#	homeassistant/const.py
2016-01-14 10:52:19 -07:00
Joseph Hughes
7b993da0de address PR comments for Nest Sensor 2016-01-14 10:48:24 -07:00
William Scanlon
de5bee6359 Updated python-wink version 2016-01-14 08:56:59 -05:00
Daren Lord
34f124190c Fixing pylint errors 2016-01-14 06:29:12 -07:00
Sean Dague
d867366be1 add proliphix thermostat support
The proliphix nt10e is an early network thermostat that supports an
HTTP interface. This adds basic support for it to home-assistant (get
/ set heating setback).
2016-01-14 06:32:08 -05:00
Bart274
d0d375d433 Update command_sensor.py 2016-01-14 10:27:11 +01:00
Bart274
d17aa103b4 Update command_sensor.py 2016-01-14 10:13:57 +01:00
Fabian Affolter
f0af23a4f5 Add link to docs and update pressure unit 2016-01-14 09:16:20 +01:00
Paulus Schoutsen
bdd6bb7918 Update frontend 2016-01-13 23:51:29 -08:00
Paulus Schoutsen
3ec49a0ef0 Merge pull request #892 from sdague/f_rounding
round min / max values for temperature
2016-01-13 22:50:15 -08:00
Daren Lord
7a2d049ce3 Removing LIFX from requirements_all.txt 2016-01-13 23:33:19 -07:00
Paulus Schoutsen
7fba4b354e Merge pull request #878 from HydrelioxGitHub/netatmo
Netatmo
2016-01-13 22:24:17 -08:00
Daren Lord
87cecd7e95 Adding to requirements_all 2016-01-13 23:22:42 -07:00
Daren Lord
303cb8e350 Adding alarmdotcom to coveragerc 2016-01-13 23:18:52 -07:00
Daren Lord
236ae94474 Merging dev branch 2016-01-13 23:14:58 -07:00
Daren Lord
308969e6dd Adding in alarm.com control panel. 2016-01-13 23:09:39 -07:00
hydreliox
4dd558a420 Update Requirements 2016-01-14 07:09:25 +01:00
Joseph Hughes
0e6a60b086 Add the nest sensor for tracking data from nest 2016-01-13 21:05:47 -07:00
Sean Dague
4fc0163139 round min / max values for temperature
In order for the polymer thermostat component to have sensible step
values the min / max values have to be round numbers. The current code
only does that for systems running in degrees C. For those of us in
silly land that still function in degrees F, this causes some
oddities in the UI.

Always round mix / max values to make it good no matter what
fundamental units we are in.
2016-01-13 21:22:56 -05:00
hydreliox
314d34a644 Update library lnetatmo requirements
Thanks to @rmkraus
2016-01-14 03:00:51 +01:00
Paulus Schoutsen
2745b0f99e Merge pull request #874 from xifle/zwave
Zwave inclusion / exclusion events
2016-01-13 12:47:39 -08:00
Bart274
c2e8646aed Update .coveragerc 2016-01-13 12:20:37 +01:00
Bart274
e5919c1bfe Update command_sensor.py 2016-01-13 12:19:20 +01:00
Bart274
c8961fcf99 Create command_sensor.py
This adds a binary command_sensor
2016-01-13 11:52:42 +01:00
hydreliox
58cee75c0e coverage and requirements updated 2016-01-13 09:06:16 +01:00
hydreliox
4f13236008 Merge remote-tracking branch 'refs/remotes/balloob/dev' into netatmo 2016-01-13 09:03:44 +01:00
Paulus Schoutsen
2a377a6125 Refactor syslog component for Windows users 2016-01-12 23:59:15 -08:00
hydreliox
058dba50cc Correct name using format instead of concatenation 2016-01-13 08:46:45 +01:00
Paulus Schoutsen
e6846e7eb9 Convert asuswrt user/pass to strings 2016-01-12 22:28:53 -08:00
Ryan Kraus
a0ddda4bc6 Updated frontend to newest commit 2016-01-12 22:15:23 -08:00
Ryan Kraus
57c0f96118 Renamed update_state to update in universal media player
Renamed update_state method in universal media player to update so that
it would be called by HA when the state was being published. Moved the
update_ha_state to a function inside of __init__. Updated the tests
accordingly.
2016-01-12 22:15:23 -08:00
Ryan Kraus
a84429538b Fixed attribute configuration handling in universal media player
Forced all parsed attribute configurations to be of length 2. Removed
entity_id=None option from entity lookups. Explicitly passed entity
lookup information to _entity_lkp.
2016-01-12 22:15:23 -08:00
Ryan Kraus
07953fb7e3 Removed dependencies property from universal media player
The dependencies property was only being called once by the __init__
method so it was removed and the code was moved to the __init__ method.
The tests were updated to reflect this.
2016-01-12 22:15:23 -08:00
Ryan Kraus
12da6f531e Removed property from universal media player
The active_child_state property was unnecessary as it was not being
referenced outside the class. This commit removes it and updates the
tests accordingly.
2016-01-12 22:15:22 -08:00
Ryan Kraus
769f5aafb7 Added should_poll = False to universal media player 2016-01-12 22:15:22 -08:00
Ryan Kraus
a1abab8ced Set universal media player to force refresh when updating HA 2016-01-12 22:15:22 -08:00
Ryan Kraus
270a998e3c Merged service calling method in universal media player 2016-01-12 22:15:22 -08:00
Ryan Kraus
d829497c3d Changed universal media player to keep service attrs in dict
Revised universal media player to keep service data in a dictionary
rather than passing it around as magic parameters.
2016-01-12 22:15:22 -08:00
Ryan Kraus
a8d5b0e5ec Made universal media player cache active player
Revised universal media player to cache the active player when updating
the state when any of the children change. Revised tests to accommodate
this change.
2016-01-12 22:15:22 -08:00
Ryan Kraus
85d732a45a Streamlined child state lookups in universal media player
1) Removed children property because it was only being used by one
method.
2) Removed option to return state as object from _entity_lkp as it was
no longer needed.
3) Used hass.states.get to get entity state objects.
4) Revised test to remove children property.
2016-01-12 22:15:22 -08:00
Ryan Kraus
8f3e8d29f0 Renamed SUPPORT_VOLUME_STEP flag in media_player
1) Renamed SUPPORT_VOLUME_BUTTONS to SUPPORT_VOLUME_STEP
2) Removed unused imports from tests.
2016-01-12 22:15:22 -08:00
Ryan Kraus
ee4543d739 Using call_from_config in Universal Media Player
Changed universal media player to use the call_from_config helper to
call services specified in the configuration file. This was done to
copy what is done in the Alexa and Automation components.
2016-01-12 22:15:22 -08:00
Ryan Kraus
59456f20fb Added tests to universal media player and fixed bug
1) Fixed universal media player to maintain specified child order when
checking for active child.
2) Added many tests to universal media player.
2016-01-12 22:15:22 -08:00
Ryan Kraus
4a1f609893 Lint fixes and faster updating to universal media player.
1) Many lint fixes.
2) Bound the Universal Media Player to its dependencies so that its
state will be updated when one of its dependencies is changed.
2016-01-12 22:15:22 -08:00
Ryan Kraus
36214c73ee Better handling of entity lookups in Universal media player.
Allowed the lookup function in the Universal Media Player to return
either a state object or the actual state of an entity during lookup.
2016-01-12 22:15:21 -08:00
Ryan Kraus
20a1025a8c Added active_child attribute to universal media players.
The entity of the first active child is now reported in the attributes
for a universal media player.
2016-01-12 22:15:21 -08:00
Ryan Kraus
ec85884d92 Added initial implementation of universal media player. 2016-01-12 22:15:21 -08:00
Paulus Schoutsen
22c01b956f Merge pull request #888 from balloob/lint-fixes
Lint fixes
2016-01-12 22:00:48 -08:00
Paulus Schoutsen
9cdf84dacf Update flake8 and pylint versions 2016-01-12 21:57:43 -08:00
Paulus Schoutsen
60f40800c4 Use mock HA for locative tests 2016-01-12 21:56:09 -08:00
Paulus Schoutsen
3b7b12bbd5 Make Flake8 happy 2016-01-12 21:53:27 -08:00
Paulus Schoutsen
9a1aad8e92 Merge pull request #882 from moonshot/mqtt-eventstream
Create mqtt eventstream component
2016-01-12 21:29:17 -08:00
Moonshot
6f398f59df Fix filtering of EVENT_CALL_SERVICE and EVENT_SERVICE_EXECUTED events 2016-01-12 22:57:03 -05:00
Moonshot
8ace656657 Create mqtt eventstream component 2016-01-12 22:56:26 -05:00
hydreliox
a4481efe07 Code cleanup 2016-01-13 04:26:40 +01:00
hydreliox
dc31ddbef2 Extract 'modules' as a constant 2016-01-13 04:19:27 +01:00
hydreliox
0c2fe4c5f3 Remove temp unit logic
HA should convert unit automatically
2016-01-13 04:16:25 +01:00
hydreliox
03febb81d3 Extract 'secret_key' as a constant 2016-01-13 03:45:43 +01:00
hydreliox
6f1a25d8d6 Add a configuration validation
All parameters are required
2016-01-13 03:43:10 +01:00
hydreliox
f182f7dccd Remove uncessary requirement check
HA already check the requirement before setup the platform
2016-01-13 03:29:17 +01:00
Fabian Affolter
31fcd230b1 Update docstrings 2016-01-12 11:30:12 +01:00
Paulus Schoutsen
1ad5cae98e Merge pull request #884 from partofthething/zwave-alarm
Added z-wave alarm sensors to list of devices that can be auto-detected and used
2016-01-11 23:52:06 -08:00
ntouran
5af4864326 ZWave alarm sensor cleanup (pylint fixes) 2016-01-11 23:27:53 -08:00
Paulus Schoutsen
ea8d278f8f Rename freesms to free_mobile 2016-01-11 21:05:32 -08:00
Paulus Schoutsen
88de9908ce Merge branch 'pr/879' into dev
Conflicts:
	requirements_all.txt
2016-01-11 21:03:52 -08:00
hydreliox
1bbecce5eb Add requirements and coverage exception 2016-01-11 21:03:22 -08:00
ntouran
2495226c87 Merge remote-tracking branch 'origin/dev' into zwave-alarm 2016-01-11 20:48:54 -08:00
ntouran
c1aa1fb0e0 First attempt at adding Z-wave COMMAND_CLASS_ALARM 2016-01-11 20:46:45 -08:00
Paulus Schoutsen
a5b198e2b8 Merge pull request #771 from MartinHjelmare/mysensors-component-switch
Mysensors component switch
2016-01-11 19:04:35 -08:00
xifle
cd669239ae Changed zwave node add/remove events to services 2016-01-11 22:39:28 +01:00
hydreliox
bc73a6829d Code formatting
Correct pylint errors
2016-01-11 09:30:32 +01:00
hydreliox
542b640ef0 FreeMobile Notify
First Commit for FreeSMS platform
2016-01-11 09:25:26 +01:00
hydreliox
7823fb9788 Merge remote-tracking branch 'refs/remotes/balloob/dev' into dev 2016-01-11 08:40:07 +01:00
hydreliox
bcb42674fc Corrections due to pylint tests 2016-01-11 06:57:31 +01:00
hydreliox
1f1a46a8bd Remove unused library
Remove the library used for dev
2016-01-11 05:35:26 +01:00
hydreliox
7b999e6cd1 Convert Temperature output
Convert temperature from celcius to fahrenheit if the HA config need it
2016-01-11 05:29:32 +01:00
hydreliox
c97a25cc86 Add configuration verification and sensors type
Generate an error in the configuration name of a module or a queried
sensor type is not correct.
Add support for co2 pressure and noise sensors
2016-01-11 05:21:38 +01:00
Greg Dowling
cdf24ec205 Merge pull request #872 from balloob/vera-debugging
Vera updates
2016-01-10 17:34:49 +00:00
Paulus Schoutsen
579f4d4cca Merge pull request #875 from xifle/dev
Owntracks transition events minor improvement
2016-01-10 09:16:27 -08:00
xifle
fce04e7ad0 Added inclusion / exclusion events
Events may be used to start inclusion / exclusion of zwave devices.
This is especially useful in the case of a Z-Wave stick without
"hardware" inclusion button.
2016-01-10 15:28:34 +01:00
xifle
6c94650603 Accept lower & upper case for owntracks 'home' region 2016-01-10 15:00:14 +01:00
pavoni
fca8ad5b0b Tidy. 2016-01-10 12:48:36 +00:00
pavoni
4b4fb038e3 Update for new library, slightly revise switch logic. 2016-01-10 12:30:47 +00:00
MartinHjelmare
0b3a66dd1a Merge branch 'dev' into mysensors-component-switch 2016-01-10 04:27:39 +01:00
MartinHjelmare
2d8cf7de44 Fix wrapper and S_BINARY and bump req. version
* Wrap existing SerialGateway instance instead of subclassing
	SerialGatewat class.
* Add S_BINARY in switch platform only in version 1.5 of mysenors api.
* Use version 0.4 of pymysensors.
* Show gateway port as state attribute.
2016-01-10 04:10:38 +01:00
Paulus Schoutsen
ad931eac60 Merge pull request #870 from balloob/update-pychromecast
Update PyChromecast dependency
2016-01-09 16:27:09 -08:00
Paulus Schoutsen
438e78610d Update PyChromecast dependency 2016-01-09 16:21:08 -08:00
Paulus Schoutsen
058f6f9303 Merge pull request #862 from balloob/alexa-service
Add calling service functionality to Alexa
2016-01-09 16:13:46 -08:00
Paulus Schoutsen
73cdf00512 More service helper tests 2016-01-09 16:01:27 -08:00
Paulus Schoutsen
12b5caed70 ps - strip entity IDs in service call 2016-01-09 15:51:51 -08:00
Paulus Schoutsen
18d2668e3b Merge pull request #869 from philipbl/mqtt-fix
Default to MQTT protocol v3.1.1
2016-01-09 15:27:33 -08:00
pavoni
af21f72d17 Update pyvera version. 2016-01-09 22:58:28 +00:00
pavoni
b64680e4a8 Revise to depend on vera subscription data updates, rather than talking to device. 2016-01-09 21:13:34 +00:00
Philip Lundrigan
9faedf0e67 Default to MQTT protocol v3.1.1 (fix #854) 2016-01-09 13:43:44 -07:00
Paulus Schoutsen
204c151113 Merge pull request #865 from fabaff/owm-update
Update pyowm to 2.3.0
2016-01-09 11:59:15 -08:00
Paulus Schoutsen
9b8256ec07 Merge pull request #867 from persandstrom/verisure_fix_lost_connection
Verisure fix lost connection
2016-01-09 11:47:39 -08:00
pavoni
d61eb93c03 Remove throttle doesn't play well with subscriptions. 2016-01-09 16:16:41 +00:00
Fabian Affolter
a2c6cde83d Update pyowm to 2.3.0 2016-01-09 13:20:51 +01:00
Paulus Schoutsen
825c91f0c3 Add calling service functionality to Alexa 2016-01-08 18:54:28 -08:00
Paulus Schoutsen
d406d7fa94 Merge pull request #860 from philipbl/fix-test
Fix Yr test
2016-01-08 12:53:09 -08:00
Philip Lundrigan
3db6faab4d Fix yr test 2016-01-08 13:30:16 -07:00
Per Sandström
15a046f20c update module version 2016-01-08 19:52:03 +01:00
Per Sandström
d3cd304f68 correced status text 2016-01-08 19:50:49 +01:00
Paulus Schoutsen
84fb96a42f Merge pull request #858 from balloob/remove-wemo-polling
Remove wemo polling
2016-01-08 08:19:33 -08:00
pavoni
5a1fed3980 Bump pywemo version. 2016-01-08 16:00:56 +00:00
pavoni
bb8af3a2d5 Bump pywemo version, turn off polling, tidy trace. 2016-01-08 16:00:26 +00:00
William Scanlon
2803631906 Updated python-wink to 0.4.0 2016-01-08 08:25:26 -05:00
hydreliox
4c47ed31ff Correction to import lnetatmo right 2016-01-08 06:19:03 +01:00
hydreliox
1ed574b2a0 Point lnetatmo library directly from github 2016-01-08 05:34:51 +01:00
Fabian Affolter
d69c1b848a Fix docstrings 2016-01-07 11:57:45 +01:00
Fabian Affolter
35c29dac3f Use mbar instead of hPa 2016-01-07 11:50:02 +01:00
Fabian Affolter
aac44f3a2b Use the same unit for pressure as for the forecast sensor 2016-01-07 11:48:42 +01:00
William Scanlon
17dd8ddc9a Added wink power strip support 2016-01-06 12:22:50 -05:00
hydreliox
a8b36d9baa Multiple Module Configuration
Handle multiple module (see configuration.yaml)
2016-01-06 04:36:04 +01:00
hydreliox
520a8d0d0d Add NetAtmo Platform
Alpha version of the platform.
API library is not yet on PyPI
2016-01-06 03:39:16 +01:00
Paulus Schoutsen
033bd30391 Merge pull request #844 from balloob/delay-group-switch-sensors
Fix calling turn_on for groups with mixed content
2016-01-05 08:55:58 -08:00
Paulus Schoutsen
99e14380fe Merge pull request #847 from molobrakos/patch-1
No need to call update() here
2016-01-05 08:55:48 -08:00
Erik
5576649d60 Update eliqonline.py 2016-01-04 21:36:39 +01:00
Erik
82cd2f4ed6 Update eliqonline.py 2016-01-04 21:31:42 +01:00
Erik
66f12afbb1 don't fail if error
don't fail if request for updated data raises exception in underlying library
2016-01-04 21:12:10 +01:00
Greg Dowling
431656bbcf Merge pull request #848 from balloob/fix-vera-bugs
Bump pyvera version to fix vera dimmer off bug, and avoid shutdown race condition
2016-01-04 19:34:17 +00:00
Erik
a174a06e5c No need to call update() here
This also fixes a problem where the sensor is left uninitialized when the energy meter temporarily has lost connection with the hub. This caused the ELIQ Online server to return HTTP error 400: "user have no current power data", which in turn caused the used eliq library to fail during JSON parsing (issue reported).
2016-01-04 19:25:52 +01:00
Fabian Affolter
0d0fdb0adf Remove configuration details 2016-01-04 16:26:11 +01:00
pavoni
5f8dd65acf Bump pyvera version 2016-01-04 11:24:24 +00:00
Paulus Schoutsen
601211f1d9 Sun docs cleanup 2016-01-04 00:15:44 -08:00
Paulus Schoutsen
8983a97c70 Fix calling turn_on for groups with mixed content 2016-01-03 21:25:15 -08:00
Paulus Schoutsen
2e899bd61c Merge pull request #843 from rhooper/multiple-hues
Support multiple hue hubs using a filename parameter.
2016-01-03 18:39:21 -08:00
Roy Hooper
d0a8a57ae4 Ensure filename arg is passed around everywhere it's needed. 2016-01-03 15:30:06 -05:00
Paulus Schoutsen
08aabd18ad New version frontend 2016-01-03 11:44:26 -08:00
Paulus Schoutsen
2478623ebc Merge pull request #840 from balloob/reproduce-group
Reproduce state upgrades
2016-01-03 11:36:45 -08:00
Paulus Schoutsen
736183e6f5 Fix bug in reproduce_state with complex state attributes 2016-01-03 11:27:30 -08:00
Paulus Schoutsen
31f2707b2f Merge pull request #841 from xifle/dev
Owntracks transition events
2016-01-03 11:19:02 -08:00
xifle
d244d3b599 Fixed flake8 style errors 2016-01-03 17:42:49 +01:00
xifle
82904c59ce Fixed code style 2016-01-03 17:12:11 +01:00
Paulus Schoutsen
f8b2570cb3 Group entities when reproducing a state 2016-01-03 02:32:09 -08:00
Paulus Schoutsen
6268840b55 Merge pull request #839 from philipbl/sun_fix
Fix for sun if condition
2016-01-03 00:27:33 -08:00
Philip Lundrigan
c9ff0ab7eb Fix for sun if condition 2016-01-03 01:03:53 -07:00
Paulus Schoutsen
cf1f9a29bf Merge pull request #833 from eiaro/dev
Added more sensors to Telldus Live
2016-01-02 17:05:54 -08:00
Paulus Schoutsen
48b1f8e137 Merge pull request #829 from joshughes/influx_hack
Interpolate what we are sending to influx so its not always a string
2016-01-02 16:59:31 -08:00
Ronny Eia
4b96a7c820 Untabified lines 2016-01-03 01:00:10 +01:00
Paulus Schoutsen
452ebdac8e Merge pull request #838 from balloob/travis-tweaks
Make CI erros more prominent
2016-01-02 15:46:03 -08:00
Paulus Schoutsen
7dc1499386 Make CI erros more prominent 2016-01-02 14:43:03 -08:00
Paulus Schoutsen
3ccc7787af Merge pull request #834 from R1chardTM/reference-fix
Fix reference known_devices.yaml in service description
2016-01-02 14:05:31 -08:00
Paulus Schoutsen
02879e79e6 Merge pull request #828 from sander76/honeywell_away_mode
Honeywell away mode
2016-01-02 14:05:20 -08:00
Richard
305c87a9c9 Fix reference known_devices.yaml 2016-01-02 16:01:58 -06:00
Ronny Eia
3abc78eef2 Added power sensor 2016-01-02 22:30:02 +01:00
Paulus Schoutsen
4a421e25b0 Simplify Rest sensors 2016-01-02 13:29:33 -08:00
Ronny Eia
86047eceb1 Added wind sensor 2016-01-02 22:28:15 +01:00
Ronny Eia
7edbb6aadc Added rain sensor 2016-01-02 22:21:04 +01:00
Roy Hooper
0361f37178 Support multiple hue hubs using a filename parameter. 2016-01-02 16:13:58 -05:00
sander
55c5d254d5 some more pylinting.. 2016-01-02 21:09:03 +01:00
sander
36f5caa214 more pylinting.. 2016-01-02 20:59:45 +01:00
sander
8c7898ed05 pylinting.. 2016-01-02 20:53:25 +01:00
sander
39de92960d line too long change 2016-01-02 20:27:40 +01:00
Paulus Schoutsen
6d35bdafee Merge pull request #832 from R1chardTM/device-tracker
Add service description device tracker
2016-01-02 10:34:05 -08:00
Paulus Schoutsen
217ffc215b Update PyNetgear version 2016-01-02 10:27:11 -08:00
xifle
cbd3860585 Merge branch 'dev' of https://github.com/balloob/home-assistant into dev 2016-01-02 18:56:14 +01:00
xifle
5804dde0e9 Enables the use of owntracks transition events
By using the configuration option "use_events:yes" in the device_tracker section,
only 'enter'/'leave' events are considered to calculate the state of a tracker device.
The home zone is defined as the owntracks region 'home'. Other regions may also be defined, the name of
the region is then used as state for the device. All owntracks regions, the 'Share' setting must be enabled in the app.
2016-01-02 18:26:59 +01:00
Joseph Hughes
e9b2cf1600 Ensure we send data to influx as float and not as a string value. 2016-01-02 10:24:23 -07:00
Richard
cdf2179b3e Describe device tracker see service 2016-01-02 10:54:26 -06:00
sander
8f2ca856c7 added return False 2016-01-02 11:56:07 +01:00
Greg Dowling
622a6deb04 Merge pull request #820 from balloob/vera-subscriptons
Add ability to respond to events from Vera hub
2016-01-02 10:15:14 +00:00
Paulus Schoutsen
a698bc477d Merge pull request #819 from rhooper/phue-deconz
Add support for deCONZ (Raspbee-GW hue-like API)
2016-01-01 22:21:48 -08:00
Roy Hooper
a36ae4b24a Reduce chatiness 2016-01-02 01:01:11 -05:00
sander
c703c89dbd implement away mode 2016-01-01 15:29:58 +01:00
sander
b3227e491b Merge remote-tracking branch 'refs/remotes/balloob/dev' into dev 2016-01-01 14:44:25 +01:00
happyleavesaoc
9e83a80215 Merge pull request #788 from happyleavesaoc/command_switch_state
add statecmd to command_switch
2015-12-31 18:43:02 -05:00
happyleaves
9c85702c87 combine ifs 2015-12-31 18:39:40 -05:00
Paulus Schoutsen
9b7b39055d Merge pull request #826 from andythigpen/feature/is-state-attr
Add is_state_attr method.
2015-12-31 14:17:59 -08:00
Andrew Thigpen
11f32d0500 Add is_state_attr method.
Returns True if the entity exists and has an attribute with the given
name and value.
2015-12-31 14:58:18 -06:00
Philip Lundrigan
326e26fbeb Merge pull request #825 from philipbl/locative
Update Locative component
2015-12-31 13:10:11 -07:00
Philip Lundrigan
394c87c40b Remove unnecessary condition in write_text 2015-12-31 13:05:24 -07:00
Philip Lundrigan
ce152e9c94 Simplify logic 2015-12-31 12:39:36 -07:00
pavoni
9e0946b207 Turn off polling for sensor too! 2015-12-31 19:15:21 +00:00
Paulus Schoutsen
da77edf8fc Merge pull request #818 from balloob/update-wemo-library
Improve wemo subscription error handling.
2015-12-31 11:06:43 -08:00
Paulus Schoutsen
6cb991d583 Merge pull request #814 from Mosibi/fix_mpd_title_keyerror
Fix KeyError on 'title' when title is empty
2015-12-31 11:04:30 -08:00
pavoni
f8e5df237b Remove '#'' from requirements 2015-12-31 18:58:12 +00:00
Philip Lundrigan
5d953061e8 Remove unnecessary error checking 2015-12-31 11:56:27 -07:00
Philip Lundrigan
1bcca8cba1 Fix problem with test 2015-12-31 11:56:27 -07:00
Philip Lundrigan
bdb6182921 Changes to locative based on tests 2015-12-31 11:56:27 -07:00
Philip Lundrigan
55d1ad94ef Add tests for Locative 2015-12-31 11:56:27 -07:00
pavoni
6773c35760 Bump pywemo version 2015-12-31 18:47:12 +00:00
pavoni
5f89b34831 Bump pyvera version 2015-12-31 16:09:05 +00:00
pavoni
90ae5c6646 Add missed import, fix style error. 2015-12-31 12:25:24 +00:00
pavoni
a8bb75d070 Update sensor with subscription code, change to use pyvera library 2015-12-31 12:16:03 +00:00
pavoni
d82859b6ea Turn off poll 2015-12-31 10:57:54 +00:00
Philip Lundrigan
7d41ce4e46 Switch from json messages to plain text messages 2015-12-30 22:43:32 -07:00
Philip Lundrigan
c23375a18b Add case for test message 2015-12-30 22:42:11 -07:00
MartinHjelmare
4c4e5d5f47 Fix to remove old unused variables. 2015-12-31 06:19:47 +01:00
MartinHjelmare
6ff24ed047 Merge branch 'dev' into mysensors-component-switch
Conflicts:
	homeassistant/components/sensor/__init__.py
	homeassistant/components/switch/__init__.py
2015-12-31 06:05:06 +01:00
MartinHjelmare
69ed6fe6e7 Add gateway wrapper, fix discovery and callbacks
* Add gateway wrapper by subclassing serial gateway.
* Fix platform setup with discovery service.
* Fix platform callback functions with callback factory.
2015-12-31 05:48:23 +01:00
Roy Hooper
4e2d75a8f4 fix style 2015-12-30 16:59:22 -05:00
pavoni
ae0dbbcfa5 Added support for event subscriptions 2015-12-30 19:44:02 +00:00
Philip Lundrigan
25e1432403 Fix style issues 2015-12-30 12:30:49 -07:00
Philip Lundrigan
adfcfad488 Update locative functionality 2015-12-30 12:26:03 -07:00
Roy Hooper
b0734e613f Add support for deCONZ (Raspbee-GW hue-like API) - Doesn't support the none transition type, so don't send it 2015-12-30 13:54:18 -05:00
Richard Arends
913c5ab47c identing error... sorry 2015-12-30 13:26:42 +01:00
Richard Arends
429904c437 Returning None when name and title are both not available
Removed trailing whitespaces
2015-12-30 13:00:34 +01:00
pavoni
41a36df801 Update pywemo version 2015-12-30 11:54:21 +00:00
Richard Arends
56a2ffca1d Changed if else statements. The following situations are handled now:
- name and title can be None
  - name can be None
  - title can be None
  - name and title can contain data
2015-12-29 22:10:09 +01:00
Richard Arends
6e2fb17f19 Fix KeyError on 'title' when title is empty 2015-12-29 17:52:05 +01:00
Paulus Schoutsen
586be7fad1 Prevent division by 0 xy->rgb color conversion 2015-12-29 00:09:38 -08:00
Paulus Schoutsen
d9b30d1421 Pep257 fixes for core. 2015-12-27 21:14:35 -08:00
happyleaves
e9059a3ed9 added test; addressed comments 2015-12-27 22:51:37 -05:00
Paulus Schoutsen
473d6b1d05 Fix console coloring for scripts 2015-12-27 19:19:29 -08:00
Paulus Schoutsen
7f17a50b4a Swap lint/requirements validation between Python versions 2015-12-27 18:04:38 -08:00
Paulus Schoutsen
c7183a14a5 Tweak lint script colors for travis 2015-12-27 18:03:23 -08:00
Paulus Schoutsen
c1eaf60461 VCR YR sensor test 2015-12-27 17:37:32 -08:00
Paulus Schoutsen
ca6b957839 Make test deps explicit 2015-12-27 16:57:16 -08:00
Paulus Schoutsen
680385df93 Hide some build log spam 2015-12-27 16:35:14 -08:00
Paulus Schoutsen
62f21c3ac6 colorize lint errors 2015-12-27 16:31:53 -08:00
Paulus Schoutsen
acfbbb3898 Update copyright 2015-12-27 16:31:52 -08:00
Paulus Schoutsen
4403fe941d Test config clean up 2015-12-27 16:31:52 -08:00
Paulus Schoutsen
244fde880e Convert MQTT event to lowercase 2015-12-27 16:31:52 -08:00
Greg Dowling
df99e4ef22 Merge pull request #794 from pavoni/wemo-subscription
Adds Wemo event support - so wemo devices update HA more quickly
2015-12-28 00:11:34 +00:00
pavoni
976d9f2d08 Fix style issue 2015-12-28 00:04:30 +00:00
pavoni
f5dd146676 Fix bug in shutdown 2015-12-27 23:56:18 +00:00
Paulus Schoutsen
7b00b19223 Merge pull request #807 from andythigpen/scene-fix
Fix issue with scene component when using YAML aliases.
2015-12-27 15:39:19 -08:00
pavoni
b114ba56ea Fix style issue 2015-12-27 23:31:48 +00:00
pavoni
0d32bd7a19 Simplify callback logging, add stop log 2015-12-27 23:26:35 +00:00
pavoni
4feef3dd0d Simplify update state call, shutdown properly. 2015-12-27 23:09:39 +00:00
Paulus Schoutsen
9c3b1b7a96 Fix sun import issue 2015-12-27 15:00:49 -08:00
Paulus Schoutsen
a09d731058 Merge pull request #803 from molobrakos/tellduslive2
added rudimentary support for telldus live
2015-12-27 15:00:01 -08:00
Erik
27e35d5f34 don't poll (turns out a request for state immediately a state turn on/off request will not return the newly updated state. import constants from tellive, not tellcore 2015-12-27 21:49:45 +01:00
Erik
c8fa6cc127 bug fix 2015-12-27 21:47:49 +01:00
Per Sandström
468087e6bc Merge pull request #806 from persandstrom/verisure-pypi
verisure module from pypi
2015-12-27 21:10:18 +01:00
Andrew Thigpen
d4b6a7343f Fix issue with scene component when using YAML aliases.
YAML aliases/anchors can make repetitive configuration sections easier
to deal with.  However when dealing with dictionaries, care needs to be
taken to not modify the original anchor since PyYAML utilizes a
reference when encountering an alias instead of a copy of the
dictionary.
2015-12-27 13:24:34 -06:00
Paulus Schoutsen
87c88078c8 Update sun to use elevation util 2015-12-27 11:22:10 -08:00
Paulus Schoutsen
8c1ebde1de Update requirements_all.txt 2015-12-27 11:10:14 -08:00
Paulus Schoutsen
ab5a3f9de3 Clean up YR sensor 2015-12-27 11:07:25 -08:00
Per Sandström
eb3da8cb03 verisure component from pypi 2015-12-27 20:07:09 +01:00
Paulus Schoutsen
9e1ecd7124 Fix flaky history test 2015-12-27 10:38:27 -08:00
Erik
efbaf47dc7 reference constants from tellive package 2015-12-27 18:49:11 +01:00
Erik
f10ecb2a8d remove obsolete comment 2015-12-27 18:42:10 +01:00
Erik
6e81391711 no percentage sign 2015-12-27 18:37:34 +01:00
Paulus Schoutsen
0d64f4a2d5 Merge pull request #804 from molobrakos/systemmon-icons
Systemmon icons
2015-12-27 08:54:14 -08:00
Erik
d63e5a60ae added rudimentary support for telldus live 2015-12-27 12:32:08 +01:00
Paulus Schoutsen
384f1344fd Merge branch 'pr/792' into dev 2015-12-26 17:48:29 -08:00
Paulus Schoutsen
add24915a3 ps - clean up sun automation tests 2015-12-26 17:48:20 -08:00
Paulus Schoutsen
089bbfc5cc Travis: Less verbose requirements_all.txt check 2015-12-26 17:19:53 -08:00
Paulus Schoutsen
1944b6a335 Merge pull request #796 from persandstrom/verisure-update
Verisure update
2015-12-26 08:17:08 -08:00
Paulus Schoutsen
b8cfe63fc6 Merge pull request #797 from molobrakos/eliq-icon
replace default icon
2015-12-26 08:15:01 -08:00
Paulus Schoutsen
9e091a2c92 Merge pull request #798 from R1chardTM/hue-random
Add random color effect for Philips Hue
2015-12-26 08:10:09 -08:00
Paulus Schoutsen
41bcdc3356 Merge pull request #793 from philipbl/rest_bug_fix
Fix bug in rest sensor
2015-12-25 15:00:52 -08:00
Philip Lundrigan
40486676df Simplify error handling 2015-12-25 14:34:30 -07:00
Erik
6f2078cda3 bugfix 2015-12-25 22:02:10 +01:00
Erik
b8d2f2ba37 moved into sensor types 2015-12-25 21:44:32 +01:00
Erik
03491fcc09 icons 2015-12-25 21:19:51 +01:00
Per Sandström
571073fe1f added docstring 2015-12-25 21:04:16 +01:00
Per Sandström
a577d5c5fa revert accidental change 2015-12-25 20:57:30 +01:00
Per Sandström
160814f425 log texts 2015-12-25 20:42:03 +01:00
Per Sandström
b83b36274a changed to python-verisure 0.4.1 2015-12-25 20:16:51 +01:00
Erik
f3db4306c2 added icon 2015-12-25 18:50:35 +01:00
richard
5c7fb5d7ae Fix styling issues 2015-12-24 21:35:36 -06:00
richard
0dfc1c4e7a Add functionality set random color Philips Hue 2015-12-24 21:10:27 -06:00
pavoni
3f151428b7 Update pywemo version, use wildcard filter 2015-12-24 09:35:02 +00:00
Philip Lundrigan
2606e4d641 Simplify if statement 2015-12-24 00:38:49 -07:00
MartinHjelmare
be25ea4f09 Fix avoid event bus for updates 2015-12-24 02:14:58 +01:00
MartinHjelmare
77959341a3 Merge branch 'dev' into mysensors-component-switch
Conflicts:
	homeassistant/components/sensor/mysensors.py
	requirements_all.txt
2015-12-23 23:45:32 +01:00
MartinHjelmare
9f54bcc21b Fix comments for pull request
* Fix cleaner user config.
* Remove bad disabling of linting.
* Extract default mysensors version into constant.
* Clean up selection of mysensors.CONST from version.
* Update mysensors update decorator to add devices and update values
	in one go.
* Fix persistence update.
* Clean up setup of ports.
* Setup of mysensors platforms from main mysensors component.
* Clean up v_types selection in mysensors sensor platform.
* Fix s_types and v_types selection version dependency in platforms.
2015-12-23 23:20:39 +01:00
pavoni
6d236b8169 Force state update 2015-12-23 18:03:40 +00:00
pavoni
09b894a4aa Fix style issues 2015-12-23 15:57:51 +00:00
pavoni
1e2b5e6991 Add support for subscriptions 2015-12-23 15:46:18 +00:00
Philip Lundrigan
496ec4bcca Fix bug in rest sensor 2015-12-23 03:37:03 -07:00
Paulus Schoutsen
3e51d0b539 Merge pull request #791 from andythigpen/logger-fix
Set the root logger to lowest level in logger component.
2015-12-22 23:13:45 -08:00
Andrew Thigpen
c31a291a9c Set the root logger to lowest level in logger component.
In combination with resetting the log level on the handlers, this
allows messages lower than the default INFO to be logged when using
the logger component.
2015-12-23 00:57:41 -06:00
Paulus Schoutsen
96938bb33c Merge pull request #786 from philipbl/locative
Rename geofancy to locative (fix #761)
2015-12-22 19:02:08 -08:00
Paulus Schoutsen
e7b1682a4e Merge branch 'pr/780' into dev 2015-12-22 18:57:42 -08:00
Paulus Schoutsen
d191635fd8 Merge branch 'yr_no' into dev 2015-12-22 18:53:27 -08:00
Paulus Schoutsen
bdd945c1c4 Set default log level to INFO 2015-12-22 18:39:46 -08:00
Paulus Schoutsen
6ccf63dae2 Merge pull request #790 from andythigpen/logger-fix
Reset log handlers to lowest level.
2015-12-22 18:38:58 -08:00
Paulus Schoutsen
987282da78 Logbook entry events are now lower case 2015-12-22 18:35:05 -08:00
Fabian Affolter
56186232f3 Enable logging-too-many-args 2015-12-22 22:33:20 +01:00
Fabian Affolter
fb2da6be9a Remove space 2015-12-22 22:02:55 +01:00
Fabian Affolter
8796187389 Equalize log messages 2015-12-22 22:02:55 +01:00
Andrew Thigpen
edff53609f Reset log handlers to lowest level.
This is necessary to enable logging lower than INFO for the error log file.
2015-12-22 13:50:59 -06:00
Paulus Schoutsen
dbc91c1d48 Merge pull request #789 from balloob/release-101
Release 0.10.1
2015-12-22 09:05:55 -08:00
Paulus Schoutsen
0607c8f4b4 Version bump to 0.10.1 2015-12-22 08:59:32 -08:00
Paulus Schoutsen
7ccb6b960c Merge branch 'release-101' into dev 2015-12-22 02:20:25 -08:00
Paulus Schoutsen
561a78bef3 Fix EntityComponent deadlock 2015-12-22 02:19:55 -08:00
Paulus Schoutsen
9876a2a081 Fix Alexa bug if no value for slots 2015-12-22 02:08:46 -08:00
happyleaves
fba5becd90 warn->warning 2015-12-21 20:18:00 -05:00
happyleaves
d5179b4bdc add statecmd to command_switch 2015-12-21 19:49:39 -05:00
Philip Lundrigan
ff8f22854c Add test 2015-12-21 16:28:26 -07:00
Philip Lundrigan
110d721c76 Add tests 2015-12-21 16:09:51 -07:00
Philip Lundrigan
8c010c8df4 Add ability to use sun as condition in automation 2015-12-21 16:09:27 -07:00
Philip Lundrigan
0ac1759395 Rename geofancy to locative (fix #761) 2015-12-21 11:05:20 -07:00
Paulus Schoutsen
07fb4ff243 Revert last fix. Will fix better. 2015-12-21 09:44:17 -08:00
Paulus Schoutsen
2650d235ea Fix: EntityComponent deadlock when adding new devices during update state 2015-12-21 08:56:27 -08:00
Daniel
9e89197284 small fix in yr sensor name 2015-12-21 10:42:42 +01:00
Daniel
8159d36114 small fix in yr sensor name 2015-12-21 10:36:25 +01:00
Daniel
cf4f4ce8c7 changed to use requestes in stead of urllib for yr sensor 2015-12-21 10:33:19 +01:00
Daniel
9a1883bb49 changed to use requestes in stead of urllib for yr sensor 2015-12-21 10:29:12 +01:00
Daniel
8e16a443e5 Added yr sensor to requirements_all 2015-12-21 10:24:22 +01:00
Paulus Schoutsen
35411cd57e Version bump to 0.11.dev0 2015-12-20 15:32:51 -08:00
Paulus Schoutsen
bc4ab4d70a Merge branch 'dev' 2015-12-20 15:31:22 -08:00
Paulus Schoutsen
901f63be0c Version bump to 0.10 2015-12-20 15:30:51 -08:00
Paulus Schoutsen
7ee71b1831 Merge pull request #778 from balloob/dev
0.10.0.rc1
2015-12-20 15:10:28 -08:00
Paulus Schoutsen
70a5704887 Merge pull request #779 from happyleavesaoc/torque
torque support
2015-12-20 15:04:46 -08:00
happyleaves
04316d9723 http fixes 2015-12-20 11:20:40 -05:00
Paulus Schoutsen
14246fe467 Merge pull request #781 from balloob/mqtt-light-template
Add template support to MQTT lights
2015-12-19 19:51:43 -08:00
Paulus Schoutsen
177590fd65 Simplify MQTT light code 2015-12-19 19:45:28 -08:00
Paulus Schoutsen
1c08923ffc Last test for 100% coverage of mqtt light 2015-12-19 19:36:38 -08:00
Paulus Schoutsen
7bb07cdc03 Remove MQTT light from coveragerc 2015-12-19 19:29:31 -08:00
Paulus Schoutsen
90c705354a Add template support to MQTT lights 2015-12-19 19:15:05 -08:00
Fabian Affolter
55a236f912 Update docstrings 2015-12-19 09:38:23 +01:00
happyleaves
f071e3b4ac torque support 2015-12-19 00:19:41 -05:00
Paulus Schoutsen
a6a30c5f22 Merge pull request #776 from balloob/travis-caching
Fix travis caching
2015-12-18 09:17:27 -08:00
Paulus Schoutsen
dc8ac7386e Merge pull request #775 from balloob/chromecast-dependency-fix
Upgrade PyChromecast version
2015-12-18 09:08:29 -08:00
Paulus Schoutsen
cc80ad00ff Fix travis caching 2015-12-18 09:07:34 -08:00
Paulus Schoutsen
824dd60aef Upgrade PyChromecast version 2015-12-18 08:58:13 -08:00
Fabian Affolter
2efca59352 Remove print 2015-12-18 17:34:23 +01:00
Fabian Affolter
4a0ec36fea Update error message 2015-12-18 13:47:13 +01:00
Paulus Schoutsen
9bf8835190 Merge pull request #772 from balloob/template-editor
Add template editor
2015-12-18 00:46:50 -08:00
Paulus Schoutsen
411ce04d75 Merge pull request #773 from balloob/travis-tweaks
Travis tweaks
2015-12-18 00:46:32 -08:00
Paulus Schoutsen
2e75f0b314 Remove quiet pip installs on travis 2015-12-18 00:35:53 -08:00
Paulus Schoutsen
dd60cc020e Only validate requirements_all.txt on Python 3.5 2015-12-18 00:19:14 -08:00
Paulus Schoutsen
9dca22aa27 Only lint on Python 3.4 2015-12-18 00:14:31 -08:00
Paulus Schoutsen
b5fc7f5e71 Verify requirements_all in Travis 2015-12-18 00:01:52 -08:00
Paulus Schoutsen
80d3552960 Add template editor 2015-12-17 23:33:09 -08:00
MartinHjelmare
845926236e Add config sample and fix requirements_all 2015-12-18 03:58:21 +01:00
MartinHjelmare
eae07c070a Merge branch 'dev' into mysensors-component-switch 2015-12-18 03:39:41 +01:00
MartinHjelmare
659226886f Update .coveragerc and requirements 2015-12-18 03:37:49 +01:00
Philip Lundrigan
a0ff8819a9 Make numeric_state error message more descriptive 2015-12-17 17:37:39 -07:00
Philip Lundrigan
4196d6a21c Merge pull request #770 from philipbl/fix_icloud
Small iCloud device tracker fix
2015-12-17 14:06:45 -07:00
Philip Lundrigan
c564c73617 Return true when iCloud finishes setting up
Otherwise an error will be reported even though it set up correctly.
2015-12-17 13:31:33 -07:00
Fabian Affolter
5dabba3941 Move config to docs 2015-12-17 19:44:18 +01:00
Paulus Schoutsen
257743facc script/bootstrap_server 2015-12-17 09:17:24 -08:00
Paulus Schoutsen
0369f5153e Disable pychromecast in requirements all because protobuf dep fails on CI 2015-12-17 09:16:36 -08:00
Paulus Schoutsen
04aa4ff3a8 Add Travis fast_finish 2015-12-17 09:15:56 -08:00
Paulus Schoutsen
38c529502d Fix requirements_all.txt 2015-12-17 09:10:19 -08:00
Paulus Schoutsen
dbad01f73d Merge pull request #767 from fabaff/binary-rest-sensor
Binary REST sensor
2015-12-17 09:05:44 -08:00
Paulus Schoutsen
9087e6a0d0 Merge pull request #765 from philipbl/template_automation
Add template automation
2015-12-17 09:01:08 -08:00
Paulus Schoutsen
faff14ac94 Merge pull request #755 from molobrakos/eliqonline
Added support for ELIQ Online energy monitoring device (http://eliq.se/en/)
2015-12-17 08:56:13 -08:00
Paulus Schoutsen
f2aeb2a6f9 Merge pull request #748 from davidedmundson/fuzzy
Use fuzzy matching for conversation entity matching
2015-12-17 08:55:12 -08:00
Philip Lundrigan
56b38e64ae Change method of listening to state changes 2015-12-16 23:53:10 -07:00
Paulus Schoutsen
eb4f0e4ae9 Merge pull request #747 from w1ll1am23/dev
Added support for the Quirky Egg Minder
2015-12-16 20:08:00 -08:00
William Scanlon
1747db1888 More spacing fixes 2015-12-16 22:45:58 -05:00
William Scanlon
5066e6a183 Fixed spacing in wink 2015-12-16 22:39:02 -05:00
William Scanlon
8eb73c8f17 Fixed style violations 2015-12-16 22:31:34 -05:00
William Scanlon
3ce6463af3 Fixed python-wink in requirements_all.txt 2015-12-16 22:07:29 -05:00
William Scanlon
cceb79a378 Pulled from dev to get up-to-date 2015-12-16 19:00:06 -05:00
Fabian Affolter
2a30c07429 Add binary rest sensor 2015-12-17 00:47:37 +01:00
Fabian Affolter
f246508c9a Add binary rest sensor 2015-12-17 00:47:12 +01:00
William Scanlon
eb6b4218fc Moved python-wink requirement to PyPI 2015-12-16 18:39:23 -05:00
Tom Duijf
7fb5927ac8 Merge pull request #766 from balloob/import_fixes
Import fixes for wink and heatmiser
2015-12-16 23:51:15 +01:00
Tom Duijf
4eec89b35e fixed my own cleanup 2015-12-16 22:36:40 +00:00
Philip Lundrigan
4c33eba378 Prevent triggering twice 2015-12-16 15:24:09 -07:00
Philip Lundrigan
fe2ae16210 Add tests for template automation 2015-12-16 15:24:09 -07:00
Philip Lundrigan
ab8ff42cdd Create template automation 2015-12-16 15:24:09 -07:00
Tom Duijf
687ce64551 small cleanup heatmiser 2015-12-16 22:21:32 +00:00
Tom Duijf
31b4c8eb4d Fixed imports 2015-12-16 21:52:49 +00:00
William Scanlon
f6d16ba118 updated python-wink requirements for 3.0.1 2015-12-16 15:22:38 -05:00
Erik
69d8b995d4 added eliqonline 2015-12-16 20:54:25 +01:00
Erik
70bc6f4506 added eliqonline 2015-12-16 20:54:11 +01:00
William Scanlon
afbf377b6d Update for style changes in python-wink 2015-12-16 13:32:38 -05:00
Fabian Affolter
da63800319 Add gen_requirements_all.py 2015-12-16 19:20:44 +01:00
Erik
0075752c06 better error message 2015-12-16 18:11:44 +01:00
Paulus Schoutsen
0a44750441 Merge pull request #757 from fabaff/glances-name
Include name
2015-12-16 08:10:34 -08:00
William Scanlon
c91cd9aa84 Updated python-wink requirements 2015-12-16 11:05:18 -05:00
Paulus Schoutsen
c8234ffb8d Merge pull request #762 from bradsk88/pywink-0.3
Updating to python-wink 0.3.0
2015-12-16 07:50:35 -08:00
Erik
14056951c7 lint 2015-12-16 16:41:34 +01:00
Erik
e76defe035 proper access_token check 2015-12-16 16:36:56 +01:00
Erik
3b8c5d6833 disable throttling for now 2015-12-16 16:36:04 +01:00
Erik
956a6418cc let the user supply the sensor name 2015-12-16 16:35:35 +01:00
Paulus Schoutsen
507145e954 Merge pull request #726 from happyleavesaoc/twitch
twitch sensor
2015-12-15 19:59:12 -08:00
Paulus Schoutsen
40c2e10756 Merge pull request #760 from kevinpanaro/dev
update pyicloud version for icloud tracker
2015-12-15 19:57:20 -08:00
bradsk88
58988787ea Updating to python-wink 0.3.0 2015-12-15 21:46:54 -06:00
kevinpanaro
79a1ffac9c fixed pyicloud version 2015-12-15 21:13:45 -05:00
kevinpanaro
4f6243fe0e changed pyicloud version to 0.7.2 2015-12-15 21:07:34 -05:00
happyleaves
2a3e086410 fix requirements comment 2015-12-15 20:44:55 -05:00
happyleaves
0e9c51a479 twitch sensor 2015-12-15 20:43:14 -05:00
Paulus Schoutsen
d6dad8c818 Merge pull request #756 from philipbl/arest_sensor
Template support for aRest sensor
2015-12-15 16:48:14 -08:00
Paulus Schoutsen
17940f36e8 Merge pull request #759 from happyleavesaoc/orvibo_version
bump orvibo dependency version
2015-12-15 16:44:38 -08:00
happyleaves
149449624e bump orvibo dependency version 2015-12-15 18:50:15 -05:00
Philip Lundrigan
574de3b1b6 Handle template error
To be more consistent with the other sensor implementations of templates
2015-12-15 15:47:35 -07:00
Fabian Affolter
85873390ee Include name (#654) 2015-12-15 23:12:43 +01:00
Philip Lundrigan
4e6b01b0b9 Use different render method 2015-12-15 14:47:25 -07:00
Philip Lundrigan
5ecdd06bd5 Template support for arest sensor 2015-12-15 14:16:52 -07:00
Paulus Schoutsen
9404636536 Merge pull request #754 from davidedmundson/shebang
Add shebang line to setup.py
2015-12-15 13:06:13 -08:00
Erik
a764817ee9 lint ok 2015-12-15 22:05:55 +01:00
Erik
dade33187f added support for eliq online energy sensor 2015-12-15 21:48:42 +01:00
David Edmundson
b3c13747dc Add shebang line to setup.py 2015-12-15 20:48:10 +00:00
David Edmundson
a3f805d88e Use fuzzy matching for conversation entity matching
Entity may not be picked up exactly by the speech recognition. Instead
of doing an exact string match, look for names which are phonetically
similar and choose the best match above a certain threshold.

This helps as entity names may often be pronoun's (Dave's bedroom) and
this allows for some minor mistakes i.e "the bedroom" will successfully
match against a switch called "bedroom"

It introduces a new library dependency, fuzzywuzzy for comparisons.
2015-12-15 20:44:35 +00:00
Philip Lundrigan
66fca475c6 Merge pull request #745 from philipbl/numeric_trigger
Template support for numeric state
2015-12-15 10:18:22 -07:00
Philip Lundrigan
9fa8b27d65 Change from value to state 2015-12-15 10:12:43 -07:00
Philip Lundrigan
455a9c83a6 Simplify logic 2015-12-15 08:57:30 -07:00
William Scanlon
94eb002b0a Updated python-wink requirements and URL 2015-12-15 10:32:20 -05:00
Fabian Affolter
fcdaa923c5 Update docstrings 2015-12-15 10:42:05 +01:00
Paulus Schoutsen
a35dcf860e Update frontend with layout bugfix 2015-12-14 23:53:32 -08:00
Paulus Schoutsen
4029d149fb Weird travis fix for api 2015-12-14 23:27:22 -08:00
Paulus Schoutsen
027b891052 Add tests for API.stream 2015-12-14 23:20:43 -08:00
Paulus Schoutsen
2e0042adb0 Tweak iCloud device tracker 2015-12-14 21:39:48 -08:00
Paulus Schoutsen
79c92cd0c4 Merge branch 'pr/616' into dev 2015-12-14 21:31:20 -08:00
Paulus Schoutsen
946f6cab9d Merge pull request #743 from philipbl/command_sensor
Command Sensor: Add support for template
2015-12-14 18:51:35 -08:00
Paulus Schoutsen
9e0d19df6c Merge pull request #744 from fabaff/binary-sensor-template
Template support for binary sensor
2015-12-14 18:50:41 -08:00
Paulus Schoutsen
6d38288411 Merge pull request #746 from davidedmundson/dev
Add PlayMedia support to Chromecast component
2015-12-14 18:49:27 -08:00
William Scanlon
056645fe13 Removed files.txt 2015-12-14 19:08:45 -05:00
David Edmundson
d16526739c Add PlayMedia support to Chromecast 2015-12-14 23:53:46 +00:00
William Scanlon
6a4442cddf Set REQUIREMENTS back to master 2015-12-14 18:34:11 -05:00
William Scanlon
c1d728ce00 Remove @property from update function 2015-12-14 18:31:09 -05:00
Philip Lundrigan
a517784c9e Condense in_range template logic 2015-12-14 15:07:35 -07:00
Philip Lundrigan
91a945f4c7 Slight style change 2015-12-14 15:01:38 -07:00
Philip Lundrigan
cec62bdf87 Add tests 2015-12-14 14:47:32 -07:00
Philip Lundrigan
53239387e0 Add support for template 2015-12-14 14:47:24 -07:00
Fabian Affolter
a1009d9138 Add template support 2015-12-14 21:38:56 +01:00
Philip Lundrigan
e821b546d5 Ignore template if it isn't set 2015-12-14 10:49:54 -07:00
Philip Lundrigan
600831cff5 Add support for template 2015-12-14 10:29:27 -07:00
Fabian Affolter
87d40f6673 Move config details to doc 2015-12-14 18:19:50 +01:00
William Scanlon
5755c6f593 Fixed get method name 2015-12-14 10:45:03 -05:00
William Scanlon
3ed69cec68 Add Egg Minder support 2015-12-14 10:13:51 -05:00
Paulus Schoutsen
df24a1bfa7 Update frontend (babel 6) 2015-12-13 23:59:40 -08:00
Paulus Schoutsen
90f0632a69 Install bower dependencies on frontend bootstrap 2015-12-13 23:54:15 -08:00
Paulus Schoutsen
3faa1a4393 Fix lint issues 2015-12-13 13:47:05 -08:00
Paulus Schoutsen
f93d6a1a11 Fix local dir config path 2015-12-13 13:40:42 -08:00
Paulus Schoutsen
0f777ecd4c Update coveragerc 2015-12-13 13:21:38 -08:00
caius
cc962c6bb2 Add some lint suggested modifications 2015-12-13 13:20:52 -08:00
caius
9833b4b663 Add the fritz device tracker to track established connections to FritzBox routers 2015-12-13 13:20:52 -08:00
caius
b3171c7cde Add fritzconnection library to requirements 2015-12-13 13:20:52 -08:00
Paulus Schoutsen
4528c57539 Merge pull request #739 from balloob/alexa
Amazon Echo / Alexa support for retrieving information
2015-12-13 13:16:40 -08:00
Paulus Schoutsen
7e9eaf14b8 Merge pull request #740 from Mosibi/mpd_show_name_and_title
Added support for MPD to display the name before the title if it is available
2015-12-13 11:52:54 -08:00
Richard Arends
035d518cb6 Expect the case where currentsong['name'] can be absent. Use the .get
funtion with a default value set to None
2015-12-13 19:54:10 +01:00
Richard Arends
85b62a20c8 Use format instead of str.join to join name and title 2015-12-13 19:46:17 +01:00
Richard Arends
46f742f82f Added support for MPD to display the name before the title if it is available
When using a radio stream, the name of the station is often available in
currentsong['name']. Just like the 'mpc' CLI client, this change displays
the name of the station before the current song title.

For example: "Mick Jagger - Let's Work" becomes "Radio 10: Mick Jagger - Let's Work"
2015-12-13 18:42:53 +01:00
Paulus Schoutsen
729c24d59b Add Alexa component 2015-12-12 22:29:02 -08:00
Paulus Schoutsen
f73f824e0e Make template states var callable 2015-12-12 22:19:37 -08:00
Paulus Schoutsen
360b99be59 Add template is_state method 2015-12-12 22:19:12 -08:00
Paulus Schoutsen
931f7e8615 Simplify http component 2015-12-12 22:18:38 -08:00
Paulus Schoutsen
106a229a27 Merge pull request #724 from fabaff/dweet
Dweet.io sensor
2015-12-12 16:35:09 -08:00
Fabian Affolter
649ce7befb Fix typo 2015-12-13 01:00:34 +01:00
Fabian Affolter
ed9b75756a Catch error state 2015-12-13 01:00:12 +01:00
Fabian Affolter
27c5c1cb9f Add dweepy 2015-12-12 22:58:08 +01:00
Fabian Affolter
1d017beb93 Use templating 2015-12-12 22:55:59 +01:00
Fabian Affolter
4286e116f3 Add requirement 2015-12-12 22:55:35 +01:00
Fabian Affolter
64e3db2444 Add dweet sensor 2015-12-12 22:55:35 +01:00
Fabian Affolter
f458484770 Add sensor for Dweet.io 2015-12-12 22:55:35 +01:00
Paulus Schoutsen
01c4038dec Merge pull request #732 from philipbl/sensor_template
Add template support for rest sensor
2015-12-12 13:26:15 -08:00
Philip Lundrigan
27e3e72211 Change description of rest sensor 2015-12-12 14:19:00 -07:00
Philip Lundrigan
a84ff14b00 Remove exception handling for templates
It is now handled in the layers below
2015-12-12 13:34:21 -07:00
Philip Lundrigan
ab9ab532c8 Merge dev into sensor_template 2015-12-12 13:25:04 -07:00
Paulus Schoutsen
9fc0d93e44 Merge pull request #736 from Mosibi/mpd-add-state_on
Added support for MPD to start playing the current song/playlist
2015-12-12 12:06:38 -08:00
Paulus Schoutsen
ded99d7480 Merge pull request #734 from balloob/template-errors
Catch exceptions when errors rendering template
2015-12-12 11:58:38 -08:00
Paulus Schoutsen
2b975c8620 Add flexible error value for value template parsing 2015-12-12 10:35:15 -08:00
Richard Arends
9eea7a6cde Added support for MPD to start playing the current song/playlist 2015-12-12 16:25:56 +01:00
Paulus Schoutsen
b1bf6a609e Catch exceptions when error rendering templates 2015-12-11 19:07:03 -08:00
Paulus Schoutsen
5c63862054 Fix template rounding 2015-12-11 18:45:53 -08:00
Paulus Schoutsen
0b325b2b7d API.stream - catch more errors 2015-12-11 18:43:00 -08:00
Philip Lundrigan
1c54111018 Add template support to rest sensor 2015-12-11 15:19:49 -07:00
Paulus Schoutsen
13b0d2afa3 Merge pull request #729 from mchrisb03/dev
Correct target temp for ecobee in heat or cool mode
2015-12-11 08:48:03 -08:00
Paulus Schoutsen
a10908e167 Merge pull request #727 from andylockran/dev
Heatmiser Thermostat Support
2015-12-11 08:44:27 -08:00
Paulus Schoutsen
56bb9f2da0 Merge pull request #720 from balloob/template
Home Assistant templates
2015-12-11 08:32:49 -08:00
Chris Baumgartner
2368e5f4ec The target temp (shown in Thermostat card) is not correct when running in heat or cool modes. It is ok for auto mode. 2015-12-11 09:47:28 -06:00
andylockran
84226b573e Merge branch 'dev' of github.com:andylockran/home-assistant into dev 2015-12-11 12:49:34 +00:00
andylockran
e19af76c70 Added heatmiser thermostat support 2015-12-11 12:45:27 +00:00
Paulus Schoutsen
9a9ecb5916 Migrate MQTT from jsonpath to templates 2015-12-10 21:39:01 -08:00
Paulus Schoutsen
d55fda28c2 Add value renderer helper method 2015-12-10 21:38:35 -08:00
Paulus Schoutsen
7acef84aad Add variable support to template rendering 2015-12-10 21:16:05 -08:00
Paulus Schoutsen
5f8fc7e197 Merge pull request #721 from MartinHjelmare/fix-logging-levels
Fix logging lowest level
2015-12-10 20:57:59 -08:00
Paulus Schoutsen
0dcc69d800 Fix template rounding 2015-12-10 20:47:06 -08:00
Paulus Schoutsen
47b5fbfaf3 Add template API endpoint 2015-12-10 20:47:06 -08:00
Paulus Schoutsen
d1383ac94d Add template parsing to notify 2015-12-10 20:47:06 -08:00
Paulus Schoutsen
af09a305cf Add multiply template filter 2015-12-10 20:47:06 -08:00
Paulus Schoutsen
b440c260e6 Add jinja2 to dependencies. 2015-12-10 20:47:05 -08:00
Paulus Schoutsen
de68d3355a Add template support 2015-12-10 20:47:05 -08:00
Paulus Schoutsen
fc8c26005c Change Travis caching to be less invasive 2015-12-10 18:16:49 -08:00
Paulus Schoutsen
452348a7f9 Update default MySensor persistence file path 2015-12-10 18:13:06 -08:00
happyleaves
d3a21bee82 twitch media player 2015-12-10 20:52:36 -05:00
MartinHjelmare
5ff6eb8b9c Fix logging lowest level
* Set lowest logging level to NOTSET in enable_logging(), bootstrap.py,
	to enable setting a lower logging level than INFO in the logger
	component.
2015-12-10 02:56:05 +01:00
Paulus Schoutsen
5d3d2d4110 Merge pull request #719 from philipbl/decimal_places
Decimal places
2015-12-09 15:23:17 -08:00
Philip Lundrigan
3938b9f3f6 If decimal_places is 0, cast to int after rounding 2015-12-09 15:16:42 -07:00
Fabian Affolter
48593c6a68 Add docstrings 2015-12-09 08:24:12 +01:00
MartinHjelmare
1e52d5c7f2 Add S_TYPES to platform type and fix persistence
* Add S_TYPES to platform type.
* Fix persistence update on startup.
* Clean up code.
2015-12-09 04:43:18 +01:00
Philip Lundrigan
d84bea3621 Allow decimal place to be used without corr factor 2015-12-08 16:15:19 -07:00
Paulus Schoutsen
9e41c495fc Update SW: Fix caching bug 2015-12-08 09:10:06 -08:00
Paulus Schoutsen
c423a51315 Merge pull request #712 from fabaff/forecast
Return numerical value
2015-12-08 07:55:21 -08:00
Fabian Affolter
9f396b44f7 Return numerical value 2015-12-08 10:10:32 +01:00
Paulus Schoutsen
ee339cfb20 Merge pull request #711 from balloob/service-worker
Initial service worker support
2015-12-07 23:50:12 -08:00
Paulus Schoutsen
fe485cc27d Initial service worker support 2015-12-07 23:43:28 -08:00
Paulus Schoutsen
e1990e07c7 Conditionally load webcomponents polyfill 2015-12-07 20:12:07 -08:00
MartinHjelmare
9463c84603 Clean up 2015-12-08 02:47:15 +01:00
MartinHjelmare
7cc707f1ce Fix docstrings to conform to pep 2015-12-08 01:03:07 +01:00
Fabian Affolter
0d4f681a4e Fix initialization error and update var name 2015-12-07 14:28:24 +01:00
Fabian Affolter
e60dce9712 Update docstrings (influx -> influxdb) 2015-12-07 07:33:07 +01:00
Paulus Schoutsen
aff82da611 Version bump to 0.10.0.dev0 2015-12-06 21:19:20 -08:00
Paulus Schoutsen
2c157e6885 Merge pull request #706 from balloob/dev
0.9.1
2015-12-06 21:18:57 -08:00
Paulus Schoutsen
aaca0a64cb Version bump to 0.9.1 2015-12-06 21:16:23 -08:00
Paulus Schoutsen
48c3bbd5ac Update version frontend 2015-12-06 21:11:17 -08:00
Paulus Schoutsen
39e3a3c463 Bugfix: Allow accessing API via api_password in url 2015-12-06 21:09:49 -08:00
Paulus Schoutsen
fd9da7f9de Merge pull request #705 from balloob/ssl-for-ha
SSL support for ha
2015-12-06 21:05:25 -08:00
Paulus Schoutsen
98467d0d9f Correct HTTP start log message 2015-12-06 15:13:41 -08:00
Paulus Schoutsen
832674286b Update the http log message with correct url 2015-12-06 14:42:08 -08:00
Paulus Schoutsen
9d8e077acc Add support for keys to HTTP component 2015-12-06 14:19:25 -08:00
Paulus Schoutsen
b33e9fe6d9 Update API object to support SSL 2015-12-06 14:13:35 -08:00
Paulus Schoutsen
f4238ca242 Add SSL support to HA 2015-12-06 14:05:58 -08:00
Paulus Schoutsen
301194034e Rename influx to influxdb 2015-12-06 13:11:37 -08:00
Paulus Schoutsen
b8de2c5ebf Version bump to 0.10.0.dev0 2015-12-06 11:45:23 -08:00
Paulus Schoutsen
527d30ae4a Merge pull request #680 from balloob/dev
Version 0.9.0
2015-12-06 11:45:08 -08:00
Paulus Schoutsen
535a3c399e Version bump to 0.9.0 2015-12-06 11:44:38 -08:00
Paulus Schoutsen
e0c4c8d7dd Remove unused constant in HTTP 2015-12-06 11:41:43 -08:00
Paulus Schoutsen
d9b8ab8851 Update frontend 2015-12-06 11:34:53 -08:00
Paulus Schoutsen
b2ae365558 Scripts call services in blocking manner 2015-12-06 11:03:31 -08:00
Paulus Schoutsen
1cb4d40bbb Update frontend 2015-12-06 10:00:10 -08:00
Paulus Schoutsen
b7712ac682 Clean up influx component 2015-12-06 09:45:58 -08:00
Paulus Schoutsen
a833e8b413 Update requirements_all.txt 2015-12-06 09:38:49 -08:00
Paulus Schoutsen
e112620b2d Merge pull request #648 from fabaff/influx
Influx component
2015-12-06 09:38:13 -08:00
Paulus Schoutsen
934b097bc7 Rename date_util to dt_util
Follows the rest of Home Assistant
2015-12-06 09:12:36 -08:00
Paulus Schoutsen
f8668075d0 Fix State.copy() 2015-12-06 09:12:36 -08:00
Paulus Schoutsen
03962ab6ae Fix demo component messing up the config
Could cause HTTP to be initialised in production mode.
2015-12-06 09:12:35 -08:00
Paulus Schoutsen
facbbabe58 Merge pull request #700 from nkgilley/ecobee
point ecobee to latest api
2015-12-06 08:58:57 -08:00
MartinHjelmare
59524c7933 Add multiple gateways
* Add support for multiple serial gateways.
* Fix serialization of python objects by adding dict representation of
    classes.
* Add support for showing more than one child value type per entity.
    The entity state is always only one value type. This is defined by
    the platform value types. Value types that are not defined as the
    platform value type are shown as state_attributes.
* Add more unit of measurement types.
* Clean up code.
2015-12-06 00:29:03 +01:00
MartinHjelmare
1d141566bd Merge 'dev' into mysensors-component-switch 2015-12-05 23:55:36 +01:00
Paulus Schoutsen
c4fe480b7b HTTP will not fail if no config 2015-12-05 13:44:50 -08:00
Paulus Schoutsen
705e3e4fbb Update material design icons 2015-12-05 13:20:00 -08:00
Paulus Schoutsen
eefa62748b Update frontend 2015-12-05 01:12:58 -08:00
Paulus Schoutsen
be14499bca Add rollershutter demo 2015-12-05 01:12:38 -08:00
nkgilley@gmail.com
f582137fe3 point ecobee to latest api which has been cleaned up a bit. 2015-12-04 14:17:12 -05:00
Daren Lord
254889e3fd Fixing logging for pylint 2015-12-04 09:23:05 -07:00
Daren Lord
9ecc08c0c8 Adding in pyicloud to requirements_all.txt 2015-12-04 09:19:16 -07:00
Daren Lord
e3d4e3ad4d Increasing scan interval. Moved imports. 2015-12-04 09:08:46 -07:00
Daren Lord
b6342ed848 Merge branch 'dev' of https://github.com/balloob/home-assistant into findiphone 2015-12-04 09:05:23 -07:00
Fabian Affolter
0383dddae7 Remove dependency 2015-12-04 16:25:34 +01:00
Daniel Hoyer Iversen
ac41f3028c Refactor yr sensor 2015-12-04 15:10:26 +01:00
Daniel Hoyer Iversen
750ca79ac0 Refactor yr sensor 2015-12-04 15:05:23 +01:00
Paulus Schoutsen
d0ae22428d Merge pull request #695 from nkgilley/ecobee
Improve ecobee support for multiple thermostats
2015-12-03 13:25:08 -08:00
nkgilley@gmail.com
107994f3ac implement logic improvement suggestion by @balloob 2015-12-03 08:57:28 -05:00
Paulus Schoutsen
853aa2ac42 Merge pull request #692 from sfam/dev
Rename motor component back to rollershutter
2015-12-03 01:19:03 -08:00
nkgilley@gmail.com
7985468aba remove the use of unnecessary dictionary. 2015-12-02 17:42:53 -05:00
nkgilley@gmail.com
502184812d fix flake8 warnings 2015-12-02 16:37:16 -05:00
nkgilley@gmail.com
02a8ce71d0 fix req_all 2015-12-02 16:32:28 -05:00
nkgilley@gmail.com
08de7d954a improve support for multiple thermostats. 2015-12-02 16:22:25 -05:00
Daniel Hoyer Iversen
71bf707bcf fix tests in yr sensor 2015-12-02 13:32:52 +01:00
sfam
9d8865ad4d adjust rollershutter after rename 2015-12-02 12:18:49 +00:00
sfam
c3f0d618be change constant names for rollershutter services 2015-12-02 12:16:13 +00:00
sfam
21ee621aec rename motor component back to rollershutter 2015-12-02 12:15:00 +00:00
Daniel Hoyer Iversen
31f1e1d7a4 added comment for yr sensor 2015-12-02 13:04:23 +01:00
Paulus Schoutsen
dd0424435a Merge branch 'heatcontroll_config' into dev 2015-12-01 23:34:30 -08:00
Paulus Schoutsen
0555294afe Remove Hue transition time limit 2015-12-01 23:33:55 -08:00
Paulus Schoutsen
28bbf39155 Fix ISY994 hidden property 2015-12-01 23:33:55 -08:00
Jeff Schroeder
587ef04560 Merge pull request #686 from balloob/sonos-fix
Have Sonos work nicer with discovery
2015-12-01 22:44:58 -06:00
Paulus Schoutsen
38f28fe24b Merge pull request #691 from watchforstock/dev
Adding Honeywell Evohome support
2015-12-01 20:08:51 -08:00
Andrew Stock
1ce81ee6db Fixing exception 2015-12-01 21:30:44 +00:00
Andrew Stock
228142e497 Adding Honeywell Evohome support 2015-12-01 21:23:28 +00:00
Daniel Høyer Iversen
361ab0f92b Update yr.py 2015-12-01 20:19:59 +01:00
Daniel Høyer Iversen
e68a8f9c0f Update yr.py 2015-12-01 20:16:04 +01:00
Daniel Høyer Iversen
15770ff90f Update yr.py 2015-12-01 20:12:07 +01:00
Daniel Hoyer Iversen
618ebfe43c try to fix requirements for yr sensor 2015-12-01 13:40:26 +01:00
Daniel Hoyer Iversen
ff15fea9f8 Added units to sensor yr 2015-12-01 13:31:55 +01:00
Daniel Hoyer Iversen
2872c89f0c Fix in yr sensor 2015-12-01 13:24:32 +01:00
Daniel Hoyer Iversen
2dc9bc98f7 Tests for yr sensor 2015-12-01 13:24:03 +01:00
Daniel Hoyer Iversen
72d7e6e9dd Added requirements to yr sensor 2015-12-01 12:57:08 +01:00
Daniel Hoyer Iversen
f912daf4b2 Updated yr sensor 2015-12-01 12:46:08 +01:00
Daniel Hoyer Iversen
9bd11205fb Merge branch 'heatcontroll_config' of https://github.com/balloob/home-assistant into heatcontroll_config 2015-12-01 11:09:47 +01:00
Daniel Hoyer Iversen
0025e67b05 Added test to heat control 2015-12-01 11:09:22 +01:00
Paulus Schoutsen
5e2641e288 Merge pull request #689 from happyleavesaoc/limitlessled_off_transition_fix
LimitlessLED off->off transition fix
2015-11-30 22:48:24 -08:00
happyleaves
f173f8b88b fix #688 2015-11-30 18:47:04 -05:00
Daniel Hoyer Iversen
d9fc2a8bf6 initial version of yr.no weather component 2015-11-30 17:00:28 +01:00
Daniel Høyer Iversen
d6cac08be6 Update heat_control.py 2015-11-30 11:46:14 +01:00
Daniel Hoyer Iversen
2e89f0a8c7 style fix in heat control 2015-11-30 11:45:09 +01:00
Daniel Høyer Iversen
758c0aae24 Update heat_control.py 2015-11-30 10:32:32 +01:00
Daniel Høyer Iversen
8fee38f2cd style fix in heat control 2015-11-30 10:05:05 +01:00
Paulus Schoutsen
41ab635dcd Have Sonos work nicer with discovery 2015-11-30 00:55:36 -08:00
Paulus Schoutsen
48a424e86f Frontend upgrade 2015-11-30 00:48:58 -08:00
Paulus Schoutsen
6113988ccd Merge pull request #685 from balloob/python-3.5-travis
Update Travis to test on Python 3.5 too
2015-11-30 00:30:44 -08:00
Daniel Høyer Iversen
2732b20305 style fix in heatcontrol 2015-11-30 09:22:04 +01:00
Daniel Høyer Iversen
ac59847120 Update heat_control.py 2015-11-30 09:14:32 +01:00
Paulus Schoutsen
b53993e8c0 Update Travis to test on Python 3.5 too 2015-11-30 00:09:58 -08:00
Paulus Schoutsen
90eab17ea6 Fix MQTT light bugs 2015-11-29 23:23:27 -08:00
Paulus Schoutsen
5b4f607da1 Upgrade frontend with lock support 2015-11-29 22:49:54 -08:00
Paulus Schoutsen
72ebb22eba Update demo entities 2015-11-29 17:59:59 -08:00
Paulus Schoutsen
dc2f3861c9 Merge remote-tracking branch 'fabaff/alarm-demo' into dev 2015-11-29 17:35:19 -08:00
Paulus Schoutsen
6a25af4a9f Merge pull request #671 from happyleavesaoc/limitlessled
limitlessled improvements
2015-11-29 16:26:22 -08:00
happyleaves
6e0c30d9f7 warn -> warning 2015-11-29 18:29:37 -05:00
happyleaves
022d6af6fc Merge branch 'limitlessled' of https://github.com/happyleavesaoc/home-assistant into limitlessled 2015-11-29 17:52:42 -05:00
happyleaves
32003daf3f refactor legacy; move imports 2015-11-29 17:15:06 -05:00
happyleaves
5fba67f6c3 limitlessled improvements 2015-11-29 17:15:06 -05:00
Paulus Schoutsen
a3981be501 Merge pull request #681 from pavoni/add_solar_elevation
Add automations based on Solar Elevation
2015-11-29 14:14:26 -08:00
Paulus Schoutsen
343b5bd2b8 Merge pull request #682 from happyleavesaoc/s20-update
Orvibo updates
2015-11-29 14:13:31 -08:00
Paulus Schoutsen
35f1810c74 Merge pull request #683 from balloob/pylint-15-fixes
PyLint 1.5 fixes
2015-11-29 14:11:35 -08:00
Paulus Schoutsen
7ba9fb90f1 More PyLint fixes 2015-11-29 14:04:44 -08:00
Paulus Schoutsen
5023772b3e Fix gen_requirements_all.py and add updated requirements_all.txt 2015-11-29 13:58:14 -08:00
Paulus Schoutsen
ee805ec145 Merge remote-tracking branch 'fabaff/gen-requirements' into pylint-15-fixes 2015-11-29 13:49:19 -08:00
Paulus Schoutsen
a301d869d7 PyLint 1.5 fixes 2015-11-29 13:49:05 -08:00
pavoni
cb0eb2df7d Add tests 2015-11-29 21:37:08 +00:00
happyleaves
18ca7b4f9e bump requirement version; support multiple switches per platform 2015-11-29 15:52:16 -05:00
pavoni
aff1c27372 Remove unused and potentially confusing property 2015-11-29 20:45:03 +00:00
Paulus Schoutsen
01203c7c4c Add updater tests 2015-11-29 12:13:06 -08:00
Paulus Schoutsen
8841eef2b7 Add tests for lock component 2015-11-29 11:44:27 -08:00
happyleaves
52b39efc51 Merge branch 'dev' of https://github.com/balloob/home-assistant into limitlessled 2015-11-29 12:44:44 -05:00
Fabian Affolter
7d503e3f8b Update docstrings 2015-11-29 15:52:44 +01:00
pavoni
73e3ce5044 Fix bug 2015-11-29 12:18:54 +00:00
pavoni
f4c3fbe8fd Add attribuet config to numeric state platform to allow trigger based in attributes rather than states. 2015-11-29 11:56:47 +00:00
pavoni
41a0f2c198 Add elevation attribute 2015-11-29 10:47:20 +00:00
Paulus Schoutsen
0016ff6acc Merge pull request #678 from balloob/mqtt-light
Fixes for MQTT light with RGB colors
2015-11-28 23:22:57 -08:00
Paulus Schoutsen
45bd371cbf Merge pull request #679 from balloob/bugfixes
Bugfixes
2015-11-28 23:22:33 -08:00
Paulus Schoutsen
70698f7ab0 Update demo camera images 2015-11-28 23:16:20 -08:00
Paulus Schoutsen
286299c4c9 update frontend 2015-11-28 22:19:34 -08:00
Paulus Schoutsen
f76edf0ed9 Tweak manifest and frontend index 2015-11-28 22:15:11 -08:00
Paulus Schoutsen
733de6b357 Streaming API will keep session alive 2015-11-28 22:14:40 -08:00
Paulus Schoutsen
e67732b4f8 Remove no longer needed image 2015-11-28 19:12:42 -08:00
Paulus Schoutsen
546377e80a Throttle camera stream to 2fps 2015-11-28 18:59:59 -08:00
Paulus Schoutsen
0df39b4df5 Remove no password set boolean 2015-11-28 18:32:15 -08:00
Paulus Schoutsen
64ebe8c6d0 Update frontend splash screen 2015-11-28 18:20:17 -08:00
Paulus Schoutsen
78cfed1fb0 Clean up HTTP sessions and allow log out 2015-11-28 17:18:35 -08:00
Paulus Schoutsen
99aa4307ef Add locks to entity component 2015-11-28 15:55:01 -08:00
Paulus Schoutsen
ef394b8af7 Pushbullet tweaks 2015-11-28 15:41:30 -08:00
Daniel Høyer Iversen
aebab47fff Update tellstick.py 2015-11-28 23:30:12 +01:00
Daniel Høyer Iversen
f2d553bfd1 Update tellstick.py 2015-11-28 23:28:17 +01:00
Paulus Schoutsen
e84ef2d2d7 API to fetch Error log is no longer cached. 2015-11-28 14:08:01 -08:00
Paulus Schoutsen
957b09707d Fixes for MQTT light with RGB colors 2015-11-28 12:46:35 -08:00
Paulus Schoutsen
9ecfc41e09 Merge pull request #677 from theseal/legacy_nmap
Support for legacy nmap.
2015-11-28 11:47:48 -08:00
Paulus Schoutsen
194e7f8811 Merge pull request #676 from balloob/tellstick_light
Added signal repetitions to tellstick light
2015-11-28 11:43:55 -08:00
Johan Carlquist
6a021c9ef6 Support for legacy nmap.
Older nmap like the one bundled with Ubuntu Precise (12.04), 5.21
requires that you specify what unit the value to --host-timeout is.
2015-11-28 20:43:27 +01:00
Daniel Hoyer Iversen
b6d7cacc61 Added signal repetitions to tellstick light 2015-11-28 20:39:48 +01:00
happyleaves
e6fdcc94e6 refactor legacy; move imports 2015-11-28 12:21:00 -05:00
Paulus Schoutsen
05978ad88d Update discovery component to netdisco 0.5.2 2015-11-28 01:36:42 -08:00
Paulus Schoutsen
1146d6e58d Allow thermostat temperatures with decimal numbers 2015-11-28 01:18:02 -08:00
Paulus Schoutsen
6809a881fa Tweak MQTT Motor component 2015-11-28 01:02:35 -08:00
Paulus Schoutsen
9f01d7abca Merge branch 'pr/655' into dev 2015-11-28 00:55:22 -08:00
Paulus Schoutsen
bbfeba0fe4 Merge branch 'pr/635' into dev
Conflicts:
	requirements_all.txt
2015-11-28 00:50:18 -08:00
Paulus Schoutsen
ad3f96fa25 Merge pull request #672 from balloob/some-cleanup
Make component dependencies optional
2015-11-27 15:08:22 -08:00
happyleaves
d91fe792c5 limitlessled improvements 2015-11-27 16:27:52 -05:00
Paulus Schoutsen
93c86ca5a1 Merge pull request #670 from pavoni/bump_pywemo
Bump pywemo version
2015-11-27 13:08:12 -08:00
pavoni
bbf73e0bae Bump pywemo version - fixed scan device = None bug 2015-11-27 19:05:15 +00:00
Paulus Schoutsen
47eb4e76cf Merge pull request #669 from pavoni/handle-efergy_value_error
Trap and trace error rather than throwing exception when efergy server
2015-11-27 10:27:45 -08:00
Paulus Schoutsen
ada612e09d Merge pull request #668 from pavoni/handle_vera_timeout
Add exception handler for vera timeout
2015-11-27 10:23:19 -08:00
pavoni
00f0dfb971 Trap and trace error rather than throwing exception when efergy server 2015-11-27 18:21:26 +00:00
pavoni
7204bc018f Add exception handler for vera timeout 2015-11-27 11:43:43 +00:00
Fabian Affolter
7224775aa8 Use manual alarm control panel as base for demo 2015-11-27 00:40:51 +01:00
Fabian Affolter
60460e8217 Add alarm control panel as platform and remove camera/acp entries 2015-11-27 00:18:11 +01:00
Fabian Affolter
67bcb00c9e Add demo platform for alarm control panel 2015-11-27 00:18:11 +01:00
Fabian Affolter
74b37bd61b Change to exception instead of error 2015-11-26 23:57:57 +01:00
Fabian Affolter
08da1e6f8d Add influx component 2015-11-26 23:57:34 +01:00
Paulus Schoutsen
fabd0ced3f Make DEPENDENCIES optional for components 2015-11-26 13:11:59 -08:00
Paulus Schoutsen
2861bbb02c Warn if config invalid shape for script 2015-11-26 13:08:13 -08:00
Paulus Schoutsen
4c3d6981a6 Merge pull request #661 from bachp/mqtt-retain
Allow setting the retain flag for mqtt switch.
2015-11-26 12:19:52 -08:00
Pascal Bach
341c3a8fcd Fix tests for mqtt publish with retain. 2015-11-26 21:03:21 +01:00
Pascal Bach
69e9d39690 Allow setting the retain flag for mqtt switch.
Some devices can read the initial value on startup.
If the retain flag is set they always receive the value as last set by
home assistant.
2015-11-26 21:03:21 +01:00
Paulus Schoutsen
65f3e7ccf4 Merge pull request #652 from bachp/arest-function
Function support for aREST backend
2015-11-26 11:55:24 -08:00
Pascal Bach
067011af15 function support for aREST backend
The implementation sends /<name>?params=1 for turn_on and /<name>?params=0 for turn_off
It uses the return value of the function to determine the current state.
0=Off, 1=On
2015-11-26 20:45:07 +01:00
Paulus Schoutsen
271c2f6537 Merge pull request #664 from fabaff/mystrom-switch
myStrom switch
2015-11-26 09:43:55 -08:00
Fabian Affolter
f2f598bd26 Use host as config var instead of resource 2015-11-26 16:37:00 +01:00
sfam
4f75286f64 fix some comments 2015-11-26 09:38:25 +00:00
Paulus Schoutsen
c4d4dcccb7 Merge pull request #665 from badele/rfxtrx_event
Add should_fire_event in rfxtrx component
2015-11-25 23:40:39 -08:00
badele
128e3bb762 Move import module 2015-11-26 08:27:31 +01:00
badele
a33220db7f Fix pylint style 2015-11-26 08:12:04 +01:00
badele
4bd0db30c9 Add should_fire_event in rfxtrx component 2015-11-26 07:52:37 +01:00
Fabian Affolter
e60ab8f4c2 Add possibility to write data to file 2015-11-25 23:31:04 +01:00
Fabian Affolter
38b564e413 Remove class, just use state_changed, and update the export data 2015-11-25 22:49:32 +01:00
Fabian Affolter
76ac913fc0 Add influx component 2015-11-25 22:49:32 +01:00
sfam
0dbf4b3c10 add const.py changes to commit 2015-11-25 18:20:16 +00:00
sfam
08ba71a359 rename component to motor and services to open/close/stop 2015-11-25 18:13:39 +00:00
Fabian Affolter
1bebb17e9f Not need to raise exception 2015-11-25 18:14:19 +01:00
Fabian Affolter
e45ef0013b Catch connection timeout 2015-11-25 18:07:29 +01:00
Fabian Affolter
9dfa4ea233 Add mystrom switch 2015-11-25 17:21:31 +01:00
Fabian Affolter
a8ddae9343 Add myStrom switch platform 2015-11-25 17:21:11 +01:00
Fabian Affolter
3e60c4801c Update docstrings 2015-11-25 08:56:50 +01:00
Fabian Affolter
bc106bcb10 Move configuration details to docs 2015-11-25 08:48:27 +01:00
Paulus Schoutsen
6f3cebdacf Merge pull request #657 from goir/thermostat_homematic
Added support for Homematic thermostat
2015-11-24 21:38:23 -08:00
Goir
b0fa80ad4c Added support for Homematic thermostat 2015-11-24 21:23:12 +01:00
nkgilley@gmail.com
067b5862c0 bug fixes 2015-11-24 09:29:33 -05:00
sfam
351430c1b3 move current_position to RollershutterDevice class 2015-11-24 10:41:39 +00:00
sfam
e001ea913a add __init__.py to test folder 2015-11-24 08:03:02 +00:00
Paulus Schoutsen
901b9075dc Merge pull request #658 from bachp/arest-logargs
Fix order of log arguments for arest switch
2015-11-23 20:53:39 -08:00
Paulus Schoutsen
d141306493 Update Dockerfile to depend on Python 3.4 instead of latest 2015-11-23 20:42:32 -08:00
Paulus Schoutsen
6c12580b69 Merge pull request #659 from allanglen/improve-dockerfile
Re-order Dockerfile for faster rebuild on code changes
2015-11-23 20:42:08 -08:00
Pascal Bach
0d3a099926 arest: fix order argument order of log messages 2015-11-23 21:46:47 +01:00
Allan Glen
09a82dedf0 Re-order Dockerfile for faster rebuild on code changes 2015-11-23 11:58:59 -07:00
nkgilley@gmail.com
80e829f53a was getting errors for NETWORK being None. looked like it was being loaded too early, so this will wait until it's ready 2015-11-23 11:52:02 -05:00
nkgilley@gmail.com
27bc4c582b update network data before sensor setup. 2015-11-23 11:40:54 -05:00
nkgilley@gmail.com
cc196d9888 fixed sensors and thermostat. discovery working for both now. 2015-11-23 11:15:19 -05:00
sfam
68ff9dd74f rollershutter component - fix const 2015-11-23 00:35:22 +00:00
sfam
d4b3af327d Initial commit for rollershutter component 2015-11-23 00:25:10 +00:00
sfam
8269e843f2 Initial commit for rollershutter component 2015-11-23 00:22:43 +00:00
Paulus Schoutsen
7acb3dffe4 Merge pull request #653 from balloob/mqtt-disconnect
Reconnect when disconnected from MQTT
2015-11-22 16:08:30 -08:00
Paulus Schoutsen
1bda0bd73b Add some MQTT tests 2015-11-22 16:04:16 -08:00
Paulus Schoutsen
f170799182 Reconnect when disconnected from MQTT 2015-11-22 15:19:51 -08:00
Paulus Schoutsen
d4f0f0ffd3 Update automation url in warning 2015-11-22 15:10:24 -08:00
Paulus Schoutsen
7f1254d750 Merge pull request #647 from mcdeck/dev
Support for json messages in mqtt switches and sensors
2015-11-22 11:22:56 -08:00
Oliver van Porten
100400f149 move requirements to single line to not to affect coverage 2015-11-22 16:28:21 +01:00
Oliver van Porten
90681c2dc9 fix incorrect requirements 2015-11-22 16:19:08 +01:00
Oliver van Porten
dbcd055cfe move import of jsonpath-rw to c'tor of _JsonFmtParser 2015-11-22 16:18:05 +01:00
Paulus Schoutsen
d6feb82f9b Merge branch 'pr/634' into dev
Conflicts:
	requirements_all.txt
2015-11-21 23:22:47 -08:00
Paulus Schoutsen
fc0e76764d Merge pull request #645 from fabaff/arest-binary-sensor
aREST binary sensor
2015-11-21 22:38:48 -08:00
Paulus Schoutsen
64c9619d75 Merge pull request #646 from fabaff/mqtt-binary-sensor
MQTT binary sensor
2015-11-21 22:31:17 -08:00
Daren Lord
8074854731 Fixing formatting 2015-11-21 21:12:41 -07:00
Daren Lord
fff6b24449 Switching to new device scanner setup. 2015-11-21 21:04:28 -07:00
Daren Lord
396a65ab03 Merge branch 'dev' of https://github.com/balloob/home-assistant into findiphone 2015-11-21 15:26:44 -07:00
Paulus Schoutsen
ee73bc9ad4 Merge pull request #642 from bburan/bburan/openzwave-config-fix
Fix issue with finding location of OpenZWave conf
2015-11-21 12:10:20 -08:00
nkgilley@gmail.com
8dc0de1d05 move EcobeeData class and Throttle to the main ecobee component, this way the sensor and thermostat will use the same throttled updating object. 2015-11-21 12:24:06 -05:00
Oliver van Porten
715abf241e Disable pylint warning for callable classes 2015-11-21 17:57:15 +01:00
miniconfig
f37d0d1c20 Updated wink library version in requirements_all.txt 2015-11-21 09:52:43 -05:00
Brad Buran
0621260435 Fix issue with finding location of OpenZWave conf
Under some install scenarios, it may be possible that OpenZWave can't
automatically discover the location of the vendor-specific XML config
files. In this event, we need to specify the location in the Home
Assistant configuration.yaml file.
2015-11-20 19:47:29 -08:00
Oliver van Porten
427944cc44 add test for mqtt+json switch 2015-11-20 23:50:46 +01:00
Fabian Affolter
422a93e735 Add tests for MQTT binary sensor 2015-11-20 23:48:59 +01:00
Fabian Affolter
b4ee3f73b4 Add aREST binary sensor and fix ordering 2015-11-20 23:47:49 +01:00
nkgilley@gmail.com
44abc31057 work in progress: configurator is now in it's own component. configurator seems to work but the thermostat is now broken. 2015-11-20 17:47:25 -05:00
Oliver van Porten
820b2a31b3 Add additional unit tests for mqtt state format parsing 2015-11-20 23:47:21 +01:00
Fabian Affolter
08d29d3630 Add MQTT binary sensor 2015-11-20 23:43:59 +01:00
Oliver van Porten
44714614ad Fix unit tests for mqtt 2015-11-20 23:42:22 +01:00
Fabian Affolter
065f4b7c20 Add binary sensor for aREST 2015-11-20 23:39:39 +01:00
Oliver van Porten
030686a978 fix flak8 warnings 2015-11-20 22:55:52 +01:00
Oliver van Porten
799043dc0a refactor format mqtt format parser 2015-11-20 22:45:09 +01:00
miniconfig
105dc2847e Changed locked method of lock support to "is_locked".
Added lock and unlock methods
Updated wink components to use the new version of the wink library.
2015-11-20 16:34:27 -05:00
Oliver van Porten
b4cf0e874a Support parsing mqtt messages via jsonpath 2015-11-20 22:03:17 +01:00
Paulus Schoutsen
3df6c584c0 Update frontend 2015-11-20 08:38:56 -08:00
Paulus Schoutsen
3493db1052 Merge pull request #608 from fabaff/contact
Binary sensor component
2015-11-20 08:37:10 -08:00
Fabian Affolter
d254e7e9e5 Fix pylint issue 2015-11-20 15:29:36 +01:00
Fabian Affolter
52344d65bc Merge branch 'contact' of github.com:fabaff/home-assistant into contact 2015-11-20 15:02:17 +01:00
Fabian Affolter
a6006b1835 Move state 2015-11-20 14:59:21 +01:00
Fabian Affolter
b9730e6914 Binary sensor component 2015-11-20 14:59:21 +01:00
Paulus Schoutsen
037bca041e Merge pull request #641 from balloob/pushbullet_email
Notify/pushbullet - adjustment in supported targets
2015-11-19 22:46:41 -08:00
Tom Duijf
77a1a1529c Added support for email, removed 'device/' hack to send to all own devices, as own email address does the same 2015-11-19 22:14:41 +00:00
miniconfig
fa7391cdf6 Changed do_lock and do_unlock methods to lock and unlock.
Implemented state method.
Fixed locked method for demo interface.
Changed LockDevice to extend Entity instead of ToggleEntity
2015-11-19 16:54:55 -05:00
Paulus Schoutsen
d25f58e650 Merge pull request #631 from balloob/gen-requirements_all
Allow generating requirements_all.txt
2015-11-19 12:49:23 -08:00
Paulus Schoutsen
6d315a1a7c Merge pull request #636 from fabaff/camera-demo
Camera demo
2015-11-19 12:11:12 -08:00
Fabian Affolter
685964785d Add camera to demos 2015-11-19 19:35:51 +01:00
Fabian Affolter
ca32c81612 Camera demo 2015-11-19 19:27:28 +01:00
Fabian Affolter
5f89db5957 Binary sensor component 2015-11-19 19:00:22 +01:00
Fabian Affolter
4eacea32da Fix pylint issue 2015-11-19 18:07:54 +01:00
nkgilley@gmail.com
d05af62680 use Throttle like the BitCoin component. 2015-11-18 14:57:27 -05:00
Fabian Affolter
f1fed78992 Fix issue with older glances releases #637 (thanks @jdotbdot) 2015-11-18 19:19:27 +01:00
nkgilley@gmail.com
8df32aac3c point to updated python-ecobee library 2015-11-18 10:43:52 -05:00
nkgilley@gmail.com
18d0f4461f add config png to images dir. 2015-11-18 10:16:16 -05:00
nkgilley@gmail.com
c6d1a4bdaf Fix configurator, rename repo, cleanup code. 2015-11-18 10:13:46 -05:00
Fabian Affolter
ab9e173179 Update docstrings 2015-11-18 08:42:49 +01:00
Nolan Gilley
22fcbc67cf fix req 2015-11-17 19:20:56 -05:00
Nolan Gilley
e317e0798b initial commit for ecobee thermostat component. 2015-11-17 19:14:29 -05:00
miniconfig
c78899c4f3 Added support for Locks, including those connected through a wink hub. 2015-11-17 10:17:57 -05:00
Paulus Schoutsen
bca65b620a Update Vera sensor dependency 2015-11-17 00:34:14 -08:00
Paulus Schoutsen
e92fe149fe Comment out requirements that break on certain platforms 2015-11-17 00:30:13 -08:00
Paulus Schoutsen
377d2c6e5a Allow generating requirements_all.txt 2015-11-17 00:21:49 -08:00
Paulus Schoutsen
8be53af78f Convert README to RST format 2015-11-16 22:02:35 -08:00
Paulus Schoutsen
573dfb648f Version bump to 0.9.0.dev0 2015-11-16 00:03:37 -08:00
Paulus Schoutsen
8e44ed0090 Merge pull request #617 from balloob/dev
0.8.0.rc1
2015-11-16 00:03:20 -08:00
Paulus Schoutsen
5fb6076f6e Version bump to 0.8.0 2015-11-16 00:03:00 -08:00
Fabian Affolter
4ea6def1bd Update docstrings and link to docs 2015-11-16 07:53:31 +01:00
Paulus Schoutsen
314185ffb8 Merge pull request #629 from rmkraus/dev
Adding updater to default list of components
2015-11-15 17:30:15 -08:00
Ryan Kraus
8aafb89a64 Merge remote-tracking branch 'balloob/dev' into dev 2015-11-15 20:04:21 -05:00
Ryan Kraus
d01ed9788f Added updater to set of default components 2015-11-15 20:03:45 -05:00
Paulus Schoutsen
b4e2f4f0be Merge pull request #625 from balloob/enhancement_pushbullet
Enhancement: targeted notifications in pushbullet
2015-11-15 16:41:18 -08:00
Tom Duijf
f4d8325084 Pushbullet; code cleanup & better errors on config typos 2015-11-16 00:29:04 +00:00
Tom Duijf
cc5dec3c59 Processed feedback from PR comments 2015-11-15 23:46:16 +00:00
Ryan Kraus
ec5a93a0fd Merge remote-tracking branch 'balloob/dev' into dev 2015-11-15 18:16:49 -05:00
Paulus Schoutsen
aabda1b7b0 Merge pull request #628 from rmkraus/dev
Small tweaks to daemon management.
2015-11-15 14:46:58 -08:00
Tom Duijf
aee4411cfb <type>.<name> split only on first separator 2015-11-15 22:44:51 +00:00
Ryan Kraus
135eb0a0ac Fixed hass daemon management
1) Changed signal to exit hass to SIGTERM
2) Updated initd script to send SIGTERM
3) Updated systemd script to never send SIGKILL.
2015-11-15 17:43:38 -05:00
Ryan Kraus
01daac066a Merge remote-tracking branch 'balloob/dev' into dev 2015-11-15 17:37:57 -05:00
Ryan Kraus
5d96ca133d Merge pull request #627 from rmkraus/update_notify
Updater component
2015-11-15 17:36:55 -05:00
Ryan Kraus
3cda1aacff Fixed typo in updater entity attributes.
Left some quotes in there. My bad.
2015-11-15 17:34:06 -05:00
Ryan Kraus
243130c133 Using ATTR_FRIENDLY_NAME in updater component. 2015-11-15 17:32:05 -05:00
Paulus Schoutsen
0d74b628b0 Merge pull request #623 from balloob/lib-clean-on-upgrade
Lib clean on upgrade
2015-11-15 14:30:51 -08:00
Ryan Kraus
c314101dde Updater suggestions from Paulus
1) Moved error checking into get_newest_version function.
2) Fixed import formatting mistake.
2015-11-15 17:30:42 -05:00
Paulus Schoutsen
0f68dc6b7b Add tests for version upgrade 2015-11-15 14:28:50 -08:00
Ryan Kraus
919c20a263 Implemented suggestions from Paulus for updater
1) Better Error handling when making PyPI requests.
2) More efficient event scheduling.
3) ENTITY_ID in constant
3) friendly_name from constant
2015-11-15 17:23:56 -05:00
Ryan Kraus
9b5385c565 Merge remote-tracking branch 'balloob/dev' into update_notify
Conflicts:
	homeassistant/components/frontend/version.py
	homeassistant/components/frontend/www_static/frontend.html
2015-11-15 17:00:35 -05:00
Ryan Kraus
7dacf01baa Updating fronted to latest version. 2015-11-15 16:56:33 -05:00
Tom Duijf
9b4650afd4 Added comments 2015-11-15 20:49:42 +00:00
Tom Duijf
0b0fd2490d Pushbullet; styling, requirements, example 2015-11-15 19:14:10 +00:00
Tom Duijf
3a85bebbf6 pushbullet; styling and minor fixed before PR 2015-11-15 18:57:16 +00:00
Paulus Schoutsen
18f1de10a5 Merge pull request #624 from leoc/feature-zwave-meter-sensor
Add Zwave `meter` command class
2015-11-15 10:16:57 -08:00
Paulus Schoutsen
869d6df65e Merge pull request #618 from nkgilley/camera-fix
add exception handling to generic camera requests function.
2015-11-15 10:02:20 -08:00
Tom Duijf
0a586bd919 Initial commit of pushbullet enhancement 2015-11-15 17:50:36 +00:00
Fabian Affolter
a98b1b0ebc Update link to docs 2015-11-15 18:50:06 +01:00
Paulus Schoutsen
511028612c Merge pull request #593 from leoc/feature-zwave-switches
Implement zwave switches
2015-11-15 09:30:06 -08:00
Paulus Schoutsen
e3efce5ded Merge pull request #622 from happyleavesaoc/s20
s20 switch support
2015-11-15 09:28:40 -08:00
Arthur Andersen
340ee171b5 [Zwave] Add zwave polling interval configuration 2015-11-15 17:50:14 +01:00
Arthur Andersen
773da3f755 [Zwave] Add Meter command class 2015-11-15 17:50:11 +01:00
happyleaves
12bdc39274 don't update state in turn_on/off 2015-11-15 08:59:18 -05:00
Paulus Schoutsen
700b7ba591 Remove unused import in notify 2015-11-15 02:20:35 -08:00
Paulus Schoutsen
295f27d259 Only delete lib dir in config upgrade if exists 2015-11-15 02:16:52 -08:00
Ryan Kraus
4463b69245 Added friendly name to updater component. 2015-11-15 05:15:36 -05:00
Paulus Schoutsen
71e4283a2e Remove lib directory in version upgrade 2015-11-15 02:05:46 -08:00
Paulus Schoutsen
6135b87b1d Log error if unable to install package 2015-11-15 02:05:13 -08:00
Paulus Schoutsen
04bb7ed58f Have Notify platform install platform dependencies 2015-11-15 02:04:57 -08:00
Ryan Kraus
dfa9880176 Created updater component 2015-11-15 05:00:24 -05:00
Paulus Schoutsen
88f3a5a50a Update to new version frontend 2015-11-15 00:51:12 -08:00
Paulus Schoutsen
e2c530b85d Script: new attribute if can cancel 2015-11-14 15:38:07 -08:00
Arthur Andersen
56c5d345a4 [Zwave] Update HA state on value change 2015-11-14 23:14:08 +01:00
happyleaves
86b9ae9566 addressed comments 2015-11-14 16:14:25 -05:00
Nolan Gilley
df264f2ec0 remove unnecessary else 2015-11-14 15:49:39 -05:00
happyleaves
aabcad59d8 rename platform to orvibo 2015-11-14 15:05:22 -05:00
happyleaves
70fef3c5b5 fixed names 2015-11-14 14:25:53 -05:00
happyleaves
57ec58e255 fixed requirements 2015-11-14 14:19:47 -05:00
happyleaves
cf8e23adbc s20 switch support 2015-11-14 14:14:02 -05:00
Paulus Schoutsen
eabf9087f3 Merge pull request #621 from fabaff/cleanup-glances
Glances sensor cleanup
2015-11-14 10:51:57 -08:00
Nolan Gilley
9acb341b96 remove break 2015-11-14 10:51:07 -05:00
Fabian Affolter
5275ca9ce7 Fix typo 2015-11-14 15:25:52 +01:00
Fabian Affolter
646618a25e Improve error messages, use constants, and fix docstrings 2015-11-14 15:23:20 +01:00
Paulus Schoutsen
bc48e4f98e Merge pull request #619 from nkgilley/mqtt-light-color-fix
Remove rgb color if it's not an rgb bulb.
2015-11-14 00:51:18 -08:00
Nolan Gilley
776324807e last PR was dumb. this fix is better. 2015-11-13 14:58:49 -05:00
Nolan Gilley
d68a4b52f1 Remove rgb color if it's not an rgb bulb. 2015-11-13 14:32:47 -05:00
Nolan Gilley
85e0db6ade add exception handling to generic camera requests function. 2015-11-13 13:55:22 -05:00
Fabian Affolter
d993f4014e Add link to docs 2015-11-13 08:29:54 +01:00
Paulus Schoutsen
7ebda9c3c6 Fix MQTT light test 2015-11-12 23:08:26 -08:00
Paulus Schoutsen
16e948d032 Merge branch 'pr/552' into dev 2015-11-12 23:04:05 -08:00
Paulus Schoutsen
41d0f95d9a Move core light test to correct dir 2015-11-12 23:03:56 -08:00
Paulus Schoutsen
bfaaf39e9e Merge pull request #613 from Xorso/squeezebox_fix
Fixing bug when connecting to squeezebox and it is a float
2015-11-12 22:45:03 -08:00
Daren Lord
c60bb35d4a Fixed lint errors 2015-11-12 23:40:30 -07:00
Daren Lord
90007a04d3 Adding iCloud device_tracker component. Allow to track devices registered with iCloud 2015-11-12 23:37:15 -07:00
Paulus Schoutsen
16904452b8 Merge pull request #614 from persandstrom/asuswrt_not_loading
ASUSWRT more logging and more robust
2015-11-12 11:43:49 -08:00
Per Sandström
158d9e27ff more robust and more logging 2015-11-12 20:10:25 +01:00
Fabian Affolter
b652dd47cd Update file header and docstrings 2015-11-12 18:04:48 +01:00
Daren Lord
2812fae721 Fixing bug when connecting to squeezebox and it is a float 2015-11-11 16:21:42 -07:00
Tom Duijf
6da88108fe Merge pull request #612 from balloob/dt_snmp_fix
Fix memory issue in SNMP device tracker
2015-11-11 23:30:43 +01:00
Tom Duijf
5503c12cfd Fixes memory consumption issue 2015-11-11 21:54:33 +00:00
hexxter
329d63ac11 next online unittest test ;) 2015-11-11 20:52:41 +01:00
hexxter
698e30bd2b more self.hass.pool.block_till_done() 2015-11-11 20:40:21 +01:00
hexxter
90063ea7f8 check the default value only checkable local. I removed it. 2015-11-11 12:44:59 +01:00
hexxter
0c52b143ae now saved 2015-11-11 12:38:10 +01:00
hexxter
8f12b997f8 more unittests 2015-11-11 12:32:24 +01:00
Arthur Andersen
877926cfee [Zwave] Fix docstring 2015-11-11 10:24:00 +01:00
Arthur Andersen
19649390d3 [Zwave] Add binary switch component 2015-11-11 10:24:00 +01:00
Paulus Schoutsen
50d19bb1b4 Merge pull request #592 from leoc/feature-zwave-lights
Implement zwave light support
2015-11-11 00:11:51 -08:00
Arthur Andersen
665436cd91 [Zwave] Use threading.Timer for value refresh delay 2015-11-10 19:59:45 +01:00
Paulus Schoutsen
1a3410119e Merge pull request #606 from fabaff/pushetta
Pushetta notification platform
2015-11-10 09:27:16 -08:00
Fabian Affolter
bf2bcb6dcf Use _LOGGER.error instead of _LOGGER.exception 2015-11-10 18:20:10 +01:00
Fabian Affolter
8371b08676 Add pushetta notify platform 2015-11-10 14:17:28 +01:00
Fabian Affolter
e8a0d54fdd Add pushetta 2015-11-10 14:17:28 +01:00
Fabian Affolter
f4a82c6f6b Add pushetta 2015-11-10 14:17:28 +01:00
Paulus Schoutsen
963c4bb70e Update frontend with new card style 2015-11-10 00:56:56 -08:00
Paulus Schoutsen
ec2e0cc77d Compile new version frontend 2015-11-10 00:27:41 -08:00
Paulus Schoutsen
0c0ccb361d Merge branch 'dev-tool-info' into dev 2015-11-10 00:25:33 -08:00
Paulus Schoutsen
994fc32f25 Upgrade frontend with about page 2015-11-10 00:25:19 -08:00
Paulus Schoutsen
d68263d5c4 Another LimitlessLED color fix 2015-11-09 21:55:49 -08:00
Paulus Schoutsen
27b001df2b Add dev info to frontend urls 2015-11-09 21:48:36 -08:00
Paulus Schoutsen
dafc0ced6b Update limitlessled with lists for colors 2015-11-09 16:55:10 -08:00
Paulus Schoutsen
3ec2555c66 Merge pull request #601 from balloob/package-install-global
Check global installed packages
2015-11-09 12:45:51 -08:00
Fabian Affolter
bfa8e58879 Update link to docs (Jekyll 3 update) 2015-11-09 18:33:11 +01:00
Paulus Schoutsen
2d9a785c18 Merge pull request #600 from balloob/cleanup-notify
Clean up notifiy component
2015-11-09 07:32:13 -08:00
Fabian Affolter
97f9f8aa49 Update link to docs (Jekyll 3 update) 2015-11-09 13:12:18 +01:00
Fabian Affolter
64d5ca4da0 Add link to docs and update some docstrings 2015-11-09 08:25:46 +01:00
Paulus Schoutsen
4fb301b7a9 Check global installed packages 2015-11-08 22:55:22 -08:00
Paulus Schoutsen
fda65a4934 Update coveragerc 2015-11-08 22:33:43 -08:00
Paulus Schoutsen
98b4c27211 Style fixes 2015-11-08 22:21:02 -08:00
Paulus Schoutsen
3b3f5fe6fe Clean up notifiy component 2015-11-08 22:15:34 -08:00
Paulus Schoutsen
1c9c5ce1bd Merge pull request #599 from ryanturner/dev
Initial implementation of mjpeg camera
2015-11-08 22:13:49 -08:00
Ryan Turner
a36b315927 Fixed indentations hopefully 2015-11-09 00:11:11 -06:00
Ryan Turner
f3352546c6 More lint fixes 2015-11-09 00:00:31 -06:00
Ryan Turner
3a6aa8f3d1 Fixed line length issues to make lint happy. Still bummed that I decreased test coverage :( 2015-11-08 23:51:01 -06:00
Ryan Turner
dfa81b0117 Changed camera.mjpeg to use Response and Closing; cleaned up a number of code-clarity issues near that 2015-11-08 23:41:21 -06:00
Paulus Schoutsen
3947691347 Style fixes + rename honeywell 2015-11-08 20:56:11 -08:00
Ryan Turner
8541fdb112 Fixed style issue related to failing build 2015-11-08 22:26:27 -06:00
Ryan Turner
e078ab53ca Initial implementation of mjpeg camera 2015-11-08 22:15:06 -06:00
Paulus Schoutsen
0665af7f0f Merge branch 'pr/579' into dev
Conflicts:
	requirements_all.txt
2015-11-08 20:10:30 -08:00
Paulus Schoutsen
6dfb8f5737 Merge pull request #591 from balloob/error-log
Expose API to view error log
2015-11-08 20:06:56 -08:00
Paulus Schoutsen
1be2be0886 Merge pull request #590 from balloob/light-rgb
Light: base color now in RGB instead of XY
2015-11-08 20:06:49 -08:00
Paulus Schoutsen
3a095f53a8 Merge pull request #596 from badele/dev
Minor change for logger component
2015-11-08 19:57:58 -08:00
Paulus Schoutsen
ffce252a12 Merge pull request #598 from SEJeff/update-foscam-snapshot
Make a single request to get the foscam camera image
2015-11-08 19:57:21 -08:00
Paulus Schoutsen
7f4c13c382 Upgrade Wink version to v0.1.1 2015-11-08 19:41:22 -08:00
Jeff Schroeder
0f292e8fa6 Remove unused import for re 2015-11-08 20:37:29 -06:00
badele
e63d0c51e0 Change log severity 2015-11-08 19:02:51 +01:00
badele
ebaecdb9d6 Fix flake & pylint 2015-11-08 11:29:56 +01:00
badele
fd50693ca7 Minor change to documentation for logger component 2015-11-08 11:26:36 +01:00
badele
ebc95aca51 Add log info in the rfxtrx component 2015-11-08 11:15:03 +01:00
Jeff Schroeder
137cadb59c Make a single request to get the foscam camera image
This uses the `snapPicture2` command, which is documented in their
cgi sdk to return raw jpeg data instead of html containing the image
2015-11-07 20:18:46 -06:00
Arthur Andersen
84f81480bb [Zwave] Add light zwave component 2015-11-07 15:58:28 +01:00
Arthur Andersen
5565e418f8 [Zwave] Add type and genre to value filter 2015-11-07 15:57:46 +01:00
Arthur Andersen
5b4fc4f346 [Zwave] Add check for missing discovery_service 2015-11-07 15:57:28 +01:00
Paulus Schoutsen
e4c3d47dbf Expose API to view error log 2015-11-07 01:44:02 -08:00
Paulus Schoutsen
95320f39b3 Light: base color now in RGB instead of XY 2015-11-07 01:25:33 -08:00
Paulus Schoutsen
0c97280479 Merge pull request #587 from badele/logfilter
Add logger filter feature
2015-11-06 21:59:56 -08:00
Paulus Schoutsen
3e339c7304 Update vincenty version in setup.py 2015-11-06 21:58:18 -08:00
badele
6f06f48ac6 Ensure the component is loaded first 2015-11-06 22:57:03 +01:00
badele
aeacbad4a0 Fix pull request from balloob comments 2015-11-06 22:51:33 +01:00
sander
f60f3fa4a2 Removed unused self._sensorid. 2015-11-06 08:37:22 +01:00
MartinHjelmare
45fe37a301 Add mysensors component and switch platform
* Add a general mysensors component. This sets up the serial comm
        with the gateway through pymysensors. The component also
        contains a decorator function for the callback function of
        mysensors platforms. Mysensors platforms should create a
        function that listens for the node update event fired by the
        mysensors component. This function should call another
        function, that uses the decorator, and returns a dict. The dict
        should contain a list of which mysensors V_TYPE values the
        platform handles, the platfrom class and the add_devices
        function (from setup_platform).
    * Change existing mysensors sensor platform to depend on the new
        mysensors component.
    * Add a mysensors switch platform. The switch platform takes
        advantage of new functionality from the the fork of pymysensors
        https://github.com/MartinHjelmare/pymysensors, that enables the
        gateway to send commands to change node child values.
    * Change const and is_metric to global constants, in the mysensors
        component and import const depending on the mysensors version
        used.
    * Change variables devices and gateway to global variables.
    * Add some debug logging at INFO log level.
2015-11-06 01:58:41 +01:00
sander
e49dc94d4b slightly better update method. 2015-11-05 09:58:35 +01:00
sander
26a6438e93 learning the alphabet ;-) 2015-11-05 09:37:05 +01:00
Paulus Schoutsen
cae71a73a1 Update frontend 2015-11-05 00:03:01 -08:00
Paulus Schoutsen
df7f6e1235 Remove alarm sensor from demo platform 2015-11-04 23:53:22 -08:00
badele
a31f7d2816 Fix flake & pylint 2015-11-04 22:08:15 +01:00
badele
c52c982510 Add logger feature 2015-11-04 21:30:02 +01:00
sander
ea06d946e6 modified .converagerc and requirements_all.txt 2015-11-04 21:15:56 +01:00
Paulus Schoutsen
bd798b8c55 Merge pull request #582 from balloob/mdi-icons
Icons for everyone!
2015-11-04 09:08:34 -08:00
Paulus Schoutsen
ac7456b73b Merge pull request #577 from happyleavesaoc/limitlessled_additions
LimitlessLED effects
2015-11-04 09:02:43 -08:00
Fabian Affolter
d69b08ecf5 Update with comments from PR 579 2015-11-03 11:46:03 +01:00
Paulus Schoutsen
be6dd20236 Update frontend with new icons 2015-11-03 00:20:59 -08:00
Paulus Schoutsen
4d069323f4 Add icon support to entity 2015-11-03 00:20:48 -08:00
Paulus Schoutsen
77f4fc8c22 Frontend: Add materialdesignicons 2015-11-03 00:20:20 -08:00
Paulus Schoutsen
72b4212b19 Demo uses device tracker demo platform 2015-11-03 00:19:28 -08:00
Fabian Affolter
5fce381b89 Remove empty point 2015-11-03 08:50:27 +01:00
happyleaves
7b968f6a6b re-fix conditionals 2015-11-02 18:11:58 -05:00
happyleaves
4d958c6d18 style fix 2015-11-02 18:08:17 -05:00
happyleaves
566712023d consolidate conditionals 2015-11-02 18:08:17 -05:00
happyleaves
3cd89f8474 add disco, white effects 2015-11-02 18:08:17 -05:00
Fabian Affolter
218a05356a Add docstrings 2015-11-02 21:00:53 +01:00
hexxter
186f68cce3 not working mqtt light unittest 2015-11-02 20:16:36 +01:00
hexxter
168eb8e5a2 mqtt light test is working more test should be written 2015-11-02 17:02:34 +01:00
Paulus Schoutsen
c6b5a04312 Allow more static files to be fingerprinted 2015-11-02 00:03:53 -08:00
Paulus Schoutsen
728cd8bb5e Upgrade Vincenty to latest version 2015-11-02 00:03:53 -08:00
Stefan Jonasson
d873ab0262 Merge pull request #569 from stefan-jonasson/dev
Fix for Philio Zwave devices which don't send an off event.
2015-11-02 08:15:57 +01:00
Daniel Høyer Iversen
0ff6a460c2 Update rfxtrx.py 2015-11-01 14:20:11 +01:00
Daniel Høyer Iversen
77539a5b89 revert prev commit 2015-11-01 12:51:09 +01:00
Daniel Høyer Iversen
92b05389f2 Update rfxtrx.py 2015-11-01 12:41:21 +01:00
Daniel Høyer Iversen
82aec895a0 Minor bug in rfxtrx 2015-11-01 12:40:41 +01:00
Stefan Jonasson
ec732becfc Fixed the get_config_value method when the zwave node was changed while reading it. 2015-10-31 23:34:19 +01:00
Stefan Jonasson
c4261ae2e0 Z-Wave workaround - Added a default value if we did not get any config value. 2015-10-31 23:03:40 +01:00
Stefan Jonasson
cae8932b18 Z-Wave workaround - Connected to the timeout to the configured node value "9. Turn Off Light Time" 2015-10-31 21:23:33 +01:00
sander
efacd66bec linting and flakeing.. 2015-10-31 20:35:23 +01:00
hexxter
31826ab263 redesigned mqtt light an first steps with the unittest system 2015-10-31 19:26:03 +01:00
Paulus Schoutsen
6bb95f5c9b Merge pull request #560 from pavoni/add-vera-dimmer
Add vera dimmer
2015-10-30 21:47:02 -07:00
Paulus Schoutsen
46761d827f Merge pull request #570 from nkgilley/actiontec-fix
Actiontec device_tracker bugfix and removed home_interval
2015-10-30 21:18:28 -07:00
Paulus Schoutsen
288db9a57f Merge pull request #559 from balloob/light_ct_color
Color temperature support for light component and hue platform
2015-10-30 19:11:24 -07:00
Tom Duijf
b76471c4b3 :( .. pyliny 2015-10-30 19:15:38 +00:00
Tom Duijf
194c6343ac Minor corrections to light and light/demo 2015-10-30 19:01:42 +00:00
Stefan Jonasson
2ad647bb09 Style fixes 2015-10-30 15:30:08 +01:00
Stefan Jonasson
a56173676e Fixed the workaround match logic 2015-10-30 15:28:06 +01:00
Nolan Gilley
e961dd5f95 increase valid for time to 60 since I was having some issues. removed deprecated lines. 2015-10-30 07:00:35 -04:00
pavoni
0269be5813 Update pyvera version 2015-10-30 09:39:30 +00:00
pavoni
031d5ce255 Fix style issues, update pyvera version. 2015-10-30 09:37:16 +00:00
sander
85bb828149 changed requirements to the latest evohome version. 2015-10-29 21:17:10 +01:00
Paulus Schoutsen
c7a0b5800c Update links in introduction component 2015-10-29 00:23:05 -07:00
Tom Duijf
f456d2ff23 styling fix 2015-10-28 23:16:25 +00:00
Tom Duijf
6bad702db4 Renamed to color_temp, removed capabilities (not needed afterall) 2015-10-28 23:12:16 +00:00
Nolan Gilley
bcb2451752 fix pylint warning 2015-10-28 17:47:13 -04:00
Nolan Gilley
8eeca94517 removed home_interval option since it was added to the main device_tracker component 2015-10-28 17:43:41 -04:00
Nolan Gilley
3b37a7b737 bugfix for actiontec device tracker 2015-10-28 17:20:15 -04:00
Stefan Jonasson
d578bf3494 Removed extra pylint hint from a previous merge 2015-10-28 22:17:17 +01:00
Stefan Jonasson
8cb046a4a9 Merge remote-tracking branch 'origin/dev' into dev 2015-10-28 22:16:00 +01:00
Stefan Jonasson
30de5af445 Fix for Philio Zwave devices which don't send an off event. 2015-10-28 22:08:50 +01:00
Stefan Jonasson
f74a6ed4c9 Merge remote-tracking branch 'origin/dev' into dev
Conflicts:
	homeassistant/components/script.py
	homeassistant/helpers/entity_component.py
2015-10-28 21:43:46 +01:00
Stefan Jonasson
f3500542dd Added pylint hint 2015-10-28 21:42:42 +01:00
Paulus Schoutsen
2eb65c8eb8 Version bump to 0.8.0.dev0 2015-10-28 12:45:57 -07:00
Paulus Schoutsen
f8bb807707 Merge pull request #568 from balloob/dev
0.7.7
2015-10-28 12:45:42 -07:00
Paulus Schoutsen
5f40115605 Version bump to 0.7.7 2015-10-28 12:43:04 -07:00
Paulus Schoutsen
776616bcac Merge pull request #562 from pavoni/efergy_error_handling
Log request exceptions in Efergy sensor
2015-10-28 12:41:42 -07:00
Paulus Schoutsen
a98cb798f7 Merge pull request #567 from balloob/fix-script-regression
Fix script regression
2015-10-28 12:37:50 -07:00
Paulus Schoutsen
12495c717e Fix script regression 2015-10-28 12:24:33 -07:00
Stefan Jonasson
10c95b4352 Added pylint hint 2015-10-28 20:17:17 +01:00
Stefan Jonasson
48bfc98acb Fixed entity name 2015-10-28 19:52:09 +01:00
Stefan Jonasson
de027609d8 Fixed entity_id for the script component. Alias now does not override the entity_id
Fixed issue: #561
2015-10-28 12:27:58 +01:00
pavoni
16a3511c0a Catch request exceptions and log a warning 2015-10-28 10:57:10 +00:00
Paulus Schoutsen
0a36c96a55 Fill in service info for thermostat 2015-10-27 19:51:50 -07:00
pavoni
6ef0d089ea Add VeraLight class based on VeraSwitch - add dimmer support 2015-10-27 23:18:46 +00:00
Fabian Affolter
b3b2f2e326 Fix pylint and flake issues 2015-10-28 00:18:03 +01:00
Fabian Affolter
bef0b2b01e Make pins optional 2015-10-27 23:51:16 +01:00
Tom Duijf
805aecd6f9 pylint & flake cleanup 2015-10-27 22:49:45 +00:00
Tom Duijf
e4d33bc6d4 Included ct_color in code coverage 2015-10-27 22:45:35 +00:00
Tom Duijf
e25503bc4a Hue device capabilities. Color temperature support for light component and hue platform 2015-10-27 22:34:49 +00:00
root
4fcd27e905 light/mqtt to .coveragerc 2015-10-27 16:52:43 +01:00
Fabian Affolter
52b1080ccd Catch invalid chat ids 2015-10-27 14:26:44 +01:00
root
0128357024 Merge remote-tracking branch 'upstream/dev' into dev 2015-10-27 07:52:04 +01:00
root
c5f8095f53 Merge remote-tracking branch 'upstream/master' into dev 2015-10-27 07:51:21 +01:00
Paulus Schoutsen
ab48a94d2a Version bump to 0.7.7.dev0 2015-10-26 21:32:07 -07:00
Paulus Schoutsen
27c6c27db6 Merge pull request #554 from balloob/dev
0.7.6-rc1
2015-10-26 21:31:41 -07:00
Paulus Schoutsen
55c0ee6b32 Version bump to 0.7.6 2015-10-26 21:27:50 -07:00
Paulus Schoutsen
6b881ce1cd Merge pull request #547 from krzynio/dev
Add new OpenWRT presence detection routine based on ubus instead of luci
2015-10-26 21:26:13 -07:00
Paulus Schoutsen
9ab9d0e383 Update netdisco requirement 2015-10-26 20:49:20 -07:00
pavoni
dbc05450a0 Bump requirements_all.txt version, remove pylint disable 2015-10-26 16:32:12 +00:00
root
b66e4f1e15 two different demo lights on without RGB and one with RGB support.
and code cleanup more pylint aligned
2015-10-26 15:05:01 +01:00
Krzysztof Koziarek
649124d162 Added ubus.py to .coveragerc 2015-10-26 11:55:20 +01:00
pavoni
49f4d92c62 Add dimmer as switch 2015-10-26 10:51:23 +00:00
Krzysztof Koziarek
fbb73dd5da fixed pylint warnings 2015-10-26 11:50:09 +01:00
Krzysztof Koziarek
c9f1dce6a2 Coding style fixes 2015-10-26 11:32:00 +01:00
pavoni
ef6c209c6f Revise for clarity, disable pylink check 2015-10-26 09:03:57 +00:00
pavoni
0826ae2742 Revise pywemo version, update discovery.device_from_description parameters 2015-10-26 08:37:13 +00:00
Paulus Schoutsen
18747f8ae1 Update some docs 2015-10-25 23:12:10 -07:00
Paulus Schoutsen
06c8c1b168 Update to latest version frontend 2015-10-25 23:12:10 -07:00
Paulus Schoutsen
160fb6fcc8 Merge pull request #553 from balloob/download_relative
Download - relative / absolute path
2015-10-25 21:06:33 -07:00
Paulus Schoutsen
f1aa685cf2 Add version to config API 2015-10-25 21:00:22 -07:00
Paulus Schoutsen
da259d75a2 Update frontend with imprpved charts 2015-10-25 19:01:51 -07:00
Tom Duijf
9104ca815d Indentation 2015-10-26 00:13:47 +00:00
Tom Duijf
52193611cd Check for relative path 2015-10-26 00:10:32 +00:00
Paulus Schoutsen
a2256f6c97 Update version frontend 2015-10-25 15:39:50 -07:00
Paulus Schoutsen
004bad7f00 Merge pull request #551 from balloob/mp_plex_discovery
Media_player/plex discovery
2015-10-25 15:38:42 -07:00
root
a8c2cc4c33 rework for flake8 errors done 2015-10-25 23:38:24 +01:00
root
538f8545f7 fix a bug after the pylint rework 2015-10-25 23:04:43 +01:00
root
7cfce94dfb pylint rework for light/mqtt 2015-10-25 22:58:07 +01:00
Paulus Schoutsen
e490388843 Merge pull request #544 from MakeMeASandwich/hyperion
Hyperion ambilight remote support
2015-10-25 14:34:22 -07:00
Fabian Affolter
fb8edca942 Add link to docs, fix typo, and update log output 2015-10-25 22:21:25 +01:00
root
469d0619ba mqtt light component 2015-10-25 21:48:01 +01:00
Tom Duijf
bc8c5766d4 Logic fixes 2015-10-25 17:54:48 +00:00
Tom Duijf
5b25d9ccd6 flake8,pylint and other code cleanup 2015-10-25 17:00:54 +00:00
Fabian Affolter
0d05930765 Update 2015-10-25 15:58:58 +01:00
Fabian Affolter
f93282d636 Add link to docs 2015-10-25 15:58:58 +01:00
Fabian Affolter
78ad2686d4 Add link to docs 2015-10-25 15:58:58 +01:00
Fabian Affolter
3c36d13e8d Add link to docs 2015-10-25 15:58:58 +01:00
Fabian Affolter
77ba0c0393 Add link to docs 2015-10-25 15:58:58 +01:00
Fabian Affolter
6a3316ed12 Add link to docs 2015-10-25 15:58:58 +01:00
Fabian Affolter
415d650860 Add link to docs 2015-10-25 15:58:58 +01:00
Fabian Affolter
c3c248bc0a Add link to docs 2015-10-25 15:58:58 +01:00
Fabian Affolter
bf027fcd48 Add link to docs 2015-10-25 15:58:58 +01:00
Fabian Affolter
5c79fc0ae3 Add link to docs 2015-10-25 15:58:58 +01:00
Fabian Affolter
0aaf280bf5 Add link to docs 2015-10-25 15:58:58 +01:00
Fabian Affolter
55de563511 Add link to docs 2015-10-25 15:58:58 +01:00
Fabian Affolter
1a018e3ee7 Remove configuration details 2015-10-25 15:58:58 +01:00
Fabian Affolter
b023348795 Add link to docs 2015-10-25 15:58:58 +01:00
Tom Duijf
847d9736aa Configurator works, config saving basic implementation 2015-10-25 13:34:34 +00:00
Tom Duijf
884525df33 Basic discovery works, added plex logo for configurator. Missing configurator support for fields. Todo: config save on successful connect 2015-10-25 13:34:34 +00:00
Tom Duijf
6a82504e5e further discovery integration into plex 2015-10-25 13:34:34 +00:00
Tom Duijf
db7e46abd1 Intermediate save 2015-10-25 13:33:47 +00:00
Tom Duijf
8e9cafd29d Updated requirements_all.txt. Added placeholder to the empty deviceClass filter. Will remove this if deemed unneeded, later 2015-10-25 13:32:15 +00:00
Tom Duijf
a236b87ccf new attempt for PR 2015-10-25 13:32:15 +00:00
MakeMeASandwich
e379e3d902 Merge branch 'dev' of https://github.com/balloob/home-assistant into hyperion 2015-10-25 11:29:02 +01:00
MakeMeASandwich
1be48f54c0 light/hyperion: close sockets, report setup success 2015-10-25 11:08:59 +01:00
Paulus Schoutsen
96181a555a Allow pipes in command sensors and services 2015-10-24 12:40:36 -07:00
Paulus Schoutsen
e461ceae36 discovery: update Netdisco requirement 2015-10-24 12:18:48 -07:00
Paulus Schoutsen
83e6c24f18 Re-enable Z-Wave for Docker 2015-10-24 11:36:34 -07:00
Krzysztof Koziarek
50fbd83b3d corrected flake8 warnings 2015-10-24 11:20:57 +02:00
Fabian Affolter
649275044a Remove configuration details 2015-10-24 09:13:54 +02:00
Fabian Affolter
0f81fc60ad Remove configuration details 2015-10-24 09:10:31 +02:00
Paulus Schoutsen
ade8681511 Exclude rest switch from coverage 2015-10-23 23:44:17 -07:00
Paulus Schoutsen
7a699fd819 Merge pull request #539 from nkgilley/forecastio-units
Forecastio: Added support for specifying unit system in the configuration file.
2015-10-23 22:54:31 -07:00
Paulus Schoutsen
b0c0659acc Merge branch 'clean-up-heat-control' into dev
Conflicts:
	homeassistant/components/thermostat/heat_control.py
2015-10-23 22:51:00 -07:00
Paulus Schoutsen
80a9422a9a Merge pull request #545 from MakeMeASandwich/denon
Refactor denon remote
2015-10-23 22:40:37 -07:00
Fabian Affolter
060cbaf66b Add return value 2015-10-24 00:38:19 +02:00
Fabian Affolter
c19120e012 Check import 2015-10-24 00:34:49 +02:00
Fabian Affolter
1e0e48fcd7 Use logger the same as other platforms do 2015-10-24 00:29:47 +02:00
Fabian Affolter
f2fda2914a Fix continuation 2015-10-24 00:29:02 +02:00
Fabian Affolter
7e3483ab03 Remove configuration details 2015-10-24 00:24:14 +02:00
Fabian Affolter
bffce11a9a Remove configuration details 2015-10-24 00:20:18 +02:00
Fabian Affolter
8a895390ef Merge pull request #534 from bachp/dev
Add simple REST switch
2015-10-23 23:52:40 +02:00
Fabian Affolter
97f81ad7a6 Add more details 2015-10-23 23:48:57 +02:00
Pascal Bach
67d5581a1b Add simple REST switch
The switch can get the state via GET and set the state via POST
on a given REST resource.
It is not able to control arbitrary urls but it allows controlling
switches exposed via "real" REST.
2015-10-23 23:40:14 +02:00
Fabian Affolter
3406b41b0c Fix return value 2015-10-23 23:08:27 +02:00
Fabian Affolter
2e7912157b Remove configuration details 2015-10-23 23:00:20 +02:00
Fabian Affolter
5dbdf82ec7 Fix typo 2015-10-23 22:58:00 +02:00
Fabian Affolter
9f4a3f4aea Use the logger the same way as other platforms do 2015-10-23 22:57:07 +02:00
Fabian Affolter
4f3b3a9e34 Use the logger the same way as other platforms 2015-10-23 22:53:58 +02:00
Fabian Affolter
3ea167203f Remove configuration details 2015-10-23 22:48:30 +02:00
Fabian Affolter
756cbe1b08 Remove configuration details 2015-10-23 22:41:13 +02:00
Fabian Affolter
87e55820e7 Add link docs 2015-10-23 22:39:04 +02:00
Fabian Affolter
f828ee044d UPdate docstring 2015-10-23 22:34:23 +02:00
Fabian Affolter
a8e2f9cbb7 Remove configuration details 2015-10-23 22:34:02 +02:00
Fabian Affolter
2e3f462474 Update docstring 2015-10-23 22:32:36 +02:00
Fabian Affolter
3f6780d9be Remove configuration details 2015-10-23 22:31:37 +02:00
Fabian Affolter
e21921823e Update docstring 2015-10-23 22:29:22 +02:00
Fabian Affolter
f9b2e0058e Fix typo 2015-10-23 19:01:38 +02:00
Fabian Affolter
a155587693 Remove configuration details 2015-10-23 19:01:19 +02:00
Fabian Affolter
0e145ec130 Remove configuration details 2015-10-23 18:39:50 +02:00
Fabian Affolter
44b08a06e7 Remove configuration details 2015-10-23 18:26:36 +02:00
Fabian Affolter
75f737144a Remove configuration details 2015-10-23 18:24:07 +02:00
Fabian Affolter
170742b0a7 Remove configuration details 2015-10-23 18:15:12 +02:00
Fabian Affolter
6115be7c42 Remove configuration details 2015-10-23 18:13:45 +02:00
Fabian Affolter
84a9a300d6 Fix link 2015-10-23 18:13:28 +02:00
Fabian Affolter
55718aac66 Remove configuration details 2015-10-23 18:10:32 +02:00
MakeMeASandwich
b6e6512367 media_player/denon: refactor
* connect only if necessary
* do not throw errors if offline
2015-10-23 17:35:08 +02:00
Krzysztof Koziarek
29c9c5a7ec Add new OpenWRT presence detection routine based on ubus instead of luci 2015-10-23 17:01:42 +02:00
Nolan Gilley
dd787ea5ce remove suggestion for uk unit system. change default to use si or us based on default temperature. added more sensor types. 2015-10-23 10:10:44 -04:00
Paulus Schoutsen
c2d75efb4d Add missing docstring to heat control thermo 2015-10-22 22:14:40 -07:00
Paulus Schoutsen
3d972abdab Clean up the heat control thermostat 2015-10-22 22:04:37 -07:00
Fabian Affolter
7801489149 Remove configuration details 2015-10-21 23:05:54 +02:00
Fabian Affolter
0fda89e983 Remove configuration details 2015-10-21 23:05:38 +02:00
Fabian Affolter
07a75c5eeb Remove configuration details 2015-10-21 23:05:13 +02:00
Fabian Affolter
0b7c407519 Remove configuration details 2015-10-21 22:54:42 +02:00
Fabian Affolter
3c34f3dac2 Remove configuration details 2015-10-21 22:53:26 +02:00
Fabian Affolter
d45074f9dc Remove configuration details 2015-10-21 22:53:09 +02:00
sander
863955e1bd got the basics working 2015-10-21 21:48:21 +02:00
Fabian Affolter
4ff1b0fdb2 Add link to docs 2015-10-21 21:26:16 +02:00
Fabian Affolter
ba13f13442 Remove configuration details 2015-10-21 21:12:25 +02:00
Fabian Affolter
e615755eb9 Remove configuration details 2015-10-21 21:11:51 +02:00
Fabian Affolter
352d3532e7 Remove configuration details 2015-10-21 21:11:18 +02:00
Fabian Affolter
7b60f6ca77 Remove configuration details 2015-10-21 19:43:24 +02:00
Fabian Affolter
a2e8fcbc77 Remove newline 2015-10-21 19:37:34 +02:00
Fabian Affolter
e10fd0d28b Remove configuration details 2015-10-21 19:36:52 +02:00
sander
f376061e23 Revert "had to change to let this work on windows."
This reverts commit 6c106a87f1.
2015-10-21 19:00:23 +02:00
sander
076b3db5e8 first try 2015-10-21 19:00:15 +02:00
Fabian Affolter
89964ad793 Remove configuration details 2015-10-21 16:46:31 +02:00
Fabian Affolter
bddd02bd58 Remove configuration details 2015-10-21 16:45:45 +02:00
Fabian Affolter
cfb3384ee3 Add link to docs 2015-10-21 16:38:33 +02:00
Fabian Affolter
490e9ee95d Add link to docs 2015-10-21 16:37:41 +02:00
Fabian Affolter
0d0eb7e7c0 Add link to docs 2015-10-21 16:10:47 +02:00
Fabian Affolter
3d4af8c229 Remove configuration details 2015-10-21 10:56:32 +02:00
Fabian Affolter
7e23c241da Update docstring 2015-10-21 10:49:25 +02:00
Fabian Affolter
7ec1424825 Add link to docs 2015-10-21 10:47:31 +02:00
Fabian Affolter
9162149598 Add link to docs 2015-10-21 10:47:12 +02:00
Fabian Affolter
da31b54d06 Add link to docs 2015-10-21 10:45:08 +02:00
Fabian Affolter
b20a757454 Remove configuration details 2015-10-21 10:44:29 +02:00
Fabian Affolter
761f225c86 Update link 2015-10-20 22:20:58 +02:00
Fabian Affolter
5580309d98 Remove configuration details 2015-10-20 22:20:58 +02:00
Fabian Affolter
52b4c3b5a2 Remove configuration details 2015-10-20 22:20:58 +02:00
Fabian Affolter
aed61cecff Remove configuration details 2015-10-20 22:20:58 +02:00
Fabian Affolter
ef129639bd Remove configuration details 2015-10-20 22:20:58 +02:00
Fabian Affolter
f945a3a692 Move configuration details to docs 2015-10-20 22:20:58 +02:00
Fabian Affolter
5e56eae28f Move configuration details to docs 2015-10-20 22:20:58 +02:00
Fabian Affolter
72ad1387f0 Move configuration details to docs 2015-10-20 22:20:58 +02:00
Fabian Affolter
02cfc70ad5 Add link to component 2015-10-20 22:20:58 +02:00
Fabian Affolter
5a21b677a1 Add link to component 2015-10-20 22:20:58 +02:00
Fabian Affolter
c1a73d250a Add link to component 2015-10-20 22:20:58 +02:00
Fabian Affolter
8c544a89c9 Remove configuration details 2015-10-20 22:20:58 +02:00
Fabian Affolter
c473d426e3 Remove configuration details 2015-10-20 22:20:58 +02:00
Fabian Affolter
f5a62f8381 Remove configuration details 2015-10-20 22:20:58 +02:00
Fabian Affolter
0e8e4a73fe Remove configuration details 2015-10-20 22:20:58 +02:00
Fabian Affolter
74700e4b10 Add link to doc and remove configuration details 2015-10-20 22:20:58 +02:00
Fabian Affolter
4d5c9581bf Add link to docs 2015-10-20 22:20:58 +02:00
Fabian Affolter
f45e0eabe3 Add link to docs 2015-10-20 22:20:58 +02:00
Fabian Affolter
bbed4a262c Fix typo 2015-10-20 22:20:44 +02:00
Fabian Affolter
f8590f7d1d Include resource in error message 2015-10-20 22:20:44 +02:00
Nolan Gilley
293ed275ab Added support for specifying units in the configuration file. If no units are specified in the config file it will use location to determine the units. 2015-10-20 14:29:22 -04:00
MakeMeASandwich
2e9ee28637 light/hyperion: use RGB, clean code 2015-10-20 17:30:23 +02:00
Paulus Schoutsen
73cb23f599 Merge pull request #535 from toddeye/radiotherm-dev
radiotherm platform bug fix and configuration parameter
2015-10-19 23:28:10 -07:00
Todd Ingarfield
661f4c594e formatting 2015-10-19 16:54:42 -05:00
Todd Ingarfield
9464e2a13b Add hass configuration parameter hold_temp & config documentation 2015-10-19 16:18:45 -05:00
Todd Ingarfield
27d5248937 Fix configuration for multiple hosts and add example configuration.yaml section 2015-10-19 15:33:23 -05:00
MakeMeASandwich
c5a7e3abd1 Merge branch 'dev' of https://github.com/balloob/home-assistant into dev 2015-10-19 20:09:38 +02:00
Paulus Schoutsen
0a6424a81d Merge pull request #529 from persandstrom/lms_pause
bugfix, LMS pause
2015-10-18 13:01:43 -07:00
Per Sandström
5b7389de55 bugfix, 1 = force pause 2015-10-18 21:05:30 +02:00
Paulus Schoutsen
0fe4e0330a Merge pull request #528 from fabaff/arest-sensor
Add pins feature to arest sensor
2015-10-18 10:32:57 -07:00
Fabian Affolter
40b095b866 Add option to use pins 2015-10-18 18:05:25 +02:00
MakeMeASandwich
7141a99927 fix flake warning 2015-10-18 09:10:41 +02:00
Fabian Affolter
f01d2b1263 Allow to overwrite the device name 2015-10-18 00:42:02 +02:00
Fabian Affolter
3c6420c538 Allow to overwrite the device name 2015-10-18 00:41:12 +02:00
MakeMeASandwich
e3304caf06 add hyperion light support 2015-10-17 19:36:52 +02:00
Fabian Affolter
91a1fb0240 Remove wrong file 2015-10-16 09:12:37 +02:00
Paulus Schoutsen
6fd32e83c8 Update .coveragerc 2015-10-15 13:50:06 -07:00
Paulus Schoutsen
b41caa093c Merge pull request #503 from toddeye/radiotherm-platform
Add Radio Thermostat platform
2015-10-15 13:45:52 -07:00
Paulus Schoutsen
806c71c803 Merge pull request #522 from balloob/script-cleanup
Script clean up
2015-10-15 13:44:46 -07:00
Todd Ingarfield
b0bafa32b7 fixed typo in requirements_all.txt 2015-10-15 11:44:19 -05:00
Fabian Affolter
332ac794a4 Modify the import style 2015-10-15 18:22:42 +02:00
Paulus Schoutsen
5dfd0d2502 Fix another manual alarm regression 2015-10-15 08:39:38 -07:00
Todd Ingarfield
3d838c307f merged upstream and fixed conflict 2015-10-15 10:13:02 -05:00
Paulus Schoutsen
2dd77f9477 Merge pull request #523 from fabaff/cpuinfo
CPU Speed sensor
2015-10-15 07:33:18 -07:00
sander
6c106a87f1 had to change to let this work on windows. 2015-10-15 15:02:09 +02:00
Fabian Affolter
1279bf7c68 Add py-cpuinfo 2015-10-15 12:13:35 +02:00
Fabian Affolter
323d301072 Add cpuspeed sensor 2015-10-15 12:13:16 +02:00
Fabian Affolter
b1815075ac Add cpuspeed sensor 2015-10-15 12:13:04 +02:00
Paulus Schoutsen
7ba4263284 Fix regression manual alarm 2015-10-14 23:38:42 -07:00
Paulus Schoutsen
347597ebdc Base Script on entity 2015-10-14 23:15:48 -07:00
Todd Ingarfield
ddeb84cb9c Removed name and netdisco functions, implemented update method to caches values, radiotherm lib to coveragerc and requirements_all.txt 2015-10-14 11:11:33 -05:00
Todd Ingarfield
b2e39884f9 Removed name and netdisco functions, implemented update method to caches values, radiotherm lib to coveragerc and requirements_all.txt 2015-10-14 11:02:07 -05:00
Fabian Affolter
8d99c4a0cc Move configuration details to docs 2015-10-14 10:39:51 +02:00
Fabian Affolter
80e4f2f51f Add link to doc 2015-10-14 10:39:51 +02:00
Fabian Affolter
6064fffc8e Move configuration details to docs 2015-10-14 10:39:51 +02:00
Fabian Affolter
7da354c4c5 Move configuration details to docs 2015-10-14 10:39:51 +02:00
Paulus Schoutsen
49de153ecf Add alarm component to demo component 2015-10-13 23:21:47 -07:00
Paulus Schoutsen
716376081d Add tests for MQTT alarm 2015-10-13 23:08:12 -07:00
Paulus Schoutsen
d37b70556d manual alarm: Test disarm with invalid code 2015-10-13 22:41:35 -07:00
Paulus Schoutsen
32bb950b5f Add tests for manual alarm control panel platform 2015-10-13 22:36:21 -07:00
Fabian Affolter
0e89418cbe Move configuration desciption to docs 2015-10-13 23:44:27 +02:00
Fabian Affolter
fe032be352 Upgrade psutil to 3.2.2 2015-10-13 23:42:27 +02:00
Fabian Affolter
64a78d7b4f Upgrade psutil to 3.2.2 2015-10-13 23:41:46 +02:00
Fabian Affolter
24e4b9e012 Move configuration description to docs 2015-10-13 23:08:56 +02:00
Fabian Affolter
a44a39003d Move configuration description to docs 2015-10-13 23:07:26 +02:00
Fabian Affolter
f019b4f697 Move configuration details to docs 2015-10-13 22:56:12 +02:00
Fabian Affolter
e353dae3a6 Move vonfiguration details to docs 2015-10-13 22:45:36 +02:00
Fabian Affolter
fb84c0ce6b Move configuration details to docs 2015-10-13 22:41:53 +02:00
Fabian Affolter
fd382871a1 Move configuration details to docs 2015-10-13 22:30:21 +02:00
Fabian Affolter
405025a00b Remove configuration details 2015-10-13 22:26:32 +02:00
Fabian Affolter
912ddbb4fc Add link to docs 2015-10-13 22:26:27 +02:00
Fabian Affolter
91138b8679 Move configuration details to docs 2015-10-13 22:16:26 +02:00
Fabian Affolter
893b9fc8ac Move configuration details to docs 2015-10-13 22:08:11 +02:00
Fabian Affolter
185ba000dd Add link to docs 2015-10-13 21:09:11 +02:00
Fabian Affolter
771118caaf Add link to docs 2015-10-13 21:08:51 +02:00
Fabian Affolter
17d9df0da5 Add link to docs 2015-10-13 21:08:34 +02:00
Fabian Affolter
e067398134 Add link to docs 2015-10-13 21:08:18 +02:00
Fabian Affolter
cb69ac30ec Add link to docs 2015-10-13 21:07:53 +02:00
Fabian Affolter
241ff45c5e Add link to docs 2015-10-13 21:07:40 +02:00
Fabian Affolter
c5c2f0c5f3 Add link to docs 2015-10-13 21:07:24 +02:00
Fabian Affolter
0874cb364f Move configuration details to docs 2015-10-13 21:00:44 +02:00
Fabian Affolter
44418b509c Move configuration details to docs 2015-10-13 21:00:28 +02:00
Fabian Affolter
403889bbeb Move configuration details to docs 2015-10-13 20:55:45 +02:00
Fabian Affolter
6ca50d8b5c Move configuration details to docs 2015-10-13 20:55:15 +02:00
Fabian Affolter
0369a9ee0d Move configuration details to docs 2015-10-13 20:54:48 +02:00
Fabian Affolter
5a6ff9a69a Move configuration details to docs 2015-10-13 20:54:15 +02:00
Fabian Affolter
796cce78bc Move configuration details to docs 2015-10-13 20:52:30 +02:00
Fabian Affolter
77430c0687 Move configuration details to docs 2015-10-13 20:52:08 +02:00
Fabian Affolter
c33942d6e2 Move configuration details to docs 2015-10-13 20:51:30 +02:00
Fabian Affolter
3b91f89173 Move configuration details to docs 2015-10-13 20:50:53 +02:00
Fabian Affolter
c74f46794e Move configuration details to docs 2015-10-13 20:50:15 +02:00
Fabian Affolter
966fd8f24d Move configuration details to docs 2015-10-13 20:49:28 +02:00
Fabian Affolter
8253fdfc13 Add newline 2015-10-13 20:49:14 +02:00
Fabian Affolter
cb7b5f8d15 Move configuration details to docs 2015-10-13 20:45:29 +02:00
Fabian Affolter
b0d8eaeda9 Move configuration details to docs 2015-10-13 20:44:18 +02:00
Fabian Affolter
62cfb8aeb2 Move configuration details to docs 2015-10-13 20:42:05 +02:00
Fabian Affolter
47448d1dc0 Add link to docs 2015-10-13 20:40:59 +02:00
Fabian Affolter
a583525110 Move configuration details to docs 2015-10-13 20:01:23 +02:00
Paulus Schoutsen
38e1cef30e Update frontend for style fix 2015-10-13 08:58:15 -07:00
Paulus Schoutsen
e2f187879c Merge pull request #511 from wind-rider/geofancy
Geofancy
2015-10-13 00:05:17 -07:00
Paulus Schoutsen
925cde200f Merge pull request #514 from balloob/scene-turn-off-remove
Remove turning off scenes
2015-10-12 23:43:29 -07:00
Paulus Schoutsen
383efee470 Scene turn off for frontend 2015-10-12 23:40:09 -07:00
Paulus Schoutsen
d5eb90160f Merge pull request #461 from sfam/manual-alarm
Add manual alarm
2015-10-12 23:13:37 -07:00
Paulus Schoutsen
2f946cc6de Merge pull request #516 from mKeRix/dev
Fix for newest tplink firmware, fixes #415
2015-10-12 23:10:30 -07:00
sfam
1b7ce2146c replace sleeps with track_point_in_time 2015-10-13 00:56:24 +00:00
Heiko Rothe
021a374a6a Merge branch 'dev' of https://github.com/mKeRix/home-assistant into dev 2015-10-12 22:44:20 +02:00
Heiko Rothe
bbec34d0e6 Merge remote-tracking branch 'refs/remotes/balloob/dev' into dev 2015-10-12 22:43:55 +02:00
Heiko Rothe
a6cb19b27d Fixed an issue with the initiation of the new attributes 2015-10-12 22:42:45 +02:00
Hans Bakker
b74e70d4e0 Fixes based on balloob's comments 2015-10-12 20:58:24 +02:00
Paulus Schoutsen
5cd283e999 Merge pull request #513 from balloob/component-command
Add shell_command component
2015-10-12 08:43:32 -07:00
Heiko Rothe
2f2bd7a616 Fixed pylint and pep8 violations 2015-10-12 09:18:55 +02:00
Paulus Schoutsen
cddc87b0ab Remove turn off from scene 2015-10-11 23:51:59 -07:00
Paulus Schoutsen
d6bbc67112 Add tests for scene 2015-10-11 23:48:17 -07:00
Paulus Schoutsen
6d77b15e44 Few more tests 2015-10-11 21:41:44 -07:00
Paulus Schoutsen
916c453d2b Add test for shell command 2015-10-11 21:30:17 -07:00
Paulus Schoutsen
7786b52d93 Add shell_command component 2015-10-11 20:11:30 -07:00
Paulus Schoutsen
90d4a2c0b8 Update frontend version 2015-10-11 20:10:32 -07:00
Paulus Schoutsen
b6d26597c0 Automation - state platfor: Flag if user makes config error 2015-10-11 18:30:25 -07:00
Paulus Schoutsen
bf1970b78c Make thermostat more robust 2015-10-11 18:16:55 -07:00
Hans Bakker
1eb3610a11 Style fixes 2015-10-12 00:28:39 +02:00
Paulus Schoutsen
f081f7c4ff Merge pull request #494 from andythigpen/mysensors-update
Update to latest mysensors library.
2015-10-11 15:14:23 -07:00
Hans Bakker
6a969208e9 Initial commit for Geofancy device tracker. 2015-10-12 00:14:05 +02:00
Andrew Thigpen
384b3d0d17 Update to latest mysensors library.
* Adds JSON persistence support.
* Adds documentation comments for configuration options.
2015-10-11 17:05:08 -05:00
Paulus Schoutsen
ad5b650661 Merge pull request #504 from happyleavesaoc/dev
Amazon Fire TV device support
2015-10-11 14:54:55 -07:00
Paulus Schoutsen
b05f2e3221 Fix style issue 2015-10-11 11:04:16 -07:00
Paulus Schoutsen
dcfc91e71c Fix throttle applied to methods 2015-10-11 10:42:42 -07:00
Todd Ingarfield
6c1c243000 start away mode 2015-10-11 11:42:24 -05:00
Paulus Schoutsen
c2117b3eaf Merge pull request #507 from gsabbe/dev
asuswrt gives a traceback when ipv6 is enabled on the router
2015-10-11 09:26:11 -07:00
Todd Ingarfield
84c72ebf63 Add support for multiple thermostats (via hass-config) and auto-discovery via ratiotherm module 2015-10-11 09:28:25 -05:00
Guillaume SABBE
a1e5bea3ab When IPv6 is enabled, dnsmasq has a configuration line with the DUID.
This looks like this
61072 b8:27:eb:e1:4e:4d 192.168.0.4 domotycoon *
61072 b8:27:eb:b8:10:6b 192.168.0.5 pimonitor *
duid 00:03:00:01:ac:22:0b:e9:98:50
When using match.group() without testing if match != None, you get a traceback.
2015-10-11 15:21:53 +02:00
Hans Bakker
bee5c0adfb Merge branch 'dev' of https://github.com/balloob/home-assistant 2015-10-10 23:40:59 +02:00
happyleavesaoc
7ca21f577d fixed merge conflict 2015-10-10 16:53:55 -04:00
happyleavesaoc
168516f5da addressed PR comments 2015-10-10 16:45:13 -04:00
Paulus Schoutsen
94df5acbf3 Version bump to 0.7.6.dev0 2015-10-10 11:45:25 -07:00
Paulus Schoutsen
853a9fd4cd Merge pull request #506 from balloob/dev
0.7.5rc1
2015-10-10 11:45:06 -07:00
Paulus Schoutsen
6a18205d2e Update to version 0.7.5 2015-10-10 11:39:29 -07:00
Paulus Schoutsen
3a3b8bbb45 Fix packaging issues 2015-10-10 10:33:09 -07:00
Todd Ingarfield
37278aab20 add set_time and begin discovery 2015-10-10 11:36:34 -05:00
Fabian Affolter
d3c4722529 Add some other components 2015-10-09 23:45:36 +02:00
Fabian Affolter
c3de67041a Add plex 2015-10-09 23:40:06 +02:00
Fabian Affolter
f07d07432d Add telegram 2015-10-09 23:38:28 +02:00
Fabian Affolter
47f994b867 Move configuration details to docs 2015-10-09 23:33:59 +02:00
Fabian Affolter
a8a172c8b7 Add link to docs and remove configuration details from file header 2015-10-09 23:24:26 +02:00
happyleavesaoc
d4d91bfdbb Amazon Fire TV device support 2015-10-09 17:06:35 -04:00
Fabian Affolter
7432bbd70c Merge pull request #500 from balloob/arest-fix
Throttle per instance (fixes arest)
2015-10-09 22:46:55 +02:00
Todd Ingarfield
a3d295d885 Correct formatting 2015-10-09 11:38:39 -05:00
Todd Ingarfield
0cf909cce9 Correct ci failed tests 2015-10-09 11:34:14 -05:00
Todd Ingarfield
fc1cf49fd3 added REQUIREMENTS for radiotherm python module 2015-10-09 10:49:54 -05:00
Todd Ingarfield
e5d68d8a1e set name of device through hass config 2015-10-09 10:43:14 -05:00
Fabian Affolter
8fc2f5fe36 Update and equalize comments 2015-10-09 17:41:07 +02:00
Paulus Schoutsen
c2c18bdbd5 Merge pull request #501 from fabaff/telegram
Telegram notifications
2015-10-09 07:40:40 -07:00
Fabian Affolter
f8efe3f00f Update link to docs 2015-10-09 14:48:58 +02:00
Fabian Affolter
db53e46705 Add link to docs and remove configuration details 2015-10-09 14:44:59 +02:00
Fabian Affolter
526a163563 Update link 2015-10-09 14:41:35 +02:00
Fabian Affolter
e29f857f43 Update header (docstring) 2015-10-09 14:40:48 +02:00
Fabian Affolter
9f6ce868e2 Add telegram 2015-10-09 14:13:05 +02:00
Fabian Affolter
3ef5e7c161 Add telegram 2015-10-09 14:12:49 +02:00
Fabian Affolter
fe5bb89a68 Add telegram notifier 2015-10-09 14:04:29 +02:00
Paulus Schoutsen
be8089bcde Cleanup arest 2015-10-08 23:50:04 -07:00
Paulus Schoutsen
47fc1deecb Fix throttle to work on instance-level 2015-10-08 23:49:55 -07:00
Paulus Schoutsen
8a04e1f5f4 Device tracker configuration fix
Fixes #498
2015-10-08 22:19:15 -07:00
Paulus Schoutsen
9f33b8f541 DDWRT - match multiple output variants
Fixes #481
2015-10-08 22:15:12 -07:00
Paulus Schoutsen
0624725e21 Ignore nmap style issue - pylint bug 2015-10-08 21:45:51 -07:00
Paulus Schoutsen
dc5f0ef314 NMap: fix hostname resolver
Fixes #482
2015-10-08 21:01:38 -07:00
Paulus Schoutsen
cb2943c247 Merge pull request #499 from balloob/handle-states-for-media-player
Prioritize play_media over state change
2015-10-08 18:07:27 -07:00
Jon Maddox
45f0911640 move play_media to the top so it catches first 2015-10-08 20:37:59 -04:00
Todd Ingarfield
4ac9e9fc4c initial commit 2015-10-08 17:48:03 -05:00
Fabian Affolter
28b107ffa9 Move details from header to docs 2015-10-09 00:27:29 +02:00
Paulus Schoutsen
e0149c4ee4 Merge pull request #488 from balloob/itunes-play-media
iTunes play_media
2015-10-08 12:48:35 -07:00
Paulus Schoutsen
455a5916fd Merge pull request #496 from tomduijf/local_www
Allowing custom/local files (images, etc) to be used in the webinterface
2015-10-08 12:46:23 -07:00
Tom Duijf
cbf94aae55 Merge remote-tracking branch 'upstream/dev' into local_www 2015-10-08 19:32:28 +00:00
Paulus Schoutsen
39ced09727 Merge pull request #493 from tomduijf/dev_tracker_snmp
device_tracker snmp
2015-10-08 12:29:15 -07:00
Tom Duijf
ad417bfdfb Merge remote-tracking branch 'upstream/dev' into local_www 2015-10-08 15:06:01 +00:00
Tom Duijf
f682fd7c1f Merge remote-tracking branch 'upstream/dev' into dev_tracker_snmp 2015-10-08 15:04:15 +00:00
Tom Duijf
ee23c0fe14 cleaner logging 2015-10-08 14:54:20 +00:00
Tom Duijf
5322789c14 Ability to store icons/pictures in config_dir/www for e.g. device_tracker pictures 2015-10-08 14:10:33 +00:00
Paulus Schoutsen
05cec772d0 Merge pull request #495 from kennedyshead/dev
Fix for KeyError in kodi.py
2015-10-08 06:59:26 -07:00
magnusknutas
75c3e42064 Removes log for cleanup 2015-10-08 14:00:23 +02:00
magnusknutas
61c955779b Logging with info 2015-10-08 13:55:01 +02:00
magnusknutas
a015df7b01 Test for media_content_id KeyError 2015-10-08 13:41:58 +02:00
Tom Duijf
721c1d0f54 styling fix for flake 2015-10-08 10:24:55 +00:00
Tom Duijf
fe37a6aecc Merge remote-tracking branch 'upstream/dev' into dev_tracker_snmp 2015-10-08 10:01:24 +00:00
Tom Duijf
85bf6cb568 Added pylint disables 2015-10-08 10:01:10 +00:00
Fabian Affolter
9f10ab5e7a Update logger output 2015-10-08 11:10:05 +02:00
Fabian Affolter
3b7f6d3b67 Update docstrings 2015-10-08 11:09:00 +02:00
Fabian Affolter
d8aefb5d55 Update docstrings 2015-10-08 11:08:47 +02:00
Fabian Affolter
06cac7f9ef Update docstrings 2015-10-08 11:08:32 +02:00
Fabian Affolter
6d3f18d094 Update docstrings 2015-10-08 11:08:17 +02:00
Tom Duijf
050f90d07a merge with upstream 2015-10-08 08:24:38 +00:00
Fabian Affolter
bf9b179441 Update docstrings 2015-10-08 10:23:19 +02:00
Tom Duijf
4f0f7eff5e Merge remote-tracking branch 'upstream/dev' into dev 2015-10-08 08:22:14 +00:00
Tom Duijf
4edbdab4c0 Merge remote-tracking branch 'upstream/master' into dev 2015-10-08 08:09:56 +00:00
Tom Duijf
729f59625e Merge branch 'dev' into dev_tracker_snmp 2015-10-08 08:05:03 +00:00
Tom Duijf
213a1fe4ba Various fixes, CI validation 2015-10-08 08:00:30 +00:00
Paulus Schoutsen
c1899609a4 Merge branch 'pr/483' into dev
Conflicts:
	.coveragerc
2015-10-08 00:28:52 -07:00
Paulus Schoutsen
1b4ef3856a Merge pull request #471 from alanbowman/blinkstick_support
[WIP] Add blinkstick support
2015-10-08 00:05:42 -07:00
Paulus Schoutsen
4673a82c90 Merge pull request #490 from CCOSTAN/patch-3
Added # comment for Sensor
2015-10-07 23:52:45 -07:00
Tom Duijf
ae6f651c7d styling and version for requirement 2015-10-07 23:22:29 +00:00
Tom Duijf
7cb0f805ee fixed loop 2015-10-07 22:17:49 +00:00
Tom Duijf
d556e5979a Updated misc files and code styling 2015-10-07 21:45:24 +00:00
Fabian Affolter
d149f9d64c Update doc string (Fix #491) 2015-10-07 23:28:56 +02:00
Tom Duijf
9377b647f5 removed debug logging 2015-10-07 21:05:27 +00:00
Tom Duijf
469f35d25f various fixes, initial working version 2015-10-07 21:04:34 +00:00
Carlo Costanzo
17865c78c4 Added # comment for Sensor
Comments for unique sensor labels.
2015-10-07 17:02:07 -04:00
badele
a5dae78155 Refactoring the rfxtrx components 2015-10-07 19:57:40 +02:00
badele
46f5ef54a1 Refactoring test instance type 2015-10-07 19:15:50 +02:00
badele
496e4cf784 Exclude rfxtrx component files 2015-10-07 19:07:19 +02:00
badele
11fc521e60 Replace REQUIREMENTS by DEPENDENCIES variable 2015-10-07 19:04:03 +02:00
Tom Duijf
a58382e763 Fixed b/octet to mac adress conversion 2015-10-07 16:57:01 +00:00
Alan Bowman
9d4aa7e519 Update tests for RGB color support 2015-10-07 13:58:21 +01:00
Jon Maddox
ffbaf0cd5a simpler 2015-10-07 02:13:13 -04:00
Jon Maddox
3b58e8628d style 2015-10-07 02:02:25 -04:00
Jon Maddox
c2fe977778 style 2015-10-07 01:55:15 -04:00
Jon Maddox
85338887b4 wrap it 2015-10-07 01:42:50 -04:00
Jon Maddox
9a3c76c263 these are required 2015-10-07 01:41:57 -04:00
Jon Maddox
6ab4b80486 Merge branch 'dev' into itunes-play-media 2015-10-07 01:41:21 -04:00
Paulus Schoutsen
5e0a4c316f Merge pull request #487 from balloob/media-player-play-media
Media Player play_media function
2015-10-06 22:40:36 -07:00
Jon Maddox
26939ce554 style 2015-10-07 01:37:40 -04:00
Jon Maddox
c83324d4cf nope 2015-10-07 01:34:37 -04:00
Jon Maddox
dbcc3a76ea style 2015-10-07 01:29:55 -04:00
Jon Maddox
faa3e98921 module level play_media 2015-10-07 01:28:58 -04:00
Jon Maddox
1c4ac6017d fix typo while were in here 2015-10-07 01:21:41 -04:00
Jon Maddox
25a690691b import it from the right place 2015-10-07 01:11:19 -04:00
Jon Maddox
bb997deb85 COMMMMAAAAAAAAAAAA 2015-10-07 01:06:27 -04:00
Jon Maddox
6c4b2fd638 derp 2015-10-07 01:01:25 -04:00
Jon Maddox
c4f8017a3f silence warning 2015-10-07 00:56:36 -04:00
Jon Maddox
6afb846d04 avoid key errors 2015-10-07 00:56:14 -04:00
Jon Maddox
ad549be353 support play_media for state restoration (for scenes) 2015-10-07 00:39:38 -04:00
Jon Maddox
9012ba53fd add play_media service to tests 2015-10-06 23:18:24 -04:00
Jon Maddox
bdb42bf4a2 support play_media 2015-10-06 23:12:48 -04:00
Jon Maddox
1b22f71a19 implement play_media 2015-10-06 23:12:41 -04:00
Jon Maddox
e84ddb036f return what playlist is playing 2015-10-06 23:12:30 -04:00
Jon Maddox
4be33bb15b add a way to play a playlist with the client 2015-10-06 23:12:20 -04:00
Jon Maddox
d17174d43d play_media as a service 2015-10-06 23:11:21 -04:00
Jon Maddox
e64846e2fd add ability to support play_media 2015-10-06 23:11:09 -04:00
Jon Maddox
d454cad5a6 add a play_media function 2015-10-06 23:10:39 -04:00
Jon Maddox
dcf52332ca add new properties for Channel or Playlist 2015-10-06 23:09:53 -04:00
Jon Maddox
87599df41b add some new media types 2015-10-06 23:00:29 -04:00
Tom Duijf
e535f50e03 Merge branch 'master' into dev_tracker_snmp 2015-10-06 21:30:36 +00:00
Tom Duijf
df7fbf664e Added constants needed for snmp 2015-10-06 21:27:04 +00:00
Tom Duijf
0fb9e1b16c Initial commit of snmp device tracker 2015-10-06 21:26:32 +00:00
Alan Bowman
047cff6596 Add blinkstick support 2015-10-06 11:10:16 +01:00
badele
32f1791c5a Check flake & pylint style 2015-10-06 08:44:15 +02:00
Paulus Schoutsen
3b49d1e876 Update version to 0.7.5dev0 2015-10-05 22:31:21 -07:00
Paulus Schoutsen
4d1dce2519 Merge branch 'dev' 2015-10-05 22:18:45 -07:00
Paulus Schoutsen
01d097b9b0 Bump version to 0.7.4 2015-10-05 22:18:34 -07:00
Alan Bowman
6d53944fa1 Support RGB colors 2015-10-05 13:25:09 +01:00
Paulus Schoutsen
7f60f1e662 Merge pull request #478 from balloob/dev
0.7.4rc1
2015-10-04 11:30:36 -07:00
Paulus Schoutsen
bc6c285945 Update zone doc 2015-10-04 01:40:38 -07:00
Paulus Schoutsen
d4d8c9ae65 Update frontend version 2015-10-04 01:40:38 -07:00
Paulus Schoutsen
9292891836 Update documentation 2015-10-04 01:40:38 -07:00
Paulus Schoutsen
035df68d6c Merge pull request #479 from balloob/balloob-patch-1
Tweak caching on CI
2015-10-03 11:41:14 -07:00
Paulus Schoutsen
c611be96ad Another try, caching is enabled before activating virtualenv 2015-10-03 11:36:39 -07:00
Paulus Schoutsen
d46720ee2c Tweak caching on CI 2015-10-03 11:31:28 -07:00
Paulus Schoutsen
c1f464f478 Fix style issue 2015-10-03 11:26:57 -07:00
Paulus Schoutsen
8c5759e460 Improve Logbook device tracker locations handling 2015-10-03 11:20:22 -07:00
Paulus Schoutsen
8490d6126a OwnTracks robustness improvement 2015-10-03 10:29:00 -07:00
badele
7f71706f08 Log RFXCOM events 2015-10-03 11:26:18 +02:00
Paulus Schoutsen
8b5b580287 Merge pull request #477 from fabaff/worldclock
Worldclock sensor
2015-10-03 00:03:14 -07:00
Paulus Schoutsen
d35f5b9f97 Tests for MQTT sensor/switch 2015-10-02 23:57:26 -07:00
Paulus Schoutsen
6de64d7695 Cache pip in Travis 2015-10-02 16:49:10 -07:00
Fabian Affolter
7f1da8b7bc Add worldclock sensor 2015-10-02 23:49:32 +02:00
Fabian Affolter
58ac4be24c Add worldclock sensor 2015-10-02 23:49:00 +02:00
Paulus Schoutsen
b2919c6504 Fix gps accuracy issue 2015-10-02 13:49:55 -07:00
badele
db509ccf18 Add a light & switch rfxtrx sender capability 2015-10-02 22:39:30 +02:00
Paulus Schoutsen
3863d2985a Merge pull request #475 from toddeye/group-state-openclose
Add STATE_OPEN/STATE_CLOSED to groupable states
2015-10-02 09:30:27 -07:00
Paulus Schoutsen
0180c056e1 Add away mode to heat control 2015-10-02 08:57:38 -07:00
Paulus Schoutsen
e6cd9a6dc7 Merge pull request #459 from auchter/limitlessled-white
Add support for white LimitlessLED devices and multiple bridges
2015-10-02 08:55:34 -07:00
Todd Ingarfield
33028dd143 Add STATE_OPEN/STATE_CLOSED to groupable states 2015-10-02 10:53:36 -05:00
Paulus Schoutsen
9bdfa89b7c More robust geofence checking 2015-10-02 08:16:53 -07:00
Paulus Schoutsen
42b80868d4 Update netdisco dependency 2015-10-02 06:48:46 -07:00
Fabian Affolter
707ca4b752 Update docstrings 2015-10-02 13:42:06 +02:00
Fabian Affolter
c7d2a09097 Update docstring 2015-10-02 13:41:51 +02:00
Fabian Affolter
fb9f83f8ad Update docstrings 2015-10-02 13:17:18 +02:00
Michael Auchter
52ebb2fb3b limitlessled: Add support for White Limitless LED bulbs
LimitlessLED bulbs actually come in three flavors: RGB, RGBW, and White. The
ledcontroller library used to control these bulbs only supports RGBW and White
bulbs. This changelist adds support for the White bulb variant.

The White bulbs are a bit annoying in that they don't support absolute
brightness or color temperature adjustments; they only support a relative
"increase" or "decrease" adjustment. This, along with the unreliable, one-way
communication medium that requires repeats to be "sure" that the bulb received a
command, makes implementing brightness control difficult. So, for now, these
bulbs are more limited than the RGBW variants and only support On/Off control.
2015-10-01 22:38:50 -05:00
Michael Auchter
ea7ca48ba2 limitlessled: Add support for previous configuration format
Quick hack that preserves functionality of existing configuration formats to
ease upgrades.
2015-10-01 22:38:50 -05:00
Michael Auchter
ab80af099c limitlessled: Add support for multiple bridges
This adds support for a controlling multiple Limitless LED bridges.
2015-10-01 22:38:50 -05:00
Michael Auchter
34531895a0 limitlessled: Use LedControllerPool
This change is in preparation for adapting this component to support multiple
LimitlessLED bridges. Ultimately LedControllerPool helps to maintain the
mandatory 100ms pauses across multiple controllers so messages are reliably
received.
2015-10-01 22:38:50 -05:00
Michael Auchter
645cd89406 limitlessled: fix docstring 2015-10-01 22:38:49 -05:00
Paulus Schoutsen
cc5217d818 Merge pull request #463 from adrienbrault/plex
Finish plex implementation
2015-10-01 18:30:24 -07:00
Adrien Brault
e454806669 Finish plex implementation 2015-10-01 21:14:29 +02:00
Paulus Schoutsen
726557b2f6 Sensor.rest: verify SSL by default 2015-09-30 23:17:08 -07:00
Paulus Schoutsen
c7e22e6910 Merge pull request #467 from adrienbrault/sensor-path-nossl
Allow to skip ssl and specify variable path for rest sensor
2015-09-30 23:14:24 -07:00
Adrien Brault
f66a020bfc Allow to skip ssl and specify variable path for rest sensor 2015-10-01 05:54:31 +02:00
Paulus Schoutsen
64a73f6b67 Update pywemo dependency 2015-09-30 00:12:00 -07:00
Paulus Schoutsen
ad7f034805 MQTT: Auto provide cloudmqtt cert 2015-09-30 00:09:35 -07:00
Paulus Schoutsen
76674d4de9 MQTT: Allow certificates 2015-09-30 00:09:07 -07:00
Paulus Schoutsen
0dc9f2a9f8 Move MQTT to own folder 2015-09-29 23:55:16 -07:00
Paulus Schoutsen
ce47b58a8b Report MQTT connect issues 2015-09-29 23:34:17 -07:00
Paulus Schoutsen
5d71d5560e update rpi_gpio comment 2015-09-29 23:11:32 -07:00
Paulus Schoutsen
1dc9bfdf73 Update config zones 2015-09-29 23:08:37 -07:00
badele
cc47e39006 Add send capability 2015-09-29 22:47:22 +02:00
Paulus Schoutsen
2eb36c18bd Add geofencing to automation 2015-09-29 00:18:52 -07:00
badele
d64f0ddd41 Refactoring the code for pylint & flake test 2015-09-29 08:20:25 +02:00
Paulus Schoutsen
5ad27d8cdb Add support for zones to Home Assistant 2015-09-28 23:13:13 -07:00
Paulus Schoutsen
68c2b539ee More flexible domain config extraction 2015-09-28 23:09:05 -07:00
sfam
e57b3ae847 add manual alarm 2015-09-28 23:36:46 +00:00
Paulus Schoutsen
755234369d New frontend build 2015-09-27 22:05:03 -07:00
Paulus Schoutsen
0a34e8de02 Fix services.yaml in packaging 2015-09-27 21:56:15 -07:00
Paulus Schoutsen
52ed25fc21 Merge pull request #394 from pavoni/hue-scenes
Fuzzy match for float attributes for Philips Hue scenes
2015-09-27 21:41:59 -07:00
Paulus Schoutsen
9e866680d4 Merge pull request #456 from balloob/service-fields
Service fields
2015-09-27 21:07:48 -07:00
pavoni
80c89d218b Avoid throwing an exception when a wemo device with attributes isn't found 2015-09-27 21:05:45 -07:00
Paulus Schoutsen
4f1bf7b2bf Merge pull request #443 from CCOSTAN/patch-2
Added some additional examples.
2015-09-27 20:48:01 -07:00
Paulus Schoutsen
e557e355db Merge pull request #458 from AnthemisFoundry/fix_vera_dict
Fix Vera bug
2015-09-27 18:26:47 -07:00
badele
174aeacd76 Fix duplicate devices insertion 2015-09-27 23:51:19 +02:00
pavoni
e7320fe969 Default dict if parent class returned None 2015-09-27 17:06:49 +01:00
badele
321a603bfe Add a light & switch rfxtrx support 2015-09-27 11:13:49 +02:00
Paulus Schoutsen
4e3bd5f2a9 Add service descriptions 2015-09-26 23:17:04 -07:00
Paulus Schoutsen
9a6b2c1831 Add utf-8 encoding to const file 2015-09-26 06:57:22 -07:00
sfam
ca0b6ebd99 Merge pull request #397 from sfam/dev
Add MQTT alarm
2015-09-25 23:55:47 +01:00
sfam
47cd0b20a0 Merge branch 'persandstrom-sfam-dev' into dev 2015-09-25 17:02:37 +00:00
sfam
98d051f870 Merge branch 'sfam-dev' of https://github.com/persandstrom/home-assistant into persandstrom-sfam-dev 2015-09-25 17:02:20 +00:00
Carlo Costanzo
5f98705100 Changed the automation example
Changed the automation example to match the examples on the website.
2015-09-25 11:03:16 -04:00
pavoni
63bf4db969 Remove trace 2015-09-25 15:51:09 +01:00
pavoni
3ec00ce4fe Fix format errors 2015-09-25 15:49:56 +01:00
Paulus Schoutsen
74a0e47ba6 Update frontend with badge fixes 2015-09-25 07:44:58 -07:00
pavoni
476e4f0517 Add doc strings 2015-09-25 13:37:47 +01:00
pavoni
61fb8271e5 Change scene matching to use fuzzy logic for float values, if requested 2015-09-25 13:26:43 +01:00
Per Sandström
5cf9bd7223 updates to support ui 2015-09-25 06:23:04 +02:00
Paulus Schoutsen
9f986c55e6 Merge pull request #435 from toddeye/notify-smtp-retry
Added retry logic if the SMTP connection is disconnected by the server.
2015-09-24 17:15:05 -07:00
sfam
94eb54ff00 Merge branch 'dev' of https://github.com/balloob/home-assistant into dev 2015-09-24 21:19:21 +00:00
Per Sandström
f28b392f1a Merge branch 'dev' of https://github.com/sfam/home-assistant into sfam-dev 2015-09-24 22:21:51 +02:00
Carlo Costanzo
fa71d5fac9 Update configuration.yaml.example 2015-09-24 15:57:23 -04:00
Carlo Costanzo
21fd53b05d Added some additional examples.
- Added an eample of Groups within Groups.
- Took away the Automation 2 and used the new -Alias format.
- Added a second sensor to demonstrate sensor:, sensor 2: format.
2015-09-24 15:56:26 -04:00
Todd Ingarfield
b0b3c2f73f formatting correction 2015-09-24 11:20:25 -05:00
Paulus Schoutsen
d660d2b3dc Update frontend (group toggle updates) 2015-09-24 09:04:22 -07:00
Todd Ingarfield
a89bfcf342 removed exception attributes 2015-09-24 10:55:24 -05:00
Todd Ingarfield
a42347e6e7 corrected formating and style issues 2015-09-24 10:47:19 -05:00
Paulus Schoutsen
faee3e8447 Merge pull request #360 from fabaff/rest-sensor
Rest sensor
2015-09-23 23:53:09 -07:00
Paulus Schoutsen
3625646c34 Fix reproduce_state 2015-09-23 23:35:08 -07:00
Paulus Schoutsen
5a562f3db8 Update frontend 2015-09-23 23:32:41 -07:00
Paulus Schoutsen
19705ab40a Hide auto groups from logbook 2015-09-23 23:20:20 -07:00
Paulus Schoutsen
20bf9f7ea1 Update frontend with group toggle 2015-09-23 23:20:20 -07:00
Paulus Schoutsen
6399c873f9 Add gps location to device tracker demo 2015-09-23 23:20:20 -07:00
Paulus Schoutsen
4be1053f1c Merge pull request #437 from balloob/handle-play-states
Support media_player Play States When Resolving/Reproducing State
2015-09-23 22:52:38 -07:00
Jon Maddox
efdd0c9e8a don't break the chain 2015-09-24 01:35:08 -04:00
Jon Maddox
8d42e42230 style 2015-09-24 00:38:18 -04:00
Paulus Schoutsen
4b6878f91c Restrict data from stream API 2015-09-23 21:35:23 -07:00
Jon Maddox
90f35b35cd moar derp 2015-09-24 00:20:17 -04:00
Jon Maddox
082920abe0 moar constants 2015-09-24 00:20:05 -04:00
Jon Maddox
4a8bbc52e0 derp 2015-09-24 00:15:36 -04:00
Jon Maddox
1674c8309a Support playing, pausing states for media players when reproducing state
This allows the state helper to call the correct service call for
media_players when attempting to resolve state.
2015-09-24 00:06:05 -04:00
Paulus Schoutsen
62f016e7d2 Filter api password from arguments 2015-09-23 20:56:34 -07:00
Stefan Jonasson
34e5ecb8ab Merge pull request #433 from stefan-jonasson/fix_telldus_libary_cleanup
Telldus libary version update + added callback cleanup
2015-09-23 12:15:31 +02:00
Stefan Jonasson
8f95885e3a Codestyle cleanup 2015-09-23 11:47:53 +02:00
Stefan Jonasson
94db1ac142 Codestyle cleanup 2015-09-23 11:46:55 +02:00
Stefan Jonasson
f48e65096a Removed logging. 2015-09-23 11:38:47 +02:00
Stefan Jonasson
3244975489 Removed logging. 2015-09-23 11:37:45 +02:00
Stefan Jonasson
10327795e9 Added more logging. 2015-09-23 11:34:20 +02:00
Stefan Jonasson
bcbb8edd59 Added more logging. 2015-09-23 11:30:46 +02:00
Stefan Jonasson
86270e1a37 Added more logging. 2015-09-23 11:27:25 +02:00
Stefan Jonasson
de7a34b648 Added more logging. 2015-09-23 11:25:08 +02:00
Stefan Jonasson
82a06279de Added more logging. 2015-09-23 11:22:32 +02:00
Stefan Jonasson
62af1fcc57 Added more logging. 2015-09-23 11:19:27 +02:00
Stefan Jonasson
6afe99dcc7 Added more logging. 2015-09-23 11:14:47 +02:00
Stefan Jonasson
b6bf398859 Added callback logging. 2015-09-23 11:07:37 +02:00
Stefan Jonasson
48df06d1c0 Added callback logging. 2015-09-23 10:18:45 +02:00
Stefan Jonasson
b4ca691822 Removed the check for callback_dispatcher 2015-09-23 09:52:58 +02:00
Stefan Jonasson
16c2827465 Removed the check for callback_dispatcher 2015-09-23 09:50:12 +02:00
Stefan Jonasson
e90fd3d654 Removed the check for callback_dispatcher 2015-09-23 09:43:16 +02:00
Stefan Jonasson
7d0ff6884c Added the req consts 2015-09-23 09:32:11 +02:00
Stefan Jonasson
a9ea8972dd Updated required tellcore version 2015-09-23 08:29:57 +02:00
Stefan Jonasson
a0c1202ad6 Try to make the connection to the tellcore library more stable 2015-09-23 08:26:40 +02:00
Fabian Affolter
1bf45c8f33 Merge branch 'rest-sensor' of github.com:fabaff/home-assistant into rest-sensor 2015-09-23 01:25:53 +02:00
Fabian Affolter
c5094438de Add post option, correction_factor, and decimal_places 2015-09-23 01:17:28 +02:00
Fabian Affolter
60d45ebf79 Add return value 2015-09-23 01:17:28 +02:00
Fabian Affolter
5df2a1cf76 Add new checks and move var check to setup 2015-09-23 01:17:28 +02:00
Fabian Affolter
f5b2fa6fbe Remove left-over 2015-09-23 01:17:28 +02:00
Fabian Affolter
03b2ced24e Add rest sensor 2015-09-23 01:17:28 +02:00
Fabian Affolter
6c18f264f3 Add rest sensor 2015-09-23 01:17:28 +02:00
sfam
cdc371c3ee merge requires_code and code_format properties 2015-09-22 21:40:45 +00:00
Heiko Rothe
1553844279 Added support for the newest tp-link firmware
Currently this seemingly only applies to the Archer C9
2015-09-22 22:48:43 +02:00
Paulus Schoutsen
826b3be087 Update coveragerc 2015-09-22 13:25:18 -07:00
Paulus Schoutsen
f5000d401b Merge pull request #430 from CCOSTAN/patch-1
Minor comment about weather components & LONG:LAT.
2015-09-22 13:11:24 -07:00
Carlo Costanzo
7443f4faf8 Minor comment about weather components & LONG:LAT.
Super Small edit adding in a # about the weather related information.
2015-09-22 15:53:16 -04:00
Heiko Rothe
582ed1fc8d Merge remote-tracking branch 'balloob/dev' into dev 2015-09-22 19:48:39 +02:00
Malte Deiseroth
ef76047ba2 new try to add everythin from the stylecheckers 2015-09-22 13:27:08 +02:00
Malte Deiseroth
d475e5362b respect flake8 errors 2015-09-22 12:53:44 +02:00
Malte Deiseroth
3027b4a5a8 respect pylint suggestions 2015-09-22 12:32:45 +02:00
Malte Deiseroth
3829abbd2d updated with remote 2015-09-22 12:18:00 +02:00
Malte Deiseroth
e6e3b37a62 merged with current dev 2015-09-22 12:11:57 +02:00
Paulus Schoutsen
3158db9553 Update tile provider 2015-09-21 23:19:42 -07:00
Paulus Schoutsen
46a0173e31 Add demo device tracker platform 2015-09-21 22:46:08 -07:00
Paulus Schoutsen
7e511bcacf Fix iPhone map issues 2015-09-21 22:23:17 -07:00
Paulus Schoutsen
d7fd2ccdaf Merge pull request #316 from fabaff/systemd
Systemd service unit file
2015-09-21 19:45:12 -07:00
Todd Ingarfield
b2999ae325 Added retry logic if the SMTP connection is disconnected by the server. 2015-09-21 18:54:30 -05:00
Per Sandström
5033c1fcb7 Merge branch 'dev' of https://github.com/sfam/home-assistant into sfam-dev 2015-09-21 21:18:46 +02:00
Jeff Schroeder
e492be299b Merge pull request #417 from miniconfig/plex-dev
Plex media player component
2015-09-21 11:44:33 -05:00
miniconfig
03e7281406 Moved plexapi import into setup_platform().
Changed CONTRIBUTING.md to refer to requirements_all.txt instead of requirements.txt
2015-09-21 11:59:55 -04:00
miniconfig
16d75b2981 Added plexapi library to requirements_all.txt 2015-09-21 11:45:52 -04:00
miniconfig
cc7784889a Pylint errors 2015-09-21 11:11:38 -04:00
miniconfig
d267f0a04c Removed references to the frontend device parameter in the directions and added some clarification.
Fixed plexapi version number.
2015-09-21 10:59:34 -04:00
miniconfig
a8e0ca6d3f Fixed various property methods to make sure they all had a fall through return and removed unnecessary "else" statements 2015-09-21 10:44:24 -04:00
Stefan Jonasson
f8175adbdc Merge pull request #420 from stefan-jonasson/dev
Fixed Pylint issue
2015-09-21 13:03:16 +02:00
Stefan Jonasson
6437f6f6b4 Desperate try to fix travis ci reporting a unused-argument 2015-09-21 12:57:11 +02:00
Paulus Schoutsen
27bbfbae62 Fix compilation issue frontend 2015-09-21 00:42:23 -07:00
Stefan Jonasson
2785c373fb E302 expected 2 blank lines, found 1 2015-09-21 08:26:14 +02:00
Paulus Schoutsen
acddae3747 Initial support for maps in frontend 2015-09-20 23:14:58 -07:00
Stefan Jonasson
d3e9a22759 Added pylint hint! 2015-09-21 08:14:11 +02:00
Paulus Schoutsen
ca698ff063 remove debug statement 2015-09-20 20:24:31 -07:00
Paulus Schoutsen
a866d515f7 Make owntracks more robust 2015-09-20 20:09:53 -07:00
Paulus Schoutsen
3af4f267b3 Lint script would incorrectly report success 2015-09-20 19:56:10 -07:00
Paulus Schoutsen
bd61555698 discovery: Update to netdisco 0.4.1 2015-09-20 19:46:33 -07:00
miniconfig
5027acfda1 Fixed additional pylint and flake issues 2015-09-20 16:13:26 -04:00
stefan-jonasson
f0991d63d1 Merge pull request #416 from stefan-jonasson/dev
Fix states not updating after command was sent!
2015-09-20 22:00:12 +02:00
Stefan Jonasson
34f36479c6 Fix states not updating after command was sent! 2015-09-20 21:29:38 +02:00
Paulus Schoutsen
506c88dbaf Fix owntracks bugs 2015-09-20 12:13:51 -07:00
Paulus Schoutsen
98a1addc18 Merge pull request #413 from balloob/owntracks
initial owntracks support
2015-09-20 12:00:11 -07:00
Paulus Schoutsen
30492cc685 Fix tests and linting 2015-09-20 11:46:01 -07:00
Paulus Schoutsen
0d09e2e1df Attempt to fix CI scripts 2015-09-20 11:00:35 -07:00
Paulus Schoutsen
81085c7467 Merge pull request #414 from stefan-jonasson/telldus_callback_fix
Telldus callback fix
2015-09-20 10:25:34 -07:00
Paulus Schoutsen
19d40612e6 Add home_range to device tracker 2015-09-20 09:35:03 -07:00
miniconfig
48306ddbf6 Fixed Requirements URL 2015-09-20 08:19:21 -04:00
Stefan Jonasson
a60a9202a5 cleanup 2015-09-20 14:17:32 +02:00
Stefan Jonasson
ab81231e6d Changed flow so we got one callback per platorm instead of per device which caused race conditions in the telldus library. 2015-09-20 14:11:42 +02:00
Paulus Schoutsen
68286dcef8 initial owntracks support 2015-09-20 00:27:50 -07:00
Paulus Schoutsen
6e96f915f6 Merge pull request #411 from stefan-jonasson/tellstick_callbacks
Fix for issue: #204
2015-09-19 22:54:48 -07:00
Paulus Schoutsen
620a7eadf4 Add release script 2015-09-19 21:33:24 -07:00
Paulus Schoutsen
2332548cf4 Update version to 0.7.4dev 2015-09-19 21:19:45 -07:00
Paulus Schoutsen
dc55525206 Merge branch 'dev' 2015-09-19 21:19:20 -07:00
Paulus Schoutsen
9318b36ac2 0.7.3 release 2015-09-19 21:17:10 -07:00
Paulus Schoutsen
46f6653183 New version frontend 2015-09-19 21:16:47 -07:00
Paulus Schoutsen
9736761968 Merge pull request #412 from balloob/dev
0.7.3rc2
2015-09-19 21:07:24 -07:00
Paulus Schoutsen
6352f10d9e Device tracker minor tweak 2015-09-19 21:02:54 -07:00
Paulus Schoutsen
2a3b911d7b Remove debug statement 2015-09-19 21:02:38 -07:00
Paulus Schoutsen
720e5876a7 Fix broken automation test 2015-09-19 21:02:28 -07:00
Paulus Schoutsen
85489010bc Merge pull request #404 from stefan-jonasson/automation_confg_list
Automation confg lists
2015-09-19 20:53:26 -07:00
Stefan Jonasson
60d8266ce0 Fix for issue:
Tellstick switches status changes aren't realtime #204
2015-09-20 00:57:04 +02:00
sfam
e29deb0202 add a code_format property on alarm object and a optional code for its MQTT platform 2015-09-19 22:22:37 +00:00
Paulus Schoutsen
268b0f17d0 Merge pull request #409 from persandstrom/initd_restart
hass-daemon restart fix
2015-09-19 14:32:19 -07:00
Per Sandström
49ce85f2e4 fixed restart 2015-09-19 22:45:30 +02:00
Paulus Schoutsen
1771f8b1b3 Fix logbook crashing on custom state_changed events 2015-09-19 13:13:28 -07:00
Paulus Schoutsen
8cd1c42e80 Merge pull request #407 from balloob/testing-upgrade
Fix CI
2015-09-19 12:55:09 -07:00
Paulus Schoutsen
ec1d5e617e Fix CI 2015-09-19 12:29:23 -07:00
Stefan Jonasson
40651ef2bc Fixed old config value conversion
Added a new unit test for the config list mode
2015-09-19 21:13:09 +02:00
miniconfig
64741a95b8 Added requirements 2015-09-19 14:16:57 -04:00
miniconfig
a24b38aacc Initial version of plex media player component 2015-09-19 13:48:45 -04:00
Paulus Schoutsen
55f6ff86e4 Merge pull request #405 from balloob/automation-event
Event automation fuzzy matches on data
2015-09-19 10:43:02 -07:00
Paulus Schoutsen
79cdda2bd9 Merge pull request #406 from balloob/automation-action-config
Change automation action config keys
2015-09-19 10:42:37 -07:00
sfam
35eed93443 add a requires_code property on alarm object 2015-09-19 17:32:37 +00:00
Paulus Schoutsen
dd4e1cbd1d Change automation action config keys 2015-09-19 08:43:56 -07:00
Stefan Jonasson
2084976bc2 Fixed suggestions from @balloob 2015-09-19 17:42:21 +02:00
Paulus Schoutsen
9019d654d7 Event automation fuzzy matches on data 2015-09-19 08:27:34 -07:00
Paulus Schoutsen
e0f6239ef3 Merge pull request #403 from stefan-jonasson/script_entity_id_buggfix
Buggfix consistent configuration for scripts calling scripts
2015-09-19 08:20:23 -07:00
Stefan Jonasson
b9e1b3eb99 Fixed var name + flake8 2015-09-19 15:51:50 +02:00
Stefan Jonasson
e1a7b8f988 Merge branch 'dev' of https://github.com/balloob/home-assistant into automation_confg_list 2015-09-19 15:27:46 +02:00
Stefan Jonasson
be9cfbdeb0 Fixed docblock 2015-09-19 14:45:56 +02:00
Fabian Affolter
a32229b4ce Allow decimal numbers (Thanks @luxus) 2015-09-19 11:48:24 +02:00
Paulus Schoutsen
7da104af4e Merge pull request #399 from persandstrom/redirect_output
remove output in terminal after service is started
2015-09-18 15:47:33 -07:00
Per Sandström
9d7aef94e0 remove output in terminal after service is started 2015-09-18 21:51:24 +02:00
Stefan Jonasson
e4c5108c9d Implemented configuration loading from 2015-09-18 18:12:27 +02:00
sfam
fc946da5db Add MQTT alarm 2015-09-18 15:30:34 +00:00
Fabian Affolter
b33714bca3 Fix default value for correction_factor (Thanks @luxus) 2015-09-18 16:41:35 +02:00
Fabian Affolter
722af9014d Update import style 2015-09-18 16:25:52 +02:00
pavoni
6abaebb248 More consistant naming 2015-09-18 14:40:00 +01:00
pavoni
c01e9bea2b Fix inconsistant naming 2015-09-18 14:38:15 +01:00
Fabian Affolter
5ce4ade737 Add user and change config dir 2015-09-18 14:18:49 +02:00
Fabian Affolter
9ce8f385d2 Rename service unit file 2015-09-18 14:15:42 +02:00
Fabian Affolter
d7464aea86 Initial systemd service unit file 2015-09-18 14:14:10 +02:00
Fabian Affolter
071952462c initial systemd service unit file 2015-09-18 13:49:46 +02:00
pavoni
ab79b8a541 First cut of write after set for scenes 2015-09-18 12:34:24 +01:00
pavoni
3a3374ed4b Remove incorrect change 2015-09-18 12:34:02 +01:00
pavoni
4d53fa0173 First draft of read_after_set for scenes 2015-09-18 12:21:08 +01:00
pavoni
5369d8c61c Merge remote-tracking branch 'upstream/dev' into dev 2015-09-18 08:51:54 +01:00
Paulus Schoutsen
6c1f44242c Update setup script 2015-09-17 23:55:47 -07:00
Paulus Schoutsen
4371355be1 Better errors on time automation trigger 2015-09-17 23:12:55 -07:00
Paulus Schoutsen
5bb88909a0 Merge pull request #392 from balloob/test-runner
Use pytest for running tests
2015-09-17 19:21:33 -07:00
Paulus Schoutsen
4b0c416844 Use pytest for running tests 2015-09-17 09:08:58 -07:00
Paulus Schoutsen
737d7c9d22 Add travis install section back 2015-09-17 08:54:56 -07:00
Paulus Schoutsen
15be5ced9a Merge pull request #391 from balloob/scripts-to-rule-them-all
First pass for scripts to rule them all
2015-09-17 08:49:41 -07:00
Paulus Schoutsen
7c549db2d6 Merge pull request #386 from SEJeff/quiet-logging
[RFC] Quiet logging
2015-09-17 08:48:00 -07:00
Paulus Schoutsen
6e6aa15f7c Merge pull request #390 from balloob/restart-osx
Add a Way to Restart on OS X
2015-09-17 08:42:54 -07:00
Jon Maddox
e0c1885a71 add blank line 2015-09-17 03:52:04 -04:00
Paulus Schoutsen
049cd159ce Fix dev dependency pytest 2015-09-17 00:44:22 -07:00
Paulus Schoutsen
95e05d4fc9 Make script/bootstrap_server executable 2015-09-17 00:42:15 -07:00
Paulus Schoutsen
bf14067eb0 Add exec + doc header 2015-09-17 00:38:52 -07:00
Paulus Schoutsen
8c77418b6a First pass for scripts to rule them all 2015-09-17 00:35:26 -07:00
Jon Maddox
d25a42426a add a way to restart on os x 2015-09-17 03:25:36 -04:00
Paulus Schoutsen
3ed102cd88 Merge pull request #388 from stefan-jonasson/dev
[Bugfix] - Time trigger fired all the time when using the "from" param
2015-09-17 00:10:13 -07:00
Stefan Jonasson
90e2aefd23 flake8 fix 2015-09-17 08:55:17 +02:00
Stefan Jonasson
47af247d6a flake8 fix 2015-09-17 08:39:41 +02:00
Paulus Schoutsen
3947ed3c2b Merge pull request #389 from balloob/pip-fixes
Fix pip not detecting package installed
2015-09-16 23:38:59 -07:00
Stefan Jonasson
1a00d4a095 pylint fix 2015-09-17 08:35:18 +02:00
Fabian Affolter
ccecc0181d Remove blank line 2015-09-17 08:34:26 +02:00
Fabian Affolter
e90dbad37e Update docstrings 2015-09-17 08:34:10 +02:00
Fabian Affolter
8ec0c36457 Fix return value 2015-09-17 08:29:50 +02:00
Stefan Jonasson
e68cc83e64 return and output error if none of the 4 keys provided
only parse hour/minute/second if after is not available
2015-09-17 08:24:06 +02:00
Paulus Schoutsen
4ad4d74ed4 Fix pip not detecting package installed 2015-09-16 23:18:47 -07:00
Jeff Schroeder
550f31d4c3 Quiet down some of the logging in the sonos platform
This is due to the soco library logging very excessively and it using
requests to connect to each Sonos speaker every 10 seconds (by default).

This makes the logs much more pleasant to use for finding real issues.
2015-09-16 23:11:57 -05:00
Jeff Schroeder
7e42b35b62 Set logging of SQL queries to sqlite as debug log messages 2015-09-16 23:11:57 -05:00
Stefan Jonasson
9b96471182 Fixed after param 2015-09-16 22:46:21 +02:00
Paulus Schoutsen
3c3eadbef5 Update frontend with alarm ui 2015-09-16 08:59:42 -07:00
Paulus Schoutsen
f375bc527a Merge pull request #358 from persandstrom/alarmui
Alarm Control Panel
2015-09-16 08:56:03 -07:00
Malte Deiseroth
ce501ae627 Improved onewire configuration 2015-09-16 14:17:41 +02:00
deisi
b6f954e082 Changed handling of config file
I tried to implement your suggesteions for the default handlig of the device names. I think this way, everything you wanted is in.
2015-09-16 10:18:11 +02:00
deisi
b368388714 Update .gitignore 2015-09-16 08:49:12 +02:00
Paulus Schoutsen
6de04d78ed Merge pull request #381 from heathbar/foscam-support
Foscam support
2015-09-15 23:37:33 -07:00
Paulus Schoutsen
86aea83f64 Device tracker improvements 2015-09-15 23:35:28 -07:00
Malte Deiseroth
8842e4e94f gitignore ready for emacs 2015-09-16 08:34:08 +02:00
Heath Paddock
98feb3cd93 Fixed pylint errors 2015-09-16 00:40:51 -05:00
Paulus Schoutsen
5af1643297 Add warning when entity not found in reproduce_state 2015-09-15 22:23:07 -07:00
Heath Paddock
3dcd18af9e Fixed flake8 errors 2015-09-16 00:09:16 -05:00
Heath Paddock
2fd7b98cab minor code cleanup 2015-09-15 23:45:12 -05:00
Heath Paddock
90e21791f6 Removed obsolete code 2015-09-15 23:39:03 -05:00
Heath Paddock
9678613a13 foscam: made 'port' configurable and added additional documentation 2015-09-15 23:32:55 -05:00
Heath Paddock
5de89316b2 Initial implementation of Foscam FI9821W support 2015-09-15 22:58:46 -05:00
Paulus Schoutsen
95eabe7c0e Freeze time for sun automation test 2015-09-15 20:18:24 -07:00
Paulus Schoutsen
9bec0316ea Merge pull request #380 from balloob/better-itunes-speaker-names
Append 'AirTunes Speaker' to Name of Devices Shared via itunes-api MediaPlayer
2015-09-15 18:53:47 -07:00
Jon Maddox
61685ea13d tag on " AirTunes Speaker" instead 2015-09-15 21:40:39 -04:00
Jon Maddox
77b9a12687 Tags the name of the device to the end of the name
This helps the media player be more explicit about itself and what it
is. It also namespaces it self a little better in the system. Rather
than be `media_player.family_room` it is
`media_player.family_room_apple_tv`. This helps for cases when there’s
another actual media player like Kodi or Chromecast in there.
2015-09-15 21:07:49 -04:00
Paulus Schoutsen
08f2a67de4 Allow falsy values for media player attributes 2015-09-15 12:58:19 -07:00
Paulus Schoutsen
58c3b03b79 Merge pull request #377 from balloob/automation-improvements
Automation improvements
2015-09-15 12:46:13 -07:00
Paulus Schoutsen
c18294ee76 Allow triggers to be used as condition 2015-09-15 08:56:06 -07:00
pavoni
408f0cff78 Merge remote-tracking branch 'upstream/dev' into dev 2015-09-15 14:30:01 +01:00
Paulus Schoutsen
0584c10ef9 Style fix 2015-09-15 00:11:24 -07:00
Paulus Schoutsen
ae527e9c6f Fix broken sun automation test 2015-09-15 00:07:49 -07:00
Paulus Schoutsen
1ec5178f66 Remove scheduler component 2015-09-15 00:05:20 -07:00
Paulus Schoutsen
2978e0dabe Add sun automation trigger 2015-09-15 00:02:54 -07:00
Paulus Schoutsen
e26f0f7b7d Update stale header doc 2015-09-15 00:02:46 -07:00
Paulus Schoutsen
2ff2a78e97 Merge pull request #376 from balloob/launchd
launchd Script for Starting at Boot and Backgrounding on OS X
2015-09-15 00:02:11 -07:00
Jon Maddox
bb172d8c98 indention 2015-09-15 02:58:13 -04:00
Jon Maddox
acb288f9e7 error handling when writing 2015-09-15 02:54:22 -04:00
Jon Maddox
c7565baa6d NOPE 2015-09-15 02:54:11 -04:00
Jon Maddox
fb29611c15 🔥 codecs 2015-09-15 02:51:23 -04:00
Jon Maddox
37cd62447e let it get overwritten 2015-09-15 02:50:15 -04:00
Jon Maddox
5cbcd72912 dupe 2015-09-15 02:48:23 -04:00
Jon Maddox
8bba0b88fd blocks! 2015-09-15 02:46:06 -04:00
Paulus Schoutsen
b1f17c2cd4 Merge pull request #356 from fabaff/command-sensor
Command sensor
2015-09-14 23:46:02 -07:00
Fabian Affolter
8017f7f241 Merge branch 'command-sensor' of github.com:fabaff/home-assistant into command-sensor 2015-09-15 08:42:47 +02:00
Fabian Affolter
1a73c1b991 Fix pylint issue 2015-09-15 08:40:54 +02:00
Fabian Affolter
039c5cd847 Change import ordering 2015-09-15 08:40:38 +02:00
Jon Maddox
3b27bef1ac DOCS 2015-09-15 02:35:20 -04:00
Jon Maddox
1fc2204ca9 get the right path 2015-09-15 02:30:19 -04:00
Jon Maddox
834ce5269d we don't actually have to do this 2015-09-15 02:30:13 -04:00
Jon Maddox
9ada5e6b2b move launchd script inside package 2015-09-15 02:29:57 -04:00
Paulus Schoutsen
f17ef0327c Merge pull request #366 from fabaff/glances
Glances sensor
2015-09-14 23:24:20 -07:00
Fabian Affolter
56a151b196 Add return value 2015-09-15 08:21:58 +02:00
Jon Maddox
6e927d68e5 don't need these anymore 2015-09-15 02:20:40 -04:00
Jon Maddox
fcad068016 strip the dash 2015-09-15 02:17:01 -04:00
Jon Maddox
e12cc2fbbf attempts at dodging pep8 terror 2015-09-15 02:12:31 -04:00
Jon Maddox
9588fcc5cc install scripts 2015-09-15 02:09:02 -04:00
Jon Maddox
a4aa2e4383 change vars 2015-09-15 02:08:43 -04:00
Fabian Affolter
fe074835f0 Fix pylint issue 2015-09-15 07:56:08 +02:00
Paulus Schoutsen
b2ad8db86b Add condition type to automation component 2015-09-14 22:51:28 -07:00
Paulus Schoutsen
20f021d05f Another style fix. Who comes up with this? 2015-09-14 22:14:15 -07:00
Paulus Schoutsen
fc43135ddd Style fix 2015-09-14 22:12:51 -07:00
Jon Maddox
e86ee9eae7 install/uninstall scripts for OS X 2015-09-15 01:07:25 -04:00
Jon Maddox
332f7621ce launchd script for loading HA at boot and background on OS X 2015-09-15 01:06:31 -04:00
Paulus Schoutsen
68c1dd7cd4 Refactor automation configuration 2015-09-14 22:05:40 -07:00
Paulus Schoutsen
fe2a9bb83e Fix numeric state if 2015-09-14 20:46:57 -07:00
Paulus Schoutsen
2f8591205f Merge pull request #375 from SEJeff/fix-asuswrt
Fix the asuswrt device tracker for dhcp leases with no hostname
2015-09-14 20:23:44 -07:00
Paulus Schoutsen
65c3184856 Merge pull request #373 from SEJeff/fix-sensor-entity-names
Make the entity names for systemmonitor sensors a bit nicer
2015-09-14 20:17:01 -07:00
Jeff Schroeder
0afb6114c5 Make the entity names for systemmonitor sensors a bit nicer
This prevents them from having trailing whitespace, which makes them
end with `_`.
2015-09-14 21:20:41 -05:00
Jeff Schroeder
7c7b6ca05c Fix the asuswrt device tracker for dhcp leases with no hostname
Sometimes, hosts request dhcp leases without sending the hostname
they want to the dhcp server. This results in the entity_id being
`device_tracker.` as the dev_id is empty and things go downhill
from there.

The dhcp lease file looks like:
    admin@RT-AC66R:/tmp/home/root# cat /var/lib/misc/dnsmasq.leases
    86400 5c:c5:d4:79:4c:ad 192.168.1.226 chit-jsl3 *
    85242 8c:77:12:ad:d9:23 192.168.1.126 android-2c94abebaab16255 01:8c:77:12:ad:d9:23
    61985 b8:e9:37:73:47:f0 192.168.1.204 * 01:b8:e9:37:73:47:f0
    61982 b8:e9:37:ec:0d:7e 192.168.1.132 * 01:b8:e9:37:ec:0d:7e
    84584 00:20:6b:ca:31:c1 192.168.1.182 MC4650-CA31C1 01:00:20:6b:ca:31:c1
    86306 fc:e9:98:d6:4b:90 192.168.1.173 iLol 01:fc:e9:98:d6:4b:90
    74343 20:3a:07:f3:7e:ae 192.168.1.246 gatekeeper 01:20:3a:07:f3:7e:ae
    72374 b8:e9:37:5f:3d:06 192.168.1.34 SonosZP 01:b8:e9:37:5f:3d:06
    64697 00:0e:58:6f:59:d2 192.168.1.171 SonosZB 01:00:0e:58:6f:59:d2

Confirmed working on an Asus RT-AC66R with fw version: 3.0.0.4.376_3861
2015-09-14 20:33:14 -05:00
Paulus Schoutsen
2fe8b154f1 Fix state automation configuration 2015-09-14 18:22:49 -07:00
Paulus Schoutsen
bf64956265 Merge pull request #368 from stefan-jonasson/dev
Implemented the if condition support in numeric state
2015-09-14 17:57:34 -07:00
Paulus Schoutsen
eb11486e76 Merge pull request #370 from balloob/airplay-speakers
Add AirPlay Speakers as media_players
2015-09-14 16:22:09 -07:00
Jon Maddox
e8c3eaab33 style tweaks 2015-09-14 17:39:43 -04:00
Jon Maddox
fcbeddeb57 describe airplay part 2015-09-14 17:34:57 -04:00
Jon Maddox
50b23e1969 adds airplay speakers as media_players 2015-09-14 17:27:00 -04:00
Fabian Affolter
984f01359c Fix docstring 2015-09-14 21:48:29 +02:00
Stefan Jonasson
d5198d4242 Implemented the if condition support in numeric state 2015-09-14 20:33:01 +02:00
Per Sandström
f5d1da1d53 and pylint... 2015-09-14 19:42:36 +02:00
Per Sandström
13ca42e187 fixes from review 2015-09-14 17:33:43 +02:00
Fabian Affolter
74eb577c58 Add glances sensor 2015-09-14 14:09:24 +02:00
Fabian Affolter
fe7134b897 Add glances sensor 2015-09-14 14:08:30 +02:00
Fabian Affolter
27845d3fc5 Allow decimal places to be set 2015-09-14 10:44:07 +02:00
Fabian Affolter
6606d2a73c Add command sensor 2015-09-14 10:07:27 +02:00
Fabian Affolter
6dc877d8de Add command sensor 2015-09-14 10:07:27 +02:00
Fabian Affolter
b0441aadc4 Add new checks and move var check to setup 2015-09-14 10:06:40 +02:00
Paulus Schoutsen
dd71e4fdd1 Record in logbook when automation triggered 2015-09-14 00:02:33 -07:00
Fabian Affolter
7e066e11ad Remove left-over 2015-09-14 08:55:20 +02:00
Paulus Schoutsen
13d40fe6ec Allow firing events in script 2015-09-13 23:54:48 -07:00
Paulus Schoutsen
7e75add144 Update nmap dependency 2015-09-13 23:35:12 -07:00
Paulus Schoutsen
2df26a0d1a Fix sensor.systemmonitor 2015-09-13 23:29:13 -07:00
Paulus Schoutsen
965730eb60 Allow setting name for command switch 2015-09-13 23:04:49 -07:00
Paulus Schoutsen
4c0ac6051f Merge pull request #364 from balloob/automation-if
Add if-condition to automation
2015-09-13 23:00:50 -07:00
Paulus Schoutsen
2a11d02fe4 Add if to automation 2015-09-13 22:27:27 -07:00
Paulus Schoutsen
046c5653cb Add latest version of polymer repo 2015-09-13 20:58:22 -07:00
Paulus Schoutsen
f86fcdcaf5 Merge pull request #363 from balloob/logbook-entry
Add custom entries to logbook
2015-09-13 20:52:09 -07:00
Paulus Schoutsen
835bc1c492 Fix style issue 2015-09-13 18:40:54 -07:00
Paulus Schoutsen
de5a2fee83 Add custom entries to logbook 2015-09-13 18:30:44 -07:00
Roy Hooper
209499e82b Reduce media player scan frequency to 10s 2015-09-13 20:54:20 -04:00
Roy Hooper
9b47241a46 switch to default polling cycle to solve multiple instance issue 2015-09-13 20:49:09 -04:00
Paulus Schoutsen
513f6e9c3c Merge pull request #353 from stefan-jonasson/dev
numeric_state automation platform
2015-09-13 17:13:06 -07:00
Paulus Schoutsen
9582eae48e Merge pull request #359 from rhooper/sonos-netdisco-fix
Prevent duplicate instances of sonos devices during netdisco
2015-09-13 13:56:10 -07:00
Roy Hooper
d4834ff408 Add hass property to Entity to prevent 'Attribute hass is None' error during self.update_ha_state 2015-09-13 16:53:31 -04:00
Roy Hooper
ce22f3c82d Implement unique_id to prevent duplicate devices 2015-09-13 16:53:31 -04:00
Fabian Affolter
246184507c Add rest sensor 2015-09-13 22:41:37 +02:00
Fabian Affolter
3f3b475d76 Add rest sensor 2015-09-13 22:41:16 +02:00
Fabian Affolter
40aa661340 Update docsstring 2015-09-13 22:27:28 +02:00
Per Sandström
6c3a78df30 fixed spelling 2015-09-13 21:07:16 +02:00
Per Sandström
964a1f9aef merge from dev 2015-09-13 21:00:51 +02:00
Stefan Jonasson
8360ab265c Not used to pylint and flake8 ... 2015-09-13 20:34:45 +02:00
Stefan Jonasson
e3dcb45879 Fixed pylint error 2015-09-13 20:27:11 +02:00
Per Sandström
683a80f5f4 tests pass 2015-09-13 20:21:02 +02:00
Stefan Jonasson
9904727cde homeassistant/components/automation/numeric_state.py:61:80: E501 line too long (80 > 79 characters)
The command "flake8 homeassistant" exited with 1.
2015-09-13 20:16:51 +02:00
Stefan Jonasson
e9da02d70c Fixed value error exception
Fixed unittest
2015-09-13 19:59:26 +02:00
Paulus Schoutsen
b0b88e606c Merge pull request #355 from SEJeff/minor-sonos-fix
Minor sonos fix
2015-09-13 10:17:05 -07:00
Jeff Schroeder
57a833f1a7 Fix a bug which causes the sonos component to occasionally pop
Had this happen when Sonos surround sound is playing from a TV. See this
for more details:

af9a5152fe/soco/core.py (L1060)
2015-09-13 12:13:35 -05:00
Paulus Schoutsen
e5e577108c Merge pull request #357 from balloob/sonos-discovery
Discover sonos devices
2015-09-13 08:16:09 -07:00
Paulus Schoutsen
51dd718282 Fix broken thermostat demo and prevent happening again 2015-09-13 08:08:46 -07:00
Paulus Schoutsen
40340ea832 Discover sonos devices 2015-09-13 07:48:50 -07:00
Stefan Jonasson
a2ca60159d Fixed logic 2015-09-13 13:05:36 +02:00
Stefan Jonasson
50f5f1860c Added a numeric_state automation platform test ( UNTESTED ) 2015-09-13 12:53:37 +02:00
Stefan Jonasson
8e89308a15 Added better handling if we did not get a value for the numeric check 2015-09-13 12:15:21 +02:00
Paulus Schoutsen
96cfff192a Fix space after HA started in logbook 2015-09-13 01:21:30 -07:00
Paulus Schoutsen
067993c8ab Logbook reverse sorting 2015-09-13 01:12:05 -07:00
Paulus Schoutsen
eef1e65244 Fix converting config device tracker 2015-09-13 00:48:52 -07:00
Paulus Schoutsen
134c870d2b Merge pull request #345 from balloob/device-tracker
Device tracker rewrite
2015-09-13 00:15:30 -07:00
Paulus Schoutsen
5edc4f148f Fix style 2015-09-13 00:10:59 -07:00
Paulus Schoutsen
880b5f0ad1 Add device_tracker.see service 2015-09-13 00:02:28 -07:00
Paulus Schoutsen
804b7669b7 Setup device tracker group at end of init 2015-09-12 23:08:16 -07:00
Paulus Schoutsen
81288cc988 Remove netgear discovery hack 2015-09-12 23:08:00 -07:00
Paulus Schoutsen
d4174f5e42 Fix device sun light trigger tests 2015-09-12 22:57:31 -07:00
Paulus Schoutsen
cfc23b0091 Speed up tests 2015-09-12 22:56:49 -07:00
Paulus Schoutsen
bb42e264cb Device tracker sets up group again 2015-09-12 22:56:31 -07:00
Per Sandström
c9bccadc40 fixed merge error 2015-09-13 07:48:34 +02:00
Per Sandström
ab6cb43d5b alarm component 2015-09-13 07:42:38 +02:00
Jeff Schroeder
4fa379419d Don't blow up if no sonos speakers are found
Also move the imports up so the latest pep8 doesn't complain
2015-09-12 23:10:24 -05:00
Paulus Schoutsen
b01ff81b47 Merge pull request #354 from rhooper/sonos
squash bug in volume_level (bad if statement)
2015-09-12 18:47:06 -07:00
Roy Hooper
6dcb87c54d squash bug in volume_level (bad if statement) 2015-09-12 21:42:36 -04:00
Paulus Schoutsen
6cfca09daf Merge pull request #352 from SEJeff/minor-fixes
A few minor bugfixes
2015-09-12 13:52:37 -07:00
Stefan Jonasson
4eba1250e9 Added a numeric_state automation platform 2015-09-12 21:42:52 +02:00
Jeff Schroeder
d4d798d71f Error gracefully when unable to connect to home.nest.com 2015-09-12 14:27:12 -05:00
Jeff Schroeder
3dc1dc6c6a A few minor cleanups in the http debug api server 2015-09-12 14:27:07 -05:00
Jeff Schroeder
473047f3dd Fix a small tyop in the history component 2015-09-12 14:27:03 -05:00
Jeff Schroeder
f5b5d3f65a Use str.split maxsplit in the time component 2015-09-12 14:26:59 -05:00
Jeff Schroeder
776c7dae07 Fix a tyop in the arduino switch component 2015-09-12 14:26:55 -05:00
Paulus Schoutsen
4ccedca3e5 Fix tests for device tracker 2015-09-12 09:15:28 -07:00
Paulus Schoutsen
d9b97ad5b4 Merge pull request #348 from Zyell/dev
Initial Thermostat Range Support
2015-09-12 08:07:52 -07:00
zyell
de89de890f Move state constants to __init__ for all thermostats 2015-09-12 07:27:05 -07:00
Paulus Schoutsen
5338b29edf Merge pull request #351 from maddox/itunes
Add iTunes media component
2015-09-11 21:53:03 -07:00
Jon Maddox
395dbe8804 drop the try 2015-09-12 00:50:40 -04:00
Jon Maddox
f41786d893 STYLE!!!! 2015-09-12 00:49:34 -04:00
Jon Maddox
34dee0c134 style and docs 2015-09-12 00:42:11 -04:00
Jon Maddox
705238eb78 dat slash 2015-09-12 00:23:12 -04:00
Jon Maddox
2b6e0da405 add docstring 2015-09-12 00:23:04 -04:00
Jon Maddox
9d750368ff moar style fixes 2015-09-12 00:16:51 -04:00
Paulus Schoutsen
7252861b83 Merge pull request #350 from rhooper/sonos
rudimentary sonos support
2015-09-11 21:00:53 -07:00
Roy Hooper
db2140782f follow proper calling convention for track_utc_time_change callback 2015-09-11 23:57:34 -04:00
Jon Maddox
b9f5ec9e2c style fixes 2015-09-11 23:49:43 -04:00
Jon Maddox
6d9b618f1c add mention of iTunes to README 2015-09-11 23:06:48 -04:00
Jon Maddox
a459368998 add itunes.py to .coveragerc 2015-09-11 23:06:17 -04:00
Jon Maddox
cb3f14a862 add iTunes component 2015-09-11 23:06:03 -04:00
Roy Hooper
e9367d5369 use own track_utc_time_change to poll every 5 seconds 2015-09-11 22:44:37 -04:00
Roy Hooper
c3dd94ba04 remove unnecessary self.update_ha_state calls 2015-09-11 22:43:55 -04:00
Paulus Schoutsen
6624cfefd6 Update kodi error reporting 2015-09-11 18:03:02 -07:00
Roy Hooper
350ed9f764 remove and disable pylint: disable=abstract-method for play_youtube() 2015-09-11 19:48:34 -04:00
Roy Hooper
3679a8078a put back play_youtube override 2015-09-11 19:44:18 -04:00
Roy Hooper
a25f7eed2b Enable polling and fix metadata updating.
Remove unnecessary methods.
Include SoCo in requirements_all.txt for CI.
Lock down SoCo version to 0.11.1
Add sonos.py to exclusions in .coveragerc
2015-09-11 19:38:42 -04:00
Roy Hooper
ae058b7847 tidy up formatting to make travis happy. 2015-09-11 18:55:23 -04:00
Roy Hooper
aa74c4e57a fix initialization 2015-09-11 18:52:31 -04:00
Roy Hooper
1b874c603b rudimentary sonos support 2015-09-11 18:44:42 -04:00
Paulus Schoutsen
050fe809e1 Merge pull request #343 from fabaff/arest-switch
aREST switch
2015-09-10 23:53:43 -07:00
Fabian Affolter
e2b02f2fd2 Update error message 2015-09-11 08:07:16 +02:00
zyell
775d3198ae Fix logic coverage in target_temperature 2015-09-10 17:46:59 -07:00
zyell
21812ba717 Bug fixes and state adjustment for initial thermostat range support 2015-09-10 15:42:34 -07:00
zyell
2d54fdd979 Initial code for generic thermostat range support and nest compliance 2015-09-10 15:11:59 -07:00
Fabian Affolter
e093abc366 Add arest switch 2015-09-10 21:26:51 +02:00
Fabian Affolter
5d3e929599 Add timeout 2015-09-10 21:23:33 +02:00
Fabian Affolter
1ec392a494 Add update 2015-09-10 21:23:33 +02:00
Fabian Affolter
d719dd72fe Add arest switch 2015-09-10 21:23:33 +02:00
Fabian Affolter
53b43dc4db Add timeout for requests 2015-09-10 21:21:14 +02:00
Fabian Affolter
f21d97d5a2 Add timeout for requests 2015-09-10 21:21:14 +02:00
Paulus Schoutsen
f9b17ab026 Device tracker rewrite 2015-09-09 23:37:15 -07:00
Paulus Schoutsen
e88fabbe6d Set development version number 2015-09-09 19:38:28 -07:00
Paulus Schoutsen
6e458114f4 Bump version 0.7.2 2015-09-09 19:38:04 -07:00
Paulus Schoutsen
0509b478e9 Bump version 0.7.2 2015-09-09 19:37:44 -07:00
Paulus Schoutsen
73797dad2d Merge pull request #341 from balloob/dev
0.7.2rc1
2015-09-09 19:36:47 -07:00
Paulus Schoutsen
2e8573b6bd Add arest sensor to coveragerc 2015-09-09 19:32:47 -07:00
Paulus Schoutsen
3a8119af2b Merge pull request #328 from MakeMeASandwich/dev
media_player: add Denon remote support
2015-09-09 19:28:35 -07:00
Paulus Schoutsen
9f9755c014 Fix wink dependencies 2015-09-09 12:40:28 -07:00
MakeMeASandwich
117a0018a5 media_player: remove debug messages, change IDLE to ON 2015-09-09 19:41:57 +02:00
MakeMeASandwich
34a6524019 Merge branch 'dev' of https://github.com/balloob/home-assistant into dev 2015-09-09 19:37:48 +02:00
Paulus Schoutsen
c971e50a68 Remove external from scripts and package info 2015-09-09 09:08:06 -07:00
Fabian Affolter
4d05650744 Merge pull request #342 from alanbowman/use-ozone-units
Use Dobson Units for ozone
2015-09-09 14:17:22 +02:00
Alan Bowman
c66f938919 Use Dobson Units for ozone 2015-09-09 09:48:43 +01:00
Fabian Affolter
fc21451446 Update docstring 2015-09-09 10:47:09 +02:00
Fabian Affolter
6a54ccb6b4 Update docstring 2015-09-09 09:37:45 +02:00
Paulus Schoutsen
ad99bd6a41 Merge pull request #340 from balloob/package-fixes
Package fixes
2015-09-08 20:35:48 -07:00
Paulus Schoutsen
dd23a0b3eb Fix sabnzbd imports 2015-09-08 20:22:13 -07:00
Paulus Schoutsen
89bdead44c Remove latest git submodules 2015-09-08 20:11:25 -07:00
Paulus Schoutsen
c68ee2dd0f Change dev version to adhere Python versioning 2015-09-08 19:49:51 -07:00
Paulus Schoutsen
326d23de38 Fix pip checking if zip files are installed 2015-09-08 19:49:27 -07:00
Paulus Schoutsen
3520255b7c Fix setup.py unicode version errors 2015-09-08 19:47:05 -07:00
Paulus Schoutsen
b0bd1fadac Fix encoding issue in setup.py 2015-09-08 17:43:41 -07:00
Paulus Schoutsen
4cd01f5516 Merge pull request #339 from persandstrom/squeezebox_player_id
Squeezebox: use id instead of name when updating players
2015-09-08 15:32:15 -07:00
Per Sandstrom
2fb2d5c1d6 use id instead of name when updating players 2015-09-08 20:59:54 +02:00
Paulus Schoutsen
77892dfa0d Merge pull request #331 from sfam/dev
Add optional QoS config parameter to MQTT sensor and switch
2015-09-08 08:38:55 -07:00
Paulus Schoutsen
8a3d9e6b8d Merge pull request #337 from fabaff/transmission
Update transmission configuration
2015-09-08 08:37:59 -07:00
Paulus Schoutsen
e61299a46f Merge pull request #326 from rmkraus/fix_pip
Fix pip installation issues.
2015-09-08 08:06:23 -07:00
Paulus Schoutsen
5b69719e95 Merge pull request #327 from fabaff/arest
aREST sensor
2015-09-08 08:02:25 -07:00
Fabian Affolter
0fb69c5ce4 Conditions are required 2015-09-08 16:33:13 +02:00
Fabian Affolter
922da1da44 Update docstring ('- type:' was removed a while ago) 2015-09-08 16:31:30 +02:00
Fabian Affolter
da508236e6 Remove '- type:' from configuration 2015-09-08 13:05:58 +02:00
Paulus Schoutsen
985f20d281 Merge pull request #335 from rhooper/utf-8-in-config
Handle UTF-8 in config file
2015-09-07 15:50:06 -07:00
Fabian Affolter
914a6dff5e Update docstring (config file) and attempt to honor PEP0257 2015-09-07 19:40:09 +02:00
Fabian Affolter
78a555faf5 Update docstring (config file) and attempt to honor PEP0257 2015-09-07 19:39:16 +02:00
Fabian Affolter
f18928d85b Update docstring (config file) and attempt to honor PEP0257 2015-09-07 19:23:24 +02:00
Fabian Affolter
e824bc4c55 Update docstring (config file) and attempt to honor PEP0257 2015-09-07 19:21:33 +02:00
Fabian Affolter
514b8eddb9 Update docstring (config file) and attempt to honor PEP0257 2015-09-07 19:19:11 +02:00
Fabian Affolter
1ed8e58679 Update docstring (config file) and attempt to honor PEP0257 2015-09-07 19:05:37 +02:00
Fabian Affolter
e55922eb9e Update docstring (config file) and attempt to honor PEP0257 2015-09-07 18:55:58 +02:00
Fabian Affolter
e196c136c1 Update docstring (config file) and attempt to honor PEP0257 2015-09-07 18:38:49 +02:00
Fabian Affolter
1d910f3a84 Update docstring (config file) and attempt to honor PEP0257 more 2015-09-07 18:35:00 +02:00
Fabian Affolter
f9cecdee28 Update docstring (config file) and attempt to honor PEP0257 2015-09-07 18:26:20 +02:00
Roy Hooper
d0cda964ac Handle UTF-8 in config file. 2015-09-07 10:56:16 -04:00
sfam
0f68b9d22b Add optional QoS config parameter to MQTT sensor and switch (pylint) 2015-09-07 00:28:45 +00:00
sfam
c5fc5cba61 Add optional QoS config parameter to MQTT sensor and switch 2015-09-07 00:16:31 +00:00
Fabian Affolter
1a88e48986 add throttle and other minor improvements 2015-09-06 23:41:01 +02:00
MakeMeASandwich
c7a8f5d6ca media_player: add Denon remote support 2015-09-06 12:07:12 +02:00
Fabian Affolter
72426e08b8 update errror message 2015-09-05 13:26:29 +02:00
Fabian Affolter
1c3fa89914 add arest sensor 2015-09-05 13:09:55 +02:00
Ryan Kraus
a097e9caf2 Reverted a line in package.py to its previous state. 2015-09-05 04:53:44 -04:00
Ryan Kraus
34c4bb585a Fix pip installation issues.
This commit is to fix issue #325.
There were three issues with the PIP installations.

1) If multiple instances of the same platform were found, pip could
attempt to install the same dependency multiple times at once by being
run simultaneously in different processes. This would cause pip
failures due to race conditions. This has been fixed by using a thread
lock to allow only one instance of PIP to run at a time.

2) PIP would not check the target if the dependency was already met.
This would lead to PIP attempting to reinstall every dependency on
every boot. This would eventually fail because the package was already
installed, but it significantly increased boot time, especially on
Raspberry Pis.

3) PIP would not upgrade packages that were already installed. Usually,
when a version is specified to PIP, it will install the specified
version if it is not already installed, even without the \-\-upgrade
flag. This behavior did not work when using the \-\-target flag. When
using the target flag, a new install is always attempted, but nothing
will be overwritten unless the \-\-upgrade flag is also given. This
caused new packages to not be installed when their dependencies were
increased. This is fixed by defaulting towards using the
\-\-upgrade flag.
2015-09-05 04:50:35 -04:00
Paulus Schoutsen
97eb84919b Merge pull request #324 from andythigpen/log-rotate
Add option to rotate log file daily.
2015-09-05 01:45:53 -07:00
Andrew Thigpen
2e636f598e Add option to rotate log file daily.
Adds a command line option to rotate the log daily at midnight and
retain up to the specified amount of days.
2015-09-04 19:52:59 -05:00
Paulus Schoutsen
03d187eceb Merge pull request #323 from andythigpen/skip-pip
Add option to skip pip install on startup.
2015-09-04 16:06:30 -07:00
sfam
bb9c50d0f1 Merge pull request #318 from sfam/dev
Support for trigger Maker IFTTT
2015-09-04 23:57:15 +01:00
Andrew Thigpen
6519e589b5 Add option to skip pip install on startup.
Since the requirements only change when the software is updated,
this adds a command line switch to disable pip installs on
startup.  The default behavior is maintained when the switch is
not specified.  Skipping pip helps a lot with startup on older RPi
hardware.
2015-09-04 16:50:57 -05:00
sfam
5b7dab6556 Support for trigger Maker IFTTT (fix pylint) 2015-09-04 22:42:11 +01:00
sfam
f9ad12920e Support for trigger Maker IFTTT (fix pylint) 2015-09-04 22:14:28 +01:00
sfam
56151a07a5 Support for trigger Maker IFTTT (pyfttt 0.3) 2015-09-04 21:58:09 +01:00
sfam
6c70ef2e6d upgrade pyfttt version to 0.3 2015-09-04 21:57:15 +01:00
Paulus Schoutsen
450ca842ca Update version number to 0.7.2-pre 2015-09-04 12:58:03 -07:00
Paulus Schoutsen
9cb735f48e Merge pull request #322 from Zyell/dev
Upstream bug fixed that caused error adding some nest thermostats
2015-09-04 12:42:47 -07:00
zyell
d10cecde7c Upstream bug fixed that caused error adding some nest thermostats 2015-09-04 12:00:47 -07:00
sfam
14fc4f6f99 Support for trigger Maker IFTTT (fix pylint) 2015-09-04 16:55:55 +01:00
sfam
b8e2bf6b7e Add pyfttt requirement for Maker IFTTT 2015-09-04 16:51:25 +01:00
sfam
1ffb4d9a55 Add ifttt.py to .coveragerc 2015-09-04 16:48:12 +01:00
sfam
fd032cf6b7 support for trigger Maker IFTTT 2015-09-04 16:28:58 +01:00
Paulus Schoutsen
97e19908be Merge pull request #308 from nkgilley/actiontec
add support for home_interval variable to actiontec component
2015-09-02 12:51:53 -07:00
Nolan Gilley
b9b751d234 fix for last_results 2015-09-02 12:00:20 -04:00
Nolan Gilley
5533618bd2 fix comments for home_interval 2015-09-02 11:48:36 -04:00
Nolan Gilley
5b643a8106 fixes for Paulus' comments. 2015-09-02 11:46:09 -04:00
Paulus Schoutsen
aa779ff6da Merge pull request #309 from michaelarnauts/dev
Fix for aruba device tracker
2015-09-01 18:26:54 -07:00
Michaël Arnauts
5099fb7680 Don't try to parse other entries in client list since they can be empty and are not used anyway. 2015-09-01 21:13:39 +02:00
Nolan Gilley
d2a13da930 pylint fix 2015-09-01 15:09:41 -04:00
Nolan Gilley
97076f1ff8 add support for home_interval variable 2015-09-01 14:43:14 -04:00
Paulus Schoutsen
3a5a94413b merge branch 'dev' 2015-09-01 08:50:56 -07:00
Paulus Schoutsen
03ceb667ba Hotfix for nmap -> v7.1 2015-09-01 08:50:45 -07:00
Paulus Schoutsen
40807f1ee0 Merge branch 'dev' 2015-09-01 01:56:18 -07:00
Paulus Schoutsen
abb8958775 Setup.py fixes 2015-09-01 01:56:13 -07:00
Paulus Schoutsen
ef141ef608 Add MANIFEST.in 2015-09-01 01:36:15 -07:00
Paulus Schoutsen
3ea91f917d Add MANIFEST.in 2015-09-01 01:36:00 -07:00
Paulus Schoutsen
ddeccf13af Merge pull request #305 from balloob/dev
Super small hotfix
2015-09-01 01:15:24 -07:00
Paulus Schoutsen
53fb46b44b Merge pull request #304 from rmkraus/daemon
Fixed signal binding exception
2015-09-01 01:14:22 -07:00
Paulus Schoutsen
a92687bb08 Exclude tests from package 2015-09-01 01:12:55 -07:00
Ryan Kraus
e7caac212d Fixed signal binding exception
Cleanly handle error for failed SIGQUIT binding. This can happen when
running in a thread.
2015-09-01 04:03:51 -04:00
Paulus Schoutsen
3bbdc5bcd7 Merge pull request #299 from balloob/dev
0.7-final
2015-09-01 01:02:32 -07:00
Paulus Schoutsen
c1f172f33a Merge pull request #303 from rmkraus/daemon
Updating Daemon Code
2015-09-01 00:58:03 -07:00
Ryan Kraus
18569104fa Fixes to new Debian daemon script. 2015-09-01 03:54:59 -04:00
Ryan Kraus
7992882fa3 Cleanup PID checking logic and write PID logic. 2015-09-01 03:29:07 -04:00
Ryan Kraus
4ca8f184e6 Updated Debian daemon script. 2015-09-01 03:22:43 -04:00
Paulus Schoutsen
58afbecd05 Speed up tests 2015-09-01 00:18:26 -07:00
Ryan Kraus
5b06e8d25e Daemon handling cleanup.
More cleanly handling whether a PID file should be checked.
Fatal Error on PID file IOError.
Pylint fix to bootstrap.
2015-09-01 02:37:52 -04:00
Ryan Kraus
1add38a195 Merge balloob/dev with rmkraus/daemon 2015-09-01 02:23:50 -04:00
Ryan Kraus
ff470c8ffe Added core daemon function as flags.
Created three additional flags for the hass command:
-v -  Toggle verbose log file output
—pid-file -  Specify PID file path
—daemon -  Launch as daemon (nix only)

The core now binds to SIGQUIT on nix systems to trigger a clean
shutdown.

Modified HTTP server to write logging messages through the logging
module.
2015-09-01 02:12:00 -04:00
Paulus Schoutsen
a34b00bc9c Style fix for device tracker 2015-08-31 22:20:24 -07:00
Ryan Kraus
83440ad718 Fixed device tracker to install scanner requirements. 2015-08-31 22:11:17 -07:00
Paulus Schoutsen
0987a84bf4 Merge pull request #300 from balloob/nmap-fix
Migrate nmap_tracker to use different nmap lib
2015-08-31 22:06:32 -07:00
Ryan Kraus
df4afa5025 Merging balloob/dev into dev. 2015-09-01 01:03:26 -04:00
Paulus Schoutsen
b41706efe3 Make nmap work in Docker 2015-08-31 22:01:45 -07:00
Paulus Schoutsen
9eefa67035 Add Python 3.4 check back 2015-08-31 08:53:59 -07:00
Paulus Schoutsen
d421a16ffd Add aruba device tracker to coveragerc 2015-08-31 08:52:15 -07:00
Paulus Schoutsen
053e2c2ebc Update frontend with latest changes 2015-08-31 08:40:03 -07:00
Paulus Schoutsen
6c213f6401 Merge pull request #302 from michaelarnauts/dev
Add Aruba Access Point device tracker
2015-08-31 08:38:08 -07:00
Paulus Schoutsen
74303e4be8 Merge pull request #296 from pavoni/feature/enhance_wemo
Feature/enhance wemo
2015-08-31 08:32:20 -07:00
pavoni
794a11db21 Remove debug statements! 2015-08-31 16:33:12 +01:00
Paulus Schoutsen
7c44313203 Update efergy descriptin in README 2015-08-31 08:18:27 -07:00
pavoni
93cd7bfc5d Split comment to keep line short 2015-08-31 15:19:04 +01:00
pavoni
3256552675 Fix bug, use constants for states. 2015-08-31 13:12:17 +01:00
pavoni
54dd09df29 Fix typos 2015-08-31 12:13:53 +01:00
pavoni
5ed6987067 Refactor wemo standby state slightly 2015-08-31 11:07:52 +01:00
Michaël Arnauts
12ead04faa Add Aruba Access Point device tracker 2015-08-31 11:36:12 +02:00
Paulus Schoutsen
3e3ee9184a Fix broken conversation test 2015-08-31 00:54:00 -07:00
Paulus Schoutsen
78826648e3 style + dependency fix 2015-08-31 00:44:59 -07:00
Paulus Schoutsen
ffac067be8 Migrate nmap_tracker to use different nmap lib 2015-08-31 00:29:41 -07:00
Paulus Schoutsen
5b2b12eed1 Merge pull request #291 from rmkraus/more_tests
Adding additional tests
2015-08-30 23:49:29 -07:00
Ryan Kraus
881901f4d3 Removed bogus intro test. 2015-08-31 02:48:26 -04:00
Paulus Schoutsen
81190be7ba Deprecate scripts/update 2015-08-30 22:33:59 -07:00
Paulus Schoutsen
9acf3db435 Improved console output for new users 2015-08-30 21:24:10 -07:00
Paulus Schoutsen
64fff48021 Allow spaces in group setup string 2015-08-30 20:44:38 -07:00
Paulus Schoutsen
98b0367249 Upgrade frontend 2015-08-30 17:54:18 -07:00
Paulus Schoutsen
e95d4cf19c Update screenshot 2015-08-30 17:48:06 -07:00
Ryan Kraus
e6ac225140 Fixed device tracker to install scanner requirements. 2015-08-30 20:22:02 -04:00
Ryan Kraus
b1876d586e Fixed importing of dependency for map tracker. 2015-08-30 20:01:02 -04:00
Paulus Schoutsen
1958dfd0c1 Bugfix release frontend 2015-08-30 15:45:26 -07:00
Paulus Schoutsen
fb4121d4b4 Fix components being loaded twice 2015-08-30 15:08:03 -07:00
Paulus Schoutsen
4cadc7df96 Update demo component 2015-08-30 15:08:03 -07:00
Paulus Schoutsen
a8b932223f Prevent init screen from shifting 2015-08-30 15:08:03 -07:00
Paulus Schoutsen
335eb10d11 Merge pull request #295 from renekliment/mpd-pause-fix
fixes MPD play/pause
2015-08-30 14:55:20 -07:00
pavoni
028551784a Update pywemo to 0,3 2015-08-30 22:50:08 +01:00
pavoni
b9cca82a45 Update pywemo to 0.3 2015-08-30 22:48:48 +01:00
pavoni
bfbaaa8e9f Merge remote-tracking branch 'balloob/dev' into feature/enhance_wemo 2015-08-30 22:47:49 +01:00
Paulus Schoutsen
b4fea395de Merge pull request #294 from renekliment/mpd-password-authorization
support for MPD password authorization
2015-08-30 14:46:24 -07:00
René Kliment
62f6576e19 fixes MPD play/pause 2015-08-30 16:11:44 +02:00
René Kliment
41011f0c95 support for MPD password authorization 2015-08-30 15:53:40 +02:00
Ryan Kraus
7dd7d7a191 Restructured conversation tests. 2015-08-30 05:04:04 -04:00
Ryan Kraus
364d85b6df Fixed remote tests. 2015-08-30 04:51:49 -04:00
Ryan Kraus
5ba5e0ffb1 Added another conversation test. 2015-08-30 04:30:19 -04:00
Ryan Kraus
10054567de Added test for conversation and introduction components. 2015-08-30 04:24:24 -04:00
Paulus Schoutsen
9ecac9e934 Upgrade media_player.cast dependency 2015-08-30 01:09:11 -07:00
Paulus Schoutsen
81466246cf Add --version command line argument 2015-08-30 00:59:27 -07:00
Paulus Schoutsen
a3812a324c Update README 2015-08-30 00:55:04 -07:00
Paulus Schoutsen
ae896f4a33 Fix download link in setup.py 2015-08-30 00:42:46 -07:00
Paulus Schoutsen
74e4b024c0 Merge remote-tracking branch 'origin/dev'
Conflicts:
	Dockerfile
	homeassistant/components/frontend/version.py
	homeassistant/components/frontend/www_static/frontend.html
2015-08-29 23:40:38 -07:00
Paulus Schoutsen
fc6613ffb1 Fix documentation in __main__ 2015-08-29 23:35:19 -07:00
Paulus Schoutsen
3960a465f1 Add conversation and introduction to demo.py 2015-08-29 23:21:26 -07:00
Paulus Schoutsen
a20ab24ba5 Remove unused pip constant 2015-08-29 23:08:33 -07:00
Paulus Schoutsen
f016dec02a Update Dockerfile for new pip requirements 2015-08-29 23:02:36 -07:00
Paulus Schoutsen
fcee2c6d33 Remove unused file 2015-08-29 23:02:14 -07:00
Paulus Schoutsen
a5a1f30798 Make launch more smooth 2015-08-29 23:02:07 -07:00
Paulus Schoutsen
5aa8814a67 Merge pull request #289 from rmkraus/pip_updates
Update dependency installs and prepare for pip deployment
2015-08-29 22:11:20 -07:00
Paulus Schoutsen
7343e33063 Some more frontend bug fixes 2015-08-29 22:02:19 -07:00
Ryan Kraus
bea81ddd92 Minor tweaks
Moved another import to the top of main.
Forced an exit code of 1 when there is an error initializing.
2015-08-29 23:31:33 -04:00
Ryan Kraus
4e01e7ca9b Pip requirements and fixes.
1) Reduced the flags being sent to pip.
2) Required a minimum of pip 7.0.0 for Home Assistant.
2015-08-29 23:17:47 -04:00
Paulus Schoutsen
b750457afa Bugfixes frontend 2015-08-29 20:11:27 -07:00
Ryan Kraus
bfa3900e6a Updated core config directory tests 2015-08-29 22:44:59 -04:00
Ryan Kraus
f5b98c86f0 Mostly PyLint and Flake8 updates.
Rewrote imports of exceptions to be from the exceptions module.
Made nmap scanner check for libnmap dependency without crashing.
Various flake8 and pylint updates.
2015-08-29 22:34:35 -04:00
Ryan Kraus
0b6358e759 Implemented comments from Paulus.
Revised main to use frontend and demo strings rather than importing
their domains.
Removed submodule validation.
Moved local library mounting to the bootstrap module and out of core.
Added requirements_all.txt for all dependencies.
Made core dependencies looser.
Small updates to setup.py.
2015-08-29 22:19:52 -04:00
Ryan Kraus
893ae15042 Changed component REQUIREMENTS to absolute versions. 2015-08-29 21:39:50 -04:00
Paulus Schoutsen
75b3cc046d Update frontend with latest changes 2015-08-29 18:17:21 -07:00
Ryan Kraus
6fdf9b8d7c Many changes to cleanup config directory and lib installations.
Cleaned up default config directory determination.
Made bootstrap creators for HA always set config directory.
Made bootstrap creators set the local library in the Python Path.
Moved all exceptions to their own file to make imports easier.
Moved default configuration directory be in the users’ profile.
Moved pip installs to be done to a lib folder in the config directory.
Reduced requirements.txt to only the barebones reqs.
2015-08-29 21:11:24 -04:00
Ryan Kraus
18e32165a4 Cleaned up main file to remove dependency management. 2015-08-29 20:06:54 -04:00
Ryan Kraus
3839c3d0ef Created setup.py for standard installs. 2015-08-29 18:59:05 -04:00
pavoni
c3a9db0a37 Add defult methods to base class for switch_state and sensor_state 2015-08-29 20:32:46 +01:00
Paulus Schoutsen
0a2652630f Frontend: Style loading page like login form 2015-08-29 12:01:37 -07:00
Paulus Schoutsen
4b31a22a1c Merge pull request #286 from rmkraus/entity_cleanup
Entity cleanup
2015-08-28 17:25:51 -07:00
Ryan Kraus
c49cdf7ffd Pylint fixes to ISY component. 2015-08-28 20:18:54 -04:00
Ryan Kraus
936e20bdf7 Cleaned up some entities.
1) Modified device tracker entities to allow for attributes to be
overwritten with configuration data.

2) Modified ISY lights to hide brightness when off.
2015-08-28 20:17:07 -04:00
Paulus Schoutsen
6b241f8600 Merge pull request #282 from sfam/dev
Initial support for THOMSON routers
2015-08-28 17:08:03 -07:00
pavoni
2a0d459722 Fix blank line regression 2015-08-29 00:27:28 +01:00
pavoni
dfae1a44a6 Add standby state to WeMo Insight Switch, and add WeMo Maker 2015-08-28 23:11:55 +01:00
Paulus Schoutsen
4f8b843a1e Merge pull request #284 from MakeMeASandwich/dev
Add support for Adafruit temperature/humidity sensors
2015-08-28 10:42:12 -07:00
MakeMeASandwich
3f4d5eae1c work around build failures also on non-RPi/BB-machines 2015-08-28 18:14:13 +02:00
MakeMeASandwich
76a8bd3969 Add support for Adafruit temperature/humidity sensors 2015-08-28 14:42:41 +02:00
Ryan Kraus
00f3556c34 Merge pull request #283 from rmkraus/dev
Fixed Issue #280
2015-08-27 22:45:38 -04:00
Ryan Kraus
71e60dcfe9 Fixed Issue #280 2015-08-27 22:41:12 -04:00
sfam
4ef4aa2095 fix pylint warnings 2015-08-28 00:09:24 +01:00
sfam
1311e00e90 Initial support for THOMSON routers 2015-08-28 00:03:05 +01:00
sfam
1aef768ff0 Initial support for THOMSON routers 2015-08-28 00:02:26 +01:00
Fabian Affolter
e0db473294 update dnspython 2015-08-27 14:26:06 +02:00
Fabian Affolter
17bf27474a fix dnspython version 2015-08-27 14:25:21 +02:00
Fabian Affolter
387769edff add dnspython 2015-08-27 14:16:29 +02:00
Fabian Affolter
6582067f66 add dnspython to enable xmpp to do srv lookups 2015-08-27 14:15:57 +02:00
Fabian Affolter
f3868ea744 update comments 2015-08-27 14:14:50 +02:00
Paulus Schoutsen
a98ecb6bcc Frontend: material design + introduction card 2015-08-27 01:06:41 -07:00
Paulus Schoutsen
ba7b9c625e Add an introduction component to support first usage 2015-08-27 01:06:41 -07:00
Paulus Schoutsen
e2cfe2a7d2 Merge pull request #278 from sfam/dev
New RPi_GPIO sensor and switch improvements
2015-08-26 08:40:54 -07:00
Paulus Schoutsen
1cb6077e36 Bugfixes for frontend 2015-08-26 08:39:29 -07:00
sfam
47998cff97 Update .coveragerc 2015-08-26 15:45:39 +01:00
sfam
9811869111 fix line too long 2015-08-26 11:27:27 +01:00
sfam
6b3b000822 quick fix 2015-08-26 11:22:06 +01:00
sfam
c8b88219b7 rename config parameter to "invert_logic" 2015-08-26 11:03:06 +01:00
Paulus Schoutsen
884af889a4 Merge pull request #268 from nkgilley/actiontec
device_tracker component: Actiontec MI424WR Verizon FiOS Router
2015-08-25 21:59:38 -07:00
Paulus Schoutsen
c50a47a307 Merge pull request #279 from Zyell/dev
Updated Thermostat unit handling and Nest support
2015-08-25 19:08:52 -07:00
zyell
e15eb90b33 Have thermostat class make all necessary unit conversions 2015-08-25 17:52:40 -07:00
zyell
6647894c36 updated nest to use helper method and updated requirements 2015-08-25 17:52:40 -07:00
zyell
c12b7e70d9 Updated to support Nest API changes and fix set_temp and away_mode and pull in new required python-nest version 2015-08-25 17:52:40 -07:00
sfam
930036272b fix pylint warnings 2015-08-26 00:15:57 +01:00
sfam
c194121da6 fix pylint warnings 2015-08-26 00:11:07 +01:00
sfam
cfc2232c22 fix pylint warnings 2015-08-26 00:02:52 +01:00
sfam
ab5a569922 Add RPi GPIO sensor 2015-08-25 23:24:36 +01:00
sfam
0a9d82fe6f Fix RPi_GPIO switch and add extra parameters 2015-08-25 23:23:51 +01:00
Nolan Gilley
bc5a7564b1 fix formatting 2015-08-25 10:09:47 -04:00
Nolan Gilley
047b4abd82 Fix get_device_name and get_actiontec_data 2015-08-25 09:39:00 -04:00
Paulus Schoutsen
917db18b29 Fix netgear username/password combo 2015-08-24 23:32:07 -07:00
Paulus Schoutsen
c078ee4313 Remove broken Z-Wave support build from Docker 2015-08-24 22:59:05 -07:00
Theodor Lindquist
152fd9cb28 Merge pull request #277 from theolind/dev
Added test for Automation component service id list
2015-08-25 06:55:01 +02:00
theolind
089cd0ff8a Added test for Automation component service id list 2015-08-25 06:50:20 +02:00
Paulus Schoutsen
8cda3f8291 Fix frontend compilation 2015-08-24 21:45:15 -07:00
Theodor Lindquist
83794765a4 Merge pull request #276 from theolind/dev
Added support for YAML lists in automation component confg
2015-08-24 21:35:32 +02:00
theolind
a7889ef628 Automation component now supports YAML lists for config key service_entity_id 2015-08-24 21:19:47 +02:00
Paulus Schoutsen
05df84d04f Frontend bugfix url-sync 2015-08-23 22:45:00 -07:00
Nolan Gilley
93bd238be5 add return None for get_actiontec_data 2015-08-24 00:27:26 -04:00
Paulus Schoutsen
a419509893 More bugfixes frontend 2015-08-23 19:47:51 -07:00
Paulus Schoutsen
d45a7e2ba4 Update demo data to show more features 2015-08-23 19:46:18 -07:00
Paulus Schoutsen
6338f387d2 Bugfixes for frontend 2015-08-23 17:20:23 -07:00
Paulus Schoutsen
35489998df Allow for Netgear router discovery 2015-08-23 17:20:09 -07:00
Paulus Schoutsen
e917479fba Update netdisco to latest version 2015-08-23 17:18:52 -07:00
Paulus Schoutsen
517d4b35ed Update Cast dependency to latest version 2015-08-23 17:18:21 -07:00
Paulus Schoutsen
d69bb8db6e Frontend: fix sensor label and menu button 2015-08-23 10:20:54 -07:00
Paulus Schoutsen
b79d0f5404 Fix discovery and wemo 2015-08-23 10:06:54 -07:00
Paulus Schoutsen
387bdd4a30 Merge pull request #273 from balloob/UI2015
Initial UI revamp
2015-08-23 01:35:48 -07:00
Paulus Schoutsen
33b007b7b4 Initial UI revamp 2015-08-23 01:33:19 -07:00
Paulus Schoutsen
3b982e25a5 Remove broken Z-Wave support build from Docker 2015-08-22 23:32:09 -07:00
Paulus Schoutsen
584e67a6d4 Merge pull request #270 from sfam/dev
Add MQTT switch and sensor
2015-08-22 12:34:36 -07:00
sfam
d0c674b756 update 2015-08-22 16:10:29 +01:00
sfam
fd7808e6f4 update 2015-08-22 16:04:55 +01:00
sfam
a9a650edb6 update style issues 2015-08-22 15:10:49 +01:00
sfam
01ed3b18cc update docstring 2015-08-22 14:57:57 +01:00
Paulus Schoutsen
e09e78347b Upgrade remote test 2015-08-21 21:51:54 -07:00
sfam
8a63325abe update 2015-08-20 23:09:11 +01:00
sfam
44263752ca update header 2015-08-20 23:05:51 +01:00
Nolan Gilley
63e441c73f fix scan_devices 2015-08-20 10:35:01 -04:00
Paulus Schoutsen
051e2db9b7 Merge pull request #272 from nkgilley/scheduler_update
Scheduler update
2015-08-19 13:23:10 -07:00
Paulus Schoutsen
b418907598 Merge pull request #271 from rmkraus/notifier_update
Updated notifier component.
2015-08-19 13:20:47 -07:00
Nolan Gilley
ca515615b9 add support for recording decive name as ip address 2015-08-19 09:52:47 -04:00
Nolan Gilley
7127ddf0a0 fix for broken scheduler component. 2015-08-19 09:16:45 -04:00
Ryan Kraus
a23ab44a6d Removed unnecessary import in notify component. 2015-08-18 22:49:27 -04:00
Ryan Kraus
b8b5ac0653 Removed unnecessary line from notify component. 2015-08-18 22:42:01 -04:00
Ryan Kraus
159411df8b Updated notifier component.
This update to the notifier component allows multiple notifiers to be
configured. In order to support this, an optional property “name” has
been added to all the notifier’s configurations. The notifier can now
be called with the service “notify.NAME”. If the name is not provided,
the service will be mapped to “notify.notify”. Because of this, this
update should be fully backwards compatible.
2015-08-18 22:28:40 -04:00
sfam
c5db42677a Add MQTT Sensor 2015-08-19 01:25:05 +01:00
sfam
2bb4a53bd3 Add MQTT Switch 2015-08-19 01:24:40 +01:00
Paulus Schoutsen
74308b2677 Upgrade nmap dependency 2015-08-18 14:37:53 -07:00
Nolan Gilley
6a830e3b90 fix for flake8 2015-08-18 17:14:26 -04:00
Nolan Gilley
b84d5760eb add to .coveragerc and try again to fix warnings. 2015-08-18 17:03:13 -04:00
Nolan Gilley
c471e39fa0 trying to fix more warnings... 2015-08-18 16:50:40 -04:00
Nolan Gilley
d2f01174e7 fixed warnings 2015-08-18 16:41:03 -04:00
Nolan Gilley
4d5f3da08b Initial commit for device_tracker component for Actiontec MI424WR Verizon FiOS Wireless Router 2015-08-18 16:12:01 -04:00
Paulus Schoutsen
199a80dcfb Merge pull request #267 from balloob/master
Syncing dev with master
2015-08-18 13:04:26 -07:00
Paulus Schoutsen
bf9d067a7d Configure Cast platform host via config 2015-08-17 22:38:10 -07:00
Paulus Schoutsen
ebfec2d1d3 Update update script 2015-08-17 20:11:37 -07:00
Paulus Schoutsen
dfc7f8b0c6 Merge pull request #263 from balloob/dev
Update master with latest changes
2015-08-17 19:55:50 -07:00
Paulus Schoutsen
4ab75d58f5 Update coveragerc 2015-08-17 19:49:08 -07:00
Paulus Schoutsen
b93516197c Merge pull request #261 from persandstrom/verisure
Verisure: Hygrometers etc.
2015-08-17 07:48:02 -07:00
Per Sandstrom
4707b122cc hygrometers and disabling of components 2015-08-17 13:05:49 +02:00
Paulus Schoutsen
086961d109 Add temperature util, helpers 2015-08-16 22:06:01 -07:00
Paulus Schoutsen
b61b3c611d Extract temperature util 2015-08-16 21:36:33 -07:00
Paulus Schoutsen
dda399fc76 Merge pull request #260 from balloob/fix-run-as-module
Extract core from __init__ to core package
2015-08-16 21:23:46 -07:00
Paulus Schoutsen
e984eedffd Fix mysensors import 2015-08-16 21:06:50 -07:00
Paulus Schoutsen
6e41eee6cd Merge pull request #257 from persandstrom/verisure
Support for Verisure
2015-08-16 21:06:24 -07:00
Paulus Schoutsen
9522eac837 Fix mysensors import 2015-08-16 20:53:34 -07:00
Paulus Schoutsen
8bb189e014 Finish core extraction 2015-08-16 20:53:17 -07:00
Paulus Schoutsen
1b89a502c4 Extract core into own submodule 2015-08-16 20:44:46 -07:00
Per Sandstrom
e37869616b no more duplicate sensors 2015-08-16 08:03:19 +02:00
Per Sandstrom
a0f2f3814b fixed flak8 2015-08-16 06:51:09 +02:00
Per Sandstrom
ad327b64ed code reveiw 2015-08-15 13:36:30 +02:00
Per Sandstrom
f20be1e7f8 fixed pylint warning 2015-08-12 13:32:15 +02:00
Per Sandstrom
1b59859681 fixed pylint warning 2015-08-12 13:28:22 +02:00
Per Sandstrom
c7ca6e4784 Added a switch 2015-08-12 13:00:47 +02:00
Fabian Affolter
d0fc91d84a update header 2015-08-11 19:12:32 +02:00
Fabian Affolter
19b62c1088 update header and docstrings 2015-08-11 19:12:32 +02:00
Fabian Affolter
bb848e7fcd update header 2015-08-11 19:12:32 +02:00
Fabian Affolter
06a40ad30c update header 2015-08-11 19:12:32 +02:00
Fabian Affolter
2289d3e826 upadte header 2015-08-11 19:12:32 +02:00
Fabian Affolter
c900836410 update header and docstring 2015-08-11 19:12:32 +02:00
Fabian Affolter
bd373a4d25 update header 2015-08-11 19:12:32 +02:00
Paulus Schoutsen
60abaa585c Add test for bootstrap 2015-08-11 08:20:13 -07:00
Paulus Schoutsen
27ca611689 Fix MQTT coverage directives 2015-08-11 07:49:29 -07:00
Fabian Affolter
2a9616e88c add new entries 2015-08-11 14:38:56 +02:00
Per Sandstrom
92fc7eab36 added component and sensor 2015-08-11 09:28:07 +02:00
Paulus Schoutsen
3fad4d8cda Increase test coverage MQTT 2015-08-10 23:34:58 -07:00
Paulus Schoutsen
65a4b3c9f8 Add MQTT component tests 2015-08-10 23:11:57 -07:00
Paulus Schoutsen
291cc62381 Add automation mqtt tests 2015-08-10 23:11:46 -07:00
Paulus Schoutsen
eecc51c92d Add tests for automation component 2015-08-10 22:26:12 -07:00
Paulus Schoutsen
f79567f7db MQTT: add support for + wildcard in subscribe 2015-08-10 21:49:32 -07:00
Paulus Schoutsen
6e98e55f6a MQTT: add support for + wildcard in subscribe 2015-08-10 21:49:19 -07:00
Paulus Schoutsen
969fe1f3b9 Fix MQTT wildcard topic subscriptions 2015-08-10 18:13:02 -07:00
Paulus Schoutsen
3bbeeda3ac Fix MQTT wildcard topic subscriptions 2015-08-10 18:12:44 -07:00
Paulus Schoutsen
9c63ba1cc3 Merge pull request #252 from chrisvis/tplink-ArcherC9-support
Add support for TP-Link ArcherC9 to to device tracker component
2015-08-10 12:24:38 -07:00
Chris Mulder
58fcf79340 Put new TP-Link device tracker class in same file as original and use the new one and have tailback to original one. 2015-08-10 20:03:43 +02:00
Paulus Schoutsen
ee73bd7dea Merge pull request #251 from balloob/dev
Update master with latest changes
2015-08-09 23:50:52 -07:00
Paulus Schoutsen
8f369d0c27 Merge pull request #254 from auchter/led-color
limitlessled: add color support
2015-08-09 17:56:09 -07:00
Michael Auchter
55c778ca0a add missing docstring 2015-08-10 00:30:47 +00:00
Michael Auchter
f49e5514d6 limitlessled: add color support
Add support for setting the color of a LimitlessLED light.
Currently this implementation is limited to the subset of 16 colors
exposed by the ledcontroller package that is used to interact with the
light itself. Technically the lights themselves support 255 colors.
2015-08-10 00:21:38 +00:00
Paulus Schoutsen
044d43b7c2 Adding MQTT automation rule 2015-08-09 17:12:25 -07:00
Paulus Schoutsen
ae06267072 Merge pull request #253 from auchter/led-brightness
limitlessled: scale brightness to meet ledcontroller expectations
2015-08-09 12:40:57 -07:00
Paulus Schoutsen
d412b51754 MQTT: Add some error reporting 2015-08-09 12:22:05 -07:00
Michael Auchter
4bbe716710 limitlessled: scale brightness to meet ledcontroller expectations
LedController's set_brightness() method expects either an int between 0 and
100, or a float between 0.0 and 1.0, but the brightness here is an int between
0-255. Scale the brightness appropriately.
2015-08-09 14:05:20 -05:00
Paulus Schoutsen
277cdbbe00 MQTT: Add support for authentication 2015-08-09 11:40:23 -07:00
Paulus Schoutsen
c8b54d7468 Update MQTT component and add example 2015-08-09 11:29:50 -07:00
Chris Mulder
2c9c79ea61 Add support for TP-Link ArcherC9 to to device tracker component 2015-08-09 18:23:42 +02:00
Paulus Schoutsen
a2c6dbf479 Clean up MQTT component 2015-08-08 23:49:38 -07:00
Paulus Schoutsen
b37471af68 Update modbus dependency 2015-08-08 21:42:17 -07:00
Paulus Schoutsen
60ade75031 Add missing dependencies 2015-08-08 21:22:34 -07:00
Paulus Schoutsen
7461bf4099 Update coveragerc 2015-08-08 13:52:27 -07:00
Paulus Schoutsen
fc6d7db81b Readd setting up groups with comma seperated list 2015-08-08 13:44:07 -07:00
Paulus Schoutsen
0901ed4659 Merge pull request #242 from persandstrom/squeezebox
Squeezebox
2015-08-08 12:30:45 -07:00
Paulus Schoutsen
a0685c69f5 Merge pull request #250 from fabaff/mqtt-new
MQTT component
2015-08-08 10:47:38 -07:00
Fabian Affolter
87bf3c4e0d fix a couple of typos and use port(s) everywhere 2015-08-08 19:20:53 +02:00
Fabian Affolter
1f3bde3e08 update header 2015-08-08 19:16:15 +02:00
Fabian Affolter
6268a9f5b2 update header 2015-08-08 19:09:37 +02:00
Fabian Affolter
26dbb5ca3f make some entries optional, update payload handling, and use qos 2015-08-08 18:52:59 +02:00
Paulus Schoutsen
ac14698ab9 Updated version of frontend 2015-08-07 22:02:30 -07:00
Fabian Affolter
eac5b19309 add paho-mqtt 2015-08-07 19:22:27 +02:00
Fabian Affolter
a9d2adea45 add mqtt 2015-08-07 19:22:17 +02:00
Fabian Affolter
641d3f5e01 add mqtt component 2015-08-07 19:20:27 +02:00
Fabian Affolter
f7dc438d10 update header 2015-08-06 22:32:53 +02:00
Fabian Affolter
c987251585 update header 2015-08-06 22:32:41 +02:00
Fabian Affolter
dff626fb2d add requirement 2015-08-06 22:28:46 +02:00
Fabian Affolter
fce16c6cdd update header 2015-08-06 22:27:45 +02:00
Fabian Affolter
f84b3a509d update header 2015-08-06 22:24:23 +02:00
Fabian Affolter
22e30dc85a update header 2015-08-06 19:15:37 +02:00
Fabian Affolter
a1df7b9b26 add periods 2015-08-06 19:00:47 +02:00
Fabian Affolter
8029d3e592 remove some blank lines 2015-08-06 19:00:18 +02:00
Fabian Affolter
2eb3a5af3b update header 2015-08-06 18:53:44 +02:00
Fabian Affolter
22fa9831d8 update header 2015-08-06 18:45:00 +02:00
Fabian Affolter
b39ae8d23a update header 2015-08-06 18:44:48 +02:00
Fabian Affolter
6b30fc714c update header 2015-08-06 18:34:20 +02:00
Fabian Affolter
9d5c7ceecd update header 2015-08-06 18:32:29 +02:00
Fabian Affolter
e8dd5779f6 update header 2015-08-06 18:31:35 +02:00
Fabian Affolter
aa8ec4724b update header 2015-08-06 18:23:26 +02:00
Fabian Affolter
b946b3b2bc update header 2015-08-06 18:23:10 +02:00
Fabian Affolter
5fa34b10b3 update file header 2015-08-06 17:54:05 +02:00
Fabian Affolter
caecca7e1f update file header 2015-08-06 17:53:49 +02:00
Fabian Affolter
83cfb1c861 add slack 2015-08-06 16:57:36 +02:00
Paulus Schoutsen
46fd23c452 Merge pull request #244 from balloob/cleanup
Core Cleanup
2015-08-06 05:23:23 -07:00
Paulus Schoutsen
7c61e00948 Merge pull request #239 from gbarba/rpi_gpio_component
Add rpi_gpio platform to switch
2015-08-06 05:20:53 -07:00
Paulus Schoutsen
b0065f7a95 Merge pull request #249 from persandstrom/asuswrt
ASUSWRT - Exception when client not in leases
2015-08-06 04:04:39 -07:00
Guillem Barba
91961e629f Resolve pylint errors and warnings 2015-08-06 09:57:16 +02:00
Guillem Barba
e6b4dba330 Remove usless comments 2015-08-06 09:57:16 +02:00
Guillem Barba
d6c7bf5ac8 Remove usless DEMO constant. Add version information in RPi.GPIO requirement 2015-08-06 09:57:16 +02:00
Guillem Barba
e97e73e66e Add rpi_gpio platform to switch 2015-08-06 09:57:16 +02:00
Per Sandstrom
b681cf2eaa removed unnecessary log row 2015-08-06 09:27:23 +02:00
Per Sandstrom
65cc0954c8 Exception when client not in leases
Client can be dropped from leases list from where the status is
retreived before it is dropped from the ip neigh list.
The client needs a default status.
2015-08-06 09:19:23 +02:00
Per Sandstrom
9ead39e703 added turn on/off support 2015-08-06 09:05:27 +02:00
Paulus Schoutsen
ac19ac8b83 Update frontend dependencies 2015-08-05 21:30:58 -07:00
Paulus Schoutsen
c4f71df1b2 Merge pull request #246 from balloob/fix-forecastio
Fix sensor.forecastio with Fahrenheit values
2015-08-05 17:00:12 -07:00
Per Sandstrom
393e88e732 add to .coveragerc 2015-08-05 22:25:03 +02:00
Paulus Schoutsen
450b510d08 Fix sensor.forecastio to treat Fahrenheit wrong
Fixes #245
2015-08-05 11:55:59 -07:00
Per Sandstrom
03f93063f8 fixed flake8 issues 2015-08-05 20:09:20 +02:00
Per Sandstrom
eb83621fce fixing pylint issues 2015-08-05 20:02:39 +02:00
Paulus Schoutsen
b2cfce7243 Merge branch 'dev' into cleanup
Conflicts:
	.coveragerc
2015-08-05 06:51:39 -07:00
Paulus Schoutsen
2eeb80f173 Merge branch 'pr/229' into dev
Conflicts:
	requirements.txt
2015-08-05 06:48:14 -07:00
Paulus Schoutsen
086e786b28 Merge branch 'pr/238' into dev
Conflicts:
	requirements.txt
2015-08-05 06:45:56 -07:00
Paulus Schoutsen
23f0195619 Merge pull request #241 from vitorespindola/master
Modbus coil support
2015-08-05 15:40:49 +02:00
Paulus Schoutsen
a163f2da2d Merge pull request #243 from persandstrom/asuswrt
ASUSWRT based routers
2015-08-05 15:39:48 +02:00
Per Sandstrom
db2cbf33c3 Added support for multiple players 2015-08-05 13:49:45 +02:00
Per Sandstrom
52ec4ac1d8 flake8 and pylint 2015-08-05 10:22:03 +02:00
Paulus Schoutsen
4f9fa7f8ad Update coveragerc 2015-08-04 16:33:35 -04:00
Paulus Schoutsen
aa20b94927 Remove support for old home-assistant.conf file 2015-08-04 16:21:25 -04:00
Paulus Schoutsen
d2b5f429fe Remove deprecated code 2015-08-04 16:21:09 -04:00
Per Sandstrom
30e24296c4 Fixed flake8 2015-08-04 20:30:01 +02:00
Per Sandstrom
e6c09f7413 Fixed bug with password protected LMS 2015-08-04 20:08:48 +02:00
Per Sandstrom
4284a3f5dc Fixed pylint conventions 2015-08-04 19:35:53 +02:00
Paulus Schoutsen
2075de3d81 Extended test_init tests to cover all 2015-08-04 18:16:10 +02:00
Paulus Schoutsen
df3ee6005a Nicer test imports
unittest changes import path so old style worked but is confusing
2015-08-04 18:15:22 +02:00
Paulus Schoutsen
14023a15e6 Minor code cleanup 2015-08-04 18:13:55 +02:00
Paulus Schoutsen
e47ac96587 Remove more deprecated method calls 2015-08-04 18:13:35 +02:00
Per Sandstrom
bed30a5307 added support for logitech squeezebox 2015-08-04 17:22:56 +02:00
Paulus Schoutsen
76f63ee262 Clean up test code 2015-08-03 17:57:12 +02:00
Paulus Schoutsen
4096a67251 Built-in component cleanup 2015-08-03 17:42:28 +02:00
Paulus Schoutsen
382c1de981 Built-in components no longer use deprecated methods 2015-08-03 17:08:13 +02:00
Paulus Schoutsen
7870e9a5e2 Minor cleanup core 2015-08-03 17:05:33 +02:00
James Cole
99bc7a997a Merge pull request #236 from jamespcole/slack-dev
Slack notifier component for sending messages to a slack channel.
2015-08-03 14:36:34 +10:00
Rohit Kabadi
65d32c7425 Added blank line to temper.py 2015-08-02 18:58:30 -07:00
Rohit Kabadi
6c6ae9cb1a Added REQUIREMENTS list to temper.py 2015-08-02 18:55:30 -07:00
Rohit Kabadi
e6aabb9706 Fixed flake8 violations 2015-08-02 18:51:13 -07:00
Rohit Kabadi
3d57c80656 Merge remote-tracking branch 'upstream/dev' into temper 2015-08-02 18:18:18 -07:00
Rohit Kabadi
c248d5455e Added REQUIREMENTS lilst to edimax.py 2015-08-02 18:01:31 -07:00
Rohit Kabadi
0e153183d4 Added name for temper, added to coveragerc, 2015-08-01 12:46:28 -07:00
Rohit Kabadi
3c08a5ee6e Added support for temper temperature sensors 2015-08-01 12:20:29 -07:00
Vitor Espíndola
f97b7c9e61 Merge branch 'master' of https://github.com/vitorespindola/home-assistant
Conflicts:
	homeassistant/components/sensor/modbus.py
	homeassistant/components/switch/modbus.py
2015-08-01 10:01:37 -03:00
Vitor Espíndola
1b3a45aba9 Modbus coil support 2015-08-01 09:54:32 -03:00
jamespcole
6873504cc0 Fixed linting errors 2015-08-01 06:45:41 +10:00
Rohit Kabadi
ffde7e183e Fixed flake8 violations 2015-07-30 21:05:00 -07:00
Per Sandstrom
ed0164843a Added support for ASUSWRT based routers 2015-07-30 11:30:31 +02:00
Rohit Kabadi
f351ab9544 Updated branch to avoid conflicts in requirements.txt 2015-07-30 00:37:11 -07:00
Rohit Kabadi
a99484ebc8 Merge remote-tracking branch 'upstream/dev' into edimax_smart_plug
Conflicts:
	requirements.txt
2015-07-30 00:31:26 -07:00
Rohit Kabadi
6a239bf18a Used validate_config to ensure 'host' parameter in edimax config. Added name option to edimax config 2015-07-30 00:10:16 -07:00
Vitor Espíndola
f82b63483a Modbus coil support 2015-07-29 14:04:32 -03:00
Rohit Kabadi
f6811e858a - Removed https://github.com/rkabadi/pyedimax as submodule
- Added https://github.com/rkabadi/pyedimax to requirements
- Modified edimax.py to import pyedimax from python3 default packages
2015-07-29 00:24:42 -07:00
Fabian Affolter
c1b428489f fix requirement 2015-07-27 18:58:32 +02:00
Fabian Affolter
5eb40be474 Merge branch 'dev' of github.com:fabaff/home-assistant into dev 2015-07-27 18:43:13 +02:00
Fabian Affolter
4845c1290c remove unused stuff and update the names (same as in owm sensor) 2015-07-27 18:41:03 +02:00
Paulus Schoutsen
e0468f8b8e Extract helpers.event from core + misc cleanup 2015-07-26 10:45:49 +02:00
Paulus Schoutsen
0c56fde5a9 Reorg tests folder 2015-07-26 10:17:01 +02:00
Paulus Schoutsen
fed36d2cd0 Better error reporting remote classes 2015-07-26 00:14:55 -07:00
Rohit Kabadi
613c0122c0 - Reverted submodule updates. This is the 2nd attempt since the first one did not work 2015-07-26 00:08:57 -07:00
Rohit Kabadi
bb0ace3a61 - Reverted submodule updates 2015-07-25 23:59:48 -07:00
Paulus Schoutsen
c659be7e17 Sun component will work now without internet 2015-07-25 23:45:49 -07:00
Rohit Kabadi
6a7e28cc85 - Added support for getting power on SP2101W devices (returns None on SP1101W) 2015-07-25 18:46:47 -07:00
Paulus Schoutsen
c1b6d03d1b Merge remote-tracking branch 'origin/remove-external' into dev 2015-07-24 04:11:31 -07:00
Paulus Schoutsen
37ec18b363 Merge pull request #226 from balloob/rfxcom
Support for rfxtrx sensors
2015-07-24 04:10:23 -07:00
Daniel Hoyer Iversen
3658c57912 updated rfxcom sensor 2015-07-24 13:06:15 +02:00
Daniel Hoyer Iversen
1489af0eca updated rfxcom sensor 2015-07-24 12:35:03 +02:00
Paulus Schoutsen
445aaeb700 New compiled version of frontend 2015-07-24 03:28:21 -07:00
Paulus Schoutsen
d33af6e83e Merge pull request #227 from balloob/thermostat
Custom min/max temperature for thermostat
2015-07-24 03:24:49 -07:00
Paulus Schoutsen
acd51268fc Merge pull request #228 from balloob/tellstick_bug
Make  only_named: 0  work
2015-07-24 03:23:55 -07:00
Daniel Hoyer Iversen
22c72060cf Make only_named: 0 work 2015-07-23 22:24:48 +02:00
Daniel Hoyer Iversen
be937a795a Min max temp for thermostat 2015-07-23 22:15:17 +02:00
Daniel Hoyer Iversen
b54c58235f Documentation of rfxtrx sensor 2015-07-23 19:50:26 +02:00
Daniel Hoyer Iversen
8f99ebf27e Documentation of rfxtrx sensor 2015-07-23 19:47:45 +02:00
Daniel Hoyer Iversen
f44acc9b0e requirements file 2015-07-23 19:42:20 +02:00
Daniel Hoyer Iversen
44ce756cba Support for rfxtrx sensors 2015-07-23 19:36:05 +02:00
Daniel Hoyer Iversen
cbb390a918 Custom min/max temperature for thermostat 2015-07-23 18:13:46 +02:00
Rohit Kabadi
fac194f66c - Added for smartplug
- Added error check for host param in config.yaml
- Fixed SmartPlugSwitch is_on method
- Edimax smartplug works now!
2015-07-20 23:27:25 -07:00
Rohit Kabadi
6631ebfdfa - Added git submodule @ https://github.com/rkabadi/pyedimax
- Added edimax.py module to interface with Edimax SP-1101W and SP-2101W
2015-07-20 20:16:54 -07:00
Paulus Schoutsen
dc2ed19105 Merge pull request #223 from balloob/dev
Update master with latest changes
2015-07-20 00:56:54 -07:00
Paulus Schoutsen
40b2acb472 Port wink from external to requirements.txt 2015-07-20 00:41:57 -07:00
Paulus Schoutsen
2f622053a6 Port PyWemo from external to requirements.txt 2015-07-20 00:08:00 -07:00
Paulus Schoutsen
3efb1e4ac9 Port netdisco from external to requirements.txt 2015-07-20 00:07:01 -07:00
Paulus Schoutsen
43cc3624ee Port PyNetgear from external to requirements.txt 2015-07-19 23:44:32 -07:00
Paulus Schoutsen
4edf53899d Port PyMySensors from external to requirements.txt 2015-07-19 23:25:13 -07:00
Paulus Schoutsen
e277decd4c Add a check to ensure pip is installed 2015-07-19 19:00:48 -07:00
Paulus Schoutsen
a3906242e9 Make life of Windows users a bit better 2015-07-19 18:32:35 -07:00
Paulus Schoutsen
7dba1b5303 Remove comment from build_frontend 2015-07-17 23:42:10 -07:00
Paulus Schoutsen
f50a6fc24c Update to latest Home Assistant Polymer 2015-07-17 23:38:25 -07:00
Paulus Schoutsen
f4562fa352 Merge pull request #222 from balloob/change-dependency-sun
Sun component: ephem->astral
2015-07-16 21:35:06 -07:00
Paulus Schoutsen
1fda362ca3 Take elevation into consideration 2015-07-16 21:19:23 -07:00
Paulus Schoutsen
35f0270688 Sun component: ephem->astral 2015-07-16 19:57:07 -07:00
Paulus Schoutsen
4d12c69d68 Increase robustness dependency installation 2015-07-15 18:38:48 -07:00
Paulus Schoutsen
c532a28a98 Increase robustness dependency installation 2015-07-15 18:37:24 -07:00
Paulus Schoutsen
34b6627f9a Merge pull request #216 from balloob/polymer-es6
Extract frontend code into own repository
2015-07-12 23:06:11 -07:00
Paulus Schoutsen
d3a6190044 Update frontend to latest version 2015-07-12 22:58:35 -07:00
Paulus Schoutsen
0bf45653e3 Upgrade to new version frontend 2015-07-12 21:08:39 -07:00
Paulus Schoutsen
87961c1c53 Remove old dev scripts 2015-07-12 21:08:25 -07:00
Paulus Schoutsen
c861622748 Extract frontend code into own repository 2015-07-12 20:43:07 -07:00
Paulus Schoutsen
eb630d61db Merge pull request #215 from rmkraus/dev
Updating Debian daemon script for Python Virtual Environments
2015-07-12 16:02:46 -07:00
Ryan Kraus
7fcdb9b975 Updating Debian daemon script for Python Virtual Environments
Fix to init.d script that forces the correct virtual environment to be
loaded.
2015-07-12 18:44:38 -04:00
Paulus Schoutsen
bfa8131f4b Merge branch 'dev' 2015-07-11 12:28:28 -07:00
Paulus Schoutsen
27850ef5df Frontend: hide frontend specific attributes from default more info content 2015-07-11 12:28:11 -07:00
Paulus Schoutsen
c4a4aceeeb Frontend: Minor UI tweaks for Camera 2015-07-11 11:55:25 -07:00
Paulus Schoutsen
33b7585e0c Merge pull request #202 from balloob/dev
Update master with latest changes
2015-07-11 02:00:18 -07:00
Paulus Schoutsen
ef370034b6 New frontend build 2015-07-11 01:56:58 -07:00
Paulus Schoutsen
eb4bb6925f Stub http component in tests 2015-07-11 00:02:52 -07:00
Paulus Schoutsen
dea0fcc845 Improve virtual env detection 2015-07-11 00:02:42 -07:00
Paulus Schoutsen
2cbfc60679 Add camera to demo 2015-07-10 23:24:05 -07:00
Paulus Schoutsen
aec25c88b4 Clean up camera component 2015-07-10 23:17:12 -07:00
Paulus Schoutsen
703266312e Exclude efergy sensor for coverage 2015-07-10 22:34:02 -07:00
Paulus Schoutsen
c90c32eee8 Simplify README 2015-07-10 22:33:51 -07:00
Paulus Schoutsen
c3402dca4e Upgrade travis.yml to run on new infra 2015-07-10 22:00:13 -07:00
Paulus Schoutsen
590b6ba6e7 Merge pull request #203 from balloob/auto-dependency
Automatic dependency management
2015-07-10 21:53:10 -07:00
Paulus Schoutsen
d2417768ce Merge pull request #170 from jamespcole/simple-camera-dev
Very simple IP Camera support
2015-07-10 21:52:31 -07:00
Paulus Schoutsen
b6fd282143 Merge remote-tracking branch 'origin/dev' into auto-dependency
Conflicts:
	homeassistant/components/media_player/cast.py
2015-07-10 21:48:01 -07:00
Paulus Schoutsen
afeb2cfc09 Update package requirement for Chromecast 2015-07-10 21:35:48 -07:00
Paulus Schoutsen
b6c710585b Merge pull request #214 from rmkraus/dev
Created init.d script
2015-07-10 21:35:08 -07:00
Paulus Schoutsen
9af3ff6d9d Update README 2015-07-10 21:32:02 -07:00
Ryan Kraus
b3479a4ab6 Created init.d script
Created a Debian init.d compatible service script.
2015-07-11 00:28:37 -04:00
Paulus Schoutsen
2b23eec0f7 Fix pip 1.5.4 compatibility 2015-07-10 21:24:28 -07:00
Paulus Schoutsen
8363757f1c Merge pull request #212 from rmkraus/dev
IGNORE_CEC Parameter for Cast device
2015-07-10 21:16:36 -07:00
Paulus Schoutsen
a600d67dfc Merge pull request #211 from miniconfig/efergy-dev
Added a new sensor to read data from the efergy energy monitor
2015-07-10 20:57:36 -07:00
jamespcole
bf2b06880e Fixed some linting errors 2015-07-10 20:10:23 +10:00
jamespcole
9a63f34129 Rebuilt with updated bower components 2015-07-10 19:57:30 +10:00
jamespcole
0ca836d7ed Another frontend rebuild 2015-07-10 19:42:22 +10:00
jamespcole
a85b47805f rebuilt frontend with camera component changes 2015-07-10 18:44:00 +10:00
jamespcole
3440c54ab7 Merged in upstream changes 2015-07-10 18:14:03 +10:00
jamespcole
4b2d10a741 Added constants for camera streaming 2015-07-10 18:04:17 +10:00
jamespcole
c231a349c7 Updates from pull request feedback 2015-07-10 18:03:46 +10:00
Ryan Kraus
f3ff8ca9ca Bumped PyChromecast version in requirements
Bumped PyChromecast version to a hypothetical 0.6.9 since the newest is
already 0.6.8.
2015-07-10 00:54:29 -04:00
Ryan Kraus
1bfde8a1e5 Rolling home-assistant-js back to newest
Accidentally rolled home-assistant-js back. Brought it back to the
current version.
2015-07-10 00:34:52 -04:00
Ryan Kraus
67135a7150 Implimented Ignore CEC for Chromecasts
1) Added the ability to ignore CEC data from Chromecasts using pending
updates to PyChromecast library.
2) Modified cast device to not allow the same device to be imported
twice. This can happen when cast is setup as a media_player in the
config when the discovery component is active.
2015-07-10 00:29:07 -04:00
miniconfig
18bcf3ea00 Added a new sensor to read data from the efergy energy monitor 2015-07-09 12:05:19 -04:00
Paulus Schoutsen
336d0a3972 Merge pull request #209 from michaelarnauts/hue_colorloop
Implement the colorloop effect for hue lights
2015-07-08 19:37:08 -07:00
Paulus Schoutsen
045e0c70cb Merge pull request #210 from balloob/tellstick-robustness
Added functionallity so that the tellstick switch can send its signals repeatedly
2015-07-08 19:35:16 -07:00
Gustav Ahlberg
370355b94b Added functionallity so that the tellstick switch can send it's signals repeatedly
Because the tellstick sends its actions via radio and from most receivers it's impossible to know if the signal was received or not.
2015-07-08 21:39:50 +02:00
Michaël Arnauts
7530109ce8 Implement the colorloop effect for hue lights 2015-07-08 20:26:37 +02:00
Paulus Schoutsen
33e983a5c3 Update ISY994 dependency 2015-07-08 00:01:10 -07:00
Paulus Schoutsen
d7e46b5427 Merge pull request #205 from michaelarnauts/dev
Use xy_color instead of color in the configuration example
2015-07-07 23:49:44 -07:00
Paulus Schoutsen
b86e9a4fc1 Merge pull request #207 from rmkraus/isy_dev
Updating the PyISY dependency
2015-07-07 23:49:21 -07:00
Paulus Schoutsen
785e5e0fe7 Merge pull request #208 from rmkraus/isy_dev_master
Light update to PyISY version 1.0.5
2015-07-07 21:30:04 -07:00
Ryan Kraus
d1e4387997 Light update to PyISY version 1.0.5
This is a lighter update to version 1.0.5 to fix Issue #201 more
immediately.
2015-07-07 23:19:34 -04:00
Ryan Kraus
237778a8bc Update to PyISY 1.0.5
Updated Home Assistant to use PyISY version 1.0.5 to fix error when no
climate module is present as well as update HTTPS connections to use
TLS.
2015-07-07 23:04:16 -04:00
Ryan Kraus
d8d92e3ff7 merge isy_dev with balloob/dev 2015-07-07 22:49:07 -04:00
Michaël Arnauts
8b7a406fe7 Use xy_color instead of color in the configuration example 2015-07-07 22:33:40 +02:00
Paulus Schoutsen
940b2998ea Add REQUIREMENTS list to components 2015-07-07 00:01:46 -07:00
Paulus Schoutsen
aeae7c2c02 Reorganize util methods 2015-07-07 00:01:17 -07:00
Paulus Schoutsen
b346f6e8ad Allow installing component dependencies on the fly 2015-07-07 00:00:21 -07:00
Paulus Schoutsen
90739c9df9 Auto install core dependencies on boot 2015-07-06 23:59:21 -07:00
Paulus Schoutsen
4be9519e76 Update gitignore for pyvenv artifacts 2015-07-06 23:33:35 -07:00
Paulus Schoutsen
5550c89a86 Another frontend color picker fix 2015-07-06 10:07:12 -07:00
Paulus Schoutsen
820fd55249 Frontend bugfix: hide color picker when light is off 2015-07-06 08:11:23 -07:00
Paulus Schoutsen
4d81953562 Frontend: clean up code 2015-07-06 00:30:36 -07:00
Paulus Schoutsen
56c5d28ede Frontend: disable selecting text in cards/sidebar/header
Fixes #200
2015-07-06 00:29:15 -07:00
Paulus Schoutsen
65a74f68d5 Frontend: migrate to Polymer-based color picker 2015-07-06 00:28:22 -07:00
Ryan Kraus
90392ec303 Added app name display to Chromecast component. 2015-07-03 03:13:10 -04:00
Paulus Schoutsen
9cfefb64dd Rip out paper-menu because it is broken 2015-06-30 22:55:12 -07:00
Paulus Schoutsen
d4e9f26983 Clear password from input when logging out 2015-06-30 22:54:52 -07:00
Paulus Schoutsen
5316762a64 Frontend: Improve sidebar reliability on touch devices 2015-06-28 23:25:59 -07:00
Paulus Schoutsen
7a7ede22ea Frontend: extract voice command status component 2015-06-28 20:10:35 -07:00
Paulus Schoutsen
d719a09a58 Merge pull request #197 from theolind/dev
Added pyserial to requirements, needed by mysensors serial gateway
2015-06-28 18:48:44 -07:00
theolind
8d652ff34d Added pyserial to requirements, needed by mysensors serial gateway 2015-06-28 11:07:22 +02:00
Fabian Affolter
0fcc7d2b23 Merge branch 'dev' of github.com:fabaff/home-assistant into dev 2015-06-27 22:37:37 +02:00
Fabian Affolter
a34742040c remove unused stuff and update the names (same as in owm sensor) 2015-06-27 15:09:30 +02:00
Fabian Affolter
7f0c334391 Merge pull request #191 from fabaff/arduino
Arduino component
2015-06-27 13:14:29 +02:00
Fabian Affolter
694f9ec8e2 Merge branch 'dev' of github.com:fabaff/home-assistant into dev 2015-06-27 10:12:46 +02:00
Fabian Affolter
db5060b323 remove unused stuff and update the names (same as in owm sensor) 2015-06-27 10:11:37 +02:00
Fabian Affolter
f10c51b5f3 Merge pull request #192 from fabaff/owm-forecast
Forecast option for OpenWeatherMap sensor
2015-06-27 10:08:33 +02:00
Fabian Affolter
e971a01acd re-add unit 2015-06-27 09:59:05 +02:00
Fabian Affolter
0cd0d1ea97 another try (input from PyMata developer) 2015-06-25 15:54:33 +02:00
Fabian Affolter
84b6e499b3 Merge branch 'arduino' of github.com:fabaff/home-assistant into arduino 2015-06-25 13:13:42 +02:00
Fabian Affolter
169e7e9623 again requirements.txt 2015-06-25 13:12:15 +02:00
Fabian Affolter
ad1227d655 add pyserial 2015-06-25 13:11:22 +02:00
Fabian Affolter
636071a22a add arduino sensor platform 2015-06-25 13:11:22 +02:00
Fabian Affolter
20fd4ecb9a add arduino switch platform 2015-06-25 13:11:22 +02:00
Fabian Affolter
b33ae47a4c add arduino component 2015-06-25 13:11:22 +02:00
Fabian Affolter
0ebab8f612 add firmata bindings 2015-06-25 13:11:22 +02:00
Fabian Affolter
1eef88e85f add arduino component 2015-06-25 13:11:22 +02:00
Fabian Affolter
7b7e348837 Merge branch 'arduino' of github.com:fabaff/home-assistant into arduino 2015-06-25 11:43:28 +02:00
Fabian Affolter
34977b836a update pymata 2015-06-25 11:42:19 +02:00
Fabian Affolter
cda1374b49 add pyserial 2015-06-25 11:41:05 +02:00
Fabian Affolter
2c37fb639e add arduino sensor platform 2015-06-25 11:41:05 +02:00
Fabian Affolter
a01de8c90e add arduino switch platform 2015-06-25 11:41:05 +02:00
Fabian Affolter
a6f975d79f add arduino component 2015-06-25 11:41:05 +02:00
Fabian Affolter
457bd2339b add firmata bindings 2015-06-25 11:41:05 +02:00
Fabian Affolter
98a4f2fedc add arduino component 2015-06-25 11:41:05 +02:00
Paulus Schoutsen
5e79a8080b Frontend cleanup and bug fixes 2015-06-25 00:04:32 -07:00
Paulus Schoutsen
3f56b7e131 Frontend: oops, had some ES6 within Polymer 2015-06-24 14:12:28 -07:00
Paulus Schoutsen
b7b91f27db Frontend: fix bug where title was not shown for states partial 2015-06-23 23:43:14 -07:00
Paulus Schoutsen
ad15a14f5d Frontend: move hashchange/localstorage code into HA-JS 2015-06-23 23:22:32 -07:00
Paulus Schoutsen
2f876fb225 Merge remote-tracking branch 'origin/master' into dev 2015-06-23 20:44:19 -07:00
Paulus Schoutsen
2b9c0e637f Merge branch 'nuclear-js' into dev 2015-06-23 20:44:12 -07:00
Paulus Schoutsen
580adf8820 Frontend: reactor sidebar into own file 2015-06-23 20:43:59 -07:00
Fabian Affolter
892573e53e remove unused stuff and update the names (same as in owm sensor) 2015-06-23 12:34:55 +02:00
Fabian Affolter
fe600b7877 add forecast 2015-06-23 12:33:31 +02:00
Fabian Affolter
c4a0b41b8e update pyowm to 2.2.1 2015-06-23 08:23:53 +02:00
Paulus Schoutsen
d9e3c02df3 Update README.md 2015-06-22 15:03:02 -07:00
Paulus Schoutsen
8c2b6b5ca1 Merge pull request #189 from balloob/nuclear-js
Update frontend to use NuclearJS
2015-06-22 15:02:20 -07:00
Paulus Schoutsen
6f21f5f03e Merge pull request #190 from gitter-badger/gitter-badge
Add a Gitter chat badge to README.md
2015-06-22 15:02:14 -07:00
Fabian Affolter
1e4c401257 add pyserial 2015-06-22 19:00:38 +02:00
Fabian Affolter
8f8fdcdc82 add arduino sensor platform 2015-06-22 17:59:02 +02:00
Fabian Affolter
1d5a03a624 add arduino switch platform 2015-06-22 17:58:46 +02:00
Fabian Affolter
7a6a394bbf add arduino component 2015-06-22 17:58:27 +02:00
Fabian Affolter
c0721241e5 add firmata bindings 2015-06-22 17:57:49 +02:00
Fabian Affolter
8ce4635bd1 add arduino component 2015-06-22 17:57:09 +02:00
The Gitter Badger
aa44582575 Added Gitter badge 2015-06-22 07:49:23 +00:00
Paulus Schoutsen
49e9ae313c Merge pull request #186 from michaelarnauts/dev
Add TP-Link support for device_tracker
2015-06-22 00:34:17 -07:00
Paulus Schoutsen
ba7e252103 Merge pull request #188 from fabaff/file
File notification platform
2015-06-22 00:34:04 -07:00
Paulus Schoutsen
7ef0dec185 Update frontend to use NuclearJS 2015-06-22 00:25:56 -07:00
Fabian Affolter
13dac91fa6 remove blank line 2015-06-20 23:41:24 +02:00
Fabian Affolter
0269e89148 Merge branch 'file' of github.com:fabaff/home-assistant into file 2015-06-20 23:10:57 +02:00
Fabian Affolter
ef40b94a87 use with open 2015-06-20 23:03:53 +02:00
Fabian Affolter
832e9a631e add file notification platform 2015-06-20 19:57:11 +02:00
Fabian Affolter
3a1bc715b7 add file.py 2015-06-20 19:57:11 +02:00
Fabian Affolter
2f1b12a6f1 add file notification platform 2015-06-20 19:57:10 +02:00
Fabian Affolter
4221eef428 use a list and update docs 2015-06-20 16:33:19 +02:00
Fabian Affolter
c800508f87 update docs 2015-06-20 16:22:00 +02:00
Fabian Affolter
3abb185e16 add file notification platform 2015-06-20 11:00:20 +02:00
Fabian Affolter
d7dcee737b add file.py 2015-06-19 22:22:06 +02:00
Fabian Affolter
68a4928fb1 add file notification platform 2015-06-19 22:22:06 +02:00
Michaël Arnauts
abea8a2ff4 disable pylint warning, use correct format for mac addresses 2015-06-19 20:58:01 +02:00
Paulus Schoutsen
c9892569c9 Merge branch 'pr/185' into dev
Conflicts:
	requirements.txt
2015-06-18 23:45:37 -07:00
Paulus Schoutsen
26fcb9395e Merge pull request #187 from fabaff/systemmonitor
Systemmonitor sensor
2015-06-18 23:37:20 -07:00
Paulus Schoutsen
5ec85be299 Merge pull request #183 from ettisan/kodi
Kodi
2015-06-18 20:53:46 -07:00
Wolfgang Ettlinger
2017228503 clear all data when kodi is off 2015-06-18 11:46:02 +02:00
Wolfgang Ettlinger
689255dec0 fix detection of when Kodi is off/unreachable 2015-06-18 11:42:35 +02:00
Fabian Affolter
cdb1677b59 fix pylint issue 2015-06-17 23:58:14 +02:00
Fabian Affolter
cb35363e10 add missing resource 2015-06-17 23:46:48 +02:00
Fabian Affolter
05b70825fa add a couple of new resources 2015-06-17 23:42:11 +02:00
Michaël Arnauts
e5147235cc More code style fixes 2015-06-17 23:40:58 +02:00
Michaël Arnauts
c77dbaa67b Fix code guidelines 2015-06-17 23:32:33 +02:00
Michaël Arnauts
ac73c4db0f Add TP-Link support for device_tracker 2015-06-17 22:55:03 +02:00
Fabian Affolter
88923a8b18 update psutil to 3.0.0 2015-06-17 22:44:53 +02:00
Fabian Affolter
9b4b76d364 fix return value 2015-06-17 22:37:19 +02:00
Fabian Affolter
91b611acb7 fix return value 2015-06-17 22:36:54 +02:00
Fabian Affolter
7836cb2f01 add forecast.io sensor 2015-06-17 21:59:38 +02:00
Fabian Affolter
a31f9cd26a add forecast.py 2015-06-17 21:59:19 +02:00
Fabian Affolter
4a053ebda9 add python-forecastio 2015-06-17 21:58:23 +02:00
Wolfgang Ettlinger
4355686bd6 final draft of kodi module 2015-06-17 17:12:15 +02:00
Wolfgang Ettlinger
61638e8b72 Merge branch 'dev' of github.com:balloob/home-assistant into dev
Conflicts:
	requirements.txt
2015-06-17 13:45:59 +02:00
Wolfgang Ettlinger
cf07939792 first draft of kodi plugin 2015-06-17 13:44:39 +02:00
Paulus Schoutsen
bc6def277e Another fix for auto closing more info dialogs 2015-06-16 23:11:42 -07:00
Paulus Schoutsen
487c9e1e72 Update demo device tracker pictures 2015-06-16 22:49:41 -07:00
Paulus Schoutsen
8bb2ba2181 Bugfix for history that does not span 24h 2015-06-16 00:53:36 -07:00
Paulus Schoutsen
9fd850bf36 Make Wink update state less aggressive 2015-06-16 00:21:30 -07:00
Paulus Schoutsen
768e4a011e Merge pull request #182 from balloob/history-day-picker
History: Add support to fetch specific days
2015-06-16 00:13:47 -07:00
Paulus Schoutsen
f26ac070d5 History: Add support to fetch specific days 2015-06-16 00:08:57 -07:00
Paulus Schoutsen
d34ecd1c25 Merge pull request #180 from balloob/logbook-browser
Logbook - pick day to browse
2015-06-15 00:29:20 -07:00
Paulus Schoutsen
3381fff6bd Frontend: logbook - allow changing displayed day 2015-06-15 00:24:40 -07:00
Paulus Schoutsen
8a14f46595 Add support to logbook component to browse days 2015-06-14 22:56:55 -07:00
Paulus Schoutsen
4b7f8ca39d Merge pull request #179 from balloob/refactor-light
Refactor basic light structure
2015-06-14 20:01:33 -07:00
Paulus Schoutsen
3a8310c0cc Merge pull request #177 from balloob/refactor-switch
Refactor switch
2015-06-14 20:01:28 -07:00
Paulus Schoutsen
d3320963c3 Refactor basic light structure 2015-06-13 16:42:09 -07:00
Paulus Schoutsen
3d4392ce63 Refactor basic switch structure 2015-06-13 14:56:20 -07:00
Paulus Schoutsen
187da3a743 Merge branch 'dev' 2015-06-13 09:52:25 -07:00
Paulus Schoutsen
0f2a50c62f Fix frontend bug that opens more info dialog after toggle tap 2015-06-13 09:52:03 -07:00
Fabian Affolter
9792089b57 fix typo 2015-06-11 22:40:03 +02:00
Fabian Affolter
047ab10dde add comment 2015-06-11 22:33:55 +02:00
Fabian Affolter
39ccd1b3a4 fix typo 2015-06-11 22:32:58 +02:00
Fabian Affolter
f066c63900 add config details 2015-06-11 22:29:01 +02:00
Fabian Affolter
dd05d6878c add config details 2015-06-11 22:29:01 +02:00
Paulus Schoutsen
73ed0cd5bf Merge branch 'dev' 2015-06-11 09:15:00 -07:00
Paulus Schoutsen
d35591c5f4 Upgrade to latest pychromecast 2015-06-11 09:14:51 -07:00
Paulus Schoutsen
5f336621c0 Merge pull request #174 from eagleamon/dev
adds a coloourful log output
2015-06-11 08:47:53 -07:00
eagleamon
bcb4766f95 adds a coloourful log output 2015-06-11 15:01:11 +02:00
Paulus Schoutsen
26de87951a Merge branch 'dev'
Conflicts:
	homeassistant/components/media_player/cast.py
	requirements.txt
2015-06-11 00:36:31 -07:00
Paulus Schoutsen
58f4ab4e67 Bugfix frontend: show no state message when no states 2015-06-11 00:31:12 -07:00
Paulus Schoutsen
cac1c0d415 Bugfix for media player supported media commands 2015-06-11 00:17:44 -07:00
Paulus Schoutsen
2ea195a5d2 Merge pull request #158 from balloob/refactor-media-player
Initial refactor media player
2015-06-10 23:59:53 -07:00
Paulus Schoutsen
0f4de88b92 Fix PyLint import issue 2015-06-10 23:59:37 -07:00
Paulus Schoutsen
492ea478e7 Merge remote-tracking branch 'origin/dev' into refactor-media-player
Conflicts:
	homeassistant/components/frontend/version.py
2015-06-10 23:53:18 -07:00
Paulus Schoutsen
ae847994fc MPD platform fixes 2015-06-10 23:51:38 -07:00
Paulus Schoutsen
801eabe598 Bugfixes for media player more info dialog 2015-06-10 23:51:33 -07:00
Paulus Schoutsen
ca373b5aa5 Frontend: Workaround for tap bug in paper-dialog 2015-06-09 20:53:50 -07:00
Paulus Schoutsen
6c1a309c40 Minor CSS fixes for frontend 2015-06-09 00:26:15 -07:00
Paulus Schoutsen
8e50f50a48 Merge branch 'dev' into refactor-media-player
Conflicts:
	homeassistant/components/frontend/version.py
2015-06-08 23:08:00 -07:00
Paulus Schoutsen
5008b25a2d Fix MPD media player support 2015-06-08 23:06:41 -07:00
Paulus Schoutsen
90919a66d9 Fix Cast media player support 2015-06-08 22:49:43 -07:00
Paulus Schoutsen
452b082c82 Update media player core 2015-06-08 22:49:32 -07:00
Paulus Schoutsen
0b52b8c470 Fix more info dialog opening on touch devices 2015-06-08 21:08:27 -07:00
Paulus Schoutsen
7fa7ef103f Merge pull request #168 from fabaff/syslog
Syslog notifications
2015-06-07 22:46:15 -07:00
jamespcole
7a4d40a8fd Fixed some linting errors 2015-06-05 23:04:52 +10:00
jamespcole
aaf0ca2105 Very simple IP Camera support 2015-06-05 22:51:29 +10:00
Fabian Affolter
378d3798fd sync with ha.io 2015-06-04 18:18:26 +02:00
Fabian Affolter
d61bad16bf add links 2015-06-04 16:43:53 +02:00
Fabian Affolter
992706c5c1 update icon section 2015-06-04 16:33:34 +02:00
Fabian Affolter
3c50fc63c1 minor changes and fixes 2015-06-04 16:26:52 +02:00
Fabian Affolter
b8fcfbd182 add details about the pull requests and a quick-start section 2015-06-04 15:57:25 +02:00
Fabian Affolter
26c56d277e update doc 2015-06-04 09:53:43 +02:00
Fabian Affolter
fa7fc3ca5d fix pylint issues 2015-06-04 09:50:37 +02:00
Fabian Affolter
c78e1519af add syslog notification platform 2015-06-04 09:44:28 +02:00
Fabian Affolter
91764cacd9 add syslog.py 2015-06-04 09:44:10 +02:00
Hans Bakker
66024e5059 Initial update of cast device to MediaPlayerDevice. Added media_seek command and service to MediaPlayerDevice. 2015-06-04 00:17:03 +02:00
Paulus Schoutsen
6f09c0ae18 Merge pull request #167 from fabaff/smtp
SMTP notifications
2015-06-03 12:53:58 -07:00
Fabian Affolter
f24cd4feed add smtp notification platform 2015-06-03 20:39:16 +02:00
Fabian Affolter
d5efe33944 add smtp.py 2015-06-03 20:38:51 +02:00
Paulus Schoutsen
7f788d6be1 Update media player more info 2015-06-02 23:36:37 -07:00
Paulus Schoutsen
8e6ccea085 Update media player state card 2015-06-02 22:58:10 -07:00
Paulus Schoutsen
4cc8b0bda5 Merge branch 'dev' into refactor-media-player 2015-06-02 22:44:03 -07:00
Paulus Schoutsen
e1c880cb22 New frontend build 2015-06-02 22:41:44 -07:00
Paulus Schoutsen
7ba0b03e6c Frontend: do not open more info when tapping toggle 2015-06-02 22:38:57 -07:00
Paulus Schoutsen
b1cdf48ca0 Frontend: fix state card content showing outside of card 2015-06-02 22:25:44 -07:00
Paulus Schoutsen
a330f4c130 Update apple touch icon 2015-06-02 22:19:30 -07:00
Paulus Schoutsen
644a3058de Fix device tracker deadlock after exception in scanner 2015-06-02 21:39:33 -07:00
Paulus Schoutsen
73dab5a398 Make customize parsing more robust 2015-06-02 21:31:50 -07:00
Paulus Schoutsen
23b851fab4 Merge branch 'pr/166' into dev
Conflicts:
	requirements.txt
2015-06-02 18:47:47 -07:00
Fabian Affolter
a6b4d539a6 add zwave and nest 2015-06-02 23:28:59 +02:00
Fabian Affolter
73139a76a8 add ISY994 and modbus 2015-06-02 23:22:27 +02:00
Fabian Affolter
bf1a6f5899 add other sensors 2015-06-02 23:10:12 +02:00
Fabian Affolter
718ff6b326 add notifications and mpd 2015-06-02 23:02:34 +02:00
Fabian Affolter
16be76a038 add missing bracket 2015-06-02 22:41:57 +02:00
Fabian Affolter
3d1743d91d fix period 2015-06-02 22:37:08 +02:00
Fabian Affolter
a695da88df separate links 2015-06-02 22:26:26 +02:00
Fabian Affolter
c75c123d37 fix first sentence 2015-06-02 22:14:30 +02:00
Paulus Schoutsen
a8b6aeeb05 Merge pull request #157 from fabaff/swiss-public-transport
Swiss public transport
2015-06-02 09:57:41 -07:00
Finbarr Brady
b5ee05a13e docs 2015-06-02 17:33:05 +01:00
Finbarr Brady
b11320a5fb Bump version 2015-06-02 17:18:41 +01:00
Finbarr Brady
3701a82de1 Fix typo 2015-06-02 17:17:36 +01:00
Finbarr Brady
ebc0ffd879 https false 2015-06-02 17:14:12 +01:00
Paulus Schoutsen
066d515547 Merge pull request #163 from ettisan/switchcmds2
Switch cmds
2015-06-02 09:09:44 -07:00
Finbarr Brady
bbf8420d80 Updated component id 2015-06-02 16:04:45 +01:00
Wolfgang Ettlinger
5d1e0d5c44 fixed pylint warnings 2015-06-02 17:04:14 +02:00
Finbarr Brady
bae530b30d Delete original file 2015-06-02 16:03:29 +01:00
Finbarr Brady
84e81a9e4e Renamed hikvision component. Added module from pip 2015-06-02 16:00:29 +01:00
Fabian Affolter
82518fbbf4 Merge branch 'swiss-public-transport' of github.com:fabaff/home-assistant into swiss-public-transport 2015-06-02 15:57:45 +02:00
Fabian Affolter
512c4629b6 implement comments from #157 2015-06-02 15:54:53 +02:00
Fabian Affolter
4292c1f207 Revert "add timestamp to short time"
This reverts commit 1be50d83dc.

Conflicts:
	homeassistant/util/dt.py
2015-06-02 15:54:53 +02:00
Fabian Affolter
84c7149f0f update journey 2015-06-02 15:54:53 +02:00
Fabian Affolter
2317114b04 switch from error to execption for logger 2015-06-02 15:54:53 +02:00
Fabian Affolter
284dbff2d5 use string formatting 2015-06-02 15:54:53 +02:00
Fabian Affolter
713a03ad89 update depenency handling (requests) 2015-06-02 15:54:53 +02:00
Fabian Affolter
57e2a8a0c9 remove lat/long check 2015-06-02 15:54:53 +02:00
Fabian Affolter
a50ed46950 add shortcut 2015-06-02 15:54:53 +02:00
Fabian Affolter
a3cdb667ba add swiss_public_transport.py 2015-06-02 15:54:53 +02:00
Fabian Affolter
a70c32da3c add newline 2015-06-02 15:54:53 +02:00
Fabian Affolter
45d67176c5 add newline at the end 2015-06-02 15:54:53 +02:00
Fabian Affolter
c0c92a82e2 add swiss public transport sensor 2015-06-02 15:54:52 +02:00
Fabian Affolter
ba8d429a9f add timestamp to short time 2015-06-02 15:54:52 +02:00
Wolfgang Ettlinger
b35bdc606a style adaptions 2015-06-02 15:54:43 +02:00
Fabian Affolter
458838e9c6 implement comments from #157 2015-06-02 15:49:24 +02:00
Wolfgang Ettlinger
d91f414313 added generic module to switch swiches using shell commands 2015-06-02 15:40:02 +02:00
Paulus Schoutsen
eae52a8faf More target temperature nest fixes 2015-06-02 00:02:50 -07:00
Paulus Schoutsen
1585a91aec Add idle state to const.py 2015-06-01 23:55:54 -07:00
Paulus Schoutsen
bacff3de8d Add demo TV show player 2015-06-01 23:53:36 -07:00
Paulus Schoutsen
5eaf3d40ad Add demo music player 2015-06-01 23:42:19 -07:00
Paulus Schoutsen
a7b79fc8b2 Initial refactor media player 2015-06-01 23:06:46 -07:00
Paulus Schoutsen
dbf2f6223c Merge branch 'dev' into pr/156
Conflicts:
	requirements.txt
2015-06-01 23:00:37 -07:00
Paulus Schoutsen
66a380dd8e Ensure generate_entity_id returns valid entity ids 2015-06-01 22:55:33 -07:00
Paulus Schoutsen
a557cf388b Better approach writing default configuration 2015-06-01 22:50:57 -07:00
Paulus Schoutsen
17af1a68e8 Fix for Nest thermostats with a range as target temperature 2015-06-01 22:00:41 -07:00
Paulus Schoutsen
e56fccaefe Merge pull request #155 from fabaff/music-player-demon
Add Music player demon
2015-06-01 14:52:29 -07:00
wind-rider
e9c0cb74d8 Merge pull request #3 from balloob/media-player-muting
Volume muting fixes
2015-06-01 20:51:45 +02:00
Hans Bakker
a3f2f7c039 remove console.log 2015-06-01 20:51:21 +02:00
Fabian Affolter
c8111b988e Revert "add timestamp to short time"
This reverts commit 1be50d83dc.

Conflicts:
	homeassistant/util/dt.py
2015-06-01 14:02:27 +02:00
Fabian Affolter
1e5e06fef5 update journey 2015-06-01 13:51:00 +02:00
Fabian Affolter
90d55ef901 switch from error to execption for logger 2015-06-01 13:49:46 +02:00
Fabian Affolter
9d1e881f12 use string formatting 2015-06-01 13:49:08 +02:00
Fabian Affolter
da68e4ab11 update depenency handling (requests) 2015-06-01 13:47:32 +02:00
Fabian Affolter
1aa98bea2b remove lat/long check 2015-06-01 13:40:21 +02:00
Fabian Affolter
038bfde6aa add shortcut 2015-06-01 13:37:57 +02:00
Fabian Affolter
fb63198688 fix return values, disconnect from mpd, and fix pylint issue 2015-06-01 13:25:55 +02:00
Paulus Schoutsen
3b43fe7431 Fix PyLint issues 2015-05-31 22:13:02 -07:00
Paulus Schoutsen
15c3e2f516 Volume muting fixes 2015-05-31 21:07:58 -07:00
Hans Bakker
21cf7ceb07 minor update to more info card 2015-06-01 00:51:17 +02:00
Hans Bakker
321e821ae8 Update requirements.txt to include mute-capable pychromecast 2015-06-01 00:08:39 +02:00
Fabian Affolter
c8c3b825e4 add swiss_public_transport.py 2015-05-31 23:31:24 +02:00
Fabian Affolter
fafea688e4 add newline 2015-05-31 23:25:38 +02:00
Fabian Affolter
b1b0b2bc65 add newline at the end 2015-05-31 22:55:47 +02:00
Fabian Affolter
a6b7f47d74 add swiss public transport sensor 2015-05-31 22:55:02 +02:00
Fabian Affolter
1be50d83dc add timestamp to short time 2015-05-31 22:54:16 +02:00
Hans Bakker
938200478f Merge remote-tracking branch 'upstream/dev' into dev 2015-05-31 22:30:05 +02:00
Hans Bakker
81245495ae Add volume/mute button instead of text label, depends on new pychromecast method. Also I made the power button the only accented button. 2015-05-31 22:27:59 +02:00
Fabian Affolter
26c8d81dbf add configuration desc 2015-05-31 22:21:11 +02:00
Fabian Affolter
ab4ed2e032 add check 2015-05-31 20:53:19 +02:00
Fabian Affolter
cb9fe8d9ff update format 2015-05-31 20:53:18 +02:00
Fabian Affolter
bd561dea6e add mpd 2015-05-31 20:53:18 +02:00
Fabian Affolter
88523e6ffb add mpd bindings 2015-05-31 20:53:18 +02:00
Fabian Affolter
4a25b59d33 add period 2015-05-31 20:53:18 +02:00
Fabian Affolter
453b5a3e8c add initial mpd 2015-05-31 20:53:18 +02:00
Fabian Affolter
996322a2d3 add date 2015-05-31 20:53:18 +02:00
Paulus Schoutsen
9efc357226 Merge pull request #152 from wind-rider/dev
Initial commit for volume slider in media player more info card
2015-05-31 11:47:11 -07:00
wind-rider
5c48c87af0 Merge pull request #2 from balloob/media-player-volume
Fixes for Chromecast volume
2015-05-31 20:45:22 +02:00
Paulus Schoutsen
ed46a93848 Fixes for Chromecast volume
It was line 119 from cast.py that was driving me crazy
2015-05-31 11:37:54 -07:00
Paulus Schoutsen
3c31758826 Merge pull request #153 from fbradyirl/transmission-turtle
Transmission turtle
2015-05-31 08:41:52 -07:00
Finbarr Brady
bc8aa82a13 Removing toggle function as it is confusing things more than it should 2015-05-31 12:00:30 +00:00
Finbarr Brady
c1b62bf672 Only toggle if in the correct state. 2015-05-31 11:51:45 +00:00
Hans Bakker
c445563ab1 Fix pylint 2015-05-31 13:47:40 +02:00
Hans Bakker
b30bdbfc6a Initial commit for volume slider in media player more info card 2015-05-31 13:36:28 +02:00
Paulus Schoutsen
0583d63b67 Fix Cast platform detecting it was on while it was not 2015-05-31 01:29:28 -07:00
Paulus Schoutsen
afd99a0c6c Media Player and cast improvements 2015-05-31 00:38:14 -07:00
Paulus Schoutsen
678be46bb9 Add more info card for media player 2015-05-30 14:02:46 -07:00
Paulus Schoutsen
197611fe8e Upgrade cast entity from polling to pushing state 2015-05-30 12:35:35 -07:00
Paulus Schoutsen
1e7e9a9e02 Add a state card for media player 2015-05-30 12:08:35 -07:00
Paulus Schoutsen
e74806ab70 Fix Google Cast discovery 2015-05-30 11:41:39 -07:00
Paulus Schoutsen
10d74bb37e Add turn_on method to media_player 2015-05-30 11:29:49 -07:00
Paulus Schoutsen
6d125a8dfb Update missing dependency code for Cast 2015-05-30 10:54:27 -07:00
Paulus Schoutsen
bbf3bbcd4b Merge pull request #149 from fbradyirl/transmission-turtle
New Transmission turtle mode switch. Using existing TransmissionRpc r…
2015-05-30 07:48:35 -07:00
Paulus Schoutsen
43f89209d3 Merge pull request #148 from fbradyirl/luci-fix
Fix for getting device names using Luci. Tested on Barier Breaker.
2015-05-30 07:46:40 -07:00
Finbarr Brady
ecd09f22ef Support for Hikvision camera motion detection. 2015-05-30 13:44:29 +00:00
Finbarr Brady
1c55878271 New Transmission turtle mode switch. Using existing TransmissionRpc requirement. 2015-05-30 13:34:23 +00:00
Finbarr Brady
f110dc970d Fix for getting device names using Luci. Tested on Barier Breaker. 2015-05-30 13:30:34 +00:00
Paulus Schoutsen
96edd759a8 media_player.cast: support thumbnail + title 2015-05-30 00:53:29 -07:00
Paulus Schoutsen
f1843a57e0 media_player.cast: support thumbnail + title 2015-05-30 00:52:33 -07:00
Paulus Schoutsen
ef0eb8be02 Merge remote-tracking branch 'origin/master' into dev 2015-05-30 00:36:10 -07:00
Paulus Schoutsen
b332a9ed41 Merge pull request #147 from wind-rider/pychromecast-fixing
Make chromecast component work again
2015-05-30 00:32:23 -07:00
wind-rider
b011d14653 Merge pull request #1 from balloob/pychromecast-fixing-fixing
Update cast integration
2015-05-30 09:21:57 +02:00
Paulus Schoutsen
b50216600b Update cast integration 2015-05-29 22:36:40 -07:00
Paulus Schoutsen
5ccb7a5856 Merge pull request #132 from balloob/polymer-9
Upgrade to Polymer 1.0
2015-05-29 21:16:48 -07:00
Paulus Schoutsen
124d50e6d6 Polymer 1.0: Update to latest version 2015-05-29 20:26:07 -07:00
Paulus Schoutsen
c91b2cc795 Polymer 1.0: Fix layout issue in logbook 2015-05-29 20:05:05 -07:00
Paulus Schoutsen
a53265b76e Polymer 1.0: Fix listening bar in states partial 2015-05-29 17:57:52 -07:00
Hans Bakker
ac8a2d03d8 Fix play_pause command 2015-05-29 22:31:52 +02:00
Hans Bakker
3e01ce2a6c Proposed fixes to chromecast component 2015-05-29 22:19:42 +02:00
Paulus Schoutsen
24b575d21a Polymer 1.0: Update build script and add new build 2015-05-28 01:08:50 -07:00
Paulus Schoutsen
5367ac562c Polymer 1.0: Migrate to use paper-styles for font 2015-05-28 00:50:52 -07:00
Paulus Schoutsen
d503ee94f5 Polymer 1.0: Clean up 2015-05-28 00:42:26 -07:00
Paulus Schoutsen
63114b988f Polymer 1.0: Fix more info dialog closing on toggling entity 2015-05-28 00:02:18 -07:00
Paulus Schoutsen
69630a53f7 Polymer 1.0: Fix dialog appearance on small screens 2015-05-27 23:51:17 -07:00
Paulus Schoutsen
ce7e6d37ed Polymer 1.0: more info content style fixes 2015-05-27 23:43:00 -07:00
Paulus Schoutsen
ab7536ffd7 Polymer 1.0: style fixes 2015-05-27 23:30:22 -07:00
Paulus Schoutsen
2ce090e4b3 Polymer 1.0: more info light - reposition post transition 2015-05-27 22:48:15 -07:00
Paulus Schoutsen
986b843e0d Polymer 1.0: Remove unused styles 2015-05-27 22:47:50 -07:00
Paulus Schoutsen
26837ae8d3 Polymer 1.0: Bugfix - menu button works again 2015-05-27 22:47:37 -07:00
Paulus Schoutsen
1cdd5db29f Polymer 1.0: Clean up state badge 2015-05-27 22:47:11 -07:00
Paulus Schoutsen
cf7a1392ac Polymer 1.0: Use paper scroll header panel for partial states 2015-05-27 22:46:52 -07:00
Paulus Schoutsen
b0fdd45205 Polymer 1.0: Move attribute classnames logic to more info elements 2015-05-27 22:04:38 -07:00
Paulus Schoutsen
57d5022e3d Polymer 1.0: dev tools - fire event button now works 2015-05-27 22:03:24 -07:00
Paulus Schoutsen
a7f9a5c4ad Polymer 1.0: More info dialog bug fixes 2015-05-27 22:02:58 -07:00
Paulus Schoutsen
8b1d3c7658 Polymer 1.0 :-) 2015-05-27 22:02:36 -07:00
Paulus Schoutsen
95f0be6247 Merge pull request #144 from Dutchy-/track_new_devices
Add a configuration option to track new devices by default.
2015-05-27 00:45:48 -07:00
Paulus Schoutsen
99ccfc241c Merge pull request #143 from Dutchy-/master
Let the nmap device tracker return upper case MAC addresses.
2015-05-27 00:45:22 -07:00
Paulus Schoutsen
a8aa5b1447 Polymer .9: Convert more info contents 2015-05-27 00:44:47 -07:00
Paulus Schoutsen
e5f0e57980 Polymer .9: Fix history in more info dialogs 2015-05-26 23:32:11 -07:00
Fabian Affolter
531b702d65 fix typo 2015-05-26 17:02:38 +02:00
Edwin Smulders
41ec85053e Add a configuration option to track new devices by default. 2015-05-26 00:01:16 +02:00
Edwin Smulders
71ac550e7d Let the nmap device tracker return upper case MAC addresses. 2015-05-25 21:33:58 +02:00
Paulus Schoutsen
852305b996 Merge pull request #138 from fabaff/rewrite-owm
OpenWeatherMap sensor
2015-05-22 07:05:44 -07:00
Fabian Affolter
381d160e3b add throttle 2015-05-22 10:11:21 +02:00
Paulus Schoutsen
eb0584d466 Polymer .9: Style fixes 2015-05-22 00:21:47 -07:00
Paulus Schoutsen
76cf0e445d Polymer .9: Style fixes 2015-05-21 22:47:17 -07:00
Fabian Affolter
1d63e5a2df switch to list 2015-05-21 19:05:31 +02:00
Fabian Affolter
f9a8575414 fix typo 2015-05-21 18:43:38 +02:00
Fabian Affolter
3939d4e2f0 fix statement 2015-05-21 10:31:42 +02:00
Paulus Schoutsen
451cde7918 Polymer .9: Some cleanup 2015-05-20 23:42:46 -07:00
Paulus Schoutsen
69ae1d3534 Polymer .9: More info dialog with default content 2015-05-20 23:41:54 -07:00
Paulus Schoutsen
de243855c4 Polymer .9: Notifications 2015-05-20 22:41:58 -07:00
Paulus Schoutsen
9c71970d69 Merge pull request #128 from fabaff/bitcoin
Bitcoin sensor
2015-05-20 15:03:44 -07:00
Paulus Schoutsen
4f5ad3c7b6 Merge pull request #136 from balloob/master
Add LimitlessLED to dev branch
2015-05-20 14:28:35 -07:00
Fabian Affolter
2d1b934a1c minor updates 2015-05-20 18:30:57 +02:00
Fabian Affolter
9392f9b512 use throttle as balloob suggested 2015-05-20 18:30:57 +02:00
Fabian Affolter
397336e03c switch to list for options 2015-05-20 18:30:57 +02:00
Fabian Affolter
61148d8215 add throttle, rename variable, fix pylint issues 2015-05-20 18:30:57 +02:00
Fabian Affolter
4bed8647ac add bitcoin sensor 2015-05-20 18:30:57 +02:00
Fabian Affolter
022f6608b9 add blockchain as requirement 2015-05-20 18:30:57 +02:00
Fabian Affolter
827fd4d070 add bitcoin sensor 2015-05-20 18:30:57 +02:00
Alfie "Azelphur" Day
2b444b0a28 And fix the part where I'm being stupid 2015-05-20 18:30:57 +02:00
Alfie "Azelphur" Day
f52412df41 More pylint fixes 2015-05-20 18:30:56 +02:00
Alfie "Azelphur" Day
0e9dc61805 Fix some code styling violations 2015-05-20 18:30:56 +02:00
Alfie "Azelphur" Day
6132ed1967 Add ledcontroller to requirements.txt 2015-05-20 18:30:56 +02:00
Alfie "Azelphur" Day
5b1c372fdf Add configuration.yaml example in the header 2015-05-20 18:30:56 +02:00
Alfie "Azelphur" Day
c97ab456f2 Add basic support for LimitlessLED 2015-05-20 18:30:56 +02:00
Paulus Schoutsen
0466ae5e07 Merge pull request #134 from jamespcole/http-sessions
Added basic http sessions for authentication
2015-05-20 07:52:54 -07:00
jamespcole
26987148b5 Merge remote-tracking branch 'upstream/dev' into http-sessions
Merged in the latest upstream changes
2015-05-20 17:14:01 +10:00
jamespcole
5606d4bb12 fixed session error during automated tests 2015-05-20 17:13:13 +10:00
Paulus Schoutsen
5baf16ad6e Polymer .9: convert dev tools 2015-05-19 23:38:32 -07:00
jamespcole
a8e7903f39 refactored the session store into a separate class 2015-05-19 19:18:41 +10:00
Paulus Schoutsen
33122701b9 Polymer .9: Convert History 2015-05-18 23:49:48 -07:00
Paulus Schoutsen
f517445d36 Polymer .9: Remove workaround in sidebar 2015-05-18 18:43:32 -07:00
Paulus Schoutsen
9d41958b3a Merge pull request #135 from Azelphur/master
Add basic support for LimitlessLED
2015-05-18 18:40:35 -07:00
Alfie "Azelphur" Day
7087c20c4f And fix the part where I'm being stupid 2015-05-19 02:33:37 +01:00
Alfie "Azelphur" Day
cb54fb5a64 More pylint fixes 2015-05-19 02:31:30 +01:00
Alfie "Azelphur" Day
e2b08a1758 Fix some code styling violations 2015-05-19 02:09:34 +01:00
Alfie "Azelphur" Day
c43e014304 Add ledcontroller to requirements.txt 2015-05-19 01:58:16 +01:00
Alfie "Azelphur" Day
9c7f1d94c0 Add configuration.yaml example in the header 2015-05-19 01:55:37 +01:00
Alfie "Azelphur" Day
a86852fe90 Add basic support for LimitlessLED 2015-05-19 00:27:09 +01:00
jamespcole
80f0c42844 Refactored session handling into a separate class 2015-05-19 03:57:35 +10:00
James Cole
0a78b02bf1 Merge pull request #133 from jamespcole/vera-fixes
Vera fixes for UI7 firmware update
2015-05-19 03:09:46 +10:00
jamespcole
dba9f8854f Removed conversion to local time from UTC for last_tripped_time for vera sensors and switches 2015-05-19 00:31:59 +10:00
jamespcole
8431fd822f Fixed flake8 blank line error 2015-05-19 00:08:02 +10:00
jamespcole
be0f11b1a5 Updated example config with new session config option 2015-05-18 23:56:22 +10:00
jamespcole
721dc6dae4 Addd basic http sessions to the http component 2015-05-18 23:54:32 +10:00
jamespcole
39dee9d17c Merge branch 'dev-clean' into vera-fixes
Merged with upstream changes
2015-05-18 19:27:21 +10:00
jamespcole
1d7d0ea2d4 updated vera submodule to the latest version for the UI7 formware update 2015-05-18 19:18:53 +10:00
jamespcole
1c47ade641 Updated with new switch category for UI7 firmware update and fixed excpetion when trippable sensor has never been tripped 2015-05-18 18:54:25 +10:00
Paulus Schoutsen
52895658e5 Polymer .9: convert logbook 2015-05-18 00:16:57 -07:00
Paulus Schoutsen
c3645e463e Polymer .9: convert state cards 2015-05-17 23:09:25 -07:00
Paulus Schoutsen
4576a1d245 Polymer .9: show basic state cards 2015-05-17 22:08:42 -07:00
Paulus Schoutsen
313eb71b17 Polymer .9: sidebar 2015-05-17 13:31:48 -07:00
Paulus Schoutsen
8f51741c65 Merge pull request #131 from andythigpen/yaml-include
Fix issues with YAML include tag.
2015-05-16 11:45:42 -07:00
Andrew Thigpen
fc560d179e Fix issues with YAML include tag.
Calling load_yaml_config_file(config_path) causes issues when trying to
load from multiple files in a directory since config_path is modified in
the closure.

This also separates the parse code block into its own function so that
there is no restriction that the object be a dictionary for included
files.  This means that scalars, lists, etc. can also be stored in
separate files -- for example, the scene component expects a list.
2015-05-16 11:52:27 -05:00
Paulus Schoutsen
8d6bbb8c1a Polymer .9: foundation + login form 2015-05-16 02:24:06 -07:00
Paulus Schoutsen
e0d697d0bc Default to UTC if invalid timezone specified 2015-05-15 23:28:16 -07:00
Paulus Schoutsen
f3f2240e4a Remove usage of deprecated hass.local_api in __main__ 2015-05-15 23:28:16 -07:00
Paulus Schoutsen
e3e64a3a18 Merge pull request #130 from andythigpen/yaml-include
Add include YAML tag.
2015-05-15 22:34:50 -07:00
Andrew Thigpen
6ef60aa979 Add include YAML tag.
Allows including other files in the main configuration.yaml file.  With
this functionality, passwords or other sensitive information can be
stored in a separate file from the main configuration.
2015-05-15 20:10:30 -05:00
Paulus Schoutsen
00664ac601 Merge pull request #121 from balloob/dev
Update master with latest changes
2015-05-14 22:50:22 -07:00
Paulus Schoutsen
a4e0a7f235 Fix platform discovery not working 2015-05-14 21:36:12 -07:00
Paulus Schoutsen
ae0cf49560 UTC upgrades for scheduler, nmap tracker, dsl_trigger 2015-05-14 21:07:15 -07:00
Paulus Schoutsen
cd2b9ce975 Merge pull request #127 from andythigpen/mysensors-config
Update mysensors component to read debug, persistence values.
2015-05-14 17:30:31 -07:00
Paulus Schoutsen
3f8fd8aa09 Merge pull request #126 from andythigpen/script-utc
Fix UTC issue with script component.
2015-05-14 17:30:26 -07:00
Andrew Thigpen
8b8cb28259 Update mysensors component to read debug, persistence values. 2015-05-14 19:02:10 -05:00
Andrew Thigpen
ef138bb132 Fix utc issue with script component. 2015-05-14 18:54:13 -05:00
Fabian Affolter
fdb46d80ba Update documentation 2015-05-13 19:06:17 -07:00
Paulus Schoutsen
6b0e29ad55 Update git submodules 2015-05-13 00:14:50 -07:00
Paulus Schoutsen
8248dfa004 Merge pull request #122 from fabaff/beat
Add beat and utc to time_date sensor
2015-05-12 23:40:45 -07:00
Fabian Affolter
80f2ac5c3c add title to header 2015-05-13 08:17:38 +02:00
Fabian Affolter
7eaa8a3f16 fix typo 2015-05-13 08:15:53 +02:00
Fabian Affolter
1776430f6b fix typo 2015-05-13 08:14:00 +02:00
Fabian Affolter
584d3ea272 add utc and beat, use more appropriate variable names 2015-05-12 20:28:04 +02:00
Paulus Schoutsen
52f5c45ca8 Merge pull request #120 from balloob/chore-platform-dependencies
Allow platforms to specify dependencies.
2015-05-12 07:47:41 -07:00
Paulus Schoutsen
c523a0b509 Improve error message when prepare_setup_platform fails. 2015-05-11 22:29:53 -07:00
Paulus Schoutsen
4eeaa16f16 Convert some double to single quotes. 2015-05-11 22:23:38 -07:00
Paulus Schoutsen
e630476f9f Allow platforms to specify dependencies 2015-05-11 22:23:20 -07:00
Paulus Schoutsen
d7ab76106d Merge pull request #119 from balloob/feature-recorder-states-store-eventid
Recorder saves which event caused state change
2015-05-11 19:56:18 -07:00
Fabian Affolter
44045a02f2 update header 2015-05-11 18:06:25 +02:00
Fabian Affolter
6b42227b13 update header 2015-05-11 18:06:12 +02:00
Fabian Affolter
61e1f56922 update header 2015-05-11 18:05:58 +02:00
Fabian Affolter
2539c93783 update header 2015-05-11 18:05:46 +02:00
Fabian Affolter
8f5a9859c3 update header 2015-05-11 18:05:35 +02:00
Fabian Affolter
21e2898868 fix typo 2015-05-11 17:27:25 +02:00
Fabian Affolter
69cc3c8261 add ddwrt 2015-05-11 17:26:18 +02:00
Paulus Schoutsen
df18acbabb Recorder saves which event caused state change 2015-05-10 23:41:42 -07:00
Paulus Schoutsen
c719e7dc31 Allow config.path to take multiple arguments 2015-05-10 23:05:37 -07:00
Paulus Schoutsen
0a28f3f648 Merge pull request #115 from fabaff/xmpp
Xmpp notifications
2015-05-10 22:57:41 -07:00
Fabian Affolter
67ca009690 update header 2015-05-10 23:49:09 +02:00
Fabian Affolter
ec0dd39220 update header 2015-05-10 23:45:47 +02:00
Fabian Affolter
379171e302 update header 2015-05-10 23:44:27 +02:00
Fabian Affolter
24499d7bed update header 2015-05-10 23:43:37 +02:00
Fabian Affolter
2ab1ce7b83 update title in header 2015-05-10 23:27:22 +02:00
Fabian Affolter
76fd70657a remove deprecated parameter 2015-05-10 23:22:06 +02:00
Fabian Affolter
f103d5964e remove deps of sleekxmpp 2015-05-10 23:20:36 +02:00
Fabian Affolter
7b0765e064 add xmpp.py 2015-05-10 22:23:25 +02:00
Fabian Affolter
07b5f3d597 initial xmpp nofication platform 2015-05-10 22:23:25 +02:00
Fabian Affolter
0e9685e55f add requirements for xmpp notifications 2015-05-10 22:23:25 +02:00
Paulus Schoutsen
b6c88b1a6c Merge pull request #116 from fabaff/time-date
Time date sensor
2015-05-08 13:51:58 -07:00
Fabian Affolter
9f042db0f5 call dt_util.now() only once, add additional format 2015-05-08 18:50:57 +02:00
Fabian Affolter
03993cd5fa fix if and remove tz 2015-05-08 18:39:28 +02:00
Fabian Affolter
079ec43291 remove list 2015-05-08 18:31:48 +02:00
Fabian Affolter
b55e8fc4c4 add time_date.py 2015-05-08 17:44:27 +02:00
Fabian Affolter
f72cedf446 add missing space 2015-05-08 17:03:42 +02:00
Fabian Affolter
5266e10140 add new methods for date/time output 2015-05-08 17:00:12 +02:00
Fabian Affolter
503a2adc38 add date & time sensor 2015-05-08 16:59:46 +02:00
Paulus Schoutsen
dfc50562a1 Update netdisco to latest version 2015-05-04 00:35:36 -07:00
Paulus Schoutsen
5452221cd2 Frontend bugfixes 2015-05-01 22:54:59 -07:00
Paulus Schoutsen
972743cb63 Fix style issue 2015-05-01 20:56:10 -07:00
Paulus Schoutsen
916c30072b Update frontend dependencies and compile new version 2015-05-01 20:49:02 -07:00
Paulus Schoutsen
30f78f7fa6 Add API endpoint to bootstrap frontend 2015-05-01 19:02:29 -07:00
Paulus Schoutsen
ca8be5015a Add config API endpoint 2015-05-01 18:24:32 -07:00
Paulus Schoutsen
e07fbbbcd8 Merge pull request #114 from fabaff/weather
OpenWeatherMap sensor
2015-05-01 14:16:47 -07:00
Fabian Affolter
fd6de36d2c add openweathermap, sort the content alphabetically 2015-05-01 21:56:42 +02:00
Fabian Affolter
70f1ec9dce add openweathermap sensor 2015-05-01 21:52:34 +02:00
Fabian Affolter
4001a2d316 add pyown 2015-05-01 17:05:46 +02:00
Paulus Schoutsen
20bdc82cba Do not show history in more info if component not loaded 2015-05-01 06:14:38 -07:00
Paulus Schoutsen
2196f77081 Exclude __main__ from coveragerc 2015-04-30 22:44:41 -07:00
Paulus Schoutsen
09f1983d40 Update dependency check in __main__ 2015-04-30 22:44:24 -07:00
Paulus Schoutsen
a752bc012c Merge pull request #113 from balloob/refactor-utc
Refactor to use UTC internally
2015-04-30 22:07:43 -07:00
Paulus Schoutsen
29e376a66e Assign unique ports for history and logbook tests 2015-04-30 21:59:24 -07:00
Paulus Schoutsen
2cad421de9 Add tests for logbook component 2015-04-30 21:53:10 -07:00
Paulus Schoutsen
17cc9a43bb Add tests for history component 2015-04-30 21:03:01 -07:00
Paulus Schoutsen
cf5278b7e9 Add tests for recorder component 2015-04-29 23:21:31 -07:00
Paulus Schoutsen
fd67e47128 Add tests for device_sun_light_trigger 2015-04-29 22:26:54 -07:00
Paulus Schoutsen
ef470de3ca Update coveragerc to hide latest device components 2015-04-29 22:25:19 -07:00
Paulus Schoutsen
5105c5f200 Update coveragerc to hide latest device components 2015-04-29 09:01:27 -07:00
Paulus Schoutsen
040dd3c409 Strip microseconds on state.last_updated 2015-04-29 08:18:53 -07:00
Paulus Schoutsen
10a5db7924 UTC bugfix for more-info-sun 2015-04-28 23:50:53 -07:00
Paulus Schoutsen
3720333927 UTC bugfixes 2015-04-28 22:38:43 -07:00
Paulus Schoutsen
54904a1630 Make frontend UTC aware 2015-04-28 22:34:44 -07:00
Paulus Schoutsen
e0ecb64a10 Use UTC as the internal datetime format 2015-04-28 19:12:05 -07:00
Paulus Schoutsen
847d049f1c Merge pull request #109 from fabaff/instapush
Instapush notification
2015-04-28 07:04:38 -07:00
Fabian Affolter
234669f469 fix format 2015-04-28 09:43:53 +02:00
Paulus Schoutsen
7a529aee63 Merge pull request #112 from fabaff/nma
Nma notifications
2015-04-27 23:56:14 -07:00
Fabian Affolter
14d0c1325c fix format 2015-04-28 08:45:40 +02:00
Fabian Affolter
b76b002966 try to pass travis build 2015-04-27 23:51:59 +02:00
Fabian Affolter
8b64e905b8 fix pylint error 2015-04-27 23:34:17 +02:00
Fabian Affolter
5ca1a80ad5 fix pylint errors 2015-04-27 19:47:27 +02:00
Fabian Affolter
94e004a828 rework to include checks on boot 2015-04-27 19:34:34 +02:00
Fabian Affolter
69799bd11e minor layout changes 2015-04-27 14:55:51 +02:00
Fabian Affolter
4a5c32e375 no longer use pynma and check if keys are ok 2015-04-27 14:52:22 +02:00
andythigpen
362e176397 Merge pull request #89 from andythigpen/mysensors
MySensors support
2015-04-26 13:03:31 -05:00
Fabian Affolter
7593ecb870 initial instapush notification 2015-04-26 19:48:26 +02:00
Paulus Schoutsen
cb7b0d8a4f Merge pull request #108 from balloob/chore-improve-config
Refactor config files into separate module
2015-04-26 10:31:59 -07:00
Paulus Schoutsen
ad016de653 Move config code to separate module + test cover it 2015-04-26 10:05:01 -07:00
Paulus Schoutsen
5e6a502167 Merge pull request #107 from balloob/chore-sun-entity
Sun component to use Entity ABC
2015-04-26 06:01:11 -07:00
Andrew Thigpen
3cff05ef91 Create entity for each sensor variable.
Refactors to create a separate entity for each variable associated with
a child sensor.
2015-04-25 21:08:49 -05:00
Paulus Schoutsen
bc3af134f9 Minor cleanup demo component 2015-04-25 17:44:05 -07:00
Paulus Schoutsen
3650a2fa85 Sun component now uses Entity ABC 2015-04-25 17:43:22 -07:00
Ryan Kraus
c2db17df9a Merge pull request #101 from automicus/master
State decorating, ISY component update
2015-04-25 18:37:59 -04:00
Ryan Kraus
45f2f07b6d Used better method for overwritting attributes in entity. 2015-04-25 18:29:37 -04:00
Ryan Kraus
be3be0478b Fixed bug in entity helper that ignored suggestions for hiding states. 2015-04-25 14:59:27 -04:00
Ryan Kraus
97bb5bcb7d Merge remote-tracking branch 'upstream/dev' 2015-04-25 14:49:02 -04:00
Ryan Kraus
8255164eda Rearranged visibility control and image control in the configuration file. Now a single generic clause can be used to customize any attribute. 2015-04-25 14:47:15 -04:00
Paulus Schoutsen
63c5ebf428 Fix #102 - Installing PyISY no longer required to load any light 2015-04-25 06:54:40 -07:00
Paulus Schoutsen
a9006f540f Fix #102 - Installing PyISY no longer required to load any light 2015-04-25 06:07:07 -07:00
Ryan Kraus
04a98f99b7 Updated entity tests to work with new attribute overwritting logic. 2015-04-25 01:43:03 -04:00
Ryan Kraus
a95aad324f Updated a comment in the entity class. 2015-04-25 01:29:42 -04:00
Ryan Kraus
f130ad6c27 Subscribed isy994 component to EVENT_HOMEASSISTANT_STOP event to clean itself up before quitting. 2015-04-25 01:10:41 -04:00
Ryan Kraus
f77b3dbd0a Added decorate option to configuration file to allow a user to set custom images for different entities. 2015-04-25 00:39:35 -04:00
Paulus Schoutsen
31a22d4c6a Merge pull request #100 from balloob/dev
Update master with latest changes
2015-04-24 21:02:14 -07:00
Paulus Schoutsen
4d0265cb7d Add timeout to auto detect config 2015-04-24 20:57:25 -07:00
Fabian Affolter
07f62fda32 inital nma notify component 2015-04-24 22:27:16 +02:00
Paulus Schoutsen
24bb89df23 Compiled new version of frontend 2015-04-24 08:52:37 -07:00
Paulus Schoutsen
424f05a4da Add logbook to default configuration 2015-04-24 08:47:11 -07:00
Paulus Schoutsen
41b02928ef Merge pull request #99 from fabaff/typos
Minor fix
2015-04-24 06:03:39 -07:00
Fabian Affolter
46819acaff Fix two typos 2015-04-24 08:26:41 +02:00
Paulus Schoutsen
44cd5ca15e Merge pull request #98 from balloob/chore-tweak-visibility-config
Tweak visibility config
2015-04-23 10:21:11 -07:00
Paulus Schoutsen
25a900c759 Merge pull request #97 from balloob/chore-group-entity
Have group inherit from entity
2015-04-23 09:59:01 -07:00
Paulus Schoutsen
968de0557a Update CONTRIBUTING.md 2015-04-23 09:58:43 -07:00
Paulus Schoutsen
8f36cf3c81 Clean up Entity helper test code 2015-04-23 07:33:59 -07:00
Paulus Schoutsen
b855f422ef Tweak visibility config 2015-04-23 06:41:41 -07:00
Paulus Schoutsen
bbdb0320f1 Have group inherit from entity 2015-04-22 22:31:16 -07:00
Paulus Schoutsen
1dd26fcd73 Merge pull request #96 from automicus/master
Added support for ISY994 Insteon and X10 Controller (and other updates)
2015-04-22 21:37:32 -07:00
Ryan Kraus
dc4ff25d5b 1) Upped the requirement for PyISY to version 1.0.2. 2) Omitted isy994 components from coveralls tests because it requires an external controller. 2015-04-22 23:10:51 -04:00
Ryan Kraus
bd3b93f290 1) Added visibility documentation to the CONTRIBUTING.md documentation. 2) Pylint fixes to homeassistant/helpers/entity.py 2015-04-22 22:19:36 -04:00
Ryan Kraus
d779662bdd Updated get_entities.py script to use argparse module. 2015-04-22 22:02:54 -04:00
Ryan Kraus
2b6edd153b Fixed copy pasta error. 2015-04-22 21:27:49 -04:00
Ryan Kraus
ff3dacedc0 Moved card visibility logic out of the Entity class and into a VisibilityABC. Then made the Group class inherit the VisibilityABC. No duplication of code now. This is definitely better. 2015-04-22 21:21:50 -04:00
Ryan Kraus
8fcf814eb6 Changed visbility property in configuration.yaml to a hash instead of a list of a single hash. 2015-04-22 21:07:23 -04:00
Ryan Kraus
2b4c75543a 1) Merged with mainline dev branch. 2) Removed assumption in homeassistant/__init__.py that states are visible if not specified. This assumption is intrinsic in the JavaScript. 3) Recompiled frontend to assist merge. 2015-04-22 21:04:52 -04:00
Ryan Kraus
d566a328a3 pylint fix to isy switches. 2015-04-22 00:22:48 -04:00
Ryan Kraus
99ea0dc59d Updated requirements to include PyISY. 2015-04-21 23:59:56 -04:00
Ryan Kraus
4d91c4a51b Updated contributing documentation to include details about hidding states. 2015-04-21 23:58:41 -04:00
Ryan Kraus
3b0c685679 Merge remote-tracking branch 'upstream/master' 2015-04-21 23:56:50 -04:00
Paulus Schoutsen
0e2cf6532b Merge pull request #95 from kixam/master
simplistic Modbus implementation
2015-04-21 15:00:06 -07:00
Aurélien Correia
4d6555441d Passed Travis CI 2015-04-21 16:40:13 +02:00
Aurélien Correia
5ce95f6b88 Merge remote-tracking branch 'upstream/master' 2015-04-21 15:26:26 +02:00
Paulus Schoutsen
23902a62d7 Merge pull request #94 from wind-rider/patch-1
Update CONTRIBUTING.md
2015-04-20 21:46:58 -07:00
wind-rider
be9a1d6b27 Update CONTRIBUTING.md
Updated icon list url
2015-04-21 00:12:39 +02:00
Ryan Kraus
0032e4b6cf On second thought, make that script use the specified order, not a sorted order. 2015-04-18 00:30:09 -04:00
Ryan Kraus
9a2e6dcba5 Added a script for listing entities in running Home Assistant server. Usefule for creating visibility list in configuration file. 2015-04-18 00:26:40 -04:00
Ryan Kraus
da4cf61a09 Forced the isy994 component to treat underscores as spaces. 2015-04-17 09:30:20 -04:00
Ryan Kraus
6b2dd69bcb Updated isy994 component to hide any device with the HIDDEN STRING in its ancestry. 2015-04-17 09:27:14 -04:00
Aurélien Correia
fb6b514c34 Adding simplistic support for Modbus sensor and switch (based on pymodbus) 2015-04-15 16:47:42 +02:00
Ryan Kraus
b20424261c 1) Performed many pylint and flake8 fixes to clean up isy994 integration and hidden entities addition. 2) Added necessary code to allow groups to also be hidden. 3) Made most of the weather data from the isy994 component be hidden by default. 2015-04-15 02:05:34 -04:00
Ryan Kraus
caed69d5ea Added state card hiding to the STATE view on the frontend. 2015-04-14 23:55:08 -04:00
Ryan Kraus
0334074a52 Quick fix to the comparison to validate if an entity is hidden. 2015-04-14 23:38:14 -04:00
Ryan Kraus
a3d6972268 1) Added basic back-end framework for supporting hidden entities. 2) Enabled hidden suggestions in the isy994 component entities. 2015-04-14 22:57:32 -04:00
Ryan Kraus
c76644323f Updated the broken link to the apple-touch icon in the frontend. 2015-04-14 01:44:39 -04:00
Ryan Kraus
83aea10f06 Added hidden_string and sensor_string properties to the isy994 configuration to allow nodes to be hidden and to be handled as sensors. Implimented the sensor_string. Any node name that contains the sensor_string in its name will be treated as a sensor instead of a switch or light. The hidden_string will be implimented later. 2015-04-13 12:56:37 -04:00
Ryan Kraus
0e9a8a7cc2 Added custom program sensors to the isy994 component. 2015-04-13 01:47:32 -04:00
Ryan Kraus
510064d9c8 Added support for the creation of custom switches using the ISY994 device. 2015-04-12 22:30:14 -04:00
Ryan Kraus
4e3ccfffbb Added not dimming Insteon devices on an ISY controller as switches. 2015-04-12 17:18:14 -04:00
Ryan Kraus
f6d75f2db2 Cleaned up ISY994 light and sensor code to use the same abstract class. 2015-04-12 16:45:23 -04:00
andythigpen
dfbeddf1f7 Update .coveragerc 2015-04-11 11:29:23 -05:00
James Cole
2dd96c584b Merge pull request #91 from jamespcole/line-chart-dev
Removed interactivity on the small more-info version of the line graphs that was causing scrollbars issues
2015-04-11 19:09:46 +10:00
jamespcole
c75e145151 rebuild of the frontend 2015-04-11 19:02:44 +10:00
jamespcole
a478ec6697 Removed interactivity from small view of line charts which was causing scrollbar issues on more-info card 2015-04-11 19:01:17 +10:00
Malte Deiseroth
0ed608abff little bug 2015-04-07 21:10:16 +02:00
James Cole
992a926592 Merge pull request #88 from jamespcole/transmission-dev
Adds basic support for Transmission torrent client as a sensor.
2015-04-08 00:57:05 +10:00
jamespcole
439b7be77d Added the new transmission sensor to the coveragerc file 2015-04-08 00:35:57 +10:00
James Cole
5eabc15a7d Merge pull request #87 from jamespcole/dev
Added init script for HA on the raspberry pi
2015-04-08 00:14:57 +10:00
jamespcole
4f222e64e6 Added init script for HA on the raspberry pi 2015-04-08 00:07:24 +10:00
jamespcole
df9e8f5214 Merge branch 'dev' into transmission-dev
Merging in the latest from the dev branch
2015-04-07 23:47:57 +10:00
James Cole
20e07a8387 Merge pull request #86 from jamespcole/line-chart-dev
Merged new line chart history view for devices with a unit_of_measurement specified
2015-04-07 23:45:50 +10:00
jamespcole
e63d0d7aac Tidied up the documentations and linting warnings 2015-04-07 23:21:41 +10:00
jamespcole
e65ad67b32 Fixed some alignment issues and added loading spinner 2015-04-07 22:21:13 +10:00
jamespcole
56184daf59 Fixed linting warnings 2015-04-07 18:01:23 +10:00
jamespcole
100a75908b Fixed bug in history component where the entity id filtering was not being applied correctly 2015-04-07 02:25:03 +10:00
jamespcole
ba13f78d49 Added initial Transmission torrent client sensor 2015-04-06 22:13:04 +10:00
jamespcole
89527d3bb2 rebuilt frontend with line graph support 2015-04-06 18:26:47 +10:00
jamespcole
8151de1ae0 Added zoom options to line graphs 2015-04-06 18:15:13 +10:00
jamespcole
7d997f7699 updated the ha js 2015-04-06 15:40:26 +10:00
jamespcole
cae2a11f7b removed unneeded loading messages 2015-04-06 15:22:52 +10:00
jamespcole
b1f01506ce Added in some comments 2015-04-06 14:37:01 +10:00
Andrew Thigpen
4d47d313f9 Add mysensors support for metric/imperial units. 2015-04-05 17:25:10 -05:00
Andrew Thigpen
0e9d826d41 Push mysensor state instead of polling. 2015-04-05 17:25:10 -05:00
Andrew Thigpen
c72a735851 Use stop method for mysensors on shutdown. 2015-04-05 17:25:09 -05:00
Andrew Thigpen
c41d7b8f6d Refactor and update to use latest pymysensors. 2015-04-05 17:25:06 -05:00
jamespcole
264bc15091 Fixed the line charts 2015-04-05 02:11:27 +10:00
jamespcole
b6e880ed73 Fixed the line charts 2015-04-05 02:03:16 +10:00
jamespcole
12d88c2c2a Added loading spinner to the history screen 2015-04-05 01:06:04 +11:00
jamespcole
c14fa299e1 Improved the efficiency and accuracy of the line graphs 2015-04-05 00:49:52 +11:00
Ryan Kraus
57f27cc97a Addded light controls to isy994 component. 2015-04-04 06:13:27 -04:00
Ryan Kraus
80f1581d6e Added ISY994 weather data as sensors. 2015-04-04 04:33:03 -04:00
jamespcole
a86c53236d refactored line chart to be more efficient 2015-04-04 17:55:30 +11:00
jamespcole
2576659923 refactored line graph code 2015-04-04 17:27:05 +11:00
jamespcole
bc54d9777d refactored line graph code 2015-04-04 17:21:15 +11:00
jamespcole
b50023ede1 refactored line graph code 2015-04-04 16:28:13 +11:00
jamespcole
9499a8297a Merge branch 'dev' into line-chart-dev
merging in the latest changes
2015-04-04 11:07:28 +11:00
jamespcole
24dbc1f3d9 merged with upstream 2015-04-04 08:55:40 +11:00
Paulus Schoutsen
5ec686b030 Merge pull request #81 from balloob/dev
Update master with latest changes
2015-04-03 00:32:13 -07:00
theolind
e87652e95f added HA module for mysensors 2015-04-02 19:59:44 +02:00
Paulus Schoutsen
b0bf775da8 Compile new version frontend 2015-04-01 21:49:03 -07:00
Paulus Schoutsen
e43eee2eb1 Style fixes 2015-04-01 07:18:03 -07:00
Paulus Schoutsen
57b3e8018b Logbook bug fixes 2015-03-31 23:09:08 -07:00
Paulus Schoutsen
00bbc17e11 Add State.last_updated to JSON obj 2015-03-31 23:08:38 -07:00
Paulus Schoutsen
b02c11c31d Merge pull request #80 from balloob/component-logbook
Add component logbook
2015-03-31 09:12:03 -07:00
Paulus Schoutsen
30e7f09000 Clean up logbook component 2015-03-30 00:19:56 -07:00
Paulus Schoutsen
742479f8bd Have logbook group HA stop + start 2015-03-30 00:11:24 -07:00
Paulus Schoutsen
6455f1388a Have logbook only report each sensor every 15 minutes 2015-03-29 23:57:52 -07:00
Paulus Schoutsen
9fb634ed3a Fix type in CSS class name 2015-03-29 15:23:50 -07:00
Paulus Schoutsen
100081757c Add logbook to frontend 2015-03-29 14:50:41 -07:00
Paulus Schoutsen
234bfe1199 Add logbook component 2015-03-29 14:47:21 -07:00
Paulus Schoutsen
a2f8fa7b05 Add time_fired to Event class 2015-03-29 14:47:20 -07:00
Paulus Schoutsen
a21673069b Bugfix for states at point in time on new databases 2015-03-29 09:42:24 -07:00
James Cole
1c593c9c3c Merge pull request #79 from jamespcole/vera-dev
Refactored vera temp sensors to use temperature contstants and conversion
2015-03-30 00:59:43 +11:00
jamespcole
c067cddbe8 Refactored vera temp sensors to use temperature contstants and conversion 2015-03-30 00:51:03 +11:00
Malte Deiseroth
afcf3eaac3 - add ds18S20 1-Wire sensor support
- gitignore emacs backup files
2015-03-29 14:48:17 +02:00
Paulus Schoutsen
3e525fbe1b Merge pull request #77 from jamespcole/ddwrt-dev
Ddwrt dev
2015-03-28 17:52:17 -07:00
jamespcole
0b6d260fa6 fixed flake8 blank lines error 2015-03-29 11:49:07 +11:00
jamespcole
007d0d9ce9 Added ddwrt component to coveragerc 2015-03-29 11:44:02 +11:00
jamespcole
fda44cdbf7 Moved compiled regex to a constant for efficiency 2015-03-29 11:40:21 +11:00
jamespcole
242c143c85 refactored ddwrt data format parsong code 2015-03-29 11:30:04 +11:00
Paulus Schoutsen
522bbfb716 Expose to more info content if dialog is open 2015-03-28 13:41:07 -07:00
jamespcole
a959c48708 Fixed travis another CI indenting error 2015-03-28 19:17:51 +11:00
jamespcole
a9ce12be34 Fixed travis CI indenting error 2015-03-28 18:59:12 +11:00
jamespcole
05239c26f9 Forgot to add README.md file changes to last commit 2015-03-28 18:50:24 +11:00
jamespcole
fc07032d35 Fixed some code formatting and added dd-wrt to the readme 2015-03-28 18:43:41 +11:00
jamespcole
7e6af57186 FIxed some linting issues 2015-03-28 18:29:45 +11:00
Paulus Schoutsen
5a0251c3cd ps: Fix recorder.py fetching wrong run information 2015-03-27 23:11:07 -07:00
jamespcole
c8c38e498a Added a device tracker for dd-wrt routers 2015-03-28 03:51:33 +11:00
Paulus Schoutsen
70bce24b0a Merge pull request #73 from balloob/nmap-lock
Improve NMAP lock issues
2015-03-26 14:17:09 -07:00
Paulus Schoutsen
4484baa866 Remove lock and add host timeout to NMAP scanner 2015-03-25 22:50:51 -07:00
Paulus Schoutsen
c3fc19353b Fix device tracker waiting forever when platform gets stuck 2015-03-25 22:50:20 -07:00
Paulus Schoutsen
cd60f9a8e2 Merge pull request #71 from Jaidan/ignores
Add python-version file to gitignore
2015-03-23 13:22:01 -07:00
John Williams
8d78651606 Add python-version file to gitignore 2015-03-23 20:18:07 +00:00
Paulus Schoutsen
ea200dea40 Merge pull request #70 from balloob/dev
Update master with latest changes
2015-03-21 23:26:00 -07:00
Paulus Schoutsen
ec557f8d44 Fix broken tellstick and systemmonitor sensors 2015-03-21 22:26:41 -07:00
Paulus Schoutsen
49d7901585 Tweaks to EntityComponent.setup_platform 2015-03-21 22:21:57 -07:00
Paulus Schoutsen
cdd5d1196a Fix regression from refactoring EntityComponent 2015-03-21 22:14:30 -07:00
Paulus Schoutsen
06d85595a0 Update coveragerc 2015-03-21 22:09:25 -07:00
Paulus Schoutsen
2863c2d593 Made bootstrap.setup_component more robust 2015-03-21 22:06:59 -07:00
Paulus Schoutsen
58812b326c Move hass.local_api and hass.components to config object 2015-03-21 22:06:59 -07:00
James Cole
609064b9d8 Merge pull request #68 from jamespcole/nzb-dev
Fixed attribute error with new unit_of_measurement changes
2015-03-22 16:06:34 +11:00
Paulus Schoutsen
64435c87df Merge pull request #69 from jamespcole/pushover-dev
Pushover notification support
2015-03-21 22:02:56 -07:00
jamespcole
470096047b removed unused imports 2015-03-22 15:43:59 +11:00
jamespcole
7a2aa43caa Fixed incorrect URL in config instructions 2015-03-22 15:37:43 +11:00
jamespcole
58fd07e4c6 fixed the flake8 and pylint warnings 2015-03-22 15:32:47 +11:00
jamespcole
04d16d7607 removed unused state attributes that are no longer required after upstream changes 2015-03-22 15:18:58 +11:00
jamespcole
20f52a7fb1 Made API Key a required config variable 2015-03-22 15:13:57 +11:00
jamespcole
e877ed01af Fixed attribute error with new unit_of_measurement changes 2015-03-22 14:43:20 +11:00
jamespcole
a0f1c1d17a Added support for pushover notifications 2015-03-22 14:36:58 +11:00
Paulus Schoutsen
e872435870 Tellstick sensor: Lookup sensor ids as ints 2015-03-21 19:38:43 -07:00
Paulus Schoutsen
bbfd97e2b8 Migrate components to use EntityComponent 2015-03-21 19:37:18 -07:00
Paulus Schoutsen
a9324ba9d4 Update components to use Entity instead of Device 2015-03-21 19:16:13 -07:00
Paulus Schoutsen
d3f0210b1a Refactor helper.device to helper.entity
Introduces a minor backwards compatible change: device_component
function add_devices is renamed to add_entities.
2015-03-21 18:49:30 -07:00
jamespcole
60fbc51a2d added in line graph support for state history 2015-03-22 06:10:24 +11:00
Paulus Schoutsen
c8401a3c4d Merge pull request #67 from balloob/ha-config
Add a global config object to Home Assistant
2015-03-21 00:53:30 -07:00
Paulus Schoutsen
b633f83bd9 Merge pull request #53 from jamespcole/nzb-dev
Added in SABnzbd sensor
2015-03-20 18:17:27 -07:00
jamespcole
b477514e58 Added in API availability check and better exception handling 2015-03-21 12:10:38 +11:00
jamespcole
30c78b4054 Fixed gitmodules merge conflict 2015-03-21 10:14:03 +11:00
Paulus Schoutsen
1f453c9394 Add default datatype mask to tellstick sensor 2015-03-19 12:34:22 -07:00
Paulus Schoutsen
7a7f486cb2 Rename config.get_config_path to config.path 2015-03-19 12:27:56 -07:00
Paulus Schoutsen
9b643d57f0 ps: Add a global config object to Home Assistant 2015-03-18 23:02:58 -07:00
Paulus Schoutsen
569b15d790 Some Z-Wave fixes 2015-03-18 19:15:48 -07:00
Paulus Schoutsen
8ff1bcf242 Fix some Firefox style issues 2015-03-16 23:52:50 -07:00
Paulus Schoutsen
1245af356b Scene bugfixes and UI improvements 2015-03-16 23:32:18 -07:00
Paulus Schoutsen
b459a29947 Fix style issues 2015-03-16 22:45:42 -07:00
Paulus Schoutsen
83d83a09b5 Add scene to demo 2015-03-16 22:35:57 -07:00
Paulus Schoutsen
71803658f5 Updates to demo component and platforms 2015-03-16 22:20:35 -07:00
Paulus Schoutsen
a4af51af14 No longer auto load recorder and group components 2015-03-16 22:20:35 -07:00
Paulus Schoutsen
a2558972b9 Empty configuration.yaml no longer crashes setup 2015-03-16 22:20:35 -07:00
Paulus Schoutsen
b0a09f01cc Minor frontend bugfixes 2015-03-16 22:20:35 -07:00
Paulus Schoutsen
18f27d2e45 Merge pull request #66 from balloob/scene-component
Scene component
2015-03-16 22:19:56 -07:00
Paulus Schoutsen
19a43cea26 Add scene component 2015-03-15 23:36:42 -07:00
Paulus Schoutsen
36feb7f50a Remove unneeded dependencies from Dockerfile 2015-03-15 16:00:03 -07:00
Paulus Schoutsen
5db6f81f9c Merge pull request #64 from trainman419/correct_lights_off
Turn off correct lights
2015-03-15 15:56:16 -07:00
trainman419
730faed757 Turn off correct lights
Only turn off the lights specified in the sun light trigger.
I use this to turn off my bedroom lights when I leave, even if my
housemates are still home.
2015-03-15 15:50:32 -07:00
Paulus Schoutsen
06d4f5b0db Merge pull request #63 from trainman419/mac_upper_dev
Convert MAC addresses to uppercase on load
2015-03-15 14:46:01 -07:00
trainman419
e891162dad Convert MAC addresses to uppercase on load
This fixed an issue for me where my known_devices file had lowercase MAC
addresses, but the device tracker returns uppercase MAC addresses.
2015-03-15 14:43:45 -07:00
Paulus Schoutsen
0b8fea923a Update build python openzwave 2015-03-15 00:05:18 -07:00
Paulus Schoutsen
ef5deac3e1 Fix Z-Wave sensors not showing up 2015-03-15 00:01:18 -07:00
Paulus Schoutsen
1d33d7d124 Z-Wave sensors no longer auto associate with controller 2015-03-14 20:20:48 -07:00
Paulus Schoutsen
a1c6d9d1da Merge pull request #60 from andythigpen/feature/scripts
Script component
2015-03-14 19:38:13 -07:00
andythigpen
1b73e15ec7 Update the frontend. 2015-03-14 21:29:55 -05:00
andythigpen
0b751949ae Fix JS notification error on initialization.
The last notification is initially null resulting in an exception being
thrown on startup.
2015-03-14 21:29:55 -05:00
andythigpen
d0f545c247 Fix always showing scroll bars on side menu. 2015-03-14 21:29:55 -05:00
andythigpen
046efe3acb Adds script component.
A script is composed of a sequence of actions (currently service calls)
that are executed in order.  Individual actions can also be delayed by a
given timedelta.
2015-03-14 21:29:55 -05:00
Paulus Schoutsen
5f734f4dd9 Merge branch 'dev'
* dev:
  Fix a config bug in Automation
2015-03-14 19:20:53 -07:00
Paulus Schoutsen
948a5c97ec Fix a config bug in Automation 2015-03-14 19:18:41 -07:00
Paulus Schoutsen
1dc002f180 Merge branch 'dev'
* dev:
  Fix a config bug in Automation
  Fixes for remote instances Home Assistant
  Fixes for new release PyLint
2015-03-14 19:13:15 -07:00
Paulus Schoutsen
6da0257bb6 Fix a config bug in Automation 2015-03-14 19:13:03 -07:00
Paulus Schoutsen
633d0453be Fixes for remote instances Home Assistant 2015-03-14 13:07:38 -07:00
Paulus Schoutsen
aec861c1a4 Fixes for new release PyLint 2015-03-14 12:39:17 -07:00
Paulus Schoutsen
cdeceb140d Fixes for new release PyLint 2015-03-14 12:38:30 -07:00
Paulus Schoutsen
ebd597b811 Merge pull request #59 from balloob/dev
Update master with latest changes
2015-03-14 12:31:28 -07:00
Paulus Schoutsen
284500ff21 Upgrade to latest home assistant js 2015-03-14 00:00:51 -07:00
Paulus Schoutsen
6242b856b4 Some bug fixes related to new Home Assistant JS 2015-03-11 00:21:18 -07:00
Paulus Schoutsen
020213e682 Upgrade to latest Home-Assistant-JS 2015-03-10 22:40:55 -07:00
Paulus Schoutsen
c7ae0f5f90 Reposition speech-to-text progress 2015-03-10 22:40:50 -07:00
Paulus Schoutsen
5b9b744662 Merge pull request #58 from andythigpen/config-lists
Add support for lists when using config_per_platform helper.
2015-03-10 17:40:49 -07:00
andythigpen
06ad3987ba Add support for lists when using config_per_platform helper.
With the recent change to YAML, it is now easier to support lists by
default.  Any config section that previous relied on the "domain",
"domain 1", "domain 2" format can now use YAML lists instead.  The old
format is also still supported.
2015-03-10 18:30:36 -05:00
Paulus Schoutsen
c46e27928f Merge pull request #57 from balloob/component-conversation
Add conversation component
2015-03-10 08:52:10 -07:00
Paulus Schoutsen
eaded9b67c Add support for voice commands 2015-03-10 00:20:52 -07:00
Paulus Schoutsen
90eb8aa82a Move icon imports to generic file 2015-03-10 00:09:08 -07:00
Paulus Schoutsen
e915dd0020 Add a basic conversation component 2015-03-10 00:08:50 -07:00
Paulus Schoutsen
e32c2d2569 Deprecate process component 2015-03-08 23:52:56 -07:00
Paulus Schoutsen
74d243ac41 Merge pull request #56 from jamespcole/vera-dev
Fixed variable scoping
2015-03-08 21:24:58 -07:00
jamespcole
06c3087310 Fixed variable scoping 2015-03-09 15:16:02 +11:00
Paulus Schoutsen
aa0c6ef7c2 Make remember option in login form not bold 2015-03-08 20:39:10 -07:00
Paulus Schoutsen
a7e4d5102e Merge pull request #52 from jamespcole/vera-dev
Vera Z-Wave Controller Support
2015-03-08 16:03:23 -07:00
jamespcole
56622596e7 Changed exception logging, and updated excluded device logic 2015-03-09 09:11:59 +11:00
jamespcole
7ee37648d8 Updated exception type for errors when connecting to vera 2015-03-09 08:45:20 +11:00
jamespcole
95852db18d Changed the configuration to use hashes instead of searching array 2015-03-09 08:34:06 +11:00
Paulus Schoutsen
532e9f5de2 Merge pull request #54 from andythigpen/fix-blank-password
Issue with blank password
2015-03-08 14:31:45 -07:00
andythigpen
399b433a06 Fix issue causing blank passwords to no longer be accepted. 2015-03-08 16:21:35 -05:00
jamespcole
7dc3198320 Added constants for armed, tripped and tripped time 2015-03-09 08:10:31 +11:00
Paulus Schoutsen
af6407c1df Merge pull request #50 from andythigpen/feature/variable-nmap-tracker
Variable nmap tracker
2015-03-08 14:01:31 -07:00
andythigpen
bfb5089ed5 Add configurable interval for nmap_tracker when devices are home.
Adds an option that will exclude devices from the periodic nmap scan
for the configured number of minutes.
2015-03-08 15:54:00 -05:00
jamespcole
38fbc3595a Added spcific exception type for failure to communicate with Vera controller 2015-03-09 07:46:26 +11:00
Paulus Schoutsen
c85e9625a7 Merge pull request #49 from andythigpen/dev
Fix issue with automation event data after YAML conversion.
2015-03-08 13:32:22 -07:00
jamespcole
6dc18ba603 removed the VeraLight class and just switched it to using VeraSwitch instead 2015-03-09 07:24:34 +11:00
jamespcole
7772d5af62 moved setting name to constructor 2015-03-09 07:15:41 +11:00
jamespcole
a2f438c6ef now using ATTR_BATTERY_LEVEL 2015-03-09 07:11:35 +11:00
jamespcole
1b29d61562 Made exception handling more specific 2015-03-09 07:03:56 +11:00
jamespcole
efdb54cbe4 Added in SABnzbd sensor 2015-03-09 05:28:12 +11:00
jamespcole
7a21e8a3fb Fixed flake8 comment warning 2015-03-09 02:08:46 +11:00
jamespcole
50ff26ea20 Fixed flake8 errors 2015-03-09 01:58:11 +11:00
jamespcole
f38787c258 reverted gitignore changes 2015-03-09 01:20:56 +11:00
jamespcole
42dc973ccc Fixed up linting errors 2015-03-09 01:14:44 +11:00
jamespcole
dc8147c46d Changed vera components over to new config file format 2015-03-08 23:52:50 +11:00
jamespcole
a30d1dcfef Merge branch 'dev' of https://github.com/balloob/home-assistant into dev
Getting the latest from balloob
2015-03-08 22:08:03 +11:00
Theodor Lindquist
851bff1e12 Merge pull request #51 from balloob/dev
Merge dev into master
2015-03-08 08:56:01 +01:00
Theodor Lindquist
e6ed2e58b0 Merge pull request #48 from theolind/dev
Added process watching functionality to sensor.systemmonitor
2015-03-08 08:45:17 +01:00
theolind
0f1307cd81 Fixed http being too strict on the api_password config 2015-03-08 08:41:28 +01:00
andythigpen
bb858fdddc Fix issue with automation event data after YAML conversion.
No need to convert to dict using json.loads when PyYAML will do that
automatically.
2015-03-07 16:10:35 -06:00
theolind
43f0014200 Added process watching functionality to sensor.systemmonitor 2015-03-07 20:54:52 +01:00
Paulus Schoutsen
c3c07d621a Tweak coveragerc a bit more 2015-03-07 09:00:31 -08:00
Paulus Schoutsen
7e3de4d6f7 Don't include device specific code in coverage 2015-03-07 07:49:19 -08:00
Theodor Lindquist
7880b6a11d Merge pull request #47 from theolind/dev
Added a system monitoring platform to the sensor component
2015-03-07 15:58:04 +01:00
theolind
1215b5e994 Fixed type issue 2015-03-07 15:55:32 +01:00
theolind
828c78cb1f fixed style errors 2015-03-07 15:49:58 +01:00
theolind
b42b680ef5 Merge remote-tracking branch 'upstream/dev' into dev
Conflicts:
	requirements.txt
2015-03-07 15:34:47 +01:00
theolind
d7a4242c74 Specified the component that uses psutil (sensor.systemmonitor) 2015-03-07 15:31:09 +01:00
theolind
dd92173576 Made example config more YAMLy 2015-03-07 15:27:31 +01:00
theolind
3173249dc3 fixed typo 2015-03-07 15:24:35 +01:00
theolind
97258747c7 Renamed device to resource 2015-03-07 15:22:03 +01:00
theolind
19964e914a Added a system monitoring platform to the sensor component 2015-03-07 14:54:08 +01:00
Paulus Schoutsen
d3e107a882 Clean up requirements.txt 2015-03-07 05:49:22 -08:00
jamespcole
250f35c2a5 Added documentation for proposed format of YAML config 2015-03-07 14:49:20 +11:00
jamespcole
fceac45ddd Updated vera switch and sensor to the new architecture 2015-03-07 12:59:13 +11:00
jamespcole
ba58c080e3 removed old config example to fix merge conflict 2015-03-07 12:36:08 +11:00
jamespcole
ff0099b6a7 Merge branch 'master' of https://github.com/balloob/home-assistant
Merging with the upstream master to get the compnent architecture changes
2015-03-07 12:25:49 +11:00
jamespcole
5536f1621d fixing issue with built files and upstream merge 2015-03-07 12:25:41 +11:00
Paulus Schoutsen
fde0ce1997 Remove CONF_TYPE and platform_devices_from_config 2015-03-06 00:04:32 -08:00
Paulus Schoutsen
3e15742875 Move device ABCs to separate helper file 2015-03-05 23:18:22 -08:00
Paulus Schoutsen
68668fc658 Light/Switch/Thermostat: use new extract_from_service helper 2015-03-05 23:17:05 -08:00
Paulus Schoutsen
72b930af8f Fix: Hue reports state correctly if 2 services called quickly 2015-03-05 22:53:11 -08:00
Paulus Schoutsen
1b4ff986b0 Add remember login option 2015-03-05 21:37:44 -08:00
Paulus Schoutsen
4e6773969a Fix: Login form shows error message again 2015-03-05 20:43:40 -08:00
Paulus Schoutsen
ba9f29a04b Fix http/zwave being too strict on the config 2015-03-05 20:43:20 -08:00
Paulus Schoutsen
b04d6f94e6 Merge pull request #45 from balloob/tellstick-sensor-refactor
Refactor Tellstick sensors to be a sensor platform
2015-03-05 08:44:00 -08:00
Paulus Schoutsen
a09c5d88db Update favicon.ico 2015-03-05 00:19:13 -08:00
Paulus Schoutsen
be9d6b9422 Remove forced orientation from manifest.json 2015-03-04 09:23:14 -08:00
Paulus Schoutsen
84844c242b Refactor chromecast into media_player platform 2015-03-03 23:50:54 -08:00
Paulus Schoutsen
fc3375508e Frontend: Remove tellstick_sensor domain icon 2015-03-03 22:20:48 -08:00
Paulus Schoutsen
663735542b Refactor tellstick_sensor to a sensor platform 2015-03-03 22:19:29 -08:00
Paulus Schoutsen
a90dcabe01 Higher quality favicon.ico 2015-03-03 21:49:20 -08:00
Paulus Schoutsen
fa9f5073f6 Update logo 2015-03-03 21:15:21 -08:00
Paulus Schoutsen
9616a2292e Add manifest.json 2015-03-03 21:15:15 -08:00
Paulus Schoutsen
b4f743bda3 ZWave component now reports init success 2015-03-03 08:49:31 -08:00
jamespcole
138eadedcc undid unnecessary changes to gitignore 2015-03-02 23:08:05 +11:00
jamespcole
53de2ad86d Added __pycache__ to gitignore 2015-03-02 22:28:40 +11:00
jamespcole
8dfc91a502 Added vera components and added __pycache__ to gitignore 2015-03-02 22:05:03 +11:00
jamespcole
3449b3d1d7 vera device types 2015-03-02 21:09:00 +11:00
jamespcole
7b62cf4af8 Added in vera api submodule 2015-03-02 21:02:59 +11:00
Paulus Schoutsen
2727fd12ee Merge pull request #42 from balloob/chore-refactor-device-components
Refactor device components
2015-03-01 11:12:03 -08:00
Paulus Schoutsen
00047009e2 Only poll for device updates if necessary 2015-03-01 11:04:07 -08:00
Paulus Schoutsen
0fd89a4b1f Fix a WeMo discovery issue 2015-03-01 10:43:08 -08:00
Paulus Schoutsen
7938cbffd4 Suppress specific import errors in the loader 2015-03-01 10:40:07 -08:00
Paulus Schoutsen
5fe50066a6 Make device component backwards compatible 2015-03-01 10:28:53 -08:00
Paulus Schoutsen
3b7b34b3df Fix Style 2015-03-01 01:39:28 -08:00
Paulus Schoutsen
508a433a92 Fix Style 2015-03-01 01:39:12 -08:00
Paulus Schoutsen
fce3e239a7 Update import from netdisco 2015-03-01 01:36:19 -08:00
Paulus Schoutsen
89100d14c8 Refactored device components 2015-03-01 01:35:58 -08:00
Paulus Schoutsen
f0c6ac1aa3 Update import from netdisco 2015-03-01 01:34:49 -08:00
Paulus Schoutsen
63bf1373b7 Disable pylint import error check 2015-02-28 23:02:26 -08:00
Paulus Schoutsen
19d243d159 ZWave Sensor values push changes to HA 2015-02-28 22:49:55 -08:00
Paulus Schoutsen
67161d686b Use PyDispatcher instead of Louie 2015-02-28 22:49:27 -08:00
Paulus Schoutsen
8bd803601f Devices can now be polling or push 2015-02-28 22:33:44 -08:00
Paulus Schoutsen
8567dd001b Merge remote-tracking branch 'origin/feature-openzwave' into feature-openzwave
* origin/feature-openzwave:
  Update zwave related scripts
  Z-Wave sensors should work now
  Register to Z-Wave sensor updates
  Get Z-Wave sensors to work with Home Assistant
  Minor documentation updates
  Working zwave!
  Get python-openzwave working in Docker

Conflicts:
	scripts/build_python_openzwave
2015-02-28 21:08:24 -08:00
Paulus Schoutsen
7636769c11 Update discovery to work without zeroconf installed 2015-02-28 21:06:59 -08:00
Paulus Schoutsen
7c2d92c55d Update zwave related scripts 2015-02-28 20:27:42 -08:00
Paulus Schoutsen
fa76cb8f8c Z-Wave sensors should work now 2015-02-28 20:27:42 -08:00
Paulus Schoutsen
1b00515899 Register to Z-Wave sensor updates 2015-02-28 20:27:42 -08:00
Paulus Schoutsen
e7b9b86c64 Get Z-Wave sensors to work with Home Assistant 2015-02-28 20:27:42 -08:00
Paulus Schoutsen
85f7f5589d Minor documentation updates 2015-02-28 20:27:42 -08:00
Paulus Schoutsen
9c61c281ca Working zwave!
Open docker, go to /usr/src/balloob-python-openzwave/examples, run
python3 api_demo.py --device=/zwaveusbstick --log=Debug
2015-02-28 20:27:42 -08:00
Paulus Schoutsen
bb5e8e00dd Get python-openzwave working in Docker 2015-02-28 20:27:41 -08:00
Paulus Schoutsen
b38146bdef Auto set friendly name in state attributes 2015-02-28 20:10:39 -08:00
Paulus Schoutsen
80ffe74af6 Group component now supports lists in the config 2015-02-28 19:22:16 -08:00
Paulus Schoutsen
004d4ed123 Ensure the sun latitude and longitude are strings 2015-02-28 19:14:32 -08:00
Paulus Schoutsen
28059bda7f Configuration example tweaks 2015-02-28 19:14:00 -08:00
Paulus Schoutsen
3ebfc0e917 Merge pull request #41 from theolind/feature_yaml_config
Support for YAML configuration
2015-02-28 15:03:38 -08:00
theolind
1206c2113c Fixed style error, a line was too long 2015-02-28 20:31:26 +01:00
theolind
461e0d0314 Now converting config values to dictionaries if they are None 2015-02-28 20:17:50 +01:00
theolind
8da1fb1d74 Added example yaml config file, removed old example config, fixed style violation in bootstrap.py 2015-02-28 18:59:45 +01:00
Paulus Schoutsen
98f3e6ed64 Update zwave related scripts 2015-02-28 09:09:32 -08:00
Paulus Schoutsen
bbe19cbbb0 Add more info card for thermostat. Fixes #28 2015-02-28 08:48:33 -08:00
theolind
f2b602c7ec Added logic to main that prefers .yaml-config over .conf 2015-02-28 17:42:23 +01:00
theolind
223d2c2c3f Added support for YAML files, now with included python modules 2015-02-28 17:05:38 +01:00
theolind
356732189c Added support for YAML configuration files 2015-02-28 16:56:58 +01:00
Paulus Schoutsen
b2b82d955c Break demo component into small demo platforms 2015-02-28 07:31:39 -08:00
Paulus Schoutsen
f356723e20 Upgraded to Polymer 0.5.5 2015-02-27 18:53:22 -08:00
Paulus Schoutsen
4ef17270b5 Merge branch 'dev'
* dev:
  Fix device tracker tests
2015-02-27 18:45:13 -08:00
Paulus Schoutsen
b73fd6d522 Fix device tracker tests 2015-02-27 18:45:06 -08:00
Paulus Schoutsen
6b5920b98b Merge branch 'dev'
* dev:
  Device tracker: make all Mac addresses uppercase. Fixes #37
  ps: Slim down README.md
  Update __init__.py
  Remove no longer supported options from example
  Adds event automation module.
2015-02-27 18:37:54 -08:00
Paulus Schoutsen
f6f76acdb0 Device tracker: make all Mac addresses uppercase. Fixes #37 2015-02-27 18:36:09 -08:00
Paulus Schoutsen
ee20268e27 ps: Slim down README.md 2015-02-27 18:29:49 -08:00
Paulus Schoutsen
0b9cf6384e Merge pull request #39 from jamespcole/patch-1
Update __init__.py
2015-02-27 08:59:33 -08:00
James Cole
cda821e649 Update __init__.py
Updated to fix the following error when loading sensors:

"home-assistant/homeassistant/components/sensor/__init__.py", line 87, in setup
    hass.track_time_change(update_sensor_states, seconds=range(0, 60, 3))
TypeError: track_time_change() got an unexpected keyword argument 'seconds'"

the named parameter was using seconds instead of second
2015-02-28 03:53:07 +11:00
Paulus Schoutsen
71ca07363a Z-Wave sensors should work now 2015-02-25 23:27:17 -08:00
Paulus Schoutsen
b73700d139 Remove no longer supported options from example 2015-02-24 21:39:46 -08:00
Paulus Schoutsen
88ce2255f9 Merge pull request #38 from andythigpen/feature/automation-event
Adds event automation module.
2015-02-23 19:03:20 -08:00
andythigpen
7951137693 Adds event automation module.
When events are fired with matching data, the automation.event module
executes the corresponding action for automation rules.
2015-02-23 20:42:37 -06:00
Paulus Schoutsen
015e7f8acf Merge pull request #36 from andythigpen/feature/device-tracker-interval
Add configurable intervals to device tracker.
2015-02-23 17:47:13 -08:00
andythigpen
22a2b65e3f Add configurable intervals to device tracker.
Allows the user to configure a longer interval for when the device
tracker should scan for devices.
2015-02-23 19:32:06 -06:00
Paulus Schoutsen
e9218e2eb2 Register to Z-Wave sensor updates 2015-02-23 00:01:04 -08:00
Paulus Schoutsen
a013ccf806 Get Z-Wave sensors to work with Home Assistant 2015-02-22 17:36:28 -08:00
Paulus Schoutsen
7f7a1f2740 Minor documentation updates 2015-02-22 17:33:01 -08:00
Paulus Schoutsen
3239c04368 Working zwave!
Open docker, go to /usr/src/balloob-python-openzwave/examples, run
python3 api_demo.py --device=/zwaveusbstick --log=Debug
2015-02-21 23:24:45 -08:00
Paulus Schoutsen
b5a3a72b51 Merge remote-tracking branch 'origin/master' into dev
* origin/master:
  Fix issue in Timer thread caused by variable name.
  Fix issue with some bulbs missing 'xy' attribute.
2015-02-21 18:24:10 -08:00
Paulus Schoutsen
6011cee490 Get python-openzwave working in Docker 2015-02-21 16:59:17 -08:00
Paulus Schoutsen
cfb7b8301c Merge pull request #35 from andythigpen/fix-thread-stop
Fix issue in Timer thread caused by variable name.
2015-02-21 16:00:30 -08:00
Paulus Schoutsen
69463308f5 Merge pull request #34 from andythigpen/fix-hue-xy
Fix issue with some bulbs missing 'xy' attribute.
2015-02-21 15:59:11 -08:00
andythigpen
8819aa7079 Fix issue in Timer thread caused by variable name.
threading.Thread already contains a _stop() function which is called in
threading._after_fork().  Assigning an Event object to _stop caused
periodic exceptions to be thrown.  This renames the _stop variable to
_stop_event to prevent a naming collision.
2015-02-21 15:21:43 -06:00
andythigpen
c3155651e4 Fix issue with some bulbs missing 'xy' attribute.
Philips Lux bulbs (as well as other dimmable bulbs that work with the
Hue hub) do not have an 'xy' attribute.
2015-02-21 15:02:08 -06:00
Paulus Schoutsen
24d9856ae6 More frontend code clean up 2015-02-20 00:23:09 -08:00
Paulus Schoutsen
89f59a758d Frontend: stream fires ping on connect
This is needed for Safari/Firefox to call onOpen
2015-02-19 23:31:06 -08:00
Paulus Schoutsen
ff4c3f791c Clean up frontend 2015-02-19 23:08:58 -08:00
Danielhiversen
8b590a43be Added documentation for heat control 2015-02-19 20:14:37 +01:00
Paulus Schoutsen
f46e0408b3 Add ping to streaming events API 2015-02-19 00:15:27 -08:00
Danielhiversen
a7c6413d07 Custom thermostat 2015-02-17 19:12:27 +01:00
Paulus Schoutsen
fd77e0e31d Upgraded home-assistant-js in frontend 2015-02-17 00:57:20 -08:00
Paulus Schoutsen
6119e1e660 Add a docker dev script 2015-02-17 00:56:35 -08:00
Paulus Schoutsen
d81723c8fc Frontend: handle modals in separate component 2015-02-15 21:53:40 -08:00
Paulus Schoutsen
b6a3524e9b Add a relative time component to frontend 2015-02-15 21:39:01 -08:00
Paulus Schoutsen
1d56181a8c Workaround Chrome Eventsource bug 2015-02-15 18:39:39 -08:00
Paulus Schoutsen
8e29910e77 Style fixes to satisfy updated Flake8 2015-02-15 17:15:46 -08:00
Paulus Schoutsen
37a9dbf1d5 Upgrade home-assistant.js version 2015-02-15 16:44:48 -08:00
Paulus Schoutsen
3ee2c6e210 Write to log if an event stream is closed 2015-02-15 16:44:25 -08:00
Paulus Schoutsen
c8cbb8ebb5 More info dialog plays nice again with History 2015-02-14 12:19:58 -08:00
Paulus Schoutsen
4047bf0775 Make more info dialog more store dependent 2015-02-14 10:05:26 -08:00
Paulus Schoutsen
faddb5d57e More frontend bugfixes 2015-02-14 01:06:51 -08:00
Paulus Schoutsen
3be8a1ad02 Notifications are now done via the new store 2015-02-14 00:11:46 -08:00
Paulus Schoutsen
dcffd102cc Migrate more components to use mixin 2015-02-14 00:11:23 -08:00
Paulus Schoutsen
791ebff7ee Squash some frontend bugs 2015-02-13 22:50:49 -08:00
Paulus Schoutsen
7dd7c489e8 Fire event for loading component/adding service 2015-02-13 22:49:56 -08:00
Paulus Schoutsen
846e11d6b8 Frontend streams events from HA 2015-02-13 18:59:42 -08:00
Paulus Schoutsen
3f26fc3b06 Move more HTTP stuff into constant file 2015-02-13 18:27:13 -08:00
Paulus Schoutsen
7a8f6500e2 Fix a bug in recorder. Fixes #33 2015-02-09 19:12:12 -08:00
Paulus Schoutsen
50bb4daeaa Added demo mode 2015-02-08 23:33:19 -08:00
Paulus Schoutsen
b643ef628b Merge branch 'dev'
* dev:
  Bug fixes related to entity_ids being lowercase
  Have statemachine.track_change work on new states
2015-02-08 22:28:28 -08:00
Paulus Schoutsen
ce39a6fb18 Bug fixes related to entity_ids being lowercase 2015-02-08 22:18:54 -08:00
Paulus Schoutsen
f5084a5f70 Have statemachine.track_change work on new states 2015-02-08 22:18:31 -08:00
Paulus Schoutsen
896aa31fdc Merge pull request #30 from issackelly/patch-2
Fix more links.
2015-02-08 12:59:24 -08:00
Issac Kelly
11b47063eb Fix more links.
Fix a couple more links. Jekyl doesn't appear to do automatic name= on headlines, so in-page linking isn't possible
2015-02-08 11:22:41 -08:00
Paulus Schoutsen
5ba752c331 Merge branch 'dev'
* dev:
  Enable history component instead of recorder by default
2015-02-07 22:52:41 -08:00
Paulus Schoutsen
6c4e044c92 Enable history component instead of recorder by default 2015-02-07 22:52:36 -08:00
Paulus Schoutsen
1d5a3b73f9 Merge branch 'dev'
* dev:
  Hide history view when history component not loaded
2015-02-07 22:17:35 -08:00
Paulus Schoutsen
8c20e5137e Hide history view when history component not loaded 2015-02-07 22:16:19 -08:00
Paulus Schoutsen
eea4bb7118 Merge branch 'dev'
* dev: (48 commits)
  Update README.md
  Fix some frontend bugs
  Fix style issues
  Move frontend specific js to webcomponents
  Improve performance for history component
  Fix JSON serialisation bug
  Allow querying recorder for run info
  Entity IDs are now always lowercase
  Get State History support from Store
  JS Stade model renamed entity_id to entityId
  Ensure entity ids are always lower case
  Period of history now returns a spanning result
  Tweaks for the new drawer UI
  Fixed Flake8 error
  Added a drawer to the UI
  Added suport for Tellstick light. Assume dimable switch is a light
  Added suport for Tellstick light. Assume dimable switch is a light
  Added suport for Tellstick light. Assume dimable switch is a light
  Update to latest home-assistant-js
  Frontend now build on top of home-assistant-js
  ...
2015-02-07 21:45:59 -08:00
Issac Kelly
1bc1cbd664 Update README.md
Fix Multiple Instances Link
2015-02-07 21:39:21 -08:00
Paulus Schoutsen
f8fc8c888f Fix some frontend bugs 2015-02-07 21:37:50 -08:00
Paulus Schoutsen
09bf64db42 Fix style issues 2015-02-07 15:54:58 -08:00
Paulus Schoutsen
33daf0a385 Move frontend specific js to webcomponents 2015-02-07 15:42:04 -08:00
Paulus Schoutsen
152ec80bfe Merge pull request #29 from issackelly/patch-1
Fix Multiple Instances Link
2015-02-07 15:30:24 -08:00
Issac Kelly
371b3775fa Update README.md
Fix Multiple Instances Link
2015-02-07 15:28:18 -08:00
Paulus Schoutsen
2cfcbf6380 Improve performance for history component 2015-02-07 13:23:01 -08:00
Paulus Schoutsen
5f0b3d0fca Fix JSON serialisation bug 2015-02-07 13:22:23 -08:00
Paulus Schoutsen
06fac90ec2 Allow querying recorder for run info 2015-02-07 12:39:10 -08:00
Paulus Schoutsen
d053f93419 Entity IDs are now always lowercase 2015-02-06 00:17:30 -08:00
Paulus Schoutsen
e3643b1faf Get State History support from Store 2015-02-06 00:02:40 -08:00
Paulus Schoutsen
029379c092 JS Stade model renamed entity_id to entityId 2015-02-06 00:01:29 -08:00
Paulus Schoutsen
36544ee088 Ensure entity ids are always lower case 2015-02-06 00:00:39 -08:00
Paulus Schoutsen
45dd8cbc3f Period of history now returns a spanning result 2015-02-05 22:57:03 -08:00
Paulus Schoutsen
772df97bc1 Tweaks for the new drawer UI 2015-02-05 22:36:41 -08:00
Paulus Schoutsen
0c181ead59 Merge pull request #27 from Danielhiversen/TellstickDimmer
Tellstick dimmer support
2015-02-05 10:10:03 -08:00
Danielhiversen
76d14157ec Fixed Flake8 error 2015-02-05 18:39:03 +01:00
Paulus Schoutsen
ce7b8b5e08 Added a drawer to the UI 2015-02-05 08:53:52 -08:00
Danielhiversen
cb9ad467af Added suport for Tellstick light. Assume dimable switch is a light 2015-02-04 22:54:05 +01:00
Danielhiversen
0ed8158f6e Added suport for Tellstick light. Assume dimable switch is a light 2015-02-04 22:33:04 +01:00
Danielhiversen
22c75f853b Added suport for Tellstick light. Assume dimable switch is a light 2015-02-04 22:29:30 +01:00
Paulus Schoutsen
b31668fba9 Update to latest home-assistant-js 2015-02-03 23:35:28 -08:00
Paulus Schoutsen
999e68812d Merge branch 'dev' of https://github.com/balloob/home-assistant into dev
* 'dev' of https://github.com/balloob/home-assistant:
  Fixed pylint errors
  fixed flake8 E302 expected 2 blank lines, found 1
  Make sure that components isn't loaded multiple times
  Refactered event listeners so that they can be part of a component instead of having to be stand alone components
2015-02-03 23:16:57 -08:00
Paulus Schoutsen
115be859b6 Frontend now build on top of home-assistant-js 2015-02-03 23:16:53 -08:00
Gustav Ahlberg
2e279d4722 Merge pull request #25 from balloob/component-scheduler
Component scheduler
2015-02-03 20:30:13 +01:00
Gustav Ahlberg
39485e7583 Fixed pylint errors 2015-02-03 20:18:19 +01:00
Gustav Ahlberg
ba7e06072d fixed flake8 E302 expected 2 blank lines, found 1 2015-02-02 07:39:11 +01:00
Gustav Ahlberg
7e9a254d87 Make sure that components isn't loaded multiple times 2015-02-02 07:30:46 +01:00
Paulus Schoutsen
fbae2ef725 Add Google Timelines to UI 2015-02-01 18:00:30 -08:00
Paulus Schoutsen
3439f4bb93 Remove frontend dependencies from git repo 2015-02-01 17:55:22 -08:00
Paulus Schoutsen
e2f51ef557 Default more info will show recent states 2015-01-31 20:07:04 -08:00
Paulus Schoutsen
807ceadf8b Provide API for 5 last states of entity 2015-01-31 20:06:30 -08:00
Paulus Schoutsen
3c95d80d3e Ensure recorder loaded first to capture all 2015-01-31 20:05:18 -08:00
Paulus Schoutsen
10bbc3d6e1 Default config: add recorder 2015-01-31 19:52:00 -08:00
Paulus Schoutsen
1ce8b6de7a Demo: show correct group name for living room 2015-01-31 19:51:42 -08:00
Paulus Schoutsen
c75447bc66 Expose loaded components on the API 2015-01-31 19:08:50 -08:00
Paulus Schoutsen
3709840327 Merge branch 'dev' into component-recorder
Conflicts:
	homeassistant/components/http/__init__.py
2015-01-31 10:31:16 -08:00
Paulus Schoutsen
cddeddac8d For backwards compat, have http load frontend/api 2015-01-31 09:55:26 -08:00
Paulus Schoutsen
6878fc254a Add frontend to default config 2015-01-30 08:28:04 -08:00
Paulus Schoutsen
13ac71bdf0 Clean up http related components 2015-01-30 08:26:06 -08:00
Paulus Schoutsen
61f6aff056 Upgrade to Polymer 0.5.4 2015-01-30 00:00:19 -08:00
Paulus Schoutsen
8feeafd8a3 Refactor http into frontend and api component 2015-01-29 23:56:21 -08:00
Gustav Ahlberg
6f3ef12d31 Refactered event listeners so that they can be part of a component instead of having to be stand alone components 2015-01-28 20:01:16 +01:00
Paulus Schoutsen
7c45318c00 Recorder component: proof of concept 2015-01-28 00:22:09 -08:00
Paulus Schoutsen
c2cd181c1a Merge pull request #11 from Gyran/scheduler
Scheduler component
2015-01-26 21:16:59 -08:00
Gustav Ahlberg
7066f25423 Fixed logging-format-interpolation lint errors 2015-01-25 21:50:54 +01:00
Gustav Ahlberg
631251f1f7 Merge remote-tracking branch 'upstream/master' into scheduler
* upstream/master: (104 commits)
  Fire a time_changed event every second
  Update example config with correct wink config
  Wink API is weird.  If you delete a device from their API, they dont delete it.  They just "hide" it
  Update the frontend with the new icon for sensor
  Minor refactor of build_frontend script to support linux, and not just mac
  Update script installs latest dependencies
  Fix flaky device scanner test
  Increased environment validation upon start
  Fix group names for switch, light and devices
  Disable pylint unused-argument check
  Fix device scanner test
  Better update schedules for cast and devicetracker
  Tweaks to the configurator UI
  Add tests, fix styling
  Add initial version of configurator component
  Fix tabs being selectable by clicking on header
  Data binding fix: Update instead of replace states
  New: State.last_updated represents creation date
  Update sensor icon for now
  Updates to resolve flake8 errors
  ...
2015-01-25 21:44:54 +01:00
Paulus Schoutsen
ade833a70a Fix automation example 2015-01-25 12:32:50 -08:00
Paulus Schoutsen
253e3eb628 Fire a time_changed event every second 2015-01-24 18:04:19 -08:00
Paulus Schoutsen
6588ca6520 Update example config with correct wink config 2015-01-22 00:29:47 -08:00
Paulus Schoutsen
4d0bd03569 Merge pull request #24 from kangaroo/dev
Minor fixes and cleanup
2015-01-21 23:00:59 -08:00
Geoff Norton
ed1c98e590 Wink API is weird. If you delete a device from their API, they dont delete it. They just "hide" it 2015-01-22 06:15:54 +00:00
Geoff Norton
8b947e2fab Merge remote-tracking branch 'origin/dev' into dev
Conflicts:
	homeassistant/components/http/frontend.py
	homeassistant/components/http/www_static/frontend.html
2015-01-22 05:27:26 +00:00
Geoff Norton
ead5d99394 Update the frontend with the new icon for sensor 2015-01-22 05:23:12 +00:00
Geoff Norton
98a5542cee Minor refactor of build_frontend script to support linux, and not just mac 2015-01-22 05:22:40 +00:00
Paulus Schoutsen
4f910beba4 Update script installs latest dependencies 2015-01-20 23:11:24 -08:00
Paulus Schoutsen
5b10d35aa8 Fix flaky device scanner test 2015-01-20 22:23:58 -08:00
Paulus Schoutsen
99c87ff862 Increased environment validation upon start 2015-01-20 22:18:44 -08:00
Paulus Schoutsen
dbefeb3f6b Fix group names for switch, light and devices 2015-01-19 23:47:18 -08:00
Paulus Schoutsen
ff230cefe3 Disable pylint unused-argument check 2015-01-19 23:40:51 -08:00
Paulus Schoutsen
d3f1b83e57 Fix device scanner test 2015-01-19 23:29:19 -08:00
Paulus Schoutsen
46834aa0a5 Better update schedules for cast and devicetracker 2015-01-19 22:57:28 -08:00
Paulus Schoutsen
2016da984a Tweaks to the configurator UI 2015-01-19 22:40:30 -08:00
Paulus Schoutsen
cdbcc844cf Add tests, fix styling 2015-01-19 21:40:54 -08:00
Paulus Schoutsen
980ecdaacb Add initial version of configurator component 2015-01-19 21:40:54 -08:00
Paulus Schoutsen
0c5f1234da Fix tabs being selectable by clicking on header 2015-01-19 21:39:44 -08:00
Paulus Schoutsen
35094a1667 Data binding fix: Update instead of replace states 2015-01-19 21:39:44 -08:00
Paulus Schoutsen
8d0bddac6c New: State.last_updated represents creation date 2015-01-19 21:39:44 -08:00
Paulus Schoutsen
9d933f517b Merge pull request #22 from kangaroo/wink-sensors
Wink sensor support
2015-01-19 21:30:44 -08:00
Geoff Norton
c224b91945 Merge branch 'wink-sensors' into dev 2015-01-20 05:22:39 +00:00
Geoff Norton
abfaca3bfb Update sensor icon for now 2015-01-20 04:55:12 +00:00
Geoff Norton
a287bb5da0 Updates to resolve flake8 errors 2015-01-20 04:23:31 +00:00
Geoff Norton
a7315684c4 Reduce the threshold on the sensor changes, and rename it for easier debugging 2015-01-20 04:00:31 +00:00
Geoff Norton
15012688f2 Remove switch state delay 2015-01-20 02:58:40 +00:00
Geoff Norton
78f7c3cbea Implement state for the sensor device 2015-01-20 02:58:21 +00:00
Geoff Norton
80c2d81f41 Fire the sensor timer more often, and fix a typo 2015-01-20 02:58:08 +00:00
Geoff Norton
454bea4237 Reduce the timer interval to make sensors useful 2015-01-20 02:57:50 +00:00
Geoff Norton
7fbd36ccad Add a new sensor component
Hook up to scan sensor_pod_id's from Wink and report their status.
2015-01-20 01:16:04 +00:00
Geoff Norton
ce9de1b7d2 Add initial support for wink sensors.
Refactor wink API fetching into a generic 'get_devices' function.
2015-01-20 01:14:47 +00:00
Paulus Schoutsen
869c4eb68d Update pynetgear to latest version 2015-01-19 08:43:29 -08:00
Paulus Schoutsen
dd38621352 Frontend: show message if no states 2015-01-17 23:29:46 -08:00
Paulus Schoutsen
5f0f06b22d Add command-line toggle to run in demo mode 2015-01-17 22:23:07 -08:00
Paulus Schoutsen
ed05ff6fd9 Allow for running Home Assistant without password 2015-01-17 21:55:33 -08:00
Paulus Schoutsen
50eecd11c1 Added command line toggle to open UI on start 2015-01-17 21:13:02 -08:00
Paulus Schoutsen
1f32ce2ca4 Put scripts in scripts folder 2015-01-17 14:32:33 -08:00
Paulus Schoutsen
45e295c1d3 Update pynetgear to latest version 2015-01-17 13:49:22 -08:00
Paulus Schoutsen
8562b8f09d Update to latest version netdisco 2015-01-16 08:52:19 -08:00
Paulus Schoutsen
9ffe35756b Component Automation - initial version 2015-01-15 23:32:27 -08:00
Paulus Schoutsen
93f93aff93 Merge branch 'dev'
* dev:
  Exclude external libraries from code coverage
  Bug fixes for Wink
  Better positioning of dialogs
  Added error handling in frontend debug forms
  Integrate add worker to bootstrap.setup_component
  Conditionally show widgets on light more info
  Rename the edit state button in more info to debug
  Expect devices to have no name
2015-01-15 21:39:43 -08:00
Paulus Schoutsen
db48b2ba34 Exclude external libraries from code coverage 2015-01-15 21:35:11 -08:00
Paulus Schoutsen
702498ca09 Bug fixes for Wink 2015-01-15 21:25:24 -08:00
Paulus Schoutsen
c116cb095d Better positioning of dialogs 2015-01-14 23:57:23 -08:00
Paulus Schoutsen
ced3d595cc Added error handling in frontend debug forms 2015-01-14 23:56:53 -08:00
Paulus Schoutsen
8c62ae4ce5 Integrate add worker to bootstrap.setup_component 2015-01-14 23:18:44 -08:00
Paulus Schoutsen
3e4c0261b1 Conditionally show widgets on light more info 2015-01-14 23:10:56 -08:00
Paulus Schoutsen
fd6ff4c8d3 Rename the edit state button in more info to debug 2015-01-14 22:15:27 -08:00
Paulus Schoutsen
7f7c403e00 Expect devices to have no name 2015-01-14 21:12:11 -08:00
Paulus Schoutsen
aa9673b208 Device Tracker sets up group auto attribute proper 2015-01-13 08:25:17 -08:00
Paulus Schoutsen
2fa4e2e468 Remove unused import from nest platform 2015-01-13 00:00:26 -08:00
Paulus Schoutsen
d1ad6f3e65 Show state attributes in default more info dialog 2015-01-12 23:57:57 -08:00
Paulus Schoutsen
b9a08bb25d Migrate nest platform to python-nest 2015-01-12 23:31:31 -08:00
Paulus Schoutsen
646f22bfbb Rename service_discovered to platform_discovered 2015-01-12 08:21:50 -08:00
Paulus Schoutsen
86e4fb9655 Merge branch 'component-wink' into dev
* component-wink:
  Wink component bug fixes
  Bugfixes to make Wink component work
  Added wink component to auto-load other needed components
  Initial version wink component by @loghound
  changed bearer_token to access_token in conf file
  Wink Hub integration of it's switches & lights

Conflicts:
	homeassistant/components/switch/__init__.py
	homeassistant/const.py
2015-01-11 23:22:40 -08:00
Paulus Schoutsen
19c474ba2f Remove TODO from nest platform 2015-01-11 21:38:03 -08:00
Paulus Schoutsen
8665f08dca Update netdisco to latest version 2015-01-11 21:23:22 -08:00
Paulus Schoutsen
aea6042fe1 Getting thermostat component ready for release 2015-01-11 21:21:18 -08:00
Paulus Schoutsen
0f8e282386 Wink component bug fixes 2015-01-11 14:23:24 -08:00
Paulus Schoutsen
9db1f3f8b7 Bugfixes to make Wink component work 2015-01-11 14:21:44 -08:00
Paulus Schoutsen
cac1f56b2d Merge branch 'dev' into component-thermostat
* dev:
  Use tuples instead of lists internally
  Use properties instead of getters for Device class
  Upgrade pushbullet.py to 0.7.1
  Prevent devices from being discovered twice
  Update netdisco to latest version
  Update netdisco to latest version
  Updated requirements.txt for the discovery component
  Automatic discovery and setting up of devices
  Ensure groups always have unique entity id
  Rename ha_test folder to tests
  Make group component more flexible
  Reorganized the main to be more modular
  Updated PyWemo to latest version
  Fix warnings from flake8 and pylint
  Check flags in ARP table for NUD_REACHABLE before assuming a device is online. Fixes #18.
  Pull in PyWemo bugfixes
2015-01-11 10:00:25 -08:00
Paulus Schoutsen
ca49a2aa68 Use tuples instead of lists internally 2015-01-11 09:55:45 -08:00
Paulus Schoutsen
283b187501 Use properties instead of getters for Device class 2015-01-11 09:20:41 -08:00
Paulus Schoutsen
035e3e686e Upgrade pushbullet.py to 0.7.1 2015-01-11 08:09:25 -08:00
Paulus Schoutsen
6cd53f2ddf Added wink component to auto-load other needed components 2015-01-10 23:47:23 -08:00
Paulus Schoutsen
249cf244ca Initial version wink component by @loghound 2015-01-10 22:53:41 -08:00
John McLaughlin
cd896627ea changed bearer_token to access_token in conf file 2015-01-10 22:35:14 -08:00
John McLaughlin
dccd9f562f Wink Hub integration of it's switches & lights 2015-01-10 22:35:01 -08:00
Paulus Schoutsen
c2b8f8d34e Prevent devices from being discovered twice 2015-01-10 10:34:56 -08:00
Paulus Schoutsen
9db1a58cb1 Update netdisco to latest version 2015-01-10 08:53:46 -08:00
Paulus Schoutsen
ebc67f460e Update netdisco to latest version 2015-01-09 22:22:19 -08:00
Paulus Schoutsen
e01fee9189 Updated requirements.txt for the discovery component 2015-01-09 00:13:24 -08:00
Paulus Schoutsen
ba179bc638 Automatic discovery and setting up of devices 2015-01-09 00:07:58 -08:00
Paulus Schoutsen
035d994705 Merge branch 'master' into dev
* master:
  Fix warnings from flake8 and pylint
  Check flags in ARP table for NUD_REACHABLE before assuming a device is online. Fixes #18.
2015-01-08 20:18:04 -08:00
Paulus Schoutsen
f1209a42a9 Ensure groups always have unique entity id 2015-01-08 20:17:05 -08:00
Paulus Schoutsen
d4cad0b267 Rename ha_test folder to tests 2015-01-08 20:05:12 -08:00
Paulus Schoutsen
e0b424c88f Make group component more flexible 2015-01-08 20:02:34 -08:00
Paulus Schoutsen
f5683797aa Reorganized the main to be more modular 2015-01-08 18:45:27 -08:00
Paulus Schoutsen
efe820628c Updated PyWemo to latest version 2015-01-06 20:52:26 -08:00
Paulus Schoutsen
300cfcc424 Merge pull request #19 from Piratonym/device_tracker-arpflags
device_tracker/openwrt: Check flags in ARP table for NUD_REACHABLE.
2015-01-06 19:49:38 -08:00
Karsten Nerdinger
2c5886f6d4 Fix warnings from flake8 and pylint 2015-01-07 03:57:06 +01:00
Karsten Nerdinger
fc33273464 Check flags in ARP table for NUD_REACHABLE before assuming a device is online. Fixes #18. 2015-01-07 03:36:39 +01:00
Paulus Schoutsen
cbbda2db55 Pull in PyWemo bugfixes 2015-01-06 07:49:49 -08:00
Paulus Schoutsen
6943a3bc14 Add a Nest specific card to frontend 2015-01-06 00:11:03 -08:00
Paulus Schoutsen
8f3a3f89a7 Refactor nest component into thermostat component 2015-01-06 00:10:33 -08:00
Paulus Schoutsen
68b712adfd Merge branch 'dev' into component-thermostat
* dev:
  Extracted a base HA device from ToggleDevice
2015-01-05 23:07:17 -08:00
Paulus Schoutsen
24be24c58b Extracted a base HA device from ToggleDevice 2015-01-05 23:02:41 -08:00
Paulus Schoutsen
db7004fdee Merge remote-tracking branch 'stefano/dev' into component-thermostat
* stefano/dev:
  Added "Nest" thermostat component.
2015-01-05 21:44:22 -08:00
Paulus Schoutsen
b10b75b7fe Reorganized frontend files 2015-01-05 21:41:15 -08:00
Paulus Schoutsen
ed3bbd98cc Remove unsupported specifying hosts for wemo 2015-01-05 21:35:22 -08:00
Paulus Schoutsen
ed1f434a61 Updated docker container instructions 2015-01-05 21:02:43 -08:00
Paulus Schoutsen
b90826c267 Better handling of subsequent throttle calls 2015-01-05 20:50:34 -08:00
Paulus Schoutsen
1b0143341c Update pywemo to latest version 2015-01-05 20:23:48 -08:00
sfiorini
b1a93ffc21 Added "Nest" thermostat component. 2015-01-05 19:11:02 -06:00
Paulus Schoutsen
b63784a4e6 Updated pywemo to latest version 2015-01-05 00:43:37 -08:00
Paulus Schoutsen
3894dec274 Default notify message title is now Home Assistant 2015-01-04 14:20:16 -08:00
Paulus Schoutsen
635876c94d Work around a bug in pylint 2015-01-04 01:34:48 -08:00
Paulus Schoutsen
490543093d Simple_alarm component notifies user on alarm 2015-01-04 01:24:25 -08:00
Paulus Schoutsen
4fec2dcb28 Add notification component and PushBullet platform 2015-01-04 01:14:18 -08:00
Paulus Schoutsen
a6ec071244 ps: dialogs on small screens only take needed height 2015-01-03 09:52:47 -08:00
Paulus Schoutsen
f64e84d087 State.last_changed only changes if state changes
No longer affected if just the attributes get updated.
2015-01-02 08:48:20 -08:00
Paulus Schoutsen
1ebaf7fd36 Tweaked the default 'more info' component text 2015-01-02 08:47:11 -08:00
Paulus Schoutsen
67d62a1723 New compiled version of frontend 2015-01-01 22:06:55 -08:00
Paulus Schoutsen
edb01b6bb4 Moved dialog logic to base class. 2015-01-01 22:06:39 -08:00
Paulus Schoutsen
5e9303dbf2 Create cards and more-info elements dynamically 2015-01-01 22:02:28 -08:00
Paulus Schoutsen
a0a1573dc9 More info for sun domain added 2015-01-01 21:02:30 -08:00
Paulus Schoutsen
debca88a0d All custom groups in 1 section instead of each their own 2015-01-01 20:03:24 -08:00
Paulus Schoutsen
dec12be52e Add more-info card for group domain 2015-01-01 19:42:20 -08:00
Paulus Schoutsen
85f5df55e9 frontend more-info-light: tweaks & cleanup 2014-12-30 18:37:33 -08:00
Paulus Schoutsen
fee51d604d demo comp: preserve color when turning on light that's on 2014-12-30 18:36:55 -08:00
Paulus Schoutsen
d506d0f424 Demo component now supports brightness/color for lights 2014-12-30 08:41:42 -08:00
Paulus Schoutsen
4dcaf12fa7 Added option to select light colors 2014-12-29 23:54:55 -08:00
Paulus Schoutsen
cfeb1f1538 Now able to change brightness of lights from more info dialog 2014-12-29 23:40:27 -08:00
Paulus Schoutsen
973525da6d Do not pollute template refs with ambigious names 2014-12-29 22:49:11 -08:00
Paulus Schoutsen
d5737aafce Frontend: Clicking a card opens more info screen 2014-12-29 22:47:29 -08:00
Gustav Ahlberg
b0b62d5db0 Fixed some lint errors 2014-12-29 01:18:02 +01:00
Gustav Ahlberg
03e30ea5ed SunEventListener documentation 2014-12-28 14:56:50 +01:00
Gustav Ahlberg
99b1cbf9b5 Merge remote-tracking branch 'upstream/master' into scheduler
* upstream/master: (60 commits)
  StateMachine is now case insensitive for entity ids
  Added an example component that does the bare minimum
  State card rendering now way more flexible
  Update README.md
  Update documentation for example component
  Add link to demo in README
  Add code to mock API for demo on home-assistant.io
  Moved documentation from GitHub source to home-assistant.io
  Make nmap mac regex more flexible to play nice with OS X
  Frontend: color switch icons yellow if on
  New strategy for defining number of used threads
  WeMo component exposes Insight info if available
  Only turn off the specified lights
  Fix default light and device group IDs
  Add nmap_tracker documentation
  Fix typo and default groups
  Specify devices for trigger
  nmap-based device tracking plugin
  Make block_till_stopped test more flexible
  Fix PyLint
  ...
2014-12-28 14:49:28 +01:00
Gustav Ahlberg
b1cc760bd1 TimeEventListener uses ServiceEventListener 2014-12-28 11:38:57 +01:00
Gustav Ahlberg
83320681f0 SunriseEventListener and SunsetEventListner 2014-12-28 11:37:37 +01:00
Gustav Ahlberg
c436b33da9 added seconds to timeEventListener 2014-12-28 11:29:26 +01:00
Paulus Schoutsen
89a548252a StateMachine is now case insensitive for entity ids 2014-12-26 23:26:39 -08:00
Paulus Schoutsen
df3ddea23c Added an example component that does the bare minimum 2014-12-26 22:58:58 -08:00
Paulus Schoutsen
029c38874b State card rendering now way more flexible
Decoupled state card into reusable components. Now able to have
different states be rendered with different state card components.
2014-12-23 21:12:42 -08:00
Paulus Schoutsen
5f7a9d9918 Update README.md 2014-12-21 23:42:21 -08:00
Paulus Schoutsen
da4ab542a7 Update documentation for example component 2014-12-21 22:21:32 -08:00
Paulus Schoutsen
0cfae7245b Add link to demo in README 2014-12-21 22:20:17 -08:00
Paulus Schoutsen
249d4d7062 Add code to mock API for demo on home-assistant.io 2014-12-21 15:07:01 -08:00
Paulus Schoutsen
e3961b7532 Moved documentation from GitHub source to home-assistant.io 2014-12-21 15:06:17 -08:00
Paulus Schoutsen
47e6290609 Make nmap mac regex more flexible to play nice with OS X 2014-12-19 15:42:34 -08:00
Paulus Schoutsen
47adae7917 Frontend: color switch icons yellow if on 2014-12-16 22:04:01 -08:00
Paulus Schoutsen
970014588a New strategy for defining number of used threads
Number of worker threads is 2 + 1 for each component that polls devices.
2014-12-16 21:46:02 -08:00
Paulus Schoutsen
528cd8ee48 WeMo component exposes Insight info if available 2014-12-15 19:14:31 -08:00
Paulus Schoutsen
7a9898fbd2 Merge remote-tracking branch 'origin/master' into dev 2014-12-15 18:57:53 -08:00
Paulus Schoutsen
c18bb7dcad Merge pull request #15 from trainman419/multi_room
Add support to device_sun_light_trigger to target specific device groups.
2014-12-15 18:57:12 -08:00
Paulus Schoutsen
bacad3b60e Merge pull request #14 from trainman419/nmap_tracker
nmap based device tracking plugin
2014-12-15 11:34:31 -08:00
trainman419
1c1d075c12 Only turn off the specified lights 2014-12-15 11:29:48 -08:00
trainman419
69a616a0ba Fix default light and device group IDs 2014-12-15 11:29:22 -08:00
trainman419
a49c839514 Add nmap_tracker documentation 2014-12-15 11:22:10 -08:00
trainman419
18396d2ee5 Fix typo and default groups 2014-12-15 00:49:56 -08:00
trainman419
cec5ca8ba2 Specify devices for trigger 2014-12-15 00:14:10 -08:00
trainman419
4495812b84 nmap-based device tracking plugin 2014-12-14 23:28:12 -08:00
Paulus Schoutsen
a54e6af24a Make block_till_stopped test more flexible 2014-12-14 19:59:52 -08:00
Paulus Schoutsen
bea7634b47 Fix PyLint 2014-12-14 19:59:37 -08:00
Paulus Schoutsen
344ce6ee4d Define number of worker threads based on cpu count 2014-12-14 18:28:11 -08:00
Paulus Schoutsen
4e4e6b1133 Upgrade to Polymer 0.5.2 2014-12-14 00:45:29 -08:00
Paulus Schoutsen
5e8673fc4a API Call Service returns states changed 2014-12-14 00:35:16 -08:00
Paulus Schoutsen
b091e9c31c Added TrackStates context manager 2014-12-14 00:32:20 -08:00
Paulus Schoutsen
dfa1e1c586 Fix Chromecast tests 2014-12-13 22:49:49 -08:00
Paulus Schoutsen
78d5625ace Calling a service can now block till execution is done 2014-12-13 22:40:00 -08:00
Paulus Schoutsen
f8223053bd Style fixes in home-assistant-api.html 2014-12-13 22:29:05 -08:00
Paulus Schoutsen
e2b434b24e Log file now also contains warnings 2014-12-12 08:15:34 -08:00
Paulus Schoutsen
7c404a0551 device_tracker - No longer keep writing same new devices to known_devices.csv 2014-12-12 07:32:50 -08:00
Paulus Schoutsen
81be3811dc Only save the valid entities in the group entity_ids attribute 2014-12-12 07:21:25 -08:00
Paulus Schoutsen
40cde1f836 Merge pull request #12 from jd/jd/typo
Fix typo in doc
2014-12-12 07:04:48 -08:00
Julien Danjou
36cb12cd15 Fix typo in doc 2014-12-12 11:40:20 +01:00
Paulus Schoutsen
df3521e706 Group component is more flexible when to setup a group 2014-12-11 17:31:01 -08:00
Paulus Schoutsen
ea1e4108cc Auth header for API is now prefixed with X- to follow spec 2014-12-09 00:34:36 -08:00
Paulus Schoutsen
756425f7b4 Added frontend icon for simple_alarm 2014-12-09 00:29:07 -08:00
Paulus Schoutsen
00e1ecb5ad Fix: simple_alarm will now report if proper initialized 2014-12-09 00:14:12 -08:00
Paulus Schoutsen
4e1b094449 Simple_alarm will only show known_alarm if that light is already on 2014-12-09 00:06:55 -08:00
Paulus Schoutsen
dd55d6c7f9 Added a simple_alarm component 2014-12-08 23:47:20 -08:00
Paulus Schoutsen
6044742cee Fix: Hue lights will not flash anymore on next turn on call after having flashed 2014-12-08 23:41:52 -08:00
Paulus Schoutsen
99447eaa17 Light component now supports sending flash command 2014-12-08 23:02:38 -08:00
Paulus Schoutsen
e7dff308ef Updated example component with more examples 2014-12-08 22:06:57 -08:00
Paulus Schoutsen
1f582cbeec Fix: Read known devices file once on init device_tracker 2014-12-08 22:06:38 -08:00
Paulus Schoutsen
68aa78d1fe Fix some style warnings by PyCharm 2014-12-07 01:28:52 -08:00
Paulus Schoutsen
0527760e9b Refactor: code moved to new helper and constants file. Also adds support for multiple types for switch/light components. 2014-12-06 23:57:02 -08:00
Paulus Schoutsen
513a03fb46 Updated API docs 2014-12-06 16:16:11 -08:00
Paulus Schoutsen
48089b01ab Renamed AddCooldown to Throttle and added bypass functionality 2014-12-04 21:06:45 -08:00
Paulus Schoutsen
31b9f65513 Added initial version of AddCooldown decorator 2014-12-04 01:14:27 -08:00
Gustav Ahlberg
c92089808f completed time_event_listener 2014-12-03 20:38:48 +01:00
Paulus Schoutsen
eef4817804 Cleaned up device_tracker and added tests 2014-12-02 23:54:10 -08:00
Paulus Schoutsen
12c734fa48 Update travis.yml to point at new test 2014-12-01 07:59:08 -08:00
Paulus Schoutsen
ed150b8ea5 Renamed test to ha_test because of conflict with built-in python test package 2014-11-30 23:15:18 -08:00
Paulus Schoutsen
5835d502c7 Moved more methods out of HomeAssistant object 2014-11-30 18:42:52 -08:00
Paulus Schoutsen
c08676aa81 Reorganized some core methods 2014-11-28 23:38:42 -08:00
Paulus Schoutsen
6f05548ec8 Add test coverage for demo component 2014-11-28 22:49:29 -08:00
Paulus Schoutsen
a4eb975b59 HTTP more robust and increased test coverage 2014-11-28 22:27:44 -08:00
Paulus Schoutsen
014abdba39 Remove unused imports in tests 2014-11-28 21:02:03 -08:00
Paulus Schoutsen
cdccdb432a Test remote methods for errors 2014-11-28 21:01:44 -08:00
Paulus Schoutsen
63f8f2ee7f Remote instance closes event forwarding on shutdown 2014-11-28 20:37:23 -08:00
Paulus Schoutsen
cfae4c667a Minor improvements to homeassistant.remote tests 2014-11-28 20:22:29 -08:00
Paulus Schoutsen
006310c883 Home Assistant stop is more robust 2014-11-28 20:22:08 -08:00
Paulus Schoutsen
89102b5652 Increase homeassistant.util test coverage 2014-11-28 19:42:16 -08:00
Paulus Schoutsen
5fe73cf33e Made dependency loading more robust 2014-11-28 15:36:21 -08:00
Gustav Ahlberg
09908f5780 Merge branch 'dev' of https://github.com/balloob/home-assistant into scheduler
# By Paulus Schoutsen
# Via Paulus Schoutsen
* 'dev' of https://github.com/balloob/home-assistant: (51 commits)
  Light test tests light profile loading
  Loader test tests now custom component loading
  Default config dir is now working_dir/config
  Add sun component test for state change
  Tweak light test to create correct exception
  Better light.xy_color parsing
  Added light component test coverage
  Renamed mock_switch_platform to mock_toggledevice_platform
  Expanded switch test to push it to 100% coverage
  Fix to make tests work on Travis CI
  Added tests for switch component
  Clean up code sun component tests
  Added test coverage for sun component
  Minor fix for Chromecast component
  Cleaned up tests a bit
  Added initial Chromecast test coverage
  Final test added to get to 100% coverage for groups
  Extended group tests
  Added group component tests
  Reorganized testing
  ...
2014-11-26 20:44:37 +01:00
Gustav Ahlberg
1c94bb1c0f Schedule component and time event
The schedule can read a schedule.json file and create time events
2014-11-26 20:38:40 +01:00
Paulus Schoutsen
ce1a5de607 Light test tests light profile loading 2014-11-25 23:16:07 -08:00
Paulus Schoutsen
c3047efc45 Loader test tests now custom component loading 2014-11-25 23:15:58 -08:00
Paulus Schoutsen
9c4111403e Default config dir is now working_dir/config 2014-11-25 23:15:18 -08:00
Paulus Schoutsen
cda04b7ece Add sun component test for state change 2014-11-25 22:31:36 -08:00
Paulus Schoutsen
4405d09d38 Tweak light test to create correct exception 2014-11-25 21:42:33 -08:00
Paulus Schoutsen
2220df5a3e Better light.xy_color parsing 2014-11-25 21:38:47 -08:00
Paulus Schoutsen
5f9787aeb2 Added light component test coverage 2014-11-25 21:28:43 -08:00
Paulus Schoutsen
845a028d42 Renamed mock_switch_platform to mock_toggledevice_platform 2014-11-25 19:16:42 -08:00
Paulus Schoutsen
3e348880d5 Expanded switch test to push it to 100% coverage 2014-11-25 00:33:02 -08:00
Paulus Schoutsen
100948eb38 Fix to make tests work on Travis CI 2014-11-25 00:28:14 -08:00
Paulus Schoutsen
5cbe7bf1b8 Added tests for switch component 2014-11-25 00:20:36 -08:00
Paulus Schoutsen
8c56b415cb Clean up code sun component tests 2014-11-24 23:35:50 -08:00
Paulus Schoutsen
4e155d50f3 Added test coverage for sun component 2014-11-24 23:19:33 -08:00
Paulus Schoutsen
470125b69a Minor fix for Chromecast component 2014-11-23 22:21:47 -08:00
Paulus Schoutsen
fa3b63f5e5 Cleaned up tests a bit 2014-11-23 22:18:51 -08:00
Paulus Schoutsen
244e2a0e7e Added initial Chromecast test coverage 2014-11-23 22:18:40 -08:00
Paulus Schoutsen
fa1b5b846e Final test added to get to 100% coverage for groups 2014-11-23 17:13:16 -08:00
Paulus Schoutsen
c6cb2c27bd Extended group tests 2014-11-23 17:06:19 -08:00
Paulus Schoutsen
a11ef38c9b Added group component tests 2014-11-23 16:46:59 -08:00
Paulus Schoutsen
bc4b81d525 Reorganized testing 2014-11-23 13:00:06 -08:00
Paulus Schoutsen
ad16c32504 Reorganized tests 2014-11-23 09:51:16 -08:00
Paulus Schoutsen
5278fe2f47 Added test coverage for core components 2014-11-23 00:32:03 -08:00
Paulus Schoutsen
ec59c3c793 Added test to validate frontend loads 2014-11-23 00:01:15 -08:00
Paulus Schoutsen
e5be72e445 Fix a flaky test 2014-11-22 23:41:47 -08:00
Paulus Schoutsen
296a5e3b10 Added test coverage badge to README 2014-11-22 23:36:11 -08:00
Paulus Schoutsen
38b85e3ca2 Added tests for loader and util 2014-11-22 23:35:59 -08:00
Paulus Schoutsen
b94ab32d60 Last pieces of test coverage for core classes 2014-11-22 22:37:53 -08:00
Paulus Schoutsen
5943f757a0 Even more test coverage 2014-11-22 21:40:01 -08:00
Paulus Schoutsen
1069d79298 All core classes have full test coverage 2014-11-22 18:17:36 -08:00
Paulus Schoutsen
2866437a1f remote.set_state would log error even if not 2014-11-22 17:16:23 -08:00
Paulus Schoutsen
a391bc3d3f Work around a pylint bug 2014-11-22 16:56:36 -08:00
Paulus Schoutsen
feeeac2a75 Remove unused __init__ file from external dir 2014-11-22 15:57:49 -08:00
Paulus Schoutsen
01f738c151 Move to Pypi version of Phue again 2014-11-22 15:49:54 -08:00
Paulus Schoutsen
4b2fa2d413 Added temporary Phue installation instructions 2014-11-20 23:10:25 -08:00
Paulus Schoutsen
d3bf245331 Updated documentation 2014-11-20 23:03:21 -08:00
Paulus Schoutsen
4fb2fcc7a0 ps: added comments to requirements.txt for clarity 2014-11-20 22:53:43 -08:00
Paulus Schoutsen
66f8daded1 Minor cleanup 2014-11-19 23:42:57 -08:00
Paulus Schoutsen
cc4c557e89 Cleanup of state-badge.html 2014-11-19 23:13:48 -08:00
Paulus Schoutsen
9656ff6636 show HA toolbar when showing popups for easy going back 2014-11-19 23:02:09 -08:00
Paulus Schoutsen
88c4c77cbd New compiled version frontend 2014-11-19 19:20:30 -08:00
Paulus Schoutsen
651d2dfd86 Improved layout of popups on small screens 2014-11-19 19:20:06 -08:00
Paulus Schoutsen
67bb64ab6b Cleaned up states-cards.html 2014-11-19 19:01:46 -08:00
Paulus Schoutsen
04e58bd375 tab bar autohides on scroll down 2014-11-19 19:01:26 -08:00
Paulus Schoutsen
a4dab870ce Reworked Splash Login. Hides virtual keyboard, squashed bugs. 2014-11-19 18:15:37 -08:00
Gustav Ahlberg
aab52ca686 Schedule component
Can read schedule json config file
Can load custom rule_types
2014-11-17 21:18:01 +01:00
Paulus Schoutsen
5d107ed74b Switched style checking to flake8 instead of pep8 2014-11-16 22:18:52 -08:00
Paulus Schoutsen
973ce21353 Improve flexibility of the loader 2014-11-14 23:17:18 -08:00
Paulus Schoutsen
0c7b6e26aa Add test coverage tracking via coveralls 2014-11-14 22:23:48 -08:00
Paulus Schoutsen
20ff5fadee Added doctype HTML to stop Safari converting selectors in embedded CSS to lower case 2014-11-14 00:26:20 -08:00
Paulus Schoutsen
bdfb8deb94 Updated screenshots 2014-11-13 22:52:39 -08:00
Paulus Schoutsen
fa75458b30 frontend compile script now strips comments 2014-11-13 22:47:06 -08:00
Paulus Schoutsen
cea18ee561 Minor frontend bugfixes 2014-11-13 22:25:43 -08:00
Paulus Schoutsen
2478656622 Upgraded to Polymer 0.5.1 2014-11-13 08:13:29 -08:00
Paulus Schoutsen
23d080af86 Upgraded to Polymer 0.5 2014-11-12 00:36:20 -08:00
Paulus Schoutsen
4dcdca1bd5 Updated CONTRIBUTING documentation 2014-11-11 22:51:08 -08:00
Paulus Schoutsen
2051871c81 Add pylint to travis 2014-11-11 22:18:35 -08:00
Paulus Schoutsen
da960b29da Added meta-tag theme-color for better app experience on Chrome Mobile 2014-11-11 22:04:26 -08:00
Paulus Schoutsen
9f9b926011 All platforms supported by components have their own file - you can can have custom platforms 2014-11-11 21:39:17 -08:00
Gustav Ahlberg
8c6e6e464e pylint and PEP8 errors 2014-11-11 18:59:38 -08:00
Gustav Ahlberg
f4e54719b9 Added support for tellstick devices and sensors 2014-11-11 18:59:38 -08:00
Paulus Schoutsen
c856c117a8 PEP8 style fix 2014-11-11 09:30:11 -08:00
Paulus Schoutsen
8ae9faf128 Added PEP8 checking to Travis 2014-11-11 09:14:00 -08:00
Paulus Schoutsen
4f226bcc7a Added CONTRIBUTING.md 2014-11-09 19:57:28 -08:00
Paulus Schoutsen
15f67fd6a7 Added a travis config file 2014-11-09 16:56:15 -08:00
Paulus Schoutsen
47dea785a8 Refactored light to be more reusable 2014-11-09 15:19:13 -08:00
Paulus Schoutsen
ca336bef57 Fixed a bug that prevented the service dialog from sending JSON 2014-11-09 14:45:43 -08:00
Paulus Schoutsen
a4bac63161 Cleanup of process component 2014-11-09 02:58:41 -08:00
Paulus Schoutsen
2ec1f20a03 Added support for unit_of_measurement 2014-11-08 17:45:09 -08:00
Paulus Schoutsen
5770cc03a1 Migrated wemo component to be part of a switch component 2014-11-08 17:20:43 -08:00
Paulus Schoutsen
222d57bda7 track_state_change now accepts a list of entity_ids 2014-11-08 14:22:17 -08:00
Paulus Schoutsen
1e136a2416 Logging is more efficient 2014-11-08 13:59:40 -08:00
Paulus Schoutsen
c3c1383ae6 More error checking added on start 2014-11-08 11:01:47 -08:00
Paulus Schoutsen
9f24101348 Refactor __main__ to use ArgParse 2014-11-05 07:58:20 -08:00
Paulus Schoutsen
aa80841519 Loader no longer crashes if custom_components folder does not exists in the config dir 2014-11-05 07:56:36 -08:00
Paulus Schoutsen
4c5bad495f Fix tests after enforcing entity id format 2014-11-05 07:46:33 -08:00
Paulus Schoutsen
1d90148f62 Updated the customizing section of the documentation 2014-11-05 07:21:07 -08:00
Paulus Schoutsen
a9ee2f9c54 Refactor: loading of components now done in a seperate module + better error reporting 2014-11-04 23:34:19 -08:00
Paulus Schoutsen
3c37f491b2 Update compiled frontend with latest changes 2014-11-04 20:24:48 -08:00
Paulus Schoutsen
ac2389a0a5 Responsive design now supports up to 4 columns 2014-11-04 20:23:46 -08:00
Paulus Schoutsen
714f747b61 Bugfix: Sun and light state icon default colors if on work again 2014-11-04 20:15:20 -08:00
Paulus Schoutsen
904bf4493e Added entity_id validation to the State class 2014-11-04 19:59:22 -08:00
Paulus Schoutsen
f9fbb30fc0 Updated screenshots 2014-11-02 20:54:00 -08:00
Paulus Schoutsen
c489c68f02 state-badge no longer sets url(undefined) as background-image 2014-11-02 18:50:16 -08:00
Paulus Schoutsen
bb23f57f96 Renamed build_polymer to build_frontend 2014-11-02 17:57:48 -08:00
Paulus Schoutsen
98c2f1ea42 Fix broken tests after API upgrade 2014-11-02 17:52:51 -08:00
Paulus Schoutsen
94d9cbf76e Starting home assistant is now done via __main__.py 2014-11-02 17:27:32 -08:00
Paulus Schoutsen
d56edd46bb Phue: Switched to GIT-version because pip version lacks behind 2014-11-02 16:22:59 -08:00
Paulus Schoutsen
542e6b9536 Timestamp tooltip is working again 2014-11-02 14:45:13 -08:00
Paulus Schoutsen
4f0b828a15 Responsive layout now grows up to 3 columns 2014-11-02 11:58:32 -08:00
Paulus Schoutsen
1bab576be7 Added support for entity pictures 2014-11-02 11:22:22 -08:00
Paulus Schoutsen
f9462613f5 Refactor Javascript backend 2014-11-02 10:45:49 -08:00
Paulus Schoutsen
ac8d70d547 Added a demo mode 2014-11-02 09:41:41 -08:00
Paulus Schoutsen
a4dd58cf5e Responsive happiness 2014-11-02 00:06:04 -07:00
Paulus Schoutsen
a0ab73882c No longer show groups on ALL tab 2014-11-01 22:10:32 -07:00
Paulus Schoutsen
48c3c44aba Updating compiled frontend to latest version 2014-11-01 15:37:24 -07:00
Paulus Schoutsen
523cd8249f Use friendly_name for entityDisplay if available 2014-11-01 15:29:39 -07:00
Paulus Schoutsen
b686f04121 Major cleanup frontend 2014-11-01 15:04:44 -07:00
Paulus Schoutsen
990ac057db Reduced font size of state card 2014-11-01 08:20:06 -07:00
Paulus Schoutsen
d1f3c84212 State card for light will show actual color of light 2014-11-01 08:16:34 -07:00
Paulus Schoutsen
86dc0a973c Sun will now also color yellow when above horizon 2014-10-31 00:23:06 -07:00
Paulus Schoutsen
ece0902ab2 after calling a service on a group, update all states 2014-10-31 00:21:29 -07:00
Paulus Schoutsen
895ba6adbc Light state badges will turn yellow when turned on 2014-10-31 00:15:22 -07:00
Paulus Schoutsen
7db8bc6423 lights will now show as on after being turned on 2014-10-30 23:55:38 -07:00
Paulus Schoutsen
68f8fd290a filtering by group no longer messes toggle for group state up 2014-10-30 23:01:13 -07:00
Paulus Schoutsen
22b3d7810d Default state name tweaks 2014-10-30 22:29:33 -07:00
Paulus Schoutsen
82b2b9cb94 Squashed bugs in frontend 2014-10-30 22:24:28 -07:00
Paulus Schoutsen
1d0657ff54 Frontend: header size matches material design 2014-10-29 19:04:03 -07:00
Paulus Schoutsen
30ba447c64 More material love for interface 2014-10-29 00:47:55 -07:00
Paulus Schoutsen
3bab3f4be1 Frontend password checking is now done in polymer 2014-10-28 00:38:25 -07:00
Paulus Schoutsen
b9d0316903 Updated Nexus 10 screenshot 2014-10-27 22:52:16 -07:00
Paulus Schoutsen
2e721f92a3 Updated README.md with new interface 2014-10-26 19:40:14 -07:00
Paulus Schoutsen
d2a4d67cb0 Added gzip and better caching 2014-10-26 18:10:01 -07:00
Paulus Schoutsen
506496743d Cleaning up the code 2014-10-24 23:44:00 -07:00
Paulus Schoutsen
3db43d6545 Now JavaScript is inlined too 2014-10-24 23:31:12 -07:00
Paulus Schoutsen
b4de063e76 Update docker file, node no longer installed 2014-10-24 23:10:29 -07:00
Paulus Schoutsen
e7c648a2c3 Home Assistant contains pre-compiled version of polymer components 2014-10-24 23:09:19 -07:00
Paulus Schoutsen
5596ac7d55 Chromecast no longer exposes host attribute 2014-10-24 23:09:19 -07:00
Paulus Schoutsen
450ce69353 Frontend now has mobile web app attribute set 2014-10-23 13:07:25 -07:00
Paulus Schoutsen
3eca37afd2 Added mobile device friendliness 2014-10-22 20:46:18 -07:00
Paulus Schoutsen
2a15e239c3 Improved state card 2014-10-22 20:28:16 -07:00
Paulus Schoutsen
552f78fc5c Added refresh button 2014-10-22 19:52:16 -07:00
Paulus Schoutsen
5d641b76d2 Add frontend build instruction to readme 2014-10-22 08:20:37 -07:00
Paulus Schoutsen
55f85f59d9 Fix the Dockerfile 2014-10-22 08:20:09 -07:00
Paulus Schoutsen
7eafa5805a In rare occasion the group component would not load 2014-10-22 08:12:32 -07:00
Paulus Schoutsen
f510ee333b group.setup now fails gracefully if config[group] not available. 2014-10-22 01:07:58 -07:00
Paulus Schoutsen
dc157edd7d Delete unused polymer file 2014-10-22 00:41:27 -07:00
Paulus Schoutsen
7cdda3a3d7 Group pep8 fix 2014-10-22 00:38:22 -07:00
Paulus Schoutsen
e8ab546d32 Added initial version of Polymer frontend 2014-10-22 00:38:13 -07:00
Paulus Schoutsen
80ecbe8057 Polymer build script added 2014-10-22 00:18:00 -07:00
Paulus Schoutsen
8a8097af99 Initial commit Polymer interface 2014-10-22 00:02:18 -07:00
Paulus Schoutsen
a0c12fe685 More API clean up 2014-10-21 23:52:24 -07:00
Paulus Schoutsen
e71efb3b68 pylint hints update 2014-10-21 23:52:05 -07:00
Paulus Schoutsen
c69b9aefec Bug fix: group not always loaded 2014-10-21 23:51:23 -07:00
Paulus Schoutsen
58c90402c5 Even more simplified API 2014-10-19 23:37:43 -07:00
Paulus Schoutsen
7c17987585 Updated API doc 2014-10-19 18:44:06 -07:00
Paulus Schoutsen
9979a3266e Call service api simplified 2014-10-19 18:41:06 -07:00
Paulus Schoutsen
001f27cdb4 HTTP API is now more RESTful 2014-10-17 00:17:02 -07:00
Paulus Schoutsen
951c3683b2 Added pylint configuration 2014-10-09 22:48:22 -07:00
Paulus Schoutsen
a339fd0b53 Fixed typo in architecture diagram 2014-10-04 13:29:50 -04:00
Paulus Schoutsen
8db1b74a3c device_sun_light_trigger: added option to disable turning devices off when all people gone 2014-09-27 07:18:55 -07:00
Paulus Schoutsen
8ef3009cc7 Better temporary phue Docker fix 2014-09-27 07:02:55 -07:00
Paulus Schoutsen
05e6ac8c1f Use git/master for phue while waiting for new release 2014-09-26 18:44:53 -07:00
Paulus Schoutsen
f06e4bde94 Documentation tweaks 2014-09-26 14:47:19 -07:00
Paulus Schoutsen
1ce48ece10 Updated documentation 2014-09-26 14:27:28 -07:00
Paulus Schoutsen
6164895bc9 Added PyUserinput to requirements.txt 2014-09-24 23:30:59 -05:00
Paulus Schoutsen
8abe473e53 Docker registry apparently does git clone --recursive 2014-09-24 23:18:10 -05:00
Paulus Schoutsen
a5976b7c6f Dockerfile initialized git submodules wrongly 2014-09-24 22:59:18 -05:00
Paulus Schoutsen
aa33e051bb Removed reference in gitsubmodule to pychromecast 2014-09-24 22:53:29 -05:00
Paulus Schoutsen
e8a5fa1413 Dockerfile integrated in main repo 2014-09-24 22:36:52 -05:00
Paulus Schoutsen
38ed025ce3 Improved logging message for HTTP and SUN components 2014-09-24 21:59:04 -05:00
Paulus Schoutsen
fbc1c21b2a Added requirements.txt 2014-09-24 21:34:09 -05:00
Paulus Schoutsen
27d448870d Tweak README.md layout for related projects 2014-09-24 12:06:12 -05:00
Paulus Schoutsen
29c62780fc Moved Tasker for Android to separate repository 2014-09-24 12:04:33 -05:00
Paulus Schoutsen
31c88efc4a Updated favicon 2014-09-23 16:51:39 -05:00
Paulus Schoutsen
17eefcffbe Home Assistant no longer crashes if it cannot write its log file 2014-09-22 21:44:26 -05:00
Paulus Schoutsen
d570aeef33 Configuration goes now into a single directory 2014-09-20 21:19:39 -05:00
Paulus Schoutsen
f24e9597fe Group component converts given entity ids to a list prior processing 2014-08-14 12:46:19 +02:00
Paulus Schoutsen
997c2e8ef6 Components+configuration now loaded dynamically
A major change to the bootstrapping of Home Assistant decoupling the
knowledge in bootstrap for a more dynamic approach. This refactoring
also prepares the code for different configuration backends and the
loading components from different places.
2014-08-13 14:28:45 +02:00
Paulus Schoutsen
cb33b3bf24 Added missing docstring 2014-06-13 22:11:05 -07:00
Paulus Schoutsen
2226f8b6a9 Debug interface: added domain icons to services 2014-06-13 22:00:43 -07:00
Paulus Schoutsen
c84cb86c87 Debug interface CSS pointed at wrong TDs 2014-06-13 14:41:58 -07:00
Paulus Schoutsen
00c206c37b Add domain icon for process in debug interface 2014-06-13 00:15:26 -07:00
Paulus Schoutsen
16453a7728 Added domain icons to debug interface 2014-06-13 00:12:05 -07:00
Paulus Schoutsen
8b02c3c1cc Updated PyNetgear and PyWemo to latest version 2014-06-12 23:26:06 -07:00
Paulus Schoutsen
2eebe7d91e Add timeouts to HTTP requests 2014-06-12 23:09:56 -07:00
Paulus Schoutsen
00f0890021 Updated README.md screenshots 2014-06-05 23:28:48 -07:00
Paulus Schoutsen
6e7887db23 PyLint style fixes 2014-06-05 23:12:00 -07:00
Paulus Schoutsen
b09fe4a3a7 HTTP Debug interface tweaks 2014-06-05 23:05:13 -07:00
Paulus Schoutsen
69882ff4cf Debug interface now has JS to help call services 2014-06-04 00:50:41 -07:00
Paulus Schoutsen
bb337fa0a9 Debug interface caches static assets 2014-06-04 00:49:46 -07:00
Paulus Schoutsen
e9d1dfac84 Validate API on starting remote instance 2014-05-01 23:03:14 -07:00
Paulus Schoutsen
50b492c64a Remote instances are now 100% operational 2014-04-29 00:30:31 -07:00
Paulus Schoutsen
8e65afa994 Add support to hardcode hosts of WeMos 2014-04-24 22:53:35 -07:00
Paulus Schoutsen
ea22695aa7 Updated example config with process config 2014-04-24 21:16:03 -07:00
Paulus Schoutsen
472308ec71 Optimized process component. 2014-04-24 20:43:33 -07:00
Paulus Schoutsen
b30aeb1777 Merge pull request #3 from fingon/process-source-up
Added a simple process state monitor
2014-04-24 14:47:07 -07:00
Paulus Schoutsen
2b071ad775 Merge pull request #2 from fingon/luci-checker
Added LuciDeviceScanner to scan OpenWrt Luci-RPC enabled router's state.
2014-04-24 14:44:51 -07:00
Markus Stenberg
88fd75b4c7 Addressed the comments in the issue. pep8+pylint seem fine now. (still works, too.) 2014-04-24 17:13:57 +03:00
Markus Stenberg
39d1fad8cc Merge remote-tracking branch 'up/master' into process-source-up 2014-04-24 17:00:46 +03:00
Markus Stenberg
9af3d2b914 pep8 + pylint run fixes. Also refactored the json-rpc to happen only in one place (external library would be nice but oh well). 2014-04-24 16:58:15 +03:00
Markus Stenberg
fc6c2fbc18 Merge remote-tracking branch 'up/master' into luci-checker 2014-04-24 16:31:03 +03:00
Paulus Schoutsen
2e10d7223a Re-organized core for better reusability 2014-04-24 00:40:45 -07:00
Markus Stenberg
e36a53eea6 Added simple process state monitor source. 2014-04-23 23:55:22 +03:00
Paulus Schoutsen
3757ddf9df Add option to set fixed hosts for chromecasts instead of discovery 2014-04-21 17:58:58 -07:00
Markus Stenberg
ed31b6a527 Added LuciDeviceScanner to scan OpenWrt Luci-RPC enabled router's state. 2014-04-21 22:51:50 +03:00
Paulus Schoutsen
f4c77c85bd Now using PyWemo instead of Ouimeaux to control WeMo 2014-04-17 21:57:01 -07:00
Paulus Schoutsen
85f401f209 Upgraded pynetgear to python3 2014-04-17 21:50:35 -07:00
Paulus Schoutsen
ef6d862671 Further Python 3 migration 2014-04-14 23:48:00 -07:00
Paulus Schoutsen
7e06d535ab Ported codebase to Python 3. Long Live Python 3! 2014-04-14 00:10:31 -07:00
480 changed files with 61112 additions and 5110 deletions

167
.coveragerc Normal file
View File

@@ -0,0 +1,167 @@
[run]
source = homeassistant
omit =
homeassistant/__main__.py
# omit pieces of code that rely on external devices being present
homeassistant/components/alarm_control_panel/alarmdotcom.py
homeassistant/components/alarm_control_panel/nx584.py
homeassistant/components/arduino.py
homeassistant/components/*/arduino.py
homeassistant/components/apcupsd.py
homeassistant/components/*/apcupsd.py
homeassistant/components/bloomsky.py
homeassistant/components/*/bloomsky.py
homeassistant/components/insteon_hub.py
homeassistant/components/*/insteon_hub.py
homeassistant/components/isy994.py
homeassistant/components/*/isy994.py
homeassistant/components/modbus.py
homeassistant/components/*/modbus.py
homeassistant/components/*/tellstick.py
homeassistant/components/tellduslive.py
homeassistant/components/*/tellduslive.py
homeassistant/components/*/vera.py
homeassistant/components/ecobee.py
homeassistant/components/*/ecobee.py
homeassistant/components/verisure.py
homeassistant/components/*/verisure.py
homeassistant/components/wink.py
homeassistant/components/*/wink.py
homeassistant/components/zigbee.py
homeassistant/components/*/zigbee.py
homeassistant/components/zwave.py
homeassistant/components/*/zwave.py
homeassistant/components/rfxtrx.py
homeassistant/components/*/rfxtrx.py
homeassistant/components/mysensors.py
homeassistant/components/*/mysensors.py
homeassistant/components/nest.py
homeassistant/components/*/nest.py
homeassistant/components/rpi_gpio.py
homeassistant/components/*/rpi_gpio.py
homeassistant/components/scsgate.py
homeassistant/components/*/scsgate.py
homeassistant/components/binary_sensor/arest.py
homeassistant/components/binary_sensor/rest.py
homeassistant/components/browser.py
homeassistant/components/camera/*
homeassistant/components/device_tracker/actiontec.py
homeassistant/components/device_tracker/aruba.py
homeassistant/components/device_tracker/asuswrt.py
homeassistant/components/device_tracker/ddwrt.py
homeassistant/components/device_tracker/fritz.py
homeassistant/components/device_tracker/icloud.py
homeassistant/components/device_tracker/luci.py
homeassistant/components/device_tracker/netgear.py
homeassistant/components/device_tracker/nmap_tracker.py
homeassistant/components/device_tracker/snmp.py
homeassistant/components/device_tracker/thomson.py
homeassistant/components/device_tracker/tomato.py
homeassistant/components/device_tracker/tplink.py
homeassistant/components/device_tracker/ubus.py
homeassistant/components/discovery.py
homeassistant/components/downloader.py
homeassistant/components/garage_door/wink.py
homeassistant/components/ifttt.py
homeassistant/components/keyboard.py
homeassistant/components/light/blinksticklight.py
homeassistant/components/light/hue.py
homeassistant/components/light/hyperion.py
homeassistant/components/light/lifx.py
homeassistant/components/light/limitlessled.py
homeassistant/components/media_player/cast.py
homeassistant/components/media_player/denon.py
homeassistant/components/media_player/firetv.py
homeassistant/components/media_player/itunes.py
homeassistant/components/media_player/kodi.py
homeassistant/components/media_player/mpd.py
homeassistant/components/media_player/plex.py
homeassistant/components/media_player/samsungtv.py
homeassistant/components/media_player/snapcast.py
homeassistant/components/media_player/sonos.py
homeassistant/components/media_player/squeezebox.py
homeassistant/components/notify/free_mobile.py
homeassistant/components/notify/googlevoice.py
homeassistant/components/notify/instapush.py
homeassistant/components/notify/nma.py
homeassistant/components/notify/pushbullet.py
homeassistant/components/notify/pushetta.py
homeassistant/components/notify/pushover.py
homeassistant/components/notify/rest.py
homeassistant/components/notify/slack.py
homeassistant/components/notify/smtp.py
homeassistant/components/notify/syslog.py
homeassistant/components/notify/telegram.py
homeassistant/components/notify/twitter.py
homeassistant/components/notify/xmpp.py
homeassistant/components/sensor/arest.py
homeassistant/components/sensor/bitcoin.py
homeassistant/components/sensor/cpuspeed.py
homeassistant/components/sensor/dht.py
homeassistant/components/sensor/dweet.py
homeassistant/components/sensor/efergy.py
homeassistant/components/sensor/eliqonline.py
homeassistant/components/sensor/forecast.py
homeassistant/components/sensor/glances.py
homeassistant/components/sensor/netatmo.py
homeassistant/components/sensor/onewire.py
homeassistant/components/sensor/openweathermap.py
homeassistant/components/sensor/rest.py
homeassistant/components/sensor/sabnzbd.py
homeassistant/components/sensor/speedtest.py
homeassistant/components/sensor/swiss_public_transport.py
homeassistant/components/sensor/systemmonitor.py
homeassistant/components/sensor/temper.py
homeassistant/components/sensor/time_date.py
homeassistant/components/sensor/torque.py
homeassistant/components/sensor/transmission.py
homeassistant/components/sensor/twitch.py
homeassistant/components/sensor/worldclock.py
homeassistant/components/switch/arest.py
homeassistant/components/switch/edimax.py
homeassistant/components/switch/hikvisioncam.py
homeassistant/components/switch/mystrom.py
homeassistant/components/switch/orvibo.py
homeassistant/components/switch/rest.py
homeassistant/components/switch/transmission.py
homeassistant/components/switch/wemo.py
homeassistant/components/thermostat/heatmiser.py
homeassistant/components/thermostat/homematic.py
homeassistant/components/thermostat/honeywell.py
homeassistant/components/thermostat/proliphix.py
homeassistant/components/thermostat/radiotherm.py
[report]
# Regexes for lines to exclude from consideration
exclude_lines =
# Have to re-enable the standard pragma
pragma: no cover
# Don't complain about missing debug-only code:
def __repr__
# Don't complain if tests don't hit defensive assertion code:
raise AssertionError
raise NotImplementedError

41
.gitignore vendored
View File

@@ -1,15 +1,20 @@
home-assistant.log
home-assistant.conf
known_devices.csv
config/*
!config/home-assistant.conf.default
homeassistant/components/frontend/www_static/polymer/bower_components/*
# There is not a better solution afaik..
!config/custom_components
config/custom_components/*
!config/custom_components/example.py
!config/custom_components/hello_world.py
!config/custom_components/mqtt_example.py
tests/config/home-assistant.log
# Hide sublime text stuff
*.sublime-project
*.sublime-workspace
# Hide code validator output
pep8.txt
pylint.txt
# Hide some OS X stuff
.DS_Store
.AppleDouble
@@ -21,6 +26,9 @@ Icon
.idea
# pytest
.cache
# GITHUB Proposed Python stuff:
*.py[cod]
@@ -33,6 +41,7 @@ Icon
dist
build
eggs
.eggs
parts
bin
var
@@ -56,4 +65,20 @@ nosetests.xml
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
.pydevproject
.python-version
# emacs auto backups
*~
*#
*.orig
# venv stuff
pyvenv.cfg
pip-selfcheck.json
venv
# vimmy stuff
*.swp
*.swo

9
.gitmodules vendored
View File

@@ -1,6 +1,3 @@
[submodule "homeassistant/external/pychromecast"]
path = homeassistant/external/pychromecast
url = https://github.com/balloob/pychromecast.git
[submodule "homeassistant/external/pynetgear"]
path = homeassistant/external/pynetgear
url = https://github.com/balloob/pynetgear.git
[submodule "homeassistant/components/frontend/www_static/home-assistant-polymer"]
path = homeassistant/components/frontend/www_static/home-assistant-polymer
url = https://github.com/balloob/home-assistant-polymer.git

15
.travis.yml Normal file
View File

@@ -0,0 +1,15 @@
sudo: false
language: python
cache:
directories:
- $HOME/.cache/pip
# - "$HOME/virtualenv/python$TRAVIS_PYTHON_VERSION"
python:
- 3.4
- 3.5
install:
- "true"
script:
- script/cibuild
matrix:
fast_finish: true

71
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,71 @@
# Contributing to Home Assistant
Everybody is invited and welcome to contribute to Home Assistant. There is a lot to do...if you are not a developer perhaps you would like to help with the documentation on [home-assistant.io](https://home-assistant.io/)? If you are a developer and have devices in your home which aren't working with Home Assistant yet, why not spent a couple of hours and help to integrate them?
The process is straight-forward.
- Fork the Home Assistant [git repository](https://github.com/balloob/home-assistant).
- Write the code for your device, notification service, sensor, or IoT thing.
- Check it with ``pylint`` and ``flake8``.
- Create a Pull Request against the [**dev**](https://github.com/balloob/home-assistant/tree/dev) branch of Home Assistant.
Still interested? Then you should read the next sections and get more details.
## Adding support for a new device
For help on building your component, please see the [developer documentation](https://home-assistant.io/developers/) on [home-assistant.io](https://home-assistant.io/).
After you finish adding support for your device:
- Add any new dependencies to `requirements_all.txt` if needed. Use `script/gen_requirements_all.py`.
- Update the `.coveragerc` file to exclude your platform if there are no tests available.
- Provide some documentation for [home-assistant.io](https://home-assistant.io/). It's OK to just add a docstring with configuration details (sample entry for `configuration.yaml` file and alike) to the file header as a start. Visit the [website documentation](https://home-assistant.io/developers/website/) for further information on contributing to [home-assistant.io](https://github.com/balloob/home-assistant.io).
- Make sure all your code passes ``pylint`` and ``flake8`` (PEP8 and some more) validation. To check your repository, run `./script/lint`.
- Create a Pull Request against the [**dev**](https://github.com/balloob/home-assistant/tree/dev) branch of Home Assistant.
- Check for comments and suggestions on your Pull Request and keep an eye on the [Travis output](https://travis-ci.org/balloob/home-assistant/).
If you add a platform for an existing component, there is usually no need for updating the frontend. Only if you've added a new component that should show up in the frontend, there are more steps needed:
- Update the file [`home-assistant-icons.html`](https://github.com/balloob/home-assistant/blob/master/homeassistant/components/frontend/www_static/polymer/resources/home-assistant-icons.html) with an icon for your domain ([pick one from this list](https://www.polymer-project.org/1.0/components/core-elements/demo.html#core-icon)).
- Update the demo component with two states that it provides.
- Add your component to `home-assistant.conf.example`.
Since you've updated `home-assistant-icons.html`, you've made changes to the frontend:
- Run `build_frontend`. This will build a new version of the frontend. Make sure you add the changed files `frontend.py` and `frontend.html` to the commit.
### Setting states
It is the responsibility of the component to maintain the states of the devices in your domain. Each device should be a single state and, if possible, a group should be provided that tracks the combined state of the devices.
A state can have several attributes that will help the frontend in displaying your state:
- `friendly_name`: this name will be used as the name of the device
- `entity_picture`: this picture will be shown instead of the domain icon
- `unit_of_measurement`: this will be appended to the state in the interface
- `hidden`: This is a suggestion to the frontend on if the state should be hidden
These attributes are defined in [homeassistant.components](https://github.com/balloob/home-assistant/blob/master/homeassistant/components/__init__.py#L25).
### Proper Visibility Handling
Generally, when creating a new entity for Home Assistant you will want it to be a class that inherits the [homeassistant.helpers.entity.Entity](https://github.com/balloob/home-assistant/blob/master/homeassistant/helpers/entity.py) class. If this is done, visibility will be handled for you.
You can set a suggestion for your entity's visibility by setting the hidden property by doing something similar to the following.
```python
self.hidden = True
```
This will SUGGEST that the active frontend hides the entity. This requires that the active frontend support hidden cards (the default frontend does) and that the value of hidden be included in your attributes dictionary (see above). The Entity abstract class will take care of this for you.
Remember: The suggestion set by your component's code will always be overwritten by user settings in the configuration.yaml file. This is why you may set hidden to be False, but the property may remain True (or vice-versa).
### Working on the frontend
The frontend is composed of [Polymer](https://www.polymer-project.org) web-components and compiled into the file `frontend.html`. During development you do not want to work with the compiled version but with the seperate files. To have Home Assistant serve the seperate files, set `development=1` for the *http-component* in your config.
When you are done with development and ready to commit your changes, run `build_frontend`, set `development=0` in your config and validate that everything still works.
### Notes on PyLint and PEP8 validation
In case a PyLint warning cannot be avoided, add a comment to disable the PyLint check for that line. This can be done using the format `# pylint: disable=YOUR-ERROR-NAME`. Example of an unavoidable PyLint warning is if you do not use the passed in datetime if you're listening for time change.

27
Dockerfile Normal file
View File

@@ -0,0 +1,27 @@
FROM python:3.4
MAINTAINER Paulus Schoutsen <Paulus@PaulusSchoutsen.nl>
VOLUME /config
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# For the nmap tracker
RUN apt-get update && \
apt-get install -y --no-install-recommends nmap net-tools && \
apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY script/build_python_openzwave script/build_python_openzwave
RUN apt-get update && \
apt-get install -y cython3 libudev-dev && \
apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
pip3 install "cython<0.23" && \
script/build_python_openzwave
COPY requirements_all.txt requirements_all.txt
RUN pip3 install --no-cache-dir -r requirements_all.txt
# Copy source
COPY . .
CMD [ "python", "-m", "homeassistant", "--config", "/config" ]

View File

@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2013 Paulus Schoutsen
Copyright (c) 2016 Paulus Schoutsen
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in

5
MANIFEST.in Normal file
View File

@@ -0,0 +1,5 @@
include README.rst
include LICENSE
graft homeassistant
prune homeassistant/components/frontend/www_static/home-assistant-polymer
recursive-exclude * *.py[co]

240
README.md
View File

@@ -1,240 +0,0 @@
Home Assistant
==============
Home Assistant provides a platform for home automation. It does so by having modules that observe and trigger actors to do various tasks.
It is currently able to do the following things:
* Track if devices are home by monitoring connected devices to a wireless router (currently supporting modern Netgear routers or routers running Tomato firmware)
* Track and control lights
* Track and control WeMo switches
* Track and control Chromecasts
* Turn on the lights when people get home when the sun is setting or has set
* Slowly turn on the lights to compensate for light loss when the sun sets and people are home
* Turn off lights and connected devices when everybody leaves the house
* Download files to the host machine
* Open a url in the default browser at the host machine
* Simulate key presses on the host for Play/Pause, Next track, Prev track, Volume up, Volume Down
* Controllable via a REST API and web interface
* Support for remoting Home Assistant instances through a Python API
* Android Tasker project to control Home Assistant from your phone and report charging state.
![screenshot-states](https://raw.github.com/balloob/home-assistant/master/docs/states.png)
Current compatible devices:
* [WeMo switches](http://www.belkin.com/us/Products/home-automation/c/wemo-home-automation/)
* [Philips Hue](http://meethue.com)
* [Google Chromecast](http://www.google.com/intl/en/chrome/devices/chromecast)
* Wireless router running [Tomato firmware](http://www.polarcloud.com/tomato)
* Netgear wireless routers (tested with R6300)
The system is built modular so support for other devices or actions can be implemented easily.
Installation instructions
-------------------------
* The core depends on [PyEphem](http://rhodesmill.org/pyephem/) and [Requests](http://python-requests.org). Depending on the components you would like to use you will need [PHue](https://github.com/studioimaginaire/phue) for Philips Hue support, [PyChromecast](https://github.com/balloob/pychromecast) for Chromecast support and [ouimeaux](https://github.com/iancmcc/ouimeaux) for WeMo support. Install these using `pip install pyephem requests phue ouimeaux pychromecast`.
* Clone the repository and pull in the submodules `git clone --recursive https://github.com/balloob/home-assistant.git`
* Copy home-assistant.conf.default to home-assistant.conf and adjust the config values to match your setup.
* For Tomato you will have to not only setup your host, username and password but also a http_id. The http_id can be retrieved by going to the admin console of your router, view the source of any of the pages and search for `http_id`.
* If you want to use Hue, setup PHue by running `python -m phue --host HUE_BRIDGE_IP_ADDRESS` from the commandline and follow the instructions.
* While running the script it will create and maintain a file called `known_devices.csv` which will contain the detected devices. Adjust the track variable for the devices you want the script to act on and restart the script or call the service `device_tracker/reload_devices_csv`.
Done. Start it now by running `python start.py`
Web interface and API
---------------------
Home Assistent runs a webserver accessible on port 8123.
* At http://localhost:8123/ it will provide a debug interface showing the current state of the system and an overview of registered services.
* At http://localhost:8123/api/ it provides a password protected API.
A screenshot of the debug interface:
![screenshot-debug-interface](https://raw.github.com/balloob/home-assistant/master/docs/screenshot-debug-interface.png)
All API calls have to be accompanied by an 'api_password' parameter (as specified in `home-assistant.conf`) and will
return JSON encoded objects. If successful calls will return status code 200 or 201.
Other status codes that can occur are:
- 400 (Bad Request)
- 401 (Unauthorized)
- 404 (Not Found)
- 405 (Method not allowed)
The api supports the following actions:
**/api/states - GET**<br>
Returns a list of entity ids for which a state is available
```json
{
"entity_ids": [
"Paulus_Nexus_4",
"weather.sun",
"all_devices"
]
}
```
**/api/events - GET**<br>
Returns a dict with as keys the events and as value the number of listeners.
```json
{
"event_listeners": {
"state_changed": 5,
"time_changed": 2
}
}
```
**/api/services - GET**<br>
Returns a dict with as keys the domain and as value a list of published services.
```json
{
"services": {
"browser": [
"browse_url"
],
"keyboard": [
"volume_up",
"volume_down"
]
}
}
```
**/api/states/&lt;entity_id>** - GET<br>
Returns the current state from an entity
```json
{
"attributes": {
"next_rising": "07:04:15 29-10-2013",
"next_setting": "18:00:31 29-10-2013"
},
"entity_id": "weather.sun",
"last_changed": "23:24:33 28-10-2013",
"state": "below_horizon"
}
```
**/api/states/&lt;entity_id>** - POST<br>
Updates the current state of an entity. Returns status code 201 if successful with location header of updated resource and the new state in the body.<br>
parameter: new_state - string<br>
optional parameter: attributes - JSON encoded object
```json
{
"attributes": {
"next_rising": "07:04:15 29-10-2013",
"next_setting": "18:00:31 29-10-2013"
},
"entity_id": "weather.sun",
"last_changed": "23:24:33 28-10-2013",
"state": "below_horizon"
}
```
**/api/events/&lt;event_type>** - POST<br>
Fires an event with event_type<br>
optional parameter: event_data - JSON encoded object
```json
{
"message": "Event download_file fired."
}
```
**/api/services/&lt;domain>/&lt;service>** - POST<br>
Calls a service within a specific domain.<br>
optional parameter: service_data - JSON encoded object
```json
{
"message": "Service keyboard/volume_up called."
}
```
Android remote control
----------------------
An app has been built using [Tasker for Android](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm) that:
* Provides buttons to control the lights and the chromecast
* Reports the charging state and battery level of the phone
The [APK](https://raw.github.com/balloob/home-assistant/master/android-tasker/Home_Assistant.apk) and [Tasker project XML](https://raw.github.com/balloob/home-assistant/master/android-tasker/Home_Assistant.prj.xml) can be found in [/android-tasker/](https://github.com/balloob/home-assistant/tree/master/android-tasker)
![screenshot-android-tasker.jpg](https://raw.github.com/balloob/home-assistant/master/docs/screenshot-android-tasker.png)
Architecture
------------
The core of Home Assistant exists of two parts; a Bus for calling services and firing events and a State Machine that keeps track of the state of things.
![screenshot-android-tasker.jpg](https://raw.github.com/balloob/home-assistant/master/docs/architecture.png)
For example to control the lights there are two components. One is the device_tracker that polls the wireless router for connected devices and updates the state of the tracked devices in the State Machine to be either 'Home' or 'Not Home'.
When a state is changed a state_changed event is fired for which the device_sun_light_trigger component is listening. Based on the new state of the device combined with the state of the sun it will decide if it should turn the lights on or off:
In the event that the state of device 'Paulus Nexus 5' changes to the 'Home' state:
If the sun has set and the lights are not on:
Turn on the lights
In the event that the combined state of all tracked devices changes to 'Not Home':
If the lights are on:
Turn off the lights
In the event of the sun setting:
If the lights are off and the combined state of all tracked device equals 'Home':
Turn on the lights
By using the Bus as a central communication hub between components it is easy to replace components or add functionality. For example if you would want to change the way devices are detected you only have to write a component that updates the device states in the State Machine.
### Components
**sun**
Tracks the state of the sun and when the next sun rising and setting will occur.
Depends on: latitude and longitude
Action: maintains state of `weather.sun` including attributes `next_rising` and `next_setting`
**device_tracker**
Keeps track of which devices are currently home.
Action: sets the state per device and maintains a combined state called `all_devices`. Keeps track of known devices in the file `known_devices.csv`.
**Light**
Keeps track which lights are turned on and can control the lights.
**WeMo**
Keeps track which WeMo switches are in the network and allows you to control them.
**device_sun_light_trigger**
Turns lights on or off using a light control component based on state of the sun and devices that are home.
Depends on: light control, track_sun, DeviceTracker
Action:
* Turns lights off when all devices leave home.
* Turns lights on when a device is home while sun is setting.
* Turns lights on when a device gets home after sun set.
Registers services `light_control/turn_light_on` and `light_control/turn_light_off` to turn a or all lights on or off.
Optional service data:
- `light_id` - only act on specific light. Else targets all.
- `transition_seconds` - seconds to take to swithc to new state.
**chromecast**
Registers three services to start playing YouTube video's on the ChromeCast.
Service `chromecast/play_youtube_video` starts playing the specified video on the YouTube app on the ChromeCast. Specify video using `video` in service_data.
Service `chromecast/start_fireplace` will start a YouTube movie simulating a fireplace and the `chromecast/start_epic_sax` service will start playing Epic Sax Guy 10h version.
**media_buttons**
Registers services that will simulate key presses on the keyboard. It currently offers the following Buttons as a Service (BaaS): `keyboard/volume_up`, `keyboard/volume_down` and `keyboard/media_play_pause`
This actor depends on: PyUserInput
**downloader**
Registers service `downloader/download_file` that will download files. File to download is specified in the `url` field in the service data.
**browser**
Registers service `browser/browse_url` that opens `url` as specified in event_data in the system default browser.

98
README.rst Normal file
View File

@@ -0,0 +1,98 @@
Home Assistant |Build Status| |Coverage Status| |Join the chat at https://gitter.im/balloob/home-assistant|
===========================================================================================================
Home Assistant is a home automation platform running on Python 3. The
goal of Home Assistant is to be able to track and control all devices at
home and offer a platform for automating control.
To get started:
.. code:: bash
python3 -m pip install homeassistant
hass --open-ui
Check out `the website <https://home-assistant.io>`__ for `a
demo <https://home-assistant.io/demo/>`__, installation instructions,
tutorials and documentation.
|screenshot-states|
Examples of devices it can interface it:
- Monitoring connected devices to a wireless router:
`OpenWrt <https://openwrt.org/>`__,
`Tomato <http://www.polarcloud.com/tomato>`__,
`Netgear <http://netgear.com>`__,
`DD-WRT <http://www.dd-wrt.com/site/index>`__,
`TPLink <http://www.tp-link.us/>`__,
`ASUSWRT <http://event.asus.com/2013/nw/ASUSWRT/>`__ and any SNMP
capable Linksys WAP/WRT
- `Philips Hue <http://meethue.com>`__ lights,
`WeMo <http://www.belkin.com/us/Products/home-automation/c/wemo-home-automation/>`__
switches, `Edimax <http://www.edimax.com/>`__ switches,
`Efergy <https://efergy.com>`__ energy monitoring, and
`Tellstick <http://www.telldus.se/products/tellstick>`__ devices and
sensors
- `Google
Chromecasts <http://www.google.com/intl/en/chrome/devices/chromecast>`__,
`Music Player Daemon <http://www.musicpd.org/>`__, `Logitech
Squeezebox <https://en.wikipedia.org/wiki/Squeezebox_%28network_music_player%29>`__,
`Plex <https://plex.tv/>`__, `Kodi (XBMC) <http://kodi.tv/>`__,
iTunes (by way of
`itunes-api <https://github.com/maddox/itunes-api>`__), and Amazon
Fire TV (by way of
`python-firetv <https://github.com/happyleavesaoc/python-firetv>`__)
- Support for
`ISY994 <https://www.universal-devices.com/residential/isy994i-series/>`__
(Insteon and X10 devices), `Z-Wave <http://www.z-wave.com/>`__, `Nest
Thermostats <https://nest.com/>`__,
`RFXtrx <http://www.rfxcom.com/>`__,
`Arduino <https://www.arduino.cc/>`__, `Raspberry
Pi <https://www.raspberrypi.org/>`__, and
`Modbus <http://www.modbus.org/>`__
- Interaction with `IFTTT <https://ifttt.com/>`__
- Integrate data from the `Bitcoin <https://bitcoin.org>`__ network,
meteorological data from
`OpenWeatherMap <http://openweathermap.org/>`__ and
`Forecast.io <https://forecast.io/>`__,
`Transmission <http://www.transmissionbt.com/>`__, or
`SABnzbd <http://sabnzbd.org>`__.
- `See full list of supported
devices <https://home-assistant.io/components/>`__
Built home automation on top of your devices:
- Keep a precise history of every change to the state of your house
- Turn on the lights when people get home after sun set
- Turn on lights slowly during sun set to compensate for less light
- Turn off all lights and devices when everybody leaves the house
- Offers a `REST API <https://home-assistant.io/developers/api/>`__
and can interface with MQTT for easy integration with other projects
like `OwnTracks <http://owntracks.org/>`__
- Allow sending notifications using
`Instapush <https://instapush.im>`__, `Notify My Android
(NMA) <http://www.notifymyandroid.com/>`__,
`PushBullet <https://www.pushbullet.com/>`__,
`PushOver <https://pushover.net/>`__, `Slack <https://slack.com/>`__,
`Telegram <https://telegram.org/>`__, and `Jabber
(XMPP) <http://xmpp.org>`__
The system is built modular so support for other devices or actions can
be implemented easily. See also the `section on
architecture <https://home-assistant.io/developers/architecture.html>`__
and the `section on creating your own
components <https://home-assistant.io/developers/creating_components.html>`__.
If you run into issues while using Home Assistant or during development
of a component, check the `Home Assistant help
section <https://home-assistant.io/help/>`__ how to reach us.
.. |Build Status| image:: https://travis-ci.org/balloob/home-assistant.svg?branch=master
:target: https://travis-ci.org/balloob/home-assistant
.. |Coverage Status| image:: https://img.shields.io/coveralls/balloob/home-assistant.svg
:target: https://coveralls.io/r/balloob/home-assistant?branch=master
.. |Join the chat at https://gitter.im/balloob/home-assistant| image:: https://badges.gitter.im/Join%20Chat.svg
:target: https://gitter.im/balloob/home-assistant?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
.. |screenshot-states| image:: https://raw.github.com/balloob/home-assistant/master/docs/screenshots.png
:target: https://home-assistant.io/demo/

Binary file not shown.

View File

@@ -1,871 +0,0 @@
<TaskerData sr="" dvi="1" tv="4.2u3m">
<dmetric>1080.0,1776.0</dmetric>
<Profile sr="prof25" ve="2">
<cdate>1380613730755</cdate>
<clp>true</clp>
<edate>1382769497429</edate>
<id>25</id>
<mid0>23</mid0>
<mid1>20</mid1>
<nme>HA Power USB</nme>
<pri>10</pri>
<State sr="con0">
<code>10</code>
<Int sr="arg0" val="2"/>
</State>
</Profile>
<Profile sr="prof26" ve="2">
<cdate>1380613730755</cdate>
<clp>true</clp>
<edate>1383003483161</edate>
<id>26</id>
<mid0>22</mid0>
<mid1>20</mid1>
<nme>HA Power Wireless</nme>
<pri>10</pri>
<State sr="con0">
<code>10</code>
<Int sr="arg0" val="3"/>
</State>
</Profile>
<Profile sr="prof3" ve="2">
<cdate>1380613730755</cdate>
<clp>true</clp>
<edate>1383003498566</edate>
<id>3</id>
<mid0>10</mid0>
<mid1>20</mid1>
<nme>HA Power AC</nme>
<pri>10</pri>
<State sr="con0">
<code>10</code>
<Int sr="arg0" val="1"/>
</State>
</Profile>
<Profile sr="prof5" ve="2">
<cdate>1380496514959</cdate>
<cldm>1500</cldm>
<clp>true</clp>
<edate>1382769618501</edate>
<id>5</id>
<mid0>19</mid0>
<nme>HA Battery Changed</nme>
<Event sr="con0" ve="2">
<code>203</code>
<pri>0</pri>
</Event>
</Profile>
<Project sr="proj0">
<cdate>1381110247781</cdate>
<name>Home Assistant</name>
<pids>3,25,26,5</pids>
<scenes>Variable Query,Home Assistant Start</scenes>
<tids>20,19,9,24,4,8,22,10,30,31,16,6,15,35,13,23,14,11,12,7,28,32,29</tids>
<Kid sr="Kid">
<launchID>12</launchID>
<pkg>nl.paulus.homeassistant</pkg>
<vnme>1.2</vnme>
<vnum>16</vnum>
</Kid>
<Img sr="icon" ve="2">
<nme>cust_animal_penguin</nme>
</Img>
</Project>
<Scene sr="sceneHome Assistant Start">
<cdate>1381113309678</cdate>
<edate>1381162068611</edate>
<heightLand>-1</heightLand>
<heightPort>688</heightPort>
<nme>Home Assistant Start</nme>
<widthLand>-1</widthLand>
<widthPort>523</widthPort>
<TextElement sr="elements0" ve="2">
<flags>4</flags>
<geom>0,17,523,107,-1,-1,-1,-1</geom>
<Str sr="arg0" ve="3">TextTitle</Str>
<Str sr="arg1" ve="3">Home Assistant</Str>
<Int sr="arg2" val="33"/>
<Int sr="arg3" val="100"/>
<Str sr="arg4" ve="3">#FFFFFFFF</Str>
<Int sr="arg5" val="0"/>
<Int sr="arg6" val="0"/>
<Int sr="arg7" val="0"/>
</TextElement>
<ListElement sr="elements1">
<flags>4</flags>
<geom>23,136,477,514,-1,-1,-1,-1</geom>
<itemclickTask>13</itemclickTask>
<Str sr="arg0" ve="3">Menu1</Str>
<Int sr="arg1" val="0"/>
<Str sr="arg2" ve="3"/>
<Int sr="arg3" val="0"/>
<Scene sr="arg4">
<Scene sr="val">
<cdate>1381113396824</cdate>
<edate>1381113396824</edate>
<heightLand>-1</heightLand>
<heightPort>100</heightPort>
<nme>Builtin Item Layout</nme>
<widthLand>-1</widthLand>
<widthPort>440</widthPort>
<ImageElement sr="elements0">
<flags>5</flags>
<geom>340,10,90,80,-1,-1,-1,-1</geom>
<Str sr="arg0" ve="3">Icon</Str>
<Img sr="arg1" ve="2">
<nme>hd_aaa_ext_tiles_small</nme>
</Img>
<Int sr="arg2" val="255"/>
</ImageElement>
<TextElement sr="elements1" ve="2">
<flags>5</flags>
<geom>60,10,270,80,-1,-1,-1,-1</geom>
<Str sr="arg0" ve="3">Label</Str>
<Str sr="arg1" ve="3"/>
<Int sr="arg2" val="18"/>
<Int sr="arg3"/>
<Str sr="arg4" ve="3">#FFFFFFFF</Str>
<Int sr="arg5" val="3"/>
<Int sr="arg6"/>
<Int sr="arg7"/>
</TextElement>
<TextElement sr="elements2" ve="2">
<flags>1</flags>
<geom>10,10,40,80,-1,-1,-1,-1</geom>
<Str sr="arg0" ve="3">Index</Str>
<Str sr="arg1" ve="3">1.</Str>
<Int sr="arg2" val="18"/>
<Int sr="arg3"/>
<Str sr="arg4" ve="3">#FFFFFFFF</Str>
<Int sr="arg5" val="3"/>
<Int sr="arg6"/>
<Int sr="arg7"/>
</TextElement>
<PropertiesElement sr="props">
<Int sr="arg0" val="1"/>
<Int sr="arg1" val="0"/>
<Str sr="arg2" ve="3">#00000000</Str>
<Int sr="arg3" val="0"/>
<Str sr="arg4" ve="3">Builtin Item Layout</Str>
<Str sr="arg5" ve="3"/>
<Img sr="arg6" ve="2"/>
<Str sr="arg7" ve="3"/>
</PropertiesElement>
</Scene>
</Scene>
<Int sr="arg5" val="1"/>
<Int sr="arg6" val="1"/>
<RectElement sr="background">
<flags>4</flags>
<geom>-1,-1,-1,-1,-1,-1,-1,-1</geom>
<Str sr="arg0" ve="3"/>
<Int sr="arg1" val="0"/>
<Str sr="arg2" ve="3">#77333333</Str>
<Str sr="arg3" ve="3">#77333333</Str>
<Int sr="arg4" val="0"/>
<Str sr="arg5" ve="3">#FF000000</Str>
<Int sr="arg6" val="0"/>
<Int sr="arg7" val="0"/>
</RectElement>
<ListElementItem sr="item0">
<label>Light On</label>
<Action sr="action" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">Light On</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icon" ve="2">
<nme>hd_aaa_ext_sun</nme>
</Img>
</ListElementItem>
<ListElementItem sr="item1">
<label>Light Off</label>
<Action sr="action" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">Light Off</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icon" ve="2">
<nme>hd_device_access_bightness_low</nme>
</Img>
</ListElementItem>
<ListElementItem sr="item2">
<label>Start Fireplace</label>
<Action sr="action" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">Start Fireplace</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icon" ve="2">
<nme>hd_aaa_ext_coffee</nme>
</Img>
</ListElementItem>
<ListElementItem sr="item3">
<label>Start Epic Sax</label>
<Action sr="action" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">Start Epic Sax</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icon" ve="2">
<nme>hd_aaa_ext_guitar</nme>
</Img>
</ListElementItem>
<ListElementItem sr="item4">
<label>Settings</label>
<Action sr="action" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">Setup</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icon" ve="2">
<nme>hd_action_settings</nme>
</Img>
</ListElementItem>
</ListElement>
<PropertiesElement sr="props">
<Int sr="arg0" val="1"/>
<Int sr="arg1" val="0"/>
<Str sr="arg2" ve="3">#DA000000</Str>
<Int sr="arg3" val="0"/>
<Str sr="arg4" ve="3">Home Assistant Start</Str>
<Str sr="arg5" ve="3"/>
<Img sr="arg6" ve="2"/>
<Str sr="arg7" ve="3"/>
</PropertiesElement>
</Scene>
<Scene sr="sceneVariable Query">
<cdate>1381112175910</cdate>
<edate>1381112254701</edate>
<heightLand>-1</heightLand>
<heightPort>380</heightPort>
<nme>Variable Query</nme>
<widthLand>-1</widthLand>
<widthPort>440</widthPort>
<TextElement sr="elements0" ve="2">
<flags>4</flags>
<geom>8,0,432,96,8,0,432,96</geom>
<Str sr="arg0" ve="3">Title</Str>
<Str sr="arg1" ve="3">Title</Str>
<Int sr="arg2" val="32"/>
<Int sr="arg3"/>
<Str sr="arg4" ve="3">#FF0099CC</Str>
<Int sr="arg5" val="3"/>
<Int sr="arg6"/>
<Int sr="arg7"/>
</TextElement>
<RectElement sr="elements1">
<flags>5</flags>
<geom>0,96,440,4,-1,-1,-1,-1</geom>
<Str sr="arg0" ve="3">Header</Str>
<Int sr="arg1" val="0"/>
<Str sr="arg2" ve="3">#77333333</Str>
<Str sr="arg3" ve="3">#77333333</Str>
<Int sr="arg4" val="0"/>
<Str sr="arg5" ve="3">#FF000000</Str>
<Int sr="arg6" val="0"/>
<Int sr="arg7" val="0"/>
</RectElement>
<EditTextElement sr="elements2">
<flags>13</flags>
<geom>20,156,400,96,-1,-1,-1,-1</geom>
<Str sr="arg0" ve="3">TextEdit1</Str>
<Str sr="arg1" ve="3"/>
<Int sr="arg2" val="16"/>
<Int sr="arg3" val="100"/>
<Str sr="arg4" ve="3">#FFFFFFFF</Str>
<Int sr="arg5" val="0"/>
<Int sr="arg6" val="0"/>
<Int sr="arg7" val="1000"/>
</EditTextElement>
<RectElement sr="elements3">
<flags>5</flags>
<geom>0,300,440,4,-1,-1,-1,-1</geom>
<Str sr="arg0" ve="3">Footer</Str>
<Int sr="arg1" val="0"/>
<Str sr="arg2" ve="3">#77333333</Str>
<Str sr="arg3" ve="3">#77333333</Str>
<Int sr="arg4" val="0"/>
<Str sr="arg5" ve="3">#FF000000</Str>
<Int sr="arg6" val="0"/>
<Int sr="arg7" val="0"/>
</RectElement>
<ImageElement sr="elements4">
<clickTask>-936</clickTask>
<flags>4</flags>
<geom>70,300,80,80,-1,-1,-1,-1</geom>
<Str sr="arg0" ve="3">Accept</Str>
<Img sr="arg1" ve="2">
<nme>hd_navigation_accept</nme>
</Img>
<Int sr="arg2" val="255"/>
</ImageElement>
<ImageElement sr="elements5">
<clickTask>-936</clickTask>
<flags>4</flags>
<geom>290,300,80,80,-1,-1,-1,-1</geom>
<Str sr="arg0" ve="3">Cancel</Str>
<Img sr="arg1" ve="2">
<nme>hd_content_remove</nme>
</Img>
<Int sr="arg2" val="255"/>
</ImageElement>
<PropertiesElement sr="props">
<Int sr="arg0" val="1"/>
<Int sr="arg1" val="0"/>
<Str sr="arg2" ve="3">#FF000000</Str>
<Int sr="arg3" val="0"/>
<Str sr="arg4" ve="3">Variable Query</Str>
<Str sr="arg5" ve="3"/>
<Img sr="arg6" ve="2"/>
<Str sr="arg7" ve="3"/>
</PropertiesElement>
</Scene>
<Task sr="task10">
<cdate>1380613530339</cdate>
<edate>1383030846230</edate>
<id>10</id>
<nme>Charging AC</nme>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">_Update Charging</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">ac</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
</Task>
<Task sr="task11">
<cdate>1381110672417</cdate>
<edate>1384035370683</edate>
<id>11</id>
<nme>Open Debug Interface</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>104</code>
<Str sr="arg0" ve="3">http://%HA_HOST:%HA_PORT/?api_password=%HA_API_PASSWORD</Str>
</Action>
</Task>
<Task sr="task12">
<cdate>1381113015963</cdate>
<edate>1384219718372</edate>
<id>12</id>
<nme>Start Screen</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>47</code>
<Str sr="arg0" ve="3">Home Assistant Start</Str>
<Int sr="arg1" val="5"/>
<Int sr="arg2" val="100"/>
<Int sr="arg3" val="100"/>
<Int sr="arg4" val="1"/>
<Int sr="arg5" val="0"/>
<Int sr="arg6" val="0"/>
</Action>
<Action sr="act1" ve="3">
<code>49</code>
<Str sr="arg0" ve="3">Home Assistant Start</Str>
</Action>
<Img sr="icn" ve="2">
<nme>cust_animal_penguin</nme>
</Img>
</Task>
<Task sr="task13">
<cdate>1381114398467</cdate>
<edate>1381114398467</edate>
<id>13</id>
<pri>11</pri>
<Action sr="act0" ve="3">
<code>49</code>
<lhs>%tap_label</lhs>
<op>2</op>
<rhs>Settings</rhs>
<Str sr="arg0" ve="3">Home Assistant Start</Str>
</Action>
</Task>
<Task sr="task14">
<cdate>1381114829583</cdate>
<edate>1385537340259</edate>
<id>14</id>
<nme>API Fire Event</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>116</code>
<Str sr="arg0" ve="3">%HA_HOST:%HA_PORT</Str>
<Str sr="arg1" ve="3">/api/events/%par1</Str>
<Str sr="arg2" ve="3">api_password=%HA_API_PASSWORD</Str>
<Str sr="arg3" ve="3"/>
<Int sr="arg4" val="10"/>
<Str sr="arg5" ve="3"/>
<Str sr="arg6" ve="3"/>
</Action>
<Action sr="act1" ve="3">
<code>548</code>
<Str sr="arg0" ve="3">Fired event %par1</Str>
<Int sr="arg1" val="0"/>
</Action>
</Task>
<Task sr="task15">
<cdate>1380262442154</cdate>
<edate>1386787405570</edate>
<id>15</id>
<nme>Light On</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">API Call Service</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">light/turn_on</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icn" ve="2">
<nme>hd_aaa_ext_sun</nme>
</Img>
</Task>
<Task sr="task16">
<cdate>1380262442154</cdate>
<edate>1385172575157</edate>
<id>16</id>
<nme>Start Epic Sax</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">API Call Service</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">chromecast/start_epic_sax</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icn" ve="2">
<nme>hd_aaa_ext_guitar</nme>
</Img>
</Task>
<Task sr="task19">
<cdate>1380262442154</cdate>
<edate>1386695312804</edate>
<id>19</id>
<nme>Update Battery</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>547</code>
<label>Make sure charging var exist</label>
<lhs>%HA_CHARGING</lhs>
<op>10</op>
<rhs></rhs>
<Str sr="arg0" ve="3">%HA_CHARGING</Str>
<Str sr="arg1" ve="3">none</Str>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
</Action>
<Action sr="act1" ve="3">
<code>116</code>
<Str sr="arg0" ve="3">%HA_HOST:%HA_PORT</Str>
<Str sr="arg1" ve="3">/api/states/devices.%HA_DEVICE_NAME.charging</Str>
<Str sr="arg2" ve="3">api_password=%HA_API_PASSWORD
new_state=%HA_CHARGING
attributes={"battery":%BATT}</Str>
<Str sr="arg3" ve="3"/>
<Int sr="arg4" val="10"/>
<Str sr="arg5" ve="3"/>
<Str sr="arg6" ve="3"/>
</Action>
</Task>
<Task sr="task20">
<cdate>1380613530339</cdate>
<edate>1386695398714</edate>
<id>20</id>
<nme>Charging None</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">_Update Charging</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">none</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
</Task>
<Task sr="task22">
<cdate>1380613530339</cdate>
<edate>1383030909347</edate>
<id>22</id>
<nme>Charging Wireless</nme>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">_Update Charging</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">wireless</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
</Task>
<Task sr="task23">
<cdate>1380613530339</cdate>
<edate>1383030849758</edate>
<id>23</id>
<nme>Charging USB</nme>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">_Update Charging</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">usb</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
</Task>
<Task sr="task24">
<cdate>1381114829583</cdate>
<edate>1385537314797</edate>
<id>24</id>
<nme>API Call Service</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>116</code>
<Str sr="arg0" ve="3">%HA_HOST:%HA_PORT</Str>
<Str sr="arg1" ve="3">/api/services/%par1</Str>
<Str sr="arg2" ve="3">api_password=%HA_API_PASSWORD</Str>
<Str sr="arg3" ve="3"/>
<Int sr="arg4" val="10"/>
<Str sr="arg5" ve="3"/>
<Str sr="arg6" ve="3"/>
</Action>
<Action sr="act1" ve="3">
<code>548</code>
<Str sr="arg0" ve="3">Called service %par1</Str>
<Int sr="arg1" val="0"/>
</Action>
</Task>
<Task sr="task28">
<cdate>1384035383644</cdate>
<edate>1385172806993</edate>
<id>28</id>
<nme>Volume Down</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">API Call Service</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">keyboard/volume_down</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icn" ve="2">
<nme>hl_images_rotate_left</nme>
</Img>
</Task>
<Task sr="task29">
<cdate>1384035383644</cdate>
<edate>1385172552470</edate>
<id>29</id>
<nme>Play Pause</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">API Call Service</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">keyboard/media_play_pause</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icn" ve="2">
<nme>hl_av_pause</nme>
</Img>
</Task>
<Task sr="task30">
<cdate>1384035383644</cdate>
<edate>1385172803463</edate>
<id>30</id>
<nme>Volume Mute Toggle</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">API Call Service</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">keyboard/volume_mute</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icn" ve="2">
<nme>hl_device_access_volume_muted</nme>
</Img>
</Task>
<Task sr="task31">
<cdate>1384035383644</cdate>
<edate>1385172559562</edate>
<id>31</id>
<nme>Next Track</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">API Call Service</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">keyboard/media_next_track</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icn" ve="2">
<nme>hl_av_next</nme>
</Img>
</Task>
<Task sr="task32">
<cdate>1384035383644</cdate>
<edate>1385172567948</edate>
<id>32</id>
<nme>Prev Track</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">API Call Service</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">keyboard/media_prev_track</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icn" ve="2">
<nme>hl_av_previous</nme>
</Img>
</Task>
<Task sr="task35">
<cdate>1381114829583</cdate>
<edate>1385537324133</edate>
<id>35</id>
<nme>API Call Service With Data</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>116</code>
<Str sr="arg0" ve="3">%HA_HOST:%HA_PORT</Str>
<Str sr="arg1" ve="3">/api/services/%par1</Str>
<Str sr="arg2" ve="3">api_password=%HA_API_PASSWORD
service_data=%par2</Str>
<Str sr="arg3" ve="3"/>
<Int sr="arg4" val="10"/>
<Str sr="arg5" ve="3"/>
<Str sr="arg6" ve="3"/>
</Action>
<Action sr="act1" ve="3">
<code>548</code>
<Str sr="arg0" ve="3">Called service %par1</Str>
<Int sr="arg1" val="0"/>
</Action>
</Task>
<Task sr="task4">
<cdate>1380262442154</cdate>
<edate>1386787393520</edate>
<id>4</id>
<nme>Light Off</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">API Call Service</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">light/turn_off</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icn" ve="2">
<nme>hl_device_access_bightness_low</nme>
</Img>
</Task>
<Task sr="task6">
<cdate>1380522560890</cdate>
<edate>1383958813434</edate>
<id>6</id>
<nme>Setup</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>118</code>
<lhs>%HA_HOST</lhs>
<op>10</op>
<rhs></rhs>
<Str sr="arg0" ve="3">icanhazip.com</Str>
<Str sr="arg1" ve="3"/>
<Str sr="arg2" ve="3"/>
<Str sr="arg3" ve="3"/>
<Int sr="arg4" val="10"/>
<Str sr="arg5" ve="3"/>
<Str sr="arg6" ve="3">%HA_HOST</Str>
</Action>
<Action sr="act1" ve="3">
<code>547</code>
<lhs>%HA_HOST</lhs>
<op>10</op>
<rhs></rhs>
<Str sr="arg0" ve="3">%HA_HOST</Str>
<Str sr="arg1" ve="3">%HTTPD</Str>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
</Action>
<Action sr="act2" ve="3">
<code>547</code>
<lhs>%HA_PORT</lhs>
<op>10</op>
<rhs></rhs>
<Str sr="arg0" ve="3">%HA_PORT</Str>
<Str sr="arg1" ve="3">8123</Str>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
</Action>
<Action sr="act3" ve="3">
<code>547</code>
<lhs>%HA_API_PASSWORD</lhs>
<op>10</op>
<rhs></rhs>
<Str sr="arg0" ve="3">%HA_API_PASSWORD</Str>
<Str sr="arg1" ve="3">My password</Str>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
</Action>
<Action sr="act4" ve="3">
<code>547</code>
<lhs>%HA_DEVICE_NAME</lhs>
<op>10</op>
<rhs></rhs>
<Str sr="arg0" ve="3">%HA_DEVICE_NAME</Str>
<Str sr="arg1" ve="3">%DEVMOD</Str>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
</Action>
<Action sr="act5" ve="3">
<code>595</code>
<Str sr="arg0" ve="3">Host</Str>
<Str sr="arg1" ve="3">%HA_HOST</Str>
<Int sr="arg2" val="0"/>
<Str sr="arg3" ve="3">%HA_HOST</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3">Variable Query</Str>
<Int sr="arg6" val="40"/>
<Int sr="arg7" val="1"/>
</Action>
<Action sr="act6" ve="3">
<code>595</code>
<Str sr="arg0" ve="3">Port</Str>
<Str sr="arg1" ve="3">%HA_PORT</Str>
<Int sr="arg2" val="4"/>
<Str sr="arg3" ve="3">%HA_PORT</Str>
<Str sr="arg4" ve="3">%HA_PORT</Str>
<Str sr="arg5" ve="3">Variable Query</Str>
<Int sr="arg6" val="40"/>
<Int sr="arg7" val="1"/>
</Action>
<Action sr="act7" ve="3">
<code>595</code>
<Str sr="arg0" ve="3">API Password</Str>
<Str sr="arg1" ve="3">%HA_API_PASSWORD</Str>
<Int sr="arg2" val="0"/>
<Str sr="arg3" ve="3">%HA_API_PASSWORD</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3">Variable Query</Str>
<Int sr="arg6" val="40"/>
<Int sr="arg7" val="1"/>
</Action>
<Action sr="act8" ve="3">
<code>595</code>
<label>Ask device name</label>
<Str sr="arg0" ve="3">Device name</Str>
<Str sr="arg1" ve="3">%HA_DEVICE_NAME</Str>
<Int sr="arg2" val="0"/>
<Str sr="arg3" ve="3">%HA_DEVICE_NAME</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3">Variable Query</Str>
<Int sr="arg6" val="40"/>
<Int sr="arg7" val="1"/>
</Action>
<Img sr="icn" ve="2">
<nme>hd_ab_action_settings</nme>
</Img>
</Task>
<Task sr="task7">
<cdate>1384035383644</cdate>
<edate>1386787431769</edate>
<id>7</id>
<nme>Volume Up</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">API Call Service</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">keyboard/volume_up</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icn" ve="2">
<nme>hl_images_rotate_right</nme>
</Img>
</Task>
<Task sr="task8">
<cdate>1380262442154</cdate>
<edate>1386695263222</edate>
<id>8</id>
<nme>_Update Charging</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>547</code>
<Str sr="arg0" ve="3">%HA_CHARGING</Str>
<Str sr="arg1" ve="3">%par1</Str>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
</Action>
<Action sr="act1" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">Update Battery</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
</Task>
<Task sr="task9">
<cdate>1380262442154</cdate>
<edate>1386787379497</edate>
<id>9</id>
<nme>Start Fireplace</nme>
<pri>10</pri>
<Action sr="act0" ve="3">
<code>130</code>
<Str sr="arg0" ve="3">API Call Service</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="5"/>
<Str sr="arg3" ve="3">chromecast/start_fireplace</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3"/>
</Action>
<Img sr="icn" ve="2">
<nme>hd_aaa_ext_coffee</nme>
</Img>
</Task>
</TaskerData>

View File

@@ -0,0 +1,200 @@
homeassistant:
# Omitted values in this section will be auto detected using freegeoip.net
# Location required to calculate the time the sun rises and sets.
# Cooridinates are also used for location for weather related components.
# Google Maps can be used to determine more precise GPS cooridinates.
latitude: 32.87336
longitude: 117.22743
# C for Celcius, F for Fahrenheit
temperature_unit: C
# Pick yours from here:
# http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
time_zone: America/Los_Angeles
# Name of the location where Home Assistant is running
name: Home
http:
api_password: mypass
# Set to 1 to enable development mode
# development: 1
light:
# platform: hue
wink:
# Get your token at https://winkbearertoken.appspot.com
access_token: 'YOUR_TOKEN'
device_tracker:
# The following types are available: ddwrt, netgear, tomato, luci,
# and nmap_tracker
platform: netgear
host: 192.168.1.1
username: admin
password: PASSWORD
# http_id is needed for Tomato routers only
# http_id: ABCDEFGHH
# For nmap_tracker, only the IP addresses to scan are needed:
# hosts: 192.168.1.1/24 # netmask prefix notation or
# hosts: 192.168.1.1-255 # address range
chromecast:
switch:
platform: wemo
thermostat:
platform: nest
# Required: username and password that are used to login to the Nest thermostat.
username: myemail@mydomain.com
password: mypassword
downloader:
download_dir: downloads
notify:
platform: pushbullet
api_key: ABCDEFGHJKLMNOPQRSTUVXYZ
device_sun_light_trigger:
# Optional: specify a specific light/group of lights that has to be turned on
light_group: group.living_room
# Optional: specify which light profile to use when turning lights on
light_profile: relax
# Optional: disable lights being turned off when everybody leaves the house
# disable_turn_off: 1
# A comma separated list of states that have to be tracked as a single group
# Grouped states should share the same type of states (ON/OFF or HOME/NOT_HOME)
# You can also have groups within groups.
group:
Home:
- group.living_room
- group.kitchen
living_room:
- light.Bowl
- light.Ceiling
- light.TV_back_light
kitchen:
- light.fan_bulb_1
- light.fan_bulb_2
children:
- device_tracker.child_1
- device_tracker.child_2
process:
# items are which processes to look for: <entity_id>: <search string within ps>
xbmc: XBMC.App
example:
simple_alarm:
# Which light/light group has to flash when a known device comes home
known_light: light.Bowl
# Which light/light group has to flash red when light turns on while no one home
unknown_light: group.living_room
browser:
keyboard:
automation:
- alias: 'Rule 1 Light on in the evening'
trigger:
- platform: sun
event: sunset
offset: "-01:00:00"
- platform: state
entity_id: group.all_devices
state: home
condition:
- platform: state
entity_id: group.all_devices
state: home
- platform: time
after: "16:00:00"
before: "23:00:00"
action:
service: homeassistant.turn_on
entity_id: group.living_room
- alias: 'Rule 2 - Away Mode'
trigger:
- platform: state
entity_id: group.all_devices
state: 'not_home'
condition: use_trigger_values
action:
service: light.turn_off
entity_id: group.all_lights
# Sensors need to be added into the configuration.yaml as sensor:, sensor 2:, sensor 3:, etc.
# Each sensor label should be unique or your sensors might not load correctly.
sensor:
platform: systemmonitor
resources:
- type: 'disk_use_percent'
arg: '/'
- type: 'disk_use_percent'
arg: '/home'
- type: 'disk_use'
arg: '/home'
- type: 'disk_free'
arg: '/'
- type: 'memory_use_percent'
- type: 'memory_use'
- type: 'memory_free'
- type: 'processor_use'
- type: 'process'
arg: 'octave-cli'
sensor 2:
platform: forecast
api_key: <register on Forecast.io for your PRIVATE API>
monitored_conditions:
- summary
- precip_type
- precip_intensity
- temperature
- dew_point
- wind_speed
- wind_bearing
- cloud_cover
- humidity
- pressure
- visibility
- ozone
script:
# Turns on the bedroom lights and then the living room lights 1 minute later
wakeup:
alias: Wake Up
sequence:
# alias is optional
- alias: Bedroom lights on
execute_service: light.turn_on
service_data:
entity_id: group.bedroom
- delay:
# supports seconds, milliseconds, minutes, hours, etc.
minutes: 1
- alias: Living room lights on
execute_service: light.turn_on
service_data:
entity_id: group.living_room
scene:
- name: Romantic
entities:
light.tv_back_light: on
light.ceiling:
state: on
xy_color: [0.33, 0.66]
brightness: 200

View File

@@ -0,0 +1,148 @@
"""
custom_components.example
~~~~~~~~~~~~~~~~~~~~~~~~~
Example component to target an entity_id to:
- turn it on at 7AM in the morning
- turn it on if anyone comes home and it is off
- turn it off if all lights are turned off
- turn it off if all people leave the house
- offer a service to turn it on for 10 seconds
Configuration:
To use the Example custom component you will need to add the following to
your configuration.yaml file.
example:
target: TARGET_ENTITY
Variable:
target
*Required
TARGET_ENTITY should be one of your devices that can be turned on and off,
ie a light or a switch. Example value could be light.Ceiling or switch.AC
(if you have these devices with those names).
"""
import time
import logging
from homeassistant.const import STATE_HOME, STATE_NOT_HOME, STATE_ON, STATE_OFF
from homeassistant.helpers import validate_config
from homeassistant.helpers.event_decorators import \
track_state_change, track_time_change
from homeassistant.helpers.service import service
import homeassistant.components as core
from homeassistant.components import device_tracker
from homeassistant.components import light
# The domain of your component. Should be equal to the name of your component
DOMAIN = "example"
# List of component names (string) your component depends upon
# We depend on group because group will be loaded after all the components that
# initialize devices have been setup.
DEPENDENCIES = ['group', 'device_tracker', 'light']
# Configuration key for the entity id we are targetting
CONF_TARGET = 'target'
# Variable for storing configuration parameters
TARGET_ID = None
# Name of the service that we expose
SERVICE_FLASH = 'flash'
# Shortcut for the logger
_LOGGER = logging.getLogger(__name__)
def setup(hass, config):
""" Setup example component. """
global TARGET_ID
# Validate that all required config options are given
if not validate_config(config, {DOMAIN: [CONF_TARGET]}, _LOGGER):
return False
TARGET_ID = config[DOMAIN][CONF_TARGET]
# Validate that the target entity id exists
if hass.states.get(TARGET_ID) is None:
_LOGGER.error("Target entity id %s does not exist",
TARGET_ID)
# Tell the bootstrapper that we failed to initialize and clear the
# stored target id so our functions don't run.
TARGET_ID = None
return False
# Tell the bootstrapper that we initialized successfully
return True
@track_state_change(device_tracker.ENTITY_ID_ALL_DEVICES)
def track_devices(hass, entity_id, old_state, new_state):
""" Called when the group.all devices change state. """
# If the target id is not set, return
if not TARGET_ID:
return
# If anyone comes home and the entity is not on, turn it on.
if new_state.state == STATE_HOME and not core.is_on(hass, TARGET_ID):
core.turn_on(hass, TARGET_ID)
# If all people leave the house and the entity is on, turn it off
elif new_state.state == STATE_NOT_HOME and core.is_on(hass, TARGET_ID):
core.turn_off(hass, TARGET_ID)
@track_time_change(hour=7, minute=0, second=0)
def wake_up(hass, now):
"""
Turn it on in the morning (7 AM) if there are people home and
it is not already on.
"""
if not TARGET_ID:
return
if device_tracker.is_on(hass) and not core.is_on(hass, TARGET_ID):
_LOGGER.info('People home at 7AM, turning it on')
core.turn_on(hass, TARGET_ID)
@track_state_change(light.ENTITY_ID_ALL_LIGHTS, STATE_ON, STATE_OFF)
def all_lights_off(hass, entity_id, old_state, new_state):
""" If all lights turn off, turn off. """
if not TARGET_ID:
return
if core.is_on(hass, TARGET_ID):
_LOGGER.info('All lights have been turned off, turning it off')
core.turn_off(hass, TARGET_ID)
@service(DOMAIN, SERVICE_FLASH)
def flash_service(hass, call):
"""
Service that will turn the target off for 10 seconds if on and vice versa.
"""
if not TARGET_ID:
return
if core.is_on(hass, TARGET_ID):
core.turn_off(hass, TARGET_ID)
time.sleep(10)
core.turn_on(hass, TARGET_ID)
else:
core.turn_on(hass, TARGET_ID)
time.sleep(10)
core.turn_off(hass, TARGET_ID)

View File

@@ -0,0 +1,28 @@
"""
custom_components.hello_world
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Implements the bare minimum that a component should implement.
Configuration:
To use the hello_word component you will need to add the following to your
configuration.yaml file.
hello_world:
"""
# The domain of your component. Should be equal to the name of your component
DOMAIN = "hello_world"
# List of component names (string) your component depends upon
DEPENDENCIES = []
def setup(hass, config):
""" Setup our skeleton component. """
# States are in the format DOMAIN.OBJECT_ID
hass.states.set('hello_world.Hello_World', 'Works!')
# return boolean to indicate that initialization was successful
return True

View File

@@ -0,0 +1,59 @@
"""
custom_components.mqtt_example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Shows how to communicate with MQTT. Follows a topic on MQTT and updates the
state of an entity to the last message received on that topic.
Also offers a service 'set_state' that will publish a message on the topic that
will be passed via MQTT to our message received listener. Call the service with
example payload {"new_state": "some new state"}.
Configuration:
To use the mqtt_example component you will need to add the following to your
configuration.yaml file.
mqtt_example:
topic: home-assistant/mqtt_example
"""
import homeassistant.loader as loader
# The domain of your component. Should be equal to the name of your component
DOMAIN = "mqtt_example"
# List of component names (string) your component depends upon
DEPENDENCIES = ['mqtt']
CONF_TOPIC = 'topic'
DEFAULT_TOPIC = 'home-assistant/mqtt_example'
def setup(hass, config):
""" Setup our mqtt_example component. """
mqtt = loader.get_component('mqtt')
topic = config[DOMAIN].get('topic', DEFAULT_TOPIC)
entity_id = 'mqtt_example.last_message'
# Listen to a message on MQTT
def message_received(topic, payload, qos):
""" A new MQTT message has been received. """
hass.states.set(entity_id, payload)
mqtt.subscribe(hass, topic, message_received)
hass.states.set(entity_id, 'No messages')
# Service to publish a message on MQTT
def set_state_service(call):
""" Service to send a message. """
mqtt.publish(hass, topic, call.data.get('new_state'))
# Register our service with Home Assistant
hass.services.register(DOMAIN, 'set_state', set_state_service)
# return boolean to indicate that initialization was successful
return True

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 453 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

BIN
docs/screenshots.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

View File

@@ -1,39 +0,0 @@
[common]
latitude=32.87336
longitude=-117.22743
[httpinterface]
api_password=mypass
[light.hue]
host=192.168.1.2
[device_tracker.tomato]
host=192.168.1.1
username=admin
password=PASSWORD
http_id=aaaaaaaaaaaaaaa
[device_tracker.netgear]
host=192.168.1.1
username=admin
password=PASSWORD
[chromecast]
[wemo]
[downloader]
download_dir=downloads
[device_sun_light_trigger]
# Example how you can specify a specific group that has to be turned on
# light_group=group.living_room
# Example how you can specify which light profile to use when turning lights on
# light_profile=relax
# A comma seperated list of states that have to be tracked
# As a single group
[group]
living_room=light.Bowl,light.Ceiling,light.TV_back_light
bedroom=light.Bed_light

View File

@@ -1,577 +0,0 @@
"""
homeassistant
~~~~~~~~~~~~~
Home Assistant is a Home Automation framework for observing the state
of entities and react to changes.
"""
import time
import logging
import threading
import datetime as dt
import functools as ft
import homeassistant.util as util
MATCH_ALL = '*'
DOMAIN = "homeassistant"
SERVICE_HOMEASSISTANT_STOP = "stop"
EVENT_HOMEASSISTANT_START = "homeassistant_start"
EVENT_STATE_CHANGED = "state_changed"
EVENT_TIME_CHANGED = "time_changed"
TIMER_INTERVAL = 10 # seconds
# We want to be able to fire every time a minute starts (seconds=0).
# We want this so other modules can use that to make sure they fire
# every minute.
assert 60 % TIMER_INTERVAL == 0, "60 % TIMER_INTERVAL should be 0!"
BUS_NUM_THREAD = 4
BUS_REPORT_BUSY_TIMEOUT = dt.timedelta(minutes=1)
PRIO_SERVICE_DEFAULT = 1
PRIO_EVENT_STATE = 2
PRIO_EVENT_TIME = 3
PRIO_EVENT_DEFAULT = 4
def start_home_assistant(bus):
""" Start home assistant. """
request_shutdown = threading.Event()
bus.register_service(DOMAIN, SERVICE_HOMEASSISTANT_STOP,
lambda service: request_shutdown.set())
Timer(bus)
bus.fire_event(EVENT_HOMEASSISTANT_START)
while not request_shutdown.isSet():
try:
time.sleep(1)
except KeyboardInterrupt:
break
def _process_match_param(parameter):
""" Wraps parameter in a list if it is not one and returns it. """
if not parameter:
return MATCH_ALL
elif isinstance(parameter, list):
return parameter
else:
return [parameter]
def _matcher(subject, pattern):
""" Returns True if subject matches the pattern.
Pattern is either a list of allowed subjects or a `MATCH_ALL`.
"""
return MATCH_ALL == pattern or subject in pattern
def track_state_change(bus, entity_id, action, from_state=None, to_state=None):
""" Helper method to track specific state changes. """
from_state = _process_match_param(from_state)
to_state = _process_match_param(to_state)
@ft.wraps(action)
def state_listener(event):
""" State change listener that listens for specific state changes. """
if entity_id == event.data['entity_id'] and \
_matcher(event.data['old_state'].state, from_state) and \
_matcher(event.data['new_state'].state, to_state):
action(event.data['entity_id'],
event.data['old_state'],
event.data['new_state'])
bus.listen_event(EVENT_STATE_CHANGED, state_listener)
def track_point_in_time(bus, action, point_in_time):
""" Adds a listener that will fire once after a spefic point in time. """
@ft.wraps(action)
def point_in_time_listener(event):
""" Listens for matching time_changed events. """
now = event.data['now']
if now > point_in_time and not hasattr(point_in_time_listener, 'run'):
# Set variable so that we will never run twice.
# Because the event bus might have to wait till a thread comes
# available to execute this listener it might occur that the
# listener gets lined up twice to be executed. This will make sure
# the second time it does nothing.
point_in_time_listener.run = True
bus.remove_event_listener(EVENT_TIME_CHANGED,
point_in_time_listener)
action(now)
bus.listen_event(EVENT_TIME_CHANGED, point_in_time_listener)
# pylint: disable=too-many-arguments
def track_time_change(bus, action,
year=None, month=None, day=None,
hour=None, minute=None, second=None):
""" Adds a listener that will fire if time matches a pattern. """
# We do not have to wrap the function with time pattern matching logic if
# no pattern given
if any((val is not None for val in
(year, month, day, hour, minute, second))):
pmp = _process_match_param
year, month, day = pmp(year), pmp(month), pmp(day)
hour, minute, second = pmp(hour), pmp(minute), pmp(second)
@ft.wraps(action)
def time_listener(event):
""" Listens for matching time_changed events. """
now = event.data['now']
mat = _matcher
if mat(now.year, year) and \
mat(now.month, month) and \
mat(now.day, day) and \
mat(now.hour, hour) and \
mat(now.minute, minute) and \
mat(now.second, second):
action(now)
else:
@ft.wraps(action)
def time_listener(event):
""" Fires every time event that comes in. """
action(event.data['now'])
bus.listen_event(EVENT_TIME_CHANGED, time_listener)
def create_bus_job_handler(logger):
""" Creates a job handler that logs errors to supplied `logger`. """
def job_handler(job):
""" Called whenever a job is available to do. """
try:
func, arg = job
func(arg)
except Exception: # pylint: disable=broad-except
# Catch any exception our service/event_listener might throw
# We do not want to crash our ThreadPool
logger.exception(u"BusHandler:Exception doing job")
return job_handler
# pylint: disable=too-few-public-methods
class ServiceCall(object):
""" Represents a call to a service. """
__slots__ = ['domain', 'service', 'data']
def __init__(self, domain, service, data=None):
self.domain = domain
self.service = service
self.data = data or {}
def __repr__(self):
if self.data:
return u"<ServiceCall {}.{}: {}>".format(
self.domain, self.service, util.repr_helper(self.data))
else:
return u"<ServiceCall {}.{}>".format(self.domain, self.service)
# pylint: disable=too-few-public-methods
class Event(object):
""" Represents an event within the Bus. """
__slots__ = ['event_type', 'data']
def __init__(self, event_type, data=None):
self.event_type = event_type
self.data = data or {}
def __repr__(self):
if self.data:
return u"<Event {}: {}>".format(
self.event_type, util.repr_helper(self.data))
else:
return u"<Event {}>".format(self.event_type)
class Bus(object):
""" Class that allows different components to communicate via services
and events.
"""
# pylint: disable=too-many-instance-attributes
def __init__(self, thread_count=None):
self.thread_count = thread_count or BUS_NUM_THREAD
self._event_listeners = {}
self._services = {}
self.logger = logging.getLogger(__name__)
self.event_lock = threading.Lock()
self.service_lock = threading.Lock()
self.last_busy_notice = dt.datetime.now()
self.pool = util.ThreadPool(self.thread_count,
create_bus_job_handler(self.logger))
@property
def services(self):
""" Dict with per domain a list of available services. """
with self.service_lock:
return {domain: self._services[domain].keys()
for domain in self._services}
@property
def event_listeners(self):
""" Dict with events that is being listened for and the number
of listeners.
"""
with self.event_lock:
return {key: len(self._event_listeners[key])
for key in self._event_listeners}
def has_service(self, domain, service):
""" Returns True if specified service exists. """
try:
return service in self._services[domain]
except KeyError: # if key 'domain' does not exist
return False
def call_service(self, domain, service, service_data=None):
""" Calls a service. """
service_call = ServiceCall(domain, service, service_data)
with self.service_lock:
try:
self.pool.add_job(PRIO_SERVICE_DEFAULT,
(self._services[domain][service],
service_call))
self._check_busy()
except KeyError: # if key domain or service does not exist
raise ServiceDoesNotExistError(
u"Service does not exist: {}/{}".format(domain, service))
def register_service(self, domain, service, service_func):
""" Register a service. """
with self.service_lock:
try:
self._services[domain][service] = service_func
except KeyError: # Domain does not exist yet in self._services
self._services[domain] = {service: service_func}
def fire_event(self, event_type, event_data=None):
""" Fire an event. """
with self.event_lock:
# Copy the list of the current listeners because some listeners
# remove themselves as a listener while being executed which
# causes the iterator to be confused.
get = self._event_listeners.get
listeners = get(MATCH_ALL, []) + get(event_type, [])
event = Event(event_type, event_data)
self.logger.info(u"Bus:Handling {}".format(event))
if not listeners:
return
if event_type == EVENT_TIME_CHANGED:
prio = PRIO_EVENT_TIME
elif event_type == EVENT_STATE_CHANGED:
prio = PRIO_EVENT_STATE
else:
prio = PRIO_EVENT_DEFAULT
for func in listeners:
self.pool.add_job(prio, (func, event))
self._check_busy()
def listen_event(self, event_type, listener):
""" Listen for all events or events of a specific type.
To listen to all events specify the constant ``MATCH_ALL``
as event_type.
"""
with self.event_lock:
try:
self._event_listeners[event_type].append(listener)
except KeyError: # event_type did not exist
self._event_listeners[event_type] = [listener]
def listen_once_event(self, event_type, listener):
""" Listen once for event of a specific type.
To listen to all events specify the constant ``MATCH_ALL``
as event_type.
Note: at the moment it is impossible to remove a one time listener.
"""
@ft.wraps(listener)
def onetime_listener(event):
""" Removes listener from eventbus and then fires listener. """
if not hasattr(onetime_listener, 'run'):
# Set variable so that we will never run twice.
# Because the event bus might have to wait till a thread comes
# available to execute this listener it might occur that the
# listener gets lined up twice to be executed.
# This will make sure the second time it does nothing.
onetime_listener.run = True
self.remove_event_listener(event_type, onetime_listener)
listener(event)
self.listen_event(event_type, onetime_listener)
def remove_event_listener(self, event_type, listener):
""" Removes a listener of a specific event_type. """
with self.event_lock:
try:
self._event_listeners[event_type].remove(listener)
# delete event_type list if empty
if not self._event_listeners[event_type]:
self._event_listeners.pop(event_type)
except (KeyError, AttributeError):
# KeyError is key event_type listener did not exist
# AttributeError if listener did not exist within event_type
pass
def _check_busy(self):
""" Complain if we have more than twice as many jobs queued as threads
and if we didn't complain about it recently. """
if self.pool.queue.qsize() / self.thread_count >= 2 and \
dt.datetime.now()-self.last_busy_notice > BUS_REPORT_BUSY_TIMEOUT:
self.last_busy_notice = dt.datetime.now()
log_error = self.logger.error
log_error(
u"Bus:All {} threads are busy and {} jobs pending".format(
self.thread_count, self.pool.queue.qsize()))
jobs = self.pool.current_jobs
for start, job in jobs:
log_error(u"Bus:Current job from {}: {}".format(
util.datetime_to_str(start), job))
class State(object):
""" Object to represent a state within the state machine. """
__slots__ = ['entity_id', 'state', 'attributes', 'last_changed']
def __init__(self, entity_id, state, attributes=None, last_changed=None):
self.entity_id = entity_id
self.state = state
self.attributes = attributes or {}
last_changed = last_changed or dt.datetime.now()
# Strip microsecond from last_changed else we cannot guarantee
# state == State.from_dict(state.as_dict())
# This behavior occurs because to_dict uses datetime_to_str
# which strips microseconds
if last_changed.microsecond:
self.last_changed = last_changed - dt.timedelta(
microseconds=last_changed.microsecond)
else:
self.last_changed = last_changed
def copy(self):
""" Creates a copy of itself. """
return State(self.entity_id, self.state,
dict(self.attributes), self.last_changed)
def as_dict(self):
""" Converts State to a dict to be used within JSON.
Ensures: state == State.from_dict(state.as_dict()) """
return {'entity_id': self.entity_id,
'state': self.state,
'attributes': self.attributes,
'last_changed': util.datetime_to_str(self.last_changed)}
@staticmethod
def from_dict(json_dict):
""" Static method to create a state from a dict.
Ensures: state == State.from_json_dict(state.to_json_dict()) """
try:
last_changed = json_dict.get('last_changed')
if last_changed:
last_changed = util.str_to_datetime(last_changed)
return State(json_dict['entity_id'],
json_dict['state'],
json_dict.get('attributes'),
last_changed)
except KeyError: # if key 'entity_id' or 'state' did not exist
return None
def __repr__(self):
if self.attributes:
return u"<state {}:{} @ {}>".format(
self.state, util.repr_helper(self.attributes),
util.datetime_to_str(self.last_changed))
else:
return u"<state {} @ {}>".format(
self.state, util.datetime_to_str(self.last_changed))
class StateMachine(object):
""" Helper class that tracks the state of different entities. """
def __init__(self, bus):
self.states = {}
self.bus = bus
self.lock = threading.Lock()
@property
def entity_ids(self):
""" List of entitie ids that are being tracked. """
with self.lock:
return self.states.keys()
def remove_entity(self, entity_id):
""" Removes a entity from the state machine.
Returns boolean to indicate if a entity was removed. """
with self.lock:
try:
del self.states[entity_id]
return True
except KeyError:
# if entity does not exist
return False
def set_state(self, entity_id, new_state, attributes=None):
""" Set the state of an entity, add entity if it does not exist.
Attributes is an optional dict to specify attributes of this state. """
attributes = attributes or {}
with self.lock:
# Change state and fire listeners
try:
old_state = self.states[entity_id]
except KeyError:
# If state did not exist yet
self.states[entity_id] = State(entity_id, new_state,
attributes)
else:
if old_state.state != new_state or \
old_state.attributes != attributes:
state = self.states[entity_id] = \
State(entity_id, new_state, attributes)
self.bus.fire_event(EVENT_STATE_CHANGED,
{'entity_id': entity_id,
'old_state': old_state,
'new_state': state})
def get_state(self, entity_id):
""" Returns the state of the specified entity. """
with self.lock:
try:
# Make a copy so people won't mutate the state
return self.states[entity_id].copy()
except KeyError:
# If entity does not exist
return None
def is_state(self, entity_id, state):
""" Returns True if entity exists and is specified state. """
try:
return self.get_state(entity_id).state == state
except AttributeError:
# get_state returned None
return False
class Timer(threading.Thread):
""" Timer will sent out an event every TIMER_INTERVAL seconds. """
def __init__(self, bus):
threading.Thread.__init__(self)
self.daemon = True
self.bus = bus
bus.listen_once_event(EVENT_HOMEASSISTANT_START,
lambda event: self.start())
def run(self):
""" Start the timer. """
logging.getLogger(__name__).info("Timer:starting")
last_fired_on_second = -1
calc_now = dt.datetime.now
while True:
now = calc_now()
# First check checks if we are not on a second matching the
# timer interval. Second check checks if we did not already fire
# this interval.
if now.second % TIMER_INTERVAL or \
now.second == last_fired_on_second:
# Sleep till it is the next time that we have to fire an event.
# Aim for halfway through the second that fits TIMER_INTERVAL.
# If TIMER_INTERVAL is 10 fire at .5, 10.5, 20.5, etc seconds.
# This will yield the best results because time.sleep() is not
# 100% accurate because of non-realtime OS's
slp_seconds = TIMER_INTERVAL - now.second % TIMER_INTERVAL + \
.5 - now.microsecond/1000000.0
time.sleep(slp_seconds)
now = calc_now()
last_fired_on_second = now.second
self.bus.fire_event(EVENT_TIME_CHANGED,
{'now': now})
class HomeAssistantError(Exception):
""" General Home Assistant exception occured. """
class ServiceDoesNotExistError(HomeAssistantError):
""" A service has been referenced that deos not exist. """

335
homeassistant/__main__.py Normal file
View File

@@ -0,0 +1,335 @@
""" Starts home assistant. """
from __future__ import print_function
from multiprocessing import Process
import signal
import sys
import threading
import os
import argparse
import time
from homeassistant import bootstrap
import homeassistant.config as config_util
from homeassistant.const import (__version__, EVENT_HOMEASSISTANT_START,
RESTART_EXIT_CODE)
def validate_python():
""" Validate we're running the right Python version. """
major, minor = sys.version_info[:2]
if major < 3 or (major == 3 and minor < 4):
print("Home Assistant requires atleast Python 3.4")
sys.exit(1)
def ensure_config_path(config_dir):
""" Validates configuration directory. """
lib_dir = os.path.join(config_dir, 'lib')
# Test if configuration directory exists
if not os.path.isdir(config_dir):
if config_dir != config_util.get_default_config_dir():
print(('Fatal Error: Specified configuration directory does '
'not exist {} ').format(config_dir))
sys.exit(1)
try:
os.mkdir(config_dir)
except OSError:
print(('Fatal Error: Unable to create default configuration '
'directory {} ').format(config_dir))
sys.exit(1)
# Test if library directory exists
if not os.path.isdir(lib_dir):
try:
os.mkdir(lib_dir)
except OSError:
print(('Fatal Error: Unable to create library '
'directory {} ').format(lib_dir))
sys.exit(1)
def ensure_config_file(config_dir):
""" Ensure configuration file exists. """
config_path = config_util.ensure_config_exists(config_dir)
if config_path is None:
print('Error getting configuration path')
sys.exit(1)
return config_path
def get_arguments():
""" Get parsed passed in arguments. """
parser = argparse.ArgumentParser(
description="Home Assistant: Observe, Control, Automate.")
parser.add_argument('--version', action='version', version=__version__)
parser.add_argument(
'-c', '--config',
metavar='path_to_config_dir',
default=config_util.get_default_config_dir(),
help="Directory that contains the Home Assistant configuration")
parser.add_argument(
'--demo-mode',
action='store_true',
help='Start Home Assistant in demo mode')
parser.add_argument(
'--debug',
action='store_true',
help='Start Home Assistant in debug mode. Runs in single process to '
'enable use of interactive debuggers.')
parser.add_argument(
'--open-ui',
action='store_true',
help='Open the webinterface in a browser')
parser.add_argument(
'--skip-pip',
action='store_true',
help='Skips pip install of required packages on startup')
parser.add_argument(
'-v', '--verbose',
action='store_true',
help="Enable verbose logging to file.")
parser.add_argument(
'--pid-file',
metavar='path_to_pid_file',
default=None,
help='Path to PID file useful for running as daemon')
parser.add_argument(
'--log-rotate-days',
type=int,
default=None,
help='Enables daily log rotation and keeps up to the specified days')
parser.add_argument(
'--install-osx',
action='store_true',
help='Installs as a service on OS X and loads on boot.')
parser.add_argument(
'--uninstall-osx',
action='store_true',
help='Uninstalls from OS X.')
parser.add_argument(
'--restart-osx',
action='store_true',
help='Restarts on OS X.')
if os.name != "nt":
parser.add_argument(
'--daemon',
action='store_true',
help='Run Home Assistant as daemon')
arguments = parser.parse_args()
if os.name == "nt":
arguments.daemon = False
return arguments
def daemonize():
""" Move current process to daemon process """
# create first fork
pid = os.fork()
if pid > 0:
sys.exit(0)
# decouple fork
os.setsid()
os.umask(0)
# create second fork
pid = os.fork()
if pid > 0:
sys.exit(0)
def check_pid(pid_file):
""" Check that HA is not already running """
# check pid file
try:
pid = int(open(pid_file, 'r').readline())
except IOError:
# PID File does not exist
return
try:
os.kill(pid, 0)
except OSError:
# PID does not exist
return
print('Fatal Error: HomeAssistant is already running.')
sys.exit(1)
def write_pid(pid_file):
""" Create PID File """
pid = os.getpid()
try:
open(pid_file, 'w').write(str(pid))
except IOError:
print('Fatal Error: Unable to write pid file {}'.format(pid_file))
sys.exit(1)
def install_osx():
""" Setup to run via launchd on OS X """
with os.popen('which hass') as inp:
hass_path = inp.read().strip()
with os.popen('whoami') as inp:
user = inp.read().strip()
cwd = os.path.dirname(__file__)
template_path = os.path.join(cwd, 'startup', 'launchd.plist')
with open(template_path, 'r', encoding='utf-8') as inp:
plist = inp.read()
plist = plist.replace("$HASS_PATH$", hass_path)
plist = plist.replace("$USER$", user)
path = os.path.expanduser("~/Library/LaunchAgents/org.homeassistant.plist")
try:
with open(path, 'w', encoding='utf-8') as outp:
outp.write(plist)
except IOError as err:
print('Unable to write to ' + path, err)
return
os.popen('launchctl load -w -F ' + path)
print("Home Assistant has been installed. \
Open it here: http://localhost:8123")
def uninstall_osx():
""" Unload from launchd on OS X """
path = os.path.expanduser("~/Library/LaunchAgents/org.homeassistant.plist")
os.popen('launchctl unload ' + path)
print("Home Assistant has been uninstalled.")
def setup_and_run_hass(config_dir, args, top_process=False):
"""
Setup HASS and run. Block until stopped. Will assume it is running in a
subprocess unless top_process is set to true.
"""
if args.demo_mode:
config = {
'frontend': {},
'demo': {}
}
hass = bootstrap.from_config_dict(
config, config_dir=config_dir, daemon=args.daemon,
verbose=args.verbose, skip_pip=args.skip_pip,
log_rotate_days=args.log_rotate_days)
else:
config_file = ensure_config_file(config_dir)
print('Config directory:', config_dir)
hass = bootstrap.from_config_file(
config_file, daemon=args.daemon, verbose=args.verbose,
skip_pip=args.skip_pip, log_rotate_days=args.log_rotate_days)
if args.open_ui:
def open_browser(event):
""" Open the webinterface in a browser. """
if hass.config.api is not None:
import webbrowser
webbrowser.open(hass.config.api.base_url)
hass.bus.listen_once(EVENT_HOMEASSISTANT_START, open_browser)
hass.start()
exit_code = int(hass.block_till_stopped())
if not top_process:
sys.exit(exit_code)
return exit_code
def run_hass_process(hass_proc):
""" Runs a child hass process. Returns True if it should be restarted. """
requested_stop = threading.Event()
hass_proc.daemon = True
def request_stop(*args):
""" request hass stop, *args is for signal handler callback """
requested_stop.set()
hass_proc.terminate()
try:
signal.signal(signal.SIGTERM, request_stop)
except ValueError:
print('Could not bind to SIGTERM. Are you running in a thread?')
hass_proc.start()
try:
hass_proc.join()
except KeyboardInterrupt:
request_stop()
try:
hass_proc.join()
except KeyboardInterrupt:
return False
return (not requested_stop.isSet() and
hass_proc.exitcode == RESTART_EXIT_CODE,
hass_proc.exitcode)
def main():
""" Starts Home Assistant. """
validate_python()
args = get_arguments()
config_dir = os.path.join(os.getcwd(), args.config)
ensure_config_path(config_dir)
# os x launchd functions
if args.install_osx:
install_osx()
return 0
if args.uninstall_osx:
uninstall_osx()
return 0
if args.restart_osx:
uninstall_osx()
# A small delay is needed on some systems to let the unload finish.
time.sleep(0.5)
install_osx()
return 0
# daemon functions
if args.pid_file:
check_pid(args.pid_file)
if args.daemon:
daemonize()
if args.pid_file:
write_pid(args.pid_file)
# Run hass in debug mode if requested
if args.debug:
sys.stderr.write('Running in debug mode. '
'Home Assistant will not be able to restart.\n')
exit_code = setup_and_run_hass(config_dir, args, top_process=True)
if exit_code == RESTART_EXIT_CODE:
sys.stderr.write('Home Assistant requested a '
'restart in debug mode.\n')
return exit_code
# Run hass as child process. Restart if necessary.
keep_running = True
while keep_running:
hass_proc = Process(target=setup_and_run_hass, args=(config_dir, args))
keep_running, exit_code = run_hass_process(hass_proc)
return exit_code
if __name__ == "__main__":
sys.exit(main())

View File

@@ -1,199 +1,393 @@
"""
homeassistant.bootstrap
~~~~~~~~~~~~~~~~~~~~~~~
Provides methods to bootstrap a home assistant instance.
Each method will return a tuple (bus, statemachine).
After bootstrapping you can add your own components or
start by calling homeassistant.start_home_assistant(bus)
"""
import importlib
import ConfigParser
from collections import defaultdict
import logging
import logging.handlers
import os
import shutil
import sys
import homeassistant as ha
import homeassistant.components as components
import homeassistant.core as core
import homeassistant.util.dt as date_util
import homeassistant.util.package as pkg_util
import homeassistant.util.location as loc_util
import homeassistant.config as config_util
import homeassistant.loader as loader
import homeassistant.components as core_components
import homeassistant.components.group as group
from homeassistant.helpers import event_decorators, service
from homeassistant.helpers.entity import Entity
from homeassistant.const import (
__version__, EVENT_COMPONENT_LOADED, CONF_LATITUDE, CONF_LONGITUDE,
CONF_TEMPERATURE_UNIT, CONF_NAME, CONF_TIME_ZONE, CONF_CUSTOMIZE,
TEMP_CELCIUS, TEMP_FAHRENHEIT)
_LOGGER = logging.getLogger(__name__)
ATTR_COMPONENT = 'component'
PLATFORM_FORMAT = '{}.{}'
ERROR_LOG_FILENAME = 'home-assistant.log'
# pylint: disable=too-many-branches,too-many-locals,too-many-statements
def from_config_file(config_path):
""" Starts home assistant with all possible functionality
based on a config file. """
def setup_component(hass, domain, config=None):
""" Setup a component and all its dependencies. """
# Setup the logging for home assistant.
logging.basicConfig(level=logging.INFO)
if domain in hass.config.components:
return True
# Log errors to a file
err_handler = logging.FileHandler("home-assistant.log",
mode='w', delay=True)
err_handler.setLevel(logging.ERROR)
err_handler.setFormatter(
logging.Formatter('%(asctime)s %(name)s: %(message)s',
datefmt='%H:%M %d-%m-%y'))
logging.getLogger('').addHandler(err_handler)
_ensure_loader_prepared(hass)
# Start the actual bootstrapping
logger = logging.getLogger(__name__)
if config is None:
config = defaultdict(dict)
statusses = []
components = loader.load_order_component(domain)
# Read config
config = ConfigParser.SafeConfigParser()
config.read(config_path)
# OrderedSet is empty if component or dependencies could not be resolved
if not components:
return False
# Init core
bus = ha.Bus()
statemachine = ha.StateMachine(bus)
for component in components:
if not _setup_component(hass, component, config):
return False
has_opt = config.has_option
get_opt = config.get
has_section = config.has_section
add_status = lambda name, result: statusses.append((name, result))
load_module = lambda module: importlib.import_module(
'homeassistant.components.'+module)
return True
def get_opt_safe(section, option, default=None):
""" Failure proof option retriever. """
try:
return config.get(section, option)
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
return default
# Device scanner
dev_scan = None
def _handle_requirements(hass, component, name):
""" Installs requirements for component. """
if hass.config.skip_pip or not hasattr(component, 'REQUIREMENTS'):
return True
for req in component.REQUIREMENTS:
if not pkg_util.install_package(req, target=hass.config.path('lib')):
_LOGGER.error('Not initializing %s because could not install '
'dependency %s', name, req)
return False
return True
def _setup_component(hass, domain, config):
""" Setup a component for Home Assistant. """
if domain in hass.config.components:
return True
component = loader.get_component(domain)
missing_deps = [dep for dep in getattr(component, 'DEPENDENCIES', [])
if dep not in hass.config.components]
if missing_deps:
_LOGGER.error(
'Not initializing %s because not all dependencies loaded: %s',
domain, ", ".join(missing_deps))
return False
if not _handle_requirements(hass, component, domain):
return False
try:
# For the error message if not all option fields exist
opt_fields = "host, username, password"
if not component.setup(hass, config):
_LOGGER.error('component %s failed to initialize', domain)
return False
except Exception: # pylint: disable=broad-except
_LOGGER.exception('Error during setup of component %s', domain)
return False
if has_section('device_tracker.tomato'):
device_tracker = load_module('device_tracker')
hass.config.components.append(component.DOMAIN)
dev_scan_name = "Tomato"
opt_fields += ", http_id"
# Assumption: if a component does not depend on groups
# it communicates with devices
if group.DOMAIN not in getattr(component, 'DEPENDENCIES', []):
hass.pool.add_worker()
dev_scan = device_tracker.TomatoDeviceScanner(
get_opt('device_tracker.tomato', 'host'),
get_opt('device_tracker.tomato', 'username'),
get_opt('device_tracker.tomato', 'password'),
get_opt('device_tracker.tomato', 'http_id'))
hass.bus.fire(
EVENT_COMPONENT_LOADED, {ATTR_COMPONENT: component.DOMAIN})
elif has_section('device_tracker.netgear'):
device_tracker = load_module('device_tracker')
return True
dev_scan_name = "Netgear"
dev_scan = device_tracker.NetgearDeviceScanner(
get_opt('device_tracker.netgear', 'host'),
get_opt('device_tracker.netgear', 'username'),
get_opt('device_tracker.netgear', 'password'))
def prepare_setup_platform(hass, config, domain, platform_name):
""" Loads a platform and makes sure dependencies are setup. """
_ensure_loader_prepared(hass)
except ConfigParser.NoOptionError:
# If one of the options didn't exist
logger.exception(("Error initializing {}DeviceScanner, "
"could not find one of the following config "
"options: {}".format(dev_scan_name, opt_fields)))
platform_path = PLATFORM_FORMAT.format(domain, platform_name)
add_status("Device Scanner - {}".format(dev_scan_name), False)
platform = loader.get_component(platform_path)
if dev_scan:
add_status("Device Scanner - {}".format(dev_scan_name),
dev_scan.success_init)
# Not found
if platform is None:
_LOGGER.error('Unable to find platform %s', platform_path)
return None
if not dev_scan.success_init:
dev_scan = None
# Already loaded
elif platform_path in hass.config.components:
return platform
# Device Tracker
if dev_scan:
device_tracker.DeviceTracker(bus, statemachine, dev_scan)
# Load dependencies
for component in getattr(platform, 'DEPENDENCIES', []):
if not setup_component(hass, component, config):
_LOGGER.error(
'Unable to prepare setup for platform %s because '
'dependency %s could not be initialized', platform_path,
component)
return None
add_status("Device Tracker", True)
if not _handle_requirements(hass, platform, platform_path):
return None
# Sun tracker
if has_opt("common", "latitude") and \
has_opt("common", "longitude"):
return platform
sun = load_module('sun')
add_status("Weather - Ephem",
sun.setup(
bus, statemachine,
get_opt("common", "latitude"),
get_opt("common", "longitude")))
def mount_local_lib_path(config_dir):
""" Add local library to Python Path """
sys.path.insert(0, os.path.join(config_dir, 'lib'))
# pylint: disable=too-many-branches, too-many-statements, too-many-arguments
def from_config_dict(config, hass=None, config_dir=None, enable_log=True,
verbose=False, daemon=False, skip_pip=False,
log_rotate_days=None):
"""
Tries to configure Home Assistant from a config dict.
Dynamically loads required components and its dependencies.
"""
if hass is None:
hass = core.HomeAssistant()
if config_dir is not None:
config_dir = os.path.abspath(config_dir)
hass.config.config_dir = config_dir
mount_local_lib_path(config_dir)
process_ha_config_upgrade(hass)
process_ha_core_config(hass, config.get(core.DOMAIN, {}))
if enable_log:
enable_logging(hass, verbose, daemon, log_rotate_days)
hass.config.skip_pip = skip_pip
if skip_pip:
_LOGGER.warning('Skipping pip installation of required modules. '
'This may cause issues.')
_ensure_loader_prepared(hass)
# Make a copy because we are mutating it.
# Convert it to defaultdict so components can always have config dict
# Convert values to dictionaries if they are None
config = defaultdict(
dict, {key: value or {} for key, value in config.items()})
# Filter out the repeating and common config section [homeassistant]
components = set(key.split(' ')[0] for key in config.keys()
if key != core.DOMAIN)
if not core_components.setup(hass, config):
_LOGGER.error('Home Assistant core failed to initialize. '
'Further initialization aborted.')
return hass
_LOGGER.info('Home Assistant core initialized')
# give event decorators access to HASS
event_decorators.HASS = hass
service.HASS = hass
# Setup the components
for domain in loader.load_order_components(components):
_setup_component(hass, domain, config)
return hass
def from_config_file(config_path, hass=None, verbose=False, daemon=False,
skip_pip=True, log_rotate_days=None):
"""
Reads the configuration file and tries to start all the required
functionality. Will add functionality to 'hass' parameter if given,
instantiates a new Home Assistant object if 'hass' is not given.
"""
if hass is None:
hass = core.HomeAssistant()
# Set config dir to directory holding config file
config_dir = os.path.abspath(os.path.dirname(config_path))
hass.config.config_dir = config_dir
mount_local_lib_path(config_dir)
enable_logging(hass, verbose, daemon, log_rotate_days)
config_dict = config_util.load_yaml_config_file(config_path)
return from_config_dict(config_dict, hass, enable_log=False,
skip_pip=skip_pip)
def enable_logging(hass, verbose=False, daemon=False, log_rotate_days=None):
""" Setup the logging for home assistant. """
if not daemon:
logging.basicConfig(level=logging.INFO)
fmt = ("%(log_color)s%(asctime)s %(levelname)s (%(threadName)s) "
"[%(name)s] %(message)s%(reset)s")
try:
from colorlog import ColoredFormatter
logging.getLogger().handlers[0].setFormatter(ColoredFormatter(
fmt,
datefmt='%y-%m-%d %H:%M:%S',
reset=True,
log_colors={
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red',
}
))
except ImportError:
_LOGGER.warning(
"Colorlog package not found, console coloring disabled")
# Log errors to a file if we have write access to file or config dir
err_log_path = hass.config.path(ERROR_LOG_FILENAME)
err_path_exists = os.path.isfile(err_log_path)
# Check if we can write to the error log if it exists or that
# we can create files in the containing directory if not.
if (err_path_exists and os.access(err_log_path, os.W_OK)) or \
(not err_path_exists and os.access(hass.config.config_dir, os.W_OK)):
if log_rotate_days:
err_handler = logging.handlers.TimedRotatingFileHandler(
err_log_path, when='midnight', backupCount=log_rotate_days)
else:
err_handler = logging.FileHandler(
err_log_path, mode='w', delay=True)
err_handler.setLevel(logging.INFO if verbose else logging.WARNING)
err_handler.setFormatter(
logging.Formatter('%(asctime)s %(name)s: %(message)s',
datefmt='%y-%m-%d %H:%M:%S'))
logger = logging.getLogger('')
logger.addHandler(err_handler)
logger.setLevel(logging.INFO)
else:
sun = None
_LOGGER.error(
'Unable to setup error log %s (access denied)', err_log_path)
# Chromecast
if has_section("chromecast"):
chromecast = load_module('chromecast')
chromecast_started = chromecast.setup(bus, statemachine)
def process_ha_config_upgrade(hass):
""" Upgrade config if necessary. """
version_path = hass.config.path('.HA_VERSION')
add_status("Chromecast", chromecast_started)
else:
chromecast_started = False
try:
with open(version_path, 'rt') as inp:
conf_version = inp.readline().strip()
except FileNotFoundError:
# Last version to not have this file
conf_version = '0.7.7'
# WeMo
if has_section("wemo"):
wemo = load_module('wemo')
if conf_version == __version__:
return
add_status("WeMo", wemo.setup(bus, statemachine))
_LOGGER.info('Upgrading config directory from %s to %s', conf_version,
__version__)
# Light control
if has_section("light.hue"):
light = load_module('light')
lib_path = hass.config.path('lib')
if os.path.isdir(lib_path):
shutil.rmtree(lib_path)
light_control = light.HueLightControl(get_opt_safe("hue", "host"))
with open(version_path, 'wt') as outp:
outp.write(__version__)
add_status("Light - Hue", light_control.success_init)
light.setup(bus, statemachine, light_control)
else:
light_control = None
def process_ha_core_config(hass, config):
""" Processes the [homeassistant] section from the config. """
hac = hass.config
if has_opt("downloader", "download_dir"):
downloader = load_module('downloader')
def set_time_zone(time_zone_str):
""" Helper method to set time zone in HA. """
if time_zone_str is None:
return
add_status("Downloader", downloader.setup(
bus, get_opt("downloader", "download_dir")))
time_zone = date_util.get_time_zone(time_zone_str)
add_status("Core components", components.setup(bus, statemachine))
if time_zone:
hac.time_zone = time_zone
date_util.set_default_time_zone(time_zone)
else:
_LOGGER.error('Received invalid time zone %s', time_zone_str)
if has_section('browser'):
add_status("Browser", load_module('browser').setup(bus))
for key, attr, typ in ((CONF_LATITUDE, 'latitude', float),
(CONF_LONGITUDE, 'longitude', float),
(CONF_NAME, 'location_name', str)):
if key in config:
try:
setattr(hac, attr, typ(config[key]))
except ValueError:
_LOGGER.error('Received invalid %s value for %s: %s',
typ.__name__, key, attr)
if has_section('keyboard'):
add_status("Keyboard", load_module('keyboard').setup(bus))
set_time_zone(config.get(CONF_TIME_ZONE))
# Init HTTP interface
if has_opt("httpinterface", "api_password"):
httpinterface = load_module('httpinterface')
customize = config.get(CONF_CUSTOMIZE)
httpinterface.HTTPInterface(
bus, statemachine,
get_opt("httpinterface", "api_password"))
if isinstance(customize, dict):
for entity_id, attrs in config.get(CONF_CUSTOMIZE, {}).items():
if not isinstance(attrs, dict):
continue
Entity.overwrite_attribute(entity_id, attrs.keys(), attrs.values())
add_status("HTTPInterface", True)
if CONF_TEMPERATURE_UNIT in config:
unit = config[CONF_TEMPERATURE_UNIT]
# Init groups
if has_section("group"):
group = load_module('group')
if unit == 'C':
hac.temperature_unit = TEMP_CELCIUS
elif unit == 'F':
hac.temperature_unit = TEMP_FAHRENHEIT
for name, entity_ids in config.items("group"):
add_status("Group - {}".format(name),
group.setup(bus, statemachine, name,
entity_ids.split(",")))
# If we miss some of the needed values, auto detect them
if None not in (
hac.latitude, hac.longitude, hac.temperature_unit, hac.time_zone):
return
# Light trigger
if light_control and sun:
device_sun_light_trigger = load_module('device_sun_light_trigger')
_LOGGER.info('Auto detecting location and temperature unit')
light_group = get_opt_safe("device_sun_light_trigger", "light_group")
light_profile = get_opt_safe("device_sun_light_trigger",
"light_profile")
info = loc_util.detect_location_info()
add_status("Device Sun Light Trigger",
device_sun_light_trigger.setup(bus, statemachine,
light_group, light_profile))
if info is None:
_LOGGER.error('Could not detect location information')
return
for component, success_init in statusses:
status = "initialized" if success_init else "Failed to initialize"
if hac.latitude is None and hac.longitude is None:
hac.latitude = info.latitude
hac.longitude = info.longitude
logger.info("{}: {}".format(component, status))
if hac.temperature_unit is None:
if info.use_fahrenheit:
hac.temperature_unit = TEMP_FAHRENHEIT
else:
hac.temperature_unit = TEMP_CELCIUS
ha.start_home_assistant(bus)
if hac.location_name is None:
hac.location_name = info.city
if hac.time_zone is None:
set_time_zone(info.time_zone)
def _ensure_loader_prepared(hass):
""" Ensure Home Assistant loader is prepared. """
if not loader.PREPARED:
loader.prepare(hass)

View File

@@ -1,7 +1,6 @@
"""
homeassistant.components
~~~~~~~~~~~~~~~~~~~~~~~~
This package contains components that can be plugged into Home Assistant.
Component design guidelines:
@@ -12,151 +11,108 @@ Each component that tracks states should create state entity names in the
format "<DOMAIN>.<OBJECT_ID>".
Each component should publish services only under its own domain.
"""
import itertools as it
import importlib
import logging
import homeassistant as ha
import homeassistant.util as util
import homeassistant.core as ha
from homeassistant.helpers.entity import split_entity_id
from homeassistant.helpers.service import extract_entity_ids
from homeassistant.loader import get_component
from homeassistant.const import (
ATTR_ENTITY_ID, SERVICE_TURN_ON, SERVICE_TURN_OFF, SERVICE_TOGGLE)
# Contains one string or a list of strings, each being an entity id
ATTR_ENTITY_ID = 'entity_id'
# String with a friendly name for the entity
ATTR_FRIENDLY_NAME = "friendly_name"
STATE_ON = 'on'
STATE_OFF = 'off'
STATE_NOT_HOME = 'not_home'
STATE_HOME = 'home'
SERVICE_TURN_ON = 'turn_on'
SERVICE_TURN_OFF = 'turn_off'
SERVICE_VOLUME_UP = "volume_up"
SERVICE_VOLUME_DOWN = "volume_down"
SERVICE_VOLUME_MUTE = "volume_mute"
SERVICE_MEDIA_PLAY_PAUSE = "media_play_pause"
SERVICE_MEDIA_NEXT_TRACK = "media_next_track"
SERVICE_MEDIA_PREV_TRACK = "media_prev_track"
_LOADED_COMP = {}
_LOGGER = logging.getLogger(__name__)
def _get_component(component):
""" Returns requested component. Imports it if necessary. """
comps = _LOADED_COMP
# See if we have the module locally cached, else import it
try:
return comps[component]
except KeyError:
# If comps[component] does not exist, import module
try:
comps[component] = importlib.import_module(
'homeassistant.components.'+component)
except ImportError:
# If we got a bogus component the input will fail
comps[component] = None
return comps[component]
def is_on(statemachine, entity_id=None):
def is_on(hass, entity_id=None):
""" Loads up the module to call the is_on method.
If there is no entity id given we will check all. """
if entity_id:
group = _get_component('group')
group = get_component('group')
entity_ids = group.expand_entity_ids([entity_id])
entity_ids = group.expand_entity_ids(hass, [entity_id])
else:
entity_ids = statemachine.entity_ids
entity_ids = hass.states.entity_ids()
for entity_id in entity_ids:
domain = util.split_entity_id(entity_id)[0]
domain = split_entity_id(entity_id)[0]
module = _get_component(domain)
module = get_component(domain)
try:
if module.is_on(statemachine, entity_id):
if module.is_on(hass, entity_id):
return True
except AttributeError:
# module is None or method is_on does not exist
pass
_LOGGER.exception("Failed to call %s.is_on for %s",
module, entity_id)
return False
def turn_on(bus, **service_data):
def turn_on(hass, entity_id=None, **service_data):
""" Turns specified entity on if possible. """
bus.call_service(ha.DOMAIN, SERVICE_TURN_ON, service_data)
if entity_id is not None:
service_data[ATTR_ENTITY_ID] = entity_id
hass.services.call(ha.DOMAIN, SERVICE_TURN_ON, service_data)
def turn_off(bus, **service_data):
def turn_off(hass, entity_id=None, **service_data):
""" Turns specified entity off. """
bus.call_service(ha.DOMAIN, SERVICE_TURN_OFF, service_data)
if entity_id is not None:
service_data[ATTR_ENTITY_ID] = entity_id
hass.services.call(ha.DOMAIN, SERVICE_TURN_OFF, service_data)
def extract_entity_ids(statemachine, service):
"""
Helper method to extract a list of entity ids from a service call.
Will convert group entity ids to the entity ids it represents.
"""
entity_ids = []
def toggle(hass, entity_id=None, **service_data):
""" Toggles specified entity. """
if entity_id is not None:
service_data[ATTR_ENTITY_ID] = entity_id
if service.data and ATTR_ENTITY_ID in service.data:
group = _get_component('group')
# Entity ID attr can be a list or a string
service_ent_id = service.data[ATTR_ENTITY_ID]
if isinstance(service_ent_id, list):
ent_ids = service_ent_id
else:
ent_ids = [service_ent_id]
entity_ids.extend(
ent_id for ent_id
in group.expand_entity_ids(statemachine, ent_ids)
if ent_id not in entity_ids)
return entity_ids
hass.services.call(ha.DOMAIN, SERVICE_TOGGLE, service_data)
def setup(bus, statemachine):
def setup(hass, config):
""" Setup general services related to homeassistant. """
def handle_turn_service(service):
""" Method to handle calls to homeassistant.turn_on/off. """
entity_ids = extract_entity_ids(statemachine, service)
entity_ids = extract_entity_ids(hass, service)
# Generic turn on/off method requires entity id
if not entity_ids:
_LOGGER.error(
"homeassistant/%s cannot be called without entity_id",
service.service)
return
# Group entity_ids by domain. groupby requires sorted data.
by_domain = it.groupby(sorted(entity_ids),
lambda item: util.split_entity_id(item)[0])
lambda item: split_entity_id(item)[0])
for domain, ent_ids in by_domain:
# We want to block for all calls and only return when all calls
# have been processed. If a service does not exist it causes a 10
# second delay while we're blocking waiting for a response.
# But services can be registered on other HA instances that are
# listening to the bus too. So as a in between solution, we'll
# block only if the service is defined in the current HA instance.
blocking = hass.services.has_service(domain, service.service)
# Create a new dict for this call
data = dict(service.data)
# ent_ids is a generator, convert it to a list.
data[ATTR_ENTITY_ID] = list(ent_ids)
try:
bus.call_service(domain, service.service, data)
except ha.ServiceDoesNotExistError:
# turn_on service does not exist
pass
hass.services.call(domain, service.service, data, blocking)
bus.register_service(ha.DOMAIN, SERVICE_TURN_OFF, handle_turn_service)
bus.register_service(ha.DOMAIN, SERVICE_TURN_ON, handle_turn_service)
hass.services.register(ha.DOMAIN, SERVICE_TURN_OFF, handle_turn_service)
hass.services.register(ha.DOMAIN, SERVICE_TURN_ON, handle_turn_service)
hass.services.register(ha.DOMAIN, SERVICE_TOGGLE, handle_turn_service)
return True

View File

@@ -0,0 +1,152 @@
"""
homeassistant.components.alarm_control_panel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Component to interface with a alarm control panel.
"""
import logging
import os
from homeassistant.components import verisure
from homeassistant.const import (
ATTR_ENTITY_ID, SERVICE_ALARM_TRIGGER,
SERVICE_ALARM_DISARM, SERVICE_ALARM_ARM_HOME, SERVICE_ALARM_ARM_AWAY)
from homeassistant.config import load_yaml_config_file
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_component import EntityComponent
DOMAIN = 'alarm_control_panel'
SCAN_INTERVAL = 30
ENTITY_ID_FORMAT = DOMAIN + '.{}'
# Maps discovered services to their platforms
DISCOVERY_PLATFORMS = {
verisure.DISCOVER_SENSORS: 'verisure'
}
SERVICE_TO_METHOD = {
SERVICE_ALARM_DISARM: 'alarm_disarm',
SERVICE_ALARM_ARM_HOME: 'alarm_arm_home',
SERVICE_ALARM_ARM_AWAY: 'alarm_arm_away',
SERVICE_ALARM_TRIGGER: 'alarm_trigger'
}
ATTR_CODE = 'code'
ATTR_CODE_FORMAT = 'code_format'
ATTR_TO_PROPERTY = [
ATTR_CODE,
ATTR_CODE_FORMAT
]
def setup(hass, config):
""" Track states and offer events for sensors. """
component = EntityComponent(
logging.getLogger(__name__), DOMAIN, hass, SCAN_INTERVAL,
DISCOVERY_PLATFORMS)
component.setup(config)
def alarm_service_handler(service):
""" Maps services to methods on Alarm. """
target_alarms = component.extract_from_service(service)
if ATTR_CODE not in service.data:
code = None
else:
code = service.data[ATTR_CODE]
method = SERVICE_TO_METHOD[service.service]
for alarm in target_alarms:
getattr(alarm, method)(code)
if alarm.should_poll:
alarm.update_ha_state(True)
descriptions = load_yaml_config_file(
os.path.join(os.path.dirname(__file__), 'services.yaml'))
for service in SERVICE_TO_METHOD:
hass.services.register(DOMAIN, service, alarm_service_handler,
descriptions.get(service))
return True
def alarm_disarm(hass, code=None, entity_id=None):
""" Send the alarm the command for disarm. """
data = {}
if code:
data[ATTR_CODE] = code
if entity_id:
data[ATTR_ENTITY_ID] = entity_id
hass.services.call(DOMAIN, SERVICE_ALARM_DISARM, data)
def alarm_arm_home(hass, code=None, entity_id=None):
""" Send the alarm the command for arm home. """
data = {}
if code:
data[ATTR_CODE] = code
if entity_id:
data[ATTR_ENTITY_ID] = entity_id
hass.services.call(DOMAIN, SERVICE_ALARM_ARM_HOME, data)
def alarm_arm_away(hass, code=None, entity_id=None):
""" Send the alarm the command for arm away. """
data = {}
if code:
data[ATTR_CODE] = code
if entity_id:
data[ATTR_ENTITY_ID] = entity_id
hass.services.call(DOMAIN, SERVICE_ALARM_ARM_AWAY, data)
def alarm_trigger(hass, code=None, entity_id=None):
""" Send the alarm the command for trigger. """
data = {}
if code:
data[ATTR_CODE] = code
if entity_id:
data[ATTR_ENTITY_ID] = entity_id
hass.services.call(DOMAIN, SERVICE_ALARM_TRIGGER, data)
# pylint: disable=no-self-use
class AlarmControlPanel(Entity):
""" ABC for alarm control devices. """
@property
def code_format(self):
""" regex for code format or None if no code is required. """
return None
def alarm_disarm(self, code=None):
""" Send disarm command. """
raise NotImplementedError()
def alarm_arm_home(self, code=None):
""" Send arm home command. """
raise NotImplementedError()
def alarm_arm_away(self, code=None):
""" Send arm away command. """
raise NotImplementedError()
def alarm_trigger(self, code=None):
""" Send alarm trigger command. """
raise NotImplementedError()
@property
def state_attributes(self):
""" Return the state attributes. """
state_attr = {
ATTR_CODE_FORMAT: self.code_format,
}
return state_attr

View File

@@ -0,0 +1,117 @@
"""
homeassistant.components.alarm_control_panel.alarmdotcom
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Interfaces with Verisure alarm control panel.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/alarm_control_panel.alarmdotcom/
"""
import logging
import homeassistant.components.alarm_control_panel as alarm
from homeassistant.const import CONF_USERNAME, CONF_PASSWORD
from homeassistant.const import (
STATE_UNKNOWN,
STATE_ALARM_DISARMED, STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_AWAY)
_LOGGER = logging.getLogger(__name__)
REQUIREMENTS = ['https://github.com/Xorso/pyalarmdotcom'
'/archive/0.0.7.zip'
'#pyalarmdotcom==0.0.7']
DEFAULT_NAME = 'Alarm.com'
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Setup an Alarm.com control panel. """
username = config.get(CONF_USERNAME)
password = config.get(CONF_PASSWORD)
if username is None or password is None:
_LOGGER.error('Must specify username and password!')
return False
add_devices([AlarmDotCom(hass,
config.get('name', DEFAULT_NAME),
config.get('code'),
username,
password)])
# pylint: disable=too-many-arguments, too-many-instance-attributes
# pylint: disable=abstract-method
class AlarmDotCom(alarm.AlarmControlPanel):
""" Represents a Alarm.com status. """
def __init__(self, hass, name, code, username, password):
from pyalarmdotcom.pyalarmdotcom import Alarmdotcom
self._alarm = Alarmdotcom(username, password, timeout=10)
self._hass = hass
self._name = name
self._code = str(code) if code else None
self._username = username
self._password = password
@property
def should_poll(self):
""" No polling needed. """
return True
@property
def name(self):
""" Returns the name of the device. """
return self._name
@property
def code_format(self):
""" One or more characters if code is defined. """
return None if self._code is None else '.+'
@property
def state(self):
""" Returns the state of the device. """
if self._alarm.state == 'Disarmed':
return STATE_ALARM_DISARMED
elif self._alarm.state == 'Armed Stay':
return STATE_ALARM_ARMED_HOME
elif self._alarm.state == 'Armed Away':
return STATE_ALARM_ARMED_AWAY
else:
return STATE_UNKNOWN
def alarm_disarm(self, code=None):
""" Send disarm command. """
if not self._validate_code(code, 'arming home'):
return
from pyalarmdotcom.pyalarmdotcom import Alarmdotcom
# Open another session to alarm.com to fire off the command
_alarm = Alarmdotcom(self._username, self._password, timeout=10)
_alarm.disarm()
def alarm_arm_home(self, code=None):
""" Send arm home command. """
if not self._validate_code(code, 'arming home'):
return
from pyalarmdotcom.pyalarmdotcom import Alarmdotcom
# Open another session to alarm.com to fire off the command
_alarm = Alarmdotcom(self._username, self._password, timeout=10)
_alarm.arm_stay()
def alarm_arm_away(self, code=None):
""" Send arm away command. """
if not self._validate_code(code, 'arming home'):
return
from pyalarmdotcom.pyalarmdotcom import Alarmdotcom
# Open another session to alarm.com to fire off the command
_alarm = Alarmdotcom(self._username, self._password, timeout=10)
_alarm.arm_away()
def _validate_code(self, code, state):
""" Validate given code. """
check = self._code is None or code == self._code
if not check:
_LOGGER.warning('Wrong code entered for %s', state)
return check

View File

@@ -0,0 +1,13 @@
"""
homeassistant.components.alarm_control_panel.demo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo platform that has two fake alarm control panels.
"""
import homeassistant.components.alarm_control_panel.manual as manual
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Sets up the Demo alarm control panels. """
add_devices([
manual.ManualAlarm(hass, 'Alarm', '1234', 5, 10),
])

View File

@@ -0,0 +1,148 @@
"""
homeassistant.components.alarm_control_panel.manual
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Support for manual alarms.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/alarm_control_panel.manual/
"""
import logging
import datetime
import homeassistant.components.alarm_control_panel as alarm
from homeassistant.helpers.event import track_point_in_time
import homeassistant.util.dt as dt_util
from homeassistant.const import (
STATE_ALARM_DISARMED, STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_AWAY,
STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED)
_LOGGER = logging.getLogger(__name__)
DEFAULT_ALARM_NAME = 'HA Alarm'
DEFAULT_PENDING_TIME = 60
DEFAULT_TRIGGER_TIME = 120
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Sets up the manual alarm platform. """
add_devices([ManualAlarm(
hass,
config.get('name', DEFAULT_ALARM_NAME),
config.get('code'),
config.get('pending_time', DEFAULT_PENDING_TIME),
config.get('trigger_time', DEFAULT_TRIGGER_TIME),
)])
# pylint: disable=too-many-arguments, too-many-instance-attributes
# pylint: disable=abstract-method
class ManualAlarm(alarm.AlarmControlPanel):
"""
Represents an alarm status.
When armed, will be pending for 'pending_time', after that armed.
When triggered, will be pending for 'trigger_time'. After that will be
triggered for 'trigger_time', after that we return to disarmed.
"""
def __init__(self, hass, name, code, pending_time, trigger_time):
self._state = STATE_ALARM_DISARMED
self._hass = hass
self._name = name
self._code = str(code) if code else None
self._pending_time = datetime.timedelta(seconds=pending_time)
self._trigger_time = datetime.timedelta(seconds=trigger_time)
self._state_ts = None
@property
def should_poll(self):
""" No polling needed. """
return False
@property
def name(self):
""" Returns the name of the device. """
return self._name
@property
def state(self):
""" Returns the state of the device. """
if self._state in (STATE_ALARM_ARMED_HOME,
STATE_ALARM_ARMED_AWAY) and \
self._pending_time and self._state_ts + self._pending_time > \
dt_util.utcnow():
return STATE_ALARM_PENDING
if self._state == STATE_ALARM_TRIGGERED and self._trigger_time:
if self._state_ts + self._pending_time > dt_util.utcnow():
return STATE_ALARM_PENDING
elif (self._state_ts + self._pending_time +
self._trigger_time) < dt_util.utcnow():
return STATE_ALARM_DISARMED
return self._state
@property
def code_format(self):
""" One or more characters. """
return None if self._code is None else '.+'
def alarm_disarm(self, code=None):
""" Send disarm command. """
if not self._validate_code(code, STATE_ALARM_DISARMED):
return
self._state = STATE_ALARM_DISARMED
self._state_ts = dt_util.utcnow()
self.update_ha_state()
def alarm_arm_home(self, code=None):
""" Send arm home command. """
if not self._validate_code(code, STATE_ALARM_ARMED_HOME):
return
self._state = STATE_ALARM_ARMED_HOME
self._state_ts = dt_util.utcnow()
self.update_ha_state()
if self._pending_time:
track_point_in_time(
self._hass, self.update_ha_state,
self._state_ts + self._pending_time)
def alarm_arm_away(self, code=None):
""" Send arm away command. """
if not self._validate_code(code, STATE_ALARM_ARMED_AWAY):
return
self._state = STATE_ALARM_ARMED_AWAY
self._state_ts = dt_util.utcnow()
self.update_ha_state()
if self._pending_time:
track_point_in_time(
self._hass, self.update_ha_state,
self._state_ts + self._pending_time)
def alarm_trigger(self, code=None):
""" Send alarm trigger command. No code needed. """
self._state = STATE_ALARM_TRIGGERED
self._state_ts = dt_util.utcnow()
self.update_ha_state()
if self._trigger_time:
track_point_in_time(
self._hass, self.update_ha_state,
self._state_ts + self._pending_time)
track_point_in_time(
self._hass, self.update_ha_state,
self._state_ts + self._pending_time + self._trigger_time)
def _validate_code(self, code, state):
""" Validate given code. """
check = self._code is None or code == self._code
if not check:
_LOGGER.warning('Invalid code given for %s', state)
return check

View File

@@ -0,0 +1,127 @@
"""
homeassistant.components.alarm_control_panel.mqtt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This platform enables the possibility to control a MQTT alarm.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/alarm_control_panel.mqtt/
"""
import logging
import homeassistant.components.mqtt as mqtt
import homeassistant.components.alarm_control_panel as alarm
from homeassistant.const import (
STATE_ALARM_DISARMED, STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_AWAY,
STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED, STATE_UNKNOWN)
_LOGGER = logging.getLogger(__name__)
DEFAULT_NAME = "MQTT Alarm"
DEFAULT_QOS = 0
DEFAULT_PAYLOAD_DISARM = "DISARM"
DEFAULT_PAYLOAD_ARM_HOME = "ARM_HOME"
DEFAULT_PAYLOAD_ARM_AWAY = "ARM_AWAY"
DEPENDENCIES = ['mqtt']
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Sets up the MQTT platform. """
if config.get('state_topic') is None:
_LOGGER.error("Missing required variable: state_topic")
return False
if config.get('command_topic') is None:
_LOGGER.error("Missing required variable: command_topic")
return False
add_devices([MqttAlarm(
hass,
config.get('name', DEFAULT_NAME),
config.get('state_topic'),
config.get('command_topic'),
config.get('qos', DEFAULT_QOS),
config.get('payload_disarm', DEFAULT_PAYLOAD_DISARM),
config.get('payload_arm_home', DEFAULT_PAYLOAD_ARM_HOME),
config.get('payload_arm_away', DEFAULT_PAYLOAD_ARM_AWAY),
config.get('code'))])
# pylint: disable=too-many-arguments, too-many-instance-attributes
# pylint: disable=abstract-method
class MqttAlarm(alarm.AlarmControlPanel):
""" represents a MQTT alarm status within home assistant. """
def __init__(self, hass, name, state_topic, command_topic, qos,
payload_disarm, payload_arm_home, payload_arm_away, code):
self._state = STATE_UNKNOWN
self._hass = hass
self._name = name
self._state_topic = state_topic
self._command_topic = command_topic
self._qos = qos
self._payload_disarm = payload_disarm
self._payload_arm_home = payload_arm_home
self._payload_arm_away = payload_arm_away
self._code = str(code) if code else None
def message_received(topic, payload, qos):
""" A new MQTT message has been received. """
if payload not in (STATE_ALARM_DISARMED, STATE_ALARM_ARMED_HOME,
STATE_ALARM_ARMED_AWAY, STATE_ALARM_PENDING,
STATE_ALARM_TRIGGERED):
_LOGGER.warning('Received unexpected payload: %s', payload)
return
self._state = payload
self.update_ha_state()
mqtt.subscribe(hass, self._state_topic, message_received, self._qos)
@property
def should_poll(self):
""" No polling needed """
return False
@property
def name(self):
""" Returns the name of the device. """
return self._name
@property
def state(self):
""" Returns the state of the device. """
return self._state
@property
def code_format(self):
""" One or more characters if code is defined """
return None if self._code is None else '.+'
def alarm_disarm(self, code=None):
""" Send disarm command. """
if not self._validate_code(code, 'disarming'):
return
mqtt.publish(self.hass, self._command_topic,
self._payload_disarm, self._qos)
def alarm_arm_home(self, code=None):
""" Send arm home command. """
if not self._validate_code(code, 'arming home'):
return
mqtt.publish(self.hass, self._command_topic,
self._payload_arm_home, self._qos)
def alarm_arm_away(self, code=None):
""" Send arm away command. """
if not self._validate_code(code, 'arming away'):
return
mqtt.publish(self.hass, self._command_topic,
self._payload_arm_away, self._qos)
def _validate_code(self, code, state):
""" Validate given code. """
check = self._code is None or code == self._code
if not check:
_LOGGER.warning('Wrong code entered for %s', state)
return check

View File

@@ -0,0 +1,105 @@
"""
homeassistant.components.alarm_control_panel.nx584
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Support for NX584 alarm control panels.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/alarm_control_panel.nx584/
"""
import logging
import requests
from homeassistant.const import (STATE_UNKNOWN, STATE_ALARM_DISARMED,
STATE_ALARM_ARMED_HOME,
STATE_ALARM_ARMED_AWAY)
import homeassistant.components.alarm_control_panel as alarm
REQUIREMENTS = ['pynx584==0.1']
_LOGGER = logging.getLogger(__name__)
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Setup nx584. """
host = config.get('host', 'localhost:5007')
try:
add_devices([NX584Alarm(hass, host, config.get('name', 'NX584'))])
except requests.exceptions.ConnectionError as ex:
_LOGGER.error('Unable to connect to NX584: %s', str(ex))
return False
class NX584Alarm(alarm.AlarmControlPanel):
""" NX584-based alarm panel. """
def __init__(self, hass, host, name):
from nx584 import client
self._hass = hass
self._host = host
self._name = name
self._alarm = client.Client('http://%s' % host)
# Do an initial list operation so that we will try to actually
# talk to the API and trigger a requests exception for setup_platform()
# to catch
self._alarm.list_zones()
@property
def should_poll(self):
""" Polling needed. """
return True
@property
def name(self):
""" Returns the name of the device. """
return self._name
@property
def code_format(self):
""" Characters if code is defined. """
return '[0-9]{4}([0-9]{2})?'
@property
def state(self):
""" Returns the state of the device. """
try:
part = self._alarm.list_partitions()[0]
zones = self._alarm.list_zones()
except requests.exceptions.ConnectionError as ex:
_LOGGER.error('Unable to connect to %(host)s: %(reason)s',
dict(host=self._host, reason=ex))
return STATE_UNKNOWN
except IndexError:
_LOGGER.error('nx584 reports no partitions')
return STATE_UNKNOWN
bypassed = False
for zone in zones:
if zone['bypassed']:
_LOGGER.debug('Zone %(zone)s is bypassed, '
'assuming HOME',
dict(zone=zone['number']))
bypassed = True
break
if not part['armed']:
return STATE_ALARM_DISARMED
elif bypassed:
return STATE_ALARM_ARMED_HOME
else:
return STATE_ALARM_ARMED_AWAY
def alarm_disarm(self, code=None):
""" Send disarm command. """
self._alarm.disarm(code)
def alarm_arm_home(self, code=None):
""" Send arm home command. """
self._alarm.arm('home')
def alarm_arm_away(self, code=None):
""" Send arm away command. """
self._alarm.arm('auto')
def alarm_trigger(self, code=None):
""" Alarm trigger command. """
raise NotImplementedError()

View File

@@ -0,0 +1,96 @@
"""
homeassistant.components.alarm_control_panel.verisure
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Interfaces with Verisure alarm control panel.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/verisure/
"""
import logging
import homeassistant.components.verisure as verisure
import homeassistant.components.alarm_control_panel as alarm
from homeassistant.const import (
STATE_UNKNOWN,
STATE_ALARM_DISARMED, STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_AWAY)
_LOGGER = logging.getLogger(__name__)
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Sets up the Verisure platform. """
if not verisure.MY_PAGES:
_LOGGER.error('A connection has not been made to Verisure mypages.')
return False
alarms = []
alarms.extend([
VerisureAlarm(value)
for value in verisure.ALARM_STATUS.values()
if verisure.SHOW_ALARM
])
add_devices(alarms)
# pylint: disable=abstract-method
class VerisureAlarm(alarm.AlarmControlPanel):
""" Represents a Verisure alarm status. """
def __init__(self, alarm_status):
self._id = alarm_status.id
self._state = STATE_UNKNOWN
@property
def name(self):
""" Returns the name of the device. """
return 'Alarm {}'.format(self._id)
@property
def state(self):
""" Returns the state of the device. """
return self._state
@property
def code_format(self):
""" Four digit code required. """
return '^\\d{%s}$' % verisure.CODE_DIGITS
def update(self):
""" Update alarm status """
verisure.update_alarm()
if verisure.ALARM_STATUS[self._id].status == 'unarmed':
self._state = STATE_ALARM_DISARMED
elif verisure.ALARM_STATUS[self._id].status == 'armedhome':
self._state = STATE_ALARM_ARMED_HOME
elif verisure.ALARM_STATUS[self._id].status == 'armed':
self._state = STATE_ALARM_ARMED_AWAY
elif verisure.ALARM_STATUS[self._id].status != 'pending':
_LOGGER.error(
'Unknown alarm state %s',
verisure.ALARM_STATUS[self._id].status)
def alarm_disarm(self, code=None):
""" Send disarm command. """
verisure.MY_PAGES.alarm.set(code, 'DISARMED')
_LOGGER.info('verisure alarm disarming')
verisure.MY_PAGES.alarm.wait_while_pending()
verisure.update_alarm()
def alarm_arm_home(self, code=None):
""" Send arm home command. """
verisure.MY_PAGES.alarm.set(code, 'ARMED_HOME')
_LOGGER.info('verisure alarm arming home')
verisure.MY_PAGES.alarm.wait_while_pending()
verisure.update_alarm()
def alarm_arm_away(self, code=None):
""" Send arm away command. """
verisure.MY_PAGES.alarm.set(code, 'ARMED_AWAY')
_LOGGER.info('verisure alarm arming away')
verisure.MY_PAGES.alarm.wait_while_pending()
verisure.update_alarm()

View File

@@ -0,0 +1,192 @@
"""
components.alexa
~~~~~~~~~~~~~~~~
Component to offer a service end point for an Alexa skill.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/alexa/
"""
import enum
import logging
from homeassistant.const import HTTP_OK, HTTP_UNPROCESSABLE_ENTITY
from homeassistant.util import template
from homeassistant.helpers.service import call_from_config
DOMAIN = 'alexa'
DEPENDENCIES = ['http']
_LOGGER = logging.getLogger(__name__)
_CONFIG = {}
API_ENDPOINT = '/api/alexa'
CONF_INTENTS = 'intents'
CONF_CARD = 'card'
CONF_SPEECH = 'speech'
CONF_ACTION = 'action'
def setup(hass, config):
""" Activate Alexa component. """
_CONFIG.update(config[DOMAIN].get(CONF_INTENTS, {}))
hass.http.register_path('POST', API_ENDPOINT, _handle_alexa, True)
return True
def _handle_alexa(handler, path_match, data):
""" Handle Alexa. """
_LOGGER.debug('Received Alexa request: %s', data)
req = data.get('request')
if req is None:
_LOGGER.error('Received invalid data from Alexa: %s', data)
handler.write_json_message(
"Invalid value received for port", HTTP_UNPROCESSABLE_ENTITY)
return
req_type = req['type']
if req_type == 'SessionEndedRequest':
handler.send_response(HTTP_OK)
handler.end_headers()
return
intent = req.get('intent')
response = AlexaResponse(handler.server.hass, intent)
if req_type == 'LaunchRequest':
response.add_speech(
SpeechType.plaintext,
"Hello, and welcome to the future. How may I help?")
handler.write_json(response.as_dict())
return
if req_type != 'IntentRequest':
_LOGGER.warning('Received unsupported request: %s', req_type)
return
intent_name = intent['name']
config = _CONFIG.get(intent_name)
if config is None:
_LOGGER.warning('Received unknown intent %s', intent_name)
response.add_speech(
SpeechType.plaintext,
"This intent is not yet configured within Home Assistant.")
handler.write_json(response.as_dict())
return
speech = config.get(CONF_SPEECH)
card = config.get(CONF_CARD)
action = config.get(CONF_ACTION)
# pylint: disable=unsubscriptable-object
if speech is not None:
response.add_speech(SpeechType[speech['type']], speech['text'])
if card is not None:
response.add_card(CardType[card['type']], card['title'],
card['content'])
if action is not None:
call_from_config(handler.server.hass, action, True)
handler.write_json(response.as_dict())
class SpeechType(enum.Enum):
""" Alexa speech types. """
plaintext = "PlainText"
ssml = "SSML"
class CardType(enum.Enum):
""" Alexa card types. """
simple = "Simple"
link_account = "LinkAccount"
class AlexaResponse(object):
""" Helps generating the response for Alexa. """
def __init__(self, hass, intent=None):
self.hass = hass
self.speech = None
self.card = None
self.reprompt = None
self.session_attributes = {}
self.should_end_session = True
if intent is not None and 'slots' in intent:
self.variables = {key: value['value'] for key, value
in intent['slots'].items() if 'value' in value}
else:
self.variables = {}
def add_card(self, card_type, title, content):
""" Add a card to the response. """
assert self.card is None
card = {
"type": card_type.value
}
if card_type == CardType.link_account:
self.card = card
return
card["title"] = self._render(title),
card["content"] = self._render(content)
self.card = card
def add_speech(self, speech_type, text):
""" Add speech to the response. """
assert self.speech is None
key = 'ssml' if speech_type == SpeechType.ssml else 'text'
self.speech = {
'type': speech_type.value,
key: self._render(text)
}
def add_reprompt(self, speech_type, text):
""" Add repromopt if user does not answer. """
assert self.reprompt is None
key = 'ssml' if speech_type == SpeechType.ssml else 'text'
self.reprompt = {
'type': speech_type.value,
key: self._render(text)
}
def as_dict(self):
""" Returns response in an Alexa valid dict. """
response = {
'shouldEndSession': self.should_end_session
}
if self.card is not None:
response['card'] = self.card
if self.speech is not None:
response['outputSpeech'] = self.speech
if self.reprompt is not None:
response['reprompt'] = {
'outputSpeech': self.reprompt
}
return {
'version': '1.0',
'sessionAttributes': self.session_attributes,
'response': response,
}
def _render(self, template_string):
""" Render a response, adding data from intent if available. """
return template.render(self.hass, template_string, self.variables)

View File

@@ -0,0 +1,84 @@
"""
homeassistant.components.apcupsd
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sets up and provides access to the status output of APCUPSd via its Network
Information Server (NIS).
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/apcupsd/
"""
import logging
from datetime import timedelta
from homeassistant.util import Throttle
DOMAIN = "apcupsd"
REQUIREMENTS = ("apcaccess==0.0.4",)
CONF_HOST = "host"
CONF_PORT = "port"
CONF_TYPE = "type"
DEFAULT_HOST = "localhost"
DEFAULT_PORT = 3551
KEY_STATUS = "STATUS"
VALUE_ONLINE = "ONLINE"
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60)
DATA = None
_LOGGER = logging.getLogger(__name__)
def setup(hass, config):
""" Use config values to set up a function enabling status retrieval. """
global DATA
host = config[DOMAIN].get(CONF_HOST, DEFAULT_HOST)
port = config[DOMAIN].get(CONF_PORT, DEFAULT_PORT)
DATA = APCUPSdData(host, port)
# It doesn't really matter why we're not able to get the status, just that
# we can't.
# pylint: disable=broad-except
try:
DATA.update(no_throttle=True)
except Exception:
_LOGGER.exception("Failure while testing APCUPSd status retrieval.")
return False
return True
class APCUPSdData(object):
"""
Stores the data retrieved from APCUPSd for each entity to use, acts as the
single point responsible for fetching updates from the server.
"""
def __init__(self, host, port):
from apcaccess import status
self._host = host
self._port = port
self._status = None
self._get = status.get
self._parse = status.parse
@property
def status(self):
""" Get latest update if throttle allows. Return status. """
self.update()
return self._status
def _get_status(self):
""" Get the status from APCUPSd and parse it into a dict. """
return self._parse(self._get(host=self._host, port=self._port))
@Throttle(MIN_TIME_BETWEEN_UPDATES)
def update(self, **kwargs):
"""
Fetch the latest status from APCUPSd and store it in self._status.
"""
self._status = self._get_status()

View File

@@ -0,0 +1,402 @@
"""
homeassistant.components.api
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides a Rest API for Home Assistant.
For more details about the RESTful API, please refer to the documentation at
https://home-assistant.io/developers/api/
"""
import re
import logging
import threading
import json
import homeassistant.core as ha
from homeassistant.exceptions import TemplateError
from homeassistant.helpers.state import TrackStates
import homeassistant.remote as rem
from homeassistant.util import template
from homeassistant.bootstrap import ERROR_LOG_FILENAME
from homeassistant.const import (
URL_API, URL_API_STATES, URL_API_EVENTS, URL_API_SERVICES, URL_API_STREAM,
URL_API_EVENT_FORWARD, URL_API_STATES_ENTITY, URL_API_COMPONENTS,
URL_API_CONFIG, URL_API_BOOTSTRAP, URL_API_ERROR_LOG, URL_API_LOG_OUT,
URL_API_TEMPLATE, EVENT_TIME_CHANGED, EVENT_HOMEASSISTANT_STOP, MATCH_ALL,
HTTP_OK, HTTP_CREATED, HTTP_BAD_REQUEST, HTTP_NOT_FOUND,
HTTP_UNPROCESSABLE_ENTITY, HTTP_HEADER_CONTENT_TYPE,
CONTENT_TYPE_TEXT_PLAIN)
DOMAIN = 'api'
DEPENDENCIES = ['http']
STREAM_PING_PAYLOAD = "ping"
STREAM_PING_INTERVAL = 50 # seconds
_LOGGER = logging.getLogger(__name__)
def setup(hass, config):
""" Register the API with the HTTP interface. """
# /api - for validation purposes
hass.http.register_path('GET', URL_API, _handle_get_api)
# /api/stream
hass.http.register_path('GET', URL_API_STREAM, _handle_get_api_stream)
# /api/config
hass.http.register_path('GET', URL_API_CONFIG, _handle_get_api_config)
# /api/bootstrap
hass.http.register_path(
'GET', URL_API_BOOTSTRAP, _handle_get_api_bootstrap)
# /states
hass.http.register_path('GET', URL_API_STATES, _handle_get_api_states)
hass.http.register_path(
'GET', re.compile(r'/api/states/(?P<entity_id>[a-zA-Z\._0-9]+)'),
_handle_get_api_states_entity)
hass.http.register_path(
'POST', re.compile(r'/api/states/(?P<entity_id>[a-zA-Z\._0-9]+)'),
_handle_post_state_entity)
hass.http.register_path(
'PUT', re.compile(r'/api/states/(?P<entity_id>[a-zA-Z\._0-9]+)'),
_handle_post_state_entity)
# /events
hass.http.register_path('GET', URL_API_EVENTS, _handle_get_api_events)
hass.http.register_path(
'POST', re.compile(r'/api/events/(?P<event_type>[a-zA-Z\._0-9]+)'),
_handle_api_post_events_event)
# /services
hass.http.register_path('GET', URL_API_SERVICES, _handle_get_api_services)
hass.http.register_path(
'POST',
re.compile((r'/api/services/'
r'(?P<domain>[a-zA-Z\._0-9]+)/'
r'(?P<service>[a-zA-Z\._0-9]+)')),
_handle_post_api_services_domain_service)
# /event_forwarding
hass.http.register_path(
'POST', URL_API_EVENT_FORWARD, _handle_post_api_event_forward)
hass.http.register_path(
'DELETE', URL_API_EVENT_FORWARD, _handle_delete_api_event_forward)
# /components
hass.http.register_path(
'GET', URL_API_COMPONENTS, _handle_get_api_components)
hass.http.register_path('GET', URL_API_ERROR_LOG,
_handle_get_api_error_log)
hass.http.register_path('POST', URL_API_LOG_OUT, _handle_post_api_log_out)
hass.http.register_path('POST', URL_API_TEMPLATE,
_handle_post_api_template)
return True
def _handle_get_api(handler, path_match, data):
""" Renders the debug interface. """
handler.write_json_message("API running.")
def _handle_get_api_stream(handler, path_match, data):
""" Provide a streaming interface for the event bus. """
gracefully_closed = False
hass = handler.server.hass
wfile = handler.wfile
write_lock = threading.Lock()
block = threading.Event()
session_id = None
restrict = data.get('restrict')
if restrict:
restrict = restrict.split(',')
def write_message(payload):
""" Writes a message to the output. """
with write_lock:
msg = "data: {}\n\n".format(payload)
try:
wfile.write(msg.encode("UTF-8"))
wfile.flush()
except (IOError, ValueError):
# IOError: socket errors
# ValueError: raised when 'I/O operation on closed file'
block.set()
def forward_events(event):
""" Forwards events to the open request. """
nonlocal gracefully_closed
if block.is_set() or event.event_type == EVENT_TIME_CHANGED:
return
elif event.event_type == EVENT_HOMEASSISTANT_STOP:
gracefully_closed = True
block.set()
return
handler.server.sessions.extend_validation(session_id)
write_message(json.dumps(event, cls=rem.JSONEncoder))
handler.send_response(HTTP_OK)
handler.send_header('Content-type', 'text/event-stream')
session_id = handler.set_session_cookie_header()
handler.end_headers()
if restrict:
for event in restrict:
hass.bus.listen(event, forward_events)
else:
hass.bus.listen(MATCH_ALL, forward_events)
while True:
write_message(STREAM_PING_PAYLOAD)
block.wait(STREAM_PING_INTERVAL)
if block.is_set():
break
if not gracefully_closed:
_LOGGER.info("Found broken event stream to %s, cleaning up",
handler.client_address[0])
if restrict:
for event in restrict:
hass.bus.remove_listener(event, forward_events)
else:
hass.bus.remove_listener(MATCH_ALL, forward_events)
def _handle_get_api_config(handler, path_match, data):
""" Returns the Home Assistant config. """
handler.write_json(handler.server.hass.config.as_dict())
def _handle_get_api_bootstrap(handler, path_match, data):
""" Returns all data needed to bootstrap Home Assistant. """
hass = handler.server.hass
handler.write_json({
'config': hass.config.as_dict(),
'states': hass.states.all(),
'events': _events_json(hass),
'services': _services_json(hass),
})
def _handle_get_api_states(handler, path_match, data):
""" Returns a dict containing all entity ids and their state. """
handler.write_json(handler.server.hass.states.all())
def _handle_get_api_states_entity(handler, path_match, data):
""" Returns the state of a specific entity. """
entity_id = path_match.group('entity_id')
state = handler.server.hass.states.get(entity_id)
if state:
handler.write_json(state)
else:
handler.write_json_message("State does not exist.", HTTP_NOT_FOUND)
def _handle_post_state_entity(handler, path_match, data):
""" Handles updating the state of an entity.
This handles the following paths:
/api/states/<entity_id>
"""
entity_id = path_match.group('entity_id')
try:
new_state = data['state']
except KeyError:
handler.write_json_message("state not specified", HTTP_BAD_REQUEST)
return
attributes = data['attributes'] if 'attributes' in data else None
is_new_state = handler.server.hass.states.get(entity_id) is None
# Write state
handler.server.hass.states.set(entity_id, new_state, attributes)
state = handler.server.hass.states.get(entity_id)
status_code = HTTP_CREATED if is_new_state else HTTP_OK
handler.write_json(
state.as_dict(),
status_code=status_code,
location=URL_API_STATES_ENTITY.format(entity_id))
def _handle_get_api_events(handler, path_match, data):
""" Handles getting overview of event listeners. """
handler.write_json(_events_json(handler.server.hass))
def _handle_api_post_events_event(handler, path_match, event_data):
""" Handles firing of an event.
This handles the following paths:
/api/events/<event_type>
Events from /api are threated as remote events.
"""
event_type = path_match.group('event_type')
if event_data is not None and not isinstance(event_data, dict):
handler.write_json_message(
"event_data should be an object", HTTP_UNPROCESSABLE_ENTITY)
event_origin = ha.EventOrigin.remote
# Special case handling for event STATE_CHANGED
# We will try to convert state dicts back to State objects
if event_type == ha.EVENT_STATE_CHANGED and event_data:
for key in ('old_state', 'new_state'):
state = ha.State.from_dict(event_data.get(key))
if state:
event_data[key] = state
handler.server.hass.bus.fire(event_type, event_data, event_origin)
handler.write_json_message("Event {} fired.".format(event_type))
def _handle_get_api_services(handler, path_match, data):
""" Handles getting overview of services. """
handler.write_json(_services_json(handler.server.hass))
# pylint: disable=invalid-name
def _handle_post_api_services_domain_service(handler, path_match, data):
""" Handles calling a service.
This handles the following paths:
/api/services/<domain>/<service>
"""
domain = path_match.group('domain')
service = path_match.group('service')
with TrackStates(handler.server.hass) as changed_states:
handler.server.hass.services.call(domain, service, data, True)
handler.write_json(changed_states)
# pylint: disable=invalid-name
def _handle_post_api_event_forward(handler, path_match, data):
""" Handles adding an event forwarding target. """
try:
host = data['host']
api_password = data['api_password']
except KeyError:
handler.write_json_message(
"No host or api_password received.", HTTP_BAD_REQUEST)
return
try:
port = int(data['port']) if 'port' in data else None
except ValueError:
handler.write_json_message(
"Invalid value received for port", HTTP_UNPROCESSABLE_ENTITY)
return
api = rem.API(host, api_password, port)
if not api.validate_api():
handler.write_json_message(
"Unable to validate API", HTTP_UNPROCESSABLE_ENTITY)
return
if handler.server.event_forwarder is None:
handler.server.event_forwarder = \
rem.EventForwarder(handler.server.hass)
handler.server.event_forwarder.connect(api)
handler.write_json_message("Event forwarding setup.")
def _handle_delete_api_event_forward(handler, path_match, data):
""" Handles deleting an event forwarding target. """
try:
host = data['host']
except KeyError:
handler.write_json_message("No host received.", HTTP_BAD_REQUEST)
return
try:
port = int(data['port']) if 'port' in data else None
except ValueError:
handler.write_json_message(
"Invalid value received for port", HTTP_UNPROCESSABLE_ENTITY)
return
if handler.server.event_forwarder is not None:
api = rem.API(host, None, port)
handler.server.event_forwarder.disconnect(api)
handler.write_json_message("Event forwarding cancelled.")
def _handle_get_api_components(handler, path_match, data):
""" Returns all the loaded components. """
handler.write_json(handler.server.hass.config.components)
def _handle_get_api_error_log(handler, path_match, data):
""" Returns the logged errors for this session. """
handler.write_file(handler.server.hass.config.path(ERROR_LOG_FILENAME),
False)
def _handle_post_api_log_out(handler, path_match, data):
""" Log user out. """
handler.send_response(HTTP_OK)
handler.destroy_session()
handler.end_headers()
def _handle_post_api_template(handler, path_match, data):
""" Log user out. """
template_string = data.get('template', '')
try:
rendered = template.render(handler.server.hass, template_string)
handler.send_response(HTTP_OK)
handler.send_header(HTTP_HEADER_CONTENT_TYPE, CONTENT_TYPE_TEXT_PLAIN)
handler.end_headers()
handler.wfile.write(rendered.encode('utf-8'))
except TemplateError as e:
handler.write_json_message(str(e), HTTP_UNPROCESSABLE_ENTITY)
return
def _services_json(hass):
""" Generate services data to JSONify. """
return [{"domain": key, "services": value}
for key, value in hass.services.services.items()]
def _events_json(hass):
""" Generate event data to JSONify. """
return [{"event": key, "listener_count": value}
for key, value in hass.bus.listeners.items()]

View File

@@ -0,0 +1,114 @@
"""
components.arduino
~~~~~~~~~~~~~~~~~~
Arduino component that connects to a directly attached Arduino board which
runs with the Firmata firmware.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/arduino/
"""
import logging
from homeassistant.helpers import validate_config
from homeassistant.const import (EVENT_HOMEASSISTANT_START,
EVENT_HOMEASSISTANT_STOP)
DOMAIN = "arduino"
REQUIREMENTS = ['PyMata==2.07a']
BOARD = None
_LOGGER = logging.getLogger(__name__)
def setup(hass, config):
""" Setup the Arduino component. """
if not validate_config(config,
{DOMAIN: ['port']},
_LOGGER):
return False
import serial
global BOARD
try:
BOARD = ArduinoBoard(config[DOMAIN]['port'])
except (serial.serialutil.SerialException, FileNotFoundError):
_LOGGER.exception("Your port is not accessible.")
return False
if BOARD.get_firmata()[1] <= 2:
_LOGGER.error("The StandardFirmata sketch should be 2.2 or newer.")
return False
def stop_arduino(event):
""" Stop the Arduino service. """
BOARD.disconnect()
def start_arduino(event):
""" Start the Arduino service. """
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_arduino)
hass.bus.listen_once(EVENT_HOMEASSISTANT_START, start_arduino)
return True
class ArduinoBoard(object):
""" Represents an Arduino board. """
def __init__(self, port):
from PyMata.pymata import PyMata
self._port = port
self._board = PyMata(self._port, verbose=False)
def set_mode(self, pin, direction, mode):
""" Sets the mode and the direction of a given pin. """
if mode == 'analog' and direction == 'in':
self._board.set_pin_mode(pin,
self._board.INPUT,
self._board.ANALOG)
elif mode == 'analog' and direction == 'out':
self._board.set_pin_mode(pin,
self._board.OUTPUT,
self._board.ANALOG)
elif mode == 'digital' and direction == 'in':
self._board.set_pin_mode(pin,
self._board.OUTPUT,
self._board.DIGITAL)
elif mode == 'digital' and direction == 'out':
self._board.set_pin_mode(pin,
self._board.OUTPUT,
self._board.DIGITAL)
elif mode == 'pwm':
self._board.set_pin_mode(pin,
self._board.OUTPUT,
self._board.PWM)
def get_analog_inputs(self):
""" Get the values from the pins. """
self._board.capability_query()
return self._board.get_analog_response_table()
def set_digital_out_high(self, pin):
""" Sets a given digital pin to high. """
self._board.digital_write(pin, 1)
def set_digital_out_low(self, pin):
""" Sets a given digital pin to low. """
self._board.digital_write(pin, 0)
def get_digital_in(self, pin):
""" Gets the value from a given digital pin. """
self._board.digital_read(pin)
def get_analog_in(self, pin):
""" Gets the value from a given analog pin. """
self._board.analog_read(pin)
def get_firmata(self):
""" Return the version of the Firmata firmware. """
return self._board.get_firmata_version()
def disconnect(self):
""" Disconnects the board and closes the serial connection. """
self._board.reset()
self._board.close()

View File

@@ -0,0 +1,208 @@
"""
homeassistant.components.automation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Allows to setup simple automation rules via the config file.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/automation/
"""
import logging
from homeassistant.bootstrap import prepare_setup_platform
from homeassistant.const import CONF_PLATFORM
from homeassistant.components import logbook
from homeassistant.helpers.service import call_from_config
DOMAIN = 'automation'
DEPENDENCIES = ['group']
CONF_ALIAS = 'alias'
CONF_SERVICE = 'service'
CONF_CONDITION = 'condition'
CONF_ACTION = 'action'
CONF_TRIGGER = 'trigger'
CONF_CONDITION_TYPE = 'condition_type'
CONDITION_USE_TRIGGER_VALUES = 'use_trigger_values'
CONDITION_TYPE_AND = 'and'
CONDITION_TYPE_OR = 'or'
DEFAULT_CONDITION_TYPE = CONDITION_TYPE_AND
_LOGGER = logging.getLogger(__name__)
def setup(hass, config):
""" Sets up automation. """
config_key = DOMAIN
found = 1
while config_key in config:
# check for one block syntax
if isinstance(config[config_key], dict):
config_block = _migrate_old_config(config[config_key])
name = config_block.get(CONF_ALIAS, config_key)
_setup_automation(hass, config_block, name, config)
# check for multiple block syntax
elif isinstance(config[config_key], list):
for list_no, config_block in enumerate(config[config_key]):
name = config_block.get(CONF_ALIAS,
"{}, {}".format(config_key, list_no))
_setup_automation(hass, config_block, name, config)
# any scalar value is incorrect
else:
_LOGGER.error('Error in config in section %s.', config_key)
found += 1
config_key = "{} {}".format(DOMAIN, found)
return True
def _setup_automation(hass, config_block, name, config):
""" Setup one instance of automation """
action = _get_action(hass, config_block.get(CONF_ACTION, {}), name)
if action is None:
return False
if CONF_CONDITION in config_block or CONF_CONDITION_TYPE in config_block:
action = _process_if(hass, config, config_block, action)
if action is None:
return False
_process_trigger(hass, config, config_block.get(CONF_TRIGGER, []), name,
action)
return True
def _get_action(hass, config, name):
""" Return an action based on a config. """
if CONF_SERVICE not in config:
_LOGGER.error('Error setting up %s, no action specified.', name)
return None
def action():
""" Action to be executed. """
_LOGGER.info('Executing %s', name)
logbook.log_entry(hass, name, 'has been triggered', DOMAIN)
call_from_config(hass, config)
return action
def _migrate_old_config(config):
""" Migrate old config to new. """
if CONF_PLATFORM not in config:
return config
_LOGGER.warning(
'You are using an old configuration format. Please upgrade: '
'https://home-assistant.io/components/automation/')
new_conf = {
CONF_TRIGGER: dict(config),
CONF_CONDITION: config.get('if', []),
CONF_ACTION: dict(config),
}
for cat, key, new_key in (('trigger', 'mqtt_topic', 'topic'),
('trigger', 'mqtt_payload', 'payload'),
('trigger', 'state_entity_id', 'entity_id'),
('trigger', 'state_before', 'before'),
('trigger', 'state_after', 'after'),
('trigger', 'state_to', 'to'),
('trigger', 'state_from', 'from'),
('trigger', 'state_hours', 'hours'),
('trigger', 'state_minutes', 'minutes'),
('trigger', 'state_seconds', 'seconds'),
('action', 'execute_service', 'service'),
('action', 'service_entity_id', 'entity_id'),
('action', 'service_data', 'data')):
if key in new_conf[cat]:
new_conf[cat][new_key] = new_conf[cat].pop(key)
return new_conf
def _process_if(hass, config, p_config, action):
""" Processes if checks. """
cond_type = p_config.get(CONF_CONDITION_TYPE,
DEFAULT_CONDITION_TYPE).lower()
if_configs = p_config.get(CONF_CONDITION)
use_trigger = if_configs == CONDITION_USE_TRIGGER_VALUES
if use_trigger:
if_configs = p_config[CONF_TRIGGER]
if isinstance(if_configs, dict):
if_configs = [if_configs]
checks = []
for if_config in if_configs:
platform = _resolve_platform('if_action', hass, config,
if_config.get(CONF_PLATFORM))
if platform is None:
continue
check = platform.if_action(hass, if_config)
# Invalid conditions are allowed if we base it on trigger
if check is None and not use_trigger:
return None
checks.append(check)
if cond_type == CONDITION_TYPE_AND:
def if_action():
""" AND all conditions. """
if all(check() for check in checks):
action()
else:
def if_action():
""" OR all conditions. """
if any(check() for check in checks):
action()
return if_action
def _process_trigger(hass, config, trigger_configs, name, action):
""" Setup triggers. """
if isinstance(trigger_configs, dict):
trigger_configs = [trigger_configs]
for conf in trigger_configs:
platform = _resolve_platform('trigger', hass, config,
conf.get(CONF_PLATFORM))
if platform is None:
continue
if platform.trigger(hass, conf, action):
_LOGGER.info("Initialized rule %s", name)
else:
_LOGGER.error("Error setting up rule %s", name)
def _resolve_platform(method, hass, config, platform):
""" Find automation platform. """
if platform is None:
return None
platform = prepare_setup_platform(hass, config, DOMAIN, platform)
if platform is None or not hasattr(platform, method):
_LOGGER.error("Unknown automation platform specified for %s: %s",
method, platform)
return None
return platform

View File

@@ -0,0 +1,34 @@
"""
homeassistant.components.automation.event
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Offers event listening automation rules.
For more details about this automation rule, please refer to the documentation
at https://home-assistant.io/components/automation/#event-trigger
"""
import logging
CONF_EVENT_TYPE = "event_type"
CONF_EVENT_DATA = "event_data"
_LOGGER = logging.getLogger(__name__)
def trigger(hass, config, action):
""" Listen for events based on config. """
event_type = config.get(CONF_EVENT_TYPE)
if event_type is None:
_LOGGER.error("Missing configuration key %s", CONF_EVENT_TYPE)
return False
event_data = config.get(CONF_EVENT_DATA)
def handle_event(event):
""" Listens for events and calls the action when data matches. """
if not event_data or all(val == event.data.get(key) for key, val
in event_data.items()):
action()
hass.bus.listen(event_type, handle_event)
return True

View File

@@ -0,0 +1,36 @@
"""
homeassistant.components.automation.mqtt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Offers MQTT listening automation rules.
For more details about this automation rule, please refer to the documentation
at https://home-assistant.io/components/automation/#mqtt-trigger
"""
import logging
import homeassistant.components.mqtt as mqtt
DEPENDENCIES = ['mqtt']
CONF_TOPIC = 'topic'
CONF_PAYLOAD = 'payload'
def trigger(hass, config, action):
""" Listen for state changes based on `config`. """
topic = config.get(CONF_TOPIC)
payload = config.get(CONF_PAYLOAD)
if topic is None:
logging.getLogger(__name__).error(
"Missing configuration key %s", CONF_TOPIC)
return False
def mqtt_automation_listener(msg_topic, msg_payload, qos):
""" Listens for MQTT messages. """
if payload is None or payload == msg_payload:
action()
mqtt.subscribe(hass, topic, mqtt_automation_listener)
return True

View File

@@ -0,0 +1,110 @@
"""
homeassistant.components.automation.numeric_state
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Offers numeric state listening automation rules.
For more details about this automation rule, please refer to the documentation
at https://home-assistant.io/components/automation/#numeric-state-trigger
"""
from functools import partial
import logging
from homeassistant.const import CONF_VALUE_TEMPLATE
from homeassistant.helpers.event import track_state_change
from homeassistant.util import template
CONF_ENTITY_ID = "entity_id"
CONF_BELOW = "below"
CONF_ABOVE = "above"
_LOGGER = logging.getLogger(__name__)
def _renderer(hass, value_template, state):
"""Render state value."""
if value_template is None:
return state.state
return template.render(hass, value_template, {'state': state})
def trigger(hass, config, action):
""" Listen for state changes based on `config`. """
entity_id = config.get(CONF_ENTITY_ID)
if entity_id is None:
_LOGGER.error("Missing configuration key %s", CONF_ENTITY_ID)
return False
below = config.get(CONF_BELOW)
above = config.get(CONF_ABOVE)
value_template = config.get(CONF_VALUE_TEMPLATE)
if below is None and above is None:
_LOGGER.error("Missing configuration key."
" One of %s or %s is required",
CONF_BELOW, CONF_ABOVE)
return False
renderer = partial(_renderer, hass, value_template)
# pylint: disable=unused-argument
def state_automation_listener(entity, from_s, to_s):
""" Listens for state changes and calls action. """
# Fire action if we go from outside range into range
if _in_range(above, below, renderer(to_s)) and \
(from_s is None or not _in_range(above, below, renderer(from_s))):
action()
track_state_change(
hass, entity_id, state_automation_listener)
return True
def if_action(hass, config):
""" Wraps action method with state based condition. """
entity_id = config.get(CONF_ENTITY_ID)
if entity_id is None:
_LOGGER.error("Missing configuration key %s", CONF_ENTITY_ID)
return None
below = config.get(CONF_BELOW)
above = config.get(CONF_ABOVE)
value_template = config.get(CONF_VALUE_TEMPLATE)
if below is None and above is None:
_LOGGER.error("Missing configuration key."
" One of %s or %s is required",
CONF_BELOW, CONF_ABOVE)
return None
renderer = partial(_renderer, hass, value_template)
def if_numeric_state():
""" Test numeric state condition. """
state = hass.states.get(entity_id)
return state is not None and _in_range(above, below, renderer(state))
return if_numeric_state
def _in_range(range_start, range_end, value):
""" Checks if value is inside the range """
try:
value = float(value)
except ValueError:
_LOGGER.warning("Value returned from template is not a number: %s",
value)
return False
if range_start is not None and range_end is not None:
return float(range_start) <= value < float(range_end)
elif range_end is not None:
return value < float(range_end)
else:
return float(range_start) <= value

View File

@@ -0,0 +1,65 @@
"""
homeassistant.components.automation.state
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Offers state listening automation rules.
For more details about this automation rule, please refer to the documentation
at https://home-assistant.io/components/automation/#state-trigger
"""
import logging
from homeassistant.helpers.event import track_state_change
from homeassistant.const import MATCH_ALL
CONF_ENTITY_ID = "entity_id"
CONF_FROM = "from"
CONF_TO = "to"
CONF_STATE = "state"
def trigger(hass, config, action):
""" Listen for state changes based on `config`. """
entity_id = config.get(CONF_ENTITY_ID)
if entity_id is None:
logging.getLogger(__name__).error(
"Missing trigger configuration key %s", CONF_ENTITY_ID)
return False
from_state = config.get(CONF_FROM, MATCH_ALL)
to_state = config.get(CONF_TO) or config.get(CONF_STATE) or MATCH_ALL
if isinstance(from_state, bool) or isinstance(to_state, bool):
logging.getLogger(__name__).error(
'Config error. Surround to/from values with quotes.')
return False
def state_automation_listener(entity, from_s, to_s):
""" Listens for state changes and calls action. """
action()
track_state_change(
hass, entity_id, state_automation_listener, from_state, to_state)
return True
def if_action(hass, config):
""" Wraps action method with state based condition. """
entity_id = config.get(CONF_ENTITY_ID)
state = config.get(CONF_STATE)
if entity_id is None or state is None:
logging.getLogger(__name__).error(
"Missing if-condition configuration key %s or %s", CONF_ENTITY_ID,
CONF_STATE)
return None
state = str(state)
def if_state():
""" Test if condition. """
return hass.states.is_state(entity_id, state)
return if_state

View File

@@ -0,0 +1,148 @@
"""
homeassistant.components.automation.sun
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Offers sun based automation rules.
For more details about this automation rule, please refer to the documentation
at https://home-assistant.io/components/automation/#sun-trigger
"""
import logging
from datetime import timedelta
from homeassistant.components import sun
from homeassistant.helpers.event import track_sunrise, track_sunset
import homeassistant.util.dt as dt_util
DEPENDENCIES = ['sun']
CONF_OFFSET = 'offset'
CONF_EVENT = 'event'
CONF_BEFORE = "before"
CONF_BEFORE_OFFSET = "before_offset"
CONF_AFTER = "after"
CONF_AFTER_OFFSET = "after_offset"
EVENT_SUNSET = 'sunset'
EVENT_SUNRISE = 'sunrise'
_LOGGER = logging.getLogger(__name__)
def trigger(hass, config, action):
""" Listen for events based on config. """
event = config.get(CONF_EVENT)
if event is None:
_LOGGER.error("Missing configuration key %s", CONF_EVENT)
return False
event = event.lower()
if event not in (EVENT_SUNRISE, EVENT_SUNSET):
_LOGGER.error("Invalid value for %s: %s", CONF_EVENT, event)
return False
offset = _parse_offset(config.get(CONF_OFFSET))
if offset is False:
return False
# Do something to call action
if event == EVENT_SUNRISE:
track_sunrise(hass, action, offset)
else:
track_sunset(hass, action, offset)
return True
def if_action(hass, config):
""" Wraps action method with sun based condition. """
before = config.get(CONF_BEFORE)
after = config.get(CONF_AFTER)
# Make sure required configuration keys are present
if before is None and after is None:
logging.getLogger(__name__).error(
"Missing if-condition configuration key %s or %s",
CONF_BEFORE, CONF_AFTER)
return None
# Make sure configuration keys have the right value
if before not in (None, EVENT_SUNRISE, EVENT_SUNSET) or \
after not in (None, EVENT_SUNRISE, EVENT_SUNSET):
logging.getLogger(__name__).error(
"%s and %s can only be set to %s or %s",
CONF_BEFORE, CONF_AFTER, EVENT_SUNRISE, EVENT_SUNSET)
return None
before_offset = _parse_offset(config.get(CONF_BEFORE_OFFSET))
after_offset = _parse_offset(config.get(CONF_AFTER_OFFSET))
if before_offset is False or after_offset is False:
return None
if before is None:
def before_func():
"""Return no point in time."""
return None
elif before == EVENT_SUNRISE:
def before_func():
"""Return time before sunrise."""
return sun.next_rising(hass) + before_offset
else:
def before_func():
"""Return time before sunset."""
return sun.next_setting(hass) + before_offset
if after is None:
def after_func():
"""Return no point in time."""
return None
elif after == EVENT_SUNRISE:
def after_func():
"""Return time after sunrise."""
return sun.next_rising(hass) + after_offset
else:
def after_func():
"""Return time after sunset."""
return sun.next_setting(hass) + after_offset
def time_if():
""" Validate time based if-condition """
now = dt_util.now()
before = before_func()
after = after_func()
if before is not None and now > now.replace(hour=before.hour,
minute=before.minute):
return False
if after is not None and now < now.replace(hour=after.hour,
minute=after.minute):
return False
return True
return time_if
def _parse_offset(raw_offset):
if raw_offset is None:
return timedelta(0)
negative_offset = False
if raw_offset.startswith('-'):
negative_offset = True
raw_offset = raw_offset[1:]
try:
(hour, minute, second) = [int(x) for x in raw_offset.split(':')]
except ValueError:
_LOGGER.error('Could not parse offset %s', raw_offset)
return False
offset = timedelta(hours=hour, minutes=minute, seconds=second)
if negative_offset:
offset *= -1
return offset

View File

@@ -0,0 +1,65 @@
"""
homeassistant.components.automation.template
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Offers template automation rules.
For more details about this automation rule, please refer to the documentation
at https://home-assistant.io/components/automation/#template-trigger
"""
import logging
from homeassistant.const import CONF_VALUE_TEMPLATE, EVENT_STATE_CHANGED
from homeassistant.exceptions import TemplateError
from homeassistant.util import template
_LOGGER = logging.getLogger(__name__)
def trigger(hass, config, action):
""" Listen for state changes based on `config`. """
value_template = config.get(CONF_VALUE_TEMPLATE)
if value_template is None:
_LOGGER.error("Missing configuration key %s", CONF_VALUE_TEMPLATE)
return False
# Local variable to keep track of if the action has already been triggered
already_triggered = False
def event_listener(event):
""" Listens for state changes and calls action. """
nonlocal already_triggered
template_result = _check_template(hass, value_template)
# Check to see if template returns true
if template_result and not already_triggered:
already_triggered = True
action()
elif not template_result:
already_triggered = False
hass.bus.listen(EVENT_STATE_CHANGED, event_listener)
return True
def if_action(hass, config):
""" Wraps action method with state based condition. """
value_template = config.get(CONF_VALUE_TEMPLATE)
if value_template is None:
_LOGGER.error("Missing configuration key %s", CONF_VALUE_TEMPLATE)
return False
return lambda: _check_template(hass, value_template)
def _check_template(hass, value_template):
""" Checks if result of template is true """
try:
value = template.render(hass, value_template, {})
except TemplateError:
_LOGGER.exception('Error parsing template')
return False
return value.lower() == 'true'

View File

@@ -0,0 +1,106 @@
"""
homeassistant.components.automation.time
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Offers time listening automation rules.
For more details about this automation rule, please refer to the documentation
at https://home-assistant.io/components/automation/#time-trigger
"""
import logging
import homeassistant.util.dt as dt_util
from homeassistant.helpers.event import track_time_change
CONF_HOURS = "hours"
CONF_MINUTES = "minutes"
CONF_SECONDS = "seconds"
CONF_BEFORE = "before"
CONF_AFTER = "after"
CONF_WEEKDAY = "weekday"
WEEKDAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
_LOGGER = logging.getLogger(__name__)
def trigger(hass, config, action):
""" Listen for state changes based on `config`. """
if CONF_AFTER in config:
after = dt_util.parse_time_str(config[CONF_AFTER])
if after is None:
_error_time(config[CONF_AFTER], CONF_AFTER)
return False
hours, minutes, seconds = after.hour, after.minute, after.second
elif (CONF_HOURS in config or CONF_MINUTES in config or
CONF_SECONDS in config):
hours = config.get(CONF_HOURS)
minutes = config.get(CONF_MINUTES)
seconds = config.get(CONF_SECONDS)
else:
_LOGGER.error('One of %s, %s, %s OR %s needs to be specified',
CONF_HOURS, CONF_MINUTES, CONF_SECONDS, CONF_AFTER)
return False
def time_automation_listener(now):
""" Listens for time changes and calls action. """
action()
track_time_change(hass, time_automation_listener,
hour=hours, minute=minutes, second=seconds)
return True
def if_action(hass, config):
""" Wraps action method with time based condition. """
before = config.get(CONF_BEFORE)
after = config.get(CONF_AFTER)
weekday = config.get(CONF_WEEKDAY)
if before is None and after is None and weekday is None:
_LOGGER.error(
"Missing if-condition configuration key %s, %s or %s",
CONF_BEFORE, CONF_AFTER, CONF_WEEKDAY)
return None
if before is not None:
before = dt_util.parse_time_str(before)
if before is None:
_error_time(before, CONF_BEFORE)
return None
if after is not None:
after = dt_util.parse_time_str(after)
if after is None:
_error_time(after, CONF_AFTER)
return None
def time_if():
""" Validate time based if-condition """
now = dt_util.now()
if before is not None and now > now.replace(hour=before.hour,
minute=before.minute):
return False
if after is not None and now < now.replace(hour=after.hour,
minute=after.minute):
return False
if weekday is not None:
now_weekday = WEEKDAYS[now.weekday()]
if isinstance(weekday, str) and weekday != now_weekday or \
now_weekday not in weekday:
return False
return True
return time_if
def _error_time(value, key):
""" Helper method to print error. """
_LOGGER.error(
"Received invalid value for '%s': %s", key, value)
if isinstance(value, int):
_LOGGER.error('Make sure you wrap time values in quotes')

View File

@@ -0,0 +1,88 @@
"""
homeassistant.components.automation.zone
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Offers zone automation rules.
For more details about this automation rule, please refer to the documentation
at https://home-assistant.io/components/automation/#zone-trigger
"""
import logging
from homeassistant.components import zone
from homeassistant.helpers.event import track_state_change
from homeassistant.const import (
ATTR_GPS_ACCURACY, ATTR_LATITUDE, ATTR_LONGITUDE, MATCH_ALL)
CONF_ENTITY_ID = "entity_id"
CONF_ZONE = "zone"
CONF_EVENT = "event"
EVENT_ENTER = "enter"
EVENT_LEAVE = "leave"
DEFAULT_EVENT = EVENT_ENTER
def trigger(hass, config, action):
""" Listen for state changes based on `config`. """
entity_id = config.get(CONF_ENTITY_ID)
zone_entity_id = config.get(CONF_ZONE)
if entity_id is None or zone_entity_id is None:
logging.getLogger(__name__).error(
"Missing trigger configuration key %s or %s", CONF_ENTITY_ID,
CONF_ZONE)
return False
event = config.get(CONF_EVENT, DEFAULT_EVENT)
def zone_automation_listener(entity, from_s, to_s):
""" Listens for state changes and calls action. """
if from_s and None in (from_s.attributes.get(ATTR_LATITUDE),
from_s.attributes.get(ATTR_LONGITUDE)) or \
None in (to_s.attributes.get(ATTR_LATITUDE),
to_s.attributes.get(ATTR_LONGITUDE)):
return
from_match = _in_zone(hass, zone_entity_id, from_s) if from_s else None
to_match = _in_zone(hass, zone_entity_id, to_s)
# pylint: disable=too-many-boolean-expressions
if event == EVENT_ENTER and not from_match and to_match or \
event == EVENT_LEAVE and from_match and not to_match:
action()
track_state_change(
hass, entity_id, zone_automation_listener, MATCH_ALL, MATCH_ALL)
return True
def if_action(hass, config):
""" Wraps action method with zone based condition. """
entity_id = config.get(CONF_ENTITY_ID)
zone_entity_id = config.get(CONF_ZONE)
if entity_id is None or zone_entity_id is None:
logging.getLogger(__name__).error(
"Missing condition configuration key %s or %s", CONF_ENTITY_ID,
CONF_ZONE)
return False
def if_in_zone():
""" Test if condition. """
return _in_zone(hass, zone_entity_id, hass.states.get(entity_id))
return if_in_zone
def _in_zone(hass, zone_entity_id, state):
""" Check if state is in zone. """
if not state or None in (state.attributes.get(ATTR_LATITUDE),
state.attributes.get(ATTR_LONGITUDE)):
return False
zone_state = hass.states.get(zone_entity_id)
return zone_state and zone.in_zone(
zone_state, state.attributes.get(ATTR_LATITUDE),
state.attributes.get(ATTR_LONGITUDE),
state.attributes.get(ATTR_GPS_ACCURACY, 0))

View File

@@ -0,0 +1,49 @@
"""
homeassistant.components.binary_sensor
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Component to interface with binary sensors (sensors which only know two states)
that can be monitored.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/binary_sensor/
"""
import logging
from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.helpers.entity import Entity
from homeassistant.const import (STATE_ON, STATE_OFF)
DOMAIN = 'binary_sensor'
SCAN_INTERVAL = 30
ENTITY_ID_FORMAT = DOMAIN + '.{}'
def setup(hass, config):
""" Track states and offer events for binary sensors. """
component = EntityComponent(
logging.getLogger(__name__), DOMAIN, hass, SCAN_INTERVAL)
component.setup(config)
return True
# pylint: disable=no-self-use
class BinarySensorDevice(Entity):
""" Represents a binary sensor. """
@property
def is_on(self):
""" True if the binary sensor is on. """
return None
@property
def state(self):
""" Returns the state of the binary sensor. """
return STATE_ON if self.is_on else STATE_OFF
@property
def friendly_state(self):
""" Returns the friendly state of the binary sensor. """
return None

View File

@@ -0,0 +1,44 @@
"""
homeassistant.components.binary_sensor.apcupsd
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides a binary sensor to track online status of a UPS.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.apcupsd/
"""
from homeassistant.components.binary_sensor import BinarySensorDevice
from homeassistant.components import apcupsd
DEPENDENCIES = [apcupsd.DOMAIN]
DEFAULT_NAME = "UPS Online Status"
def setup_platform(hass, config, add_entities, discovery_info=None):
""" Instantiate an OnlineStatus binary sensor entity and add it to HA. """
add_entities((OnlineStatus(config, apcupsd.DATA),))
class OnlineStatus(BinarySensorDevice):
""" Binary sensor to represent UPS online status. """
def __init__(self, config, data):
self._config = config
self._data = data
self._state = None
self.update()
@property
def name(self):
""" The name of the UPS online status sensor. """
return self._config.get("name", DEFAULT_NAME)
@property
def is_on(self):
""" True if the UPS is online, else False. """
return self._state == apcupsd.VALUE_ONLINE
def update(self):
"""
Get the status report from APCUPSd (or cache) and set this entity's
state.
"""
self._state = self._data.status[apcupsd.KEY_STATUS]

View File

@@ -0,0 +1,107 @@
"""
homeassistant.components.binary_sensor.arest
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The arest sensor will consume an exposed aREST API of a device.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.arest/
"""
from datetime import timedelta
import logging
import requests
from homeassistant.util import Throttle
from homeassistant.components.binary_sensor import BinarySensorDevice
_LOGGER = logging.getLogger(__name__)
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=30)
CONF_RESOURCE = 'resource'
CONF_PIN = 'pin'
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Get the aREST binary sensor. """
resource = config.get(CONF_RESOURCE)
pin = config.get(CONF_PIN)
if None in (resource, pin):
_LOGGER.error('Not all required config keys present: %s',
', '.join((CONF_RESOURCE, CONF_PIN)))
return False
try:
response = requests.get(resource, timeout=10).json()
except requests.exceptions.MissingSchema:
_LOGGER.error('Missing resource or schema in configuration. '
'Add http:// to your URL.')
return False
except requests.exceptions.ConnectionError:
_LOGGER.error('No route to device at %s. '
'Please check the IP address in the configuration file.',
resource)
return False
arest = ArestData(resource, pin)
add_devices([ArestBinarySensor(arest,
resource,
config.get('name', response['name']),
pin)])
# pylint: disable=too-many-instance-attributes, too-many-arguments
class ArestBinarySensor(BinarySensorDevice):
""" Implements an aREST binary sensor for a pin. """
def __init__(self, arest, resource, name, pin):
self.arest = arest
self._resource = resource
self._name = name
self._pin = pin
self.update()
if self._pin is not None:
request = requests.get('{}/mode/{}/i'.format
(self._resource, self._pin), timeout=10)
if request.status_code is not 200:
_LOGGER.error("Can't set mode. Is device offline?")
@property
def name(self):
""" The name of the binary sensor. """
return self._name
@property
def is_on(self):
""" True if the binary sensor is on. """
return bool(self.arest.data.get('state'))
def update(self):
""" Gets the latest data from aREST API. """
self.arest.update()
# pylint: disable=too-few-public-methods
class ArestData(object):
""" Class for handling the data retrieval for pins. """
def __init__(self, resource, pin):
self._resource = resource
self._pin = pin
self.data = {}
@Throttle(MIN_TIME_BETWEEN_UPDATES)
def update(self):
""" Gets the latest data from aREST device. """
try:
response = requests.get('{}/digital/{}'.format(
self._resource, self._pin), timeout=10)
self.data = {'state': response.json()['return_value']}
except requests.exceptions.ConnectionError:
_LOGGER.error("No route to device '%s'. Is device offline?",
self._resource)

View File

@@ -0,0 +1,84 @@
"""
homeassistant.components.binary_sensor.command_sensor
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Allows to configure custom shell commands to turn a value
into a logical value for a binary sensor.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.command/
"""
import logging
from datetime import timedelta
from homeassistant.const import CONF_VALUE_TEMPLATE
from homeassistant.components.binary_sensor import BinarySensorDevice
from homeassistant.components.sensor.command_sensor import CommandSensorData
from homeassistant.util import template
_LOGGER = logging.getLogger(__name__)
DEFAULT_NAME = "Binary Command Sensor"
DEFAULT_PAYLOAD_ON = 'ON'
DEFAULT_PAYLOAD_OFF = 'OFF'
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60)
# pylint: disable=unused-argument
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Add the Command Sensor. """
if config.get('command') is None:
_LOGGER.error('Missing required variable: "command"')
return False
data = CommandSensorData(config.get('command'))
add_devices([CommandBinarySensor(
hass,
data,
config.get('name', DEFAULT_NAME),
config.get('payload_on', DEFAULT_PAYLOAD_ON),
config.get('payload_off', DEFAULT_PAYLOAD_OFF),
config.get(CONF_VALUE_TEMPLATE)
)])
# pylint: disable=too-many-arguments
class CommandBinarySensor(BinarySensorDevice):
""" Represents a binary sensor that is returning
a value of a shell commands. """
def __init__(self, hass, data, name, payload_on,
payload_off, value_template):
self._hass = hass
self.data = data
self._name = name
self._state = False
self._payload_on = payload_on
self._payload_off = payload_off
self._value_template = value_template
self.update()
@property
def name(self):
""" The name of the sensor. """
return self._name
@property
def is_on(self):
""" True if the binary sensor is on. """
return self._state
def update(self):
""" Gets the latest data and updates the state. """
self.data.update()
value = self.data.value
if self._value_template is not None:
value = template.render_with_possible_json_value(
self._hass, self._value_template, value, False)
if value == self._payload_on:
self._state = True
elif value == self._payload_off:
self._state = False

View File

@@ -0,0 +1,37 @@
"""
homeassistant.components.binary_sensor.demo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo platform that has two fake binary sensors.
"""
from homeassistant.components.binary_sensor import BinarySensorDevice
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Sets up the Demo binary sensors. """
add_devices([
DemoBinarySensor('Basement Floor Wet', False),
DemoBinarySensor('Movement Backyard', True),
])
class DemoBinarySensor(BinarySensorDevice):
""" A Demo binary sensor. """
def __init__(self, name, state):
self._name = name
self._state = state
@property
def should_poll(self):
""" No polling needed for a demo binary sensor. """
return False
@property
def name(self):
""" Returns the name of the binary sensor. """
return self._name
@property
def is_on(self):
""" True if the binary sensor is on. """
return self._state

View File

@@ -0,0 +1,84 @@
"""
homeassistant.components.binary_sensor.mqtt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Allows to configure a MQTT binary sensor.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.mqtt/
"""
import logging
from homeassistant.const import CONF_VALUE_TEMPLATE
from homeassistant.components.binary_sensor import BinarySensorDevice
from homeassistant.util import template
import homeassistant.components.mqtt as mqtt
_LOGGER = logging.getLogger(__name__)
DEFAULT_NAME = 'MQTT Binary sensor'
DEFAULT_QOS = 0
DEFAULT_PAYLOAD_ON = 'ON'
DEFAULT_PAYLOAD_OFF = 'OFF'
DEPENDENCIES = ['mqtt']
# pylint: disable=unused-argument
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Add MQTT binary sensor. """
if config.get('state_topic') is None:
_LOGGER.error('Missing required variable: state_topic')
return False
add_devices([MqttBinarySensor(
hass,
config.get('name', DEFAULT_NAME),
config.get('state_topic', None),
config.get('qos', DEFAULT_QOS),
config.get('payload_on', DEFAULT_PAYLOAD_ON),
config.get('payload_off', DEFAULT_PAYLOAD_OFF),
config.get(CONF_VALUE_TEMPLATE))])
# pylint: disable=too-many-arguments, too-many-instance-attributes
class MqttBinarySensor(BinarySensorDevice):
""" Represents a binary sensor that is updated by MQTT. """
def __init__(self, hass, name, state_topic, qos, payload_on, payload_off,
value_template):
self._hass = hass
self._name = name
self._state = False
self._state_topic = state_topic
self._payload_on = payload_on
self._payload_off = payload_off
self._qos = qos
def message_received(topic, payload, qos):
""" A new MQTT message has been received. """
if value_template is not None:
payload = template.render_with_possible_json_value(
hass, value_template, payload)
if payload == self._payload_on:
self._state = True
self.update_ha_state()
elif payload == self._payload_off:
self._state = False
self.update_ha_state()
mqtt.subscribe(hass, self._state_topic, message_received, self._qos)
@property
def should_poll(self):
""" No polling needed. """
return False
@property
def name(self):
""" The name of the binary sensor. """
return self._name
@property
def is_on(self):
""" True if the binary sensor is on. """
return self._state

View File

@@ -0,0 +1,56 @@
"""
homeassistant.components.binary_sensor.nest
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Support for Nest Thermostat Binary Sensors.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.nest/
"""
import logging
import socket
import homeassistant.components.nest as nest
from homeassistant.components.sensor.nest import NestSensor
from homeassistant.components.binary_sensor import BinarySensorDevice
DEPENDENCIES = ['nest']
BINARY_TYPES = ['fan',
'hvac_ac_state',
'hvac_aux_heater_state',
'hvac_heater_state',
'hvac_heat_x2_state',
'hvac_heat_x3_state',
'hvac_alt_heat_state',
'hvac_alt_heat_x2_state',
'hvac_emer_heat_state',
'online']
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Setup Nest binary sensors. """
logger = logging.getLogger(__name__)
try:
for structure in nest.NEST.structures:
for device in structure.devices:
for variable in config['monitored_conditions']:
if variable in BINARY_TYPES:
add_devices([NestBinarySensor(structure,
device,
variable)])
else:
logger.error('Nest sensor type: "%s" does not exist',
variable)
except socket.error:
logger.error(
"Connection error logging into the nest web service."
)
class NestBinarySensor(NestSensor, BinarySensorDevice):
""" Represents a Nest binary sensor. """
@property
def is_on(self):
""" True if the binary sensor is on. """
return bool(getattr(self.device, self.variable))

View File

@@ -0,0 +1,73 @@
"""
homeassistant.components.binary_sensor.rest
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The rest binary sensor will consume responses sent by an exposed REST API.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.rest/
"""
import logging
from homeassistant.const import CONF_VALUE_TEMPLATE
from homeassistant.util import template
from homeassistant.components.sensor.rest import RestData
from homeassistant.components.binary_sensor import BinarySensorDevice
_LOGGER = logging.getLogger(__name__)
DEFAULT_NAME = 'REST Binary Sensor'
DEFAULT_METHOD = 'GET'
# pylint: disable=unused-variable
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Setup REST binary sensors. """
resource = config.get('resource', None)
method = config.get('method', DEFAULT_METHOD)
payload = config.get('payload', None)
verify_ssl = config.get('verify_ssl', True)
rest = RestData(method, resource, payload, verify_ssl)
rest.update()
if rest.data is None:
_LOGGER.error('Unable to fetch Rest data')
return False
add_devices([RestBinarySensor(
hass, rest, config.get('name', DEFAULT_NAME),
config.get(CONF_VALUE_TEMPLATE))])
# pylint: disable=too-many-arguments
class RestBinarySensor(BinarySensorDevice):
""" A REST binary sensor. """
def __init__(self, hass, rest, name, value_template):
""" Initialize a REST binary sensor. """
self._hass = hass
self.rest = rest
self._name = name
self._state = False
self._value_template = value_template
self.update()
@property
def name(self):
""" Name of the binary sensor. """
return self._name
@property
def is_on(self):
""" Return if the binary sensor is on. """
if self.rest.data is None:
return False
if self._value_template is not None:
self.rest.data = template.render_with_possible_json_value(
self._hass, self._value_template, self.rest.data, False)
return bool(int(self.rest.data))
def update(self):
""" Get the latest data from REST API and updates the state. """
self.rest.update()

View File

@@ -0,0 +1,73 @@
"""
homeassistant.components.binary_sensor.rpi_gpio
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Allows to configure a binary sensor using RPi GPIO.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.rpi_gpio/
"""
import logging
import homeassistant.components.rpi_gpio as rpi_gpio
from homeassistant.components.binary_sensor import BinarySensorDevice
from homeassistant.const import (DEVICE_DEFAULT_NAME)
DEFAULT_PULL_MODE = "UP"
DEFAULT_BOUNCETIME = 50
DEFAULT_INVERT_LOGIC = False
DEPENDENCIES = ['rpi_gpio']
_LOGGER = logging.getLogger(__name__)
# pylint: disable=unused-argument
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Sets up the Raspberry PI GPIO devices. """
pull_mode = config.get('pull_mode', DEFAULT_PULL_MODE)
bouncetime = config.get('bouncetime', DEFAULT_BOUNCETIME)
invert_logic = config.get('invert_logic', DEFAULT_INVERT_LOGIC)
binary_sensors = []
ports = config.get('ports')
for port_num, port_name in ports.items():
binary_sensors.append(RPiGPIOBinarySensor(
port_name, port_num, pull_mode, bouncetime, invert_logic))
add_devices(binary_sensors)
# pylint: disable=too-many-arguments, too-many-instance-attributes
class RPiGPIOBinarySensor(BinarySensorDevice):
""" Represents a binary sensor that uses Raspberry Pi GPIO. """
def __init__(self, name, port, pull_mode, bouncetime, invert_logic):
# pylint: disable=no-member
self._name = name or DEVICE_DEFAULT_NAME
self._port = port
self._pull_mode = pull_mode
self._bouncetime = bouncetime
self._invert_logic = invert_logic
rpi_gpio.setup_input(self._port, self._pull_mode)
self._state = rpi_gpio.read_input(self._port)
def read_gpio(port):
""" Reads state from GPIO. """
self._state = rpi_gpio.read_input(self._port)
self.update_ha_state()
rpi_gpio.edge_detect(self._port, read_gpio, self._bouncetime)
@property
def should_poll(self):
""" No polling needed. """
return False
@property
def name(self):
""" The name of the sensor. """
return self._name
@property
def is_on(self):
""" Returns the state of the entity. """
return self._state != self._invert_logic

View File

@@ -0,0 +1,29 @@
"""
homeassistant.components.binary_sensor.zigbee
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Contains functionality to use a ZigBee device as a binary sensor.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.zigbee/
"""
from homeassistant.components.binary_sensor import BinarySensorDevice
from homeassistant.components.zigbee import (
ZigBeeDigitalIn, ZigBeeDigitalInConfig)
DEPENDENCIES = ["zigbee"]
def setup_platform(hass, config, add_entities, discovery_info=None):
""" Create and add an entity based on the configuration. """
add_entities([
ZigBeeBinarySensor(hass, ZigBeeDigitalInConfig(config))
])
class ZigBeeBinarySensor(ZigBeeDigitalIn, BinarySensorDevice):
"""
Use multiple inheritance to turn a ZigBeeDigitalIn into a
BinarySensorDevice.
"""
pass

View File

@@ -0,0 +1,77 @@
"""
homeassistant.components.bloomsky
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Support for BloomSky weather station.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/bloomsky/
"""
import logging
from datetime import timedelta
import requests
from homeassistant.util import Throttle
from homeassistant.helpers import validate_config
from homeassistant.const import CONF_API_KEY
DOMAIN = "bloomsky"
BLOOMSKY = None
_LOGGER = logging.getLogger(__name__)
# The BloomSky only updates every 5-8 minutes as per the API spec so there's
# no point in polling the API more frequently
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=300)
# pylint: disable=unused-argument,too-few-public-methods
def setup(hass, config):
""" Setup BloomSky component. """
if not validate_config(
config,
{DOMAIN: [CONF_API_KEY]},
_LOGGER):
return False
api_key = config[DOMAIN][CONF_API_KEY]
global BLOOMSKY
try:
BLOOMSKY = BloomSky(api_key)
except RuntimeError:
return False
return True
class BloomSky(object):
""" Handle all communication with the BloomSky API. """
# API documentation at http://weatherlution.com/bloomsky-api/
API_URL = "https://api.bloomsky.com/api/skydata"
def __init__(self, api_key):
self._api_key = api_key
self.devices = {}
_LOGGER.debug("Initial bloomsky device load...")
self.refresh_devices()
@Throttle(MIN_TIME_BETWEEN_UPDATES)
def refresh_devices(self):
"""
Uses the API to retreive a list of devices associated with an
account along with all the sensors on the device.
"""
_LOGGER.debug("Fetching bloomsky update")
response = requests.get(self.API_URL,
headers={"Authorization": self._api_key},
timeout=10)
if response.status_code == 401:
raise RuntimeError("Invalid API_KEY")
elif response.status_code != 200:
_LOGGER.error("Invalid HTTP response: %s", response.status_code)
return
# create dictionary keyed off of the device unique id
self.devices.update({
device["DeviceID"]: device for device in response.json()
})

View File

@@ -1,8 +1,10 @@
"""
homeassistant.components.browser
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides functionality to launch a webbrowser on the host machine.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/browser/
"""
DOMAIN = "browser"
@@ -10,16 +12,16 @@ DOMAIN = "browser"
SERVICE_BROWSE_URL = "browse_url"
def setup(bus):
def setup(hass, config):
""" Listen for browse_url events and open
the url in the default webbrowser. """
import webbrowser
bus.register_service(DOMAIN, SERVICE_BROWSE_URL,
lambda service:
webbrowser.open(
service.data.get('url',
'https://www.google.com')))
hass.services.register(DOMAIN, SERVICE_BROWSE_URL,
lambda service:
webbrowser.open(
service.data.get(
'url', 'https://www.google.com')))
return True

View File

@@ -0,0 +1,218 @@
# pylint: disable=too-many-lines
"""
homeassistant.components.camera
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Component to interface with various cameras.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/camera/
"""
import logging
import re
import time
import requests
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.const import (
ATTR_ENTITY_PICTURE,
HTTP_NOT_FOUND,
ATTR_ENTITY_ID,
)
DOMAIN = 'camera'
DEPENDENCIES = ['http']
GROUP_NAME_ALL_CAMERAS = 'all_cameras'
SCAN_INTERVAL = 30
ENTITY_ID_FORMAT = DOMAIN + '.{}'
SWITCH_ACTION_RECORD = 'record'
SWITCH_ACTION_SNAPSHOT = 'snapshot'
SERVICE_CAMERA = 'camera_service'
DEFAULT_RECORDING_SECONDS = 30
# Maps discovered services to their platforms
DISCOVERY_PLATFORMS = {}
FILE_DATETIME_FORMAT = '%Y-%m-%d_%H-%M-%S-%f'
DIR_DATETIME_FORMAT = '%Y-%m-%d_%H-%M-%S'
REC_DIR_PREFIX = 'recording-'
REC_IMG_PREFIX = 'recording_image-'
STATE_RECORDING = 'recording'
STATE_STREAMING = 'streaming'
STATE_IDLE = 'idle'
CAMERA_PROXY_URL = '/api/camera_proxy_stream/{0}'
CAMERA_STILL_URL = '/api/camera_proxy/{0}'
ENTITY_IMAGE_URL = '/api/camera_proxy/{0}?time={1}'
MULTIPART_BOUNDARY = '--jpegboundary'
MJPEG_START_HEADER = 'Content-type: {0}\r\n\r\n'
# pylint: disable=too-many-branches
def setup(hass, config):
""" Track states and offer events for cameras. """
component = EntityComponent(
logging.getLogger(__name__), DOMAIN, hass, SCAN_INTERVAL,
DISCOVERY_PLATFORMS)
component.setup(config)
# -------------------------------------------------------------------------
# CAMERA COMPONENT ENDPOINTS
# -------------------------------------------------------------------------
# The following defines the endpoints for serving images from the camera
# via the HA http server. This is means that you can access images from
# your camera outside of your LAN without the need for port forwards etc.
# Because the authentication header can't be added in image requests these
# endpoints are secured with session based security.
# pylint: disable=unused-argument
def _proxy_camera_image(handler, path_match, data):
""" Proxies the camera image via the HA server. """
entity_id = path_match.group(ATTR_ENTITY_ID)
camera = component.entities.get(entity_id)
if camera is None:
handler.send_response(HTTP_NOT_FOUND)
handler.end_headers()
return
response = camera.camera_image()
if response is None:
handler.send_response(HTTP_NOT_FOUND)
handler.end_headers()
return
handler.wfile.write(response)
hass.http.register_path(
'GET',
re.compile(r'/api/camera_proxy/(?P<entity_id>[a-zA-Z\._0-9]+)'),
_proxy_camera_image)
# pylint: disable=unused-argument
def _proxy_camera_mjpeg_stream(handler, path_match, data):
"""
Proxies the camera image as an mjpeg stream via the HA server.
This function takes still images from the IP camera and turns them
into an MJPEG stream. This means that HA can return a live video
stream even with only a still image URL available.
"""
entity_id = path_match.group(ATTR_ENTITY_ID)
camera = component.entities.get(entity_id)
if camera is None:
handler.send_response(HTTP_NOT_FOUND)
handler.end_headers()
return
try:
camera.is_streaming = True
camera.update_ha_state()
camera.mjpeg_stream(handler)
except (requests.RequestException, IOError):
camera.is_streaming = False
camera.update_ha_state()
hass.http.register_path(
'GET',
re.compile(
r'/api/camera_proxy_stream/(?P<entity_id>[a-zA-Z\._0-9]+)'),
_proxy_camera_mjpeg_stream)
return True
class Camera(Entity):
""" The base class for camera components. """
def __init__(self):
self.is_streaming = False
@property
# pylint: disable=no-self-use
def is_recording(self):
""" Returns true if the device is recording. """
return False
@property
# pylint: disable=no-self-use
def brand(self):
""" Should return a string of the camera brand. """
return None
@property
# pylint: disable=no-self-use
def model(self):
""" Returns string of camera model. """
return None
def camera_image(self):
""" Return bytes of camera image. """
raise NotImplementedError()
def mjpeg_stream(self, handler):
""" Generate an HTTP MJPEG stream from camera images. """
handler.request.sendall(bytes('HTTP/1.1 200 OK\r\n', 'utf-8'))
handler.request.sendall(bytes(
'Content-type: multipart/x-mixed-replace; \
boundary=--jpgboundary\r\n\r\n', 'utf-8'))
handler.request.sendall(bytes('--jpgboundary\r\n', 'utf-8'))
# MJPEG_START_HEADER.format()
while True:
img_bytes = self.camera_image()
if img_bytes is None:
continue
headers_str = '\r\n'.join((
'Content-length: {}'.format(len(img_bytes)),
'Content-type: image/jpeg',
)) + '\r\n\r\n'
handler.request.sendall(
bytes(headers_str, 'utf-8') +
img_bytes +
bytes('\r\n', 'utf-8'))
handler.request.sendall(
bytes('--jpgboundary\r\n', 'utf-8'))
time.sleep(0.5)
@property
def state(self):
""" Returns the state of the entity. """
if self.is_recording:
return STATE_RECORDING
elif self.is_streaming:
return STATE_STREAMING
else:
return STATE_IDLE
@property
def state_attributes(self):
""" Returns optional state attributes. """
attr = {
ATTR_ENTITY_PICTURE: ENTITY_IMAGE_URL.format(
self.entity_id, time.time()),
}
if self.model:
attr['model_name'] = self.model
if self.brand:
attr['brand'] = self.brand
return attr

View File

@@ -0,0 +1,60 @@
"""
homeassistant.components.camera.bloomsky
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Support for a camera of a BloomSky weather station.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/camera.bloomsky/
"""
import logging
import requests
import homeassistant.components.bloomsky as bloomsky
from homeassistant.components.camera import Camera
DEPENDENCIES = ["bloomsky"]
# pylint: disable=unused-argument
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
""" set up access to BloomSky cameras """
for device in bloomsky.BLOOMSKY.devices.values():
add_devices_callback([BloomSkyCamera(bloomsky.BLOOMSKY, device)])
class BloomSkyCamera(Camera):
""" Represents the images published from the BloomSky's camera. """
def __init__(self, bs, device):
""" set up for access to the BloomSky camera images """
super(BloomSkyCamera, self).__init__()
self._name = device["DeviceName"]
self._id = device["DeviceID"]
self._bloomsky = bs
self._url = ""
self._last_url = ""
# _last_image will store images as they are downloaded so that the
# frequent updates in home-assistant don't keep poking the server
# to download the same image over and over
self._last_image = ""
self._logger = logging.getLogger(__name__)
def camera_image(self):
""" Update the camera's image if it has changed. """
try:
self._url = self._bloomsky.devices[self._id]["Data"]["ImageURL"]
self._bloomsky.refresh_devices()
# if the url hasn't changed then the image hasn't changed
if self._url != self._last_url:
response = requests.get(self._url, timeout=10)
self._last_url = self._url
self._last_image = response.content
except requests.exceptions.RequestException as error:
self._logger.error("Error getting bloomsky image: %s", error)
return None
return self._last_image
@property
def name(self):
""" The name of this BloomSky device. """
return self._name

View File

@@ -0,0 +1,37 @@
"""
homeassistant.components.camera.demo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo platform that has a fake camera.
"""
import os
from homeassistant.components.camera import Camera
import homeassistant.util.dt as dt_util
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Sets up the Demo camera. """
add_devices([
DemoCamera('Demo camera')
])
class DemoCamera(Camera):
""" A Demo camera. """
def __init__(self, name):
super().__init__()
self._name = name
def camera_image(self):
""" Return a faked still image response. """
now = dt_util.utcnow()
image_path = os.path.join(os.path.dirname(__file__),
'demo_{}.jpg'.format(now.second % 4))
with open(image_path, 'rb') as file:
return file.read()
@property
def name(self):
""" Return the name of this device. """
return self._name

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1,61 @@
"""
homeassistant.components.camera.foscam
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This component provides basic support for Foscam IP cameras.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/camera.foscam/
"""
import logging
import requests
from homeassistant.helpers import validate_config
from homeassistant.components.camera import DOMAIN, Camera
_LOGGER = logging.getLogger(__name__)
# pylint: disable=unused-argument
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
""" Adds a Foscam IP Camera. """
if not validate_config({DOMAIN: config},
{DOMAIN: ['username', 'password', 'ip']}, _LOGGER):
return None
add_devices_callback([FoscamCamera(config)])
# pylint: disable=too-many-instance-attributes
class FoscamCamera(Camera):
""" An implementation of a Foscam IP camera. """
def __init__(self, device_info):
super(FoscamCamera, self).__init__()
ip_address = device_info.get('ip')
port = device_info.get('port', 88)
self._base_url = 'http://' + ip_address + ':' + str(port) + '/'
self._username = device_info.get('username')
self._password = device_info.get('password')
self._snap_picture_url = self._base_url \
+ 'cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=' \
+ self._username + '&pwd=' + self._password
self._name = device_info.get('name', 'Foscam Camera')
_LOGGER.info('Using the following URL for %s: %s',
self._name, self._snap_picture_url)
def camera_image(self):
""" Return a still image reponse from the camera. """
# Send the request to snap a picture and return raw jpg data
response = requests.get(self._snap_picture_url)
return response.content
@property
def name(self):
""" Return the name of this device. """
return self._name

View File

@@ -0,0 +1,65 @@
"""
homeassistant.components.camera.generic
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Support for IP Cameras.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/camera.generic/
"""
import logging
import requests
from requests.auth import HTTPBasicAuth
from homeassistant.helpers import validate_config
from homeassistant.components.camera import DOMAIN, Camera
_LOGGER = logging.getLogger(__name__)
# pylint: disable=unused-argument
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
""" Adds a generic IP Camera. """
if not validate_config({DOMAIN: config}, {DOMAIN: ['still_image_url']},
_LOGGER):
return None
add_devices_callback([GenericCamera(config)])
# pylint: disable=too-many-instance-attributes
class GenericCamera(Camera):
"""
A generic implementation of an IP camera that is reachable over a URL.
"""
def __init__(self, device_info):
super().__init__()
self._name = device_info.get('name', 'Generic Camera')
self._username = device_info.get('username')
self._password = device_info.get('password')
self._still_image_url = device_info['still_image_url']
def camera_image(self):
""" Return a still image response from the camera. """
if self._username and self._password:
try:
response = requests.get(
self._still_image_url,
auth=HTTPBasicAuth(self._username, self._password))
except requests.exceptions.RequestException as error:
_LOGGER.error('Error getting camera image: %s', error)
return None
else:
try:
response = requests.get(self._still_image_url)
except requests.exceptions.RequestException as error:
_LOGGER.error('Error getting camera image: %s', error)
return None
return response.content
@property
def name(self):
""" Return the name of this device. """
return self._name

View File

@@ -0,0 +1,92 @@
"""
homeassistant.components.camera.mjpeg
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Support for IP Cameras.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/camera.mjpeg/
"""
from contextlib import closing
import logging
import requests
from requests.auth import HTTPBasicAuth
from homeassistant.helpers import validate_config
from homeassistant.components.camera import DOMAIN, Camera
from homeassistant.const import HTTP_OK
CONTENT_TYPE_HEADER = 'Content-Type'
_LOGGER = logging.getLogger(__name__)
# pylint: disable=unused-argument
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
""" Adds a mjpeg IP Camera. """
if not validate_config({DOMAIN: config}, {DOMAIN: ['mjpeg_url']},
_LOGGER):
return None
add_devices_callback([MjpegCamera(config)])
# pylint: disable=too-many-instance-attributes
class MjpegCamera(Camera):
"""
A generic implementation of an IP camera that is reachable over a URL.
"""
def __init__(self, device_info):
super().__init__()
self._name = device_info.get('name', 'Mjpeg Camera')
self._username = device_info.get('username')
self._password = device_info.get('password')
self._mjpeg_url = device_info['mjpeg_url']
def camera_stream(self):
""" Return a mjpeg stream image response directly from the camera. """
if self._username and self._password:
return requests.get(self._mjpeg_url,
auth=HTTPBasicAuth(self._username,
self._password),
stream=True)
else:
return requests.get(self._mjpeg_url,
stream=True)
def camera_image(self):
""" Return a still image response from the camera. """
def process_response(response):
""" Take in a response object, return the jpg from it. """
data = b''
for chunk in response.iter_content(1024):
data += chunk
jpg_start = data.find(b'\xff\xd8')
jpg_end = data.find(b'\xff\xd9')
if jpg_start != -1 and jpg_end != -1:
jpg = data[jpg_start:jpg_end + 2]
return jpg
with closing(self.camera_stream()) as response:
return process_response(response)
def mjpeg_stream(self, handler):
""" Generate an HTTP MJPEG stream from the camera. """
response = self.camera_stream()
content_type = response.headers[CONTENT_TYPE_HEADER]
handler.send_response(HTTP_OK)
handler.send_header(CONTENT_TYPE_HEADER, content_type)
handler.end_headers()
for chunk in response.iter_content(chunk_size=1024):
if not chunk:
break
handler.wfile.write(chunk)
@property
def name(self):
""" Return the name of this device. """
return self._name

View File

@@ -0,0 +1,91 @@
"""
homeassistant.components.camera.uvc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Support for Ubiquiti's UVC cameras.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/camera.uvc/
"""
import logging
import socket
import requests
from homeassistant.helpers import validate_config
from homeassistant.components.camera import DOMAIN, Camera
REQUIREMENTS = ['uvcclient==0.5']
_LOGGER = logging.getLogger(__name__)
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Discover cameras on a Unifi NVR. """
if not validate_config({DOMAIN: config}, {DOMAIN: ['nvr', 'key']},
_LOGGER):
return None
addr = config.get('nvr')
port = int(config.get('port', 7080))
key = config.get('key')
from uvcclient import nvr
nvrconn = nvr.UVCRemote(addr, port, key)
try:
cameras = nvrconn.index()
except nvr.NotAuthorized:
_LOGGER.error('Authorization failure while connecting to NVR')
return False
except nvr.NvrError:
_LOGGER.error('NVR refuses to talk to me')
return False
except requests.exceptions.ConnectionError as ex:
_LOGGER.error('Unable to connect to NVR: %s', str(ex))
return False
for camera in cameras:
add_devices([UnifiVideoCamera(nvrconn,
camera['uuid'],
camera['name'])])
class UnifiVideoCamera(Camera):
""" A Ubiquiti Unifi Video Camera. """
def __init__(self, nvr, uuid, name):
super(UnifiVideoCamera, self).__init__()
self._nvr = nvr
self._uuid = uuid
self._name = name
self.is_streaming = False
@property
def name(self):
return self._name
@property
def is_recording(self):
caminfo = self._nvr.get_camera(self._uuid)
return caminfo['recordingSettings']['fullTimeRecordEnabled']
def camera_image(self):
from uvcclient import camera as uvc_camera
caminfo = self._nvr.get_camera(self._uuid)
camera = None
for addr in [caminfo['host'], caminfo['internalHost']]:
try:
camera = uvc_camera.UVCCameraClient(addr,
caminfo['username'],
'ubnt')
_LOGGER.debug('Logged into UVC camera %(name)s via %(addr)s',
dict(name=self._name, addr=addr))
except socket.error:
pass
if not camera:
_LOGGER.error('Unable to login to camera')
return None
camera.login()
return camera.get_snapshot()

View File

@@ -1,275 +0,0 @@
"""
homeassistant.components.chromecast
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides functionality to interact with Chromecasts.
"""
import logging
import homeassistant as ha
import homeassistant.util as util
import homeassistant.components as components
DOMAIN = 'chromecast'
SERVICE_YOUTUBE_VIDEO = 'play_youtube_video'
ENTITY_ID_FORMAT = DOMAIN + '.{}'
STATE_NO_APP = 'no_app'
ATTR_HOST = 'host'
ATTR_STATE = 'state'
ATTR_OPTIONS = 'options'
ATTR_MEDIA_STATE = 'media_state'
ATTR_MEDIA_CONTENT_ID = 'media_content_id'
ATTR_MEDIA_TITLE = 'media_title'
ATTR_MEDIA_ARTIST = 'media_artist'
ATTR_MEDIA_ALBUM = 'media_album'
ATTR_MEDIA_IMAGE_URL = 'media_image_url'
ATTR_MEDIA_VOLUME = 'media_volume'
ATTR_MEDIA_DURATION = 'media_duration'
MEDIA_STATE_UNKNOWN = 'unknown'
MEDIA_STATE_PLAYING = 'playing'
MEDIA_STATE_STOPPED = 'stopped'
def is_on(statemachine, entity_id=None):
""" Returns true if specified ChromeCast entity_id is on.
Will check all chromecasts if no entity_id specified. """
entity_ids = [entity_id] if entity_id \
else util.filter_entity_ids(statemachine.entity_ids, DOMAIN)
return any(not statemachine.is_state(entity_id, STATE_NO_APP)
for entity_id in entity_ids)
def turn_off(bus, entity_id=None):
""" Will turn off specified Chromecast or all. """
data = {components.ATTR_ENTITY_ID: entity_id} if entity_id else {}
bus.call_service(DOMAIN, components.SERVICE_TURN_OFF, data)
def volume_up(bus, entity_id=None):
""" Send the chromecast the command for volume up. """
data = {components.ATTR_ENTITY_ID: entity_id} if entity_id else {}
bus.call_service(DOMAIN, components.SERVICE_VOLUME_UP, data)
def volume_down(bus, entity_id=None):
""" Send the chromecast the command for volume down. """
data = {components.ATTR_ENTITY_ID: entity_id} if entity_id else {}
bus.call_service(DOMAIN, components.SERVICE_VOLUME_DOWN, data)
def media_play_pause(bus, entity_id=None):
""" Send the chromecast the command for play/pause. """
data = {components.ATTR_ENTITY_ID: entity_id} if entity_id else {}
bus.call_service(DOMAIN, components.SERVICE_MEDIA_PLAY_PAUSE, data)
def media_next_track(bus, entity_id=None):
""" Send the chromecast the command for next track. """
data = {components.ATTR_ENTITY_ID: entity_id} if entity_id else {}
bus.call_service(DOMAIN, components.SERVICE_MEDIA_NEXT_TRACK, data)
def media_prev_track(bus, entity_id=None):
""" Send the chromecast the command for prev track. """
data = {components.ATTR_ENTITY_ID: entity_id} if entity_id else {}
bus.call_service(DOMAIN, components.SERVICE_MEDIA_PREV_TRACK, data)
# pylint: disable=too-many-locals, too-many-branches
def setup(bus, statemachine):
""" Listen for chromecast events. """
logger = logging.getLogger(__name__)
try:
import pychromecast
except ImportError:
logger.exception(("Failed to import pychromecast. "
"Did you maybe not install the 'pychromecast' "
"dependency?"))
return False
logger.info("Scanning for Chromecasts")
hosts = pychromecast.discover_chromecasts()
casts = {}
for host in hosts:
try:
cast = pychromecast.PyChromecast(host)
entity_id = util.ensure_unique_string(
ENTITY_ID_FORMAT.format(
util.slugify(cast.device.friendly_name)),
casts.keys())
casts[entity_id] = cast
except pychromecast.ConnectionError:
pass
if not casts:
logger.error("Could not find Chromecasts")
return False
def update_chromecast_state(entity_id, chromecast):
""" Retrieve state of Chromecast and update statemachine. """
chromecast.refresh()
status = chromecast.app
state_attr = {ATTR_HOST: chromecast.host,
components.ATTR_FRIENDLY_NAME:
chromecast.device.friendly_name}
if status and status.app_id != pychromecast.APP_ID['HOME']:
state = status.app_id
ramp = chromecast.get_protocol(pychromecast.PROTOCOL_RAMP)
if ramp and ramp.state != pychromecast.RAMP_STATE_UNKNOWN:
if ramp.state == pychromecast.RAMP_STATE_PLAYING:
state_attr[ATTR_MEDIA_STATE] = MEDIA_STATE_PLAYING
else:
state_attr[ATTR_MEDIA_STATE] = MEDIA_STATE_STOPPED
if ramp.content_id:
state_attr[ATTR_MEDIA_CONTENT_ID] = ramp.content_id
if ramp.title:
state_attr[ATTR_MEDIA_TITLE] = ramp.title
if ramp.artist:
state_attr[ATTR_MEDIA_ARTIST] = ramp.artist
if ramp.album:
state_attr[ATTR_MEDIA_ALBUM] = ramp.album
if ramp.image_url:
state_attr[ATTR_MEDIA_IMAGE_URL] = ramp.image_url
if ramp.duration:
state_attr[ATTR_MEDIA_DURATION] = ramp.duration
state_attr[ATTR_MEDIA_VOLUME] = ramp.volume
else:
state = STATE_NO_APP
statemachine.set_state(entity_id, state, state_attr)
def update_chromecast_states(time): # pylint: disable=unused-argument
""" Updates all chromecast states. """
logger.info("Updating Chromecast status")
for entity_id, cast in casts.items():
update_chromecast_state(entity_id, cast)
def _service_to_entities(service):
""" Helper method to get entities from service. """
entity_ids = components.extract_entity_ids(statemachine, service)
if entity_ids:
for entity_id in entity_ids:
cast = casts.get(entity_id)
if cast:
yield entity_id, cast
else:
for item in casts.items():
yield item
def turn_off_service(service):
""" Service to exit any running app on the specified ChromeCast and
shows idle screen. Will quit all ChromeCasts if nothing specified.
"""
for entity_id, cast in _service_to_entities(service):
cast.quit_app()
update_chromecast_state(entity_id, cast)
def volume_up_service(service):
""" Service to send the chromecast the command for volume up. """
for _, cast in _service_to_entities(service):
ramp = cast.get_protocol(pychromecast.PROTOCOL_RAMP)
if ramp:
ramp.volume_up()
def volume_down_service(service):
""" Service to send the chromecast the command for volume down. """
for _, cast in _service_to_entities(service):
ramp = cast.get_protocol(pychromecast.PROTOCOL_RAMP)
if ramp:
ramp.volume_down()
def media_play_pause_service(service):
""" Service to send the chromecast the command for play/pause. """
for _, cast in _service_to_entities(service):
ramp = cast.get_protocol(pychromecast.PROTOCOL_RAMP)
if ramp:
ramp.playpause()
def media_next_track_service(service):
""" Service to send the chromecast the command for next track. """
for entity_id, cast in _service_to_entities(service):
ramp = cast.get_protocol(pychromecast.PROTOCOL_RAMP)
if ramp:
ramp.next()
update_chromecast_state(entity_id, cast)
def play_youtube_video_service(service, video_id):
""" Plays specified video_id on the Chromecast's YouTube channel. """
if video_id: # if service.data.get('video') returned None
for entity_id, cast in _service_to_entities(service):
pychromecast.play_youtube_video(video_id, cast.host)
update_chromecast_state(entity_id, cast)
ha.track_time_change(bus, update_chromecast_states)
bus.register_service(DOMAIN, components.SERVICE_TURN_OFF,
turn_off_service)
bus.register_service(DOMAIN, components.SERVICE_VOLUME_UP,
volume_up_service)
bus.register_service(DOMAIN, components.SERVICE_VOLUME_DOWN,
volume_down_service)
bus.register_service(DOMAIN, components.SERVICE_MEDIA_PLAY_PAUSE,
media_play_pause_service)
bus.register_service(DOMAIN, components.SERVICE_MEDIA_NEXT_TRACK,
media_next_track_service)
bus.register_service(DOMAIN, "start_fireplace",
lambda service:
play_youtube_video_service(service, "eyU3bRy2x44"))
bus.register_service(DOMAIN, "start_epic_sax",
lambda service:
play_youtube_video_service(service, "kxopViU98Xo"))
bus.register_service(DOMAIN, SERVICE_YOUTUBE_VIDEO,
lambda service:
play_youtube_video_service(service,
service.data.get('video')))
update_chromecast_states(None)
return True

View File

@@ -0,0 +1,189 @@
"""
homeassistant.components.configurator
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A component to allow pieces of code to request configuration from the user.
Initiate a request by calling the `request_config` method with a callback.
This will return a request id that has to be used for future calls.
A callback has to be provided to `request_config` which will be called when
the user has submitted configuration information.
"""
import logging
from homeassistant.helpers.entity import generate_entity_id
from homeassistant.const import EVENT_TIME_CHANGED
DOMAIN = "configurator"
ENTITY_ID_FORMAT = DOMAIN + ".{}"
SERVICE_CONFIGURE = "configure"
STATE_CONFIGURE = "configure"
STATE_CONFIGURED = "configured"
ATTR_CONFIGURE_ID = "configure_id"
ATTR_DESCRIPTION = "description"
ATTR_DESCRIPTION_IMAGE = "description_image"
ATTR_SUBMIT_CAPTION = "submit_caption"
ATTR_FIELDS = "fields"
ATTR_ERRORS = "errors"
_REQUESTS = {}
_INSTANCES = {}
_LOGGER = logging.getLogger(__name__)
# pylint: disable=too-many-arguments
def request_config(
hass, name, callback, description=None, description_image=None,
submit_caption=None, fields=None):
""" Create a new request for config.
Will return an ID to be used for sequent calls. """
instance = _get_instance(hass)
request_id = instance.request_config(
name, callback,
description, description_image, submit_caption, fields)
_REQUESTS[request_id] = instance
return request_id
def notify_errors(request_id, error):
""" Add errors to a config request. """
try:
_REQUESTS[request_id].notify_errors(request_id, error)
except KeyError:
# If request_id does not exist
pass
def request_done(request_id):
""" Mark a config request as done. """
try:
_REQUESTS.pop(request_id).request_done(request_id)
except KeyError:
# If request_id does not exist
pass
def setup(hass, config):
""" Set up Configurator. """
return True
def _get_instance(hass):
""" Get an instance per hass object. """
try:
return _INSTANCES[hass]
except KeyError:
_INSTANCES[hass] = Configurator(hass)
if DOMAIN not in hass.config.components:
hass.config.components.append(DOMAIN)
return _INSTANCES[hass]
class Configurator(object):
"""
Class to keep track of current configuration requests.
"""
def __init__(self, hass):
self.hass = hass
self._cur_id = 0
self._requests = {}
hass.services.register(
DOMAIN, SERVICE_CONFIGURE, self.handle_service_call)
# pylint: disable=too-many-arguments
def request_config(
self, name, callback,
description, description_image, submit_caption, fields):
""" Setup a request for configuration. """
entity_id = generate_entity_id(ENTITY_ID_FORMAT, name, hass=self.hass)
if fields is None:
fields = []
request_id = self._generate_unique_id()
self._requests[request_id] = (entity_id, fields, callback)
data = {
ATTR_CONFIGURE_ID: request_id,
ATTR_FIELDS: fields,
}
data.update({
key: value for key, value in [
(ATTR_DESCRIPTION, description),
(ATTR_DESCRIPTION_IMAGE, description_image),
(ATTR_SUBMIT_CAPTION, submit_caption),
] if value is not None
})
self.hass.states.set(entity_id, STATE_CONFIGURE, data)
return request_id
def notify_errors(self, request_id, error):
""" Update the state with errors. """
if not self._validate_request_id(request_id):
return
entity_id = self._requests[request_id][0]
state = self.hass.states.get(entity_id)
new_data = dict(state.attributes)
new_data[ATTR_ERRORS] = error
self.hass.states.set(entity_id, STATE_CONFIGURE, new_data)
def request_done(self, request_id):
""" Remove the config request. """
if not self._validate_request_id(request_id):
return
entity_id = self._requests.pop(request_id)[0]
# If we remove the state right away, it will not be included with
# the result fo the service call (current design limitation).
# Instead, we will set it to configured to give as feedback but delete
# it shortly after so that it is deleted when the client updates.
self.hass.states.set(entity_id, STATE_CONFIGURED)
def deferred_remove(event):
""" Remove the request state. """
self.hass.states.remove(entity_id)
self.hass.bus.listen_once(EVENT_TIME_CHANGED, deferred_remove)
def handle_service_call(self, call):
""" Handle a configure service call. """
request_id = call.data.get(ATTR_CONFIGURE_ID)
if not self._validate_request_id(request_id):
return
# pylint: disable=unused-variable
entity_id, fields, callback = self._requests[request_id]
# field validation goes here?
callback(call.data.get(ATTR_FIELDS, {}))
def _generate_unique_id(self):
""" Generates a unique configurator id. """
self._cur_id += 1
return "{}-{}".format(id(self), self._cur_id)
def _validate_request_id(self, request_id):
""" Validate that the request belongs to this instance. """
return request_id in self._requests

View File

@@ -0,0 +1,77 @@
"""
homeassistant.components.conversation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides functionality to have conversations with Home Assistant.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/conversation/
"""
import logging
import re
from homeassistant import core
from homeassistant.const import (
ATTR_ENTITY_ID, SERVICE_TURN_ON, SERVICE_TURN_OFF)
DOMAIN = "conversation"
SERVICE_PROCESS = "process"
ATTR_TEXT = "text"
REGEX_TURN_COMMAND = re.compile(r'turn (?P<name>(?: |\w)+) (?P<command>\w+)')
REQUIREMENTS = ['fuzzywuzzy==0.8.0']
def setup(hass, config):
""" Registers the process service. """
from fuzzywuzzy import process as fuzzyExtract
logger = logging.getLogger(__name__)
def process(service):
""" Parses text into commands for Home Assistant. """
if ATTR_TEXT not in service.data:
logger.error("Received process service call without a text")
return
text = service.data[ATTR_TEXT].lower()
match = REGEX_TURN_COMMAND.match(text)
if not match:
logger.error("Unable to process: %s", text)
return
name, command = match.groups()
entities = {state.entity_id: state.name for state in hass.states.all()}
entity_ids = fuzzyExtract.extractOne(name,
entities,
score_cutoff=65)[2]
if not entity_ids:
logger.error(
"Could not find entity id %s from text %s", name, text)
return
if command == 'on':
hass.services.call(core.DOMAIN, SERVICE_TURN_ON, {
ATTR_ENTITY_ID: entity_ids,
}, blocking=True)
elif command == 'off':
hass.services.call(core.DOMAIN, SERVICE_TURN_OFF, {
ATTR_ENTITY_ID: entity_ids,
}, blocking=True)
else:
logger.error(
'Got unsupported command %s from text %s', command, text)
hass.services.register(DOMAIN, SERVICE_PROCESS, process)
return True

View File

@@ -0,0 +1,143 @@
"""
homeassistant.components.demo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sets up a demo environment that mimics interaction with devices.
"""
import time
import homeassistant.core as ha
import homeassistant.bootstrap as bootstrap
import homeassistant.loader as loader
from homeassistant.const import (
CONF_PLATFORM, ATTR_ENTITY_ID)
DOMAIN = "demo"
DEPENDENCIES = ['conversation', 'introduction', 'zone']
COMPONENTS_WITH_DEMO_PLATFORM = [
'alarm_control_panel',
'binary_sensor',
'camera',
'device_tracker',
'garage_door',
'light',
'lock',
'media_player',
'notify',
'rollershutter',
'sensor',
'switch',
'thermostat',
]
def setup(hass, config):
""" Setup a demo environment. """
group = loader.get_component('group')
configurator = loader.get_component('configurator')
config.setdefault(ha.DOMAIN, {})
config.setdefault(DOMAIN, {})
if config[DOMAIN].get('hide_demo_state') != 1:
hass.states.set('a.Demo_Mode', 'Enabled')
# Setup sun
if not hass.config.latitude:
hass.config.latitude = 32.87336
if not hass.config.longitude:
hass.config.longitude = 117.22743
bootstrap.setup_component(hass, 'sun')
# Setup demo platforms
demo_config = config.copy()
for component in COMPONENTS_WITH_DEMO_PLATFORM:
demo_config[component] = {CONF_PLATFORM: 'demo'}
bootstrap.setup_component(hass, component, demo_config)
# Setup room groups
lights = sorted(hass.states.entity_ids('light'))
switches = sorted(hass.states.entity_ids('switch'))
media_players = sorted(hass.states.entity_ids('media_player'))
group.Group(hass, 'living room', [
lights[2], lights[1], switches[0], media_players[1],
'scene.romantic_lights'])
group.Group(hass, 'bedroom', [lights[0], switches[1],
media_players[0]])
group.Group(hass, 'Rooms', [
'group.living_room', 'group.bedroom',
'scene.romantic_lights', 'rollershutter.kitchen_window',
'rollershutter.living_room_window',
], view=True)
# Setup scripts
bootstrap.setup_component(
hass, 'script',
{'script': {
'demo': {
'alias': 'Toggle {}'.format(lights[0].split('.')[1]),
'sequence': [{
'execute_service': 'light.turn_off',
'service_data': {ATTR_ENTITY_ID: lights[0]}
}, {
'delay': {'seconds': 5}
}, {
'execute_service': 'light.turn_on',
'service_data': {ATTR_ENTITY_ID: lights[0]}
}, {
'delay': {'seconds': 5}
}, {
'execute_service': 'light.turn_off',
'service_data': {ATTR_ENTITY_ID: lights[0]}
}]
}}})
# Setup scenes
bootstrap.setup_component(
hass, 'scene',
{'scene': [
{'name': 'Romantic lights',
'entities': {
lights[0]: True,
lights[1]: {'state': 'on', 'xy_color': [0.33, 0.66],
'brightness': 200},
}},
{'name': 'Switch on and off',
'entities': {
switches[0]: True,
switches[1]: False,
}},
]})
# Setup configurator
configurator_ids = []
def hue_configuration_callback(data):
""" Fake callback, mark config as done. """
time.sleep(2)
# First time it is called, pretend it failed.
if len(configurator_ids) == 1:
configurator.notify_errors(
configurator_ids[0],
"Failed to register, please try again.")
configurator_ids.append(0)
else:
configurator.request_done(configurator_ids[0])
request_id = configurator.request_config(
hass, "Philips Hue", hue_configuration_callback,
description=("Press the button on the bridge to register Philips Hue "
"with Home Assistant."),
description_image="/static/images/config_philips_hue.jpg",
submit_caption="I have pressed the button"
)
configurator_ids.append(request_id)
return True

View File

@@ -1,35 +1,51 @@
"""
homeassistant.components.device_sun_light_trigger
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides functionality to turn on lights based on the state of the sun and
devices.
Provides functionality to turn on lights based on
the state of the sun and devices.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/device_sun_light_trigger/
"""
import logging
from datetime import datetime, timedelta
from datetime import timedelta
import homeassistant as ha
import homeassistant.util as util
import homeassistant.components as components
from homeassistant.helpers.event import track_point_in_time, track_state_change
import homeassistant.util.dt as dt_util
from homeassistant.const import STATE_HOME, STATE_NOT_HOME
from . import light, sun, device_tracker, group
DOMAIN = "device_sun_light_trigger"
DEPENDENCIES = ['light', 'device_tracker', 'group', 'sun']
LIGHT_TRANSITION_TIME = timedelta(minutes=15)
# Light profile to be used if none given
LIGHT_PROFILE = 'relax'
CONF_LIGHT_PROFILE = 'light_profile'
CONF_LIGHT_GROUP = 'light_group'
CONF_DEVICE_GROUP = 'device_group'
# pylint: disable=too-many-branches
def setup(bus, statemachine,
light_group=light.GROUP_NAME_ALL_LIGHTS,
light_profile=LIGHT_PROFILE):
def setup(hass, config):
""" Triggers to turn lights on or off based on device precense. """
disable_turn_off = 'disable_turn_off' in config[DOMAIN]
light_group = config[DOMAIN].get(CONF_LIGHT_GROUP,
light.ENTITY_ID_ALL_LIGHTS)
light_profile = config[DOMAIN].get(CONF_LIGHT_PROFILE, LIGHT_PROFILE)
device_group = config[DOMAIN].get(CONF_DEVICE_GROUP,
device_tracker.ENTITY_ID_ALL_DEVICES)
logger = logging.getLogger(__name__)
device_entity_ids = util.filter_entity_ids(statemachine.entity_ids,
device_tracker.DOMAIN)
device_entity_ids = group.get_entity_ids(hass, device_group,
device_tracker.DOMAIN)
if not device_entity_ids:
logger.error("No devices found to track")
@@ -37,8 +53,7 @@ def setup(bus, statemachine,
return False
# Get the light IDs from the specified group
light_ids = util.filter_entity_ids(
group.get_entity_ids(statemachine, light_group), light.DOMAIN)
light_ids = group.get_entity_ids(hass, light_group, light.DOMAIN)
if not light_ids:
logger.error("No lights found to turn on ")
@@ -48,14 +63,13 @@ def setup(bus, statemachine,
def calc_time_for_light_when_sunset():
""" Calculates the time when to start fading lights in when sun sets.
Returns None if no next_setting data available. """
next_setting = sun.next_setting(statemachine)
next_setting = sun.next_setting(hass)
if next_setting:
return (next_setting - LIGHT_TRANSITION_TIME * len(light_ids))
return next_setting - LIGHT_TRANSITION_TIME * len(light_ids)
else:
return None
# pylint: disable=unused-argument
def schedule_light_on_sun_rise(entity, old_state, new_state):
"""The moment sun sets we want to have all the lights on.
We will schedule to have each light start after one another
@@ -64,10 +78,9 @@ def setup(bus, statemachine,
def turn_light_on_before_sunset(light_id):
""" Helper function to turn on lights slowly if there
are devices home and the light is not on yet. """
if (device_tracker.is_on(statemachine) and
not light.is_on(statemachine, light_id)):
if device_tracker.is_on(hass) and not light.is_on(hass, light_id):
light.turn_on(bus, light_id,
light.turn_on(hass, light_id,
transition=LIGHT_TRANSITION_TIME.seconds,
profile=light_profile)
@@ -81,58 +94,55 @@ def setup(bus, statemachine,
if start_point:
for index, light_id in enumerate(light_ids):
ha.track_point_in_time(bus, turn_on(light_id),
(start_point +
index * LIGHT_TRANSITION_TIME))
track_point_in_time(
hass, turn_on(light_id),
(start_point + index * LIGHT_TRANSITION_TIME))
# Track every time sun rises so we can schedule a time-based
# pre-sun set event
ha.track_state_change(bus, sun.ENTITY_ID,
schedule_light_on_sun_rise,
sun.STATE_BELOW_HORIZON, sun.STATE_ABOVE_HORIZON)
track_state_change(hass, sun.ENTITY_ID, schedule_light_on_sun_rise,
sun.STATE_BELOW_HORIZON, sun.STATE_ABOVE_HORIZON)
# If the sun is already above horizon
# schedule the time-based pre-sun set event
if sun.is_on(statemachine):
if sun.is_on(hass):
schedule_light_on_sun_rise(None, None, None)
def check_light_on_dev_state_change(entity, old_state, new_state):
""" Function to handle tracked device state changes. """
lights_are_on = group.is_on(statemachine, light_group)
lights_are_on = group.is_on(hass, light_group)
light_needed = not (lights_are_on or sun.is_on(statemachine))
light_needed = not (lights_are_on or sun.is_on(hass))
# Specific device came home ?
if (entity != device_tracker.ENTITY_ID_ALL_DEVICES and
new_state.state == components.STATE_HOME):
if entity != device_tracker.ENTITY_ID_ALL_DEVICES and \
new_state.state == STATE_HOME:
# These variables are needed for the elif check
now = datetime.now()
now = dt_util.now()
start_point = calc_time_for_light_when_sunset()
# Do we need lights?
if light_needed:
logger.info(
"Home coming event for {}. Turning lights on".
format(entity))
"Home coming event for %s. Turning lights on", entity)
light.turn_on(bus, light_ids,
profile=light_profile)
light.turn_on(hass, light_ids, profile=light_profile)
# Are we in the time span were we would turn on the lights
# if someone would be home?
# Check this by seeing if current time is later then the point
# in time when we would start putting the lights on.
elif (start_point and
start_point < now < sun.next_setting(statemachine)):
start_point < now < sun.next_setting(hass)):
# Check for every light if it would be on if someone was home
# when the fading in started and turn it on if so
for index, light_id in enumerate(light_ids):
if now > start_point + index * LIGHT_TRANSITION_TIME:
light.turn_on(bus, light_id)
light.turn_on(hass, light_id)
else:
# If this light didn't happen to be turned on yet so
@@ -140,22 +150,23 @@ def setup(bus, statemachine,
break
# Did all devices leave the house?
elif (entity == device_tracker.ENTITY_ID_ALL_DEVICES and
new_state.state == components.STATE_NOT_HOME and lights_are_on):
elif (entity == device_group and
new_state.state == STATE_NOT_HOME and lights_are_on and
not disable_turn_off):
logger.info(
"Everyone has left but there are devices on. Turning them off")
"Everyone has left but there are lights on. Turning them off")
light.turn_off(bus)
light.turn_off(hass, light_ids)
# Track home coming of each seperate device
for entity in device_entity_ids:
ha.track_state_change(bus, entity, check_light_on_dev_state_change,
components.STATE_NOT_HOME, components.STATE_HOME)
# Track home coming of each device
track_state_change(
hass, device_entity_ids, check_light_on_dev_state_change,
STATE_NOT_HOME, STATE_HOME)
# Track when all devices are gone to shut down lights
ha.track_state_change(bus, device_tracker.ENTITY_ID_ALL_DEVICES,
check_light_on_dev_state_change,
components.STATE_HOME, components.STATE_NOT_HOME)
track_state_change(
hass, device_group, check_light_on_dev_state_change,
STATE_HOME, STATE_NOT_HOME)
return True

View File

@@ -1,458 +0,0 @@
"""
homeassistant.components.tracker
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides functionality to keep track of devices.
"""
import logging
import threading
import os
import csv
import re
import json
from datetime import datetime, timedelta
import requests
import homeassistant as ha
import homeassistant.util as util
import homeassistant.components as components
from homeassistant.components import group
DOMAIN = "device_tracker"
SERVICE_DEVICE_TRACKER_RELOAD = "reload_devices_csv"
GROUP_NAME_ALL_DEVICES = 'all_tracked_devices'
ENTITY_ID_ALL_DEVICES = group.ENTITY_ID_FORMAT.format(
GROUP_NAME_ALL_DEVICES)
ENTITY_ID_FORMAT = DOMAIN + '.{}'
# After how much time do we consider a device not home if
# it does not show up on scans
TIME_SPAN_FOR_ERROR_IN_SCANNING = timedelta(minutes=3)
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
# Filename to save known devices to
KNOWN_DEVICES_FILE = "known_devices.csv"
def is_on(statemachine, entity_id=None):
""" Returns if any or specified device is home. """
entity = entity_id or ENTITY_ID_ALL_DEVICES
return statemachine.is_state(entity, components.STATE_HOME)
# pylint: disable=too-many-instance-attributes
class DeviceTracker(object):
""" Class that tracks which devices are home and which are not. """
def __init__(self, bus, statemachine, device_scanner, error_scanning=None):
self.statemachine = statemachine
self.bus = bus
self.device_scanner = device_scanner
self.error_scanning = error_scanning or TIME_SPAN_FOR_ERROR_IN_SCANNING
self.logger = logging.getLogger(__name__)
self.lock = threading.Lock()
# Dictionary to keep track of known devices and devices we track
self.known_devices = {}
# Did we encounter an invalid known devices file
self.invalid_known_devices_file = False
self._read_known_devices_file()
# Wrap it in a func instead of lambda so it can be identified in
# the bus by its __name__ attribute.
def update_device_state(time): # pylint: disable=unused-argument
""" Triggers update of the device states. """
self.update_devices()
ha.track_time_change(bus, update_device_state)
bus.register_service(DOMAIN,
SERVICE_DEVICE_TRACKER_RELOAD,
lambda service: self._read_known_devices_file())
self.update_devices()
group.setup(bus, statemachine, GROUP_NAME_ALL_DEVICES,
list(self.device_entity_ids))
@property
def device_entity_ids(self):
""" Returns a set containing all device entity ids
that are being tracked. """
return set([self.known_devices[device]['entity_id'] for device
in self.known_devices
if self.known_devices[device]['track']])
def update_devices(self, found_devices=None):
""" Update device states based on the found devices. """
self.lock.acquire()
found_devices = found_devices or self.device_scanner.scan_devices()
now = datetime.now()
known_dev = self.known_devices
temp_tracking_devices = [device for device in known_dev
if known_dev[device]['track']]
for device in found_devices:
# Are we tracking this device?
if device in temp_tracking_devices:
temp_tracking_devices.remove(device)
known_dev[device]['last_seen'] = now
self.statemachine.set_state(
known_dev[device]['entity_id'], components.STATE_HOME)
# For all devices we did not find, set state to NH
# But only if they have been gone for longer then the error time span
# Because we do not want to have stuff happening when the device does
# not show up for 1 scan beacuse of reboot etc
for device in temp_tracking_devices:
if (now - known_dev[device]['last_seen'] > self.error_scanning):
self.statemachine.set_state(known_dev[device]['entity_id'],
components.STATE_NOT_HOME)
# If we come along any unknown devices we will write them to the
# known devices file but only if we did not encounter an invalid
# known devices file
if not self.invalid_known_devices_file:
unknown_devices = [device for device in found_devices
if device not in known_dev]
if unknown_devices:
try:
# If file does not exist we will write the header too
is_new_file = not os.path.isfile(KNOWN_DEVICES_FILE)
with open(KNOWN_DEVICES_FILE, 'a') as outp:
self.logger.info((
"DeviceTracker:Found {} new devices,"
" updating {}").format(len(unknown_devices),
KNOWN_DEVICES_FILE))
writer = csv.writer(outp)
if is_new_file:
writer.writerow(("device", "name", "track"))
for device in unknown_devices:
# See if the device scanner knows the name
# else defaults to unknown device
name = (self.device_scanner.get_device_name(device)
or "unknown_device")
writer.writerow((device, name, 0))
known_dev[device] = {'name': name,
'track': False}
except IOError:
self.logger.exception((
"DeviceTracker:Error updating {}"
"with {} new devices").format(
KNOWN_DEVICES_FILE, len(unknown_devices)))
self.lock.release()
def _read_known_devices_file(self):
""" Parse and process the known devices file. """
# Read known devices if file exists
if os.path.isfile(KNOWN_DEVICES_FILE):
self.lock.acquire()
known_devices = {}
with open(KNOWN_DEVICES_FILE) as inp:
default_last_seen = datetime(1990, 1, 1)
# Temp variable to keep track of which entity ids we use
# so we can ensure we have unique entity ids.
used_entity_ids = []
try:
for row in csv.DictReader(inp):
device = row['device']
row['track'] = True if row['track'] == '1' else False
# If we track this device setup tracking variables
if row['track']:
row['last_seen'] = default_last_seen
# Make sure that each device is mapped
# to a unique entity_id name
name = util.slugify(row['name']) if row['name'] \
else "unnamed_device"
entity_id = ENTITY_ID_FORMAT.format(name)
tries = 1
while entity_id in used_entity_ids:
tries += 1
suffix = "_{}".format(tries)
entity_id = ENTITY_ID_FORMAT.format(
name + suffix)
row['entity_id'] = entity_id
used_entity_ids.append(entity_id)
known_devices[device] = row
if not known_devices:
self.logger.warning(
"No devices to track. Please update {}.".format(
KNOWN_DEVICES_FILE))
# Remove entities that are no longer maintained
new_entity_ids = set([known_devices[device]['entity_id']
for device in known_devices
if known_devices[device]['track']])
for entity_id in \
self.device_entity_ids - new_entity_ids:
self.logger.info(
"DeviceTracker:Removing entity {}".format(
entity_id))
self.statemachine.remove_entity(entity_id)
# File parsed, warnings given if necessary
# entities cleaned up, make it available
self.known_devices = known_devices
self.logger.info(
"DeviceTracker:Loaded devices from {}".format(
KNOWN_DEVICES_FILE))
except KeyError:
self.invalid_known_devices_file = True
self.logger.warning((
"Invalid {} found. "
"We won't update it with new found devices.").
format(KNOWN_DEVICES_FILE))
finally:
self.lock.release()
class TomatoDeviceScanner(object):
""" This class queries a wireless router running Tomato firmware
for connected devices.
A description of the Tomato API can be found on
http://paulusschoutsen.nl/blog/2013/10/tomato-api-documentation/
"""
def __init__(self, host, username, password, http_id):
self.req = requests.Request('POST',
'http://{}/update.cgi'.format(host),
data={'_http_id': http_id,
'exec': 'devlist'},
auth=requests.auth.HTTPBasicAuth(
username, password)).prepare()
self.parse_api_pattern = re.compile(r"(?P<param>\w*) = (?P<value>.*);")
self.logger = logging.getLogger(__name__)
self.lock = threading.Lock()
self.date_updated = None
self.last_results = {"wldev": [], "dhcpd_lease": []}
self.success_init = self._update_tomato_info()
def scan_devices(self):
""" Scans for new devices and return a
list containing found device ids. """
self._update_tomato_info()
return [item[1] for item in self.last_results['wldev']]
def get_device_name(self, device):
""" Returns the name of the given device or None if we don't know. """
# Make sure there are results
if not self.date_updated:
self._update_tomato_info()
filter_named = [item[0] for item in self.last_results['dhcpd_lease']
if item[2] == device]
if not filter_named or not filter_named[0]:
return None
else:
return filter_named[0]
def _update_tomato_info(self):
""" Ensures the information from the Tomato router is up to date.
Returns boolean if scanning successful. """
self.lock.acquire()
# if date_updated is None or the date is too old we scan for new data
if (not self.date_updated or datetime.now() - self.date_updated >
MIN_TIME_BETWEEN_SCANS):
self.logger.info("Tomato:Scanning")
try:
response = requests.Session().send(self.req, timeout=3)
# Calling and parsing the Tomato api here. We only need the
# wldev and dhcpd_lease values. For API description see:
# http://paulusschoutsen.nl/
# blog/2013/10/tomato-api-documentation/
if response.status_code == 200:
for param, value in \
self.parse_api_pattern.findall(response.text):
if param == 'wldev' or param == 'dhcpd_lease':
self.last_results[param] = \
json.loads(value.replace("'", '"'))
self.date_updated = datetime.now()
return True
elif response.status_code == 401:
# Authentication error
self.logger.exception((
"Tomato:Failed to authenticate, "
"please check your username and password"))
return False
except requests.exceptions.ConnectionError:
# We get this if we could not connect to the router or
# an invalid http_id was supplied
self.logger.exception((
"Tomato:Failed to connect to the router"
" or invalid http_id supplied"))
return False
except requests.exceptions.Timeout:
# We get this if we could not connect to the router or
# an invalid http_id was supplied
self.logger.exception(
"Tomato:Connection to the router timed out")
return False
except ValueError:
# If json decoder could not parse the response
self.logger.exception(
"Tomato:Failed to parse response from router")
return False
finally:
self.lock.release()
else:
# We acquired the lock before the IF check,
# release it before we return True
self.lock.release()
return True
class NetgearDeviceScanner(object):
""" This class queries a Netgear wireless router using the SOAP-api. """
def __init__(self, host, username, password):
self.logger = logging.getLogger(__name__)
self.date_updated = None
self.last_results = []
try:
import homeassistant.external.pynetgear as pynetgear
except ImportError:
self.logger.exception(
("Netgear:Failed to import pynetgear. "
"Did you maybe not cloned the git submodules?"))
self.success_init = False
return
self._api = pynetgear.Netgear(host, username, password)
self.lock = threading.Lock()
self.logger.info("Netgear:Logging in")
if self._api.login():
self.success_init = True
self._update_info()
else:
self.logger.error("Netgear:Failed to Login")
self.success_init = False
def scan_devices(self):
""" Scans for new devices and return a
list containing found device ids. """
self._update_info()
return [device.mac for device in self.last_results]
def get_device_name(self, mac):
""" Returns the name of the given device or None if we don't know. """
# Make sure there are results
if not self.date_updated:
self._update_info()
filter_named = [device.name for device in self.last_results
if device.mac == mac]
if filter_named:
return filter_named[0]
else:
return None
def _update_info(self):
""" Retrieves latest information from the Netgear router.
Returns boolean if scanning successful. """
if not self.success_init:
return
with self.lock:
# if date_updated is None or the date is too old we scan for
# new data
if (not self.date_updated or datetime.now() - self.date_updated >
MIN_TIME_BETWEEN_SCANS):
self.logger.info("Netgear:Scanning")
self.last_results = self._api.get_attached_devices()
self.date_updated = datetime.now()
return
else:
return

View File

@@ -0,0 +1,433 @@
"""
homeassistant.components.device_tracker
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides functionality to keep track of devices.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/device_tracker/
"""
# pylint: disable=too-many-instance-attributes, too-many-arguments
# pylint: disable=too-many-locals
import csv
from datetime import timedelta
import logging
import os
import threading
from homeassistant.bootstrap import prepare_setup_platform
from homeassistant.components import discovery, group, zone
from homeassistant.config import load_yaml_config_file
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import config_per_platform
from homeassistant.helpers.entity import Entity
import homeassistant.util as util
import homeassistant.util.dt as dt_util
from homeassistant.helpers.event import track_utc_time_change
from homeassistant.const import (
ATTR_ENTITY_PICTURE, ATTR_GPS_ACCURACY, ATTR_LATITUDE, ATTR_LONGITUDE,
DEVICE_DEFAULT_NAME, STATE_HOME, STATE_NOT_HOME)
DOMAIN = "device_tracker"
DEPENDENCIES = ['zone']
GROUP_NAME_ALL_DEVICES = 'all devices'
ENTITY_ID_ALL_DEVICES = group.ENTITY_ID_FORMAT.format('all_devices')
ENTITY_ID_FORMAT = DOMAIN + '.{}'
CSV_DEVICES = "known_devices.csv"
YAML_DEVICES = 'known_devices.yaml'
CONF_TRACK_NEW = "track_new_devices"
DEFAULT_CONF_TRACK_NEW = True
CONF_CONSIDER_HOME = 'consider_home'
DEFAULT_CONSIDER_HOME = 180 # seconds
CONF_SCAN_INTERVAL = "interval_seconds"
DEFAULT_SCAN_INTERVAL = 12
CONF_AWAY_HIDE = 'hide_if_away'
DEFAULT_AWAY_HIDE = False
CONF_HOME_RANGE = 'home_range'
DEFAULT_HOME_RANGE = 100
SERVICE_SEE = 'see'
ATTR_MAC = 'mac'
ATTR_DEV_ID = 'dev_id'
ATTR_HOST_NAME = 'host_name'
ATTR_LOCATION_NAME = 'location_name'
ATTR_GPS = 'gps'
ATTR_BATTERY = 'battery'
DISCOVERY_PLATFORMS = {
discovery.SERVICE_NETGEAR: 'netgear',
}
_LOGGER = logging.getLogger(__name__)
# pylint: disable=too-many-arguments
def is_on(hass, entity_id=None):
""" Returns if any or specified device is home. """
entity = entity_id or ENTITY_ID_ALL_DEVICES
return hass.states.is_state(entity, STATE_HOME)
def see(hass, mac=None, dev_id=None, host_name=None, location_name=None,
gps=None, gps_accuracy=None, battery=None):
""" Call service to notify you see device. """
data = {key: value for key, value in
((ATTR_MAC, mac),
(ATTR_DEV_ID, dev_id),
(ATTR_HOST_NAME, host_name),
(ATTR_LOCATION_NAME, location_name),
(ATTR_GPS, gps)) if value is not None}
hass.services.call(DOMAIN, SERVICE_SEE, data)
def setup(hass, config):
""" Setup device tracker """
yaml_path = hass.config.path(YAML_DEVICES)
csv_path = hass.config.path(CSV_DEVICES)
if os.path.isfile(csv_path) and not os.path.isfile(yaml_path) and \
convert_csv_config(csv_path, yaml_path):
os.remove(csv_path)
conf = config.get(DOMAIN, {})
if isinstance(conf, list):
conf = conf[0]
consider_home = timedelta(
seconds=util.convert(conf.get(CONF_CONSIDER_HOME), int,
DEFAULT_CONSIDER_HOME))
track_new = util.convert(conf.get(CONF_TRACK_NEW), bool,
DEFAULT_CONF_TRACK_NEW)
home_range = util.convert(conf.get(CONF_HOME_RANGE), int,
DEFAULT_HOME_RANGE)
devices = load_config(yaml_path, hass, consider_home, home_range)
tracker = DeviceTracker(hass, consider_home, track_new, home_range,
devices)
def setup_platform(p_type, p_config, disc_info=None):
""" Setup a device tracker platform. """
platform = prepare_setup_platform(hass, config, DOMAIN, p_type)
if platform is None:
return
try:
if hasattr(platform, 'get_scanner'):
scanner = platform.get_scanner(hass, {DOMAIN: p_config})
if scanner is None:
_LOGGER.error('Error setting up platform %s', p_type)
return
setup_scanner_platform(hass, p_config, scanner, tracker.see)
return
if not platform.setup_scanner(hass, p_config, tracker.see):
_LOGGER.error('Error setting up platform %s', p_type)
except Exception: # pylint: disable=broad-except
_LOGGER.exception('Error setting up platform %s', p_type)
for p_type, p_config in \
config_per_platform(config, DOMAIN, _LOGGER):
setup_platform(p_type, p_config)
def device_tracker_discovered(service, info):
""" Called when a device tracker platform is discovered. """
setup_platform(DISCOVERY_PLATFORMS[service], {}, info)
discovery.listen(hass, DISCOVERY_PLATFORMS.keys(),
device_tracker_discovered)
def update_stale(now):
""" Clean up stale devices. """
tracker.update_stale(now)
track_utc_time_change(hass, update_stale, second=range(0, 60, 5))
tracker.setup_group()
def see_service(call):
""" Service to see a device. """
args = {key: value for key, value in call.data.items() if key in
(ATTR_MAC, ATTR_DEV_ID, ATTR_HOST_NAME, ATTR_LOCATION_NAME,
ATTR_GPS, ATTR_GPS_ACCURACY, ATTR_BATTERY)}
tracker.see(**args)
descriptions = load_yaml_config_file(
os.path.join(os.path.dirname(__file__), 'services.yaml'))
hass.services.register(DOMAIN, SERVICE_SEE, see_service,
descriptions.get(SERVICE_SEE))
return True
class DeviceTracker(object):
""" Track devices """
def __init__(self, hass, consider_home, track_new, home_range, devices):
self.hass = hass
self.devices = {dev.dev_id: dev for dev in devices}
self.mac_to_dev = {dev.mac: dev for dev in devices if dev.mac}
self.consider_home = consider_home
self.track_new = track_new
self.home_range = home_range
self.lock = threading.Lock()
for device in devices:
if device.track:
device.update_ha_state()
self.group = None
def see(self, mac=None, dev_id=None, host_name=None, location_name=None,
gps=None, gps_accuracy=None, battery=None):
""" Notify device tracker that you see a device. """
with self.lock:
if mac is None and dev_id is None:
raise HomeAssistantError('Neither mac or device id passed in')
elif mac is not None:
mac = mac.upper()
device = self.mac_to_dev.get(mac)
if not device:
dev_id = util.slugify(host_name or '') or util.slugify(mac)
else:
dev_id = str(dev_id).lower()
device = self.devices.get(dev_id)
if device:
device.seen(host_name, location_name, gps, gps_accuracy,
battery)
if device.track:
device.update_ha_state()
return
# If no device can be found, create it
device = Device(
self.hass, self.consider_home, self.home_range, self.track_new,
dev_id, mac, (host_name or dev_id).replace('_', ' '))
self.devices[dev_id] = device
if mac is not None:
self.mac_to_dev[mac] = device
device.seen(host_name, location_name, gps, gps_accuracy, battery)
if device.track:
device.update_ha_state()
# During init, we ignore the group
if self.group is not None:
self.group.update_tracked_entity_ids(
list(self.group.tracking) + [device.entity_id])
update_config(self.hass.config.path(YAML_DEVICES), dev_id, device)
def setup_group(self):
""" Initializes group for all tracked devices. """
entity_ids = (dev.entity_id for dev in self.devices.values()
if dev.track)
self.group = group.Group(
self.hass, GROUP_NAME_ALL_DEVICES, entity_ids, False)
def update_stale(self, now):
""" Update stale devices. """
with self.lock:
for device in self.devices.values():
if (device.track and device.last_update_home and
device.stale(now)):
device.update_ha_state(True)
class Device(Entity):
""" Tracked device. """
host_name = None
location_name = None
gps = None
gps_accuracy = 0
last_seen = None
battery = None
# Track if the last update of this device was HOME
last_update_home = False
_state = STATE_NOT_HOME
def __init__(self, hass, consider_home, home_range, track, dev_id, mac,
name=None, picture=None, away_hide=False):
self.hass = hass
self.entity_id = ENTITY_ID_FORMAT.format(dev_id)
# Timedelta object how long we consider a device home if it is not
# detected anymore.
self.consider_home = consider_home
# Distance in meters
self.home_range = home_range
# Device ID
self.dev_id = dev_id
self.mac = mac
# If we should track this device
self.track = track
# Configured name
self.config_name = name
# Configured picture
self.config_picture = picture
self.away_hide = away_hide
@property
def gps_home(self):
""" Return if device is within range of home. """
distance = max(
0, self.hass.config.distance(*self.gps) - self.gps_accuracy)
return self.gps is not None and distance <= self.home_range
@property
def name(self):
""" Returns the name of the entity. """
return self.config_name or self.host_name or DEVICE_DEFAULT_NAME
@property
def state(self):
""" State of the device. """
return self._state
@property
def state_attributes(self):
""" Device state attributes. """
attr = {}
if self.config_picture:
attr[ATTR_ENTITY_PICTURE] = self.config_picture
if self.gps:
attr[ATTR_LATITUDE] = self.gps[0]
attr[ATTR_LONGITUDE] = self.gps[1]
attr[ATTR_GPS_ACCURACY] = self.gps_accuracy
if self.battery:
attr[ATTR_BATTERY] = self.battery
return attr
@property
def hidden(self):
""" If device should be hidden. """
return self.away_hide and self.state != STATE_HOME
def seen(self, host_name=None, location_name=None, gps=None,
gps_accuracy=0, battery=None):
""" Mark the device as seen. """
self.last_seen = dt_util.utcnow()
self.host_name = host_name
self.location_name = location_name
self.gps_accuracy = gps_accuracy or 0
self.battery = battery
if gps is None:
self.gps = None
else:
try:
self.gps = tuple(float(val) for val in gps)
except ValueError:
_LOGGER.warning('Could not parse gps value for %s: %s',
self.dev_id, gps)
self.gps = None
self.update()
def stale(self, now=None):
""" Return if device state is stale. """
return self.last_seen and \
(now or dt_util.utcnow()) - self.last_seen > self.consider_home
def update(self):
""" Update state of entity. """
if not self.last_seen:
return
elif self.location_name:
self._state = self.location_name
elif self.gps is not None:
zone_state = zone.active_zone(self.hass, self.gps[0], self.gps[1],
self.gps_accuracy)
if zone_state is None:
self._state = STATE_NOT_HOME
elif zone_state.entity_id == zone.ENTITY_ID_HOME:
self._state = STATE_HOME
else:
self._state = zone_state.name
elif self.stale():
self._state = STATE_NOT_HOME
self.last_update_home = False
else:
self._state = STATE_HOME
self.last_update_home = True
def convert_csv_config(csv_path, yaml_path):
""" Convert CSV config file format to YAML. """
used_ids = set()
with open(csv_path) as inp:
for row in csv.DictReader(inp):
dev_id = util.ensure_unique_string(
(util.slugify(row['name']) or DEVICE_DEFAULT_NAME).lower(),
used_ids)
used_ids.add(dev_id)
device = Device(None, None, None, row['track'] == '1', dev_id,
row['device'], row['name'], row['picture'])
update_config(yaml_path, dev_id, device)
return True
def load_config(path, hass, consider_home, home_range):
""" Load devices from YAML config file. """
if not os.path.isfile(path):
return []
return [
Device(hass, consider_home, home_range, device.get('track', False),
str(dev_id).lower(), str(device.get('mac')).upper(),
device.get('name'), device.get('picture'),
device.get(CONF_AWAY_HIDE, DEFAULT_AWAY_HIDE))
for dev_id, device in load_yaml_config_file(path).items()]
def setup_scanner_platform(hass, config, scanner, see_device):
""" Helper method to connect scanner-based platform to device tracker. """
interval = util.convert(config.get(CONF_SCAN_INTERVAL), int,
DEFAULT_SCAN_INTERVAL)
# Initial scan of each mac we also tell about host name for config
seen = set()
def device_tracker_scan(now):
""" Called when interval matches. """
for mac in scanner.scan_devices():
if mac in seen:
host_name = None
else:
host_name = scanner.get_device_name(mac)
seen.add(mac)
see_device(mac=mac, host_name=host_name)
track_utc_time_change(hass, device_tracker_scan, second=range(0, 60,
interval))
device_tracker_scan(None)
def update_config(path, dev_id, device):
""" Add device to YAML config file. """
with open(path, 'a') as out:
out.write('\n')
out.write('{}:\n'.format(device.dev_id))
for key, value in (('name', device.name), ('mac', device.mac),
('picture', device.config_picture),
('track', 'yes' if device.track else 'no'),
(CONF_AWAY_HIDE,
'yes' if device.away_hide else 'no')):
out.write(' {}: {}\n'.format(key, '' if value is None else value))

View File

@@ -0,0 +1,134 @@
"""
homeassistant.components.device_tracker.actiontec
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning an Actiontec MI424WR
(Verizon FIOS) router for device presence.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.actiontec/
"""
import logging
from datetime import timedelta
from collections import namedtuple
import re
import threading
import telnetlib
import homeassistant.util.dt as dt_util
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
_LOGGER = logging.getLogger(__name__)
_LEASES_REGEX = re.compile(
r'(?P<ip>([0-9]{1,3}[\.]){3}[0-9]{1,3})' +
r'\smac:\s(?P<mac>([0-9a-f]{2}[:-]){5}([0-9a-f]{2}))' +
r'\svalid\sfor:\s(?P<timevalid>(-?\d+))' +
r'\ssec')
# pylint: disable=unused-argument
def get_scanner(hass, config):
""" Validates config and returns an Actiontec scanner. """
if not validate_config(config,
{DOMAIN: [CONF_HOST, CONF_USERNAME, CONF_PASSWORD]},
_LOGGER):
return None
scanner = ActiontecDeviceScanner(config[DOMAIN])
return scanner if scanner.success_init else None
Device = namedtuple("Device", ["mac", "ip", "last_update"])
class ActiontecDeviceScanner(object):
"""
This class queries a an actiontec router for connected devices.
Adapted from DD-WRT scanner.
"""
def __init__(self, config):
self.host = config[CONF_HOST]
self.username = config[CONF_USERNAME]
self.password = config[CONF_PASSWORD]
self.lock = threading.Lock()
self.last_results = []
data = self.get_actiontec_data()
self.success_init = data is not None
_LOGGER.info("actiontec scanner initialized")
def scan_devices(self):
"""
Scans for new devices and return a list containing found device ids.
"""
self._update_info()
return [client.mac for client in self.last_results]
def get_device_name(self, device):
""" Returns the name of the given device or None if we don't know. """
if not self.last_results:
return None
for client in self.last_results:
if client.mac == device:
return client.ip
return None
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Ensures the information from the Actiontec MI424WR router is up
to date. Returns boolean if scanning successful.
"""
_LOGGER.info("Scanning")
if not self.success_init:
return False
with self.lock:
now = dt_util.now()
actiontec_data = self.get_actiontec_data()
if not actiontec_data:
return False
self.last_results = [Device(data['mac'], name, now)
for name, data in actiontec_data.items()
if data['timevalid'] > -60]
_LOGGER.info("actiontec scan successful")
return True
def get_actiontec_data(self):
""" Retrieve data from Actiontec MI424WR and return parsed result. """
try:
telnet = telnetlib.Telnet(self.host)
telnet.read_until(b'Username: ')
telnet.write((self.username + '\n').encode('ascii'))
telnet.read_until(b'Password: ')
telnet.write((self.password + '\n').encode('ascii'))
prompt = telnet.read_until(
b'Wireless Broadband Router> ').split(b'\n')[-1]
telnet.write('firewall mac_cache_dump\n'.encode('ascii'))
telnet.write('\n'.encode('ascii'))
telnet.read_until(prompt)
leases_result = telnet.read_until(prompt).split(b'\n')[1:-1]
telnet.write('exit\n'.encode('ascii'))
except EOFError:
_LOGGER.exception("Unexpected response from router")
return
except ConnectionRefusedError:
_LOGGER.exception("Connection refused by router," +
" is telnet enabled?")
return None
devices = {}
for lease in leases_result:
match = _LEASES_REGEX.search(lease.decode('utf-8'))
if match is not None:
devices[match.group('ip')] = {
'ip': match.group('ip'),
'mac': match.group('mac').upper(),
'timevalid': int(match.group('timevalid'))
}
return devices

View File

@@ -0,0 +1,140 @@
"""
homeassistant.components.device_tracker.aruba
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning a Aruba Access Point for device
presence.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.aruba/
"""
import logging
from datetime import timedelta
import re
import threading
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10)
REQUIREMENTS = ['pexpect==4.0.1']
_LOGGER = logging.getLogger(__name__)
_DEVICES_REGEX = re.compile(
r'(?P<name>([^\s]+))\s+' +
r'(?P<ip>([0-9]{1,3}[\.]){3}[0-9]{1,3})\s+' +
r'(?P<mac>(([0-9a-f]{2}[:-]){5}([0-9a-f]{2})))\s+')
# pylint: disable=unused-argument
def get_scanner(hass, config):
""" Validates config and returns a Aruba scanner. """
if not validate_config(config,
{DOMAIN: [CONF_HOST, CONF_USERNAME, CONF_PASSWORD]},
_LOGGER):
return None
scanner = ArubaDeviceScanner(config[DOMAIN])
return scanner if scanner.success_init else None
class ArubaDeviceScanner(object):
""" This class queries a Aruba Acces Point for connected devices. """
def __init__(self, config):
self.host = config[CONF_HOST]
self.username = config[CONF_USERNAME]
self.password = config[CONF_PASSWORD]
self.lock = threading.Lock()
self.last_results = {}
# Test the router is accessible
data = self.get_aruba_data()
self.success_init = data is not None
def scan_devices(self):
"""
Scans for new devices and return a list containing found device IDs.
"""
self._update_info()
return [client['mac'] for client in self.last_results]
def get_device_name(self, device):
""" Returns the name of the given device or None if we don't know. """
if not self.last_results:
return None
for client in self.last_results:
if client['mac'] == device:
return client['name']
return None
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Ensures the information from the Aruba Access Point is up to date.
Returns boolean if scanning successful.
"""
if not self.success_init:
return False
with self.lock:
data = self.get_aruba_data()
if not data:
return False
self.last_results = data.values()
return True
def get_aruba_data(self):
""" Retrieve data from Aruba Access Point and return parsed result. """
import pexpect
connect = "ssh {}@{}"
ssh = pexpect.spawn(connect.format(self.username, self.host))
query = ssh.expect(['password:', pexpect.TIMEOUT, pexpect.EOF,
'continue connecting (yes/no)?',
'Host key verification failed.',
'Connection refused',
'Connection timed out'], timeout=120)
if query == 1:
_LOGGER.error("Timeout")
return
elif query == 2:
_LOGGER.error("Unexpected response from router")
return
elif query == 3:
ssh.sendline('yes')
ssh.expect('password:')
elif query == 4:
_LOGGER.error("Host key Changed")
return
elif query == 5:
_LOGGER.error("Connection refused by server")
return
elif query == 6:
_LOGGER.error("Connection timed out")
return
ssh.sendline(self.password)
ssh.expect('#')
ssh.sendline('show clients')
ssh.expect('#')
devices_result = ssh.before.split(b'\r\n')
ssh.sendline('exit')
devices = {}
for device in devices_result:
match = _DEVICES_REGEX.search(device.decode('utf-8'))
if match:
devices[match.group('ip')] = {
'ip': match.group('ip'),
'mac': match.group('mac').upper(),
'name': match.group('name')
}
return devices

View File

@@ -0,0 +1,162 @@
"""
homeassistant.components.device_tracker.asuswrt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning a ASUSWRT router for device
presence.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.asuswrt/
"""
import logging
from datetime import timedelta
import re
import threading
import telnetlib
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
_LOGGER = logging.getLogger(__name__)
_LEASES_REGEX = re.compile(
r'\w+\s' +
r'(?P<mac>(([0-9a-f]{2}[:-]){5}([0-9a-f]{2})))\s' +
r'(?P<ip>([0-9]{1,3}[\.]){3}[0-9]{1,3})\s' +
r'(?P<host>([^\s]+))')
_IP_NEIGH_REGEX = re.compile(
r'(?P<ip>([0-9]{1,3}[\.]){3}[0-9]{1,3})\s' +
r'\w+\s' +
r'\w+\s' +
r'(\w+\s(?P<mac>(([0-9a-f]{2}[:-]){5}([0-9a-f]{2}))))?\s' +
r'(?P<status>(\w+))')
# pylint: disable=unused-argument
def get_scanner(hass, config):
""" Validates config and returns an ASUS-WRT scanner. """
if not validate_config(config,
{DOMAIN: [CONF_HOST, CONF_USERNAME, CONF_PASSWORD]},
_LOGGER):
return None
scanner = AsusWrtDeviceScanner(config[DOMAIN])
return scanner if scanner.success_init else None
class AsusWrtDeviceScanner(object):
"""
This class queries a router running ASUSWRT firmware
for connected devices. Adapted from DD-WRT scanner.
"""
def __init__(self, config):
self.host = config[CONF_HOST]
self.username = str(config[CONF_USERNAME])
self.password = str(config[CONF_PASSWORD])
self.lock = threading.Lock()
self.last_results = {}
# Test the router is accessible
data = self.get_asuswrt_data()
self.success_init = data is not None
def scan_devices(self):
"""
Scans for new devices and return a list containing found device IDs.
"""
self._update_info()
return [client['mac'] for client in self.last_results]
def get_device_name(self, device):
""" Returns the name of the given device or None if we don't know. """
if not self.last_results:
return None
for client in self.last_results:
if client['mac'] == device:
return client['host']
return None
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Ensures the information from the ASUSWRT router is up to date.
Returns boolean if scanning successful.
"""
if not self.success_init:
return False
with self.lock:
_LOGGER.info("Checking ARP")
data = self.get_asuswrt_data()
if not data:
return False
active_clients = [client for client in data.values() if
client['status'] == 'REACHABLE' or
client['status'] == 'DELAY' or
client['status'] == 'STALE']
self.last_results = active_clients
return True
def get_asuswrt_data(self):
""" Retrieve data from ASUSWRT and return parsed result. """
try:
telnet = telnetlib.Telnet(self.host)
telnet.read_until(b'login: ')
telnet.write((self.username + '\n').encode('ascii'))
telnet.read_until(b'Password: ')
telnet.write((self.password + '\n').encode('ascii'))
prompt_string = telnet.read_until(b'#').split(b'\n')[-1]
telnet.write('ip neigh\n'.encode('ascii'))
neighbors = telnet.read_until(prompt_string).split(b'\n')[1:-1]
telnet.write('cat /var/lib/misc/dnsmasq.leases\n'.encode('ascii'))
leases_result = telnet.read_until(prompt_string).split(b'\n')[1:-1]
telnet.write('exit\n'.encode('ascii'))
except EOFError:
_LOGGER.exception("Unexpected response from router")
return
except ConnectionRefusedError:
_LOGGER.exception("Connection refused by router," +
" is telnet enabled?")
return
devices = {}
for lease in leases_result:
match = _LEASES_REGEX.search(lease.decode('utf-8'))
if not match:
_LOGGER.warning("Could not parse lease row: %s", lease)
continue
# For leases where the client doesn't set a hostname, ensure
# it is blank and not '*', which breaks the entity_id down
# the line
host = match.group('host')
if host == '*':
host = ''
devices[match.group('ip')] = {
'host': host,
'status': '',
'ip': match.group('ip'),
'mac': match.group('mac').upper(),
}
for neighbor in neighbors:
match = _IP_NEIGH_REGEX.search(neighbor.decode('utf-8'))
if not match:
_LOGGER.warning("Could not parse neighbor row: %s", neighbor)
continue
if match.group('ip') in devices:
devices[match.group('ip')]['status'] = match.group('status')
return devices

View File

@@ -0,0 +1,172 @@
"""
homeassistant.components.device_tracker.ddwrt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning a DD-WRT router for device
presence.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.ddwrt/
"""
import logging
from datetime import timedelta
import re
import threading
import requests
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
_LOGGER = logging.getLogger(__name__)
_DDWRT_DATA_REGEX = re.compile(r'\{(\w+)::([^\}]*)\}')
_MAC_REGEX = re.compile(r'(([0-9A-Fa-f]{1,2}\:){5}[0-9A-Fa-f]{1,2})')
# pylint: disable=unused-argument
def get_scanner(hass, config):
""" Validates config and returns a DD-WRT scanner. """
if not validate_config(config,
{DOMAIN: [CONF_HOST, CONF_USERNAME, CONF_PASSWORD]},
_LOGGER):
return None
scanner = DdWrtDeviceScanner(config[DOMAIN])
return scanner if scanner.success_init else None
# pylint: disable=too-many-instance-attributes
class DdWrtDeviceScanner(object):
"""
This class queries a wireless router running DD-WRT firmware
for connected devices. Adapted from Tomato scanner.
"""
def __init__(self, config):
self.host = config[CONF_HOST]
self.username = config[CONF_USERNAME]
self.password = config[CONF_PASSWORD]
self.lock = threading.Lock()
self.last_results = {}
self.mac2name = {}
# Test the router is accessible
url = 'http://{}/Status_Wireless.live.asp'.format(self.host)
data = self.get_ddwrt_data(url)
self.success_init = data is not None
def scan_devices(self):
"""
Scans for new devices and return a list containing found device ids.
"""
self._update_info()
return self.last_results
def get_device_name(self, device):
""" Returns the name of the given device or None if we don't know. """
with self.lock:
# if not initialised and not already scanned and not found
if device not in self.mac2name:
url = 'http://{}/Status_Lan.live.asp'.format(self.host)
data = self.get_ddwrt_data(url)
if not data:
return None
dhcp_leases = data.get('dhcp_leases', None)
if not dhcp_leases:
return None
# remove leading and trailing single quotes
cleaned_str = dhcp_leases.strip().strip('"')
elements = cleaned_str.split('","')
num_clients = int(len(elements)/5)
self.mac2name = {}
for idx in range(0, num_clients):
# this is stupid but the data is a single array
# every 5 elements represents one hosts, the MAC
# is the third element and the name is the first
mac_index = (idx * 5) + 2
if mac_index < len(elements):
mac = elements[mac_index]
self.mac2name[mac] = elements[idx * 5]
return self.mac2name.get(device)
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Ensures the information from the DD-WRT router is up to date.
Returns boolean if scanning successful.
"""
if not self.success_init:
return False
with self.lock:
_LOGGER.info("Checking ARP")
url = 'http://{}/Status_Wireless.live.asp'.format(self.host)
data = self.get_ddwrt_data(url)
if not data:
return False
self.last_results = []
active_clients = data.get('active_wireless', None)
if not active_clients:
return False
# This is really lame, instead of using JSON the DD-WRT UI
# uses its own data format for some reason and then
# regex's out values so I guess I have to do the same,
# LAME!!!
# remove leading and trailing single quotes
clean_str = active_clients.strip().strip("'")
elements = clean_str.split("','")
self.last_results.extend(item for item in elements
if _MAC_REGEX.match(item))
return True
def get_ddwrt_data(self, url):
""" Retrieve data from DD-WRT and return parsed result. """
try:
response = requests.get(
url,
auth=(self.username, self.password),
timeout=4)
except requests.exceptions.Timeout:
_LOGGER.exception("Connection to the router timed out")
return
if response.status_code == 200:
return _parse_ddwrt_response(response.text)
elif response.status_code == 401:
# Authentication error
_LOGGER.exception(
"Failed to authenticate, "
"please check your username and password")
return
else:
_LOGGER.error("Invalid response from ddwrt: %s", response)
def _parse_ddwrt_response(data_str):
""" Parse the DD-WRT data format. """
return {
key: val for key, val in _DDWRT_DATA_REGEX
.findall(data_str)}

View File

@@ -0,0 +1,49 @@
"""
homeassistant.components.device_tracker.demo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo platform for the device tracker.
device_tracker:
platform: demo
"""
import random
from homeassistant.components.device_tracker import DOMAIN
def setup_scanner(hass, config, see):
""" Set up a demo tracker. """
def offset():
""" Return random offset. """
return (random.randrange(500, 2000)) / 2e5 * random.choice((-1, 1))
def random_see(dev_id, name):
""" Randomize a sighting. """
see(
dev_id=dev_id,
host_name=name,
gps=(hass.config.latitude + offset(),
hass.config.longitude + offset()),
gps_accuracy=random.randrange(50, 150),
battery=random.randrange(10, 90)
)
def observe(call=None):
""" Observe three entities. """
random_see('demo_paulus', 'Paulus')
random_see('demo_anne_therese', 'Anne Therese')
observe()
see(
dev_id='demo_home_boy',
host_name='Home Boy',
gps=[hass.config.latitude - 0.00002, hass.config.longitude + 0.00002],
gps_accuracy=20,
battery=53
)
hass.services.register(DOMAIN, 'demo', observe)
return True

View File

@@ -0,0 +1,116 @@
"""
homeassistant.components.device_tracker.fritz
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning a FRITZ!Box router for device
presence.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.fritz/
"""
import logging
from datetime import timedelta
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
REQUIREMENTS = ['fritzconnection==0.4.6']
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
_LOGGER = logging.getLogger(__name__)
# noinspection PyUnusedLocal
def get_scanner(hass, config):
""" Validates config and returns FritzBoxScanner. """
if not validate_config(config,
{DOMAIN: []},
_LOGGER):
return None
scanner = FritzBoxScanner(config[DOMAIN])
return scanner if scanner.success_init else None
# pylint: disable=too-many-instance-attributes
class FritzBoxScanner(object):
"""
This class queries a FRITZ!Box router. It is using the
fritzconnection library for communication with the router.
The API description can be found under:
https://pypi.python.org/pypi/fritzconnection/0.4.6
This scanner retrieves the list of known hosts and checks their
corresponding states (on, or off).
Due to a bug of the fritzbox api (router side) it is not possible
to track more than 16 hosts.
"""
def __init__(self, config):
self.last_results = []
self.host = '169.254.1.1' # This IP is valid for all fritzboxes
self.username = 'admin'
self.password = ''
self.success_init = True
# pylint: disable=import-error
import fritzconnection as fc
# Check for user specific configuration
if CONF_HOST in config.keys():
self.host = config[CONF_HOST]
if CONF_USERNAME in config.keys():
self.username = config[CONF_USERNAME]
if CONF_PASSWORD in config.keys():
self.password = config[CONF_PASSWORD]
# Establish a connection to the FRITZ!Box
try:
self.fritz_box = fc.FritzHosts(address=self.host,
user=self.username,
password=self.password)
except (ValueError, TypeError):
self.fritz_box = None
# At this point it is difficult to tell if a connection is established.
# So just check for null objects ...
if self.fritz_box is None or not self.fritz_box.modelname:
self.success_init = False
if self.success_init:
_LOGGER.info("Successfully connected to %s",
self.fritz_box.modelname)
self._update_info()
else:
_LOGGER.error("Failed to establish connection to FRITZ!Box "
"with IP: %s", self.host)
def scan_devices(self):
""" Scan for new devices and return a list of found device ids. """
self._update_info()
active_hosts = []
for known_host in self.last_results:
if known_host["status"] == "1":
active_hosts.append(known_host["mac"])
return active_hosts
def get_device_name(self, mac):
""" Returns the name of the given device or None if is not known. """
ret = self.fritz_box.get_specific_host_entry(mac)["NewHostName"]
if ret == {}:
return None
return ret
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
""" Retrieves latest information from the FRITZ!Box. """
if not self.success_init:
return False
_LOGGER.info("Scanning")
self.last_results = self.fritz_box.get_hosts_info()
return True

View File

@@ -0,0 +1,87 @@
"""
homeassistant.components.device_tracker.icloud
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning iCloud devices.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.icloud/
"""
import logging
import re
from homeassistant.const import CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers.event import track_utc_time_change
_LOGGER = logging.getLogger(__name__)
REQUIREMENTS = ['pyicloud==0.7.2']
CONF_INTERVAL = 'interval'
DEFAULT_INTERVAL = 8
def setup_scanner(hass, config, see):
""" Set up the iCloud Scanner. """
from pyicloud import PyiCloudService
from pyicloud.exceptions import PyiCloudFailedLoginException
from pyicloud.exceptions import PyiCloudNoDevicesException
# Get the username and password from the configuration
username = config.get(CONF_USERNAME)
password = config.get(CONF_PASSWORD)
if username is None or password is None:
_LOGGER.error('Must specify a username and password')
return False
try:
_LOGGER.info('Logging into iCloud Account')
# Attempt the login to iCloud
api = PyiCloudService(username,
password,
verify=True)
except PyiCloudFailedLoginException as error:
_LOGGER.exception('Error logging into iCloud Service: %s', error)
return False
def keep_alive(now):
""" Keeps authenticating iCloud connection. """
api.authenticate()
_LOGGER.info("Authenticate against iCloud")
track_utc_time_change(hass, keep_alive, second=0)
def update_icloud(now):
""" Authenticate against iCloud and scan for devices. """
try:
# The session timeouts if we are not using it so we
# have to re-authenticate. This will send an email.
api.authenticate()
# Loop through every device registered with the iCloud account
for device in api.devices:
status = device.status()
location = device.location()
# If the device has a location add it. If not do nothing
if location:
see(
dev_id=re.sub(r"(\s|\W|')",
'',
status['name']),
host_name=status['name'],
gps=(location['latitude'], location['longitude']),
battery=status['batteryLevel']*100,
gps_accuracy=location['horizontalAccuracy']
)
else:
# No location found for the device so continue
continue
except PyiCloudNoDevicesException:
_LOGGER.info('No iCloud Devices found!')
track_utc_time_change(
hass, update_icloud,
minute=range(0, 60, config.get(CONF_INTERVAL, DEFAULT_INTERVAL)),
second=0
)
return True

View File

@@ -0,0 +1,104 @@
"""
homeassistant.components.device_tracker.locative
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Locative platform for the device tracker.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.locative/
"""
import logging
from functools import partial
from homeassistant.const import (
HTTP_UNPROCESSABLE_ENTITY, STATE_NOT_HOME)
from homeassistant.components.device_tracker import DOMAIN
_LOGGER = logging.getLogger(__name__)
DEPENDENCIES = ['http']
URL_API_LOCATIVE_ENDPOINT = "/api/locative"
def setup_scanner(hass, config, see):
""" Set up an endpoint for the Locative app. """
# POST would be semantically better, but that currently does not work
# since Locative sends the data as key1=value1&key2=value2
# in the request body, while Home Assistant expects json there.
hass.http.register_path(
'GET', URL_API_LOCATIVE_ENDPOINT,
partial(_handle_get_api_locative, hass, see))
return True
def _handle_get_api_locative(hass, see, handler, path_match, data):
""" Locative message received. """
if not _check_data(handler, data):
return
device = data['device'].replace('-', '')
location_name = data['id'].lower()
direction = data['trigger']
if direction == 'enter':
see(dev_id=device, location_name=location_name)
handler.write_text("Setting location to {}".format(location_name))
elif direction == 'exit':
current_state = hass.states.get("{}.{}".format(DOMAIN, device))
if current_state is None or current_state.state == location_name:
see(dev_id=device, location_name=STATE_NOT_HOME)
handler.write_text("Setting location to not home")
else:
# Ignore the message if it is telling us to exit a zone that we
# aren't currently in. This occurs when a zone is entered before
# the previous zone was exited. The enter message will be sent
# first, then the exit message will be sent second.
handler.write_text(
'Ignoring exit from {} (already in {})'.format(
location_name, current_state))
elif direction == 'test':
# In the app, a test message can be sent. Just return something to
# the user to let them know that it works.
handler.write_text("Received test message.")
else:
handler.write_text(
"Received unidentified message: {}".format(direction),
HTTP_UNPROCESSABLE_ENTITY)
_LOGGER.error("Received unidentified message from Locative: %s",
direction)
def _check_data(handler, data):
if 'latitude' not in data or 'longitude' not in data:
handler.write_text("Latitude and longitude not specified.",
HTTP_UNPROCESSABLE_ENTITY)
_LOGGER.error("Latitude and longitude not specified.")
return False
if 'device' not in data:
handler.write_text("Device id not specified.",
HTTP_UNPROCESSABLE_ENTITY)
_LOGGER.error("Device id not specified.")
return False
if 'id' not in data:
handler.write_text("Location id not specified.",
HTTP_UNPROCESSABLE_ENTITY)
_LOGGER.error("Location id not specified.")
return False
if 'trigger' not in data:
handler.write_text("Trigger is not specified.",
HTTP_UNPROCESSABLE_ENTITY)
_LOGGER.error("Trigger is not specified.")
return False
return True

View File

@@ -0,0 +1,161 @@
"""
homeassistant.components.device_tracker.luci
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning a OpenWRT router for device
presence.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.luci/
"""
import logging
import json
from datetime import timedelta
import re
import threading
import requests
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
_LOGGER = logging.getLogger(__name__)
def get_scanner(hass, config):
""" Validates config and returns a Luci scanner. """
if not validate_config(config,
{DOMAIN: [CONF_HOST, CONF_USERNAME, CONF_PASSWORD]},
_LOGGER):
return None
scanner = LuciDeviceScanner(config[DOMAIN])
return scanner if scanner.success_init else None
# pylint: disable=too-many-instance-attributes
class LuciDeviceScanner(object):
"""
This class queries a wireless router running OpenWrt firmware
for connected devices. Adapted from Tomato scanner.
# opkg install luci-mod-rpc
for this to work on the router.
The API is described here:
http://luci.subsignal.org/trac/wiki/Documentation/JsonRpcHowTo
(Currently, we do only wifi iwscan, and no DHCP lease access.)
"""
def __init__(self, config):
host = config[CONF_HOST]
username, password = config[CONF_USERNAME], config[CONF_PASSWORD]
self.parse_api_pattern = re.compile(r"(?P<param>\w*) = (?P<value>.*);")
self.lock = threading.Lock()
self.last_results = {}
self.token = _get_token(host, username, password)
self.host = host
self.mac2name = None
self.success_init = self.token is not None
def scan_devices(self):
"""
Scans for new devices and return a list containing found device ids.
"""
self._update_info()
return self.last_results
def get_device_name(self, device):
""" Returns the name of the given device or None if we don't know. """
with self.lock:
if self.mac2name is None:
url = 'http://{}/cgi-bin/luci/rpc/uci'.format(self.host)
result = _req_json_rpc(url, 'get_all', 'dhcp',
params={'auth': self.token})
if result:
hosts = [x for x in result.values()
if x['.type'] == 'host' and
'mac' in x and 'name' in x]
mac2name_list = [
(x['mac'].upper(), x['name']) for x in hosts]
self.mac2name = dict(mac2name_list)
else:
# Error, handled in the _req_json_rpc
return
return self.mac2name.get(device.upper(), None)
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Ensures the information from the Luci router is up to date.
Returns boolean if scanning successful.
"""
if not self.success_init:
return False
with self.lock:
_LOGGER.info("Checking ARP")
url = 'http://{}/cgi-bin/luci/rpc/sys'.format(self.host)
result = _req_json_rpc(url, 'net.arptable',
params={'auth': self.token})
if result:
self.last_results = []
for device_entry in result:
# Check if the Flags for each device contain
# NUD_REACHABLE and if so, add it to last_results
if int(device_entry['Flags'], 16) & 0x2:
self.last_results.append(device_entry['HW address'])
return True
return False
def _req_json_rpc(url, method, *args, **kwargs):
""" Perform one JSON RPC operation. """
data = json.dumps({'method': method, 'params': args})
try:
res = requests.post(url, data=data, timeout=5, **kwargs)
except requests.exceptions.Timeout:
_LOGGER.exception("Connection to the router timed out")
return
if res.status_code == 200:
try:
result = res.json()
except ValueError:
# If json decoder could not parse the response
_LOGGER.exception("Failed to parse response from luci")
return
try:
return result['result']
except KeyError:
_LOGGER.exception("No result in response from luci")
return
elif res.status_code == 401:
# Authentication error
_LOGGER.exception(
"Failed to authenticate, "
"please check your username and password")
return
else:
_LOGGER.error("Invalid response from luci: %s", res)
def _get_token(host, username, password):
""" Get authentication token for the given host+username+password. """
url = 'http://{}/cgi-bin/luci/rpc/auth'.format(host)
return _req_json_rpc(url, 'login', username, password)

View File

@@ -0,0 +1,43 @@
"""
homeassistant.components.device_tracker.mqtt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MQTT platform for the device tracker.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.mqtt/
"""
import logging
from homeassistant import util
import homeassistant.components.mqtt as mqtt
DEPENDENCIES = ['mqtt']
CONF_QOS = 'qos'
CONF_DEVICES = 'devices'
DEFAULT_QOS = 0
_LOGGER = logging.getLogger(__name__)
def setup_scanner(hass, config, see):
""" Set up a MQTT tracker. """
devices = config.get(CONF_DEVICES)
qos = util.convert(config.get(CONF_QOS), int, DEFAULT_QOS)
if not isinstance(devices, dict):
_LOGGER.error('Expected %s to be a dict, found %s', CONF_DEVICES,
devices)
return False
dev_id_lookup = {}
def device_tracker_message_received(topic, payload, qos):
""" MQTT message received. """
see(dev_id=dev_id_lookup[topic], location_name=payload)
for dev_id, topic in devices.items():
dev_id_lookup[topic] = dev_id
mqtt.subscribe(hass, topic, device_tracker_message_received, qos)
return True

View File

@@ -0,0 +1,96 @@
"""
homeassistant.components.device_tracker.netgear
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning a Netgear router for device
presence.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.netgear/
"""
import logging
from datetime import timedelta
import threading
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
_LOGGER = logging.getLogger(__name__)
REQUIREMENTS = ['pynetgear==0.3.2']
def get_scanner(hass, config):
""" Validates config and returns a Netgear scanner. """
info = config[DOMAIN]
host = info.get(CONF_HOST)
username = info.get(CONF_USERNAME)
password = info.get(CONF_PASSWORD)
if password is not None and host is None:
_LOGGER.warning('Found username or password but no host')
return None
scanner = NetgearDeviceScanner(host, username, password)
return scanner if scanner.success_init else None
class NetgearDeviceScanner(object):
""" This class queries a Netgear wireless router using the SOAP-API. """
def __init__(self, host, username, password):
import pynetgear
self.last_results = []
self.lock = threading.Lock()
if host is None:
self._api = pynetgear.Netgear()
elif username is None:
self._api = pynetgear.Netgear(password, host)
else:
self._api = pynetgear.Netgear(password, host, username)
_LOGGER.info("Logging in")
results = self._api.get_attached_devices()
self.success_init = results is not None
if self.success_init:
self.last_results = results
else:
_LOGGER.error("Failed to Login")
def scan_devices(self):
"""
Scans for new devices and return a list containing found device ids.
"""
self._update_info()
return (device.mac for device in self.last_results)
def get_device_name(self, mac):
""" Returns the name of the given device or None if we don't know. """
try:
return next(device.name for device in self.last_results
if device.mac == mac)
except StopIteration:
return None
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Retrieves latest information from the Netgear router.
Returns boolean if scanning successful.
"""
if not self.success_init:
return
with self.lock:
_LOGGER.info("Scanning")
self.last_results = self._api.get_attached_devices() or []

View File

@@ -0,0 +1,134 @@
"""
homeassistant.components.device_tracker.nmap
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning a network with nmap.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.nmap_scanner/
"""
import logging
from datetime import timedelta
from collections import namedtuple
import subprocess
import re
import homeassistant.util.dt as dt_util
from homeassistant.const import CONF_HOSTS
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle, convert
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
_LOGGER = logging.getLogger(__name__)
# interval in minutes to exclude devices from a scan while they are home
CONF_HOME_INTERVAL = "home_interval"
REQUIREMENTS = ['python-nmap==0.4.3']
def get_scanner(hass, config):
""" Validates config and returns a Nmap scanner. """
if not validate_config(config, {DOMAIN: [CONF_HOSTS]},
_LOGGER):
return None
scanner = NmapDeviceScanner(config[DOMAIN])
return scanner if scanner.success_init else None
Device = namedtuple("Device", ["mac", "name", "ip", "last_update"])
def _arp(ip_address):
""" Get the MAC address for a given IP. """
cmd = ['arp', '-n', ip_address]
arp = subprocess.Popen(cmd, stdout=subprocess.PIPE)
out, _ = arp.communicate()
match = re.search(r'(([0-9A-Fa-f]{1,2}\:){5}[0-9A-Fa-f]{1,2})', str(out))
if match:
return match.group(0)
_LOGGER.info("No MAC address found for %s", ip_address)
return None
class NmapDeviceScanner(object):
""" This class scans for devices using nmap. """
def __init__(self, config):
self.last_results = []
self.hosts = config[CONF_HOSTS]
minutes = convert(config.get(CONF_HOME_INTERVAL), int, 0)
self.home_interval = timedelta(minutes=minutes)
self.success_init = self._update_info()
_LOGGER.info("nmap scanner initialized")
def scan_devices(self):
"""
Scans for new devices and return a list containing found device ids.
"""
self._update_info()
return [device.mac for device in self.last_results]
def get_device_name(self, mac):
""" Returns the name of the given device or None if we don't know. """
filter_named = [device.name for device in self.last_results
if device.mac == mac]
if filter_named:
return filter_named[0]
else:
return None
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Scans the network for devices.
Returns boolean if scanning successful.
"""
_LOGGER.info("Scanning")
from nmap import PortScanner, PortScannerError
scanner = PortScanner()
options = "-F --host-timeout 5s"
if self.home_interval:
boundary = dt_util.now() - self.home_interval
last_results = [device for device in self.last_results
if device.last_update > boundary]
if last_results:
# Pylint is confused here.
# pylint: disable=no-member
options += " --exclude {}".format(",".join(device.ip for device
in last_results))
else:
last_results = []
try:
result = scanner.scan(hosts=self.hosts, arguments=options)
except PortScannerError:
return False
now = dt_util.now()
for ipv4, info in result['scan'].items():
if info['status']['state'] != 'up':
continue
name = info['hostnames'][0]['name'] if info['hostnames'] else ipv4
# Mac address only returned if nmap ran as root
mac = info['addresses'].get('mac') or _arp(ipv4)
if mac is None:
continue
last_results.append(Device(mac.upper(), name, ipv4, now))
self.last_results = last_results
_LOGGER.info("nmap scan successful")
return True

View File

@@ -0,0 +1,183 @@
"""
homeassistant.components.device_tracker.owntracks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OwnTracks platform for the device tracker.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.owntracks/
"""
import json
import logging
import threading
from collections import defaultdict
import homeassistant.components.mqtt as mqtt
from homeassistant.const import STATE_HOME
DEPENDENCIES = ['mqtt']
REGIONS_ENTERED = defaultdict(list)
MOBILE_BEACONS_ACTIVE = defaultdict(list)
BEACON_DEV_ID = 'beacon'
LOCATION_TOPIC = 'owntracks/+/+'
EVENT_TOPIC = 'owntracks/+/+/event'
_LOGGER = logging.getLogger(__name__)
LOCK = threading.Lock()
def setup_scanner(hass, config, see):
""" Set up an OwnTracks tracker. """
def owntracks_location_update(topic, payload, qos):
""" MQTT message received. """
# Docs on available data:
# http://owntracks.org/booklet/tech/json/#_typelocation
try:
data = json.loads(payload)
except ValueError:
# If invalid JSON
_LOGGER.error(
'Unable to parse payload as JSON: %s', payload)
return
if not isinstance(data, dict) or data.get('_type') != 'location':
return
dev_id, kwargs = _parse_see_args(topic, data)
# Block updates if we're in a region
with LOCK:
if REGIONS_ENTERED[dev_id]:
_LOGGER.debug(
"location update ignored - inside region %s",
REGIONS_ENTERED[-1])
return
see(**kwargs)
see_beacons(dev_id, kwargs)
def owntracks_event_update(topic, payload, qos):
# pylint: disable=too-many-branches
""" MQTT event (geofences) received. """
# Docs on available data:
# http://owntracks.org/booklet/tech/json/#_typetransition
try:
data = json.loads(payload)
except ValueError:
# If invalid JSON
_LOGGER.error(
'Unable to parse payload as JSON: %s', payload)
return
if not isinstance(data, dict) or data.get('_type') != 'transition':
return
# OwnTracks uses - at the start of a beacon zone
# to switch on 'hold mode' - ignore this
location = data['desc'].lstrip("-")
if location.lower() == 'home':
location = STATE_HOME
dev_id, kwargs = _parse_see_args(topic, data)
if data['event'] == 'enter':
zone = hass.states.get("zone.{}".format(location))
with LOCK:
if zone is None:
if data['t'] == 'b':
# Not a HA zone, and a beacon so assume mobile
MOBILE_BEACONS_ACTIVE[dev_id].append(location)
else:
# Normal region
if not zone.attributes.get('passive'):
kwargs['location_name'] = location
regions = REGIONS_ENTERED[dev_id]
if location not in regions:
regions.append(location)
_LOGGER.info("Enter region %s", location)
_set_gps_from_zone(kwargs, zone)
see(**kwargs)
see_beacons(dev_id, kwargs)
elif data['event'] == 'leave':
regions = REGIONS_ENTERED[dev_id]
if location in regions:
regions.remove(location)
new_region = regions[-1] if regions else None
if new_region:
# Exit to previous region
zone = hass.states.get("zone.{}".format(new_region))
if not zone.attributes.get('passive'):
kwargs['location_name'] = new_region
_set_gps_from_zone(kwargs, zone)
_LOGGER.info("Exit from to %s", new_region)
else:
_LOGGER.info("Exit to GPS")
see(**kwargs)
see_beacons(dev_id, kwargs)
beacons = MOBILE_BEACONS_ACTIVE[dev_id]
if location in beacons:
beacons.remove(location)
else:
_LOGGER.error(
'Misformatted mqtt msgs, _type=transition, event=%s',
data['event'])
return
def see_beacons(dev_id, kwargs_param):
""" Set active beacons to the current location """
kwargs = kwargs_param.copy()
for beacon in MOBILE_BEACONS_ACTIVE[dev_id]:
kwargs['dev_id'] = "{}_{}".format(BEACON_DEV_ID, beacon)
kwargs['host_name'] = beacon
see(**kwargs)
mqtt.subscribe(hass, LOCATION_TOPIC, owntracks_location_update, 1)
mqtt.subscribe(hass, EVENT_TOPIC, owntracks_event_update, 1)
return True
def _parse_see_args(topic, data):
""" Parse the OwnTracks location parameters,
into the format see expects. """
parts = topic.split('/')
dev_id = '{}_{}'.format(parts[1], parts[2])
host_name = parts[1]
kwargs = {
'dev_id': dev_id,
'host_name': host_name,
'gps': (data['lat'], data['lon'])
}
if 'acc' in data:
kwargs['gps_accuracy'] = data['acc']
if 'batt' in data:
kwargs['battery'] = data['batt']
return dev_id, kwargs
def _set_gps_from_zone(kwargs, zone):
""" Set the see parameters from the zone parameters """
if zone is not None:
kwargs['gps'] = (
zone.attributes['latitude'],
zone.attributes['longitude'])
kwargs['gps_accuracy'] = zone.attributes['radius']
return kwargs

View File

@@ -0,0 +1,33 @@
# Describes the format for available device tracker services
see:
description: Control tracked device
fields:
mac:
description: MAC address of device
example: 'FF:FF:FF:FF:FF:FF'
dev_id:
description: Id of device (find id in known_devices.yaml)
example: 'phonedave'
host_name:
description: Hostname of device
example: 'Dave'
location_name:
description: Name of location where device is located (not_home is away)
example: 'home'
gps:
description: GPS coordinates where device is located (latitude, longitude)
example: '[51.509802, -0.086692]'
gps_accuracy:
description: Accuracy of GPS coordinates
example: '80'
battery:
description: Battery level of device
example: '100'

View File

@@ -0,0 +1,116 @@
"""
homeassistant.components.device_tracker.snmp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports fetching WiFi associations
through SNMP.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.snmp/
"""
import logging
from datetime import timedelta
import threading
import binascii
from homeassistant.const import CONF_HOST
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10)
_LOGGER = logging.getLogger(__name__)
REQUIREMENTS = ['pysnmp==4.2.5']
CONF_COMMUNITY = "community"
CONF_BASEOID = "baseoid"
# pylint: disable=unused-argument
def get_scanner(hass, config):
""" Validates config and returns an snmp scanner """
if not validate_config(config,
{DOMAIN: [CONF_HOST, CONF_COMMUNITY, CONF_BASEOID]},
_LOGGER):
return None
scanner = SnmpScanner(config[DOMAIN])
return scanner if scanner.success_init else None
class SnmpScanner(object):
"""
This class queries any SNMP capable Acces Point for connected devices.
"""
def __init__(self, config):
from pysnmp.entity.rfc3413.oneliner import cmdgen
self.snmp = cmdgen.CommandGenerator()
self.host = cmdgen.UdpTransportTarget((config[CONF_HOST], 161))
self.community = cmdgen.CommunityData(config[CONF_COMMUNITY])
self.baseoid = cmdgen.MibVariable(config[CONF_BASEOID])
self.lock = threading.Lock()
self.last_results = []
# Test the router is accessible
data = self.get_snmp_data()
self.success_init = data is not None
def scan_devices(self):
"""
Scans for new devices and return a list containing found device IDs.
"""
self._update_info()
return [client['mac'] for client in self.last_results]
# Supressing no-self-use warning
# pylint: disable=R0201
def get_device_name(self, device):
""" Returns the name of the given device or None if we don't know. """
# We have no names
return None
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Ensures the information from the WAP is up to date.
Returns boolean if scanning successful.
"""
if not self.success_init:
return False
with self.lock:
data = self.get_snmp_data()
if not data:
return False
self.last_results = data
return True
def get_snmp_data(self):
""" Fetch mac addresses from WAP via SNMP. """
devices = []
errindication, errstatus, errindex, restable = self.snmp.nextCmd(
self.community, self.host, self.baseoid)
if errindication:
_LOGGER.error("SNMPLIB error: %s", errindication)
return
if errstatus:
_LOGGER.error('SNMP error: %s at %s', errstatus.prettyPrint(),
errindex and restable[-1][int(errindex)-1] or '?')
return
for resrow in restable:
for _, val in resrow:
mac = binascii.hexlify(val.asOctets()).decode('utf-8')
mac = ':'.join([mac[i:i+2] for i in range(0, len(mac), 2)])
devices.append({'mac': mac})
return devices

View File

@@ -0,0 +1,136 @@
"""
homeassistant.components.device_tracker.thomson
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning a THOMSON router for device
presence.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.thomson/
"""
import logging
from datetime import timedelta
import re
import threading
import telnetlib
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10)
_LOGGER = logging.getLogger(__name__)
_DEVICES_REGEX = re.compile(
r'(?P<mac>(([0-9a-f]{2}[:-]){5}([0-9a-f]{2})))\s' +
r'(?P<ip>([0-9]{1,3}[\.]){3}[0-9]{1,3})\s+' +
r'(?P<status>([^\s]+))\s+' +
r'(?P<type>([^\s]+))\s+' +
r'(?P<intf>([^\s]+))\s+' +
r'(?P<hwintf>([^\s]+))\s+' +
r'(?P<host>([^\s]+))')
# pylint: disable=unused-argument
def get_scanner(hass, config):
""" Validates config and returns a THOMSON scanner. """
if not validate_config(config,
{DOMAIN: [CONF_HOST, CONF_USERNAME, CONF_PASSWORD]},
_LOGGER):
return None
scanner = ThomsonDeviceScanner(config[DOMAIN])
return scanner if scanner.success_init else None
class ThomsonDeviceScanner(object):
"""
This class queries a router running THOMSON firmware
for connected devices. Adapted from ASUSWRT scanner.
"""
def __init__(self, config):
self.host = config[CONF_HOST]
self.username = config[CONF_USERNAME]
self.password = config[CONF_PASSWORD]
self.lock = threading.Lock()
self.last_results = {}
# Test the router is accessible
data = self.get_thomson_data()
self.success_init = data is not None
def scan_devices(self):
""" Scans for new devices and return a
list containing found device ids. """
self._update_info()
return [client['mac'] for client in self.last_results]
def get_device_name(self, device):
""" Returns the name of the given device
or None if we don't know. """
if not self.last_results:
return None
for client in self.last_results:
if client['mac'] == device:
return client['host']
return None
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Ensures the information from the THOMSON router is up to date.
Returns boolean if scanning successful.
"""
if not self.success_init:
return False
with self.lock:
_LOGGER.info("Checking ARP")
data = self.get_thomson_data()
if not data:
return False
# flag C stands for CONNECTED
active_clients = [client for client in data.values() if
client['status'].find('C') != -1]
self.last_results = active_clients
return True
def get_thomson_data(self):
""" Retrieve data from THOMSON and return parsed result. """
try:
telnet = telnetlib.Telnet(self.host)
telnet.read_until(b'Username : ')
telnet.write((self.username + '\r\n').encode('ascii'))
telnet.read_until(b'Password : ')
telnet.write((self.password + '\r\n').encode('ascii'))
telnet.read_until(b'=>')
telnet.write(('hostmgr list\r\n').encode('ascii'))
devices_result = telnet.read_until(b'=>').split(b'\r\n')
telnet.write('exit\r\n'.encode('ascii'))
except EOFError:
_LOGGER.exception("Unexpected response from router")
return
except ConnectionRefusedError:
_LOGGER.exception("Connection refused by router," +
" is telnet enabled?")
return
devices = {}
for device in devices_result:
match = _DEVICES_REGEX.search(device.decode('utf-8'))
if match:
devices[match.group('ip')] = {
'ip': match.group('ip'),
'mac': match.group('mac').upper(),
'host': match.group('host'),
'status': match.group('status')
}
return devices

View File

@@ -0,0 +1,145 @@
"""
homeassistant.components.device_tracker.tomato
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning a Tomato router for device
presence.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.tomato/
"""
import logging
import json
from datetime import timedelta
import re
import threading
import requests
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
CONF_HTTP_ID = "http_id"
_LOGGER = logging.getLogger(__name__)
def get_scanner(hass, config):
""" Validates config and returns a Tomato scanner. """
if not validate_config(config,
{DOMAIN: [CONF_HOST, CONF_USERNAME,
CONF_PASSWORD, CONF_HTTP_ID]},
_LOGGER):
return None
return TomatoDeviceScanner(config[DOMAIN])
class TomatoDeviceScanner(object):
""" This class queries a wireless router running Tomato firmware
for connected devices.
A description of the Tomato API can be found on
http://paulusschoutsen.nl/blog/2013/10/tomato-api-documentation/
"""
def __init__(self, config):
host, http_id = config[CONF_HOST], config[CONF_HTTP_ID]
username, password = config[CONF_USERNAME], config[CONF_PASSWORD]
self.req = requests.Request('POST',
'http://{}/update.cgi'.format(host),
data={'_http_id': http_id,
'exec': 'devlist'},
auth=requests.auth.HTTPBasicAuth(
username, password)).prepare()
self.parse_api_pattern = re.compile(r"(?P<param>\w*) = (?P<value>.*);")
self.logger = logging.getLogger("{}.{}".format(__name__, "Tomato"))
self.lock = threading.Lock()
self.last_results = {"wldev": [], "dhcpd_lease": []}
self.success_init = self._update_tomato_info()
def scan_devices(self):
""" Scans for new devices and return a
list containing found device ids. """
self._update_tomato_info()
return [item[1] for item in self.last_results['wldev']]
def get_device_name(self, device):
""" Returns the name of the given device or None if we don't know. """
filter_named = [item[0] for item in self.last_results['dhcpd_lease']
if item[2] == device]
if not filter_named or not filter_named[0]:
return None
else:
return filter_named[0]
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_tomato_info(self):
""" Ensures the information from the Tomato router is up to date.
Returns boolean if scanning successful. """
with self.lock:
self.logger.info("Scanning")
try:
response = requests.Session().send(self.req, timeout=3)
# Calling and parsing the Tomato api here. We only need the
# wldev and dhcpd_lease values. For API description see:
# http://paulusschoutsen.nl/
# blog/2013/10/tomato-api-documentation/
if response.status_code == 200:
for param, value in \
self.parse_api_pattern.findall(response.text):
if param == 'wldev' or param == 'dhcpd_lease':
self.last_results[param] = \
json.loads(value.replace("'", '"'))
return True
elif response.status_code == 401:
# Authentication error
self.logger.exception((
"Failed to authenticate, "
"please check your username and password"))
return False
except requests.exceptions.ConnectionError:
# We get this if we could not connect to the router or
# an invalid http_id was supplied
self.logger.exception((
"Failed to connect to the router"
" or invalid http_id supplied"))
return False
except requests.exceptions.Timeout:
# We get this if we could not connect to the router or
# an invalid http_id was supplied
self.logger.exception(
"Connection to the router timed out")
return False
except ValueError:
# If json decoder could not parse the response
self.logger.exception(
"Failed to parse response from router")
return False

View File

@@ -0,0 +1,282 @@
"""
homeassistant.components.device_tracker.tplink
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning a TP-Link router for device
presence.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.tplink/
"""
import base64
import logging
from datetime import timedelta
import re
import threading
import requests
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
_LOGGER = logging.getLogger(__name__)
def get_scanner(hass, config):
""" Validates config and returns a TP-Link scanner. """
if not validate_config(config,
{DOMAIN: [CONF_HOST, CONF_USERNAME, CONF_PASSWORD]},
_LOGGER):
return None
scanner = Tplink3DeviceScanner(config[DOMAIN])
if not scanner.success_init:
scanner = Tplink2DeviceScanner(config[DOMAIN])
if not scanner.success_init:
scanner = TplinkDeviceScanner(config[DOMAIN])
return scanner if scanner.success_init else None
class TplinkDeviceScanner(object):
"""
This class queries a wireless router running TP-Link firmware
for connected devices.
"""
def __init__(self, config):
host = config[CONF_HOST]
username, password = config[CONF_USERNAME], config[CONF_PASSWORD]
self.parse_macs = re.compile('[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-' +
'[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}')
self.host = host
self.username = username
self.password = password
self.last_results = {}
self.lock = threading.Lock()
self.success_init = self._update_info()
def scan_devices(self):
"""
Scans for new devices and return a list containing found device ids.
"""
self._update_info()
return self.last_results
# pylint: disable=no-self-use
def get_device_name(self, device):
"""
The TP-Link firmware doesn't save the name of the wireless device.
"""
return None
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Ensures the information from the TP-Link router is up to date.
Returns boolean if scanning successful.
"""
with self.lock:
_LOGGER.info("Loading wireless clients...")
url = 'http://{}/userRpm/WlanStationRpm.htm'.format(self.host)
referer = 'http://{}'.format(self.host)
page = requests.get(url, auth=(self.username, self.password),
headers={'referer': referer})
result = self.parse_macs.findall(page.text)
if result:
self.last_results = [mac.replace("-", ":") for mac in result]
return True
return False
class Tplink2DeviceScanner(TplinkDeviceScanner):
"""
This class queries a wireless router running newer version of TP-Link
firmware for connected devices.
"""
def scan_devices(self):
"""
Scans for new devices and return a list containing found device ids.
"""
self._update_info()
return self.last_results.keys()
# pylint: disable=no-self-use
def get_device_name(self, device):
"""
The TP-Link firmware doesn't save the name of the wireless device.
"""
return self.last_results.get(device)
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Ensures the information from the TP-Link router is up to date.
Returns boolean if scanning successful.
"""
with self.lock:
_LOGGER.info("Loading wireless clients...")
url = 'http://{}/data/map_access_wireless_client_grid.json' \
.format(self.host)
referer = 'http://{}'.format(self.host)
# Router uses Authorization cookie instead of header
# Let's create the cookie
username_password = '{}:{}'.format(self.username, self.password)
b64_encoded_username_password = base64.b64encode(
username_password.encode('ascii')
).decode('ascii')
cookie = 'Authorization=Basic {}' \
.format(b64_encoded_username_password)
response = requests.post(url, headers={'referer': referer,
'cookie': cookie})
try:
result = response.json().get('data')
except ValueError:
_LOGGER.error("Router didn't respond with JSON. "
"Check if credentials are correct.")
return False
if result:
self.last_results = {
device['mac_addr'].replace('-', ':'): device['name']
for device in result
}
return True
return False
class Tplink3DeviceScanner(TplinkDeviceScanner):
"""
This class queries the Archer C9 router running version 150811 or higher
of TP-Link firmware for connected devices.
"""
def __init__(self, config):
self.stok = ''
self.sysauth = ''
super(Tplink3DeviceScanner, self).__init__(config)
def scan_devices(self):
"""
Scans for new devices and return a list containing found device ids.
"""
self._update_info()
return self.last_results.keys()
# pylint: disable=no-self-use
def get_device_name(self, device):
"""
The TP-Link firmware doesn't save the name of the wireless device.
We are forced to use the MAC address as name here.
"""
return self.last_results.get(device)
def _get_auth_tokens(self):
"""
Retrieves auth tokens from the router.
"""
_LOGGER.info("Retrieving auth tokens...")
url = 'http://{}/cgi-bin/luci/;stok=/login?form=login' \
.format(self.host)
referer = 'http://{}/webpages/login.html'.format(self.host)
# if possible implement rsa encryption of password here
response = requests.post(url,
params={'operation': 'login',
'username': self.username,
'password': self.password},
headers={'referer': referer})
try:
self.stok = response.json().get('data').get('stok')
_LOGGER.info(self.stok)
regex_result = re.search('sysauth=(.*);',
response.headers['set-cookie'])
self.sysauth = regex_result.group(1)
_LOGGER.info(self.sysauth)
return True
except ValueError:
_LOGGER.error("Couldn't fetch auth tokens!")
return False
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Ensures the information from the TP-Link router is up to date.
Returns boolean if scanning successful.
"""
with self.lock:
if (self.stok == '') or (self.sysauth == ''):
self._get_auth_tokens()
_LOGGER.info("Loading wireless clients...")
url = ('http://{}/cgi-bin/luci/;stok={}/admin/wireless?'
'form=statistics').format(self.host, self.stok)
referer = 'http://{}/webpages/index.html'.format(self.host)
response = requests.post(url,
params={'operation': 'load'},
headers={'referer': referer},
cookies={'sysauth': self.sysauth})
try:
json_response = response.json()
if json_response.get('success'):
result = response.json().get('data')
else:
if json_response.get('errorcode') == 'timeout':
_LOGGER.info("Token timed out. "
"Relogging on next scan.")
self.stok = ''
self.sysauth = ''
return False
else:
_LOGGER.error("An unknown error happened "
"while fetching data.")
return False
except ValueError:
_LOGGER.error("Router didn't respond with JSON. "
"Check if credentials are correct.")
return False
if result:
self.last_results = {
device['mac'].replace('-', ':'): device['mac']
for device in result
}
return True
return False

View File

@@ -0,0 +1,173 @@
"""
homeassistant.components.device_tracker.ubus
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Device tracker platform that supports scanning a OpenWRT router for device
presence.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/device_tracker.ubus/
"""
import logging
import json
from datetime import timedelta
import re
import threading
import requests
from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers import validate_config
from homeassistant.util import Throttle
from homeassistant.components.device_tracker import DOMAIN
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
_LOGGER = logging.getLogger(__name__)
def get_scanner(hass, config):
""" Validates config and returns a Luci scanner. """
if not validate_config(config,
{DOMAIN: [CONF_HOST, CONF_USERNAME, CONF_PASSWORD]},
_LOGGER):
return None
scanner = UbusDeviceScanner(config[DOMAIN])
return scanner if scanner.success_init else None
# pylint: disable=too-many-instance-attributes
class UbusDeviceScanner(object):
"""
This class queries a wireless router running OpenWrt firmware
for connected devices. Adapted from Tomato scanner.
Configure your routers' ubus ACL based on following instructions:
http://wiki.openwrt.org/doc/techref/ubus
Read only access will be fine.
To use this class you have to install rpcd-mod-file package
in your OpenWrt router:
opkg install rpcd-mod-file
"""
def __init__(self, config):
host = config[CONF_HOST]
username, password = config[CONF_USERNAME], config[CONF_PASSWORD]
self.parse_api_pattern = re.compile(r"(?P<param>\w*) = (?P<value>.*);")
self.lock = threading.Lock()
self.last_results = {}
self.url = 'http://{}/ubus'.format(host)
self.session_id = _get_session_id(self.url, username, password)
self.hostapd = []
self.leasefile = None
self.mac2name = None
self.success_init = self.session_id is not None
def scan_devices(self):
"""
Scans for new devices and return a list containing found device ids.
"""
self._update_info()
return self.last_results
def get_device_name(self, device):
""" Returns the name of the given device or None if we don't know. """
with self.lock:
if self.leasefile is None:
result = _req_json_rpc(self.url, self.session_id,
'call', 'uci', 'get',
config="dhcp", type="dnsmasq")
if result:
values = result["values"].values()
self.leasefile = next(iter(values))["leasefile"]
else:
return
if self.mac2name is None:
result = _req_json_rpc(self.url, self.session_id,
'call', 'file', 'read',
path=self.leasefile)
if result:
self.mac2name = dict()
for line in result["data"].splitlines():
hosts = line.split(" ")
self.mac2name[hosts[1].upper()] = hosts[3]
else:
# Error, handled in the _req_json_rpc
return
return self.mac2name.get(device.upper(), None)
@Throttle(MIN_TIME_BETWEEN_SCANS)
def _update_info(self):
"""
Ensures the information from the Luci router is up to date.
Returns boolean if scanning successful.
"""
if not self.success_init:
return False
with self.lock:
_LOGGER.info("Checking ARP")
if not self.hostapd:
hostapd = _req_json_rpc(self.url, self.session_id,
'list', 'hostapd.*', '')
self.hostapd.extend(hostapd.keys())
self.last_results = []
results = 0
for hostapd in self.hostapd:
result = _req_json_rpc(self.url, self.session_id,
'call', hostapd, 'get_clients')
if result:
results = results + 1
self.last_results.extend(result['clients'].keys())
return bool(results)
def _req_json_rpc(url, session_id, rpcmethod, subsystem, method, **params):
""" Perform one JSON RPC operation. """
data = json.dumps({"jsonrpc": "2.0",
"id": 1,
"method": rpcmethod,
"params": [session_id,
subsystem,
method,
params]})
try:
res = requests.post(url, data=data, timeout=5)
except requests.exceptions.Timeout:
return
if res.status_code == 200:
response = res.json()
if rpcmethod == "call":
return response["result"][1]
else:
return response["result"]
def _get_session_id(url, username, password):
""" Get authentication token for the given host+username+password. """
res = _req_json_rpc(url, "00000000000000000000000000000000", 'call',
'session', 'login', username=username,
password=password)
return res["ubus_rpc_session"]

View File

@@ -0,0 +1,100 @@
"""
homeassistant.components.discovery
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Starts a service to scan in intervals for new devices.
Will emit EVENT_PLATFORM_DISCOVERED whenever a new service has been discovered.
Knows which components handle certain types, will make sure they are
loaded before the EVENT_PLATFORM_DISCOVERED is fired.
"""
import logging
import threading
from homeassistant import bootstrap
from homeassistant.const import (
EVENT_HOMEASSISTANT_START, EVENT_PLATFORM_DISCOVERED,
ATTR_SERVICE, ATTR_DISCOVERED)
DOMAIN = "discovery"
REQUIREMENTS = ['netdisco==0.5.2']
SCAN_INTERVAL = 300 # seconds
SERVICE_WEMO = 'belkin_wemo'
SERVICE_HUE = 'philips_hue'
SERVICE_CAST = 'google_cast'
SERVICE_NETGEAR = 'netgear_router'
SERVICE_SONOS = 'sonos'
SERVICE_PLEX = 'plex_mediaserver'
SERVICE_HANDLERS = {
SERVICE_WEMO: "switch",
SERVICE_CAST: "media_player",
SERVICE_HUE: "light",
SERVICE_NETGEAR: 'device_tracker',
SERVICE_SONOS: 'media_player',
SERVICE_PLEX: 'media_player',
}
def listen(hass, service, callback):
"""
Setup listener for discovery of specific service.
Service can be a string or a list/tuple.
"""
if isinstance(service, str):
service = (service,)
else:
service = tuple(service)
def discovery_event_listener(event):
""" Listens for discovery events. """
if event.data[ATTR_SERVICE] in service:
callback(event.data[ATTR_SERVICE], event.data[ATTR_DISCOVERED])
hass.bus.listen(EVENT_PLATFORM_DISCOVERED, discovery_event_listener)
def setup(hass, config):
""" Starts a discovery service. """
logger = logging.getLogger(__name__)
from netdisco.service import DiscoveryService
# Disable zeroconf logging, it spams
logging.getLogger('zeroconf').setLevel(logging.CRITICAL)
lock = threading.Lock()
def new_service_listener(service, info):
""" Called when a new service is found. """
with lock:
logger.info("Found new service: %s %s", service, info)
component = SERVICE_HANDLERS.get(service)
# We do not know how to handle this service
if not component:
return
# This component cannot be setup.
if not bootstrap.setup_component(hass, component, config):
return
hass.bus.fire(EVENT_PLATFORM_DISCOVERED, {
ATTR_SERVICE: service,
ATTR_DISCOVERED: info
})
# pylint: disable=unused-argument
def start_discovery(event):
""" Start discovering. """
netdisco = DiscoveryService(SCAN_INTERVAL)
netdisco.add_listener(new_service_listener)
netdisco.start()
hass.bus.listen_once(EVENT_HOMEASSISTANT_START, start_discovery)
return True

View File

@@ -1,15 +1,20 @@
"""
homeassistant.components.downloader
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides functionality to download files.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/downloader/
"""
import os
import logging
import re
import threading
import homeassistant.util as util
import requests
from homeassistant.helpers import validate_config
from homeassistant.util import sanitize_filename
DOMAIN = "downloader"
@@ -18,33 +23,36 @@ SERVICE_DOWNLOAD_FILE = "download_file"
ATTR_URL = "url"
ATTR_SUBDIR = "subdir"
CONF_DOWNLOAD_DIR = 'download_dir'
# pylint: disable=too-many-branches
def setup(bus, download_path):
def setup(hass, config):
""" Listens for download events to download files. """
logger = logging.getLogger(__name__)
try:
import requests
except ImportError:
logger.exception(("Failed to import requests. "
"Did you maybe not execute 'pip install requests'?"))
if not validate_config(config, {DOMAIN: [CONF_DOWNLOAD_DIR]}, logger):
return False
download_path = config[DOMAIN][CONF_DOWNLOAD_DIR]
# If path is relative, we assume relative to HASS config dir
if not os.path.isabs(download_path):
download_path = hass.config.path(download_path)
if not os.path.isdir(download_path):
logger.error(
("Download path {} does not exist. File Downloader not active.").
format(download_path))
"Download path %s does not exist. File Downloader not active.",
download_path)
return False
def download_file(service):
""" Starts thread to download file specified in the url. """
if not ATTR_URL in service.data:
if ATTR_URL not in service.data:
logger.error("Service called but 'url' parameter not specified.")
return
@@ -56,11 +64,11 @@ def setup(bus, download_path):
subdir = service.data.get(ATTR_SUBDIR)
if subdir:
subdir = util.sanitize_filename(subdir)
subdir = sanitize_filename(subdir)
final_path = None
req = requests.get(url, stream=True)
req = requests.get(url, stream=True, timeout=10)
if req.status_code == 200:
filename = None
@@ -80,7 +88,7 @@ def setup(bus, download_path):
filename = "ha_download"
# Remove stuff to ruin paths
filename = util.sanitize_filename(filename)
filename = sanitize_filename(filename)
# Do we want to download to subdir, create if needed
if subdir:
@@ -106,19 +114,16 @@ def setup(bus, download_path):
final_path = "{}_{}.{}".format(path, tries, ext)
logger.info("{} -> {}".format(
url, final_path))
logger.info("%s -> %s", url, final_path)
with open(final_path, 'wb') as fil:
for chunk in req.iter_content(1024):
fil.write(chunk)
logger.info("Downloading of {} done".format(
url))
logger.info("Downloading of %s done", url)
except requests.exceptions.ConnectionError:
logger.exception("ConnectionError occured for {}".
format(url))
logger.exception("ConnectionError occured for %s", url)
# Remove file if we started downloading but failed
if final_path and os.path.isfile(final_path):
@@ -126,7 +131,7 @@ def setup(bus, download_path):
threading.Thread(target=do_download).start()
bus.register_service(DOMAIN, SERVICE_DOWNLOAD_FILE,
download_file)
hass.services.register(DOMAIN, SERVICE_DOWNLOAD_FILE,
download_file)
return True

View File

@@ -0,0 +1,155 @@
"""
homeassistant.components.ecobee
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ecobee Component
This component adds support for Ecobee3 Wireless Thermostats.
You will need to setup developer access to your thermostat,
and create and API key on the ecobee website.
The first time you run this component you will see a configuration
component card in Home Assistant. This card will contain a PIN code
that you will need to use to authorize access to your thermostat. You
can do this at https://www.ecobee.com/consumerportal/index.html
Click My Apps, Add application, Enter Pin and click Authorize.
After authorizing the application click the button in the configuration
card. Now your thermostat and sensors should shown in home-assistant.
You can use the optional hold_temp parameter to set whether or not holds
are set indefintely or until the next scheduled event.
ecobee:
api_key: asdfasdfasdfasdfasdfaasdfasdfasdfasdf
hold_temp: True
"""
from datetime import timedelta
import logging
import os
from homeassistant.loader import get_component
from homeassistant import bootstrap
from homeassistant.util import Throttle
from homeassistant.const import (
EVENT_PLATFORM_DISCOVERED, ATTR_SERVICE, ATTR_DISCOVERED, CONF_API_KEY)
DOMAIN = "ecobee"
DISCOVER_THERMOSTAT = "ecobee.thermostat"
DISCOVER_SENSORS = "ecobee.sensor"
NETWORK = None
HOLD_TEMP = 'hold_temp'
REQUIREMENTS = [
'https://github.com/nkgilley/python-ecobee-api/archive/'
'92a2f330cbaf601d0618456fdd97e5a8c42c1c47.zip#python-ecobee==0.0.4']
_LOGGER = logging.getLogger(__name__)
ECOBEE_CONFIG_FILE = 'ecobee.conf'
_CONFIGURING = {}
# Return cached results if last scan was less then this time ago
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=180)
def request_configuration(network, hass, config):
""" Request configuration steps from the user. """
configurator = get_component('configurator')
if 'ecobee' in _CONFIGURING:
configurator.notify_errors(
_CONFIGURING['ecobee'], "Failed to register, please try again.")
return
# pylint: disable=unused-argument
def ecobee_configuration_callback(callback_data):
""" Actions to do when our configuration callback is called. """
network.request_tokens()
network.update()
setup_ecobee(hass, network, config)
_CONFIGURING['ecobee'] = configurator.request_config(
hass, "Ecobee", ecobee_configuration_callback,
description=(
'Please authorize this app at https://www.ecobee.com/consumer'
'portal/index.html with pin code: ' + network.pin),
description_image="/static/images/config_ecobee_thermostat.png",
submit_caption="I have authorized the app."
)
def setup_ecobee(hass, network, config):
""" Setup ecobee thermostat """
# If ecobee has a PIN then it needs to be configured.
if network.pin is not None:
request_configuration(network, hass, config)
return
if 'ecobee' in _CONFIGURING:
configurator = get_component('configurator')
configurator.request_done(_CONFIGURING.pop('ecobee'))
# Ensure component is loaded
bootstrap.setup_component(hass, 'thermostat', config)
bootstrap.setup_component(hass, 'sensor', config)
hold_temp = config[DOMAIN].get(HOLD_TEMP, False)
# Fire thermostat discovery event
hass.bus.fire(EVENT_PLATFORM_DISCOVERED, {
ATTR_SERVICE: DISCOVER_THERMOSTAT,
ATTR_DISCOVERED: {'hold_temp': hold_temp}
})
# Fire sensor discovery event
hass.bus.fire(EVENT_PLATFORM_DISCOVERED, {
ATTR_SERVICE: DISCOVER_SENSORS,
ATTR_DISCOVERED: {}
})
# pylint: disable=too-few-public-methods
class EcobeeData(object):
""" Gets the latest data and update the states. """
def __init__(self, config_file):
from pyecobee import Ecobee
self.ecobee = Ecobee(config_file)
@Throttle(MIN_TIME_BETWEEN_UPDATES)
def update(self):
""" Get the latest data from pyecobee. """
self.ecobee.update()
_LOGGER.info("ecobee data updated successfully.")
def setup(hass, config):
"""
Setup Ecobee.
Will automatically load thermostat and sensor components to support
devices discovered on the network.
"""
# pylint: disable=global-statement, import-error
global NETWORK
if 'ecobee' in _CONFIGURING:
return
from pyecobee import config_from_file
# Create ecobee.conf if it doesn't exist
if not os.path.isfile(hass.config.path(ECOBEE_CONFIG_FILE)):
if config[DOMAIN].get(CONF_API_KEY) is None:
_LOGGER.error("No ecobee api_key found in config.")
return
jsonconfig = {"API_KEY": config[DOMAIN].get(CONF_API_KEY)}
config_from_file(hass.config.path(ECOBEE_CONFIG_FILE), jsonconfig)
NETWORK = EcobeeData(hass.config.path(ECOBEE_CONFIG_FILE))
setup_ecobee(hass, NETWORK.ecobee, config)
return True

View File

@@ -0,0 +1,115 @@
"""
homeassistant.components.frontend
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides a frontend for Home Assistant.
"""
import re
import os
import logging
from . import version, mdi_version
import homeassistant.util as util
from homeassistant.const import URL_ROOT, HTTP_OK
DOMAIN = 'frontend'
DEPENDENCIES = ['api']
INDEX_PATH = os.path.join(os.path.dirname(__file__), 'index.html.template')
_LOGGER = logging.getLogger(__name__)
FRONTEND_URLS = [
URL_ROOT, '/logbook', '/history', '/map', '/devService', '/devState',
'/devEvent', '/devInfo', '/devTemplate',
re.compile(r'/states(/([a-zA-Z\._\-0-9/]+)|)'),
]
_FINGERPRINT = re.compile(r'^(\w+)-[a-z0-9]{32}\.(\w+)$', re.IGNORECASE)
def setup(hass, config):
""" Setup serving the frontend. """
if 'http' not in hass.config.components:
_LOGGER.error('Dependency http is not loaded')
return False
for url in FRONTEND_URLS:
hass.http.register_path('GET', url, _handle_get_root, False)
hass.http.register_path('GET', '/service_worker.js',
_handle_get_service_worker, False)
# Static files
hass.http.register_path(
'GET', re.compile(r'/static/(?P<file>[a-zA-Z\._\-0-9/]+)'),
_handle_get_static, False)
hass.http.register_path(
'HEAD', re.compile(r'/static/(?P<file>[a-zA-Z\._\-0-9/]+)'),
_handle_get_static, False)
hass.http.register_path(
'GET', re.compile(r'/local/(?P<file>[a-zA-Z\._\-0-9/]+)'),
_handle_get_local, False)
return True
def _handle_get_root(handler, path_match, data):
""" Renders the frontend. """
handler.send_response(HTTP_OK)
handler.send_header('Content-type', 'text/html; charset=utf-8')
handler.end_headers()
if handler.server.development:
app_url = "home-assistant-polymer/src/home-assistant.html"
else:
app_url = "frontend-{}.html".format(version.VERSION)
# auto login if no password was set, else check api_password param
auth = ('no_password_set' if handler.server.api_password is None
else data.get('api_password', ''))
with open(INDEX_PATH) as template_file:
template_html = template_file.read()
template_html = template_html.replace('{{ app_url }}', app_url)
template_html = template_html.replace('{{ auth }}', auth)
template_html = template_html.replace('{{ icons }}', mdi_version.VERSION)
handler.wfile.write(template_html.encode("UTF-8"))
def _handle_get_service_worker(handler, path_match, data):
""" Returns service worker for the frontend. """
if handler.server.development:
sw_path = "home-assistant-polymer/build/service_worker.js"
else:
sw_path = "service_worker.js"
handler.write_file(os.path.join(os.path.dirname(__file__), 'www_static',
sw_path))
def _handle_get_static(handler, path_match, data):
""" Returns a static file for the frontend. """
req_file = util.sanitize_path(path_match.group('file'))
# Strip md5 hash out
fingerprinted = _FINGERPRINT.match(req_file)
if fingerprinted:
req_file = "{}.{}".format(*fingerprinted.groups())
path = os.path.join(os.path.dirname(__file__), 'www_static', req_file)
handler.write_file(path)
def _handle_get_local(handler, path_match, data):
"""
Returns a static file from the hass.config.path/www for the frontend.
"""
req_file = util.sanitize_path(path_match.group('file'))
path = handler.server.hass.config.path('www', req_file)
handler.write_file(path)

Some files were not shown because too many files have changed in this diff Show More