| 
									
										
										
										
											2020-01-09 10:19:54 +00:00
										 |  |  | import ./make-test-python.nix ({ pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  |   configDir = "/var/lib/foobar"; | 
					
						
							| 
									
										
										
										
											2018-08-21 02:27:55 +02:00
										 |  |  |   apiPassword = "some_secret"; | 
					
						
							|  |  |  |   mqttPassword = "another_secret"; | 
					
						
							| 
									
										
										
										
											2018-12-12 14:00:44 +01:00
										 |  |  |   hassCli = "hass-cli --server http://hass:8123 --password '${apiPassword}'"; | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  | in { | 
					
						
							|  |  |  |   name = "home-assistant"; | 
					
						
							| 
									
										
										
										
											2018-02-17 19:24:20 +01:00
										 |  |  |   meta = with pkgs.stdenv.lib; { | 
					
						
							|  |  |  |     maintainers = with maintainers; [ dotlambda ]; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   nodes = { | 
					
						
							|  |  |  |     hass = | 
					
						
							| 
									
										
										
										
											2018-07-20 20:56:59 +00:00
										 |  |  |       { pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2018-02-17 19:24:20 +01:00
										 |  |  |         environment.systemPackages = with pkgs; [ | 
					
						
							| 
									
										
										
										
											2018-12-12 14:00:44 +01:00
										 |  |  |           mosquitto home-assistant-cli | 
					
						
							| 
									
										
										
										
											2018-02-17 19:24:20 +01:00
										 |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  |         services.home-assistant = { | 
					
						
							|  |  |  |           inherit configDir; | 
					
						
							|  |  |  |           enable = true; | 
					
						
							| 
									
										
										
										
											2018-02-17 19:24:20 +01:00
										 |  |  |           package = pkgs.home-assistant.override { | 
					
						
							|  |  |  |             extraPackages = ps: with ps; [ hbmqtt ]; | 
					
						
							|  |  |  |           }; | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  |           config = { | 
					
						
							|  |  |  |             homeassistant = { | 
					
						
							|  |  |  |               name = "Home"; | 
					
						
							|  |  |  |               time_zone = "UTC"; | 
					
						
							| 
									
										
										
										
											2018-02-01 13:42:07 +01:00
										 |  |  |               latitude = "0.0"; | 
					
						
							|  |  |  |               longitude = "0.0"; | 
					
						
							|  |  |  |               elevation = 0; | 
					
						
							| 
									
										
										
										
											2018-11-29 12:10:43 +01:00
										 |  |  |               auth_providers = [ | 
					
						
							| 
									
										
										
										
											2019-03-24 19:45:35 +01:00
										 |  |  |                 { | 
					
						
							|  |  |  |                   type = "legacy_api_password"; | 
					
						
							|  |  |  |                   api_password = apiPassword; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-11-29 12:10:43 +01:00
										 |  |  |               ]; | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  |             }; | 
					
						
							|  |  |  |             frontend = { }; | 
					
						
							| 
									
										
										
										
											2018-08-21 02:27:55 +02:00
										 |  |  |             mqtt = { # Use hbmqtt as broker | 
					
						
							|  |  |  |               password = mqttPassword; | 
					
						
							|  |  |  |             }; | 
					
						
							| 
									
										
										
										
											2018-02-17 19:24:20 +01:00
										 |  |  |             binary_sensor = [ | 
					
						
							|  |  |  |               { | 
					
						
							|  |  |  |                 platform = "mqtt"; | 
					
						
							|  |  |  |                 state_topic = "home-assistant/test"; | 
					
						
							|  |  |  |                 payload_on = "let_there_be_light"; | 
					
						
							|  |  |  |                 payload_off = "off"; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             ]; | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  |           }; | 
					
						
							| 
									
										
										
										
											2019-01-24 15:52:05 +01:00
										 |  |  |           lovelaceConfig = { | 
					
						
							|  |  |  |             title = "My Awesome Home"; | 
					
						
							|  |  |  |             views = [ { | 
					
						
							|  |  |  |               title = "Example"; | 
					
						
							|  |  |  |               cards = [ { | 
					
						
							|  |  |  |                 type = "markdown"; | 
					
						
							|  |  |  |                 title = "Lovelace"; | 
					
						
							|  |  |  |                 content = "Welcome to your **Lovelace UI**."; | 
					
						
							|  |  |  |               } ]; | 
					
						
							|  |  |  |             } ]; | 
					
						
							|  |  |  |           }; | 
					
						
							| 
									
										
										
										
											2019-02-03 12:45:52 +01:00
										 |  |  |           lovelaceConfigWritable = true; | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2018-02-01 13:42:07 +01:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   testScript = ''
 | 
					
						
							| 
									
										
										
										
											2020-01-09 10:19:54 +00:00
										 |  |  |     start_all() | 
					
						
							|  |  |  |     hass.wait_for_unit("home-assistant.service") | 
					
						
							|  |  |  |     with subtest("Check that YAML configuration file is in place"): | 
					
						
							|  |  |  |         hass.succeed("test -L ${configDir}/configuration.yaml") | 
					
						
							|  |  |  |     with subtest("lovelace config is copied because lovelaceConfigWritable = true"): | 
					
						
							|  |  |  |         hass.succeed("test -f ${configDir}/ui-lovelace.yaml") | 
					
						
							|  |  |  |     with subtest("Check that Home Assistant's web interface and API can be reached"): | 
					
						
							|  |  |  |         hass.wait_for_open_port(8123) | 
					
						
							|  |  |  |         hass.succeed("curl --fail http://localhost:8123/states") | 
					
						
							|  |  |  |         assert "API running" in hass.succeed( | 
					
						
							|  |  |  |             "curl --fail -H 'x-ha-access: ${apiPassword}' http://localhost:8123/api/" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     with subtest("Toggle a binary sensor using MQTT"): | 
					
						
							|  |  |  |         assert '"state": "off"' in hass.succeed( | 
					
						
							|  |  |  |             "curl http://localhost:8123/api/states/binary_sensor.mqtt_binary_sensor -H 'x-ha-access: ${apiPassword}'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         hass.wait_until_succeeds( | 
					
						
							|  |  |  |             "mosquitto_pub -V mqttv311 -t home-assistant/test -u homeassistant -P '${mqttPassword}' -m let_there_be_light" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         assert '"state": "on"' in hass.succeed( | 
					
						
							|  |  |  |             "curl http://localhost:8123/api/states/binary_sensor.mqtt_binary_sensor -H 'x-ha-access: ${apiPassword}'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     with subtest("Toggle a binary sensor using hass-cli"): | 
					
						
							|  |  |  |         assert '"state": "on"' in hass.succeed( | 
					
						
							|  |  |  |             "${hassCli} --output json state get binary_sensor.mqtt_binary_sensor" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         hass.succeed( | 
					
						
							|  |  |  |             "${hassCli} state edit binary_sensor.mqtt_binary_sensor --json='{\"state\": \"off\"}'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         assert '"state": "off"' in hass.succeed( | 
					
						
							|  |  |  |             "curl http://localhost:8123/api/states/binary_sensor.mqtt_binary_sensor -H 'x-ha-access: ${apiPassword}'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     with subtest("Print log to ease debugging"): | 
					
						
							|  |  |  |         output_log = hass.succeed("cat ${configDir}/home-assistant.log") | 
					
						
							|  |  |  |         print("\n### home-assistant.log ###\n") | 
					
						
							|  |  |  |         print(output_log + "\n") | 
					
						
							| 
									
										
										
										
											2018-05-10 13:11:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-09 10:19:54 +00:00
										 |  |  |     with subtest("Check that no errors were logged"): | 
					
						
							|  |  |  |         assert "ERROR" not in output_log | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  |   '';
 | 
					
						
							|  |  |  | }) |