/spook

Spook 👻 Not your homie

Primary LanguagePythonOtherNOASSERTION

Spook 👻 Not your homie.

GitHub Release Project Stage License Project Maintenance Quality Gate Status

Spook - Not your homie

About

Spook is a custom integration for Home Assistant, which is not your homie.

You should not use this custom integration, nor should you expect it to work. The integration will break a lot, and will probably not survive the next Home Assistant upgrade. Heck, it will most likely not even survive its own next release.

This integration comes with absolutely 0/zero/zip/nada/noppes support, and has less documentation than the quirks of my partner.

Above all, this integration may just break your setup in an way that is not recoverable. Nor will it provide you with a tissue to dry up your tears when you are crying in a fetal position under your desk after ignoring all of the above.

I've warned you :D

../Frenck

Cool, but why? What is it?

So, there a lot of things/features, that will never end up in Home Assistant itself.

This can have various reasons, for example: It is just too random, out of scope, not matching the Home Assistant philosophy, violating architectural design, still in early development, experimental, explorative, or just freaking useless.

Spook doesn't care. He is nobodies homie.

So, maybe, that one feature you wanted Home Assistant to have, is in Spook.

However, remember, Spook is not your homie. All stuff in here, is not part of Home Assistant (or at least not yet) for a reason. So, don't expect it to work, or to be supported, or well, for starters, to be a good idea.

Some guidance for the brave

Installation

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

You can find it in the HACS store by searching for "Spook", but you shoudn't. You could manually add this repository to HACS, but you shouldn't. You can also install it manually by copying the spook folder into your custom_components folder, but you shouldn't.

Just don't.

Configuration

Open your Home Assistant instance and start setting up a new integration.

You shouldn't.

Entities

This integration will provide you with entities you'd absolutely do not need. All of them are enabled by default to ensure you have a bad time, straight of the box.

Sensors

  • Total number of entities: To show your friends how big your setup is. #compensation
  • Number of entities for each entity type: So you know how many lightbulbs you have. #count
    • Number of air_quality entities.
    • Number of alarm_control_panel entities.
    • Number of binary_sensor entities.
    • Number of button entities.
    • Number of camera entities.
    • Number of climate entities.
    • Number of cover entities.
    • Number of device_tracker entities.
    • Number of fan entities.
    • Number of humidifier entities.
    • Number of light entities.
    • Number of lock entities.
    • Number of media_player entities.
    • Number of number entities.
    • Number of remote entities.
    • Number of select entities.
    • Number of sensor entities.
    • Number of siren entities.
    • Number of switch entities.
    • Number of text entities.
    • Number of update entities.
    • Number of water_heater entities.
    • Number of weather entities.
  • Number of areas: In case you forgot how many rooms your house has. #1
  • Number of automations: Because that is such a useful metric. #robots
  • Number of devices: That are in the device registry. #bling
  • Number of persons: How many people are you constantly tracking the location of? #privacy
  • Number of scenes: Maybe you can ask your partner to make a scene... #fight
  • Number of scripts: More than the average unemployed actor yet? #hollywood
  • Number of suns: Answers how godlike you are. #burn
  • Number of zones: How many comfort zones you have on a map. #zoneing
  • Number of integrations in use: Consider using less integrations. #lessismore
  • Number of custom integrations in use: In this case... #lessisevenmore (delete this one! 🙃)

Switches

  • Home Assistant Cloud: Switch to control behavior of Nabu Casa's Home Assistant Cloud. #love
    • Alexa: Enable/disable Alexa connection. #amazon
    • Alexa state reporting: Enable/disable Alexa state reporting. #ping
    • Google Assistant: Enable/disable Google Assistant connection. #bigtech
    • Google Assistant state reporting: Enable/disable Google Assistant state reporting connection. #pong
    • Remote: Enable/disable remote access to the Home Asistant frontend. #rdp

Services

There are quite a few useless and horrible services available for you to explore and self-destruct your setup with. The developer service tools are great to get you into such a situation.

Open your Home Assistant instance and show your service developer tools.

Service: Import Blueprint

Call it using: blueprint.import

Downloads and imports a automation/script Blueprint, directly from the URL you pass into this service. #noquestionsasked

Service: Disable an integration

Call it using: homeassistant.disable_config_entry

This service can be used to disable a integration configuration entry (those you see on your integrations dashboard) on the fly. #bye

Service: Enable an integration

Call it using: homeassistant.enable_config_entry

Be amazed... this service does the reverse of homeassistant.disable_config_entry. #mindblown

Service: Disable a device

Call it using: homeassistant.disable_device

This service can be used to disable a device on the fly. #whatever

Service: Enable a device

Call it using: homeassistant.enable_device

Guess what... this service does the reverse of homeassistant.disable_device. #noway

Service: Disable an entity

Call it using: homeassistant.disable_entity

This service can be used to disable a entity on the fly. #rocketship

Service: Enable an entity

Call it using: homeassistant.enable_entity

