Compare commits
1 Commits
master
...
55fe9570b3
Author | SHA1 | Date | |
---|---|---|---|
55fe9570b3 |
24
README.md
24
README.md
@ -2,15 +2,15 @@
|
|||||||
|
|
||||||
An [Albert](https://albertlauncher.github.io/) extention to view and control devices in your [HomeAssistant](https://www.home-assistant.io/) instance.
|
An [Albert](https://albertlauncher.github.io/) extention to view and control devices in your [HomeAssistant](https://www.home-assistant.io/) instance.
|
||||||
|
|
||||||
This extension is heavily inspired by the home assistant extension for ulauncher from [qcasey](https://github.com/qcasey/ulauncher-homeassistant).
|
This extension is heavily inspired by the home assistant extesnsion for ulauncher from [qcasey](https://github.com/qcasey/ulauncher-homeassistant).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
To use this extension, you need the Python `requests` library:
|
To use this extension, you need the Python `requests` library:
|
||||||
|
|
||||||
```bash
|
```
|
||||||
pip install requests
|
pip install requests
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -19,26 +19,15 @@ pip install requests
|
|||||||
You need to specify the URL and [API Key](https://developers.home-assistant.io/docs/api/rest/¦) of your Home Assistant instance in the configuration file (e.g. location: `$HOME/.config/albert/homeassistant_config.json`).
|
You need to specify the URL and [API Key](https://developers.home-assistant.io/docs/api/rest/¦) of your Home Assistant instance in the configuration file (e.g. location: `$HOME/.config/albert/homeassistant_config.json`).
|
||||||
You can generate a new long lived API Key by clicking your name in the bottom left in the Home Assistant UI.
|
You can generate a new long lived API Key by clicking your name in the bottom left in the Home Assistant UI.
|
||||||
|
|
||||||
Example:
|
The item order is based on the entity class. Lights and switches are show first, then scenes etc. You can change the order in the configuration file. See the default sorting order below:
|
||||||
```json
|
```json
|
||||||
{
|
{ ...
|
||||||
"hass_url": "http://192.168.1.2:8123",
|
|
||||||
"hass_key": "s1GeOobviEbZS3OjfkYVmOQDMbCRIH0kCtisGVi2EQoKbDeqq"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
The item order is based on the entity class. Lights and switches are shown first, then scenes and groups etc. You can change the order in the configuration file with `sort_order`. See the default sorting order below:
|
|
||||||
```json
|
|
||||||
{ ...
|
|
||||||
sort_order: {"light": 1, "switch": 1, "scene": 2, "group": 2, "automation": 3}
|
sort_order: {"light": 1, "switch": 1, "scene": 2, "group": 2, "automation": 3}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
```
|
`<trigger> <entity search>`
|
||||||
<trigger> <entity search>
|
|
||||||
```
|
|
||||||
|
|
||||||
You can see the actions by pressing the `alt` key.
|
You can see the actions by pressing the `alt` key.
|
||||||
|
|
||||||
@ -46,6 +35,7 @@ You can see the actions by pressing the `alt` key.
|
|||||||
|
|
||||||
- renew icons (.svg)
|
- renew icons (.svg)
|
||||||
- test more device classes and adjust which service to call
|
- test more device classes and adjust which service to call
|
||||||
|
- sort items: name matching first
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
22
__init__.py
22
__init__.py
@ -34,7 +34,7 @@ icon_files = {
|
|||||||
"switch": "icons/switch.png",
|
"switch": "icons/switch.png",
|
||||||
}
|
}
|
||||||
|
|
||||||
toggle_types = ["light", "switch", "automation", "group", "script", "input_boolean", "climate", "camera"]
|
toggle_types = ["light", "switch", "automation", "group", "input_boolean", "climate", "camera"]
|
||||||
on_off_types = ["scene", "media_player"] # use turn_{on,off} instead of toggle
|
on_off_types = ["scene", "media_player"] # use turn_{on,off} instead of toggle
|
||||||
|
|
||||||
|
|
||||||
@ -124,12 +124,12 @@ def showEntities(query):
|
|||||||
|
|
||||||
entity_query_list = query.string.split()
|
entity_query_list = query.string.split()
|
||||||
|
|
||||||
# Query entities from HASS
|
|
||||||
|
# query entities from HASS
|
||||||
try:
|
try:
|
||||||
response = requests.get(config["state_query"], headers=config["headers"])
|
response = requests.get(config["state_query"], headers=config["headers"])
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
except requests.exceptions.RequestException as error:
|
except requests.exceptions.RequestException as error:
|
||||||
critical(str(error))
|
|
||||||
return Item(id=__title__,
|
return Item(id=__title__,
|
||||||
icon=os.path.dirname(__file__) + "/" + icon_files["logo"],
|
icon=os.path.dirname(__file__) + "/" + icon_files["logo"],
|
||||||
text="Error while getting entity states from Home Assistant",
|
text="Error while getting entity states from Home Assistant",
|
||||||
@ -193,12 +193,7 @@ def showEntities(query):
|
|||||||
entity["state"].capitalize()
|
entity["state"].capitalize()
|
||||||
)
|
)
|
||||||
|
|
||||||
if state == "unavailable" and "unavailable" not in entity:
|
# build item for list
|
||||||
entity["unavailable"] = True
|
|
||||||
entities.append(entity)
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Build item for list
|
|
||||||
item = Item(id=__title__,
|
item = Item(id=__title__,
|
||||||
icon=entity_icon,
|
icon=entity_icon,
|
||||||
text=entity["attributes"]["friendly_name"],
|
text=entity["attributes"]["friendly_name"],
|
||||||
@ -206,7 +201,7 @@ def showEntities(query):
|
|||||||
subtext="%s | %s" % (state_colored, entity_class.capitalize())
|
subtext="%s | %s" % (state_colored, entity_class.capitalize())
|
||||||
)
|
)
|
||||||
|
|
||||||
# Add actions depending on class
|
# add actions depending on class
|
||||||
if entity_class in toggle_types:
|
if entity_class in toggle_types:
|
||||||
item.addAction(FuncAction("Toggle", lambda d=data: sendCommand(d, "homeassistant/toggle")))
|
item.addAction(FuncAction("Toggle", lambda d=data: sendCommand(d, "homeassistant/toggle")))
|
||||||
|
|
||||||
@ -216,16 +211,13 @@ def showEntities(query):
|
|||||||
|
|
||||||
if entity_class == "cover":
|
if entity_class == "cover":
|
||||||
open_or_close = "open" if state != "open" else "close"
|
open_or_close = "open" if state != "open" else "close"
|
||||||
item.addAction(FuncAction("%s Cover" % (open_or_close.capitalize()), lambda d=data: sendCommand(d, "cover/%s_cover") % (open_or_close)))
|
item.addAction(FuncAction("%s Cover" % (open_or_close.capitalize()), lambda d=data: sendCommand(d, "homeassistant/cover/%s_cover") % (open_or_close)))
|
||||||
|
|
||||||
if entity_class == "automation":
|
|
||||||
item.addAction(FuncAction("Trigger", lambda d=data: sendCommand(d, "automation/trigger")))
|
|
||||||
|
|
||||||
item.addAction(ClipAction("Copy ID", entity["entity_id"]))
|
item.addAction(ClipAction("Copy ID", entity["entity_id"]))
|
||||||
|
|
||||||
results.append(item)
|
results.append(item)
|
||||||
|
|
||||||
# No entity found
|
# no entity found
|
||||||
if len(results) == 0:
|
if len(results) == 0:
|
||||||
results.append(
|
results.append(
|
||||||
Item(id=__title__,
|
Item(id=__title__,
|
||||||
|
BIN
ha_demo.mp4
BIN
ha_demo.mp4
Binary file not shown.
Reference in New Issue
Block a user