Add floorplan config
This commit is contained in:
parent
f390000e87
commit
2355f9e767
@ -7,12 +7,7 @@
|
|||||||
../server.nix
|
../server.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
nixpkgs = {
|
nixpkgs.hostPlatform = "aarch64-linux";
|
||||||
hostPlatform = "aarch64-linux";
|
|
||||||
overlays = [
|
|
||||||
(import ./../../overlays/ha-floorplan.nix)
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
hardware = {
|
hardware = {
|
||||||
raspberry-pi."4" = {
|
raspberry-pi."4" = {
|
||||||
|
@ -3,9 +3,15 @@
|
|||||||
let
|
let
|
||||||
cfg = config.modules.services.home-assistant;
|
cfg = config.modules.services.home-assistant;
|
||||||
in {
|
in {
|
||||||
|
imports = [
|
||||||
|
./floorplan/default.nix
|
||||||
|
./mqtt.nix
|
||||||
|
];
|
||||||
|
|
||||||
options.modules.services.home-assistant.enable = lib.mkEnableOption "home-assistant";
|
options.modules.services.home-assistant.enable = lib.mkEnableOption "home-assistant";
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
age.secrets."files/services/home-assistant/secrets.yaml" = {
|
age.secrets."files/services/home-assistant/secrets.yaml" = {
|
||||||
file = "${self.inputs.secrets}/files/services/home-assistant/secrets.yaml.age";
|
file = "${self.inputs.secrets}/files/services/home-assistant/secrets.yaml.age";
|
||||||
path = "${config.services.home-assistant.configDir}/secrets.yaml";
|
path = "${config.services.home-assistant.configDir}/secrets.yaml";
|
||||||
@ -13,12 +19,6 @@ in {
|
|||||||
group = "hass";
|
group = "hass";
|
||||||
};
|
};
|
||||||
|
|
||||||
modules.services.borgmatic.directories = [
|
|
||||||
"/var/lib/mosquitto"
|
|
||||||
"/var/lib/zigbee2mqtt"
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
services.home-assistant = {
|
services.home-assistant = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
||||||
@ -61,10 +61,6 @@ in {
|
|||||||
};
|
};
|
||||||
lovelace = {
|
lovelace = {
|
||||||
resources = [
|
resources = [
|
||||||
{
|
|
||||||
url = "/local/nixos-lovelace-modules/floorplan.js";
|
|
||||||
type = "module";
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
url = "/local/nixos-lovelace-modulels/mushroom.js";
|
url = "/local/nixos-lovelace-modulels/mushroom.js";
|
||||||
type = "module";
|
type = "module";
|
||||||
@ -73,7 +69,6 @@ in {
|
|||||||
};
|
};
|
||||||
media_player = [ ];
|
media_player = [ ];
|
||||||
mobile_app = { };
|
mobile_app = { };
|
||||||
mqtt = { };
|
|
||||||
onkyo = { };
|
onkyo = { };
|
||||||
open_meteo = { };
|
open_meteo = { };
|
||||||
recorder = {
|
recorder = {
|
||||||
@ -86,6 +81,8 @@ in {
|
|||||||
zeroconf = { };
|
zeroconf = { };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
configDir = "/etc/home-assistant";
|
||||||
|
|
||||||
extraComponents = [
|
extraComponents = [
|
||||||
"air_quality"
|
"air_quality"
|
||||||
"airly"
|
"airly"
|
||||||
@ -183,11 +180,6 @@ in {
|
|||||||
"modern_forms"
|
"modern_forms"
|
||||||
"mold_indicator"
|
"mold_indicator"
|
||||||
"moon"
|
"moon"
|
||||||
"mqtt"
|
|
||||||
"mqtt_eventstream"
|
|
||||||
"mqtt_json"
|
|
||||||
"mqtt_room"
|
|
||||||
"mqtt_statestream"
|
|
||||||
"mysensors"
|
"mysensors"
|
||||||
"network"
|
"network"
|
||||||
"nmap_tracker"
|
"nmap_tracker"
|
||||||
@ -276,7 +268,6 @@ in {
|
|||||||
customLovelaceModules = with pkgs.home-assistant-custom-lovelace-modules; [
|
customLovelaceModules = with pkgs.home-assistant-custom-lovelace-modules; [
|
||||||
bubble-card
|
bubble-card
|
||||||
button-card
|
button-card
|
||||||
ha-floorplan
|
|
||||||
mushroom
|
mushroom
|
||||||
sankey-chart
|
sankey-chart
|
||||||
universal-remote-card
|
universal-remote-card
|
||||||
@ -284,6 +275,12 @@ in {
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
systemd.services.home-assistant.preStart = lib.mkForce "";
|
||||||
|
|
||||||
|
modules.services.borgmatic.directories = [
|
||||||
|
config.services.home-assistant.configDir
|
||||||
|
];
|
||||||
|
|
||||||
services.nginx = {
|
services.nginx = {
|
||||||
enable = true;
|
enable = true;
|
||||||
virtualHosts."home.mesh.vimium.net" = {
|
virtualHosts."home.mesh.vimium.net" = {
|
||||||
@ -297,57 +294,5 @@ in {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
services.mosquitto = {
|
|
||||||
enable = true;
|
|
||||||
listeners = [{
|
|
||||||
acl = [ "pattern readwrite #" ];
|
|
||||||
omitPasswordAuth = true;
|
|
||||||
port = 1883;
|
|
||||||
settings = {
|
|
||||||
allow_anonymous = true;
|
|
||||||
};
|
|
||||||
}];
|
|
||||||
};
|
|
||||||
|
|
||||||
age.secrets."files/services/zigbee2mqtt/secret.yaml" = {
|
|
||||||
file = "${self.inputs.secrets}/files/services/zigbee2mqtt/secret.yaml.age";
|
|
||||||
path = "${config.services.zigbee2mqtt.dataDir}/secret.yaml";
|
|
||||||
owner = "zigbee2mqtt";
|
|
||||||
group = "zigbee2mqtt";
|
|
||||||
};
|
|
||||||
|
|
||||||
services.zigbee2mqtt = {
|
|
||||||
package = pkgs.unstable.zigbee2mqtt;
|
|
||||||
enable = true;
|
|
||||||
dataDir = "/var/lib/zigbee2mqtt";
|
|
||||||
settings = {
|
|
||||||
homeassistant = lib.optionalAttrs config.services.home-assistant.enable {
|
|
||||||
discovery_topic = "homeassistant";
|
|
||||||
status_topic = "hass/status";
|
|
||||||
legacy_entity_attributes = true;
|
|
||||||
legacy_triggers = true;
|
|
||||||
};
|
|
||||||
availability = true;
|
|
||||||
frontend = true;
|
|
||||||
device_options = {
|
|
||||||
retain = true;
|
|
||||||
};
|
|
||||||
serial = {
|
|
||||||
port = "/dev/serial/by-id/usb-Silicon_Labs_Sonoff_Zigbee_3.0_USB_Dongle_Plus_0001-if00-port0";
|
|
||||||
};
|
|
||||||
advanced = {
|
|
||||||
channel = 20;
|
|
||||||
network_key = "!secret.yaml network_key";
|
|
||||||
pan_id = 13001;
|
|
||||||
ext_pan_id = [ 79 1 73 47 250 136 124 222 ];
|
|
||||||
transmit_power = 20;
|
|
||||||
};
|
|
||||||
mqtt = {
|
|
||||||
version = 5;
|
|
||||||
server = "mqtt://localhost:1883";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
92
modules/services/home-assistant/floorplan/default.nix
Normal file
92
modules/services/home-assistant/floorplan/default.nix
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.services.home-assistant;
|
||||||
|
in {
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.home-assistant = {
|
||||||
|
config.lovelace.resources = [{
|
||||||
|
url = "/local/nixos-lovelace-modules/floorplan.js";
|
||||||
|
type = "module";
|
||||||
|
}];
|
||||||
|
customLovelaceModules = [
|
||||||
|
pkgs.ha-floorplan
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.etc."home-assistant/www/floorplan/style.css".source = ./style.css;
|
||||||
|
environment.etc."home-assistant/www/floorplan/config.yaml".text = builtins.toJSON {
|
||||||
|
image = {
|
||||||
|
location = "/local/floorplan/beetham.svg";
|
||||||
|
cache = false;
|
||||||
|
};
|
||||||
|
stylesheet = {
|
||||||
|
location = "/local/floorplan/style.css";
|
||||||
|
cache = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
defaults = {
|
||||||
|
hover_action = "hover-info";
|
||||||
|
hold_action = "toggle";
|
||||||
|
tap_action = "more-info";
|
||||||
|
};
|
||||||
|
|
||||||
|
rules = [
|
||||||
|
{
|
||||||
|
name = "Rooms";
|
||||||
|
entities = [
|
||||||
|
{
|
||||||
|
entity = "light.bedroom_lamps";
|
||||||
|
element = "area.bedroom";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
entity = "light.hallway_spots";
|
||||||
|
element = "area.hallway";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
entity = "light.living_room_lamps";
|
||||||
|
element = "area.livingroom";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
entity = "light.office_lamps";
|
||||||
|
element = "area.office";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
tap_action = "light.toggle";
|
||||||
|
state_action = {
|
||||||
|
service = "floorplan.class_set";
|
||||||
|
service_data = ''
|
||||||
|
if (entity.state === "on") {
|
||||||
|
return "light-on";
|
||||||
|
}
|
||||||
|
return "light-off";
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Temperature";
|
||||||
|
entities = [
|
||||||
|
"sensor.motion_sensor_temperature"
|
||||||
|
];
|
||||||
|
state_action = [
|
||||||
|
{
|
||||||
|
service = "floorplan.text_set";
|
||||||
|
service_data = ''
|
||||||
|
if (!isNaN(entity.state)) {
|
||||||
|
return Math.round(entity.state * 10) / 10 + "°";
|
||||||
|
}
|
||||||
|
return "Unknown";
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
{
|
||||||
|
service = "floorplan.class_set";
|
||||||
|
service_data = {
|
||||||
|
class = "static-temp";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
27
modules/services/home-assistant/floorplan/style.css
Normal file
27
modules/services/home-assistant/floorplan/style.css
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#floorplan {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg, svg * {
|
||||||
|
vector-effect: non-scaling-stroke !important;
|
||||||
|
pointer-events: all !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
path[id*="area."].light-on {
|
||||||
|
opacity: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
path[id*="area."] {
|
||||||
|
opacity: 0.5 !important;
|
||||||
|
transition: opacity .25s;
|
||||||
|
-moz-transition: opacity .25s;
|
||||||
|
-webkit-transition: opacity .25s;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg tspan {
|
||||||
|
fill: var(--primary-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.static-temp, .static-temp tspan {
|
||||||
|
fill: #ffffff;
|
||||||
|
}
|
75
modules/services/home-assistant/mqtt.nix
Normal file
75
modules/services/home-assistant/mqtt.nix
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
{ config, lib, pkgs, self, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.services.home-assistant;
|
||||||
|
in {
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.mosquitto = {
|
||||||
|
enable = true;
|
||||||
|
listeners = [{
|
||||||
|
acl = [ "pattern readwrite #" ];
|
||||||
|
omitPasswordAuth = true;
|
||||||
|
port = 1883;
|
||||||
|
settings = {
|
||||||
|
allow_anonymous = true;
|
||||||
|
};
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
|
||||||
|
age.secrets."files/services/zigbee2mqtt/secret.yaml" = {
|
||||||
|
file = "${self.inputs.secrets}/files/services/zigbee2mqtt/secret.yaml.age";
|
||||||
|
path = "${config.services.zigbee2mqtt.dataDir}/secret.yaml";
|
||||||
|
owner = "zigbee2mqtt";
|
||||||
|
group = "zigbee2mqtt";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.zigbee2mqtt = {
|
||||||
|
package = pkgs.unstable.zigbee2mqtt;
|
||||||
|
enable = true;
|
||||||
|
dataDir = "/var/lib/zigbee2mqtt";
|
||||||
|
settings = {
|
||||||
|
homeassistant = lib.optionalAttrs config.services.home-assistant.enable {
|
||||||
|
discovery_topic = "homeassistant";
|
||||||
|
status_topic = "hass/status";
|
||||||
|
legacy_entity_attributes = true;
|
||||||
|
legacy_triggers = true;
|
||||||
|
};
|
||||||
|
availability = true;
|
||||||
|
frontend = true;
|
||||||
|
device_options = {
|
||||||
|
retain = true;
|
||||||
|
};
|
||||||
|
serial = {
|
||||||
|
port = "/dev/serial/by-id/usb-Silicon_Labs_Sonoff_Zigbee_3.0_USB_Dongle_Plus_0001-if00-port0";
|
||||||
|
};
|
||||||
|
advanced = {
|
||||||
|
channel = 20;
|
||||||
|
network_key = "!secret.yaml network_key";
|
||||||
|
pan_id = 13001;
|
||||||
|
ext_pan_id = [ 79 1 73 47 250 136 124 222 ];
|
||||||
|
transmit_power = 20;
|
||||||
|
};
|
||||||
|
mqtt = {
|
||||||
|
version = 5;
|
||||||
|
server = "mqtt://localhost:1883";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
modules.services.borgmatic.directories = [
|
||||||
|
config.services.mosquitto.dataDir
|
||||||
|
config.services.zigbee2mqtt.dataDir
|
||||||
|
];
|
||||||
|
|
||||||
|
services.home-assistant = {
|
||||||
|
config.mqtt = {};
|
||||||
|
extraComponents = [
|
||||||
|
"mqtt"
|
||||||
|
"mqtt_eventstream"
|
||||||
|
"mqtt_json"
|
||||||
|
"mqtt_room"
|
||||||
|
"mqtt_statestream"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -1,6 +0,0 @@
|
|||||||
final: prev:
|
|
||||||
{
|
|
||||||
home-assistant-custom-lovelace-modules = prev.home-assistant-custom-lovelace-modules // {
|
|
||||||
ha-floorplan = prev.callPackage ../pkgs/ha-floorplan/package.nix { };
|
|
||||||
};
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user