Really... this service does the reverse of homeassistant.disable_entity. #true

Service: Hide an entity

Call it using: homeassistant.hide_entity

This service can be used to hide a entity on the fly. #secret

Service: Unhide an entity

Call it using: homeassistant.unhide_entity

Do the math... this service does the reverse of homeassistant.hide_entity. #reveal

Service: Disable polling for updates

Call it using: homeassistant.disable_polling

This service can be used to disable polling for updates on an integration configuration entry (those you see on your integrations dashboard). #stopit

Service: Enable polling for updates

Call it using: homeassistant.enable_polling

This service can be used to enable polling for updates on an integration configuration entry (those you see on your integrations dashboard). This service does the reverse of homeassistant.disable_polling > #poking

Service: Ignore all discovered devices & services

Call it using: homeassistant.ignore_all_discovered

Click ignore on all discovered items on the integration dashboard; optionally only for specific integration (e.g., bluetooth). #talktothehand

Service: Delete all orphaned entities

Call it using: homeassistant.delete_all_orphaned_entities

Deletes all orphaned entities that no longer have an integration that claim/provide them. Please note, if the integration was just removed, it might need a restart for Home Assistant to realize they are orphaned. #annie

WARNING Entities might have been marked orphaned because an integration is offline or not working since Home Assistant started. Calling this service will delete those entities as well.

Service: Import statistics

Call it using: recorder.import_statistics

Advanced service to directly inject historical statistics data into the recorder long-term stats database. #easy

Service: Create area

Call it using: homeassistant.create_area

Instantly create new rooms in your home. #BobTheBuilder

Service: Add an alias to an area

Call it using: homeassistant.add_alias_to_area

Adds an alias (or multiple aliases) to an area. #aka

Service: Remove an alias from an area

Call it using: homeassistant.remove_alias_from_area

Removes an alias (or multiple aliases) from an area. #broom

Service: Set area aliases

Call it using: homeassistant.set_area_aliases

Sets the aliases for an area. #useless

Service: Add device to area

Call it using: homeassistant.add_device_to_area

Dynamicaly add/move a device to an new area. #moveit

Service: Remove device from area

Call it using: homeassistant.remove_device_from_area

Dynamicaly remove a device from an area. #poef

Service: Add entity to area

Call it using: homeassistant.add_entity_to_area

Dynamicaly add/move an entity to an area. #bam

Service: Remove entity from area

Call it using: homeassistant.remove_entity_from_area

Dynamicaly remove an entity from an area. #AaaaandItIsGone

Service: Delete area

Call it using: homeassistant.delete_area

Just like that, you made an area of your home dissapear. #DemolitionMan

Service: Create repair issue

Call it using: repairs.create

Battery empty? Raise a issue in Home Assistant Repairs. Although, you should probably just use a notification for this. #issues

Service: Remove repair issue

Call it using: repairs.remove

Removes a issue from Home Assistant Repairs. Can only remove repair issues that have been created using the repairs.create service. #trashit

Service: Ignore all repair issues

Call it using: repairs.ignore_all

Whatever issue is bothering you, just ignore it all and all your problems will magically be gone. #allgood

Service: Unignore all repair issues

Call it using: repairs.unignore_all

Will unignore all issues marked ignored, and shows them all again. #faceit

Service: Boo! 👻

Call it using: spook.boo

This service call will just always spook the hell out of Home Assistant. Home Assistant will shit its pants and abort the automation or script. #spooked

Service: Random fail

Call it using: spook.random_fail

This service call will randomly fail (and thus randomly stop your automation or script). Especially combined with continue_on_error: true this can be a great way add a useless service calls to your automation or script. #random

Entity services

Spook also extends the services available for entities. These services may extend the functionality if entity components (like select) or platform specific services provided by integrations.

Open your Home Assistant instance and show your service developer tools.

Service for input_number: Decrease value

Call it using: input_number.decrement

Override of the existing service, which provides the option to specify the amount to decrease the value by. #evenlower

Under consideration for contributing back to Home Assistant Core.

Service for input_number: Increase value

Call it using: input_number.increment

Override of the existing service, which provides the option to specify the amount to increase the value by. #moreoptions

Under consideration for contributing back to Home Assistant Core.

Service for input_number: Min value

Call it using: input_number.min

Set the value of a input_number entity to its minimum value/ #lowout

Service for input_number: Max value

Call it using: input_number.max

Set the value of a input_number entity to the maximum value. #maxout

Service for input_select: Select random option

Call it using: input_select.random

This service select a random option from the list of options of a select entity. Optionally this can be limited to a set of given options. #shuffle

Service for input_select: Shuffle options

Call it using: input_select.shuffle

Shuffles the list of selectable options for an input_select entity. Note: This is not persistent and will be undone once reloaded or Home Assistant restarts. #31254

Service for input_select: Sort options

Call it using: input_select.sort

Sorts the list of selectable options for an input_select entity. Note: This is not persistent and will be undone once reloaded or Home Assistant restarts. #12345

