{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Hass-data-detective.ipynb", "version": "0.3.2", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "[View in Colaboratory](https://colab.research.google.com/github/robmarkcole/robins-google-colaboratory/blob/master/Hass_data_detective.ipynb)" ] }, { "metadata": { "id": "KS7W0kN1HUeW", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 496 }, "outputId": "0b25c112-ad1d-4bd8-cbea-11da41c8abf2" }, "cell_type": "code", "source": [ "!pip install HASS-data-detective" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "text": [ "Collecting HASS-data-detective\n", " Downloading https://files.pythonhosted.org/packages/25/92/3e8835e94617e5d2edc84c8fae68ead866d7f13448085c3b5709d2c03a6d/HASS-data-detective-0.4.tar.gz\n", "Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from HASS-data-detective) (2.18.4)\n", "Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from HASS-data-detective) (2.1.2)\n", "Requirement already satisfied: pandas in /usr/local/lib/python3.6/dist-packages (from HASS-data-detective) (0.22.0)\n", "Collecting sqlalchemy (from HASS-data-detective)\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/b4/9c/411a9bac1a471bed54ec447dc183aeed12a75c1b648307e18b56e3829363/SQLAlchemy-1.2.8.tar.gz (5.6MB)\n", "\u001b[K 100% |████████████████████████████████| 5.6MB 5.7MB/s \n", "\u001b[?25hRequirement already satisfied: idna<2.7,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->HASS-data-detective) (2.6)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->HASS-data-detective) (2018.4.16)\n", "Requirement already satisfied: urllib3<1.23,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->HASS-data-detective) (1.22)\n", "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->HASS-data-detective) (3.0.4)\n", "Requirement already satisfied: pytz in /usr/local/lib/python3.6/dist-packages (from matplotlib->HASS-data-detective) (2018.4)\n", "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->HASS-data-detective) (2.2.0)\n", "Requirement already satisfied: six>=1.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->HASS-data-detective) (1.11.0)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->HASS-data-detective) (0.10.0)\n", "Requirement already satisfied: numpy>=1.7.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->HASS-data-detective) (1.14.3)\n", "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->HASS-data-detective) (2.5.3)\n", "Building wheels for collected packages: HASS-data-detective, sqlalchemy\n", " Running setup.py bdist_wheel for HASS-data-detective ... \u001b[?25l-\b \bdone\n", "\u001b[?25h Stored in directory: /content/.cache/pip/wheels/d8/bd/89/6e155dd59f79ccd003f8f6756e75148b71abd48bd1bb2d6b4d\n", " Running setup.py bdist_wheel for sqlalchemy ... \u001b[?25l-\b \b\\\b \b|\b \b/\b \b-\b \b\\\b \b|\b \b/\b \bdone\n", "\u001b[?25h Stored in directory: /content/.cache/pip/wheels/df/fc/61/df2f43ec3f11f864554bdc006a866a3ffffa59740bcf3674ef\n", "Successfully built HASS-data-detective sqlalchemy\n", "\u001b[31mtensorflow 1.2.0 has requirement markdown==2.2.0, but you'll have markdown 2.6.11 which is incompatible.\u001b[0m\n", "Installing collected packages: sqlalchemy, HASS-data-detective\n", "Successfully installed HASS-data-detective-0.4 sqlalchemy-1.2.8\n" ], "name": "stdout" } ] }, { "metadata": { "id": "Mj7pOXrMK4kr", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "import os\n", "import sys\n", "import detective.core as detective\n", "import detective.helpers as helpers\n", "import numpy as np\n", "import pandas as pd\n", "pd.options.mode.chained_assignment = None # Suppress chained_assignment warning, default='warn'\n", "import seaborn as sns\n", "from sqlalchemy import text\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "u6Qy5HsfHjhM", "colab_type": "text" }, "cell_type": "markdown", "source": [ "https://github.com/robmarkcole/HASS-data-detective/blob/master/usage/Usage%20of%20detective.ipynb\n", "\n", "Lets upload my HA .db file" ] }, { "metadata": { "id": "_dKmyVvKH9_b", "colab_type": "code", "colab": { "resources": { "http://localhost:8080/nbextensions/google.colab/files.js": { "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7Ci8vIE1heCBhbW91bnQgb2YgdGltZSB0byBibG9jayB3YWl0aW5nIGZvciB0aGUgdXNlci4KY29uc3QgRklMRV9DSEFOR0VfVElNRU9VVF9NUyA9IDMwICogMTAwMDsKCmZ1bmN0aW9uIF91cGxvYWRGaWxlcyhpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IHN0ZXBzID0gdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKTsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIC8vIENhY2hlIHN0ZXBzIG9uIHRoZSBvdXRwdXRFbGVtZW50IHRvIG1ha2UgaXQgYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBjYWxsCiAgLy8gdG8gdXBsb2FkRmlsZXNDb250aW51ZSBmcm9tIFB5dGhvbi4KICBvdXRwdXRFbGVtZW50LnN0ZXBzID0gc3RlcHM7CgogIHJldHVybiBfdXBsb2FkRmlsZXNDb250aW51ZShvdXRwdXRJZCk7Cn0KCi8vIFRoaXMgaXMgcm91Z2hseSBhbiBhc3luYyBnZW5lcmF0b3IgKG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgeWV0KSwKLy8gd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIGFzeW5jaHJvbm91cyBzdGVwcyBhbmQgdGhlIFB5dGhvbiBzaWRlIGlzIGdvaW5nCi8vIHRvIHBvbGwgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBzdGVwLgovLyBUaGlzIHVzZXMgYSBQcm9taXNlIHRvIGJsb2NrIHRoZSBweXRob24gc2lkZSBvbiBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcCwKLy8gdGhlbiBwYXNzZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgc3RlcCBhcyB0aGUgaW5wdXQgdG8gdGhlIG5leHQgc3RlcC4KZnVuY3Rpb24gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpIHsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIGNvbnN0IHN0ZXBzID0gb3V0cHV0RWxlbWVudC5zdGVwczsKCiAgY29uc3QgbmV4dCA9IHN0ZXBzLm5leHQob3V0cHV0RWxlbWVudC5sYXN0UHJvbWlzZVZhbHVlKTsKICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5leHQudmFsdWUucHJvbWlzZSkudGhlbigodmFsdWUpID0+IHsKICAgIC8vIENhY2hlIHRoZSBsYXN0IHByb21pc2UgdmFsdWUgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIG5leHQKICAgIC8vIHN0ZXAgb2YgdGhlIGdlbmVyYXRvci4KICAgIG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIG5leHQudmFsdWUucmVzcG9uc2U7CiAgfSk7Cn0KCi8qKgogKiBHZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGJldHdlZW4gZWFjaCBhc3luYyBzdGVwIG9mIHRoZSB1cGxvYWQKICogcHJvY2Vzcy4KICogQHBhcmFtIHtzdHJpbmd9IGlucHV0SWQgRWxlbWVudCBJRCBvZiB0aGUgaW5wdXQgZmlsZSBwaWNrZXIgZWxlbWVudC4KICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIG91dHB1dCBkaXNwbGF5LgogKiBAcmV0dXJuIHshSXRlcmFibGU8IU9iamVjdD59IEl0ZXJhYmxlIG9mIG5leHQgc3RlcHMuCiAqLwpmdW5jdGlvbiogdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKSB7CiAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7CiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gZmFsc2U7CgogIGNvbnN0IG91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvdXRwdXRJZCk7CiAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSAnJzsKCiAgY29uc3QgcGlja2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHsKICAgICAgcmVzb2x2ZShlLnRhcmdldC5maWxlcyk7CiAgICB9KTsKICB9KTsKCiAgY29uc3QgY2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgaW5wdXRFbGVtZW50LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FuY2VsKTsKICBjYW5jZWwudGV4dENvbnRlbnQgPSAnQ2FuY2VsIHVwbG9hZCc7CiAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBjYW5jZWwub25jbGljayA9ICgpID0+IHsKICAgICAgcmVzb2x2ZShudWxsKTsKICAgIH07CiAgfSk7CgogIC8vIENhbmNlbCB1cGxvYWQgaWYgdXNlciBoYXNuJ3QgcGlja2VkIGFueXRoaW5nIGluIHRpbWVvdXQuCiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9LCBGSUxFX0NIQU5HRV9USU1FT1VUX01TKTsKICB9KTsKCiAgLy8gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcGljayB0aGUgZmlsZXMuCiAgY29uc3QgZmlsZXMgPSB5aWVsZCB7CiAgICBwcm9taXNlOiBQcm9taXNlLnJhY2UoW3BpY2tlZFByb21pc2UsIHRpbWVvdXRQcm9taXNlLCBjYW5jZWxQcm9taXNlXSksCiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdzdGFydGluZycsCiAgICB9CiAgfTsKCiAgaWYgKCFmaWxlcykgewogICAgcmV0dXJuIHsKICAgICAgcmVzcG9uc2U6IHsKICAgICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICAgIH0KICAgIH07CiAgfQoKICBjYW5jZWwucmVtb3ZlKCk7CgogIC8vIERpc2FibGUgdGhlIGlucHV0IGVsZW1lbnQgc2luY2UgZnVydGhlciBwaWNrcyBhcmUgbm90IGFsbG93ZWQuCiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKCiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7CiAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICBsaS5hcHBlbmQoc3BhbihmaWxlLm5hbWUsIHtmb250V2VpZ2h0OiAnYm9sZCd9KSk7CiAgICBsaS5hcHBlbmQoc3BhbigKICAgICAgICBgKCR7ZmlsZS50eXBlIHx8ICduL2EnfSkgLSAke2ZpbGUuc2l6ZX0gYnl0ZXMsIGAgKwogICAgICAgIGBsYXN0IG1vZGlmaWVkOiAkewogICAgICAgICAgICBmaWxlLmxhc3RNb2RpZmllZERhdGUgPyBmaWxlLmxhc3RNb2RpZmllZERhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbi9hJ30gLSBgKSk7CiAgICBjb25zdCBwZXJjZW50ID0gc3BhbignMCUgZG9uZScpOwogICAgbGkuYXBwZW5kQ2hpbGQocGVyY2VudCk7CgogICAgb3V0cHV0RWxlbWVudC5hcHBlbmRDaGlsZChsaSk7CgogICAgY29uc3QgZmlsZURhdGFQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7CiAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7CiAgICB9KTsKICAgIC8vIFdhaXQgZm9yIHRoZSBkYXRhIHRvIGJlIHJlYWR5LgogICAgbGV0IGZpbGVEYXRhID0geWllbGQgewogICAgICBwcm9taXNlOiBmaWxlRGF0YVByb21pc2UsCiAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgYWN0aW9uOiAnY29udGludWUnLAogICAgICB9CiAgICB9OwoKICAgIC8vIFVzZSBhIGNodW5rZWQgc2VuZGluZyB0byBhdm9pZCBtZXNzYWdlIHNpemUgbGltaXRzLiBTZWUgYi82MjExNTY2MC4KICAgIGxldCBwb3NpdGlvbiA9IDA7CiAgICB3aGlsZSAocG9zaXRpb24gPCBmaWxlRGF0YS5ieXRlTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKGZpbGVEYXRhLmJ5dGVMZW5ndGggLSBwb3NpdGlvbiwgTUFYX1BBWUxPQURfU0laRSk7CiAgICAgIGNvbnN0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoZmlsZURhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CgogICAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICAgICAgeWllbGQgewogICAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgICBhY3Rpb246ICdhcHBlbmQnLAogICAgICAgICAgZmlsZTogZmlsZS5uYW1lLAogICAgICAgICAgZGF0YTogYmFzZTY0LAogICAgICAgIH0sCiAgICAgIH07CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPQogICAgICAgICAgYCR7TWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCl9JSBkb25lYDsKICAgIH0KICB9CgogIC8vIEFsbCBkb25lLgogIHlpZWxkIHsKICAgIHJlc3BvbnNlOiB7CiAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgIH0KICB9Owp9CgpzY29wZS5nb29nbGUgPSBzY29wZS5nb29nbGUgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYiA9IHNjb3BlLmdvb2dsZS5jb2xhYiB8fCB7fTsKc2NvcGUuZ29vZ2xlLmNvbGFiLl9maWxlcyA9IHsKICBfdXBsb2FkRmlsZXMsCiAgX3VwbG9hZEZpbGVzQ29udGludWUsCn07Cn0pKHNlbGYpOwo=", "ok": true, "headers": [ [ "content-type", "application/javascript" ] ], "status": 200, "status_text": "" } }, "base_uri": "https://localhost:8080/", "height": 86 }, "outputId": "e965087c-94d5-4ed1-8603-846f02145246" }, "cell_type": "code", "source": [ "from google.colab import files\n", "\n", "uploaded = files.upload()\n", "\n", "for fn in uploaded.keys():\n", " print('User uploaded file \"{name}\" with length {length} bytes'.format(\n", " name=fn, length=len(uploaded[fn])))" ], "execution_count": 5, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", " \n", " \n", " Upload widget is only available when the cell has been executed in the\n", " current browser session. Please rerun this cell to enable.\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "Saving home-assistant_v2.db to home-assistant_v2.db\n", "User uploaded file \"home-assistant_v2.db\" with length 11096064 bytes\n" ], "name": "stdout" } ] }, { "metadata": { "id": "mxeRZDsOJPpq", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "c023e381-d112-432f-b888-d9abcc7ec845" }, "cell_type": "code", "source": [ "ls" ], "execution_count": 6, "outputs": [ { "output_type": "stream", "text": [ "\u001b[0m\u001b[01;34mdatalab\u001b[0m/ home-assistant_v2.db\r\n" ], "name": "stdout" } ] }, { "metadata": { "id": "Np9shnQcLH3R", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "1d27a527-f75e-4ec2-e889-4eec05da7906" }, "cell_type": "code", "source": [ "os.getcwd()" ], "execution_count": 11, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'/content'" ] }, "metadata": { "tags": [] }, "execution_count": 11 } ] }, { "metadata": { "id": "rqOBL-8PKgfF", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "cc3f3415-8549-40ef-a2db-a984c8fa1b8d" }, "cell_type": "code", "source": [ "db_file = '/home-assistant_v2.db'\n", "DB_URL = 'sqlite:////' + os.getcwd() + db_file\n", "DB_URL" ], "execution_count": 16, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'sqlite://///content/home-assistant_v2.db'" ] }, "metadata": { "tags": [] }, "execution_count": 16 } ] }, { "metadata": { "id": "VE3j14GeKvtg", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "outputId": "6e99f091-4c86-4073-b670-ebfd7a9a6659" }, "cell_type": "code", "source": [ "%%time\n", " db = detective.HassDatabase(DB_URL)" ], "execution_count": 17, "outputs": [ { "output_type": "stream", "text": [ "Successfully connected to database\n", "There are 40 entities with data\n", "CPU times: user 5 ms, sys: 2 ms, total: 7 ms\n", "Wall time: 11.2 ms\n" ], "name": "stdout" } ] }, { "metadata": { "id": "XWCz8lNHK_iK", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 153 }, "outputId": "becdda5b-60ae-453a-f9e8-be2c2e192e81" }, "cell_type": "code", "source": [ "db.domains" ], "execution_count": 18, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['persistent_notification',\n", " 'light',\n", " 'sun',\n", " 'group',\n", " 'automation',\n", " 'sensor',\n", " 'history_graph',\n", " 'camera']" ] }, "metadata": { "tags": [] }, "execution_count": 18 } ] }, { "metadata": { "id": "7BHQBt-aMR0t", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Simple query" ] }, { "metadata": { "id": "_zlCCqP_MWII", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "outputId": "85f43f77-e495-4cd0-d835-5808fd67e225" }, "cell_type": "code", "source": [ "db.fetch_all_data()" ], "execution_count": 23, "outputs": [ { "output_type": "stream", "text": [ "Querying the database, this could take a while\n", "master_df created successfully.\n" ], "name": "stdout" } ] }, { "metadata": { "id": "trj5x5FDMf26", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "sensors_num_df = detective.NumericalSensors(db.master_df)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "PnG0oVAZMv2w", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 238 }, "outputId": "52e76957-22b9-44c7-a9bd-75df280ffb92" }, "cell_type": "code", "source": [ "sensors_num_df.entities" ], "execution_count": 31, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['sensor.yweather_visibility',\n", " 'sensor.yweather_wind_speed',\n", " 'sensor.yweather_humidity',\n", " 'sensor.yweather_temperature_min',\n", " 'sensor.yweather_temperature_max',\n", " 'sensor.yweather_temperature',\n", " 'sensor.yweather_pressure',\n", " 'sensor.database_sensor',\n", " 'sensor.filesize_sensor',\n", " 'sensor.homeassistant_v2db',\n", " 'sensor.homeassistantlog',\n", " 'sensor.phueconf',\n", " 'sensor.homeassistant_v2dbwal']" ] }, "metadata": { "tags": [] }, "execution_count": 31 } ] }, { "metadata": { "id": "-X9Z6EXfMyfP", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 340 }, "outputId": "776e75bc-a0f8-412a-9ad0-a034bf6975ef" }, "cell_type": "code", "source": [ "sensors_num_df.data.head()" ], "execution_count": 27, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
entitysensor.database_sensorsensor.filesize_sensorsensor.homeassistant_v2dbsensor.homeassistant_v2dbwalsensor.homeassistantlogsensor.phueconfsensor.yweather_humiditysensor.yweather_pressuresensor.yweather_temperaturesensor.yweather_temperature_maxsensor.yweather_temperature_minsensor.yweather_visibilitysensor.yweather_wind_speed
last_changed
2018-01-23 21:21:48.4486097.888.4210.324.160.00.083.01009.012.013.08.016.0917.99
2018-01-23 21:21:48.4520047.888.4210.324.160.00.083.01009.012.013.08.016.0917.99
2018-01-23 21:21:48.4535467.888.4210.324.160.00.083.01009.012.013.08.016.0917.99
2018-01-23 21:21:49.5418457.888.4210.324.160.00.083.01009.012.013.08.016.0917.99
2018-01-23 21:21:49.5431967.888.4210.324.160.00.083.01009.012.013.08.016.0917.99
\n", "
" ], "text/plain": [ "entity sensor.database_sensor sensor.filesize_sensor \\\n", "last_changed \n", "2018-01-23 21:21:48.448609 7.88 8.42 \n", "2018-01-23 21:21:48.452004 7.88 8.42 \n", "2018-01-23 21:21:48.453546 7.88 8.42 \n", "2018-01-23 21:21:49.541845 7.88 8.42 \n", "2018-01-23 21:21:49.543196 7.88 8.42 \n", "\n", "entity sensor.homeassistant_v2db \\\n", "last_changed \n", "2018-01-23 21:21:48.448609 10.32 \n", "2018-01-23 21:21:48.452004 10.32 \n", "2018-01-23 21:21:48.453546 10.32 \n", "2018-01-23 21:21:49.541845 10.32 \n", "2018-01-23 21:21:49.543196 10.32 \n", "\n", "entity sensor.homeassistant_v2dbwal \\\n", "last_changed \n", "2018-01-23 21:21:48.448609 4.16 \n", "2018-01-23 21:21:48.452004 4.16 \n", "2018-01-23 21:21:48.453546 4.16 \n", "2018-01-23 21:21:49.541845 4.16 \n", "2018-01-23 21:21:49.543196 4.16 \n", "\n", "entity sensor.homeassistantlog sensor.phueconf \\\n", "last_changed \n", "2018-01-23 21:21:48.448609 0.0 0.0 \n", "2018-01-23 21:21:48.452004 0.0 0.0 \n", "2018-01-23 21:21:48.453546 0.0 0.0 \n", "2018-01-23 21:21:49.541845 0.0 0.0 \n", "2018-01-23 21:21:49.543196 0.0 0.0 \n", "\n", "entity sensor.yweather_humidity \\\n", "last_changed \n", "2018-01-23 21:21:48.448609 83.0 \n", "2018-01-23 21:21:48.452004 83.0 \n", "2018-01-23 21:21:48.453546 83.0 \n", "2018-01-23 21:21:49.541845 83.0 \n", "2018-01-23 21:21:49.543196 83.0 \n", "\n", "entity sensor.yweather_pressure \\\n", "last_changed \n", "2018-01-23 21:21:48.448609 1009.0 \n", "2018-01-23 21:21:48.452004 1009.0 \n", "2018-01-23 21:21:48.453546 1009.0 \n", "2018-01-23 21:21:49.541845 1009.0 \n", "2018-01-23 21:21:49.543196 1009.0 \n", "\n", "entity sensor.yweather_temperature \\\n", "last_changed \n", "2018-01-23 21:21:48.448609 12.0 \n", "2018-01-23 21:21:48.452004 12.0 \n", "2018-01-23 21:21:48.453546 12.0 \n", "2018-01-23 21:21:49.541845 12.0 \n", "2018-01-23 21:21:49.543196 12.0 \n", "\n", "entity sensor.yweather_temperature_max \\\n", "last_changed \n", "2018-01-23 21:21:48.448609 13.0 \n", "2018-01-23 21:21:48.452004 13.0 \n", "2018-01-23 21:21:48.453546 13.0 \n", "2018-01-23 21:21:49.541845 13.0 \n", "2018-01-23 21:21:49.543196 13.0 \n", "\n", "entity sensor.yweather_temperature_min \\\n", "last_changed \n", "2018-01-23 21:21:48.448609 8.0 \n", "2018-01-23 21:21:48.452004 8.0 \n", "2018-01-23 21:21:48.453546 8.0 \n", "2018-01-23 21:21:49.541845 8.0 \n", "2018-01-23 21:21:49.543196 8.0 \n", "\n", "entity sensor.yweather_visibility \\\n", "last_changed \n", "2018-01-23 21:21:48.448609 16.09 \n", "2018-01-23 21:21:48.452004 16.09 \n", "2018-01-23 21:21:48.453546 16.09 \n", "2018-01-23 21:21:49.541845 16.09 \n", "2018-01-23 21:21:49.543196 16.09 \n", "\n", "entity sensor.yweather_wind_speed \n", "last_changed \n", "2018-01-23 21:21:48.448609 17.99 \n", "2018-01-23 21:21:48.452004 17.99 \n", "2018-01-23 21:21:48.453546 17.99 \n", "2018-01-23 21:21:49.541845 17.99 \n", "2018-01-23 21:21:49.543196 17.99 " ] }, "metadata": { "tags": [] }, "execution_count": 27 } ] }, { "metadata": { "id": "WBvPKvhAM6Dv", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 374 }, "outputId": "ae63e832-ad7c-4af2-8ed8-0ad6fa01ad72" }, "cell_type": "code", "source": [ "sensors_num_df.plot('sensor.yweather_wind_speed')" ], "execution_count": 32, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4IAAAFlCAYAAAC+11ZyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3XucXHV9//HXJhtCEgLGuAW8UtT9\nAMUbKIKAxOIVRRRjpaAVtD+VW71WBP1h0dZWEfkp2GprLfWCXESBalUQEVRAbUq9+xHvFUTWEDQQ\nSLLs/v44Z2XOzu5mk8yZ2cx5PR+PfWTmXGY+887s2fnM91wGxsfHkSRJkiQ1x7xeFyBJkiRJ6i4b\nQUmSJElqGBtBSZIkSWoYG0FJkiRJahgbQUmSJElqmMFeF7C1RkbWtp32dNmyxaxZs64X5cxZZlJl\nHlXm0c5MqsyjyjzamUmVeVT1Qx5DQ0sHel2D1El9OSI4ODi/1yXMOWZSZR5V5tHOTKrMo8o82plJ\nlXlUmYc09/RlIyhJkiRJmp6NoCRJkiQ1jI2gJEmSJDWMjaAkSZIkNYyNoCRJkiQ1jI2gJEmSJDWM\njaAkSZIkNYyNoCRJkiQ1zGCdDx4RewOXAWdn5rkR8WTgHcBG4C7gJZm5pmX5BcB5wMOAe4HjMvOn\nddYoSZIkSU1T24hgRCwBzgGuapn8HuDlmfkU4DrglZNWOxq4IzMPAv4O+Pu66pMkSZKkpqpzRHA9\ncBhwSsu03wLLy9vLgJy0zqHAR8rbXwQ+XGN9W+WuezYyNjZe63PssGgBAwMDtT6H2t1590bGx+v9\nv51rtrtzPWvXbeh1GXOKmVSZR5V5tDOTKvOo6mQeSxYtYJ6fj6StVlsjmJmjwGhEtE5+LXBNRKwB\n1gCnTlptF2CkXH8sIsYjYrvMnHbLsWzZYgYH57dNHxpaupWvYHqXXvNj/vXy79X2+BNW7PNgXn/M\nvh17vDoz2RZNlccFVyYf//wPe1CNJEmajSf+yS685WVP7HUZ0jav1mMEp3AO8PzM/FpEvBs4AXjf\nDMtv8uueNWvWtU0bGlrKyMjaLS5yU3a93yKesMcfMVbjqNGNP/otP7v5dx17HXVnsq2ZLo8f/7I4\nZPXRD1/OgsHmnEtp4cJB1q8f7XUZc4qZVJlHlXm0M5Mq86jqZB6P+uNlPflM4xfq6jfdbgQfnZlf\nK29fCRwzaf4tFKOC3ypPHDMw02hgr+z+wB05/nl71/ocx7/nmlofXzN76TP3YNnShb0uo2v8oqCd\nmVSZR5V5tDOTKvOoMg9p7un2kMetEbFXefsJwE2T5l8BvLC8fThwdbcKkyRJkqSmqG1EMCL2Bc4C\ndgM2RsRK4FXAv0TERuB24GXlspdl5hHAhcDTIuKrFCebObau+iRJkiSpqeo8WcwqYMUUsw6cYtkj\nyn/vBY6rqyZJkiRJUvd3DZUkSZIk9ZiNoCRJkiQ1jI2gJEmSJDWMjaAkSZIkNYyNoCRJkiQ1jI2g\nJEmSJDWMjaAkSZIkNYyNoCRJkiQ1jI2gJEmSJDWMjaAkSZIkNYyNoCRJkiQ1jI2gJEmSJDWMjaAk\nSZIkNYyNoCRJkiQ1jI2gJEmSJDWMjaAkSZIkNYyNoCRJkiQ1jI2gJEmSJDWMjaAkSZIkNYyNoCRJ\nkiQ1jI2gJEmSJDWMjaAkSZIkNYyNoCRJkiQ1jI2gJEmSJDXMYJ0PHhF7A5cBZ2fmuRFxMTBUzr4/\ncENmvqJl+WOBtwM/KSddmZl/V2eNkiRJktQ0tTWCEbEEOAe4amJaZr6wZf6HgQ9NseqFmfmGuuqS\nJEmSpKarc9fQ9cBhwC2TZ0REAPfLzG/U+PySJEmSpCnUNiKYmaPAaNHztXk1xWjhVA6JiM8DC4A3\nZOaNNZUoSZIkSY1U6zGCU4mI7YCDMvOEKWbfAIxk5mcj4gDgI8CjZnq8ZcsWMzg4v2360NDSTpTb\nM/MGYHDBvI6+jm09k06bKo+FC4tfieXLl7B8p0XdLqmnfH+0M5Mq86gyj3ZmUmUeVeYhzS1dbwSB\nQ4ApdwnNzB8CPyxvXx8RQxExPzPvne7B1qxZ1zZtaGgpIyNrO1Rub4yNw+jGsY69jn7IpJOmy2P9\n+lEAVq++i7ENo90uq2d8f7QzkyrzqDKPdmZSZR5V/ZCHjaz6TS8uH/EE4FtTzYiIN0bEn5e396YY\nHZy2CZQkSZIkbb46zxq6L3AWsBuwMSJWAkcCu3Lf5SEmlr0sM48Azgc+GhGvKmt7eV31SZIkSVJT\n1XmymFXAiilmnTzFskeU//4KeEpdNUmSJEmSerNrqCRJkiSph2wEJUmSJKlhbAQlSZIkqWFsBCVJ\nkiSpYWwEJUmSJKlhbAQlSZIkqWFsBCVJkiSpYWwEJUmSJKlhbAQlSZIkqWFsBCVJkiSpYWwEJUmS\nJKlhbAQlSZIkqWFsBCVJkiSpYWwEJUmSJKlhbAQlSZIkqWFsBCVJkiSpYWwEJUmSJKlhbAQlSZIk\nqWFsBCVJkiSpYWwEJUmSJKlhbAQlSZIkqWFsBCVJkiSpYWwEJUmSJKlhbAQlSZIkqWFsBCVJkiSp\nYQbrfPCI2Bu4DDg7M8+NiIuBoXL2/YEbMvMVLcsvAM4DHgbcCxyXmT+ts0ZJkiRJapraGsGIWAKc\nA1w1MS0zX9gy/8PAhyatdjRwR2YeExFPB/4eeFFdNUqSJElSE9W5a+h64DDglskzIiKA+2XmNybN\nOhT4dHn7i8CBNdYnSZIkSY1U24hgZo4Co0XP1+bVFKOFk+0CjJTrj0XEeERsl5kbpnueZcsWMzg4\nv2360NDSLap7rpg3AIML5nX0dWzrmXTaVHksXFj8SixfvoTlOy3qdkk95fujnZlUmUeVebQzkyrz\nqDIPaW6p9RjBqUTEdsBBmXnCLBYf2NQCa9asa5s2NLSUkZG1W1Dd3DE2DqMbxzr2Ovohk06aLo/1\n60cBWL36LsY2jHa7rJ7x/dHOTKrMo8o82plJlXlU9UMeNrLqN704a+ghwORdQifcQjEqOHHimIGZ\nRgMlSZIkSZuvF43gE4BvTTPvCmDihDKHA1d3pSJJkiRJapA6zxq6L3AWsBuwMSJWAkcCuwI/mbTs\nZZl5BHAh8LSI+CrFyWaOras+SZIkSWqqOk8WswpYMcWsk6dY9ojy33uB4+qqSZIkSZLUm11DJUmS\nJEk9ZCMoSZIkSQ1jIyhJkiRJDWMjKEmSJEkNYyMoSZIkSQ1jIyhJkiRJDWMjKEmSJEkNYyMoSZIk\nSQ1jIyhJkiRJDWMjKEmSJEkNYyMoSZIkSQ1jIyhJkiRJDWMjKEmSJEkNYyMoSZIkSQ1jIyhJkiRJ\nDWMjKEmSJEkNYyMoSZIkSQ1jIyhJkiRJDWMjKEmSJEkNYyMoSZIkSQ1jIyhJkiRJDWMjKEmSJEkN\nYyMoSZIkSQ1jIyhJkiRJDTNY54NHxN7AZcDZmXluRCwA/h14BLAWWJmZa1qWXwFcDHyvnPSdzDy5\nzholSZIkqWlqawQjYglwDnBVy+T/A4xk5tER8QrgYODySatek5kr66pLkiRJkpquzhHB9cBhwCkt\n0w4H3gqQmf9c43NLkiRJkqZRWyOYmaPAaES0Tt4NeFZEvAu4FTghM2+ftOpeEXE5cH/gjMy8cqbn\n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\ndmOvAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "M0Hm5IjwM9ck", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "" ], "execution_count": 0, "outputs": [] } ] }