Compare commits

..

23 Commits

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
Adrian Rumpold 35d5232d8e feat: Use syringe MDI icon for vaccination entity 2021-08-11 10:57:03 +02:00
Adrian Rumpold 1c3b0ae0b5 Merge pull request #3 from AdrianoKF/feature/vaccination-data
Crawling and parsing of vaccination data, see #2
2021-08-11 10:35:21 +02:00
Adrian Rumpold d2e8f77725 docs: Update readme 2021-08-11 10:26:48 +02:00
Adrian Rumpold 92e99e03ef feat: Include ratio of at-least-once vaccinated persons 2021-08-11 10:26:18 +02:00
Adrian Rumpold 903a512f99 docs: Update readme 2021-08-11 10:21:34 +02:00
7 changed files with 633 additions and 489 deletions
+23 -1
View File
@@ -2,7 +2,8 @@
## Adding to your dashboard ## Adding to your dashboard
You can add an overview of the current infection numbers to your dashboard using the [multiple-entity-row](https://github.com/benct/lovelace-multiple-entity-row) card: You can add an overview of the current infection and vaccination numbers to your dashboard
using the [multiple-entity-row](https://github.com/benct/lovelace-multiple-entity-row) card:
```yaml ```yaml
type: entities type: entities
@@ -24,4 +25,25 @@ entities:
secondary_info: secondary_info:
attribute: incidence attribute: incidence
unit: cases/100k unit: cases/100k
- type: custom:multiple-entity-row
entity: sensor.covid_19_vaccinations_augsburg
entities:
- attribute: ratio_vaccinated_once
name: Once
format: precision1
unit: '%'
- attribute: ratio_vaccinated_full
name: Fully
format: precision1
unit: '%'
- attribute: ratio_vaccinated_total
name: Total
format: precision1
unit: '%'
show_state: false
icon: mdi:needle
name: COVID-19 Vaccinations
secondary_info:
attribute: date
format: date
``` ```
@@ -16,7 +16,7 @@ from .crawler import CovidCrawler
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
__version__ = "0.1.0" __version__ = "1.3.1"
PLATFORMS = ["sensor"] PLATFORMS = ["sensor"]
@@ -59,9 +59,12 @@ class VaccinationData:
total_vaccinations: int = 0 total_vaccinations: int = 0
num_vaccinated_once: int = 0 num_vaccinated_once: int = 0
num_vaccinated_full: int = 0 num_vaccinated_full: int = 0
num_vaccinated_booster: int = 0
ratio_vaccinated_once: float = 0.0 ratio_vaccinated_once: float = 0.0
ratio_vaccinated_full: float = 0.0 ratio_vaccinated_full: float = 0.0
ratio_vaccinated_total: float = 0.0
ratio_vaccinated_booster: float = 0.0
class CovidCrawlerBase(ABC): class CovidCrawlerBase(ABC):
@@ -106,11 +109,11 @@ class CovidCrawler(CovidCrawlerBase):
) )
soup = await self._fetch(url) soup = await self._fetch(url)
match = soup.find(class_="frame--type-textpic") match = soup.find(id="c1075340")
text = match.p.text text = match.text.strip()
_log.debug(f"Infection data text: {text}") _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: if not matches:
raise ValueError( raise ValueError(
f"Could not extract incidence from scraped web page, {text=}" f"Could not extract incidence from scraped web page, {text=}"
@@ -119,18 +122,15 @@ class CovidCrawler(CovidCrawlerBase):
incidence = parse_num(matches.group(1), t=float) incidence = parse_num(matches.group(1), t=float)
_log.debug(f"Parsed incidence: {incidence}") _log.debug(f"Parsed incidence: {incidence}")
text = match.h2.text match = soup.find(id="c1052517")
matches = re.search(r"\((\d+)\. (\w+).*\)", text) text = match.text.strip()
matches = re.search(r"Stand: (\d+)\. (\w+) (\d{4})", text)
if not matches: if not matches:
raise ValueError(f"Could not extract date from scraped web page, {text=}") 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}") _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 = [ regexes = [
r"Insgesamt: (?P<total_cases>[0-9.]+)", r"Insgesamt: (?P<total_cases>[0-9.]+)",
r"genesen: (?P<num_recovered>[0-9.]+)", r"genesen: (?P<num_recovered>[0-9.]+)",
@@ -167,9 +167,9 @@ class CovidCrawler(CovidCrawlerBase):
result = soup.find(id=container_id) result = soup.find(id=container_id)
text = re.sub(r"\s+", " ", result.text) text = re.sub(r"\s+", " ", result.text)
regexes = [ regexes = [
r"(?P<total_vaccinations>\d+[.]\d+) Impfdosen", r"(?P<total_vaccinations>\d+([.]\d+)?) Personen in Augsburg",
r"Weitere (?P<num_vaccinated_once>\d+[.]\d+) Personen haben die Erstimpfung erhalten", r"(?P<num_vaccinated_full>\d+([.]\d+)?) Personen in Augsburg",
r"(?P<num_vaccinated_full>\d+[.]\d+) Personen sind bereits vollständig geimpft", r"(?P<num_vaccinated_booster>\d+([.]\d+)?) Personen, also",
] ]
values = {} values = {}
for r in regexes: for r in regexes:
@@ -187,15 +187,24 @@ class CovidCrawler(CovidCrawlerBase):
if not matches: if not matches:
raise ValueError(f"Could not extract date from scraped web page, {text=}") 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") values["date"] = parse_date(**matches.groupdict()).strftime("%Y-%m-%d")
result = VaccinationData(**values) result = VaccinationData(**values)
# Total population in Augsburg as of 2020 # Total population in Augsburg as listed on the crawled page
# https://www.augsburg.de/fileadmin/user_upload/buergerservice_rathaus/rathaus/statisiken_und_geodaten/statistiken/Monitoring/Demografiemonitoring_der_Stadt_Augsburg_2021.pdf population = 298014
population = 299021
result.ratio_vaccinated_full = result.num_vaccinated_full / population * 100 result.ratio_vaccinated_full = result.num_vaccinated_full / population * 100
result.ratio_vaccinated_once = result.num_vaccinated_once / 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}") _log.debug(f"Result data: {result}")
return result return result
@@ -1,11 +1,15 @@
{ {
"domain": "covid19_augsburg", "domain": "covid19_augsburg",
"name": "COVID-19 Augsburg", "name": "COVID-19 Augsburg",
"version": "1.1.0", "version": "1.3.1",
"config_flow": true, "config_flow": true,
"documentation": "https://github.com/AdrianoKF/home-assistant-covid19-augsburg", "documentation": "https://github.com/AdrianoKF/home-assistant-covid19-augsburg",
"issue_tracker": "https://github.com/AdrianoKF/home-assistant-covid19-augsburg/issues", "issue_tracker": "https://github.com/AdrianoKF/home-assistant-covid19-augsburg/issues",
"requirements": ["beautifulsoup4==4.8.2"], "requirements": [
"beautifulsoup4==4.8.2"
],
"dependencies": [], "dependencies": [],
"codeowners": ["@AdrianoKF"] "codeowners": [
} "@AdrianoKF"
]
}
@@ -51,7 +51,7 @@ class CoronaAugsburgSensor(Entity):
return self.coordinator.data["incidence"].incidence return self.coordinator.data["incidence"].incidence
@property @property
def device_state_attributes(self): def extra_state_attributes(self):
data = self.coordinator.data["incidence"] data = self.coordinator.data["incidence"]
return asdict(data) return asdict(data)
@@ -87,7 +87,7 @@ class CoronaAugsburgVaccinationSensor(Entity):
@property @property
def icon(self): def icon(self):
return "mdi:biohazard" return "mdi:needle"
@property @property
def unit_of_measurement(self): def unit_of_measurement(self):
@@ -98,7 +98,7 @@ class CoronaAugsburgVaccinationSensor(Entity):
return self.coordinator.data["vaccination"].total_vaccinations return self.coordinator.data["vaccination"].total_vaccinations
@property @property
def device_state_attributes(self): def extra_state_attributes(self):
data = self.coordinator.data["vaccination"] data = self.coordinator.data["vaccination"]
return asdict(data) return asdict(data)
Generated
+565 -456
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "git add re" name = "home_assistant_covid19_augsburg"
version = "0.1.0" version = "1.3.1"
description = "" description = ""
authors = ["Adrian Rumpold <a.rumpold@gmail.com>"] authors = ["Adrian Rumpold <a.rumpold@gmail.com>"]
packages = [ packages = [