Service for number: Decrease value

Call it using: number.decrement

Decrease the value of a number entity, either by a single step or by a provided amount. #downboy

Under consideration for contributing back to Home Assistant Core.

Service for number: Increase value

Call it using: number.increment

Increase the value of a number entity, either by a single step or by a provided amount. #up #greatmovie

Under consideration for contributing back to Home Assistant Core.

Service for number: Min value

Call it using: number.min

Set the value of a number entity to its minimum value. #lowout

Service for number: Max value

Call it using: number.max

Set the value of a number entity to the maximum value. #maxout

Service for select: Select random option

Call it using: select.random

This service select a random option from the list of options of a select entity. Optionally this can be limited to a set of given options. #random

Repairs

Spook will float around your Home Assistant instance, and while it does, it might be able to find things that need your attention. Spook will notify you about these things using an Home Assistant repair issue. #whoyougonnacall

Open your Home Assistant instance and show your repairs.

Currently Spook will detect the following issues:

Obsolete integration YAML configuration

Finds YAML configuration for an integrations that no longer support it. Unless you like having unneeded shizzle in your YAML, it can be removed safely. #ghostbusters

Automations: Find use of non-existing areas, devices and entities

Finds automations that use non-existing areas, devices or entities in, for example, their service calls. #springcleaning

Intention to contribute back to Home Assistant Core once sure no false postives remain, and it has been extended to catch more situations.

Groups: Detect unknown group members

Finds groups that contain references to unknown members (entities). #aliens

Intention to contribute back to Home Assistant Core.

Riemann sum integral: Detect missing source sensor

Finds integrals that are missing a source sensor. #missinglink

Intention to contribute back to Home Assistant Core.

Scripts: Find use of non-existing areas, devices and entities

Finds scripts that use non-existing areas, devices or entities in, for example, their service calls. #void

Intention to contribute back to Home Assistant Core once sure no false postives remain, and it has been extended to catch more situations.

Frequently Asked Questions

In the first few days after putting Spook out, some of the same questions kept popping up. So, here are some answers to those questions.

Is this a serious thing?

Yes! It is just not a normal integration, like one that connects to a device or service, or one that provides a helper of some sort. But it is a serious integration, that is meant to be used in a serious way.

Why is Spook called Spook?

I (Frenck) am Dutch. I grew up with "Casper het vriendelijke spookje", also known as "Casper the friendly ghost". "Spook" is the Dutch for "ghost".

Casper is scary at first sight, but you could really love him in the end. Which seems fitting for a custom integration, as custom integrations are more likely to break, thus being a little scared of them is not a bad thing.

"Not your homie" is a refence to my the livestreams I used to do. I called my viewers "My Home Assistant Homies", or just "Homies". It is thus referring to you, the Home Assistant user, as my friend, my homie. However, "Spook" is not your homie, it is a ghost, a spooky thing, he is suposed to make you think a little about what you are doing before you use it.

Nice little fact, I did use "homey" at first (to maybe annoy the Homey users a bit in SEO), but I decided not to be that badword and to change it back to just "homie".

Lastly, the little ghost logo & use of the emoji. This is great inspiration from the Mushroom card project (I love it!). They use a simple mushroom emoji and you see it everywhere in the Home Assistant community, thus decided to do a similar thing.

Does this integration break my Home Assistant instance?

Well, that is not the goal of course. But, it is a custom integration, so there is a chance it might break your instance. This applies to any custom integration, not just Spook.

I'm just sharing what I have, without any warranty. I've decided to be blunt about it, and make it at least fun to read. I could have written a small warning, that would have been boring.

Does Spook do random things to my home?

No. It does not do random things. It is not a chaos testing thing and it will not turn lights on/off randomly in the night. Unless it is a bug or broken of course.

Ok, so should I use Spook?

No! The license doesn't allow that (see below).

Changelog & Releases

This repository does not keep a change log using GitHub's releases functionality. The format of the log is based on the direction the wind blows.

Releases use a Semantic Versioning, compatible version number of MAJOR.MINOR.PATCH, as that is required for Home Assistant. In a nutshell, the version will be incremented based on the following:

  • MAJOR: If there is almost nothing changed.
  • MINOR: I have no idea, possibily breaking.
  • PATCH: I didn't care enough to change more numbers.

Contributing

We've set up a separate document for our contribution guidelines.

Authors & contributors

The original setup of this repository is by Franck Nijhof.

For a full list of all authors and contributors, check the contributor's page.

Disclaimer

At this point, I guess it goes without saying that this integration is not affiliated with, endorsed or recommended by the Home Assistant project.

It is not supported by the Home Assistant project.

If you experience issues with this integration, or as a result of this integration, please go cry a lot on your own. #sorrynotsorry

License

Copyright (c) 2023 Franck Nijhof

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 the Software without restriction, including without limitation the rights to copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, but NOT including the right to run, execute or use the Software or any executable binaries built from the source code.

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.