From 0c8a0c3854f1e452baa9aeb9017c850e45af5f9f Mon Sep 17 00:00:00 2001 From: nyanloutre Date: Thu, 22 Jun 2023 18:40:32 +0200 Subject: [PATCH] LoutreOS: replace zha with zigbee2mqtt --- systems/LoutreOS/services.nix | 357 +++++++--------------------------- systems/LoutreOS/web.nix | 5 + 2 files changed, 70 insertions(+), 292 deletions(-) diff --git a/systems/LoutreOS/services.nix b/systems/LoutreOS/services.nix index 39d1e2a..81f4f91 100644 --- a/systems/LoutreOS/services.nix +++ b/systems/LoutreOS/services.nix @@ -182,6 +182,66 @@ in enable = true; }; + mosquitto = { + enable = true; + listeners = [ + { + acl = [ "pattern readwrite #" ]; + omitPasswordAuth = true; + address = "127.0.0.1"; + settings.allow_anonymous = true; + } + ]; + }; + + zigbee2mqtt = { + enable = true; + settings = { + mqtt = { + server = "mqtt://${(head config.services.mosquitto.listeners).address}:${toString (head config.services.mosquitto.listeners).port}"; + }; + frontend = { + port = 8080; + host = "127.0.0.1"; + url = "https://zigbee.nyanlout.re"; + }; + groups = { + "101" = { + friendly_name = "salon"; + devices = [ + "0x94deb8fffe760f3d" + ]; + }; + "102" = { + friendly_name = "cuisine"; + devices = [ + "0x003c84fffe6d9ee6" + ]; + }; + "103" = { + friendly_name = "entrée"; + devices = [ + "0x84ba20fffe5ec243" + ]; + }; + "104" = { + friendly_name = "tout"; + devices = [ + "0x94deb8fffe760f3d" + "0x003c84fffe6d9ee6" + "0x84ba20fffe5ec243" + ]; + }; + "107" = { + friendly_name = "chambre"; + devices = [ + "0x84ba20fffe5eb120" + ]; + }; + }; + }; + }; + home-assistant = { enable = true; extraComponents = [ @@ -192,37 +252,26 @@ in config = { default_config = {}; homeassistant = { + country = "FR"; latitude = 48.60038; longitude = 7.74063; elevation = 146; }; meteo_france = null; - #influxdb = null; - #config = null; - #dhcp = null; - #frontend = null; - #history = null; http = { use_x_forwarded_for = true; trusted_proxies = [ "127.0.0.1" ]; }; - #logbook = null; - #map = null; - #mobile_app = null; - #person = null; - #script = null; - #sun = null; - #system_health = null; - zha = null; + mqtt = null; esphome = null; light = [ { platform = "group"; name = "Salon"; entities = [ - "light.ikea_of_sweden_tradfri_bulb_e27_cws_806lm_e69e6dfe_level_light_color_on_off" - "light.ikea_of_sweden_tradfri_bulb_e27_cws_806lm_43c25efe_level_light_color_on_off" - "light.ikea_of_sweden_tradfri_bulb_e27_cws_806lm_3d0f76fe_level_light_color_on_off" + "light.salon_light" + "light.cuisine_light" + "light.entree_light" ]; } ]; @@ -267,282 +316,6 @@ in # }; # } #]; - #switch = [ - # { - # platform = "wake_on_lan"; - # name = "PC Fixe"; - # mac = "b4:2e:99:ed:24:26"; - # host = "10.30.135.71"; - # broadcast_address = "10.30.255.255"; - # } - #]; - #device_tracker = [ - # { - # platform = "ping"; - # hosts = { telephone_paul = "10.30.50.2"; }; - # } - #]; - #scene = [ - # { - # name = "Movie"; - # icon = "mdi:movie-open"; - # entities = { - # "light.salon" = { - # state = "on"; - # xy_color = [0.299 0.115]; - # brightness = 50; - # }; - # "light.bande_led_tv" = { - # state = "on"; - # effect = "Movie"; - # brightness = 180; - # }; - # "light.bande_led_bureau" = { - # state = "on"; - # xy_color = [0.299 0.115]; - # brightness = 130; - # }; - # }; - # } - # { - # name = "Home"; - # icon = "mdi:home"; - # entities = { - # "light.salon" = { - # state = "on"; - # kelvin = 2700; - # brightness = 255; - # }; - # }; - # } - # { - # name = "Night"; - # icon = "mdi:weather-night"; - # entities = { - # "light.salon" = { - # state = "off"; - # }; - # "light.bande_led_tv" = { - # state = "off"; - # }; - # "light.bande_led_bureau" = { - # state = "off"; - # }; - # "light.chambre" = { - # state = "on"; - # kelvin = 1900; - # brightness = 50; - # }; - # }; - # } - #]; - #automation = let - # min_sun_elevation = 4; - - # switch_chambre = { - # domain = "zha"; - # platform = "device"; - # device_id = "3329ecdcad244e5e8fc0f4b96d52ffe1"; - # }; - - # switch_entree = { - # domain = "zha"; - # platform = "device"; - # device_id = "7cd814190ec543dba76a7aa7e7996c41"; - # }; - - # remote = { - # domain = "zha"; - # platform = "device"; - # device_id = "d1230b76264e483388a8fdaad4f44143"; - # }; - #in [ - # # ENTREE - - # { - # alias = "Aziz lumière"; - # trigger = [ - # { - # platform = "numeric_state"; - # entity_id = "sun.sun"; - # value_template = "{{ state.attributes.elevation }}"; - # below = min_sun_elevation; - # } - # ]; - # condition = [ - # { - # condition = "state"; - # entity_id = "person.paul"; - # state = "home"; - # } - # # Sun below max elevation - # { - # condition = "template"; - # value_template = "{{ state_attr('sun.sun', 'elevation') < ${toString min_sun_elevation} }}"; - # } - # ]; - # action = { - # scene = "scene.home"; - # }; - # } - # { - # alias = "Aziz lumière switch"; - # trigger = { - # type = "remote_button_short_press"; - # subtype = "turn_on"; - # } // switch_entree; - # action = { - # scene = "scene.home"; - # }; - # } - # { - # alias = "Adios"; - # trigger = [ - # { - # platform = "state"; - # entity_id = "person.paul"; - # to = "not_home"; - # } - # ({ - # type = "remote_button_short_press"; - # subtype = "turn_off"; - # } // switch_entree) - # ]; - # action = [ - # { - # service = "light.turn_off"; - # entity_id = "all"; - # } - # { - # service = "media_player.turn_off"; - # entity_id = "all"; - # } - # ]; - # } - - # # REMOTE - - # { - # alias = "Button toggle"; - # trigger = { - # type = "remote_button_short_press"; - # subtype = "turn_on"; - # } // remote; - # action = { - # choose = { - # conditions = { - # condition = "template"; - # value_template = '' - # {% set domain = 'light' %} - # {% set state = 'off' %} - # {{ states[domain] | count == states[domain] | selectattr('state','eq',state) | list | count }} - # ''; - # }; - # sequence = { - # scene = "scene.home"; - # }; - # }; - # default = { - # service = "light.turn_off"; - # entity_id = "all"; - # }; - # }; - # } - # { - # alias = "Button scene movie"; - # trigger = { - # type = "remote_button_short_press"; - # subtype = "right"; - # } // remote; - # action = { - # scene = "scene.movie"; - # }; - # } - # { - # alias = "Button scene home"; - # trigger = { - # type = "remote_button_short_press"; - # subtype = "left"; - # } // remote; - # action = { - # scene = "scene.home"; - # }; - # } - # { - # alias = "Button light up"; - # trigger = { - # type = "remote_button_short_press"; - # subtype = "dim_up"; - # } // remote; - # action = { - # service = "light.turn_on"; - # entity_id = "light.salon"; - # data = { - # brightness_step = 25; - # }; - # }; - # } - # { - # alias = "Button light down"; - # trigger = { - # type = "remote_button_short_press"; - # subtype = "dim_down"; - # } // remote; - # action = { - # service = "light.turn_on"; - # entity_id = "light.salon"; - # data = { - # brightness_step = -25; - # }; - # }; - # } - - # # CHAMBRE - - # { - # alias = "Button scene night"; - # trigger = { - # type = "remote_button_short_press"; - # subtype = "turn_on"; - # } // switch_chambre; - # action = { - # scene = "scene.night"; - # }; - # } - # { - # alias = "Button scene dodo"; - # trigger = { - # type = "remote_button_short_press"; - # subtype = "turn_off"; - # } // switch_chambre; - # action = { - # service = "light.turn_off"; - # entity_id = "all"; - # }; - # } - # { - # alias = "Button scene lumière chambre ON"; - # trigger = { - # type = "remote_button_long_press"; - # subtype = "dim_up"; - # } // switch_chambre; - # action = { - # service = "light.turn_on"; - # entity_id = "light.chambre"; - # }; - # } - # { - # alias = "Button scene lumière chambre OFF"; - # trigger = { - # type = "remote_button_long_press"; - # subtype = "dim_down"; - # } // switch_chambre; - # action = { - # service = "light.turn_off"; - # entity_id = "light.chambre"; - # }; - # } - #]; }; }; diff --git a/systems/LoutreOS/web.nix b/systems/LoutreOS/web.nix index 52bf009..b2bfa85 100644 --- a/systems/LoutreOS/web.nix +++ b/systems/LoutreOS/web.nix @@ -269,6 +269,11 @@ in proxyWebsockets = true; }; }; + "zigbee.nyanlout.re" = recursiveUpdate (authReverse config.services.zigbee2mqtt.settings.frontend.port) { + locations."/" = { + proxyWebsockets = true; + }; + }; "apart.nyanlout.re" = recursiveUpdate (simpleReverse config.services.home-assistant.config.http.server_port) { locations."/" = { proxyWebsockets = true;