From 2563c59e73dfe9df7b98d5b184785f3a5936ca17 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Tue, 3 Mar 2020 21:12:51 +0100
Subject: [PATCH] ma ham: use home-assistant from unstable, enable androidtv
 support

---
 makefu/2configs/ham/androidtv/adbshell.nix    | 38 +++++++++++
 makefu/2configs/ham/androidtv/default.nix     | 30 +++++++++
 .../2configs/ham/androidtv/purepythonadb.nix  | 21 ++++++
 .../ham/automation/firetv_restart.nix         | 26 +++++++
 makefu/2configs/ham/default.nix               | 67 ++++++-------------
 5 files changed, 134 insertions(+), 48 deletions(-)
 create mode 100644 makefu/2configs/ham/androidtv/adbshell.nix
 create mode 100644 makefu/2configs/ham/androidtv/default.nix
 create mode 100644 makefu/2configs/ham/androidtv/purepythonadb.nix
 create mode 100644 makefu/2configs/ham/automation/firetv_restart.nix

diff --git a/makefu/2configs/ham/androidtv/adbshell.nix b/makefu/2configs/ham/androidtv/adbshell.nix
new file mode 100644
index 000000000..f5b96c859
--- /dev/null
+++ b/makefu/2configs/ham/androidtv/adbshell.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, pyasn1
+, rsa
+, pycryptodome
+}:
+
+buildPythonPackage rec {
+  pname = "adb_shell";
+  version = "0.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01f9jinhfyjldg9793gz2i7gcd9xyx0a62r7a5ijssklcnn2rwnm";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    pyasn1
+    rsa
+  ];
+
+  # tests are not part of pypi package
+  doCheck = false;
+
+  checkInputs = [
+    pycryptodome
+  ];
+
+  meta = with lib; {
+    description = "A Python implementation of ADB with shell and FileSync functionality";
+    homepage = https://github.com/JeffLIrion/adb_shell/;
+    license = licenses.mit;
+    # maintainers = [ maintainers. ];
+  };
+}
diff --git a/makefu/2configs/ham/androidtv/default.nix b/makefu/2configs/ham/androidtv/default.nix
new file mode 100644
index 000000000..8f3bdc1f3
--- /dev/null
+++ b/makefu/2configs/ham/androidtv/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "androidtv";
+  version = "0.0.34";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13078i2a9hglpv4ldycph5n5485np21vs6z2qn830hybmx8kfxsw";
+  };
+
+  propagatedBuildInputs = [
+    (callPackage ./adbshell.nix {})
+    (callPackage ./purepythonadb.nix {})
+  ];
+
+  # tests are not packaged in pypi release
+  doCheck = false; 
+
+  meta = with lib; {
+    description = "Communicate with an Android TV or Fire TV device via ADB over a network";
+    homepage = https://github.com/JeffLIrion/python-androidtv/;
+    license = licenses.mit;
+    # maintainers = [ maintainers. ];
+  };
+}
diff --git a/makefu/2configs/ham/androidtv/purepythonadb.nix b/makefu/2configs/ham/androidtv/purepythonadb.nix
new file mode 100644
index 000000000..d4e763b70
--- /dev/null
+++ b/makefu/2configs/ham/androidtv/purepythonadb.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pure-python-adb";
+  version = "0.2.3.dev0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "88e5a4578435197799aa368fb1a5d87fe43e02a888cb7e85c2ad66173b383c89";
+  };
+
+  meta = with lib; {
+    description = "Pure python implementation of the adb client";
+    homepage = https://github.com/Swind/pure-python-adb;
+    license = licenses.mit;
+    # maintainers = [ maintainers. ];
+  };
+}
\ No newline at end of file
diff --git a/makefu/2configs/ham/automation/firetv_restart.nix b/makefu/2configs/ham/automation/firetv_restart.nix
new file mode 100644
index 000000000..779092c73
--- /dev/null
+++ b/makefu/2configs/ham/automation/firetv_restart.nix
@@ -0,0 +1,26 @@
+[
+  {
+    alias = "Nightly reboot of firetv";
+    trigger = {
+      platform = "time";
+      at = "03:00:00";
+    };
+    action = [
+      {
+        service = "androidtv.adb_command";
+        data = {
+          entity_id = "media_player.firetv_stick";
+          command = "reboot";
+        };
+      }
+      { delay.minutes = 2; }
+      {
+        service = "media_player.select_source";
+        data = {
+          entity_id = "media_player.firetv_stick";
+          source = "com.amazon.bueller.music";
+        };
+      }
+    ];
+  }
+]
diff --git a/makefu/2configs/ham/default.nix b/makefu/2configs/ham/default.nix
index ae0c46baa..3fbe1187f 100644
--- a/makefu/2configs/ham/default.nix
+++ b/makefu/2configs/ham/default.nix
@@ -4,13 +4,14 @@
 ## wake-on-lan server
 ##
 let
