| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  | import ./make-test.nix ({ pkgs, ... }: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  |   configDir = "/var/lib/foobar"; | 
					
						
							| 
									
										
										
										
											2018-08-21 02:27:55 +02:00
										 |  |  |   apiPassword = "some_secret"; | 
					
						
							|  |  |  |   mqttPassword = "another_secret"; | 
					
						
							| 
									
										
										
										
											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; [ | 
					
						
							|  |  |  |           mosquitto | 
					
						
							|  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											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-01-26 01:41:36 +01:00
										 |  |  |             }; | 
					
						
							|  |  |  |             frontend = { }; | 
					
						
							| 
									
										
										
										
											2018-02-17 19:24:20 +01:00
										 |  |  |             http.api_password = apiPassword; | 
					
						
							| 
									
										
										
										
											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
										 |  |  |           }; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2018-02-01 13:42:07 +01:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   testScript = ''
 | 
					
						
							|  |  |  |     startAll; | 
					
						
							|  |  |  |     $hass->waitForUnit("home-assistant.service"); | 
					
						
							| 
									
										
										
										
											2018-02-17 19:24:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-21 22:33:32 +08:00
										 |  |  |     # The config is specified using a Nix attribute set, | 
					
						
							|  |  |  |     # but then converted from JSON to YAML | 
					
						
							|  |  |  |     $hass->succeed("test -f ${configDir}/configuration.yaml"); | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Check that Home Assistant's web interface and API can be reached | 
					
						
							|  |  |  |     $hass->waitForOpenPort(8123); | 
					
						
							|  |  |  |     $hass->succeed("curl --fail http://localhost:8123/states"); | 
					
						
							| 
									
										
										
										
											2018-02-17 19:24:20 +01:00
										 |  |  |     $hass->succeed("curl --fail -H 'x-ha-access: ${apiPassword}' http://localhost:8123/api/ | grep -qF 'API running'"); | 
					
						
							| 
									
										
										
										
											2018-02-01 13:42:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-17 19:24:20 +01:00
										 |  |  |     # Toggle a binary sensor using MQTT | 
					
						
							|  |  |  |     $hass->succeed("curl http://localhost:8123/api/states/binary_sensor.mqtt_binary_sensor -H 'x-ha-access: ${apiPassword}' | grep -qF '\"state\": \"off\"'"); | 
					
						
							| 
									
										
										
										
											2018-08-21 02:27:55 +02:00
										 |  |  |     $hass->waitUntilSucceeds("mosquitto_pub -V mqttv311 -t home-assistant/test -u homeassistant -P '${mqttPassword}' -m let_there_be_light"); | 
					
						
							| 
									
										
										
										
											2018-02-17 19:24:20 +01:00
										 |  |  |     $hass->succeed("curl http://localhost:8123/api/states/binary_sensor.mqtt_binary_sensor -H 'x-ha-access: ${apiPassword}' | grep -qF '\"state\": \"on\"'"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Print log to ease debugging | 
					
						
							|  |  |  |     my $log = $hass->succeed("cat ${configDir}/home-assistant.log"); | 
					
						
							|  |  |  |     print "\n### home-assistant.log ###\n"; | 
					
						
							|  |  |  |     print "$log\n"; | 
					
						
							| 
									
										
										
										
											2018-05-10 13:11:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Check that no errors were logged | 
					
						
							| 
									
										
										
										
											2018-10-29 13:30:06 +01:00
										 |  |  |     $hass->fail("cat ${configDir}/home-assistant.log | grep -qF ERROR"); | 
					
						
							| 
									
										
										
										
											2018-01-26 01:41:36 +01:00
										 |  |  |   '';
 | 
					
						
							|  |  |  | }) |