18 Commits
v1.1.1 ... main

Author SHA1 Message Date
Adrian Rumpold
2e1ede071e fix: Add missing file containing changes (see #13) 2022-04-06 12:02:24 +02:00
Adrian Rumpold
8fb322283c Merge pull request #14 from AdrianoKF/fix/extra_state_attributes
fix: Replace deprecated device_state_attributes property
2022-04-06 11:38:20 +02:00
Adrian Rumpold
35ed25cf3f fix: Replace deprecated device_state_attributes property
See https://developers.home-assistant.io/docs/core/entity/?_highlight=extra_state_attributes#generic-properties for details
2022-04-06 11:31:46 +02:00
Adrian Rumpold
d20b48e6b1 Merge pull request #12 from AdrianoKF/fix-div-ids
Fix div IDs
2022-03-18 09:06:54 +01:00
Adrian Rumpold
d1438f9a0b chore: Bump versin number 2022-03-18 09:01:21 +01:00
Adrian Rumpold
c1b7b16251 fix: Update div IDs to mnatch new page structure 2022-03-18 09:00:15 +01:00
Adrian Rumpold
e6c2644ea5 chore: Dependency updates 2022-03-18 08:59:53 +01:00
Adrian Rumpold
fc5f6e7c93 Merge pull request #11 from AdrianoKF/10-negative-first-vaccination-doses
Fix for negative number of first vaccination doses
2021-11-11 19:56:00 +01:00
Adrian Rumpold
fa052cdfc9 chore: Bump version number for release 2021-11-11 19:51:26 +01:00
Adrian Rumpold
f6f799e85f fix(crawler): Fix invalid calculation of number of first vaccinations
Numbers for second shot are actually inclusive of booster
shots, so booster shots do not
have to be subtracted from the
total number of vaccinations.

Fixes #10.
2021-11-11 19:50:44 +01:00
Adrian Rumpold
a44308a4e1 Merge pull request #9 from AdrianoKF/8-new-vaccination-report-format
Support new vaccination report format
2021-10-09 14:02:52 +02:00
Adrian Rumpold
dd5bb2916b chore: Bump manifest version number 2021-10-09 14:00:12 +02:00
Adrian Rumpold
67bb1e49ef feat(parser): Support new vaccination report format
Closes #8
2021-10-09 13:59:09 +02:00
Adrian Rumpold
aaea39657e Merge pull request #7 from AdrianoKF/6-integer-incidence-parse-failure
Correctly handle incidence values without decimals
2021-09-20 07:54:05 +02:00
Adrian Rumpold
81c19b552d fix(parser): Correctly handle incidence values without decimals
Closes #6
2021-09-20 07:51:52 +02:00
Adrian Rumpold
0d609ade9a chore: Bump version number 2021-09-17 08:36:54 +02:00
Adrian Rumpold
2b453f4b5e Merge pull request #5 from AdrianoKF/4-infection-data-parsing-error
Update infection data parser for new web page layout
2021-09-17 08:34:55 +02:00
Adrian Rumpold
62904f4c09 fix(parser): Update infection data parser for new web page layout
Closes #4
2021-09-17 08:30:48 +02:00
6 changed files with 605 additions and 487 deletions

View File

@@ -16,7 +16,7 @@ from .crawler import CovidCrawler
_LOGGER = logging.getLogger(__name__)
__version__ = "0.1.0"
__version__ = "1.3.1"
PLATFORMS = ["sensor"]

View File

@@ -59,10 +59,12 @@ class VaccinationData:
total_vaccinations: int = 0
num_vaccinated_once: int = 0
num_vaccinated_full: int = 0
num_vaccinated_booster: int = 0
ratio_vaccinated_once: float = 0.0
ratio_vaccinated_full: float = 0.0
ratio_vaccinated_total: float = 0.0
ratio_vaccinated_booster: float = 0.0
class CovidCrawlerBase(ABC):
@@ -107,11 +109,11 @@ class CovidCrawler(CovidCrawlerBase):
)
soup = await self._fetch(url)
match = soup.find(class_="frame--type-textpic")
text = match.p.text
match = soup.find(id="c1075340")
text = match.text.strip()
_log.debug(f"Infection data text: {text}")
matches = re.search(r"(\d+,\d+)\sNeuinfektion", text)
matches = re.search(r"(\d+(,\d+)?)\sNeuinfektion", text)
if not matches:
raise ValueError(
f"Could not extract incidence from scraped web page, {text=}"
@@ -120,18 +122,15 @@ class CovidCrawler(CovidCrawlerBase):
incidence = parse_num(matches.group(1), t=float)
_log.debug(f"Parsed incidence: {incidence}")
text = match.h2.text
matches = re.search(r"\((\d+)\. (\w+).*\)", text)
match = soup.find(id="c1052517")
text = match.text.strip()
matches = re.search(r"Stand: (\d+)\. (\w+) (\d{4})", text)
if not matches:
raise ValueError(f"Could not extract date from scraped web page, {text=}")
date = parse_date(matches.group(1), matches.group(2))
date = parse_date(matches.group(1), matches.group(2), matches.group(3))
_log.debug(f"Parsed date: {date}")
match = match.find_next_sibling(class_="frame--type-textpic")
text = match.text
_log.debug(f"Infection counts text: {text}")
regexes = [
r"Insgesamt: (?P<total_cases>[0-9.]+)",
r"genesen: (?P<num_recovered>[0-9.]+)",
@@ -168,9 +167,9 @@ class CovidCrawler(CovidCrawlerBase):
result = soup.find(id=container_id)
text = re.sub(r"\s+", " ", result.text)
regexes = [
r"(?P<total_vaccinations>\d+[.]\d+) Impfdosen",
r"Weitere (?P<num_vaccinated_once>\d+[.]\d+) Personen haben die Erstimpfung erhalten",
r"(?P<num_vaccinated_full>\d+[.]\d+) Personen sind bereits vollständig geimpft",
r"(?P<total_vaccinations>\d+([.]\d+)?) Personen in Augsburg",
r"(?P<num_vaccinated_full>\d+([.]\d+)?) Personen in Augsburg",
r"(?P<num_vaccinated_booster>\d+([.]\d+)?) Personen, also",
]
values = {}
for r in regexes:
@@ -188,18 +187,24 @@ class CovidCrawler(CovidCrawlerBase):
if not matches:
raise ValueError(f"Could not extract date from scraped web page, {text=}")
values["num_vaccinated_once"] = (
values["total_vaccinations"] - values["num_vaccinated_full"]
)
values["date"] = parse_date(**matches.groupdict()).strftime("%Y-%m-%d")
result = VaccinationData(**values)
# Total population in Augsburg as of 2020
# https://www.augsburg.de/fileadmin/user_upload/buergerservice_rathaus/rathaus/statisiken_und_geodaten/statistiken/Monitoring/Demografiemonitoring_der_Stadt_Augsburg_2021.pdf
population = 299021
# Total population in Augsburg as listed on the crawled page
population = 298014
result.ratio_vaccinated_full = result.num_vaccinated_full / population * 100
result.ratio_vaccinated_once = result.num_vaccinated_once / population * 100
result.ratio_vaccinated_total = (
result.ratio_vaccinated_once + result.ratio_vaccinated_full
)
result.ratio_vaccinated_booster = (
result.num_vaccinated_booster / population * 100
)
_log.debug(f"Result data: {result}")
return result

View File

@@ -1,11 +1,15 @@
{
"domain": "covid19_augsburg",
"name": "COVID-19 Augsburg",
"version": "1.1.1",
"config_flow": true,
"documentation": "https://github.com/AdrianoKF/home-assistant-covid19-augsburg",
"issue_tracker": "https://github.com/AdrianoKF/home-assistant-covid19-augsburg/issues",
"requirements": ["beautifulsoup4==4.8.2"],
"dependencies": [],
"codeowners": ["@AdrianoKF"]
}
"domain": "covid19_augsburg",
"name": "COVID-19 Augsburg",
"version": "1.3.1",
"config_flow": true,
"documentation": "https://github.com/AdrianoKF/home-assistant-covid19-augsburg",
"issue_tracker": "https://github.com/AdrianoKF/home-assistant-covid19-augsburg/issues",
"requirements": [
"beautifulsoup4==4.8.2"
],
"dependencies": [],
"codeowners": [
"@AdrianoKF"
]
}

View File

@@ -51,7 +51,7 @@ class CoronaAugsburgSensor(Entity):
return self.coordinator.data["incidence"].incidence
@property
def device_state_attributes(self):
def extra_state_attributes(self):
data = self.coordinator.data["incidence"]
return asdict(data)
@@ -98,7 +98,7 @@ class CoronaAugsburgVaccinationSensor(Entity):
return self.coordinator.data["vaccination"].total_vaccinations
@property
def device_state_attributes(self):
def extra_state_attributes(self):
data = self.coordinator.data["vaccination"]
return asdict(data)

1021
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
[tool.poetry]
name = "git add re"
version = "0.1.0"
name = "home_assistant_covid19_augsburg"
version = "1.3.1"
description = ""
authors = ["Adrian Rumpold <a.rumpold@gmail.com>"]
packages = [