+  upkgs = (import <nixpkgs-unstable> {}).pkgs;
   hlib = (import ./lib);
   prefix = hlib.prefix;
   tasmota = hlib.tasmota;
   firetv_stick = "192.168.1.24";
   hassdir = "/var/lib/hass";
   zigbee = import ./multi/zigbee2mqtt.nix;
-  flurlicht = import ./multi/flurlicht.nix;
+  #flurlicht = import ./multi/flurlicht.nix;
   kurzzeitwecker = import ./multi/kurzzeitwecker.nix;
 #   switch
 #   automation
@@ -24,6 +25,13 @@ in {
   ];
 
   services.home-assistant = {
+    package = (upkgs.home-assistant.overrideAttrs (old: {
+    })).override {
+      extraPackages = ps: with ps; [
+        python-forecastio jsonrpc-async jsonrpc-websocket mpd2 pkgs.picotts
+        (ps.callPackage ./androidtv {})
+      ];
+    };
     config = {
       input_select = zigbee.input_select; # dict
       timer = zigbee.timer // kurzzeitwecker.timer; # dict
@@ -71,7 +79,7 @@ in {
       sun.elevation = 247;
       recorder = {};
       media_player = [
-        { platform = "kodi";
+        { platform = "FireTV Stick kodi";
           host = firetv_stick;
         }
         { platform = "androidtv";
@@ -79,10 +87,13 @@ in {
           device_class = "firetv";
           # adb_server_ip = firetv_stick;
           host = firetv_stick;
+          port = 5555;
         }
       ];
       mqtt = {
         broker = "localhost";
+        discovery = true; #enable esphome discovery
+        discovery_prefix = "homeassistant";
         port = 1883;
         client_id = "home-assistant";
         username = "hass";
@@ -107,8 +118,8 @@ in {
         sensor_id = 679;
         sensors.monitored_conditions = [ "P1" "P2" ];
       };
-      binary_sensor =
-         flurlicht.binary_sensor;
+      #binary_sensor =
+      #   flurlicht.binary_sensor;
       sensor = [
         { platform = "speedtest";
           monitored_conditions = [ "ping" "download" "upload" ];
@@ -118,53 +129,13 @@ in {
       ++ ((import ./sensor/outside.nix) {inherit lib;})
       ++ zigbee.sensor ;
       frontend = { };
-      light = flurlicht.light;
-      group =
-        { default_view =
-          { view = "yes";
-            entities = [
-              "group.flur"
-              "group.schlafzimmer"
-              "group.draussen"
-              "group.wohnzimmer"
-              "group.arbeitszimmer"
-            ];
-          };
-          flur = [
-            "light.flurlicht"
-            "binary_sensor.flur_bewegung"
-            "automation.dunkel_bei_sonnenuntergang"
-            "automation.hell_bei_sonnenaufgang"
-          ];
-          wohnzimmer = [
-            "media_player.kodi"
-            "media_player.firetv_stick"
-          ];
-          draussen = [
-            "sensor.dark_sky_temperature"
-            "sensor.dark_sky_hourly_summary"
-            "sensor.dark_sky_humidity"
-            "sensor.dark_sky_pressure"
-            "sensor.muehlhausen_pm10"
-            "sensor.muehlhausen_pm25"
-          ];
-          schlafzimmer = [
-            "sensor.schlafzimmer_temperatur"
-            "sensor.schlafzimmer_luftdruck"
-            "sensor.schlafzimmer_luftfeuchtigkeit"
-            "switch.lichterkette_schlafzimmer"
-          ];
-          arbeitszimmer = [
-            "switch.strom_staubsauger"
-            "sensor.arbeitszimmer_temperatur"
-            "sensor.arbeitszimmer_luftfeuchtigkeit"
-          ];
-        };
+      # light = flurlicht.light;
       http = { };
       switch = [];
       automation =
-         flurlicht.automation
-      ++ kurzzeitwecker.automation
+        (import ./automation/firetv_restart.nix)
+         kurzzeitwecker.automation
+      #++ flurlicht.automation
       ++ zigbee.automation;
       script = kurzzeitwecker.script; # dict
     };