Skip to content

Commit

Permalink
New improved version
Browse files Browse the repository at this point in the history
Added support for download with HACS and configuration in GUI.
  • Loading branch information
eyesoft committed Sep 13, 2022
1 parent 2c64be2 commit 0de8557
Show file tree
Hide file tree
Showing 9 changed files with 511 additions and 116 deletions.
187 changes: 104 additions & 83 deletions custom_components/min_renovasjon/__init__.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,32 @@
import aiohttp
import asyncio
import urllib.parse
import requests
import json
from datetime import date
from datetime import datetime
import logging
import homeassistant.helpers.config_validation as cv
import voluptuous as vol

_LOGGER = logging.getLogger(__name__)

DOMAIN = "min_renovasjon"
DATA_MIN_RENOVASJON = "data_min_renovasjon"

CONF_STREET_NAME = "street_name"
CONF_STREET_CODE = "street_code"
CONF_HOUSE_NO = "house_no"
CONF_COUNTY_ID = "county_id"
CONF_DATE_FORMAT = "date_format"
DEFAULT_DATE_FORMAT = "%d/%m/%Y"
from datetime import date
from datetime import datetime
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from .const import (
DOMAIN,
CONF_STREET_NAME,
CONF_STREET_CODE,
CONF_HOUSE_NO,
CONF_COUNTY_ID,
CONF_DATE_FORMAT,
DEFAULT_DATE_FORMAT,
CONST_KOMMUNE_NUMMER,
CONST_APP_KEY,
CONST_URL_FRAKSJONER,
CONST_URL_TOMMEKALENDER,
CONST_APP_KEY_VALUE
)

CONST_KOMMUNE_NUMMER = "Kommunenr"
CONST_APP_KEY = "RenovasjonAppKey"
CONST_URL_FRAKSJONER = 'https://komteksky.norkart.no/komtek.renovasjonwebapi/api/fraksjoner'
CONST_URL_TOMMEKALENDER = 'https://komteksky.norkart.no/komtek.renovasjonwebapi/api/tommekalender?' \
'gatenavn=[gatenavn]&gatekode=[gatekode]&husnr=[husnr]'
CONST_APP_KEY_VALUE = "AE13DEEC-804F-4615-A74E-B4FAC11F0A30"
_LOGGER = logging.getLogger(__name__)

CONFIG_SCHEMA = vol.Schema({
DOMAIN: vol.Schema({
Expand All @@ -36,29 +38,53 @@
})
}, extra=vol.ALLOW_EXTRA)


def setup(hass, config):
"""Set up the MinRenovasjon component."""
async def async_setup(hass: HomeAssistant, config: dict):
if DOMAIN not in config:
return True

hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN]["calendar_list"] = None

street_name = config[DOMAIN][CONF_STREET_NAME]
street_code = config[DOMAIN][CONF_STREET_CODE]
house_no = config[DOMAIN][CONF_HOUSE_NO]
county_id = config[DOMAIN][CONF_COUNTY_ID]
date_format = config[DOMAIN][CONF_DATE_FORMAT]
#date_format = config[DOMAIN][CONF_DATE_FORMAT]
date_format = None
min_renovasjon = MinRenovasjon(hass, street_name, street_code, house_no, county_id, date_format)

hass.data[DOMAIN]["data"] = min_renovasjon

return True

async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:

hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN]["calendar_list"] = None
street_name = config_entry.data.get(CONF_STREET_NAME, "")
street_code = config_entry.data.get(CONF_STREET_CODE, "")
house_no = config_entry.data.get(CONF_HOUSE_NO, "")
county_id = config_entry.data.get(CONF_COUNTY_ID, "")
#date_format = config_entry.data.get(CONF_DATE_FORMAT, "")
date_format = None
min_renovasjon = MinRenovasjon(hass, street_name, street_code, house_no, county_id, date_format)

min_renovasjon = MinRenovasjon(street_name, street_code, house_no, county_id, date_format)
hass.data[DATA_MIN_RENOVASJON] = min_renovasjon
hass.data[DOMAIN]["data"] = min_renovasjon
hass.config_entries.async_setup_platforms(config_entry, ["sensor"])

return True

async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
return True

class MinRenovasjon:
def __init__(self, gatenavn, gatekode, husnr, kommunenr, date_format):
def __init__(self, hass, gatenavn, gatekode, husnr, kommunenr, date_format):
self._hass = hass
self.gatenavn = self._url_encode(gatenavn)
self.gatekode = gatekode
self.husnr = husnr
self._kommunenr = kommunenr
self._date_format = date_format
self._kalender_list = self._get_calendar_list()
#self._date_format = date_format

@staticmethod
def _url_encode(string):
Expand All @@ -67,62 +93,54 @@ def _url_encode(string):
string = string_decoded_encoded
return string

def refresh_calendar(self):
do_refresh = self._check_for_refresh_of_data(self._kalender_list)
if do_refresh:
self._kalender_list = self._get_calendar_list()

def _get_tommekalender_from_web_api(self):
async def _get_tommekalender_from_web_api(self):
_LOGGER.debug("_get_tommekalender_from_web_api")

header = {CONST_KOMMUNE_NUMMER: self._kommunenr, CONST_APP_KEY: CONST_APP_KEY_VALUE}

url = CONST_URL_TOMMEKALENDER
url = url.replace('[gatenavn]', self.gatenavn)
url = url.replace('[gatekode]', self.gatekode)
url = url.replace('[husnr]', self.husnr)

response = requests.get(url, headers=header)
if response.status_code == requests.codes.ok:
data = response.text
if data == "true":
_LOGGER.error("Calendar is empty")
return None

return data
else:
_LOGGER.error("GET Tommekalender returned: %s", response.status_code)
return None
async with aiohttp.ClientSession(headers=header) as session:
async with session.get(url) as resp:
data = await resp.read()

if resp.ok:
return data.decode("UTF-8")
else:
_LOGGER.error("GET Tommekalender returned: %s", resp)
return None

def _get_fraksjoner_from_web_api(self):
async def _get_fraksjoner_from_web_api(self):
_LOGGER.debug("_get_fraksjoner_from_web_api")

header = {CONST_KOMMUNE_NUMMER: self._kommunenr, CONST_APP_KEY: CONST_APP_KEY_VALUE}
url = CONST_URL_FRAKSJONER

response = requests.get(url, headers=header)
if response.status_code == requests.codes.ok:
data = response.text
return data
else:
_LOGGER.error("GET Fraksjoner returned: %s", response.status_code)
return None

def _get_from_web_api(self):
tommekalender = self._get_tommekalender_from_web_api()
fraksjoner = self._get_fraksjoner_from_web_api()
async with aiohttp.ClientSession(headers=header) as session:
async with session.get(url) as resp:
data = await resp.read()

_LOGGER.debug(f"Tommekalender: {tommekalender}")
_LOGGER.debug(f"Fraksjoner: {fraksjoner}")
if resp.ok:
return data.decode("UTF-8")
else:
_LOGGER.error("GET Fraksjoner returned: %s", resp)
return None

async def _get_from_web_api(self):
tommekalender = await self._get_tommekalender_from_web_api()
fraksjoner = await self._get_fraksjoner_from_web_api()
return tommekalender, fraksjoner

def _get_calendar_list(self, refresh=False):
data = None

async def _get_calendar_list(self, refresh=False):
data = self._hass.data[DOMAIN]["calendar_list"]
if refresh or data is None:
_LOGGER.debug("Refresh or no data. Fetching from API.")
tommekalender, fraksjoner = self._get_from_web_api()
tommekalender, fraksjoner = await self._get_from_web_api()
kalender_list = self._parse_calendar_list(tommekalender, fraksjoner)
else:
tommekalender, fraksjoner = data

kalender_list = self._parse_calendar_list(tommekalender, fraksjoner)
kalender_list = data

if kalender_list is None:
return None
Expand All @@ -132,9 +150,10 @@ def _get_calendar_list(self, refresh=False):
check_for_refresh = self._check_for_refresh_of_data(kalender_list)

if check_for_refresh:
kalender_list = self._get_calendar_list(refresh=True)
kalender_list = await self._get_calendar_list(refresh=True)

_LOGGER.debug("Returning calendar list")
self._hass.data[DOMAIN]["calendar_list"] = kalender_list

return kalender_list

@staticmethod
Expand All @@ -145,8 +164,6 @@ def _parse_calendar_list(tommekalender, fraksjoner):
_LOGGER.error("Could not fetch calendar. Check configuration parameters.")
return None

_LOGGER.debug(tommekalender)

tommekalender_json = json.loads(tommekalender)
fraksjoner_json = json.loads(fraksjoner)

Expand All @@ -166,7 +183,7 @@ def _parse_calendar_list(tommekalender, fraksjoner):
tommedato_neste = datetime.strptime(tommedato_neste, "%Y-%m-%dT%H:%M:%S")

for fraksjon in fraksjoner_json:
if fraksjon['Id'] == fraksjon_id:
if int(fraksjon['Id']) == int(fraksjon_id):
fraksjon_navn = fraksjon['Navn']
fraksjon_ikon = fraksjon['Ikon']

Expand Down Expand Up @@ -194,20 +211,24 @@ def _check_for_refresh_of_data(kalender_list):

return False

def get_calender_for_fraction(self, fraksjon_id):
if self._kalender_list is None:
return None

for entry in self._kalender_list:
async def get_calender_for_fraction(self, fraksjon_id):
calendar_list = self._hass.data[DOMAIN]["calendar_list"]

if calendar_list is None:
calendar_list = await self._get_calendar_list()
self._hass.data[DOMAIN]["calendar_list"] = calendar_list

for entry in calendar_list:
entry_fraksjon_id, _, _, _, _= entry
if fraksjon_id == entry_fraksjon_id:
if int(fraksjon_id) == int(entry_fraksjon_id):
return entry

@property
def calender_list(self):
return self._kalender_list
return self._hass.data[DOMAIN]["calendar_list"]

def format_date(self, date):
if self._date_format == "None":
return date
return date.strftime(self._date_format)
return date
#if self._date_format == "None":
# return date
#return date.strftime(self._date_format)
Loading

0 comments on commit 0de8557

Please sign in to comment.