├── .gitignore ├── .pylintrc ├── hacs.json ├── custom_components └── davis_vantage │ ├── assets │ ├── icon.png │ ├── logo.png │ ├── icon@2x.png │ ├── dark_icon.png │ ├── dark_logo.png │ └── dark_icon@2x.png │ ├── manifest.json │ ├── services.yaml │ ├── const.py │ ├── coordinator.py │ ├── icons.json │ ├── binary_sensor.py │ ├── __init__.py │ ├── utils.py │ ├── services.py │ ├── config_flow.py │ ├── client.py │ ├── sensor.py │ └── translations │ ├── en.json │ ├── nl.json │ ├── de.json │ └── it.json ├── .github └── workflows │ ├── hassfest.yml │ ├── hacs_validate.yaml │ └── close_inactive_issues.yaml ├── .vscode └── settings.json └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .venv -------------------------------------------------------------------------------- /.pylintrc: -------------------------------------------------------------------------------- 1 | [MESSAGES CONTROL] 2 | disable=unexpected-keyword-arg -------------------------------------------------------------------------------- /hacs.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Davis Vantage", 3 | "homeassistant": "2025.4.0", 4 | "render_readme": true 5 | } 6 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarcoGos/davis_vantage/HEAD/custom_components/davis_vantage/assets/icon.png -------------------------------------------------------------------------------- /custom_components/davis_vantage/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarcoGos/davis_vantage/HEAD/custom_components/davis_vantage/assets/logo.png -------------------------------------------------------------------------------- /custom_components/davis_vantage/assets/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarcoGos/davis_vantage/HEAD/custom_components/davis_vantage/assets/icon@2x.png -------------------------------------------------------------------------------- /custom_components/davis_vantage/assets/dark_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarcoGos/davis_vantage/HEAD/custom_components/davis_vantage/assets/dark_icon.png -------------------------------------------------------------------------------- /custom_components/davis_vantage/assets/dark_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarcoGos/davis_vantage/HEAD/custom_components/davis_vantage/assets/dark_logo.png -------------------------------------------------------------------------------- /custom_components/davis_vantage/assets/dark_icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarcoGos/davis_vantage/HEAD/custom_components/davis_vantage/assets/dark_icon@2x.png -------------------------------------------------------------------------------- /.github/workflows/hassfest.yml: -------------------------------------------------------------------------------- 1 | name: Validate with hassfest 2 | 3 | on: 4 | push: 5 | pull_request: 6 | # schedule: 7 | # - cron: '0 0 * * *' 8 | 9 | jobs: 10 | validate: 11 | runs-on: "ubuntu-latest" 12 | steps: 13 | - uses: "actions/checkout@v5.0.0" 14 | - uses: "home-assistant/actions/hassfest@master" 15 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.analysis.diagnosticSeverityOverrides": { 3 | "reportMissingTypeStubs": "none", 4 | "reportMissingTypeArgument": "none", 5 | "reportUnknownMemberType": "none" 6 | }, 7 | "[python]": { 8 | "editor.defaultFormatter": "ms-python.black-formatter" 9 | }, 10 | "python.formatting.provider": "black" 11 | } 12 | -------------------------------------------------------------------------------- /.github/workflows/hacs_validate.yaml: -------------------------------------------------------------------------------- 1 | name: HACS Validation 2 | 3 | on: 4 | push: 5 | pull_request: 6 | # schedule: 7 | # - cron: "0 0 * * *" 8 | workflow_dispatch: 9 | 10 | jobs: 11 | validate-hacs: 12 | runs-on: "ubuntu-latest" 13 | steps: 14 | - uses: "actions/checkout@v5.0.0" 15 | - name: HACS validation 16 | uses: "hacs/action@main" 17 | with: 18 | category: "integration" 19 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "domain": "davis_vantage", 3 | "name": "Davis Vantage", 4 | "codeowners": [ 5 | "@MarcoGos" 6 | ], 7 | "config_flow": true, 8 | "dependencies": [], 9 | "documentation": "https://github.com/MarcoGos/davis_vantage", 10 | "homekit": {}, 11 | "iot_class": "local_polling", 12 | "issue_tracker": "https://github.com/MarcoGos/davis_vantage/issues", 13 | "requirements": ["PyVantagePro-MarcoGos==0.3.27"], 14 | "ssdp": [], 15 | "version": "1.5.5", 16 | "zeroconf": [] 17 | } 18 | -------------------------------------------------------------------------------- /.github/workflows/close_inactive_issues.yaml: -------------------------------------------------------------------------------- 1 | name: Close inactive issues 2 | on: 3 | schedule: 4 | - cron: "30 1 * * *" 5 | 6 | jobs: 7 | close-issues: 8 | runs-on: ubuntu-latest 9 | permissions: 10 | issues: write 11 | pull-requests: write 12 | steps: 13 | - uses: actions/stale@v5 14 | with: 15 | days-before-issue-stale: 30 16 | days-before-issue-close: 14 17 | stale-issue-label: "stale" 18 | stale-issue-message: "This issue is stale because it has been open for 30 days with no activity." 19 | close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." 20 | days-before-pr-stale: -1 21 | days-before-pr-close: -1 22 | repo-token: ${{ secrets.GITHUB_TOKEN }} 23 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/services.yaml: -------------------------------------------------------------------------------- 1 | set_davis_time: 2 | get_davis_time: 3 | get_raw_data: 4 | get_info: 5 | set_yearly_rain: 6 | fields: 7 | rain_clicks: 8 | required: true 9 | example: 500 10 | selector: 11 | number: 12 | set_archive_period: 13 | fields: 14 | archive_period: 15 | required: true 16 | example: 10 17 | selector: 18 | select: 19 | options: 20 | - "1" 21 | - "5" 22 | - "10" 23 | - "15" 24 | - "30" 25 | - "60" 26 | - "120" 27 | set_rain_collector: 28 | fields: 29 | rain_collector: 30 | required: true 31 | example: "0.2 mm" 32 | selector: 33 | select: 34 | options: 35 | - "0.01\"" 36 | - "0.2 mm" 37 | - "0.1 mm" 38 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/const.py: -------------------------------------------------------------------------------- 1 | """Constants for the Davis Vantage integration.""" 2 | 3 | NAME = "Davis Vantage" 4 | DOMAIN = "davis_vantage" 5 | MANUFACTURER = "Davis" 6 | 7 | DEFAULT_SYNC_INTERVAL = 30 # seconds 8 | DEFAULT_NAME = NAME 9 | 10 | RAIN_COLLECTOR_IMPERIAL = '0.01"' 11 | RAIN_COLLECTOR_METRIC = '0.2 mm' 12 | RAIN_COLLECTOR_METRIC_0_1 = '0.1 mm' 13 | 14 | PROTOCOL_NETWORK = 'Network' 15 | PROTOCOL_SERIAL = 'Serial' 16 | 17 | SERVICE_SET_DAVIS_TIME = 'set_davis_time' 18 | SERVICE_GET_DAVIS_TIME = 'get_davis_time' 19 | SERVICE_GET_RAW_DATA = 'get_raw_data' 20 | SERVICE_GET_INFO = 'get_info' 21 | SERVICE_SET_YEARLY_RAIN = 'set_yearly_rain' 22 | SERVICE_SET_ARCHIVE_PERIOD = 'set_archive_period' 23 | SERVICE_SET_RAIN_COLLECTOR = 'set_rain_collector' 24 | 25 | MODEL_VANTAGE_PRO2 = 'Vantage Pro2' 26 | MODEL_VANTAGE_PRO2PLUS = 'Vantage Pro2 Plus' 27 | MODEL_VANTAGE_VUE = 'Vantage Vue' 28 | 29 | CONFIG_STATION_MODEL = "station_model" 30 | CONFIG_INTERVAL = "interval" 31 | CONFIG_MINIMAL_INTERVAL = 5 32 | CONFIG_PROTOCOL = "protocol" 33 | CONFIG_LINK = "link" 34 | CONFIG_PERSISTENT_CONNECTION = "persistent_connection" 35 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/coordinator.py: -------------------------------------------------------------------------------- 1 | from datetime import timedelta 2 | from typing import Any 3 | import logging 4 | 5 | from homeassistant import config_entries 6 | from homeassistant.helpers.update_coordinator import UpdateFailed, DataUpdateCoordinator 7 | from homeassistant.helpers.device_registry import DeviceInfo 8 | from homeassistant.core import HomeAssistant 9 | from pyvantagepro.parser import LoopDataParserRevB 10 | 11 | from .client import DavisVantageClient 12 | from .const import ( 13 | DOMAIN, 14 | ) 15 | 16 | _LOGGER: logging.Logger = logging.getLogger(__package__) 17 | 18 | 19 | class DavisVantageDataUpdateCoordinator(DataUpdateCoordinator): 20 | """Class to manage fetching data from the weather station.""" 21 | 22 | def __init__( 23 | self, hass: HomeAssistant, client: DavisVantageClient, device_info: DeviceInfo, config_entry: config_entries.ConfigEntry, 24 | ) -> None: 25 | """Initialize.""" 26 | self.client: DavisVantageClient = client 27 | self.platforms: list[str] = [] 28 | self.last_updated = None 29 | self.device_info = device_info 30 | interval = hass.data[DOMAIN].get("interval", 30) 31 | 32 | super().__init__( 33 | hass, 34 | _LOGGER, 35 | name=DOMAIN, 36 | update_interval=timedelta(seconds=interval), 37 | config_entry=config_entry, 38 | ) 39 | 40 | async def _async_update_data(self) -> dict[str, Any]: 41 | """Update data via library.""" 42 | try: 43 | data: LoopDataParserRevB = await self.client.async_get_current_data() # type: ignore 44 | return data 45 | except Exception as exception: 46 | _LOGGER.error( 47 | "Error DavisVantageDataUpdateCoordinator _async_update_data: %s", exception 48 | ) 49 | raise UpdateFailed() from exception 50 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "services": { 3 | "set_davis_time": "mdi:clock-edit-outline", 4 | "get_davis_time": "mdi:clock-outline", 5 | "get_raw_data": "mdi:export", 6 | "get_info": "mdi:information-box-outline", 7 | "set_yearly_rain": "mdi:weather-pouring", 8 | "set_archive_period": "mdi:archive-clock-outline", 9 | "set_rain_collector": "mdi:bucket-outline" 10 | }, 11 | "entity": { 12 | "sensor": { 13 | "barometric_trend": { 14 | "default": "mdi:trending-neutral", 15 | "state": { 16 | "falling_rapidly": "mdi:trending-down", 17 | "falling_slowly": "mdi:trending-down", 18 | "steady": "mdi:trending-neutral", 19 | "rising_slowly": "mdi:trending-up", 20 | "rising_rapidly": "mdi:trending-up" 21 | } 22 | }, 23 | "wind_direction_rose": { 24 | "default": "mdi:compass-outline", 25 | "state": { 26 | "n": "mdi:arrow-down-bold-outline", 27 | "ne": "mdi:arrow-bottom-left-bold-outline", 28 | "e": "mdi:arrow-left-bold-outline", 29 | "se": "mdi:arrow-top-left-bold-outline", 30 | "s": "mdi:arrow-up-bold-outline", 31 | "sw": "mdi:arrow-top-right-bold-outline", 32 | "w": "mdi:arrow-right-bold-outline", 33 | "nw": "mdi:arrow-bottom-right-bold-outline" 34 | } 35 | }, 36 | "wind_direction_rose_average": { 37 | "default": "mdi:compass-outline", 38 | "state": { 39 | "n": "mdi:arrow-down-bold-outline", 40 | "ne": "mdi:arrow-bottom-left-bold-outline", 41 | "e": "mdi:arrow-left-bold-outline", 42 | "se": "mdi:arrow-top-left-bold-outline", 43 | "s": "mdi:arrow-up-bold-outline", 44 | "sw": "mdi:arrow-top-right-bold-outline", 45 | "w": "mdi:arrow-right-bold-outline", 46 | "nw": "mdi:arrow-bottom-right-bold-outline" 47 | } 48 | } 49 | }, 50 | "binary_sensor": { 51 | "is_raining": { 52 | "state": { 53 | "on": "mdi:weather-pouring", 54 | "off": "mdi:weather-partly-cloudy" 55 | } 56 | } 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /custom_components/davis_vantage/binary_sensor.py: -------------------------------------------------------------------------------- 1 | """Binary sensor setup for our Integration.""" 2 | 3 | from dataclasses import dataclass 4 | from homeassistant.components.binary_sensor import ( 5 | DOMAIN as BINARY_SENSOR_DOMAIN, 6 | BinarySensorEntity, 7 | BinarySensorEntityDescription, 8 | ) 9 | from homeassistant.helpers.entity_platform import AddEntitiesCallback 10 | from homeassistant.helpers.update_coordinator import CoordinatorEntity 11 | 12 | from . import DavisConfigEntry 13 | from .const import DEFAULT_NAME 14 | from .coordinator import DavisVantageDataUpdateCoordinator 15 | 16 | @dataclass(frozen=True, kw_only=True) 17 | class DavisVantageBinarySensorEntityDescription(BinarySensorEntityDescription): 18 | """Describes Davis Vantage binary sensor entity.""" 19 | 20 | entity_name: str 21 | 22 | DESCRIPTIONS: list[DavisVantageBinarySensorEntityDescription] = [ 23 | DavisVantageBinarySensorEntityDescription( 24 | key="IsRaining", 25 | translation_key="is_raining", 26 | entity_name="Is Raining"), 27 | ] 28 | 29 | 30 | async def async_setup_entry( 31 | _, 32 | config_entry: DavisConfigEntry, 33 | async_add_entities: AddEntitiesCallback, 34 | ) -> None: 35 | """Set up Davis Vantage sensors based on a config entry.""" 36 | coordinator = config_entry.runtime_data.coordinator 37 | 38 | entities: list[DavisVantageBinarySensor] = [] 39 | 40 | # Add all binary sensors described above. 41 | for description in DESCRIPTIONS: 42 | entities.append( 43 | DavisVantageBinarySensor( 44 | coordinator=coordinator, 45 | entry_id=config_entry.entry_id, 46 | description=description, 47 | ) 48 | ) 49 | 50 | async_add_entities(entities) 51 | 52 | 53 | class DavisVantageBinarySensor( 54 | CoordinatorEntity[DavisVantageDataUpdateCoordinator], BinarySensorEntity 55 | ): 56 | """Defines a Davis Vantage sensor.""" 57 | 58 | _attr_has_entity_name = True 59 | 60 | def __init__( 61 | self, 62 | coordinator: DavisVantageDataUpdateCoordinator, 63 | entry_id: str, 64 | description: DavisVantageBinarySensorEntityDescription, 65 | ) -> None: 66 | """Initialize Davis Vantage sensor.""" 67 | super().__init__(coordinator=coordinator) 68 | self.entity_description = description 69 | self.entity_id = ( 70 | f"{BINARY_SENSOR_DOMAIN}.{DEFAULT_NAME} {description.entity_name}".lower() 71 | ) 72 | self._attr_unique_id = ( 73 | f"{entry_id}-{DEFAULT_NAME} {description.entity_name}" 74 | ) 75 | self._attr_device_info = coordinator.device_info 76 | 77 | @property 78 | def is_on(self) -> bool | None: # type: ignore 79 | """Return the is_on of the sensor.""" 80 | key = self.entity_description.key 81 | data = self.coordinator.data 82 | if key not in data: 83 | return None 84 | return data.get(key, False) # type: ignore 85 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/__init__.py: -------------------------------------------------------------------------------- 1 | """The Davis Vantage integration.""" 2 | 3 | from __future__ import annotations 4 | from dataclasses import dataclass 5 | import logging 6 | 7 | from homeassistant.config_entries import ConfigEntry 8 | from homeassistant.core import HomeAssistant 9 | from homeassistant.helpers.device_registry import DeviceInfo 10 | from homeassistant.const import Platform 11 | from .client import DavisVantageClient 12 | from .const import ( 13 | DOMAIN, 14 | NAME, 15 | MANUFACTURER, 16 | CONFIG_STATION_MODEL, 17 | CONFIG_INTERVAL, 18 | CONFIG_PROTOCOL, 19 | CONFIG_LINK, 20 | CONFIG_PERSISTENT_CONNECTION, 21 | ) 22 | from .coordinator import DavisVantageDataUpdateCoordinator 23 | from .services import DavisServicesSetup 24 | 25 | PLATFORMS: list[Platform] = [Platform.SENSOR, Platform.BINARY_SENSOR] 26 | 27 | _LOGGER: logging.Logger = logging.getLogger(__package__) 28 | 29 | 30 | @dataclass 31 | class RuntimeData: 32 | """Class to hold your data.""" 33 | coordinator: DavisVantageDataUpdateCoordinator 34 | 35 | type DavisConfigEntry = ConfigEntry[RuntimeData] 36 | 37 | async def async_setup_entry( 38 | hass: HomeAssistant, config_entry: DavisConfigEntry 39 | ) -> bool: 40 | """Set up Davis Vantage from a config entry.""" 41 | if hass.data.get(DOMAIN) is None: 42 | hass.data.setdefault(DOMAIN, {}) 43 | 44 | _LOGGER.debug("entry.data: %s", config_entry.data) 45 | 46 | protocol = config_entry.data.get(CONFIG_PROTOCOL, "") 47 | link = config_entry.data.get(CONFIG_LINK, "") 48 | persistent_connection = config_entry.data.get(CONFIG_PERSISTENT_CONNECTION, False) 49 | 50 | hass.data[DOMAIN]["interval"] = config_entry.data.get(CONFIG_INTERVAL, 30) 51 | 52 | client = DavisVantageClient(hass, protocol, link, persistent_connection) 53 | await client.connect_to_station() 54 | await client.get_station_info() 55 | 56 | device_info = DeviceInfo( 57 | identifiers={(DOMAIN, config_entry.entry_id)}, 58 | manufacturer=MANUFACTURER, 59 | name=NAME, 60 | model=config_entry.data.get(CONFIG_STATION_MODEL, "Unknown"), 61 | sw_version=client.firmware_version, 62 | hw_version=None, 63 | ) 64 | 65 | coordinator = ( 66 | DavisVantageDataUpdateCoordinator( 67 | hass=hass, client=client, device_info=device_info, config_entry=config_entry 68 | ) 69 | ) 70 | 71 | await coordinator.async_config_entry_first_refresh() 72 | 73 | config_entry.runtime_data = RuntimeData(coordinator) 74 | 75 | await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS) 76 | 77 | config_entry.async_on_unload( 78 | config_entry.add_update_listener(async_reload_entry) 79 | ) 80 | 81 | DavisServicesSetup(hass, config_entry) 82 | 83 | return True 84 | 85 | 86 | async def async_unload_entry(hass: HomeAssistant, config_entry: DavisConfigEntry) -> bool: 87 | """Unload a config entry.""" 88 | return await hass.config_entries.async_unload_platforms( 89 | config_entry, PLATFORMS 90 | ) 91 | 92 | async def async_reload_entry(hass: HomeAssistant, config_entry: DavisConfigEntry) -> None: 93 | """Reload config entry.""" 94 | await hass.config_entries.async_reload(config_entry.entry_id) 95 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/utils.py: -------------------------------------------------------------------------------- 1 | import math 2 | from datetime import datetime 3 | from zoneinfo import ZoneInfo 4 | from typing import Any 5 | 6 | def convert_to_celcius(value: float) -> float: 7 | return round((value - 32.0) * (5.0/9.0), 1) 8 | 9 | def convert_celcius_to_fahrenheit(value_c: float) -> float: 10 | return round(value_c * 1.8 + 32, 1) 11 | 12 | def convert_to_kmh(value: float) -> float: 13 | return round(value * 1.609344, 1) 14 | 15 | def convert_to_ms(value: float) -> float: 16 | return convert_kmh_to_ms(convert_to_kmh(value)) 17 | 18 | def convert_to_mbar(value: float) -> float: 19 | return round(value * 33.8637526, 1) 20 | 21 | def convert_to_mm(value: float) -> float: 22 | return round(value * 20.0, 1) # Use metric tipping bucket modification 23 | 24 | def convert_kmh_to_ms(windspeed: float) -> float: 25 | return round(windspeed / 3.6, 1) 26 | 27 | def convert_ms_to_bft(windspeed: float) -> int: 28 | if windspeed < 0.2: 29 | return 0 30 | elif windspeed < 1.6: 31 | return 1 32 | elif windspeed < 3.4: 33 | return 2 34 | elif windspeed < 5.5: 35 | return 3 36 | elif windspeed < 8.0: 37 | return 4 38 | elif windspeed < 10.8: 39 | return 5 40 | elif windspeed < 13.9: 41 | return 6 42 | elif windspeed < 17.2: 43 | return 7 44 | elif windspeed < 20.8: 45 | return 8 46 | elif windspeed < 24.5: 47 | return 9 48 | elif windspeed < 28.5: 49 | return 10 50 | elif windspeed < 32.7: 51 | return 11 52 | else: 53 | return 12 54 | 55 | def convert_kmh_to_bft(windspeed_kmh: float) -> int: 56 | return convert_ms_to_bft(convert_kmh_to_ms(windspeed_kmh)) 57 | 58 | def contains_correct_raw_data(raw_data: dict[str, Any]) -> None: 59 | return raw_data['TempOut'] != 32767 \ 60 | and raw_data['RainRate'] != 32767 \ 61 | and raw_data['WindSpeed'] != 255 \ 62 | and raw_data['HumOut'] != 255 \ 63 | and raw_data['WindSpeed10Min'] != 255 64 | 65 | def calc_heat_index(temperature_f: float, humidity: float) -> float: 66 | if temperature_f < 80.0 or humidity < 40.0: 67 | return temperature_f 68 | else: 69 | heat_index_f: float = \ 70 | -42.379 \ 71 | + (2.04901523 * temperature_f) \ 72 | + (10.14333127 * humidity) \ 73 | - (0.22475541 * temperature_f * humidity) \ 74 | - (0.00683783 * pow(temperature_f, 2)) \ 75 | - (0.05481717 * pow(humidity, 2)) \ 76 | + (0.00122874 * pow(temperature_f, 2) * humidity) \ 77 | + (0.00085282 * temperature_f * pow(humidity, 2)) \ 78 | - (0.00000199 * pow(temperature_f, 2) * pow(humidity, 2)) 79 | return max(heat_index_f, temperature_f) 80 | 81 | def calc_wind_chill(temperature_f: float, windspeed: float) -> float: 82 | if windspeed == 0: 83 | wind_chill_f = temperature_f 84 | else: 85 | wind_chill_f = \ 86 | 35.74 \ 87 | + (0.6215 * temperature_f) \ 88 | - (35.75 * pow(windspeed,0.16)) \ 89 | + (0.4275 * temperature_f * pow(windspeed, 0.16)) 90 | return max(wind_chill_f, temperature_f) 91 | 92 | def calc_feels_like(temperature_f: float, humidity: float, windspeed_mph: float) -> float: 93 | if windspeed_mph == 0: 94 | windspeed_mph = 1 95 | feels_like_f = temperature_f 96 | if temperature_f <= 50 and humidity >= 3: 97 | feels_like_f = \ 98 | 35.74 \ 99 | + (0.6215 * temperature_f) \ 100 | - (35.75 * pow(windspeed_mph, 0.16)) \ 101 | + (0.4275 * temperature_f * pow(windspeed_mph, 0.16)) 102 | 103 | if feels_like_f == temperature_f and temperature_f >= 80: 104 | feels_like_f = \ 105 | 0.5 * (temperature_f + 61 + ((temperature_f - 68) * 1.2) \ 106 | + (humidity * 0.094) ) 107 | 108 | if feels_like_f >= 80: 109 | feels_like_f = \ 110 | -42.379 \ 111 | + (2.04901523 * temperature_f) \ 112 | + (10.14333127 * humidity) \ 113 | - (0.22475541 * temperature_f * humidity) \ 114 | - (0.00683783 * pow(temperature_f, 2)) \ 115 | - (0.05481717 * pow(humidity, 2)) \ 116 | + (0.00122874 * pow(temperature_f, 2) * humidity) \ 117 | + (0.00085282 * temperature_f * pow(humidity, 2)) \ 118 | - (0.00000199 * pow(temperature_f, 2) * pow(humidity, 2)) 119 | 120 | if humidity < 13 and temperature_f >= 80 and temperature_f <= 112: 121 | feels_like_f = feels_like_f - ((13 - humidity) / 4) * math.sqrt((17 - math.fabs(temperature_f - 95.0)) / 17) 122 | 123 | if humidity > 85 and temperature_f >= 80 and temperature_f <= 87: 124 | feels_like_f = feels_like_f + ((humidity - 85) / 10) * ((87 - temperature_f) / 5) 125 | return feels_like_f 126 | 127 | def convert_to_iso_datetime(value: datetime, tzinfo: ZoneInfo) -> datetime: 128 | return value.replace(tzinfo=tzinfo) 129 | 130 | def get_wind_rose(bearing: int) -> str: 131 | directions = [ 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw' ] 132 | index = round(bearing / 45) % 8 133 | return directions[index] 134 | 135 | def has_correct_value(value: float) -> bool: 136 | return value != 255 and value != 32767 137 | 138 | def round_to_one_decimal(value: float) -> float: 139 | return round(value, 1) 140 | 141 | def get_baro_trend(trend: int) -> str | None: 142 | if trend in [-60,196]: 143 | return "falling_rapidly" 144 | elif trend in [-20,236]: 145 | return "falling_slowly" 146 | elif trend == 0: 147 | return "steady" 148 | elif trend == 20: 149 | return "rising_slowly" 150 | elif trend == 60: 151 | return "rising_rapidly" 152 | else: 153 | return None 154 | 155 | def get_uv(value: int) -> float: 156 | return round(value, 1) 157 | 158 | def get_solar_rad(value: int) -> float: 159 | return value 160 | 161 | def calc_dew_point(temperature_f: float, humidity: float) -> float: 162 | temperature_c = convert_to_celcius(temperature_f) 163 | a = math.log(humidity / 100) + (17.62 * temperature_c / (243.12 + temperature_c)) 164 | return convert_celcius_to_fahrenheit(243.12 * a / (17.62 - a)) 165 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/services.py: -------------------------------------------------------------------------------- 1 | """Global services file.""" 2 | 3 | from typing import Any 4 | from zoneinfo import ZoneInfo 5 | 6 | import voluptuous as vol 7 | 8 | from homeassistant.config_entries import ConfigEntry 9 | from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse 10 | from pyvantagepro.utils import bytes_to_hex # type: ignore 11 | 12 | from .const import ( 13 | DOMAIN, 14 | SERVICE_SET_DAVIS_TIME, 15 | SERVICE_GET_DAVIS_TIME, 16 | SERVICE_GET_RAW_DATA, 17 | SERVICE_SET_YEARLY_RAIN, 18 | SERVICE_SET_ARCHIVE_PERIOD, 19 | SERVICE_SET_RAIN_COLLECTOR, 20 | SERVICE_GET_INFO, 21 | RAIN_COLLECTOR_IMPERIAL, 22 | RAIN_COLLECTOR_METRIC, 23 | RAIN_COLLECTOR_METRIC_0_1, 24 | ) 25 | from .coordinator import DataUpdateCoordinator 26 | from .utils import convert_to_iso_datetime 27 | 28 | SET_YEARLY_RAIN_SERVICE_SCHEMA = vol.Schema( 29 | { 30 | vol.Required("rain_clicks"): int 31 | } 32 | ) 33 | 34 | SET_ARCHIVE_PERIOD_SERVICE_SCHEMA = vol.Schema( 35 | { 36 | vol.Required("archive_period"): vol.In( 37 | ["1", "5", "10", "15", "30", "60", "120"] 38 | ) 39 | } 40 | ) 41 | 42 | SET_RAIN_COLLECTOR_SERVICE_SCHEMA = vol.Schema( 43 | { 44 | vol.Required("rain_collector"): vol.In( 45 | [ 46 | RAIN_COLLECTOR_IMPERIAL, 47 | RAIN_COLLECTOR_METRIC, 48 | RAIN_COLLECTOR_METRIC_0_1, 49 | ] 50 | ) 51 | } 52 | ) 53 | 54 | class DavisServicesSetup: 55 | """Class to handle Integration Services.""" 56 | 57 | def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry) -> None: 58 | """Initialise services.""" 59 | self.hass = hass 60 | self.config_entry = config_entry 61 | self.coordinator: DataUpdateCoordinator = config_entry.runtime_data.coordinator 62 | 63 | self.setup_services() 64 | 65 | def setup_services(self): 66 | """Initialise the services in Hass.""" 67 | self.hass.services.async_register( 68 | DOMAIN, 69 | SERVICE_SET_DAVIS_TIME, 70 | self.set_davis_time) 71 | 72 | self.hass.services.async_register( 73 | DOMAIN, 74 | SERVICE_GET_DAVIS_TIME, 75 | self.get_davis_time, 76 | supports_response=SupportsResponse.ONLY, 77 | ) 78 | 79 | self.hass.services.async_register( 80 | DOMAIN, 81 | SERVICE_GET_RAW_DATA, 82 | self.get_raw_data, 83 | supports_response=SupportsResponse.ONLY, 84 | ) 85 | 86 | self.hass.services.async_register( 87 | DOMAIN, 88 | SERVICE_GET_INFO, 89 | self.get_info, 90 | supports_response=SupportsResponse.ONLY 91 | ) 92 | 93 | self.hass.services.async_register( 94 | DOMAIN, 95 | SERVICE_SET_YEARLY_RAIN, 96 | self.set_yearly_rain, 97 | schema=SET_YEARLY_RAIN_SERVICE_SCHEMA, 98 | ) 99 | 100 | self.hass.services.async_register( 101 | DOMAIN, 102 | SERVICE_SET_ARCHIVE_PERIOD, 103 | self.set_archive_period, 104 | schema=SET_ARCHIVE_PERIOD_SERVICE_SCHEMA, 105 | ) 106 | 107 | self.hass.services.async_register( 108 | DOMAIN, 109 | SERVICE_SET_RAIN_COLLECTOR, 110 | self.set_rain_collector, 111 | schema=SET_RAIN_COLLECTOR_SERVICE_SCHEMA, 112 | ) 113 | 114 | async def set_davis_time(self, _: ServiceCall) -> None: 115 | """Set Davis Time service""" 116 | client = self.config_entry.runtime_data.coordinator.client 117 | await client.async_set_davis_time() 118 | 119 | async def get_davis_time(self, _: ServiceCall) -> dict[str, Any]: 120 | """Get Davis Time service""" 121 | client = self.config_entry.runtime_data.coordinator.client 122 | davis_time = await client.async_get_davis_time() 123 | if davis_time is not None: 124 | return { 125 | "davis_time": convert_to_iso_datetime( 126 | davis_time, ZoneInfo(self.hass.config.time_zone) 127 | ) 128 | } 129 | else: 130 | return {"error": "Couldn't get davis time, please try again later"} 131 | 132 | async def get_raw_data(self, _: ServiceCall) -> dict[str, Any]: 133 | """Get Raw Data service""" 134 | client = self.config_entry.runtime_data.coordinator.client 135 | raw_data = client.get_raw_data() 136 | raw_data.update(client.get_raw_hilows()) 137 | data: dict[str, Any] = {} 138 | for key in raw_data: # type: ignore 139 | value = raw_data[key] # type: ignore 140 | if isinstance(value, bytes): 141 | data[key] = bytes_to_hex(value) 142 | else: 143 | data[key] = value 144 | return data 145 | 146 | async def get_info(self, _: ServiceCall) -> dict[str, Any]: 147 | """Get Info service""" 148 | client = self.config_entry.runtime_data.coordinator.client 149 | info = await client.async_get_info() 150 | if info is not None: 151 | return info 152 | else: 153 | return { 154 | "error": "Couldn't get firmware information from Davis weather station" 155 | } 156 | 157 | async def set_yearly_rain(self, call: ServiceCall) -> None: 158 | """Set Yearly Rain service""" 159 | client = self.config_entry.runtime_data.coordinator.client 160 | await client.async_set_yearly_rain(call.data["rain_clicks"]) 161 | 162 | async def set_archive_period(self, call: ServiceCall) -> None: 163 | """Set Archive Period service""" 164 | client = self.config_entry.runtime_data.coordinator.client 165 | await client.async_set_archive_period(call.data["archive_period"]) 166 | client.clear_cached_property("archive_period") 167 | 168 | async def set_rain_collector(self, call: ServiceCall) -> None: 169 | """Set Rain Collector service""" 170 | client = self.config_entry.runtime_data.coordinator.client 171 | await client.async_set_rain_collector(call.data["rain_collector"]) 172 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/config_flow.py: -------------------------------------------------------------------------------- 1 | """Config flow for Davis Vantage integration.""" 2 | 3 | from __future__ import annotations 4 | 5 | import logging 6 | from typing import Any 7 | import voluptuous as vol 8 | import serial 9 | import serial.tools.list_ports 10 | 11 | from homeassistant.config_entries import ConfigFlow, ConfigFlowResult 12 | from homeassistant.core import HomeAssistant 13 | from homeassistant.exceptions import HomeAssistantError 14 | 15 | from .const import ( 16 | NAME, 17 | DOMAIN, 18 | DEFAULT_SYNC_INTERVAL, 19 | PROTOCOL_NETWORK, 20 | PROTOCOL_SERIAL, 21 | MODEL_VANTAGE_PRO2, 22 | MODEL_VANTAGE_PRO2PLUS, 23 | MODEL_VANTAGE_VUE, 24 | CONFIG_STATION_MODEL, 25 | CONFIG_INTERVAL, 26 | CONFIG_MINIMAL_INTERVAL, 27 | CONFIG_PROTOCOL, 28 | CONFIG_LINK, 29 | CONFIG_PERSISTENT_CONNECTION, 30 | ) 31 | from .client import DavisVantageClient 32 | 33 | RECONFIGURE_SCHEMA = vol.Schema( 34 | { 35 | vol.Required(CONFIG_LINK): str, 36 | vol.Required(CONFIG_INTERVAL, default=DEFAULT_SYNC_INTERVAL): vol.All( 37 | int, vol.Range(min=CONFIG_MINIMAL_INTERVAL) # type: ignore 38 | ), 39 | } 40 | ) 41 | 42 | _LOGGER = logging.getLogger(__name__) 43 | 44 | 45 | class PlaceholderHub: 46 | """Placeholder class to make tests pass.""" 47 | 48 | def __init__(self, hass: HomeAssistant) -> None: 49 | """Initialize.""" 50 | self._hass = hass 51 | 52 | async def authenticate(self, protocol: str, link: str) -> bool: 53 | """Test if we can find data for the given link.""" 54 | _LOGGER.info("authenticate called") 55 | client = DavisVantageClient(self._hass, protocol, link, False) 56 | await client.connect_to_station() 57 | return (await client.async_get_davis_time()) is not None 58 | 59 | 60 | async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, Any]: 61 | """Validate the user input allows us to connect. 62 | 63 | Data has the keys from STEP_USER_DATA_SCHEMA with values provided by the user. 64 | """ 65 | hub = PlaceholderHub(hass) 66 | if not await hub.authenticate(data[CONFIG_PROTOCOL], data[CONFIG_LINK]): 67 | raise InvalidAuth 68 | 69 | # Return info that you want to store in the config entry. 70 | return {"title": NAME} 71 | 72 | 73 | class DavisVantageConfigFlow(ConfigFlow, domain=DOMAIN): 74 | """Handle a config flow for Davis Vantage.""" 75 | 76 | VERSION = 1 77 | protocol: str 78 | link: str 79 | 80 | async def async_step_user( 81 | self, user_input: dict[str, Any] | None = None 82 | ) -> ConfigFlowResult: 83 | """Handle the initial step.""" 84 | if user_input is not None: 85 | self.protocol = user_input[CONFIG_PROTOCOL] 86 | if self.protocol == PROTOCOL_SERIAL: 87 | return await self.async_step_setup_serial() 88 | 89 | return await self.async_step_setup_network() 90 | 91 | list_of_types = [PROTOCOL_SERIAL, PROTOCOL_NETWORK] 92 | schema = vol.Schema({vol.Required(CONFIG_PROTOCOL): vol.In(list_of_types)}) 93 | return self.async_show_form(step_id="user", data_schema=schema) 94 | 95 | async def async_step_setup_serial( 96 | self, user_input: dict[str, Any] | None = None 97 | ) -> ConfigFlowResult: 98 | if user_input is not None: 99 | self.link = user_input[CONFIG_LINK] 100 | return await self.async_step_setup_other_info() 101 | 102 | ports = await self.hass.async_add_executor_job(serial.tools.list_ports.comports) 103 | list_of_ports = { 104 | port.device: f"{port}, s/n: {port.serial_number or 'n/a'}" 105 | + (f" - {port.manufacturer}" if port.manufacturer else "") 106 | for port in ports 107 | } 108 | 109 | step_user_data_schema = vol.Schema( 110 | {vol.Required(CONFIG_LINK): vol.In(list_of_ports)} 111 | ) 112 | 113 | return self.async_show_form( 114 | step_id="setup_serial", data_schema=step_user_data_schema 115 | ) 116 | 117 | async def async_step_setup_network( 118 | self, user_input: dict[str, Any] | None = None 119 | ) -> ConfigFlowResult: 120 | if user_input is not None: 121 | self.link = user_input[CONFIG_LINK] 122 | return await self.async_step_setup_other_info() 123 | 124 | step_user_data_schema = vol.Schema({vol.Required(CONFIG_LINK): str}) 125 | 126 | return self.async_show_form( 127 | step_id="setup_network", data_schema=step_user_data_schema 128 | ) 129 | 130 | async def async_step_setup_other_info( 131 | self, user_input: dict[str, Any] | None = None 132 | ) -> ConfigFlowResult: 133 | errors: dict[str, str] | None = {} 134 | if user_input is not None: 135 | await self.async_set_unique_id(DOMAIN) 136 | self._abort_if_unique_id_configured() 137 | user_input[CONFIG_PROTOCOL] = self.protocol 138 | user_input[CONFIG_LINK] = self.link 139 | try: 140 | info = await validate_input(self.hass, user_input) 141 | except CannotConnect: 142 | errors["base"] = "cannot_connect" 143 | except InvalidAuth: 144 | errors["base"] = "invalid_auth" 145 | except Exception: 146 | _LOGGER.exception("Unexpected exception") 147 | errors["base"] = "unknown" 148 | else: 149 | return self.async_create_entry(title=info["title"], data=user_input) 150 | 151 | step_user_data_schema = vol.Schema( 152 | { 153 | vol.Required(CONFIG_STATION_MODEL): vol.In( 154 | [MODEL_VANTAGE_PRO2, MODEL_VANTAGE_PRO2PLUS, MODEL_VANTAGE_VUE] 155 | ), 156 | vol.Required(CONFIG_INTERVAL, default=DEFAULT_SYNC_INTERVAL): vol.All( 157 | int, vol.Range(min=CONFIG_MINIMAL_INTERVAL) # type: ignore 158 | ), 159 | vol.Required(CONFIG_PERSISTENT_CONNECTION, default=False): bool, 160 | } 161 | ) 162 | 163 | return self.async_show_form( 164 | step_id="setup_other_info", data_schema=step_user_data_schema, errors=errors 165 | ) 166 | 167 | async def async_step_reconfigure( 168 | self, _: dict[str, Any] | None = None 169 | ) -> ConfigFlowResult: 170 | """Handle a reconfiguration flow initialized by the user.""" 171 | self.entry = self.hass.config_entries.async_get_entry(self.context["entry_id"]) 172 | 173 | return await self.async_step_reconfigure_confirm() 174 | 175 | async def async_step_reconfigure_confirm( 176 | self, user_input: dict[str, Any] | None = None 177 | ) -> ConfigFlowResult: 178 | """Handle a reconfiguration flow initialized by the user.""" 179 | errors: dict[str, str] | None = {} 180 | 181 | if user_input is not None: 182 | self.hass.config_entries.async_update_entry( 183 | self.entry, data=self.entry.data | user_input # type: ignore 184 | ) 185 | await self.hass.config_entries.async_reload(self.entry.entry_id) # type: ignore 186 | return self.async_abort(reason="reconfigure_successful") 187 | 188 | step_user_data_schema = RECONFIGURE_SCHEMA 189 | if self.entry.data.get(CONFIG_PROTOCOL) == PROTOCOL_SERIAL: # type: ignore 190 | ports = await self.hass.async_add_executor_job(serial.tools.list_ports.comports) 191 | list_of_ports = { 192 | port.device: f"{port}, s/n: {port.serial_number or 'n/a'}" 193 | + (f" - {port.manufacturer}" if port.manufacturer else "") 194 | for port in ports 195 | } 196 | step_user_data_schema = RECONFIGURE_SCHEMA.extend( 197 | {vol.Required(CONFIG_LINK): vol.In(list_of_ports)}, 198 | required=True 199 | ) 200 | 201 | return self.async_show_form( 202 | step_id="reconfigure_confirm", 203 | data_schema=self.add_suggested_values_to_schema( 204 | data_schema=step_user_data_schema, 205 | suggested_values=self.entry.data | (user_input or {}), # type: ignore 206 | ), 207 | description_placeholders={"name": self.entry.title}, # type: ignore 208 | errors=errors, 209 | ) 210 | 211 | 212 | class CannotConnect(HomeAssistantError): 213 | """Error to indicate we cannot connect.""" 214 | 215 | 216 | class InvalidAuth(HomeAssistantError): 217 | """Error to indicate there is invalid auth.""" 218 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Davis Vantage 2 | 3 | [![GitHub Release][releases-shield]][releases] 4 | [![GitHub Activity][commits-shield]][commits] 5 | ![Install Stats][stats] 6 | 7 | ![Project Maintenance][maintenance-shield] 8 | [![Community Forum][forum-shield]][forum] 9 | 10 | This is a custom integration for the Davis Vantage Pro2. Either use a serial port or use an ip adress to connect to your device. 11 | 12 | Model | Compatible 13 | ---|:---: 14 | Davis WeatherLink SER (6510SER) | Yes 15 | Davis WeatherLink USB (6510USB) | Yes 16 | Davis WeatherlinkIP (6555IP) | Yes[^3] 17 | Vantage Vue | Yes 18 | WeatherLink Live | No 19 | Davis Weather Envoy8X (6318EU) | No 20 | Other models | Unsure 21 | 22 | ## Prerequirements 23 | 24 | Make sure your Davis device is on the lastest firmware: 25 | 26 | Model | Version 27 | ---|:---: 28 | Vantage Pro2 Console (Wired/Cabled) | 3.88 29 | Weather Envoy Wireless | 3.88 30 | Weather Envoy Cabled | 3.12 31 | WeatherLinkIP Data Logger | 1.1.5 32 | 33 | ## Installation 34 | 35 | Via HACS, just search for Davis Vantage. 36 | 37 | ## Setup 38 | 39 | ### Protocol 40 | During the setup of the integration the serial port or the hostname of the weather station needs to be provided. When choosing serial a list of possible ports are visible. 41 | 42 | When choosing network, provide a hostname or ip address and port number: 43 | 44 | Example: 192.168.1.8:22222 45 | 46 | If you're not sure about the port number (usually port 22222), then browse to the ip address of the IP logger and look at the port number on the configuration page. 47 | 48 | ### Interval 49 | Interval between readouts. Every readout takes up about 1-2 seconds for WeatherLink USB and WeatherLink SER and about 5-6 seconds for WeatherLinkIP. 50 | 51 | ## What to expect? 52 | 53 | The following entities will be created: 54 | 55 | - Barometric Pressure: 56 | - Current barometric pressure 57 | - Barometric Pressure High (Day): 58 | - Today's highest barometric pressure 59 | - Barometric Pressure High Time: 60 | - Time of today's highest barometric pressure 61 | - Barometric Pressure Low (Day): 62 | - Today's lowest barometric pressure 63 | - Barometric Pressure Low Time: 64 | - Time of today's lowest barometric pressure 65 | - Barometric Trend: 66 | - Current barometric trend, being Stable, Rising Slowly, Rising Rapidly, Falling Slowly, Falling Rapidly 67 | - Dew Point: 68 | - Current dev point 69 | - Dew Point High (Day) 70 | - Today's highest dew point 71 | - Dew Point High Time 72 | - Time of today's highest dew point 73 | - Dew Point Low (Day) 74 | - Today's lowest dew point 75 | - Dew Point Low Time 76 | - Time of today's lowest dew point 77 | - Extra Humidity 1-7: 78 | - Current humidity extra sensor 1-7 79 | - Extra Temperature 1-7: 80 | - Current temperature extra sensor 1-7 81 | - Feels Like: 82 | - Current feels like temperature 83 | - Forecast Icon: 84 | - Current forecast icon number 85 | - Forecast Rule: 86 | - Current forecast rule 87 | - Heat Index: 88 | - Current heat index 89 | - Humidity: 90 | - Current outside relative humidify 91 | - Humidity High (Day): 92 | - Today's highest outside relative humididy 93 | - Humidity Low (Day): 94 | - Today's lowest outside relative humidity 95 | - Humidity (Inside): 96 | - Current inside relative humidity 97 | - Is Raining: 98 | - True if it's currently raining (based on rain rate) 99 | - Rain (Day): 100 | - Today's total precipitation 101 | - Rain (Month): 102 | - This months total precipitation 103 | - Rain (Year): 104 | - This year total precipitation 105 | - Rain Rate: 106 | - Current rain rate 107 | - Rain Rate (Day): 108 | - Today's highest rain rate 109 | - Rain Rate Time: 110 | - Time of today's highest rain rate (or Unknown if no rain) 111 | - Rain Storm: 112 | - Total rainfall during an extended period of rain 113 | - Rain Storm Start Date: 114 | - Start date of current rain storm. The rain period starts with a minimal of 2 ticks of the precipitation meter (0.4mm or 2/100") and ends after 24h of no rain. 115 | - Solar Radiation: 116 | - Current solar radiation 117 | - Solar Radiation (Day): 118 | - Today's highest solar radiation 119 | - Solar Radiation Time: 120 | - Time of today's highest solar radiation (or Unknown if dark day) 121 | - Sun Rise 122 | - Time of sun rise 123 | - Sun Set 124 | - Time of sun set 125 | - Temperature: 126 | - Current outside temperature 127 | - Temperature High (Day): 128 | - Today's highest outside temperature 129 | - Temperature High Time: 130 | - Time of today's highest outside temperature 131 | - Temperature Low (Day): 132 | - Today's lowest outside temperature 133 | - Temperature Low Time: 134 | - Time of today's lowest outside temperature 135 | - Temperature (Inside): 136 | - Current inside temperature 137 | - UV Level: 138 | - Current UV level 139 | - UV Level (Day): 140 | - Today's highest UV level 141 | - UV Level Time: 142 | - Time of today's highest UV level (or Unknown if dark day) 143 | - Wind Chill: 144 | - Current wind chill 145 | - Wind Direction: 146 | - Current wind direction in degrees [^4] [^5] 147 | - Wind Direction (Average): 148 | - Average/dominant wind direction in degrees, based on Archive Interval [^1] [^4] 149 | - Wind Direction Rose: 150 | - Current wind direction in cardinal directions (N, NE, E, etc.) [^4] 151 | - Wind Direction (Rose) (Average) 152 | - Average/dominant wind direction in cardinal directions (N, NE, E, etc.), based on Archive Interval [^1] [^4] 153 | - Wind Gust: 154 | - Current wind gust, based on the highest value within an Archive Interval [^1] 155 | - Wind Gust (Day): 156 | - Today's highest wind gust 157 | - Wind Gust Time: 158 | - Time of today's highest wind gust 159 | - Wind Speed: 160 | - Current wind speed 161 | - Wind Speed (10 min. Average): 162 | - 10 minutes average wind speed 163 | - Wind Speed (Average): 164 | - Average wind speed, based on Archive Interval [^4] 165 | - Wind Speed (Bft): 166 | - Wind Speed (Average) in Beaufort 167 | 168 | Diagnostic entities: 169 | - Archive Interval: 170 | - Archive data interval (usual around 10 minutes). [^2] 171 | - Battery Voltage: 172 | - Current battery voltage 173 | - Elevation: 174 | - Elevation read from the console 175 | - Latitude: 176 | - Latitude read from the console 177 | - Last Error Message: 178 | - Last error message, if no error then empty 179 | - Last Error Time: 180 | - Last error time 181 | - Last Fetch Time: 182 | - Last fetch time 183 | - Last Success Time: 184 | - Last success time 185 | - Longitude: 186 | - Longitude read from the console 187 | - Rain Collector: 188 | - Current rain collector setup (0.01", 0.2 mm or 0.1 mm) 189 | 190 | The entity information is updated every 30 seconds (default or other value if choosen during setup). 191 | 192 | ## Actions 193 | 194 | The following actions are available: 195 | 196 | - Davis Vantage: Set Davis Time 197 | - Set the time of the Davis weather station 198 | - Davis Vantage: Get Davis Time 199 | - Get the time of the Davis weather station 200 | - Davis Vantage: Get Raw Data 201 | - Get the raw, unprocessed data from the last fetch 202 | - Davis Vantage: Get Information 203 | - Get information about firmware and diagnostics 204 | - Davis Vantage: Set Yearly Rain 205 | - Change yearly rain in clicks (depending on setup one click = 0.01", 0.2 mm or 0.1 mm) 206 | - Davis Vantage: Set Archive Period 207 | - Change archive period in minutes (accepted values: 1, 5, 10, 15, 30, 60, 120). WARNING: This will erase all archived data within the console/envoy. 208 | - Davis Vantage: Set Rain Collector 209 | - Change rain collector (accepted values: 0.01", 0.2 mm or 0.1 mm) 210 | 211 | 212 | ## Known problems 213 | 214 | During first setup the communication to the weather station can be a bit tricky, resulting in an error saying the device didn't communicate. Please try again to set it up (can take up to 5 times). 215 | 216 | Due to the somewhat unstable hardware interface some communication runs result in an error like "Check ACK: BAD ('\n\r' != '')". This is normal behavior. 217 | 218 | ## Contributions 219 | * [Fred6278](https://github.com/Fred6278) → Provided the French translation file. 220 | 221 | [hacs-url]: https://github.com/hacs/integration 222 | [hacs-badge]: https://img.shields.io/badge/hacs-default-orange.svg?style=flat-square 223 | [release-badge]: https://img.shields.io/github/v/release/MarcoGos/davis_vantage?style=flat-square 224 | [downloads-badge]: https://img.shields.io/github/downloads/MarcoGos/davis_vantage/total?style=flat-square 225 | [release-url]: https://github.com/MarcoGos/davis_vantage/releases 226 | 227 | [^1]: If values show as "Unknown" make sure the Davis time is set correctly. You can check this by using action "Davis Vantage: Get Davis Time" and, if necessary, correct it by using action "Davis Vantage: Set Davis Time". 228 | 229 | [^2]: The Archive Interval value can be set by action "Davis Vantage: Set Archive Period" 230 | 231 | [^3]: Using WeatherLinkIP combined with sending information to weatherlink.com, may cause problems. It is recommended to disable sending information to weatherlink.com for best results. 232 | 233 | [^4]: The Wind Direction and Wind Direction (Rose) will be Unknown when the Wind Speed is 0.0. Also the Wind Direction (Average) and Wind Direction (Rose) (Average) will be Unknown when the Wind Speed (Average) is 0.0. As the standard prescribes. 234 | 235 | [^5]: As of version 1.5.0 the mean type of Wind Direction is changed. This means the existing long term statistics need to be removed from the database. Home Assistant will generate a repair warning for it. 236 | 237 | [commits-shield]: https://img.shields.io/github/commit-activity/y/MarcoGos/davis_vantage.svg?style=for-the-badge 238 | [commits]: https://github.com/MarcoGos/davis_vantage/commits/main 239 | [forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg?style=for-the-badge 240 | [forum]: https://community.home-assistant.io/ 241 | [maintenance-shield]: https://img.shields.io/badge/maintainer-%40MarcoGos-blue.svg?style=for-the-badge 242 | [releases-shield]: https://img.shields.io/github/release/MarcoGos/davis_vantage.svg?style=for-the-badge 243 | [releases]: https://github.com/MarcoGos/davis_vantage/releases 244 | [stats]: https://img.shields.io/badge/dynamic/json?color=41BDF5&logo=home-assistant&label=integration%20usage&suffix=%20installs&cacheSeconds=15600&url=https://analytics.home-assistant.io/custom_integrations.json&query=$.davis_vantage.total&style=for-the-badge 245 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/client.py: -------------------------------------------------------------------------------- 1 | """All client function""" 2 | 3 | from typing import Any 4 | from functools import cached_property 5 | from datetime import datetime, timedelta, time, date 6 | from zoneinfo import ZoneInfo 7 | import logging 8 | import asyncio 9 | import struct 10 | import re 11 | from pyvantagepro import VantagePro2 12 | from pyvantagepro.parser import HighLowParserRevB, LoopDataParserRevB, DataParser 13 | from pyvantagepro.utils import ListDict 14 | from homeassistant.core import HomeAssistant 15 | 16 | from .utils import ( 17 | calc_dew_point, 18 | calc_feels_like, 19 | calc_wind_chill, 20 | contains_correct_raw_data, 21 | calc_heat_index, 22 | convert_kmh_to_bft, 23 | convert_to_iso_datetime, 24 | convert_to_kmh, 25 | get_baro_trend, 26 | get_solar_rad, 27 | get_uv, 28 | get_wind_rose, 29 | ) 30 | from .const import ( 31 | RAIN_COLLECTOR_IMPERIAL, 32 | RAIN_COLLECTOR_METRIC, 33 | RAIN_COLLECTOR_METRIC_0_1, 34 | PROTOCOL_NETWORK, 35 | ) 36 | 37 | _LOGGER: logging.Logger = logging.getLogger(__package__) 38 | 39 | 40 | class DavisVantageClient: 41 | """Davis Vantage Client class""" 42 | 43 | _vantagepro2: VantagePro2 = None # type: ignore 44 | _latitude: float = 0.0 45 | _longitude: float = 0.0 46 | _elevation: int = 0 47 | _firmware_version: str | None = None 48 | _last_readout_duration: float = 0 49 | 50 | def __init__( 51 | self, hass: HomeAssistant, protocol: str, link: str, persistent_connection: bool 52 | ) -> None: 53 | self._hass = hass 54 | self._protocol = protocol 55 | self._link = link 56 | self._rain_collector = "" 57 | self._last_data: LoopDataParserRevB = {} # type: ignore 58 | self._last_raw_data: DataParser = {} # type: ignore 59 | self._last_raw_hilows: DataParser = {} # type: ignore 60 | self._persistent_connection = persistent_connection 61 | 62 | @property 63 | def latitude(self) -> float: 64 | return self._latitude 65 | 66 | @property 67 | def longitude(self) -> float: 68 | return self._longitude 69 | 70 | @property 71 | def elevation(self) -> int: 72 | return self._elevation 73 | 74 | @cached_property 75 | def firmware_version(self) -> str | None: 76 | return self._firmware_version 77 | 78 | def get_vantagepro2fromurl(self, url: str) -> VantagePro2 | None: 79 | try: 80 | vp = VantagePro2.from_url(url) 81 | if not self._persistent_connection: 82 | vp.link.close() 83 | return vp 84 | except Exception as e: 85 | raise e 86 | 87 | async def async_get_vantagepro2fromurl(self, url: str) -> VantagePro2 | None: 88 | _LOGGER.debug("async_get_vantagepro2fromurl with url=%s", url) 89 | vp = None 90 | try: 91 | loop = asyncio.get_event_loop() 92 | vp = await loop.run_in_executor(None, self.get_vantagepro2fromurl, url) 93 | except Exception as e: 94 | _LOGGER.error("Error on opening device from url: %s: %s", url, e) 95 | return vp 96 | 97 | async def connect_to_station(self): 98 | self._vantagepro2 = await self.async_get_vantagepro2fromurl(self.get_link()) # type: ignore 99 | 100 | async def get_station_info(self): 101 | static_info = await self.async_get_static_info() 102 | self._firmware_version = ( 103 | static_info.get("version", None) if static_info is not None else None 104 | ) 105 | latitude, longitude, elevation = ( 106 | await self.async_get_latitude_longitude_elevation() 107 | ) 108 | if latitude: 109 | self._latitude = latitude 110 | if longitude: 111 | self._longitude = longitude 112 | if elevation: 113 | self._elevation = elevation 114 | 115 | def get_current_data( 116 | self, 117 | ) -> tuple[LoopDataParserRevB | None, ListDict | None, HighLowParserRevB | None]: 118 | """Get current date from weather station.""" 119 | data = None 120 | archives = None 121 | hilows = None 122 | 123 | start_readout = datetime.now() 124 | 125 | if not self._vantagepro2: 126 | self.get_vantagepro2fromurl(self.get_link()) 127 | 128 | try: 129 | self._vantagepro2.link.open() 130 | _LOGGER.debug("Start get_current_data") 131 | data = self._vantagepro2.get_current_data() 132 | _LOGGER.debug("End get_current_data:") 133 | except Exception as e: 134 | if not self._persistent_connection: 135 | self._vantagepro2.link.close() 136 | raise e 137 | 138 | try: 139 | _LOGGER.debug("Start get_hilows") 140 | hilows = self._vantagepro2.get_hilows() 141 | _LOGGER.debug("End get_hilows") 142 | except Exception as e: 143 | _LOGGER.error("Couldn't get hilows: %s", e) 144 | 145 | try: 146 | end_datetime = datetime.now() 147 | start_datetime = end_datetime - timedelta( 148 | minutes=self._vantagepro2.archive_period * 2 # type: ignore 149 | ) 150 | _LOGGER.debug("Start get_archives") 151 | archives = self._vantagepro2.get_archives(start_datetime, end_datetime) # type: ignore 152 | _LOGGER.debug("End get_archives") 153 | except Exception as e: 154 | _LOGGER.error("Couldn't get archives: %s", e) 155 | 156 | try: 157 | _LOGGER.debug("Start get_rain_collector") 158 | self._rain_collector = self.get_rain_collector() 159 | _LOGGER.debug("End get_rain_collector") 160 | except Exception as e: 161 | _LOGGER.error("Couldn't get rain_collector: %s", e) 162 | finally: 163 | if not self._persistent_connection: 164 | self._vantagepro2.link.close() 165 | 166 | self._last_readout_duration = (datetime.now() - start_readout).total_seconds() 167 | 168 | return data, archives, hilows 169 | 170 | async def async_get_current_data(self) -> LoopDataParserRevB | None: 171 | """Get current date from weather station async.""" 172 | data = self._last_data 173 | try: 174 | loop = asyncio.get_event_loop() 175 | new_data, archives, hilows = await loop.run_in_executor( 176 | None, self.get_current_data 177 | ) 178 | if new_data: 179 | new_raw_data = self.__get_full_raw_data(new_data) 180 | self._last_raw_data = new_raw_data 181 | self.remove_all_incorrect_data(new_raw_data, new_data) 182 | self.add_additional_info(new_data) 183 | self.convert_values(new_data) 184 | if archives: 185 | self.add_archive_info(archives, new_data) 186 | if hilows: 187 | new_raw_hilows = self.__get_full_raw_data_hilows(hilows) 188 | self._last_raw_hilows = new_raw_hilows 189 | self.remove_all_incorrect_hilows(new_raw_hilows, hilows) 190 | self.add_hilows_info(hilows, new_data) 191 | data = new_data 192 | data["Datetime"] = self.get_iso_now() 193 | if contains_correct_raw_data(new_raw_data): 194 | data["LastError"] = "" 195 | data["LastSuccessTime"] = self.get_iso_now() 196 | else: 197 | data["LastError"] = "Received partly incorrect data" 198 | else: 199 | data["LastError"] = "Couldn't acquire data, no data received" 200 | data["LastReadoutDuration"] = self._last_readout_duration 201 | 202 | except Exception as e: 203 | _LOGGER.error("Couldn't acquire data from %s: %s", self.get_link(), e) 204 | data["LastError"] = f"Couldn't acquire data on {self.get_link()}: {e}" 205 | 206 | if data["LastError"]: 207 | data["LastErrorTime"] = self.get_iso_now() 208 | 209 | self._last_data = data 210 | return data 211 | 212 | def __get_full_raw_data(self, data: LoopDataParserRevB) -> DataParser: 213 | raw_data = DataParser(data.raw_bytes, LoopDataParserRevB.LOOP_FORMAT) # type: ignore 214 | raw_data["HumExtra"] = struct.unpack(b"7B", raw_data["HumExtra"]) # type: ignore 215 | raw_data["ExtraTemps"] = struct.unpack(b"7B", raw_data["ExtraTemps"]) # type: ignore 216 | raw_data["SoilMoist"] = struct.unpack(b"4B", raw_data["SoilMoist"]) # type: ignore 217 | raw_data["SoilTemps"] = struct.unpack(b"4B", raw_data["SoilTemps"]) # type: ignore 218 | raw_data["LeafWetness"] = struct.unpack(b"4B", raw_data["LeafWetness"]) # type: ignore 219 | raw_data["LeafTemps"] = struct.unpack(b"4B", raw_data["LeafTemps"]) # type: ignore 220 | raw_data.tuple_to_dict("ExtraTemps") 221 | raw_data.tuple_to_dict("LeafTemps") 222 | raw_data.tuple_to_dict("SoilTemps") 223 | raw_data.tuple_to_dict("HumExtra") 224 | raw_data.tuple_to_dict("LeafWetness") 225 | raw_data.tuple_to_dict("SoilMoist") 226 | return raw_data 227 | 228 | def __get_full_raw_data_hilows(self, data: HighLowParserRevB) -> DataParser: 229 | raw_data = DataParser(data.raw_bytes, HighLowParserRevB.HILOWS_FORMAT) # type: ignore 230 | return raw_data 231 | 232 | def get_davis_time(self) -> datetime | None: 233 | """Get time from weather station.""" 234 | data = None 235 | try: 236 | self._vantagepro2.link.open() 237 | data = self._vantagepro2.gettime() 238 | except Exception as e: 239 | raise e 240 | finally: 241 | if not self._persistent_connection: 242 | self._vantagepro2.link.close() 243 | return data 244 | 245 | async def async_get_davis_time(self) -> datetime | None: 246 | """Get time from weather station async.""" 247 | data = None 248 | try: 249 | loop = asyncio.get_event_loop() 250 | data = await loop.run_in_executor(None, self.get_davis_time) 251 | except Exception as e: 252 | _LOGGER.error("Couldn't get davis time: %s", e) 253 | return data 254 | 255 | def set_davis_time(self, dtime: datetime) -> None: 256 | """Set time of weather station.""" 257 | try: 258 | self._vantagepro2.link.open() 259 | self._vantagepro2.settime(dtime) 260 | except Exception as e: 261 | raise e 262 | finally: 263 | if not self._persistent_connection: 264 | self._vantagepro2.link.close() 265 | 266 | async def async_set_davis_time(self) -> None: 267 | """Set time of weather station async.""" 268 | try: 269 | loop = asyncio.get_event_loop() 270 | await loop.run_in_executor(None, self.set_davis_time, datetime.now()) 271 | except Exception as e: 272 | _LOGGER.error("Couldn't set davis time: %s", e) 273 | 274 | def get_info(self) -> dict[str, Any] | None: 275 | try: 276 | self._vantagepro2.link.open() 277 | firmware_version = self._vantagepro2.firmware_version # type: ignore 278 | firmware_date = self._vantagepro2.firmware_date # type: ignore 279 | diagnostics = self._vantagepro2.diagnostics # type: ignore 280 | except Exception as e: 281 | raise e 282 | finally: 283 | if not self._persistent_connection: 284 | self._vantagepro2.link.close() 285 | return { 286 | "version": firmware_version, 287 | "date": firmware_date, 288 | "diagnostics": diagnostics, 289 | } 290 | 291 | async def async_get_info(self) -> dict[str, Any] | None: 292 | info = None 293 | try: 294 | loop = asyncio.get_event_loop() 295 | info = await loop.run_in_executor(None, self.get_info) 296 | except Exception as e: 297 | _LOGGER.error("Couldn't get firmware info: %s", e) 298 | return info 299 | 300 | def get_static_info(self) -> dict[str, Any] | None: 301 | try: 302 | self._vantagepro2.link.open() 303 | firmware_version = self._vantagepro2.firmware_version # type: ignore 304 | archive_period = self._vantagepro2.archive_period # type: ignore 305 | except Exception as e: 306 | raise e 307 | finally: 308 | if not self._persistent_connection: 309 | self._vantagepro2.link.close() 310 | return {"version": firmware_version, "archive_period": archive_period} 311 | 312 | async def async_get_static_info(self) -> dict[str, Any] | None: 313 | info = None 314 | try: 315 | loop = asyncio.get_event_loop() 316 | info = await loop.run_in_executor(None, self.get_static_info) 317 | except Exception as e: 318 | _LOGGER.error("Couldn't get static info: %s", e) 319 | return info 320 | 321 | def set_yearly_rain(self, rain_clicks: int) -> None: 322 | """Set yearly rain of weather station.""" 323 | try: 324 | self._vantagepro2.link.open() 325 | self._vantagepro2.set_yearly_rain(rain_clicks) 326 | except Exception as e: 327 | raise e 328 | finally: 329 | if not self._persistent_connection: 330 | self._vantagepro2.link.close() 331 | 332 | async def async_set_yearly_rain(self, rain_clicks: int) -> None: 333 | """Set yearly rain of weather station async.""" 334 | try: 335 | loop = asyncio.get_event_loop() 336 | await loop.run_in_executor(None, self.set_yearly_rain, rain_clicks) 337 | except Exception as e: 338 | _LOGGER.error("Couldn't set yearly rain: %s", e) 339 | 340 | def set_archive_period(self, archive_period: int) -> None: 341 | """Set archive periode, this will erase all archive data""" 342 | try: 343 | self._vantagepro2.link.open() 344 | self._vantagepro2.set_archive_period(archive_period) 345 | except Exception as e: 346 | raise e 347 | finally: 348 | if not self._persistent_connection: 349 | self._vantagepro2.link.close() 350 | 351 | async def async_set_archive_period(self, archive_period: int) -> None: 352 | try: 353 | loop = asyncio.get_event_loop() 354 | await loop.run_in_executor(None, self.set_archive_period, archive_period) 355 | except Exception as e: 356 | _LOGGER.error("Couldn't set archive period: %s", e) 357 | 358 | def add_additional_info(self, data: dict[str, Any]) -> None: 359 | if data["TempOut"] is not None: 360 | if data["HumOut"] is not None: 361 | data["HeatIndex"] = calc_heat_index(data["TempOut"], data["HumOut"]) 362 | data["DewPoint"] = calc_dew_point(data["TempOut"], data["HumOut"]) 363 | if data["WindSpeed"] is not None: 364 | data["WindChill"] = calc_wind_chill(data["TempOut"], data["WindSpeed"]) 365 | if data["HumOut"] is not None: 366 | data["FeelsLike"] = calc_feels_like( 367 | data["TempOut"], data["HumOut"], data["WindSpeed"] 368 | ) 369 | if data["WindSpeed"] == 0: 370 | data["WindDir"] = None 371 | if data["WindDir"] is not None: 372 | data["WindDirRose"] = get_wind_rose(data["WindDir"]) 373 | if data["RainRate"] is not None: 374 | data["IsRaining"] = data["RainRate"] > 0 375 | data["ArchiveInterval"] = self._vantagepro2.archive_period 376 | 377 | data["Latitude"] = self.latitude 378 | data["Longitude"] = self.longitude 379 | data["Elevation"] = self.elevation 380 | 381 | def convert_values(self, data: dict[str, Any]) -> None: 382 | del data["Datetime"] 383 | if data["BarTrend"] is not None: 384 | data["BarTrend"] = get_baro_trend(data["BarTrend"]) 385 | if data["UV"] is not None: 386 | data["UV"] = get_uv(data["UV"]) 387 | if data["SolarRad"] is not None: 388 | data["SolarRad"] = get_solar_rad(data["SolarRad"]) 389 | data["RainCollector"] = self._rain_collector 390 | data["StormStartDate"] = self.strtodate(data["StormStartDate"]) 391 | data["SunRise"] = self.strtotime(data["SunRise"]) 392 | data["SunSet"] = self.strtotime(data["SunSet"]) 393 | self.correct_rain_values(data) 394 | 395 | def correct_rain_values(self, data: dict[str, Any]): 396 | rain_collector_factor: dict[str, float] = { 397 | RAIN_COLLECTOR_IMPERIAL: 1.0, 398 | RAIN_COLLECTOR_METRIC: 2 / 2.54, 399 | RAIN_COLLECTOR_METRIC_0_1: 1 / 2.54, 400 | } 401 | factor = rain_collector_factor.get(data["RainCollector"], 1.0) 402 | for key in [ 403 | "RainDay", 404 | "RainMonth", 405 | "RainYear", 406 | "RainRate", 407 | "RainStorm", 408 | "RainRateDay", 409 | ]: 410 | if key in data: 411 | if data[key] is not None: 412 | data[key] *= factor 413 | 414 | def remove_all_incorrect_data(self, raw_data: DataParser, data: LoopDataParserRevB): 415 | data_info = {key: value for key, value in LoopDataParserRevB.LOOP_FORMAT} 416 | self.remove_incorrect_data(raw_data, data_info, data) 417 | 418 | def remove_all_incorrect_hilows( 419 | self, raw_data: DataParser, data: HighLowParserRevB 420 | ): 421 | data_info = {key: value for key, value in HighLowParserRevB.HILOWS_FORMAT} 422 | self.remove_incorrect_data(raw_data, data_info, data) 423 | 424 | def remove_incorrect_data( 425 | self, raw_data: DataParser, data_info: dict[str, str], data: dict[str, Any] 426 | ): 427 | for key in data.keys(): # type: ignore 428 | info_key = re.sub(r"\d+$", "", key) # type: ignore 429 | data_type = data_info.get(info_key, "") 430 | raw_value = raw_data.get(info_key, 0) # type: ignore 431 | if self.is_incorrect_value(raw_value, data_type): # type: ignore 432 | data[key] = None # type: ignore 433 | 434 | def is_incorrect_value(self, raw_value: int, data_type: str) -> bool: 435 | if ( 436 | ((data_type in ["B", "7s"]) and (raw_value == 255)) 437 | or ((data_type == "H") and (raw_value in [32767, 65535])) 438 | or ((data_type == "h") and (raw_value in [32767, -32768])) 439 | ): 440 | return True 441 | else: 442 | return False 443 | 444 | def add_archive_info(self, archives: ListDict | None, data: dict[str, Any]): 445 | if not archives: 446 | return 447 | latest_archive = archives[-1] 448 | data["WindGust"] = latest_archive["WindHi"] 449 | data["WindSpeedAvg"] = latest_archive["WindAvg"] 450 | if data["WindSpeedAvg"] > 0: 451 | if latest_archive["WindAvgDir"] < 255: 452 | data["WindAvgDir"] = latest_archive["WindAvgDir"] * 22.5 453 | data["WindAvgDirRose"] = get_wind_rose(data["WindAvgDir"]) 454 | if data["WindSpeedAvg"] is not None: 455 | data["WindSpeedBft"] = convert_kmh_to_bft( 456 | convert_to_kmh(data["WindSpeedAvg"]) 457 | ) 458 | 459 | def add_hilows_info(self, hilows: HighLowParserRevB | None, data: dict[str, Any]): 460 | if not hilows: 461 | return 462 | data["TempOutHiDay"] = hilows["TempHiDay"] 463 | data["TempOutHiTime"] = self.strtotime(hilows["TempHiTime"]) # type: ignore 464 | data["TempOutLowDay"] = hilows["TempLoDay"] 465 | data["TempOutLowTime"] = self.strtotime(hilows["TempLoTime"]) # type: ignore 466 | 467 | data["DewPointHiDay"] = hilows["DewHiDay"] 468 | data["DewPointHiTime"] = self.strtotime(hilows["DewHiTime"]) # type: ignore 469 | data["DewPointLowDay"] = hilows["DewLoDay"] 470 | data["DewPointLowTime"] = self.strtotime(hilows["DewLoTime"]) # type: ignore 471 | 472 | data["RainRateDay"] = hilows["RainHiDay"] 473 | data["RainRateTime"] = self.strtotime(hilows["RainHiTime"]) # type: ignore 474 | 475 | data["BarometerHiDay"] = hilows["BaroHiDay"] 476 | data["BarometerHiTime"] = self.strtotime(hilows["BaroHiTime"]) # type: ignore 477 | data["BarometerLowDay"] = hilows["BaroLoDay"] 478 | data["BarometerLoTime"] = self.strtotime(hilows["BaroLoTime"]) # type: ignore 479 | 480 | data["SolarRadDay"] = hilows["SolarHiDay"] 481 | data["SolarRadTime"] = self.strtotime(hilows["SolarHiTime"]) # type: ignore 482 | 483 | data["UVDay"] = hilows["UVHiDay"] 484 | data["UVTime"] = self.strtotime(hilows["UVHiTime"]) # type: ignore 485 | 486 | data["WindGustDay"] = hilows["WindHiDay"] 487 | data["WindGustTime"] = self.strtotime(hilows["WindHiTime"]) # type: ignore 488 | 489 | def get_link(self) -> str: 490 | """Get device link for use with vproweather.""" 491 | if self._protocol == PROTOCOL_NETWORK: 492 | return f"tcp:{self._link}" 493 | return f"serial:{self._link}:19200:8N1" 494 | 495 | def get_raw_data(self) -> DataParser: 496 | return self._last_raw_data 497 | 498 | def get_raw_hilows(self) -> DataParser: 499 | return self._last_raw_hilows 500 | 501 | def strtotime(self, time_str: str | None) -> time | None: 502 | if time_str is None: 503 | return None 504 | else: 505 | return datetime.strptime(time_str, "%H:%M").time() 506 | 507 | def strtodate(self, date_str: str | None) -> date | None: 508 | if date_str is None: 509 | return None 510 | else: 511 | return datetime.strptime(date_str, "%Y-%m-%d").date() 512 | 513 | def clear_cached_property(self, property_name: str): 514 | del self._vantagepro2.__dict__[property_name] 515 | 516 | def get_rain_collector(self) -> str: 517 | rain_collector_map = { 518 | 0x00: RAIN_COLLECTOR_IMPERIAL, 519 | 0x10: RAIN_COLLECTOR_METRIC, 520 | 0x20: RAIN_COLLECTOR_METRIC_0_1, 521 | } 522 | self._vantagepro2.wake_up() 523 | rain_collector = self._vantagepro2.get_rain_collector() # type: ignore 524 | return rain_collector_map.get(rain_collector, "") # type: ignore 525 | 526 | async def async_get_rain_collector(self) -> str: 527 | info = "" 528 | try: 529 | loop = asyncio.get_event_loop() 530 | info = await loop.run_in_executor(None, self.get_rain_collector) 531 | except Exception as e: 532 | _LOGGER.error("Couldn't get rain collector: %s", e) 533 | return info 534 | 535 | def set_rain_collector(self, rain_collector: str): 536 | rain_collector_map = { 537 | RAIN_COLLECTOR_IMPERIAL: 0x00, 538 | RAIN_COLLECTOR_METRIC: 0x10, 539 | RAIN_COLLECTOR_METRIC_0_1: 0x20, 540 | } 541 | self._vantagepro2.set_rain_collector( 542 | rain_collector_map.get(rain_collector, 0x00) 543 | ) 544 | 545 | async def async_set_rain_collector(self, rain_collector: str): 546 | try: 547 | loop = asyncio.get_event_loop() 548 | await loop.run_in_executor(None, self.set_rain_collector, rain_collector) 549 | except Exception as e: 550 | _LOGGER.error("Couldn't set rain collector: %s", e) 551 | 552 | def get_latitude_longitude_elevation(self) -> tuple[float, float, int]: 553 | latitude = longitude = None 554 | data = self._vantagepro2.read_from_eeprom("0B", 6) # type: ignore 555 | latitude, longitude, elevation = struct.unpack(b"hhh", data) # type: ignore 556 | latitude /= 10 557 | longitude /= 10 558 | return latitude, longitude, elevation 559 | 560 | async def async_get_latitude_longitude_elevation(self): 561 | latitude = longitude = elevation = None 562 | try: 563 | loop = asyncio.get_event_loop() 564 | latitude, longitude, elevation = await loop.run_in_executor( 565 | None, self.get_latitude_longitude_elevation 566 | ) 567 | except Exception as e: 568 | _LOGGER.error("Couldn't get latitude longitude: %s", e) 569 | return latitude, longitude, elevation 570 | 571 | def get_iso_now(self) -> datetime: 572 | now = convert_to_iso_datetime( 573 | datetime.now(), ZoneInfo(self._hass.config.time_zone) 574 | ) 575 | return now 576 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/sensor.py: -------------------------------------------------------------------------------- 1 | """Sensor setup for our Integration.""" 2 | 3 | import logging 4 | from dataclasses import dataclass 5 | 6 | from homeassistant.components.sensor import ( 7 | SensorEntity, 8 | SensorEntityDescription 9 | ) 10 | from homeassistant.components.sensor.const import ( 11 | DOMAIN as SENSOR_DOMAIN, 12 | SensorDeviceClass, 13 | SensorStateClass 14 | ) 15 | 16 | from homeassistant.const import ( 17 | PERCENTAGE, 18 | DEGREE, 19 | UnitOfSpeed, 20 | UnitOfLength, 21 | UnitOfVolumetricFlux, 22 | UnitOfElectricPotential, 23 | UnitOfTemperature, 24 | UnitOfPressure, 25 | UnitOfIrradiance, 26 | UnitOfTime, 27 | EntityCategory 28 | ) 29 | from homeassistant.helpers.entity_platform import AddEntitiesCallback 30 | from homeassistant.helpers.typing import StateType 31 | from homeassistant.helpers.update_coordinator import CoordinatorEntity 32 | 33 | from . import DavisConfigEntry 34 | from .const import ( 35 | DEFAULT_NAME, 36 | RAIN_COLLECTOR_IMPERIAL, 37 | RAIN_COLLECTOR_METRIC, 38 | RAIN_COLLECTOR_METRIC_0_1, 39 | CONFIG_STATION_MODEL, 40 | MODEL_VANTAGE_PRO2PLUS, 41 | ) 42 | from .coordinator import DavisVantageDataUpdateCoordinator 43 | 44 | _LOGGER: logging.Logger = logging.getLogger(__package__) 45 | 46 | @dataclass(kw_only=True, frozen=True) 47 | class DavisSensorEntityDescription(SensorEntityDescription): 48 | """Describes Davis sensor entity.""" 49 | entity_name: str | None = None 50 | 51 | 52 | def get_sensor_descriptions(model: str) -> list[DavisSensorEntityDescription]: 53 | """Return the sensor descriptions for the specified model.""" 54 | return [ 55 | DavisSensorEntityDescription( 56 | key="Datetime", 57 | translation_key="last_fetch_time", 58 | entity_name="Last Fetch Time", 59 | icon="mdi:clock-outline", 60 | device_class=SensorDeviceClass.TIMESTAMP, 61 | entity_category=EntityCategory.DIAGNOSTIC, 62 | ), 63 | DavisSensorEntityDescription( 64 | key="LastSuccessTime", 65 | translation_key="last_success_time", 66 | entity_name="Last Success Time", 67 | icon="mdi:clock-outline", 68 | device_class=SensorDeviceClass.TIMESTAMP, 69 | entity_category=EntityCategory.DIAGNOSTIC, 70 | ), 71 | DavisSensorEntityDescription( 72 | key="LastErrorTime", 73 | translation_key="last_error_time", 74 | entity_name="Last Error Time", 75 | icon="mdi:clock-outline", 76 | device_class=SensorDeviceClass.TIMESTAMP, 77 | entity_category=EntityCategory.DIAGNOSTIC, 78 | entity_registry_enabled_default=False, 79 | ), 80 | DavisSensorEntityDescription( 81 | key="LastError", 82 | translation_key="last_error_message", 83 | entity_name="Last Error Message", 84 | icon="mdi:message-alert-outline", 85 | entity_category=EntityCategory.DIAGNOSTIC, 86 | ), 87 | DavisSensorEntityDescription( 88 | key="ArchiveInterval", 89 | translation_key="archive_interval", 90 | entity_name="Archive Interval", 91 | icon="mdi:archive-clock-outline", 92 | entity_category=EntityCategory.DIAGNOSTIC, 93 | native_unit_of_measurement=UnitOfTime.MINUTES, 94 | ), 95 | DavisSensorEntityDescription( 96 | key="TempOut", 97 | translation_key="temperature", 98 | entity_name="Temperature", 99 | device_class=SensorDeviceClass.TEMPERATURE, 100 | state_class=SensorStateClass.MEASUREMENT, 101 | native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, 102 | suggested_display_precision=1, 103 | ), 104 | DavisSensorEntityDescription( 105 | key="TempOutHiDay", 106 | translation_key="temperature_high_day", 107 | entity_name="Temperature High (Day)", 108 | device_class=SensorDeviceClass.TEMPERATURE, 109 | state_class=SensorStateClass.MEASUREMENT, 110 | native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, 111 | suggested_display_precision=1, 112 | icon="mdi:thermometer-chevron-up", 113 | ), 114 | DavisSensorEntityDescription( 115 | key="TempOutHiTime", 116 | translation_key="temperature_high_time", 117 | entity_name="Temperature High Time", 118 | icon="mdi:clock-in", 119 | ), 120 | DavisSensorEntityDescription( 121 | key="TempOutLowDay", 122 | translation_key="temperature_low_day", 123 | entity_name="Temperature Low (Day)", 124 | device_class=SensorDeviceClass.TEMPERATURE, 125 | state_class=SensorStateClass.MEASUREMENT, 126 | native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, 127 | suggested_display_precision=1, 128 | icon="mdi:thermometer-chevron-down", 129 | ), 130 | DavisSensorEntityDescription( 131 | key="TempOutLowTime", 132 | translation_key="temperature_low_time", 133 | entity_name="Temperature Low Time", 134 | icon="mdi:clock-in", 135 | ), 136 | DavisSensorEntityDescription( 137 | key="TempIn", 138 | translation_key="temperature_inside", 139 | entity_name="Temperature (Inside)", 140 | device_class=SensorDeviceClass.TEMPERATURE, 141 | native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, 142 | suggested_display_precision=1, 143 | entity_registry_enabled_default=False, 144 | ), 145 | DavisSensorEntityDescription( 146 | key="HeatIndex", 147 | translation_key="heat_index", 148 | entity_name="Heat Index", 149 | icon="mdi:sun-thermometer-outline", 150 | device_class=SensorDeviceClass.TEMPERATURE, 151 | state_class=SensorStateClass.MEASUREMENT, 152 | native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, 153 | suggested_display_precision=1, 154 | ), 155 | DavisSensorEntityDescription( 156 | key="WindChill", 157 | translation_key="wind_chill", 158 | entity_name="Wind Chill", 159 | icon="mdi:snowflake-thermometer", 160 | device_class=SensorDeviceClass.TEMPERATURE, 161 | state_class=SensorStateClass.MEASUREMENT, 162 | native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, 163 | suggested_display_precision=1, 164 | ), 165 | DavisSensorEntityDescription( 166 | key="FeelsLike", 167 | translation_key="feels_like", 168 | entity_name="Feels Like", 169 | icon="mdi:download-circle-outline", 170 | device_class=SensorDeviceClass.TEMPERATURE, 171 | state_class=SensorStateClass.MEASUREMENT, 172 | native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, 173 | suggested_display_precision=1, 174 | ), 175 | DavisSensorEntityDescription( 176 | key="DewPoint", 177 | translation_key="dew_point", 178 | entity_name="Dew Point", 179 | icon="mdi:water-thermometer-outline", 180 | device_class=SensorDeviceClass.TEMPERATURE, 181 | state_class=SensorStateClass.MEASUREMENT, 182 | native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, 183 | suggested_display_precision=1, 184 | ), 185 | DavisSensorEntityDescription( 186 | key="DewPointHiDay", 187 | translation_key="dew_point_high_day", 188 | entity_name="Dew Point High (Day)", 189 | icon="mdi:water-thermometer-outline", 190 | device_class=SensorDeviceClass.TEMPERATURE, 191 | state_class=SensorStateClass.MEASUREMENT, 192 | native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, 193 | suggested_display_precision=1, 194 | ), 195 | DavisSensorEntityDescription( 196 | key="DewPointHiTime", 197 | translation_key="dew_point_high_time", 198 | entity_name="Dew Point High Time", 199 | icon="mdi:clock-in", 200 | ), 201 | DavisSensorEntityDescription( 202 | key="DewPointLowDay", 203 | translation_key="dew_point_low_day", 204 | entity_name="Dew Point Low (Day)", 205 | icon="mdi:water-thermometer-outline", 206 | device_class=SensorDeviceClass.TEMPERATURE, 207 | state_class=SensorStateClass.MEASUREMENT, 208 | native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, 209 | suggested_display_precision=1, 210 | ), 211 | DavisSensorEntityDescription( 212 | key="DewPointLowTime", 213 | translation_key="dew_point_low_time", 214 | entity_name="Dew Point Low Time", 215 | icon="mdi:clock-in", 216 | ), 217 | DavisSensorEntityDescription( 218 | key="Barometer", 219 | translation_key="barometric_pressure", 220 | entity_name="Barometric Pressure", 221 | device_class=SensorDeviceClass.PRESSURE, 222 | state_class=SensorStateClass.MEASUREMENT, 223 | native_unit_of_measurement=UnitOfPressure.INHG, 224 | suggested_display_precision=2, 225 | ), 226 | DavisSensorEntityDescription( 227 | key="BarometerHiDay", 228 | translation_key="barometric_pressure_high_day", 229 | entity_name="Barometric Pressure High (Day)", 230 | device_class=SensorDeviceClass.PRESSURE, 231 | state_class=SensorStateClass.MEASUREMENT, 232 | native_unit_of_measurement=UnitOfPressure.INHG, 233 | suggested_display_precision=2, 234 | ), 235 | DavisSensorEntityDescription( 236 | key="BarometerHiTime", 237 | translation_key="barometric_pressure_high_time", 238 | entity_name="Barometric Pressure High Time", 239 | icon="mdi:clock-in", 240 | ), 241 | DavisSensorEntityDescription( 242 | key="BarometerLowDay", 243 | translation_key="barometric_pressure_low_day", 244 | entity_name="Barometric Pressure Low (Day)", 245 | device_class=SensorDeviceClass.PRESSURE, 246 | state_class=SensorStateClass.MEASUREMENT, 247 | native_unit_of_measurement=UnitOfPressure.INHG, 248 | suggested_display_precision=2, 249 | ), 250 | DavisSensorEntityDescription( 251 | key="BarometerLoTime", 252 | translation_key="barometric_pressure_low_time", 253 | entity_name="Barometric Pressure Low Time", 254 | icon="mdi:clock-in", 255 | ), 256 | DavisSensorEntityDescription( 257 | key="BarTrend", 258 | translation_key="barometric_trend", 259 | entity_name="Barometric Trend", 260 | device_class=SensorDeviceClass.ENUM, 261 | options=[ 262 | "falling_rapidly", 263 | "falling_slowly", 264 | "steady", 265 | "rising_slowly", 266 | "rising_rapidly" 267 | ], 268 | ), 269 | DavisSensorEntityDescription( 270 | key="HumIn", 271 | translation_key="humidity_inside", 272 | entity_name="Humidity (Inside)", 273 | device_class=SensorDeviceClass.HUMIDITY, 274 | native_unit_of_measurement=PERCENTAGE, 275 | suggested_display_precision=0, 276 | entity_registry_enabled_default=False, 277 | ), 278 | DavisSensorEntityDescription( 279 | key="HumOut", 280 | translation_key="humidity", 281 | entity_name="Humidity", 282 | device_class=SensorDeviceClass.HUMIDITY, 283 | state_class=SensorStateClass.MEASUREMENT, 284 | native_unit_of_measurement=PERCENTAGE, 285 | suggested_display_precision=0, 286 | ), 287 | DavisSensorEntityDescription( 288 | key="WindSpeed", 289 | translation_key="wind_speed", 290 | entity_name="Wind Speed", 291 | icon="mdi:weather-windy", 292 | device_class=SensorDeviceClass.WIND_SPEED, 293 | state_class=SensorStateClass.MEASUREMENT, 294 | native_unit_of_measurement=UnitOfSpeed.MILES_PER_HOUR, 295 | suggested_display_precision=1, 296 | ), 297 | DavisSensorEntityDescription( 298 | key="WindSpeed10Min", 299 | translation_key="wind_speed_average_10min", 300 | entity_name="Wind Speed (Average)", 301 | icon="mdi:weather-windy", 302 | device_class=SensorDeviceClass.WIND_SPEED, 303 | state_class=SensorStateClass.MEASUREMENT, 304 | native_unit_of_measurement=UnitOfSpeed.MILES_PER_HOUR, 305 | suggested_display_precision=1, 306 | ), 307 | DavisSensorEntityDescription( 308 | key="WindSpeedAvg", 309 | translation_key="wind_speed_average", 310 | entity_name="Wind Speed (Average) (AI)", 311 | icon="mdi:weather-windy", 312 | device_class=SensorDeviceClass.WIND_SPEED, 313 | state_class=SensorStateClass.MEASUREMENT, 314 | native_unit_of_measurement=UnitOfSpeed.MILES_PER_HOUR, 315 | suggested_display_precision=1, 316 | ), 317 | DavisSensorEntityDescription( 318 | key="WindGust", 319 | translation_key="wind_gust", 320 | entity_name="Wind Gust", 321 | icon="mdi:windsock", 322 | device_class=SensorDeviceClass.WIND_SPEED, 323 | state_class=SensorStateClass.MEASUREMENT, 324 | native_unit_of_measurement=UnitOfSpeed.MILES_PER_HOUR, 325 | suggested_display_precision=1, 326 | ), 327 | DavisSensorEntityDescription( 328 | key="WindGustDay", 329 | translation_key="wind_gust_day", 330 | entity_name="Wind Gust (Day)", 331 | icon="mdi:windsock", 332 | device_class=SensorDeviceClass.WIND_SPEED, 333 | state_class=SensorStateClass.MEASUREMENT, 334 | native_unit_of_measurement=UnitOfSpeed.MILES_PER_HOUR, 335 | suggested_display_precision=1, 336 | ), 337 | DavisSensorEntityDescription( 338 | key="WindGustTime", 339 | translation_key="wind_gust_time", 340 | entity_name="Wind Gust Time", 341 | icon="mdi:clock-in", 342 | ), 343 | DavisSensorEntityDescription( 344 | key="WindDir", 345 | translation_key="wind_direction", 346 | entity_name="Wind Direction", 347 | icon="mdi:compass-outline", 348 | device_class=SensorDeviceClass.WIND_DIRECTION, 349 | state_class=SensorStateClass.MEASUREMENT_ANGLE, 350 | native_unit_of_measurement=DEGREE, 351 | suggested_display_precision=0, 352 | ), 353 | DavisSensorEntityDescription( 354 | key="WindAvgDir", 355 | translation_key="wind_direction_average", 356 | entity_name="Wind Direction (Average)", 357 | icon="mdi:compass-outline", 358 | device_class=SensorDeviceClass.WIND_DIRECTION, 359 | state_class=SensorStateClass.MEASUREMENT_ANGLE, 360 | native_unit_of_measurement=DEGREE, 361 | suggested_display_precision=0, 362 | ), 363 | DavisSensorEntityDescription( 364 | key="WindDirRose", 365 | translation_key="wind_direction_rose", 366 | entity_name="Wind Direction Rose", 367 | device_class=SensorDeviceClass.ENUM, 368 | options=[ 369 | "n", 370 | "ne", 371 | "e", 372 | "se", 373 | "s", 374 | "sw", 375 | "w", 376 | "nw" 377 | ], 378 | ), 379 | DavisSensorEntityDescription( 380 | key="WindAvgDirRose", 381 | translation_key="wind_direction_rose_average", 382 | entity_name="Wind Direction Rose (Average)", 383 | device_class=SensorDeviceClass.ENUM, 384 | options=[ 385 | "n", 386 | "ne", 387 | "e", 388 | "se", 389 | "s", 390 | "sw", 391 | "w", 392 | "nw" 393 | ], 394 | ), 395 | DavisSensorEntityDescription( 396 | key="WindSpeedBft", 397 | translation_key="wind_speed_bft", 398 | entity_name="Wind Speed (Bft)", 399 | icon="mdi:weather-windy", 400 | device_class=SensorDeviceClass.ENUM, 401 | ), 402 | DavisSensorEntityDescription( 403 | key="RainDay", 404 | translation_key="rain_day", 405 | entity_name="Rain (Day)", 406 | icon="mdi:water-outline", 407 | device_class=SensorDeviceClass.PRECIPITATION, 408 | state_class=SensorStateClass.MEASUREMENT, 409 | native_unit_of_measurement=UnitOfLength.INCHES, 410 | suggested_display_precision=2, 411 | ), 412 | DavisSensorEntityDescription( 413 | key="RainMonth", 414 | translation_key="rain_month", 415 | entity_name="Rain (Month)", 416 | icon="mdi:water-outline", 417 | state_class=SensorStateClass.MEASUREMENT, 418 | device_class=SensorDeviceClass.PRECIPITATION, 419 | native_unit_of_measurement=UnitOfLength.INCHES, 420 | suggested_display_precision=2, 421 | ), 422 | DavisSensorEntityDescription( 423 | key="RainYear", 424 | translation_key="rain_year", 425 | entity_name="Rain (Year)", 426 | icon="mdi:water-outline", 427 | state_class=SensorStateClass.MEASUREMENT, 428 | device_class=SensorDeviceClass.PRECIPITATION, 429 | native_unit_of_measurement=UnitOfLength.INCHES, 430 | suggested_display_precision=2, 431 | ), 432 | DavisSensorEntityDescription( 433 | key="RainRate", 434 | translation_key="rain_rate", 435 | entity_name="Rain Rate", 436 | icon="mdi:water-outline", 437 | device_class=SensorDeviceClass.PRECIPITATION_INTENSITY, 438 | state_class=SensorStateClass.MEASUREMENT, 439 | native_unit_of_measurement=UnitOfVolumetricFlux.INCHES_PER_HOUR, 440 | suggested_display_precision=2, 441 | ), 442 | DavisSensorEntityDescription( 443 | key="RainRateDay", 444 | translation_key="rain_rate_day", 445 | entity_name="Rain Rate (Day)", 446 | icon="mdi:water-outline", 447 | device_class=SensorDeviceClass.PRECIPITATION_INTENSITY, 448 | state_class=SensorStateClass.MEASUREMENT, 449 | native_unit_of_measurement=UnitOfVolumetricFlux.INCHES_PER_HOUR, 450 | suggested_display_precision=2, 451 | ), 452 | DavisSensorEntityDescription( 453 | key="RainRateTime", 454 | translation_key="rain_rate_time", 455 | entity_name="Rain Rate Time", 456 | icon="mdi:clock-in", 457 | ), 458 | DavisSensorEntityDescription( 459 | key="UV", 460 | translation_key="uv_level", 461 | entity_name="UV Level", 462 | icon="mdi:sun-wireless-outline", 463 | state_class=SensorStateClass.MEASUREMENT, 464 | entity_registry_enabled_default=model==MODEL_VANTAGE_PRO2PLUS, 465 | ), 466 | DavisSensorEntityDescription( 467 | key="UVDay", 468 | translation_key="uv_level_day", 469 | entity_name="UV Level (Day)", 470 | icon="mdi:sun-wireless-outline", 471 | state_class=SensorStateClass.MEASUREMENT, 472 | entity_registry_enabled_default=model==MODEL_VANTAGE_PRO2PLUS, 473 | ), 474 | DavisSensorEntityDescription( 475 | key="UVTime", 476 | translation_key="uv_level_time", 477 | entity_name="UV Level Time", 478 | icon="mdi:clock-in", 479 | entity_registry_enabled_default=model==MODEL_VANTAGE_PRO2PLUS, 480 | ), 481 | DavisSensorEntityDescription( 482 | key="SolarRad", 483 | translation_key="solar_radiation", 484 | entity_name="Solar Radiation", 485 | icon="mdi:sun-wireless-outline", 486 | state_class=SensorStateClass.MEASUREMENT, 487 | entity_registry_enabled_default=model==MODEL_VANTAGE_PRO2PLUS, 488 | native_unit_of_measurement=UnitOfIrradiance.WATTS_PER_SQUARE_METER, 489 | ), 490 | DavisSensorEntityDescription( 491 | key="SolarRadDay", 492 | translation_key="solar_radiation_day", 493 | entity_name="Solar Radiation (Day)", 494 | icon="mdi:sun-wireless-outline", 495 | state_class=SensorStateClass.MEASUREMENT, 496 | entity_registry_enabled_default=model==MODEL_VANTAGE_PRO2PLUS, 497 | native_unit_of_measurement=UnitOfIrradiance.WATTS_PER_SQUARE_METER, 498 | ), 499 | DavisSensorEntityDescription( 500 | key="SolarRadTime", 501 | translation_key="solar_radiation_time", 502 | entity_name="Solar Radiation Time", 503 | icon="mdi:clock-in", 504 | entity_registry_enabled_default=model==MODEL_VANTAGE_PRO2PLUS, 505 | ), 506 | DavisSensorEntityDescription( 507 | key="BatteryVolts", 508 | translation_key="battery_voltage", 509 | entity_name="Battery Voltage", 510 | device_class=SensorDeviceClass.VOLTAGE, 511 | native_unit_of_measurement=UnitOfElectricPotential.VOLT, 512 | entity_category=EntityCategory.DIAGNOSTIC, 513 | suggested_display_precision=1, 514 | entity_registry_enabled_default=False, 515 | ), 516 | DavisSensorEntityDescription( 517 | key="ForecastIcon", 518 | translation_key="forecast_icon", 519 | entity_name="Forecast Icon", 520 | entity_registry_enabled_default=False, 521 | ), 522 | DavisSensorEntityDescription( 523 | key="ForecastRuleNo", 524 | translation_key="forecast_rule", 525 | entity_name="Forecast Rule", 526 | icon="mdi:binoculars", 527 | ), 528 | DavisSensorEntityDescription( 529 | key="RainCollector", 530 | translation_key="rain_collector", 531 | entity_name="Rain Collector", 532 | icon="mdi:bucket-outline", 533 | entity_category=EntityCategory.DIAGNOSTIC, 534 | device_class=SensorDeviceClass.ENUM, 535 | options=[ 536 | RAIN_COLLECTOR_IMPERIAL, 537 | RAIN_COLLECTOR_METRIC, 538 | RAIN_COLLECTOR_METRIC_0_1 539 | ], 540 | ), 541 | DavisSensorEntityDescription( 542 | key="RainStorm", 543 | translation_key="rain_storm", 544 | entity_name="Rain Storm", 545 | icon="mdi:water-outline", 546 | device_class=SensorDeviceClass.PRECIPITATION, 547 | state_class=SensorStateClass.MEASUREMENT, 548 | native_unit_of_measurement=UnitOfLength.INCHES, 549 | suggested_display_precision=1, 550 | ), 551 | DavisSensorEntityDescription( 552 | key="StormStartDate", 553 | translation_key="rain_storm_start_date", 554 | entity_name="Rain Storm Start Date", 555 | icon="mdi:calendar-outline", 556 | device_class=SensorDeviceClass.DATE, 557 | ), 558 | *[ 559 | DavisSensorEntityDescription( 560 | key=f"ExtraTemps0{probe}", 561 | translation_key=f"extra_temperature_{probe}", 562 | entity_name=f"Extra Temperature {probe}", 563 | native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, 564 | device_class=SensorDeviceClass.TEMPERATURE, 565 | state_class=SensorStateClass.MEASUREMENT, 566 | entity_registry_enabled_default=False, 567 | suggested_display_precision=1, 568 | ) 569 | for probe in range(1, 8) 570 | ], 571 | *[ 572 | DavisSensorEntityDescription( 573 | key=f"HumExtra0{probe}", 574 | translation_key=f"extra_humidity_{probe}", 575 | entity_name=f"Extra Humidity {probe}", 576 | device_class=SensorDeviceClass.HUMIDITY, 577 | native_unit_of_measurement=PERCENTAGE, 578 | suggested_display_precision=0, 579 | entity_registry_enabled_default=False, 580 | ) 581 | for probe in range(1, 8) 582 | ], 583 | DavisSensorEntityDescription( 584 | key="Latitude", 585 | translation_key="latitude", 586 | entity_name="Latitude", 587 | icon="mdi:latitude", 588 | entity_category=EntityCategory.DIAGNOSTIC, 589 | native_unit_of_measurement=DEGREE, 590 | entity_registry_enabled_default=False, 591 | ), 592 | DavisSensorEntityDescription( 593 | key="Longitude", 594 | translation_key="longitude", 595 | entity_name="Longitude", 596 | icon="mdi:longitude", 597 | entity_category=EntityCategory.DIAGNOSTIC, 598 | native_unit_of_measurement=DEGREE, 599 | entity_registry_enabled_default=False, 600 | ), 601 | DavisSensorEntityDescription( 602 | key="Elevation", 603 | translation_key="elevation", 604 | entity_name="Elevation", 605 | device_class=SensorDeviceClass.DISTANCE, 606 | icon="mdi:image-filter-hdr-outline", 607 | entity_category=EntityCategory.DIAGNOSTIC, 608 | native_unit_of_measurement=UnitOfLength.FEET, 609 | entity_registry_enabled_default=False, 610 | ), 611 | DavisSensorEntityDescription( 612 | key="LastReadoutDuration", 613 | translation_key="last_readout_duration", 614 | entity_name="Last Readout Duration", 615 | icon="mdi:timer-outline", 616 | entity_category=EntityCategory.DIAGNOSTIC, 617 | native_unit_of_measurement=UnitOfTime.SECONDS, 618 | suggested_display_precision=1, 619 | entity_registry_enabled_default=False, 620 | ), 621 | DavisSensorEntityDescription( 622 | key="SunRise", 623 | translation_key="sunrise", 624 | entity_name="Sunrise", 625 | icon="mdi:sun-clock-outline", 626 | entity_registry_enabled_default=False, 627 | ), 628 | DavisSensorEntityDescription( 629 | key="SunSet", 630 | translation_key="sunset", 631 | entity_name="Sunset", 632 | icon="mdi:sun-clock-outline", 633 | entity_registry_enabled_default=False, 634 | ), 635 | ] 636 | 637 | async def async_setup_entry( 638 | _, 639 | config_entry: DavisConfigEntry, 640 | async_add_entities: AddEntitiesCallback, 641 | ) -> None: 642 | """Set up Davis Vantage sensors based on a config entry.""" 643 | coordinator = config_entry.runtime_data.coordinator 644 | model = config_entry.data.get(CONFIG_STATION_MODEL, '') 645 | entities = [ 646 | DavisVantageSensor( 647 | coordinator=coordinator, 648 | entry_id=config_entry.entry_id, 649 | description=desc, 650 | ) 651 | for desc in get_sensor_descriptions(model) 652 | ] 653 | async_add_entities(entities) 654 | 655 | class DavisVantageSensor(CoordinatorEntity[DavisVantageDataUpdateCoordinator], SensorEntity): 656 | """Defines a Davis Vantage sensor.""" 657 | 658 | _attr_has_entity_name = True 659 | 660 | def __init__( 661 | self, 662 | coordinator: DavisVantageDataUpdateCoordinator, 663 | entry_id: str, 664 | description: DavisSensorEntityDescription, 665 | ) -> None: 666 | """Initialize Davis Vantage sensor.""" 667 | super().__init__(coordinator=coordinator) 668 | self.entity_description = description 669 | self.entity_id = f"{SENSOR_DOMAIN}.{DEFAULT_NAME} {description.entity_name}".lower() 670 | self._attr_unique_id = f"{entry_id}-{DEFAULT_NAME} {description.entity_name}" 671 | self._attr_device_info = coordinator.device_info 672 | 673 | @property 674 | def native_value(self) -> StateType: # type: ignore 675 | """Return the state of the sensor.""" 676 | return self.coordinator.data.get(self.entity_description.key) 677 | -------------------------------------------------------------------------------- /custom_components/davis_vantage/translations/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Device is already configured", 5 | "reconfigure_successful": "Re-configuration was successful" 6 | }, 7 | "error": { 8 | "cannot_connect": "Failed to connect", 9 | "invalid_auth": "Looks like the weather station isn't reacting, try again", 10 | "unknown": "Unexpected error" 11 | }, 12 | "step": { 13 | "user": { 14 | "data": { 15 | "protocol": "Protocol" 16 | } 17 | }, 18 | "setup_serial": { 19 | "data": { 20 | "link": "Device" 21 | } 22 | }, 23 | "setup_network": { 24 | "data": { 25 | "link": "Host" 26 | } 27 | }, 28 | "setup_other_info": { 29 | "data": { 30 | "station_model": "Davis weather station model", 31 | "interval": "Interval", 32 | "persistent_connection": "Persistent Connection" 33 | } 34 | }, 35 | "reconfigure_confirm": { 36 | "description": "Update configuration for {name}.", 37 | "data": { 38 | "link": "Host", 39 | "interval": "Interval" 40 | } 41 | } 42 | } 43 | }, 44 | "entity": { 45 | "sensor": { 46 | "last_fetch_time": { 47 | "name": "Last Fetch Time" 48 | }, 49 | "last_success_time": { 50 | "name": "Last Success Time" 51 | }, 52 | "last_error_time": { 53 | "name": "Last Error Time" 54 | }, 55 | "last_error_message": { 56 | "name": "Last Error Message" 57 | }, 58 | "archive_internal": { 59 | "name": "Archive Interval" 60 | }, 61 | "temperature": { 62 | "name": "Temperature" 63 | }, 64 | "temperature_high_day": { 65 | "name": "Temperature High (Day)" 66 | }, 67 | "temperature_high_time": { 68 | "name": "Temperature High Time" 69 | }, 70 | "temperature_low_day": { 71 | "name": "Temperature Low (Day)" 72 | }, 73 | "temperature_low_time": { 74 | "name": "Temperature Low Time" 75 | }, 76 | "temperature_inside": { 77 | "name": "Temperature (Inside)" 78 | }, 79 | "heat_index": { 80 | "name": "Heat Index" 81 | }, 82 | "wind_chill": { 83 | "name": "Wind Chill" 84 | }, 85 | "feels_like": { 86 | "name": "Feels Like" 87 | }, 88 | "dew_point": { 89 | "name": "Dew Point" 90 | }, 91 | "dew_point_high_day": { 92 | "name": "Dew Point High (Day)" 93 | }, 94 | "dew_point_high_time": { 95 | "name": "Dew Point High Time" 96 | }, 97 | "dew_point_low_day": { 98 | "name": "Dew Point Low (Day)" 99 | }, 100 | "dew_point_low_time": { 101 | "name": "Dew Point Low Time" 102 | }, 103 | "barometric_pressure": { 104 | "name": "Barometric Pressure" 105 | }, 106 | "barometric_pressure_high_day": { 107 | "name": "Barometric Pressure High (Day)" 108 | }, 109 | "barometric_pressure_high_time": { 110 | "name": "Barometric Pressure High Time" 111 | }, 112 | "barometric_pressure_low_day": { 113 | "name": "Barometric Pressure Low (Day)" 114 | }, 115 | "barometric_pressure_low_time": { 116 | "name": "Barometric Pressure Low Time" 117 | }, 118 | "barometric_trend": { 119 | "name": "Barometric Trend", 120 | "state": { 121 | "falling_rapidly": "Falling Rapidly", 122 | "falling_slowly": "Falling Slowly", 123 | "steady": "Steady", 124 | "rising_slowly": "Rising Slowly", 125 | "rising_rapidly": "Rising Rapidly" 126 | } 127 | }, 128 | "humidity_inside": { 129 | "name": "Humidity (Inside)" 130 | }, 131 | "humidity": { 132 | "name": "Humidity" 133 | }, 134 | "wind_speed": { 135 | "name": "Wind Speed" 136 | }, 137 | "wind_speed_average_10min": { 138 | "name": "Wind Speed (10 min. Average)" 139 | }, 140 | "wind_speed_average": { 141 | "name": "Wind Speed (Average)" 142 | }, 143 | "wind_gust": { 144 | "name": "Wind Gust" 145 | }, 146 | "wind_gust_day": { 147 | "name": "Wind Gust (Day)" 148 | }, 149 | "wind_gust_time": { 150 | "name": "Wind Gust Time" 151 | }, 152 | "wind_direction": { 153 | "name": "Wind Direction" 154 | }, 155 | "wind_direction_average": { 156 | "name": "Wind Direction (Average)" 157 | }, 158 | "wind_direction_rose": { 159 | "name": "Wind Direction (Rose)", 160 | "state": { 161 | "n": "N", 162 | "ne": "NE", 163 | "e": "E", 164 | "se": "SE", 165 | "s": "S", 166 | "sw": "SW", 167 | "w": "W", 168 | "nw": "NW" 169 | } 170 | }, 171 | "wind_direction_rose_average": { 172 | "name": "Wind Direction (Rose) (Average)", 173 | "state": { 174 | "n": "N", 175 | "ne": "NE", 176 | "e": "E", 177 | "se": "SE", 178 | "s": "S", 179 | "sw": "SW", 180 | "w": "W", 181 | "nw": "NW" 182 | } 183 | }, 184 | "wind_speed_bft": { 185 | "name": "Wind Speed (Bft)" 186 | }, 187 | "rain_day": { 188 | "name": "Rain (Day)" 189 | }, 190 | "rain_month": { 191 | "name": "Rain (Month)" 192 | }, 193 | "rain_year": { 194 | "name": "Rain (Year)" 195 | }, 196 | "rain_rate": { 197 | "name": "Rain Rate" 198 | }, 199 | "rain_rate_day": { 200 | "name": "Rain Rate (Day)" 201 | }, 202 | "rain_rate_time": { 203 | "name": "Rain Rate Time" 204 | }, 205 | "uv_level": { 206 | "name": "UV Level" 207 | }, 208 | "uv_level_day": { 209 | "name": "UV Level (Day)" 210 | }, 211 | "uv_level_time": { 212 | "name": "UV Level Time" 213 | }, 214 | "solar_radiation": { 215 | "name": "Solar Radiation" 216 | }, 217 | "solar_radiation_day": { 218 | "name": "Solar Radiation (Day)" 219 | }, 220 | "solar_radiation_time": { 221 | "name": "Solar Radiation Time" 222 | }, 223 | "battery_voltage": { 224 | "name": "Battery Voltage" 225 | }, 226 | "forecast_icon": { 227 | "name": "Forecast Icon" 228 | }, 229 | "forecast_rule": { 230 | "name": "Forecast Rule", 231 | "state": { 232 | "0": "Mostly clear and cooler", 233 | "1": "Mostly clear with little temperature change", 234 | "2": "Mostly clear for 12 hrs. with little temperature change", 235 | "3": "Mostly clear for 12 to 24 hrs. and cooler", 236 | "4": "Mostly clear with little temperature change", 237 | "5": "Partly cloudy and cooler", 238 | "6": "Partly cloudy with little temperature change", 239 | "7": "Partly cloudy with little temperature change", 240 | "8": "Mostly clear and warmer", 241 | "9": "Partly cloudy with little temperature change", 242 | "10": "Partly cloudy with little temperature change", 243 | "11": "Mostly clear with little temperature change", 244 | "12": "Increasing clouds and warmer. Precipitation possible within 24 to 48 hrs", 245 | "13": "Partly cloudy with little temperature change", 246 | "14": "Mostly clear with little temperature change", 247 | "15": "Increasing clouds with little temperature change. Precipitation possible within 24 hrs", 248 | "16": "Mostly clear with little temperature change", 249 | "17": "Partly cloudy with little temperature change", 250 | "18": "Mostly clear with little temperature change", 251 | "19": "Increasing clouds with little temperature change. Precipitation possible within 12 hrs", 252 | "20": "Mostly clear with little temperature change", 253 | "21": "Partly cloudy with little temperature change", 254 | "22": "Mostly clear with little temperature change", 255 | "23": "Increasing clouds and warmer. Precipitation possible within 24 hrs", 256 | "24": "Mostly clear and warmer. Increasing winds", 257 | "25": "Partly cloudy with little temperature change", 258 | "26": "Mostly clear with little temperature change", 259 | "27": "Increasing clouds and warmer. Precipitation possible within 12 hrs. Increasing winds", 260 | "28": "Mostly clear and warmer. Increasing winds", 261 | "29": "Increasing clouds and warmer", 262 | "30": "Partly cloudy with little temperature change", 263 | "31": "Mostly clear with little temperature change", 264 | "32": "Increasing clouds and warmer. Precipitation possible within 12 hrs. Increasing winds", 265 | "33": "Mostly clear and warmer. Increasing winds", 266 | "34": "Increasing clouds and warmer", 267 | "35": "Partly cloudy with little temperature change", 268 | "36": "Mostly clear with little temperature change", 269 | "37": "Increasing clouds and warmer. Precipitation possible within 12 hrs. Increasing winds", 270 | "38": "Partly cloudy with little temperature change", 271 | "39": "Mostly clear with little temperature change", 272 | "40": "Mostly clear and warmer. Precipitation possible within 48 hrs", 273 | "41": "Mostly clear and warmer", 274 | "42": "Partly cloudy with little temperature change", 275 | "43": "Mostly clear with little temperature change", 276 | "44": "Increasing clouds with little temperature change. Precipitation possible within 24 to 48 hrs", 277 | "45": "Increasing clouds with little temperature change", 278 | "46": "Partly cloudy with little temperature change", 279 | "47": "Mostly clear with little temperature change", 280 | "48": "Increasing clouds and warmer. Precipitation possible within 12 to 24 hrs", 281 | "49": "Partly cloudy with little temperature change", 282 | "50": "Mostly clear with little temperature change", 283 | "51": "Increasing clouds and warmer. Precipitation possible within 12 to 24 hrs. Windy", 284 | "52": "Partly cloudy with little temperature change", 285 | "53": "Mostly clear with little temperature change", 286 | "54": "Increasing clouds and warmer. Precipitation possible within 12 to 24 hrs. Windy", 287 | "55": "Partly cloudy with little temperature change", 288 | "56": "Mostly clear with little temperature change", 289 | "57": "Increasing clouds and warmer. Precipitation possible within 6 to 12 hrs", 290 | "58": "Partly cloudy with little temperature change", 291 | "59": "Mostly clear with little temperature change", 292 | "60": "Increasing clouds and warmer. Precipitation possible within 6 to 12 hrs. Windy", 293 | "61": "Partly cloudy with little temperature change", 294 | "62": "Mostly clear with little temperature change", 295 | "63": "Increasing clouds and warmer. Precipitation possible within 12 to 24 hrs. Windy", 296 | "64": "Partly cloudy with little temperature change", 297 | "65": "Mostly clear with little temperature change", 298 | "66": "Increasing clouds and warmer. Precipitation possible within 12 hrs", 299 | "67": "Partly cloudy with little temperature change", 300 | "68": "Mostly clear with little temperature change", 301 | "69": "Increasing clouds and warmer. Precipitation likely", 302 | "70": "clearing and cooler. Precipitation ending within 6 hrs", 303 | "71": "Partly cloudy with little temperature change", 304 | "72": "clearing and cooler. Precipitation ending within 6 hrs", 305 | "73": "Mostly clear with little temperature change", 306 | "74": "Clearing and cooler. Precipitation ending within 6 hrs", 307 | "75": "Partly cloudy and cooler", 308 | "76": "Partly cloudy with little temperature change", 309 | "77": "Mostly clear and cooler", 310 | "78": "clearing and cooler. Precipitation ending within 6 hrs", 311 | "79": "Mostly clear with little temperature change", 312 | "80": "Clearing and cooler. Precipitation ending within 6 hrs", 313 | "81": "Mostly clear and cooler", 314 | "82": "Partly cloudy with little temperature change", 315 | "83": "Mostly clear with little temperature change", 316 | "84": "Increasing clouds with little temperature change. Precipitation possible within 24 hrs", 317 | "85": "Mostly cloudy and cooler. Precipitation continuing", 318 | "86": "Partly cloudy with little temperature change", 319 | "87": "Mostly clear with little temperature change", 320 | "88": "Mostly cloudy and cooler. Precipitation likely", 321 | "89": "Mostly cloudy with little temperature change. Precipitation continuing", 322 | "90": "Mostly cloudy with little temperature change. Precipitation likely", 323 | "91": "Partly cloudy with little temperature change", 324 | "92": "Mostly clear with little temperature change", 325 | "93": "Increasing clouds and cooler. Precipitation possible and windy within 6 hrs", 326 | "94": "Increasing clouds with little temperature change. Precipitation possible and windy within 6 hrs", 327 | "95": "Mostly cloudy and cooler. Precipitation continuing. Increasing winds", 328 | "96": "Partly cloudy with little temperature change", 329 | "97": "Mostly clear with little temperature change", 330 | "98": "Mostly cloudy and cooler. Precipitation likely. Increasing winds", 331 | "99": "Mostly cloudy with little temperature change. Precipitation continuing. Increasing winds", 332 | "100": "Mostly cloudy with little temperature change. Precipitation likely. Increasing winds", 333 | "101": "Partly cloudy with little temperature change", 334 | "102": "Mostly clear with little temperature change", 335 | "103": "Increasing clouds and cooler. Precipitation possible within 12 to 24 hrs. Possible wind shift to the W, NW, or N", 336 | "104": "Increasing clouds with little temperature change. Precipitation possible within 12 to 24 hrs. Possible wind shift to the W, NW, or N", 337 | "105": "Partly cloudy with little temperature change", 338 | "106": "Mostly clear with little temperature change", 339 | "107": "Increasing clouds and cooler. Precipitation possible within 6 hrs. Possible wind shift to the W, NW, or N", 340 | "108": "Increasing clouds with little temperature change. Precipitation possible within 6 hrs. Possible wind shift to the W, NW, or N", 341 | "109": "Mostly cloudy and cooler. Precipitation ending within 12 hrs. Possible wind shift to the W, NW, or N", 342 | "110": "Mostly cloudy and cooler. Possible wind shift to the W, NW, or N", 343 | "111": "Mostly cloudy with little temperature change. Precipitation ending within 12 hrs. Possible wind shift to the W, NW, or N", 344 | "112": "Mostly cloudy with little temperature change. Possible wind shift to the W, NW, or N", 345 | "113": "Mostly cloudy and cooler. Precipitation ending within 12 hrs. Possible wind shift to the W, NW, or N", 346 | "114": "Partly cloudy with little temperature change", 347 | "115": "Mostly clear with little temperature change", 348 | "116": "Mostly cloudy and cooler. Precipitation possible within 24 hrs. Possible wind shift to the W, NW, or N", 349 | "117": "Mostly cloudy with little temperature change. Precipitation ending within 12 hrs. Possible wind shift to the W, NW, or N", 350 | "118": "Mostly cloudy with little temperature change. Precipitation possible within 24 hrs. Possible wind shift to the W, NW, or N", 351 | "119": "clearing, cooler and windy. Precipitation ending within 6 hrs", 352 | "120": "clearing, cooler and windy", 353 | "121": "Mostly cloudy and cooler. Precipitation ending within 6 hrs. Windy with possible wind shift to the W, NW, or N", 354 | "122": "Mostly cloudy and cooler. Windy with possible wind shift to the W, NW, or N", 355 | "123": "clearing, cooler and windy", 356 | "124": "Partly cloudy with little temperature change", 357 | "125": "Mostly clear with little temperature change", 358 | "126": "Mostly cloudy with little temperature change. Precipitation possible within 12 hrs. Windy", 359 | "127": "Partly cloudy with little temperature change", 360 | "128": "Mostly clear with little temperature change", 361 | "129": "Increasing clouds and cooler. Precipitation possible within 12 hrs, possibly heavy at times. Windy", 362 | "130": "Mostly cloudy and cooler. Precipitation ending within 6 hrs. Windy", 363 | "131": "Partly cloudy with little temperature change", 364 | "132": "Mostly clear with little temperature change", 365 | "133": "Mostly cloudy and cooler. Precipitation possible within 12 hrs. Windy", 366 | "134": "Mostly cloudy and cooler. Precipitation ending in 12 to 24 hrs", 367 | "135": "Mostly cloudy and cooler", 368 | "136": "Mostly cloudy and cooler. Precipitation continuing, possible heavy at times. Windy", 369 | "137": "Partly cloudy with little temperature change", 370 | "138": "Mostly clear with little temperature change", 371 | "139": "Mostly cloudy and cooler. Precipitation possible within 6 to 12 hrs. Windy", 372 | "140": "Mostly cloudy with little temperature change. Precipitation continuing, possibly heavy at times. Windy", 373 | "141": "Partly cloudy with little temperature change", 374 | "142": "Mostly clear with little temperature change", 375 | "143": "Mostly cloudy with little temperature change. Precipitation possible within 6 to 12 hrs. Windy", 376 | "144": "Partly cloudy with little temperature change", 377 | "145": "Mostly clear with little temperature change", 378 | "146": "Increasing clouds with little temperature change. Precipitation possible within 12 hrs, possibly heavy at times. Windy", 379 | "147": "Mostly cloudy and cooler. Windy", 380 | "148": "Mostly cloudy and cooler. Precipitation continuing, possibly heavy at times. Windy", 381 | "150": "Partly cloudy with little temperature change", 382 | "151": "Mostly clear with little temperature change", 383 | "152": "Mostly cloudy and cooler. Precipitation likely, possibly heavy at times. Windy", 384 | "153": "Mostly cloudy with little temperature change. Precipitation continuing, possibly heavy at times. Windy", 385 | "154": "Mostly cloudy with little temperature change. Precipitation likely, possibly heavy at times. Windy", 386 | "155": "Partly cloudy with little temperature change", 387 | "156": "Mostly clear with little temperature change", 388 | "157": "Increasing clouds and cooler. Precipitation possible within 6 hrs. Windy", 389 | "158": "Increasing clouds with little temperature change. Precipitation possible within 6 hrs. windy", 390 | "159": "Increasing clouds and cooler. Precipitation continuing. Windy with possible wind shift to the W, NW, or N", 391 | "160": "Partly cloudy with little temperature change", 392 | "161": "Mostly clear with little temperature change", 393 | "162": "Mostly cloudy and cooler. Precipitation likely. Windy with possible wind shift to the W, NW, or N", 394 | "163": "Mostly cloudy with little temperature change. Precipitation continuing. Windy with possible wind shift to the W, NW, or N", 395 | "164": "Mostly cloudy with little temperature change. Precipitation likely. Windy with possible wind shift to the W, NW, or N", 396 | "165": "Increasing clouds and cooler. Precipitation possible within 6 hrs. Windy with possible wind shift to the W, NW, or N", 397 | "166": "Partly cloudy with little temperature change", 398 | "167": "Mostly clear with little temperature change", 399 | "168": "Increasing clouds and cooler. Precipitation possible within 6 hrs. Possible wind shift to the W, NW, or N", 400 | "169": "Increasing clouds with little temperature change. Precipitation possible within 6 hrs. Windy with possible wind shift to the W, NW, or N", 401 | "170": "Increasing clouds with little temperature change. Precipitation possible within 6 hrs. Possible wind shift to the W, NW, or N", 402 | "171": "Partly cloudy with little temperature change", 403 | "172": "Mostly clear with little temperature change", 404 | "173": "Increasing clouds and cooler. Precipitation possible within 6 hrs. Windy with possible wind shift to the W, NW, or N", 405 | "174": "Increasing clouds with little temperature change. Precipitation possible within 6 hrs. Windy with possible wind shift to the W, NW, or N", 406 | "175": "Partly cloudy with little temperature change", 407 | "176": "Mostly clear with little temperature change", 408 | "177": "Increasing clouds and cooler. Precipitation possible within 12 to 24 hrs. Windy with possible wind shift to the W, NW, or N", 409 | "178": "Increasing clouds with little temperature change. Precipitation possible within 12 to 24 hrs. Windy with possible wind shift to the W, NW, or N", 410 | "179": "Mostly cloudy and cooler. Precipitation possibly heavy at times and ending within 12 hrs. Windy with possible wind shift to the W, NW, or N", 411 | "180": "Partly cloudy with little temperature change", 412 | "181": "Mostly clear with little temperature change", 413 | "182": "Mostly cloudy and cooler. Precipitation possible within 6 to 12 hrs, possibly heavy at times. Windy with possible wind shift to the W, NW, or N", 414 | "183": "Mostly cloudy with little temperature change. Precipitation ending within 12 hrs. Windy with possible wind shift to the W, NW, or N", 415 | "184": "Mostly cloudy with little temperature change. Precipitation possible within 6 to 12 hrs, possibly heavy at times. Windy with possible wind shift to the W, NW, or N", 416 | "185": "Mostly cloudy and cooler. Precipitation continuing", 417 | "186": "Partly cloudy with little temperature change", 418 | "187": "Mostly clear with little temperature change", 419 | "188": "Mostly cloudy and cooler. Precipitation likely, windy with possible wind shift to the W, NW, or N", 420 | "189": "Mostly cloudy with little temperature change. Precipitation continuing", 421 | "190": "Mostly cloudy with little temperature change. Precipitation likely", 422 | "191": "Partly cloudy with little temperature change", 423 | "192": "Mostly clear with little temperature change", 424 | "193": "Mostly cloudy and cooler. Precipitation possible within 12 hours, possibly heavy at times. Windy", 425 | "194": "FORECAST REQUIRES 3 HRS. OF RECENT DATA", 426 | "195": "Mostly clear and cooler" 427 | } 428 | }, 429 | "rain_collector": { 430 | "name": "Rain Collector" 431 | }, 432 | "rain_storm": { 433 | "name": "Rain Storm" 434 | }, 435 | "rain_storm_start_date": { 436 | "name": "Rain Storm Start Date" 437 | }, 438 | "extra_temperature_1": { 439 | "name": "Extra Temperature 1" 440 | }, 441 | "extra_temperature_2": { 442 | "name": "Extra Temperature 2" 443 | }, 444 | "extra_temperature_3": { 445 | "name": "Extra Temperature 3" 446 | }, 447 | "extra_temperature_4": { 448 | "name": "Extra Temperature 4" 449 | }, 450 | "extra_temperature_5": { 451 | "name": "Extra Temperature 5" 452 | }, 453 | "extra_temperature_6": { 454 | "name": "Extra Temperature 6" 455 | }, 456 | "extra_temperature_7": { 457 | "name": "Extra Temperature 7" 458 | }, 459 | "extra_humidity_1": { 460 | "name": "Extra Humidity 1" 461 | }, 462 | "extra_humidity_2": { 463 | "name": "Extra Humidity 2" 464 | }, 465 | "extra_humidity_3": { 466 | "name": "Extra Humidity 3" 467 | }, 468 | "extra_humidity_4": { 469 | "name": "Extra Humidity 4" 470 | }, 471 | "extra_humidity_5": { 472 | "name": "Extra Humidity 5" 473 | }, 474 | "extra_humidity_6": { 475 | "name": "Extra Humidity 6" 476 | }, 477 | "extra_humidity_7": { 478 | "name": "Extra Humidity 7" 479 | }, 480 | "latitude": { 481 | "name": "Latitude" 482 | }, 483 | "longitude": { 484 | "name": "Longitude" 485 | }, 486 | "elevation": { 487 | "name": "Elevation" 488 | }, 489 | "last_readout_duration": { 490 | "name": "Last Readout Duration" 491 | }, 492 | "sunrise": { 493 | "name": "Sunrise" 494 | }, 495 | "sunset": { 496 | "name": "Sunset" 497 | } 498 | }, 499 | "binary_sensor": { 500 | "is_raining": { 501 | "name": "Is Raining" 502 | } 503 | } 504 | }, 505 | "services": { 506 | "set_davis_time": { 507 | "name": "Set Davis Time", 508 | "description": "Set the time of the Davis weather station" 509 | }, 510 | "get_davis_time": { 511 | "name": "Get Davis Time", 512 | "description": "Get the time of the Davis weather station" 513 | }, 514 | "get_raw_data": { 515 | "name": "Get Raw Data", 516 | "description": "Get the raw, unprocessed data from the last fetch" 517 | }, 518 | "get_info": { 519 | "name": "Get Information", 520 | "description": "Get information about firmware and diagnostics" 521 | }, 522 | "set_yearly_rain": { 523 | "name": "Set Yearly Rain", 524 | "description": "Set yearly rain in clicks", 525 | "fields": { 526 | "rain_clicks": { 527 | "name": "Rain Clicks", 528 | "description": "Rain in clicks (depending on setup one click = 0.01\" or 0.2mm)" 529 | } 530 | } 531 | }, 532 | "set_archive_period": { 533 | "name": "Set Archive Period", 534 | "description": "Set the archive period in minutes. WARNING: All stored archive data will be erased!!!", 535 | "fields": { 536 | "archive_period": { 537 | "name": "Archive Period", 538 | "description": "Archive Period in minutes" 539 | } 540 | } 541 | }, 542 | "set_rain_collector": { 543 | "name": "Set Rain Collector", 544 | "description": "Set the rain collector (0.01\", 0.2 mm or 0.1 mm)", 545 | "fields": { 546 | "rain_collector": { 547 | "name": "Rain Collector", 548 | "description": "Rain Collector setting" 549 | } 550 | } 551 | } 552 | } 553 | } -------------------------------------------------------------------------------- /custom_components/davis_vantage/translations/nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Apparaat is reeds geconfigureerd", 5 | "reconfigure_successful": "Herconfiguratie is gelukt" 6 | }, 7 | "error": { 8 | "cannot_connect": "Kan geen verbinding maken", 9 | "invalid_auth": "Het lijkt erop dat het weerstation niet reageert, probeer het opnieuw", 10 | "unknown": "Onverwachte fout" 11 | }, 12 | "step": { 13 | "user": { 14 | "data": { 15 | "protocol": "Protocol" 16 | } 17 | }, 18 | "setup_serial": { 19 | "data": { 20 | "link": "Apparaat" 21 | } 22 | }, 23 | "setup_network": { 24 | "data": { 25 | "link": "Hostnaam" 26 | } 27 | }, 28 | "setup_other_info": { 29 | "data": { 30 | "station_model": "Davis weerstation model", 31 | "interval": "Interval", 32 | "persistent_connection": "Persistente verbinding" 33 | } 34 | }, 35 | "reconfigure_confirm": { 36 | "description": "Bijwerken configuratie voor {name}.", 37 | "data": { 38 | "link": "Hostnaam", 39 | "interval": "Interval" 40 | } 41 | } 42 | } 43 | }, 44 | "entity": { 45 | "sensor": { 46 | "last_fetch_time": { 47 | "name": "Laatst opgehaald" 48 | }, 49 | "last_success_time": { 50 | "name": "Laatst geslaagd" 51 | }, 52 | "last_error_time": { 53 | "name": "Laatste fout om" 54 | }, 55 | "last_error_message": { 56 | "name": "Laatste foutmelding" 57 | }, 58 | "archive_interval": { 59 | "name": "Archiefinterval" 60 | }, 61 | "temperature": { 62 | "name": "Temperatuur" 63 | }, 64 | "temperature_high_day": { 65 | "name": "Max. temperatuur" 66 | }, 67 | "temperature_high_time": { 68 | "name": "Max. temperatuur om" 69 | }, 70 | "temperature_low_day": { 71 | "name": "Min. temperatuur" 72 | }, 73 | "temperature_low_time": { 74 | "name": "Min. temperatuur om" 75 | }, 76 | "temperature_inside": { 77 | "name": "Temperatuur (binnen)" 78 | }, 79 | "heat_index": { 80 | "name": "Hitte index" 81 | }, 82 | "wind_chill": { 83 | "name": "Gevoelstemperatuur" 84 | }, 85 | "feels_like": { 86 | "name": "Voelt als" 87 | }, 88 | "dew_point": { 89 | "name": "Dauwpunt" 90 | }, 91 | "dew_point_high_day": { 92 | "name": "Max. dauwpunt" 93 | }, 94 | "dew_point_high_time": { 95 | "name": "Max. dauwpunt om" 96 | }, 97 | "dew_point_low_day": { 98 | "name": "Min. dauwpunt" 99 | }, 100 | "dew_point_low_time": { 101 | "name": "Min. dauwpunt om" 102 | }, 103 | "barometric_pressure": { 104 | "name": "Luchtdruk" 105 | }, 106 | "barometric_pressure_high_day": { 107 | "name": "Max. luchtdruk" 108 | }, 109 | "barometric_pressure_high_time": { 110 | "name": "Max. luchtdruk om" 111 | }, 112 | "barometric_pressure_low_day": { 113 | "name": "Min. luchtdruk" 114 | }, 115 | "barometric_pressure_low_time": { 116 | "name": "Min. luchtdruk om" 117 | }, 118 | "barometric_trend": { 119 | "name": "Luchtdruk trend", 120 | "state": { 121 | "falling_rapidly": "Snel dalend", 122 | "falling_slowly": "Langzaam dalend", 123 | "steady": "Stabiel", 124 | "rising_slowly": "Langzaam stijgend", 125 | "rising_rapidly": "Snel stijgend" 126 | } 127 | }, 128 | "humidity_inside": { 129 | "name": "Luchtvochtigheid (binnen)" 130 | }, 131 | "humidity": { 132 | "name": "Luchtvochtigheid" 133 | }, 134 | "wind_speed": { 135 | "name": "Windsnelheid" 136 | }, 137 | "wind_speed_average_10min": { 138 | "name": "Gem. windsnelheid (10 min.)" 139 | }, 140 | "wind_speed_average": { 141 | "name": "Gem. windsnelheid" 142 | }, 143 | "wind_gust": { 144 | "name": "Windstoot" 145 | }, 146 | "wind_gust_day": { 147 | "name": "Max. windstoot" 148 | }, 149 | "wind_gust_time": { 150 | "name": "Max. windstoot om" 151 | }, 152 | "wind_direction": { 153 | "name": "Windrichting" 154 | }, 155 | "wind_direction_average": { 156 | "name": "Gem. windrichting" 157 | }, 158 | "wind_direction_rose": { 159 | "name": "Windrichting (roos)", 160 | "state": { 161 | "n": "N", 162 | "ne": "NO", 163 | "e": "O", 164 | "se": "ZO", 165 | "s": "Z", 166 | "sw": "ZW", 167 | "w": "W", 168 | "nw": "NW" 169 | } 170 | }, 171 | "wind_direction_rose_average": { 172 | "name": "Gem. windrichting (roos)", 173 | "state": { 174 | "n": "N", 175 | "ne": "NO", 176 | "e": "O", 177 | "se": "ZO", 178 | "s": "Z", 179 | "sw": "ZW", 180 | "w": "W", 181 | "nw": "NW" 182 | } 183 | }, 184 | "wind_speed_bft": { 185 | "name": "Windsnelheid (Bft)" 186 | }, 187 | "rain_day": { 188 | "name": "Regen (dag)" 189 | }, 190 | "rain_month": { 191 | "name": "Regen (maand)" 192 | }, 193 | "rain_year": { 194 | "name": "Regen (jaar)" 195 | }, 196 | "rain_rate": { 197 | "name": "Regenintensiteit" 198 | }, 199 | "rain_rate_day": { 200 | "name": "Max. regenintensiteit" 201 | }, 202 | "rain_rate_time": { 203 | "name": "Max. regenintensiteit om" 204 | }, 205 | "uv_level": { 206 | "name": "UV index" 207 | }, 208 | "uv_level_day": { 209 | "name": "Max. UV index" 210 | }, 211 | "uv_level_time": { 212 | "name": "Max. UV index om" 213 | }, 214 | "solar_radiation": { 215 | "name": "Zonnestraling" 216 | }, 217 | "solar_radiation_day": { 218 | "name": "Max. zonnestraling" 219 | }, 220 | "solar_radiation_time": { 221 | "name": "Max. zonnestraling om" 222 | }, 223 | "battery_voltage": { 224 | "name": "Batterij voltage" 225 | }, 226 | "forecast_icon": { 227 | "name": "Verwachtingsicoon" 228 | }, 229 | "forecast_rule": { 230 | "name": "Verwachting", 231 | "state": { 232 | "0": "Meestal helder en koeler", 233 | "1": "Meestal helder met weinig temperatuursverandering", 234 | "2": "Meestal helder voor 12 uur met weinig temperatuursverandering", 235 | "3": "Meestal helder voor 12 tot 24 uur en koeler", 236 | "4": "Meestal helder met weinig temperatuursverandering", 237 | "5": "Gedeeltelijk bewolkt en koeler", 238 | "6": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 239 | "7": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 240 | "8": "Meestal helder en warmer", 241 | "9": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 242 | "10": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 243 | "11": "Meestal helder met weinig temperatuursverandering", 244 | "12": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 24 tot 48 uur", 245 | "13": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 246 | "14": "Meestal helder met weinig temperatuursverandering", 247 | "15": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 24 uur", 248 | "16": "Meestal helder met weinig temperatuursverandering", 249 | "17": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 250 | "18": "Meestal helder met weinig temperatuursverandering", 251 | "19": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 12 uur", 252 | "20": "Meestal helder met weinig temperatuursverandering", 253 | "21": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 254 | "22": "Meestal helder met weinig temperatuursverandering", 255 | "23": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 24 uur", 256 | "24": "Meestal helder en warmer. Toenemende wind", 257 | "25": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 258 | "26": "Meestal helder met weinig temperatuursverandering", 259 | "27": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 12 uur. Toenemende wind", 260 | "28": "Meestal helder en warmer. Toenemende wind", 261 | "29": "Toenemende bewolking en warmer", 262 | "30": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 263 | "31": "Meestal helder met weinig temperatuursverandering", 264 | "32": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 12 uur. Toenemende wind", 265 | "33": "Meestal helder en warmer. Toenemende wind", 266 | "34": "Toenemende bewolking en warmer", 267 | "35": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 268 | "36": "Meestal helder met weinig temperatuursverandering", 269 | "37": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 12 uur. Toenemende wind", 270 | "38": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 271 | "39": "Meestal helder met weinig temperatuursverandering", 272 | "40": "Meestal helder en warmer. Neerslag mogelijk binnen 48 uur", 273 | "41": "Meestal helder en warmer", 274 | "42": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 275 | "43": "Meestal helder met weinig temperatuursverandering", 276 | "44": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 24 tot 48 uur", 277 | "45": "Toenemende bewolking met weinig temperatuursverandering", 278 | "46": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 279 | "47": "Grotendeels helder met weinig temperatuursverandering", 280 | "48": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 12 tot 24 uur", 281 | "49": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 282 | "50": "Grotendeels helder met weinig temperatuursverandering", 283 | "51": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 12 tot 24 uur. Winderig", 284 | "52": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 285 | "53": "Grotendeels helder met weinig temperatuursverandering", 286 | "54": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 12 tot 24 uur. Winderig", 287 | "55": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 288 | "56": "Grotendeels helder met weinig temperatuursverandering", 289 | "57": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 6 tot 12 uur", 290 | "58": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 291 | "59": "Grotendeels helder met weinig temperatuursverandering", 292 | "60": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 6 tot 12 uur. Winderig", 293 | "61": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 294 | "62": "Grotendeels helder met weinig temperatuursverandering", 295 | "63": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 12 tot 24 uur. Winderig", 296 | "64": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 297 | "65": "Grotendeels helder met weinig temperatuursverandering", 298 | "66": "Toenemende bewolking en warmer. Neerslag mogelijk binnen 12 uur", 299 | "67": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 300 | "68": "Grotendeels helder met weinig temperatuursverandering", 301 | "69": "Toenemende bewolking en warmer. Neerslag waarschijnlijk", 302 | "70": "Oplevend en koeler. Neerslag eindigt binnen 6 uur", 303 | "71": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 304 | "72": "Oplevend en koeler. Neerslag eindigt binnen 6 uur", 305 | "73": "Grotendeels helder met weinig temperatuursverandering", 306 | "74": "Oplevend en koeler. Neerslag eindigt binnen 6 uur", 307 | "75": "Gedeeltelijk bewolkt en koeler", 308 | "76": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 309 | "77": "Grotendeels helder en koeler", 310 | "78": "Oplevend en koeler. Neerslag eindigt binnen 6 uur", 311 | "79": "Grotendeels helder met weinig temperatuursverandering", 312 | "80": "Oplevend en koeler. Neerslag eindigt binnen 6 uur", 313 | "81": "Grotendeels helder en koeler", 314 | "82": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 315 | "83": "Grotendeels helder met weinig temperatuursverandering", 316 | "84": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 24 uur", 317 | "85": "Grotendeels bewolkt en koeler. Neerslag gaat door", 318 | "86": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 319 | "87": "Grotendeels helder met weinig temperatuursverandering", 320 | "88": "Grotendeels bewolkt en koeler. Neerslag waarschijnlijk", 321 | "89": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag gaat door", 322 | "90": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag waarschijnlijk", 323 | "91": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 324 | "92": "Grotendeels helder met weinig temperatuursverandering", 325 | "93": "Toenemende bewolking en koeler. Neerslag mogelijk en winderig binnen 6 uur", 326 | "94": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk en winderig binnen 6 uur", 327 | "95": "Grotendeels bewolkt en koeler. Neerslag gaat door. Toenemende wind", 328 | "96": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 329 | "97": "Grotendeels helder met weinig temperatuursverandering", 330 | "98": "Grotendeels bewolkt en koeler. Neerslag waarschijnlijk. Toenemende wind", 331 | "99": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag gaat door. Toenemende wind", 332 | "100": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag waarschijnlijk. Toenemende wind", 333 | "101": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 334 | "102": "Grotendeels helder met weinig temperatuursverandering", 335 | "103": "Toenemende bewolking en koeler. Neerslag mogelijk binnen 12 tot 24 uur. Mogelijke windverschuiving naar W, NW of N", 336 | "104": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 12 tot 24 uur. Mogelijke windverschuiving naar W, NW of N", 337 | "105": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 338 | "106": "Grotendeels helder met weinig temperatuursverandering", 339 | "107": "Toenemende bewolking en koeler. Neerslag mogelijk binnen 6 uur. Mogelijke windverschuiving naar W, NW of N", 340 | "108": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 6 uur. Mogelijke windverschuiving naar W, NW of N", 341 | "109": "Grotendeels bewolkt en koeler. Neerslag eindigt binnen 12 uur. Mogelijke windverschuiving naar W, NW of N", 342 | "110": "Grotendeels bewolkt en koeler. Mogelijke windverschuiving naar W, NW of N", 343 | "111": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag eindigt binnen 12 uur. Mogelijke windverschuiving naar W, NW of N", 344 | "112": "Grotendeels bewolkt met weinig temperatuursverandering. Mogelijke windverschuiving naar W, NW of N", 345 | "113": "Grotendeels bewolkt en koeler. Neerslag eindigt binnen 12 uur. Mogelijke windverschuiving naar W, NW of N", 346 | "114": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 347 | "115": "Grotendeels helder met weinig temperatuursverandering", 348 | "116": "Grotendeels bewolkt en koeler. Neerslag mogelijk binnen 24 uur. Mogelijke windverschuiving naar W, NW of N", 349 | "117": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag eindigt binnen 12 uur. Mogelijke windverschuiving naar W, NW of N", 350 | "118": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag mogelijk binnen 24 uur. Mogelijke windverschuiving naar W, NW of N", 351 | "119": "Oplevend, koeler en winderig. Neerslag eindigt binnen 6 uur", 352 | "120": "Oplevend, koeler en winderig", 353 | "121": "Grotendeels bewolkt en koeler. Neerslag eindigt binnen 6 uur. Winderig met mogelijke windverschuiving naar W, NW of N", 354 | "122": "Grotendeels bewolkt en koeler. Winderig met mogelijke windverschuiving naar W, NW of N", 355 | "123": "Oplevend, koeler en winderig", 356 | "124": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 357 | "125": "Grotendeels helder met weinig temperatuursverandering", 358 | "126": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag mogelijk binnen 12 uur. Winderig", 359 | "127": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 360 | "128": "Grotendeels helder met weinig temperatuursverandering", 361 | "129": "Toenemende bewolking en koeler. Neerslag mogelijk binnen 12 uur, mogelijk zwaar. Winderig", 362 | "130": "Grotendeels bewolkt en koeler. Neerslag eindigt binnen 6 uur. Winderig", 363 | "131": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 364 | "132": "Grotendeels helder met weinig temperatuursverandering", 365 | "133": "Grotendeels bewolkt en koeler. Neerslag mogelijk binnen 12 uur. Winderig", 366 | "134": "Grotendeels bewolkt en koeler. Neerslag eindigt binnen 12 tot 24 uur", 367 | "135": "Grotendeels bewolkt en koeler", 368 | "136": "Grotendeels bewolkt en koeler. Neerslag gaat door, mogelijk zwaar. Winderig", 369 | "137": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 370 | "138": "Grotendeels helder met weinig temperatuursverandering", 371 | "139": "Grotendeels bewolkt en koeler. Neerslag mogelijk binnen 6 tot 12 uur. Winderig", 372 | "140": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag gaat door, mogelijk zwaar. Winderig", 373 | "141": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 374 | "142": "Grotendeels helder met weinig temperatuursverandering", 375 | "143": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag mogelijk binnen 6 tot 12 uur. Winderig", 376 | "144": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 377 | "145": "Grotendeels helder met weinig temperatuursverandering", 378 | "146": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 12 uur, mogelijk zwaar. Winderig", 379 | "147": "Grotendeels bewolkt en koeler. Winderig", 380 | "148": "Grotendeels bewolkt en koeler. Neerslag gaat door, mogelijk zwaar. Winderig", 381 | "150": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 382 | "151": "Grotendeels helder met weinig temperatuursverandering", 383 | "152": "Grotendeels bewolkt en koeler. Neerslag waarschijnlijk, mogelijk zwaar. Winderig", 384 | "153": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag gaat door, mogelijk zwaar. Winderig", 385 | "154": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag waarschijnlijk, mogelijk zwaar. Winderig", 386 | "155": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 387 | "156": "Grotendeels helder met weinig temperatuursverandering", 388 | "157": "Toenemende bewolking en koeler. Neerslag mogelijk binnen 6 uur. Winderig", 389 | "158": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 6 uur. Winderig", 390 | "159": "Toenemende bewolking en koeler. Neerslag gaat door. Winderig met mogelijke windverschuiving naar W, NW of N", 391 | "160": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 392 | "161": "Grotendeels helder met weinig temperatuursverandering", 393 | "162": "Grotendeels bewolkt en koeler. Neerslag waarschijnlijk. Winderig met mogelijke windverschuiving naar W, NW of N", 394 | "163": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag gaat door. Winderig met mogelijke windverschuiving naar W, NW of N", 395 | "164": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag waarschijnlijk. Winderig met mogelijke windverschuiving naar W, NW of N", 396 | "165": "Toenemende bewolking en koeler. Neerslag mogelijk binnen 6 uur. Winderig met mogelijke windverschuiving naar W, NW of N", 397 | "166": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 398 | "167": "Grotendeels helder met weinig temperatuursverandering", 399 | "168": "Toenemende bewolking en koeler. Neerslag mogelijk binnen 6 uur. Mogelijke windverschuiving naar W, NW of N", 400 | "169": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 6 uur. Winderig met mogelijke windverschuiving naar W, NW of N", 401 | "170": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 6 uur. Mogelijke windverschuiving naar W, NW of N", 402 | "171": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 403 | "172": "Grotendeels helder met weinig temperatuursverandering", 404 | "173": "Toenemende bewolking en koeler. Neerslag mogelijk binnen 6 uur. Winderig met mogelijke windverschuiving naar W, NW of N", 405 | "174": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 6 uur. Winderig met mogelijke windverschuiving naar W, NW of N", 406 | "175": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 407 | "176": "Grotendeels helder met weinig temperatuursverandering", 408 | "177": "Toenemende bewolking en koeler. Neerslag mogelijk binnen 12 tot 24 uur. Winderig met mogelijke windverschuiving naar W, NW of N", 409 | "178": "Toenemende bewolking met weinig temperatuursverandering. Neerslag mogelijk binnen 12 tot 24 uur. Winderig met mogelijke windverschuiving naar W, NW of N", 410 | "179": "Grotendeels bewolkt en koeler. Neerslag mogelijk zwaar en eindigt binnen 12 uur. Winderig met mogelijke windverschuiving naar W, NW of N", 411 | "180": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 412 | "181": "Grotendeels helder met weinig temperatuursverandering", 413 | "182": "Grotendeels bewolkt en koeler. Neerslag mogelijk binnen 6 tot 12 uur, mogelijk zwaar. Winderig met mogelijke windverschuiving naar W, NW of N", 414 | "183": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag eindigt binnen 12 uur. Winderig met mogelijke windverschuiving naar W, NW of N", 415 | "184": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag mogelijk binnen 6 tot 12 uur, mogelijk zwaar. Winderig met mogelijke windverschuiving naar W, NW of N", 416 | "185": "Grotendeels bewolkt en koeler. Neerslag gaat door", 417 | "186": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 418 | "187": "Grotendeels helder met weinig temperatuursverandering", 419 | "188": "Grotendeels bewolkt en koeler. Neerslag waarschijnlijk, winderig met mogelijke windverschuiving naar W, NW of N", 420 | "189": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag gaat door", 421 | "190": "Grotendeels bewolkt met weinig temperatuursverandering. Neerslag waarschijnlijk", 422 | "191": "Gedeeltelijk bewolkt met weinig temperatuursverandering", 423 | "192": "Grotendeels helder met weinig temperatuursverandering", 424 | "193": "Grotendeels bewolkt en koeler. Neerslag mogelijk binnen 12 uur, mogelijk zwaar. Winderig", 425 | "194": "VOORSPELLING VEREIST 3 UUR AAN RECENTE GEGEVENS", 426 | "195": "Grotendeels helder en koeler" 427 | } 428 | }, 429 | "rain_collector": { 430 | "name": "Regenvanger" 431 | }, 432 | "rain_storm": { 433 | "name": "Regenstorm" 434 | }, 435 | "rain_storm_start_date": { 436 | "name": "Regenstorm startdatum" 437 | }, 438 | "extra_temperature_1": { 439 | "name": "Extra temperatuur 1" 440 | }, 441 | "extra_temperature_2": { 442 | "name": "Extra temperatuur 2" 443 | }, 444 | "extra_temperature_3": { 445 | "name": "Extra temperatuur 3" 446 | }, 447 | "extra_temperature_4": { 448 | "name": "Extra temperatuur 4" 449 | }, 450 | "extra_temperature_5": { 451 | "name": "Extra temperatuur 5" 452 | }, 453 | "extra_temperature_6": { 454 | "name": "Extra temperatuur 6" 455 | }, 456 | "extra_temperature_7": { 457 | "name": "Extra temperatuur 7" 458 | }, 459 | "extra_humidity_1": { 460 | "name": "Extra luchtvochtigheid 1" 461 | }, 462 | "extra_humidity_2": { 463 | "name": "Extra luchtvochtigheid 2" 464 | }, 465 | "extra_humidity_3": { 466 | "name": "Extra luchtvochtigheid 3" 467 | }, 468 | "extra_humidity_4": { 469 | "name": "Extra luchtvochtigheid 4" 470 | }, 471 | "extra_humidity_5": { 472 | "name": "Extra luchtvochtigheid 5" 473 | }, 474 | "extra_humidity_6": { 475 | "name": "Extra luchtvochtigheid 6" 476 | }, 477 | "extra_humidity_7": { 478 | "name": "Extra luchtvochtigheid 7" 479 | }, 480 | "latitude": { 481 | "name": "Breedtegraad" 482 | }, 483 | "longitude": { 484 | "name": "Lengtegraad" 485 | }, 486 | "elevation": { 487 | "name": "Hoogte" 488 | }, 489 | "last_readout_duration": { 490 | "name": "Laatste uitleesduur" 491 | }, 492 | "sunrise": { 493 | "name": "Zonsopkomst" 494 | }, 495 | "sunset": { 496 | "name": "Zonsondergang" 497 | } 498 | }, 499 | "binary_sensor": { 500 | "is_raining": { 501 | "name": "Het regent" 502 | } 503 | } 504 | }, 505 | "services": { 506 | "set_davis_time": { 507 | "name": "Stel Davis tijd in", 508 | "description": "Stel de tijd van het Davis weerstation in" 509 | }, 510 | "get_davis_time": { 511 | "name": "Haal Davis tijd op", 512 | "description": "Haal de tijd vann het Davis weerstation op" 513 | }, 514 | "get_raw_data": { 515 | "name": "Haal ruwe gegevens op", 516 | "description": "Haal de ruwe, onbewerkte gegevens op van de laatste meting" 517 | }, 518 | "get_info": { 519 | "name": "Haal informatie op", 520 | "description": "Haal informatie over de firmware en diagnostiek op" 521 | }, 522 | "set_yearly_rain": { 523 | "name": "Stel de jaarlijke neerslag in", 524 | "description": "Stel de jaarlijkse neerslag in kliks in", 525 | "fields": { 526 | "rain_clicks": { 527 | "name": "Regen kliks", 528 | "description": "Neerslag in kliks (afhankelijk van de instelling is één klik = 0.01\" of 0.2mm)" 529 | } 530 | } 531 | }, 532 | "set_archive_period": { 533 | "name": "Stel archiefinterval in", 534 | "description": "Stel de archiefinterval in minuten in. WAARSCHUWING: Alle gearchiveerde data wordt verwijderd!!!", 535 | "fields": { 536 | "archive_period": { 537 | "name": "Archiefinterval", 538 | "description": "Archiefinterval in minuten" 539 | } 540 | } 541 | }, 542 | "set_rain_collector": { 543 | "name": "Stel regenmeter in", 544 | "description": "Stel de regenmeter in. Keuze uit 0.01\", 0.2 mm of 0.1 mm", 545 | "fields": { 546 | "rain_collector": { 547 | "name": "Regenmeter", 548 | "description": "Regenmeter instelling" 549 | } 550 | } 551 | } 552 | } 553 | } -------------------------------------------------------------------------------- /custom_components/davis_vantage/translations/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Gerät ist bereits konfiguriert", 5 | "reconfigure_successful": "Die Neukonfiguration war erfolgreich" 6 | }, 7 | "error": { 8 | "cannot_connect": "Verbindung fehlgeschlagen", 9 | "invalid_auth": "Sieht so aus, als ob die Wetterstation nicht reagiert, versuchen Sie es erneut", 10 | "unknown": "Unerwarteter Fehler" 11 | }, 12 | "step": { 13 | "user": { 14 | "data": { 15 | "protocol": "Protokoll" 16 | } 17 | }, 18 | "setup_serial": { 19 | "data": { 20 | "link": "Gerät" 21 | } 22 | }, 23 | "setup_network": { 24 | "data": { 25 | "link": "Hostname" 26 | } 27 | }, 28 | "setup_other_info": { 29 | "data": { 30 | "station_model": "Davis-Wetterstationsmodell", 31 | "interval": "Intervall" 32 | } 33 | }, 34 | "reconfigure_confirm": { 35 | "description": "Neukonfiguration für {name}.", 36 | "data": { 37 | "link": "Hostname", 38 | "interval": "Intervall", 39 | "persistent_connection": "Persistente Verbindung" 40 | } 41 | } 42 | } 43 | }, 44 | "entity": { 45 | "sensor": { 46 | "last_fetch_time": { 47 | "name": "Zeitpunkt des letzte Abruf" 48 | }, 49 | "last_success_time": { 50 | "name": "Zeitpunkt des letzte Erfolg" 51 | }, 52 | "last_error_time": { 53 | "name": "Zeitpunkt des letzte Fehler" 54 | }, 55 | "last_error_message": { 56 | "name": "Letzte Fehlermeldung" 57 | }, 58 | "archive_internal": { 59 | "name": "Archiv-Intervall" 60 | }, 61 | "temperature": { 62 | "name": "Temperatur" 63 | }, 64 | "temperature_high_day": { 65 | "name": "Höchste Temperatur" 66 | }, 67 | "temperature_high_time": { 68 | "name": "Zeitpunkt höchste Temperatur" 69 | }, 70 | "temperature_low_day": { 71 | "name": "Niedrigste Temperatur" 72 | }, 73 | "temperature_low_time": { 74 | "name": "Zeitpunkt niedrigste Temperatur" 75 | }, 76 | "temperature_inside": { 77 | "name": "Temperatur (innen)" 78 | }, 79 | "heat_index": { 80 | "name": "Hitzeindex" 81 | }, 82 | "wind_chill": { 83 | "name": "Windchill" 84 | }, 85 | "feels_like": { 86 | "name": "Fühlt sich an wie" 87 | }, 88 | "dew_point": { 89 | "name": "Taupunkt" 90 | }, 91 | "dew_point_high_day": { 92 | "name": "Höchste Taupunkt" 93 | }, 94 | "dew_point_high_time": { 95 | "name": "Zeitpunkt höchste Taupunkt" 96 | }, 97 | "dew_point_low_day": { 98 | "name": "Niedrigste Taupunkt" 99 | }, 100 | "dew_point_low_time": { 101 | "name": "Zeitpunkt niedrigste Taupunkt" 102 | }, 103 | "barometric_pressure": { 104 | "name": "Luftdruck" 105 | }, 106 | "barometric_pressure_high_day": { 107 | "name": "Höchste Luftdruck" 108 | }, 109 | "barometric_pressure_high_time": { 110 | "name": "Zeitpunkt höchste Luftdruck" 111 | }, 112 | "barometric_pressure_low_day": { 113 | "name": "Niedrigste Luftdruck" 114 | }, 115 | "barometric_pressure_low_time": { 116 | "name": "Zeitpunkt niedrigste Luftdruck" 117 | }, 118 | "barometric_trend": { 119 | "name": "Barometrischer Trend", 120 | "state": { 121 | "falling_rapidly": "Schnelles Fallen", 122 | "falling_slowly": "Langsam fallen", 123 | "steady": "Stet", 124 | "rising_slowly": "Langsam aufsteigen", 125 | "rising_rapidly": "Schnelles steigend" 126 | } 127 | }, 128 | "humidity_inside": { 129 | "name": "Luftfeuchtigkeit (innen)" 130 | }, 131 | "humidity": { 132 | "name": "Luftfeuchtigkeit" 133 | }, 134 | "wind_speed": { 135 | "name": "Windgeschwindigkeit" 136 | }, 137 | "wind_speed_average_10min": { 138 | "name": "Windgeschwindigkeit (10 min. Durchschnitt)" 139 | }, 140 | "wind_speed_average": { 141 | "name": "Windgeschwindigkeit (Durchschnitt)" 142 | }, 143 | "wind_gust": { 144 | "name": "Windböe" 145 | }, 146 | "wind_gust_day": { 147 | "name": "Höchste Windböe" 148 | }, 149 | "wind_gust_time": { 150 | "name": "Zeitpunkt höchste Windböe" 151 | }, 152 | "wind_direction": { 153 | "name": "Windrichtung" 154 | }, 155 | "wind_direction_average": { 156 | "name": "Windrichtung (Durchschnitt)" 157 | }, 158 | "wind_direction_rose": { 159 | "name": "Windrichtung (Rose)", 160 | "state": { 161 | "n": "N", 162 | "ne": "NO", 163 | "e": "O", 164 | "se": "SO", 165 | "s": "S", 166 | "sw": "SW", 167 | "w": "W", 168 | "nw": "NW" 169 | } 170 | }, 171 | "wind_direction_rose_average": { 172 | "name": "Windrichtung (Rose) (Durchschnitt)", 173 | "state": { 174 | "n": "N", 175 | "ne": "NO", 176 | "e": "O", 177 | "se": "SO", 178 | "s": "S", 179 | "sw": "SW", 180 | "w": "W", 181 | "nw": "NW" 182 | } 183 | }, 184 | "wind_speed_bft": { 185 | "name": "Windgeschwindigkeit (Bft)" 186 | }, 187 | "rain_day": { 188 | "name": "Regen (Tag)" 189 | }, 190 | "rain_month": { 191 | "name": "Regen (Monat)" 192 | }, 193 | "rain_year": { 194 | "name": "Regen (Jahr)" 195 | }, 196 | "rain_rate": { 197 | "name": "Regenintensität" 198 | }, 199 | "rain_rate_day": { 200 | "name": "Höchste Regenintensität" 201 | }, 202 | "rain_rate_time": { 203 | "name": "Zeitpunkt höchste Regenintensität" 204 | }, 205 | "uv_level": { 206 | "name": "UV-Stufe" 207 | }, 208 | "uv_level_day": { 209 | "name": "Höchste UV-Stufe" 210 | }, 211 | "uv_level_time": { 212 | "name": "Zeitpunkt höchste UV-Stufe" 213 | }, 214 | "solar_radiation": { 215 | "name": "Sonnenstrahlung" 216 | }, 217 | "solar_radiation_day": { 218 | "name": "Höchste Sonnenstrahlung" 219 | }, 220 | "solar_radiation_time": { 221 | "name": "Zeitpunkt höchste Sonnenstrahlung" 222 | }, 223 | "battery_voltage": { 224 | "name": "Batteriespannung" 225 | }, 226 | "forecast_icon": { 227 | "name": "Symbol Prognose" 228 | }, 229 | "forecast_rule": { 230 | "name": "Prognose-Regel", 231 | "state": { 232 | "0": "Überwiegend klar und kühler", 233 | "1": "Überwiegend klar mit wenig Temperaturänderung", 234 | "2": "Überwiegend klar für 12 Stunden mit wenig Temperaturänderung", 235 | "3": "Überwiegend klar für 12 bis 24 Stunden und kühler", 236 | "4": "Überwiegend klar mit wenig Temperaturänderung", 237 | "5": "Teilweise bewölkt und kühler", 238 | "6": "Teilweise bewölkt mit wenig Temperaturänderung", 239 | "7": "Teilweise bewölkt mit wenig Temperaturänderung", 240 | "8": "Überwiegend klar und wärmer", 241 | "9": "Teilweise bewölkt mit wenig Temperaturänderung", 242 | "10": "Teilweise bewölkt mit wenig Temperaturänderung", 243 | "11": "Überwiegend klar mit wenig Temperaturänderung", 244 | "12": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 24 bis 48 Stunden", 245 | "13": "Teilweise bewölkt mit wenig Temperaturänderung", 246 | "14": "Überwiegend klar mit wenig Temperaturänderung", 247 | "15": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 24 Stunden", 248 | "16": "Überwiegend klar mit wenig Temperaturänderung", 249 | "17": "Teilweise bewölkt mit wenig Temperaturänderung", 250 | "18": "Überwiegend klar mit wenig Temperaturänderung", 251 | "19": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 12 Stunden", 252 | "20": "Überwiegend klar mit wenig Temperaturänderung", 253 | "21": "Teilweise bewölkt mit wenig Temperaturänderung", 254 | "22": "Überwiegend klar mit wenig Temperaturänderung", 255 | "23": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 24 Stunden", 256 | "24": "Überwiegend klar und wärmer. Zunehmende Winde", 257 | "25": "Teilweise bewölkt mit wenig Temperaturänderung", 258 | "26": "Überwiegend klar mit wenig Temperaturänderung", 259 | "27": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 12 Stunden. Zunehmende Winde", 260 | "28": "Überwiegend klar und wärmer. Zunehmende Winde", 261 | "29": "Zunehmende Bewölkung und wärmer", 262 | "30": "Teilweise bewölkt mit wenig Temperaturänderung", 263 | "31": "Überwiegend klar mit wenig Temperaturänderung", 264 | "32": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 12 Stunden. Zunehmende Winde", 265 | "33": "Überwiegend klar und wärmer. Zunehmende Winde", 266 | "34": "Zunehmende Bewölkung und wärmer", 267 | "35": "Teilweise bewölkt mit wenig Temperaturänderung", 268 | "36": "Überwiegend klar mit wenig Temperaturänderung", 269 | "37": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 12 Stunden. Zunehmende Winde", 270 | "38": "Teilweise bewölkt mit wenig Temperaturänderung", 271 | "39": "Überwiegend klar mit wenig Temperaturänderung", 272 | "40": "Überwiegend klar und wärmer. Niederschlag möglich innerhalb von 48 Stunden", 273 | "41": "Überwiegend klar und wärmer", 274 | "42": "Teilweise bewölkt mit wenig Temperaturänderung", 275 | "43": "Überwiegend klar mit wenig Temperaturänderung", 276 | "44": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 24 bis 48 Stunden", 277 | "45": "Zunehmende Bewölkung mit wenig Temperaturänderung", 278 | "46": "Teilweise bewölkt mit wenig Temperaturänderung", 279 | "47": "Überwiegend klar mit wenig Temperaturänderung", 280 | "48": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 12 bis 24 Stunden", 281 | "49": "Teilweise bewölkt mit wenig Temperaturänderung", 282 | "50": "Überwiegend klar mit wenig Temperaturänderung", 283 | "51": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 12 bis 24 Stunden. Windig", 284 | "52": "Teilweise bewölkt mit wenig Temperaturänderung", 285 | "53": "Überwiegend klar mit wenig Temperaturänderung", 286 | "54": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 12 bis 24 Stunden. Windig", 287 | "55": "Teilweise bewölkt mit wenig Temperaturänderung", 288 | "56": "Überwiegend klar mit wenig Temperaturänderung", 289 | "57": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 6 bis 12 Stunden", 290 | "58": "Teilweise bewölkt mit wenig Temperaturänderung", 291 | "59": "Überwiegend klar mit wenig Temperaturänderung", 292 | "60": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 6 bis 12 Stunden. Windig", 293 | "61": "Teilweise bewölkt mit wenig Temperaturänderung", 294 | "62": "Überwiegend klar mit wenig Temperaturänderung", 295 | "63": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 12 bis 24 Stunden. Windig", 296 | "64": "Teilweise bewölkt mit wenig Temperaturänderung", 297 | "65": "Überwiegend klar mit wenig Temperaturänderung", 298 | "66": "Zunehmende Bewölkung und wärmer. Niederschlag möglich innerhalb von 12 Stunden", 299 | "67": "Teilweise bewölkt mit wenig Temperaturänderung", 300 | "68": "Überwiegend klar mit wenig Temperaturänderung", 301 | "69": "Zunehmende Bewölkung und wärmer. Niederschlag wahrscheinlich", 302 | "70": "Aufklarend und kühler. Niederschlag endet innerhalb von 6 Stunden", 303 | "71": "Teilweise bewölkt mit wenig Temperaturänderung", 304 | "72": "Aufklarend und kühler. Niederschlag endet innerhalb von 6 Stunden", 305 | "73": "Überwiegend klar mit wenig Temperaturänderung", 306 | "74": "Aufklarend und kühler. Niederschlag endet innerhalb von 6 Stunden", 307 | "75": "Teilweise bewölkt und kühler", 308 | "76": "Teilweise bewölkt mit wenig Temperaturänderung", 309 | "77": "Überwiegend klar und kühler", 310 | "78": "Aufklarend und kühler. Niederschlag endet innerhalb von 6 Stunden", 311 | "79": "Überwiegend klar mit wenig Temperaturänderung", 312 | "80": "Aufklarend und kühler. Niederschlag endet innerhalb von 6 Stunden", 313 | "81": "Überwiegend klar und kühler", 314 | "82": "Teilweise bewölkt mit wenig Temperaturänderung", 315 | "83": "Überwiegend klar mit wenig Temperaturänderung", 316 | "84": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 24 Stunden", 317 | "85": "Überwiegend bewölkt und kühler. Niederschlag hält an", 318 | "86": "Teilweise bewölkt mit wenig Temperaturänderung", 319 | "87": "Überwiegend klar mit wenig Temperaturänderung", 320 | "88": "Überwiegend bewölkt und kühler. Niederschlag wahrscheinlich", 321 | "89": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag hält an", 322 | "90": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag wahrscheinlich", 323 | "91": "Teilweise bewölkt mit wenig Temperaturänderung", 324 | "92": "Überwiegend klar mit wenig Temperaturänderung", 325 | "93": "Zunehmende Bewölkung und kühler. Niederschlag möglich und windig innerhalb von 6 Stunden", 326 | "94": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich und windig innerhalb von 6 Stunden", 327 | "95": "Überwiegend bewölkt und kühler. Niederschlag hält an. Zunehmende Winde", 328 | "96": "Teilweise bewölkt mit wenig Temperaturänderung", 329 | "97": "Überwiegend klar mit wenig Temperaturänderung", 330 | "98": "Überwiegend bewölkt und kühler. Niederschlag wahrscheinlich. Zunehmende Winde", 331 | "99": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag hält an. Zunehmende Winde", 332 | "100": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag wahrscheinlich. Zunehmende Winde", 333 | "101": "Teilweise bewölkt mit wenig Temperaturänderung", 334 | "102": "Überwiegend klar mit wenig Temperaturänderung", 335 | "103": "Zunehmende Bewölkung und kühler. Niederschlag möglich innerhalb von 12 bis 24 Stunden. Mögliche Winddrehung nach W, NW oder N", 336 | "104": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 12 bis 24 Stunden. Mögliche Winddrehung nach W, NW oder N", 337 | "105": "Teilweise bewölkt mit wenig Temperaturänderung", 338 | "106": "Überwiegend klar mit wenig Temperaturänderung", 339 | "107": "Zunehmende Bewölkung und kühler. Niederschlag möglich innerhalb von 6 Stunden. Mögliche Winddrehung nach W, NW oder N", 340 | "108": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 6 Stunden. Mögliche Winddrehung nach W, NW oder N", 341 | "109": "Überwiegend bewölkt und kühler. Niederschlag endet innerhalb von 12 Stunden. Mögliche Winddrehung nach W, NW oder N", 342 | "110": "Überwiegend bewölkt und kühler. Mögliche Winddrehung nach W, NW oder N", 343 | "111": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag endet innerhalb von 12 Stunden. Mögliche Winddrehung nach W, NW oder N", 344 | "112": "Überwiegend bewölkt mit wenig Temperaturänderung. Mögliche Winddrehung nach W, NW oder N", 345 | "113": "Überwiegend bewölkt und kühler. Niederschlag endet innerhalb von 12 Stunden. Mögliche Winddrehung nach W, NW oder N", 346 | "114": "Teilweise bewölkt mit wenig Temperaturänderung", 347 | "115": "Überwiegend klar mit wenig Temperaturänderung", 348 | "116": "Überwiegend bewölkt und kühler. Niederschlag möglich innerhalb von 24 Stunden. Mögliche Winddrehung nach W, NW oder N", 349 | "117": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag endet innerhalb von 12 Stunden. Mögliche Winddrehung nach W, NW oder N", 350 | "118": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 24 Stunden. Mögliche Winddrehung nach W, NW oder N", 351 | "119": "Aufklarend, kühler und windig. Niederschlag endet innerhalb von 6 Stunden", 352 | "120": "Aufklarend, kühler und windig", 353 | "121": "Überwiegend bewölkt und kühler. Niederschlag endet innerhalb von 6 Stunden. Windig mit möglicher Winddrehung nach W, NW oder N", 354 | "122": "Überwiegend bewölkt und kühler. Windig mit möglicher Winddrehung nach W, NW oder N", 355 | "123": "Aufklarend, kühler und windig", 356 | "124": "Teilweise bewölkt mit wenig Temperaturänderung", 357 | "125": "Überwiegend klar mit wenig Temperaturänderung", 358 | "126": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 12 Stunden. Windig", 359 | "127": "Teilweise bewölkt mit wenig Temperaturänderung", 360 | "128": "Überwiegend klar mit wenig Temperaturänderung", 361 | "129": "Zunehmende Bewölkung und kühler. Niederschlag möglich innerhalb von 12 Stunden, möglicherweise stark. Windig", 362 | "130": "Überwiegend bewölkt und kühler. Niederschlag endet innerhalb von 6 Stunden. Windig", 363 | "131": "Teilweise bewölkt mit wenig Temperaturänderung", 364 | "132": "Überwiegend klar mit wenig Temperaturänderung", 365 | "133": "Überwiegend bewölkt und kühler. Niederschlag möglich innerhalb von 12 Stunden. Windig", 366 | "134": "Überwiegend bewölkt und kühler. Niederschlag endet in 12 bis 24 Stunden", 367 | "135": "Überwiegend bewölkt und kühler", 368 | "136": "Überwiegend bewölkt und kühler. Niederschlag hält an, möglicherweise stark. Windig", 369 | "137": "Teilweise bewölkt mit wenig Temperaturänderung", 370 | "138": "Überwiegend klar mit wenig Temperaturänderung", 371 | "139": "Überwiegend bewölkt und kühler. Niederschlag möglich innerhalb von 6 bis 12 Stunden. Windig", 372 | "140": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag hält an, möglicherweise stark. Windig", 373 | "141": "Teilweise bewölkt mit wenig Temperaturänderung", 374 | "142": "Überwiegend klar mit wenig Temperaturänderung", 375 | "143": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 6 bis 12 Stunden. Windig", 376 | "144": "Teilweise bewölkt mit wenig Temperaturänderung", 377 | "145": "Überwiegend klar mit wenig Temperaturänderung", 378 | "146": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 12 Stunden, möglicherweise stark. Windig", 379 | "147": "Überwiegend bewölkt und kühler. Windig", 380 | "148": "Überwiegend bewölkt und kühler. Niederschlag hält an, möglicherweise stark. Windig", 381 | "150": "Teilweise bewölkt mit wenig Temperaturänderung", 382 | "151": "Überwiegend klar mit wenig Temperaturänderung", 383 | "152": "Überwiegend bewölkt und kühler. Niederschlag wahrscheinlich, möglicherweise stark. Windig", 384 | "153": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag hält an, möglicherweise stark. Windig", 385 | "154": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag wahrscheinlich, möglicherweise stark. Windig", 386 | "155": "Teilweise bewölkt mit wenig Temperaturänderung", 387 | "156": "Überwiegend klar mit wenig Temperaturänderung", 388 | "157": "Zunehmende Bewölkung und kühler. Niederschlag möglich innerhalb von 6 Stunden. Windig", 389 | "158": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 6 Stunden. Windig", 390 | "159": "Zunehmende Bewölkung und kühler. Niederschlag hält an. Windig mit möglicher Winddrehung nach W, NW oder N", 391 | "160": "Teilweise bewölkt mit wenig Temperaturänderung", 392 | "161": "Überwiegend klar mit wenig Temperaturänderung", 393 | "162": "Überwiegend bewölkt und kühler. Niederschlag wahrscheinlich. Windig mit möglicher Winddrehung nach W, NW oder N", 394 | "163": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag hält an. Windig mit möglicher Winddrehung nach W, NW oder N", 395 | "164": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag wahrscheinlich. Windig mit möglicher Winddrehung nach W, NW oder N", 396 | "165": "Zunehmende Bewölkung und kühler. Niederschlag möglich innerhalb von 6 Stunden. Windig mit möglicher Winddrehung nach W, NW oder N", 397 | "166": "Teilweise bewölkt mit wenig Temperaturänderung", 398 | "167": "Überwiegend klar mit wenig Temperaturänderung", 399 | "168": "Zunehmende Bewölkung und kühler. Niederschlag möglich innerhalb von 6 Stunden. Mögliche Winddrehung nach W, NW oder N", 400 | "169": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 6 Stunden. Windig mit möglicher Winddrehung nach W, NW oder N", 401 | "170": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 6 Stunden. Mögliche Winddrehung nach W, NW oder N", 402 | "171": "Teilweise bewölkt mit wenig Temperaturänderung", 403 | "172": "Überwiegend klar mit wenig Temperaturänderung", 404 | "173": "Zunehmende Bewölkung und kühler. Niederschlag möglich innerhalb von 6 Stunden. Windig mit möglicher Winddrehung nach W, NW oder N", 405 | "174": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 6 Stunden. Windig mit möglicher Winddrehung nach W, NW oder N", 406 | "175": "Teilweise bewölkt mit wenig Temperaturänderung", 407 | "176": "Überwiegend klar mit wenig Temperaturänderung", 408 | "177": "Zunehmende Bewölkung und kühler. Niederschlag möglich innerhalb von 12 bis 24 Stunden. Windig mit möglicher Winddrehung nach W, NW oder N", 409 | "178": "Zunehmende Bewölkung mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 12 bis 24 Stunden. Windig mit möglicher Winddrehung nach W, NW oder N", 410 | "179": "Überwiegend bewölkt und kühler. Niederschlag möglicherweise stark und endet innerhalb von 12 Stunden. Windig mit möglicher Winddrehung nach W, NW oder N", 411 | "180": "Teilweise bewölkt mit wenig Temperaturänderung", 412 | "181": "Überwiegend klar mit wenig Temperaturänderung", 413 | "182": "Überwiegend bewölkt und kühler. Niederschlag möglich innerhalb von 6 bis 12 Stunden, möglicherweise stark. Windig mit möglicher Winddrehung nach W, NW oder N", 414 | "183": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag endet innerhalb von 12 Stunden. Windig mit möglicher Winddrehung nach W, NW oder N", 415 | "184": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag möglich innerhalb von 6 bis 12 Stunden, möglicherweise stark. Windig mit möglicher Winddrehung nach W, NW oder N", 416 | "185": "Überwiegend bewölkt und kühler. Niederschlag hält an", 417 | "186": "Teilweise bewölkt mit wenig Temperaturänderung", 418 | "187": "Überwiegend klar mit wenig Temperaturänderung", 419 | "188": "Überwiegend bewölkt und kühler. Niederschlag wahrscheinlich, windig mit möglicher Winddrehung nach W, NW oder N", 420 | "189": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag hält an", 421 | "190": "Überwiegend bewölkt mit wenig Temperaturänderung. Niederschlag wahrscheinlich", 422 | "191": "Teilweise bewölkt mit wenig Temperaturänderung", 423 | "192": "Überwiegend klar mit wenig Temperaturänderung", 424 | "193": "Überwiegend bewölkt und kühler. Niederschlag möglich innerhalb von 12 Stunden, möglicherweise stark. Windig", 425 | "194": "Vorhersage benötigt 3 Stunden aktuelle Daten", 426 | "195": "Überwiegend klar und kühler" 427 | } 428 | }, 429 | "rain_collector": { 430 | "name": "Regensammler" 431 | }, 432 | "rain_storm": { 433 | "name": "Regensturm" 434 | }, 435 | "rain_storm_start_date": { 436 | "name": "Startdatum des Regensturms" 437 | }, 438 | "extra_temperature_1": { 439 | "name": "Zusätzliche Temperatur 1" 440 | }, 441 | "extra_temperature_2": { 442 | "name": "Zusätzliche Temperatur 2" 443 | }, 444 | "extra_temperature_3": { 445 | "name": "Zusätzliche Temperatur 3" 446 | }, 447 | "extra_temperature_4": { 448 | "name": "Zusätzliche Temperatur 4" 449 | }, 450 | "extra_temperature_5": { 451 | "name": "Zusätzliche Temperatur 5" 452 | }, 453 | "extra_temperature_6": { 454 | "name": "Zusätzliche Temperatur 6" 455 | }, 456 | "extra_temperature_7": { 457 | "name": "Zusätzliche Temperatur 7" 458 | }, 459 | "extra_humidity_1": { 460 | "name": "Zusätzliche Luftfeuchtigkeit 1" 461 | }, 462 | "extra_humidity_2": { 463 | "name": "Zusätzliche Luftfeuchtigkeit 2" 464 | }, 465 | "extra_humidity_3": { 466 | "name": "Zusätzliche Luftfeuchtigkeit 3" 467 | }, 468 | "extra_humidity_4": { 469 | "name": "Zusätzliche Luftfeuchtigkeit 4" 470 | }, 471 | "extra_humidity_5": { 472 | "name": "Zusätzliche Luftfeuchtigkeit 5" 473 | }, 474 | "extra_humidity_6": { 475 | "name": "Zusätzliche Luftfeuchtigkeit 6" 476 | }, 477 | "extra_humidity_7": { 478 | "name": "Zusätzliche Luftfeuchtigkeit 7" 479 | }, 480 | "latitude": { 481 | "name": "Breitengrad" 482 | }, 483 | "longitude": { 484 | "name": "Längengrad" 485 | }, 486 | "elevation": { 487 | "name": "Höhe" 488 | }, 489 | "last_readout_duration": { 490 | "name": "Dauer des letzten Abrufs" 491 | }, 492 | "sunrise": { 493 | "name": "Sonnenaufgang" 494 | }, 495 | "sunset": { 496 | "name": "Sonnenuntergang" 497 | } 498 | }, 499 | "binary_sensor": { 500 | "is_raining": { 501 | "name": "Regnet" 502 | } 503 | } 504 | }, 505 | "services": { 506 | "set_davis_time": { 507 | "name": "Davis-Zeit einstellen", 508 | "description": "Die Zeit der Davis-Wetterstation einstellen" 509 | }, 510 | "get_davis_time": { 511 | "name": "Davis-Zeit abrufen", 512 | "description": "Die Zeit der Davis-Wetterstation abrufen" 513 | }, 514 | "get_raw_data": { 515 | "name": "Rohdaten abrufen", 516 | "description": "Die rohen, unverarbeiteten Daten des letzten Abrufs abrufen" 517 | }, 518 | "get_info": { 519 | "name": "Informationen abrufen", 520 | "description": "Informationen über Firmware und Diagnose abrufen" 521 | }, 522 | "set_yearly_rain": { 523 | "name": "Jährlichen Niederschlag einstellen", 524 | "description": "Jährlichen Niederschlag in Klicks einstellen", 525 | "fields": { 526 | "rain_clicks": { 527 | "name": "Regen-Klicks", 528 | "description": "Regen in Klicks (je nach Einrichtung entspricht ein Klick 0,01\" oder 0,2 mm)" 529 | } 530 | } 531 | }, 532 | "set_archive_period": { 533 | "name": "Archivierungsperiode einstellen", 534 | "description": "Die Archivierungsperiode in Minuten einstellen. WARNUNG: Alle gespeicherten Archivdaten werden gelöscht!!!", 535 | "fields": { 536 | "archive_period": { 537 | "name": "Archivierungsperiode", 538 | "description": "Archivierungsperiode in Minuten" 539 | } 540 | } 541 | }, 542 | "set_rain_collector": { 543 | "name": "Regensammler einstellen", 544 | "description": "Die Regensammler einstellen (0.01\", 0.2 mm oder 0.1 mm)", 545 | "fields": { 546 | "rain_collector": { 547 | "name": "Regensammler", 548 | "description": "Regensammler Einstellung" 549 | } 550 | } 551 | } 552 | } 553 | } -------------------------------------------------------------------------------- /custom_components/davis_vantage/translations/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Il dispositivo è già configurato", 5 | "reconfigure_successful": "La riconfigurazione è stata completata con successo" 6 | }, 7 | "error": { 8 | "cannot_connect": "Connessione fallita", 9 | "invalid_auth": "Sembra che la stazione meteorologica non risponda, riprova", 10 | "unknown": "Errore imprevisto" 11 | }, 12 | "step": { 13 | "user": { 14 | "data": { 15 | "protocol": "Protocollo" 16 | } 17 | }, 18 | "setup_serial": { 19 | "data": { 20 | "link": "Dispositivo" 21 | } 22 | }, 23 | "setup_network": { 24 | "data": { 25 | "link": "Host" 26 | } 27 | }, 28 | "setup_other_info": { 29 | "data": { 30 | "station_model": "Modello di stazione meteorologica Davis", 31 | "interval": "Intervallo", 32 | "persistent_connection": "Connessione persistente" 33 | } 34 | }, 35 | "reconfigure_confirm": { 36 | "description": "Aggiorna la configurazione per {name}.", 37 | "data": { 38 | "link": "Host", 39 | "interval": "Intervallo" 40 | } 41 | } 42 | } 43 | }, 44 | "entity": { 45 | "sensor": { 46 | "last_fetch_time": { 47 | "name": "Ultimo tempo di recupero" 48 | }, 49 | "last_success_time": { 50 | "name": "Ultimo tempo di successo" 51 | }, 52 | "last_error_time": { 53 | "name": "Ultimo tempo di errore" 54 | }, 55 | "last_error_message": { 56 | "name": "Ultimo messaggio di errore" 57 | }, 58 | "archive_internal": { 59 | "name": "Intervallo di archiviazione" 60 | }, 61 | "temperature": { 62 | "name": "Temperatura" 63 | }, 64 | "temperature_high_day": { 65 | "name": "Temperatura massima (giorno)" 66 | }, 67 | "temperature_high_time": { 68 | "name": "Ora della temperatura massima" 69 | }, 70 | "temperature_low_day": { 71 | "name": "Temperatura minima (giorno)" 72 | }, 73 | "temperature_low_time": { 74 | "name": "Ora della temperatura minima" 75 | }, 76 | "temperature_inside": { 77 | "name": "Temperatura (interna)" 78 | }, 79 | "heat_index": { 80 | "name": "Indice di calore" 81 | }, 82 | "wind_chill": { 83 | "name": "Vento gelido" 84 | }, 85 | "feels_like": { 86 | "name": "Percepita come" 87 | }, 88 | "dew_point": { 89 | "name": "Punto di rugiada" 90 | }, 91 | "dew_point_high_day": { 92 | "name": "Punto di rugiada massimo (giorno)" 93 | }, 94 | "dew_point_high_time": { 95 | "name": "Ora del punto di rugiada massimo" 96 | }, 97 | "dew_point_low_day": { 98 | "name": "Punto di rugiada minimo (giorno)" 99 | }, 100 | "dew_point_low_time": { 101 | "name": "Ora del punto di rugiada minimo" 102 | }, 103 | "barometric_pressure": { 104 | "name": "Pressione barometrica" 105 | }, 106 | "barometric_pressure_high_day": { 107 | "name": "Pressione barometrica massima (giorno)" 108 | }, 109 | "barometric_pressure_high_time": { 110 | "name": "Ora della pressione barometrica massima" 111 | }, 112 | "barometric_pressure_low_day": { 113 | "name": "Pressione barometrica minima (giorno)" 114 | }, 115 | "barometric_pressure_low_time": { 116 | "name": "Ora della pressione barometrica minima" 117 | }, 118 | "barometric_trend": { 119 | "name": "Tendenza barometrica", 120 | "state": { 121 | "falling_rapidly": "In calo rapido", 122 | "falling_slowly": "In calo lento", 123 | "steady": "Stabile", 124 | "rising_slowly": "In aumento lento", 125 | "rising_rapidly": "In aumento rapido" 126 | } 127 | }, 128 | "humidity_inside": { 129 | "name": "Umidità (interna)" 130 | }, 131 | "humidity": { 132 | "name": "Umidità" 133 | }, 134 | "wind_speed": { 135 | "name": "Velocità del vento" 136 | }, 137 | "wind_speed_average_10min": { 138 | "name": "Velocità media del vento (10 min.)" 139 | }, 140 | "wind_speed_average": { 141 | "name": "Velocità media del vento" 142 | }, 143 | "wind_gust": { 144 | "name": "Raffica di vento" 145 | }, 146 | "wind_gust_day": { 147 | "name": "Raffica di vento (giorno)" 148 | }, 149 | "wind_gust_time": { 150 | "name": "Ora della raffica di vento" 151 | }, 152 | "wind_direction": { 153 | "name": "Direzione del vento" 154 | }, 155 | "wind_direction_average": { 156 | "name": "Direzione media del vento" 157 | }, 158 | "wind_direction_rose": { 159 | "name": "Direzione del vento (rosa dei venti)", 160 | "state": { 161 | "n": "N", 162 | "ne": "NE", 163 | "e": "E", 164 | "se": "SE", 165 | "s": "S", 166 | "sw": "SO", 167 | "w": "O", 168 | "nw": "NO" 169 | } 170 | }, 171 | "wind_direction_rose_average": { 172 | "name": "Direzione media del vento (rosa dei venti)", 173 | "state": { 174 | "n": "N", 175 | "ne": "NE", 176 | "e": "E", 177 | "se": "SE", 178 | "s": "S", 179 | "sw": "SO", 180 | "w": "O", 181 | "nw": "NO" 182 | } 183 | }, 184 | "wind_speed_bft": { 185 | "name": "Velocità del vento (Bft)" 186 | }, 187 | "rain_day": { 188 | "name": "Pioggia (giorno)" 189 | }, 190 | "rain_month": { 191 | "name": "Pioggia (mese)" 192 | }, 193 | "rain_year": { 194 | "name": "Pioggia (anno)" 195 | }, 196 | "rain_rate": { 197 | "name": "Tasso di pioggia" 198 | }, 199 | "rain_rate_day": { 200 | "name": "Tasso di pioggia (giorno)" 201 | }, 202 | "rain_rate_time": { 203 | "name": "Ora del tasso di pioggia" 204 | }, 205 | "uv_level": { 206 | "name": "Livello UV" 207 | }, 208 | "uv_level_day": { 209 | "name": "Livello UV (giorno)" 210 | }, 211 | "uv_level_time": { 212 | "name": "Ora del livello UV" 213 | }, 214 | "solar_radiation": { 215 | "name": "Radiazione solare" 216 | }, 217 | "solar_radiation_day": { 218 | "name": "Radiazione solare (giorno)" 219 | }, 220 | "solar_radiation_time": { 221 | "name": "Ora della radiazione solare" 222 | }, 223 | "battery_voltage": { 224 | "name": "Tensione della batteria" 225 | }, 226 | "forecast_icon": { 227 | "name": "Icona previsioni" 228 | }, 229 | "forecast_rule": { 230 | "name": "Regola Previsioni", 231 | "state": { 232 | "0": "Prevalentemente sereno e più fresco", 233 | "1": "Prevalentemente sereno con poco cambiamento di temperatura", 234 | "2": "Prevalentemente sereno per 12 ore con poco cambiamento di temperatura", 235 | "3": "Prevalentemente sereno per 12-24 ore e più fresco", 236 | "4": "Prevalentemente sereno con poco cambiamento di temperatura", 237 | "5": "Parzialmente nuvoloso e più fresco", 238 | "6": "Parzialmente nuvoloso con poco cambiamento di temperatura", 239 | "7": "Parzialmente nuvoloso con poco cambiamento di temperatura", 240 | "8": "Prevalentemente sereno e più caldo", 241 | "9": "Parzialmente nuvoloso con poco cambiamento di temperatura", 242 | "10": "Parzialmente nuvoloso con poco cambiamento di temperatura", 243 | "11": "Prevalentemente sereno con poco cambiamento di temperatura", 244 | "12": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 24-48 ore", 245 | "13": "Parzialmente nuvoloso con poco cambiamento di temperatura", 246 | "14": "Prevalentemente sereno con poco cambiamento di temperatura", 247 | "15": "Aumento della nuvolosità con poco cambiamento di temperatura. Possibili precipitazioni entro 24 ore", 248 | "16": "Prevalentemente sereno con poco cambiamento di temperatura", 249 | "17": "Parzialmente nuvoloso con poco cambiamento di temperatura", 250 | "18": "Prevalentemente sereno con poco cambiamento di temperatura", 251 | "19": "Aumento della nuvolosità con poco cambiamento di temperatura. Possibili precipitazioni entro 12 ore", 252 | "20": "Prevalentemente sereno con poco cambiamento di temperatura", 253 | "21": "Parzialmente nuvoloso con poco cambiamento di temperatura", 254 | "22": "Prevalentemente sereno con poco cambiamento di temperatura", 255 | "23": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 24 ore", 256 | "24": "Prevalentemente sereno e più caldo. Venti in aumento", 257 | "25": "Parzialmente nuvoloso con poco cambiamento di temperatura", 258 | "26": "Prevalentemente sereno con poco cambiamento di temperatura", 259 | "27": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 12 ore. Venti in aumento", 260 | "28": "Prevalentemente sereno e più caldo. Venti in aumento", 261 | "29": "Aumento della nuvolosità e più caldo", 262 | "30": "Parzialmente nuvoloso con poco cambiamento di temperatura", 263 | "31": "Prevalentemente sereno con poco cambiamento di temperatura", 264 | "32": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 12 ore. Venti in aumento", 265 | "33": "Prevalentemente sereno e più caldo. Venti in aumento", 266 | "34": "Aumento della nuvolosità e più caldo", 267 | "35": "Parzialmente nuvoloso con poco cambiamento di temperatura", 268 | "36": "Prevalentemente sereno con poco cambiamento di temperatura", 269 | "37": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 12 ore. Venti in aumento", 270 | "38": "Parzialmente nuvoloso con poco cambiamento di temperatura", 271 | "39": "Prevalentemente sereno con poco cambiamento di temperatura", 272 | "40": "Prevalentemente sereno e più caldo. Possibili precipitazioni entro 48 ore", 273 | "41": "Prevalentemente sereno e più caldo", 274 | "42": "Parzialmente nuvoloso con poco cambiamento di temperatura", 275 | "43": "Prevalentemente sereno con poco cambiamento di temperatura", 276 | "44": "Aumento della nuvolosità con poco cambiamento di temperatura. Possibili precipitazioni entro 24-48 ore", 277 | "45": "Aumento della nuvolosità con poco cambiamento di temperatura", 278 | "46": "Parzialmente nuvoloso con poco cambiamento di temperatura", 279 | "47": "Prevalentemente sereno con poco cambiamento di temperatura", 280 | "48": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 12-24 ore", 281 | "49": "Parzialmente nuvoloso con poco cambiamento di temperatura", 282 | "50": "Prevalentemente sereno con poco cambiamento di temperatura", 283 | "51": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 12-24 ore. Ventoso", 284 | "52": "Parzialmente nuvoloso con poco cambiamento di temperatura", 285 | "53": "Prevalentemente sereno con poco cambiamento di temperatura", 286 | "54": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 12-24 ore. Ventoso", 287 | "55": "Parzialmente nuvoloso con poco cambiamento di temperatura", 288 | "56": "Prevalentemente sereno con poco cambiamento di temperatura", 289 | "57": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 6-12 ore", 290 | "58": "Parzialmente nuvoloso con poco cambiamento di temperatura", 291 | "59": "Prevalentemente sereno con poco cambiamento di temperatura", 292 | "60": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 6-12 ore. Ventoso", 293 | "61": "Parzialmente nuvoloso con poco cambiamento di temperatura", 294 | "62": "Prevalentemente sereno con poco cambiamento di temperatura", 295 | "63": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 12-24 ore. Ventoso", 296 | "64": "Parzialmente nuvoloso con poco cambiamento di temperatura", 297 | "65": "Prevalentemente sereno con poco cambiamento di temperatura", 298 | "66": "Aumento della nuvolosità e più caldo. Possibili precipitazioni entro 12 ore", 299 | "67": "Parzialmente nuvoloso con poco cambiamento di temperatura", 300 | "68": "Prevalentemente sereno con poco cambiamento di temperatura", 301 | "69": "Aumento della nuvolosità e più caldo. Probabili precipitazioni", 302 | "70": "Schiarite e più fresco. Precipitazioni in esaurimento entro 6 ore", 303 | "71": "Parzialmente nuvoloso con poco cambiamento di temperatura", 304 | "72": "Schiarite e più fresco. Precipitazioni in esaurimento entro 6 ore", 305 | "73": "Prevalentemente sereno con poco cambiamento di temperatura", 306 | "74": "Schiarite e più fresco. Precipitazioni in esaurimento entro 6 ore", 307 | "75": "Parzialmente nuvoloso e più fresco", 308 | "76": "Parzialmente nuvoloso con poco cambiamento di temperatura", 309 | "77": "Prevalentemente sereno e più fresco", 310 | "78": "Schiarite e più fresco. Precipitazioni in esaurimento entro 6 ore", 311 | "79": "Prevalentemente sereno con poco cambiamento di temperatura", 312 | "80": "Schiarite e più fresco. Precipitazioni in esaurimento entro 6 ore", 313 | "81": "Prevalentemente sereno e più fresco", 314 | "82": "Parzialmente nuvoloso con poco cambiamento di temperatura", 315 | "83": "Prevalentemente sereno con poco cambiamento di temperatura", 316 | "84": "Aumento delle nuvole con pochi cambiamenti di temperatura. Precipitazioni possibili entro 24 ore", 317 | "85": "Per lo più nuvoloso e più fresco. Precipitazioni in corso", 318 | "86": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 319 | "87": "Per lo più sereno con pochi cambiamenti di temperatura", 320 | "88": "Per lo più nuvoloso e più fresco. Precipitazioni probabili", 321 | "89": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni in corso", 322 | "90": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni probabili", 323 | "91": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 324 | "92": "Per lo più sereno con pochi cambiamenti di temperatura", 325 | "93": "Aumento delle nuvole e più fresco. Precipitazioni possibili e ventoso entro 6 ore", 326 | "94": "Aumento delle nuvole con pochi cambiamenti di temperatura. Precipitazioni possibili e ventoso entro 6 ore", 327 | "95": "Per lo più nuvoloso e più fresco. Precipitazioni in corso. Aumento del vento", 328 | "96": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 329 | "97": "Per lo più sereno con pochi cambiamenti di temperatura", 330 | "98": "Per lo più nuvoloso e più fresco. Precipitazioni probabili. Aumento del vento", 331 | "99": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni in corso. Aumento del vento", 332 | "100": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni probabili. Aumento del vento", 333 | "101": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 334 | "102": "Per lo più sereno con pochi cambiamenti di temperatura", 335 | "103": "Aumento delle nuvole e più fresco. Precipitazioni possibili entro 12-24 ore. Possibile cambio di direzione del vento verso W, NW o N", 336 | "104": "Aumento delle nuvole con pochi cambiamenti di temperatura. Precipitazioni possibili entro 12-24 ore. Possibile cambio di direzione del vento verso W, NW o N", 337 | "105": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 338 | "106": "Per lo più sereno con pochi cambiamenti di temperatura", 339 | "107": "Aumento delle nuvole e più fresco. Precipitazioni possibili entro 6 ore. Possibile cambio di direzione del vento verso W, NW o N", 340 | "108": "Aumento delle nuvole con pochi cambiamenti di temperatura. Precipitazioni possibili entro 6 ore. Possibile cambio di direzione del vento verso W, NW o N", 341 | "109": "Per lo più nuvoloso e più fresco. Precipitazioni che termineranno entro 12 ore. Possibile cambio di direzione del vento verso W, NW o N", 342 | "110": "Per lo più nuvoloso e più fresco. Possibile cambio di direzione del vento verso W, NW o N", 343 | "111": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni che termineranno entro 12 ore. Possibile cambio di direzione del vento verso W, NW o N", 344 | "112": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Possibile cambio di direzione del vento verso W, NW o N", 345 | "113": "Per lo più nuvoloso e più fresco. Precipitazioni che termineranno entro 12 ore. Possibile cambio di direzione del vento verso W, NW o N", 346 | "114": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 347 | "115": "Per lo più sereno con pochi cambiamenti di temperatura", 348 | "116": "Per lo più nuvoloso e più fresco. Precipitazioni possibili entro 24 ore. Possibile cambio di direzione del vento verso W, NW o N", 349 | "117": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni che termineranno entro 12 ore. Possibile cambio di direzione del vento verso W, NW o N", 350 | "118": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni possibili entro 24 ore. Possibile cambio di direzione del vento verso W, NW o N", 351 | "119": "Schiarite, più fresco e ventoso. Precipitazioni che termineranno entro 6 ore", 352 | "120": "Schiarite, più fresco e ventoso", 353 | "121": "Per lo più nuvoloso e più fresco. Precipitazioni che termineranno entro 6 ore. Vento con possibile cambio di direzione verso W, NW o N", 354 | "122": "Per lo più nuvoloso e più fresco. Vento con possibile cambio di direzione verso W, NW o N", 355 | "123": "Schiarite, più fresco e ventoso", 356 | "124": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 357 | "125": "Per lo più sereno con pochi cambiamenti di temperatura", 358 | "126": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni possibili entro 12 ore. Ventoso", 359 | "127": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 360 | "128": "Per lo più sereno con pochi cambiamenti di temperatura", 361 | "129": "Aumento delle nuvole e più fresco. Precipitazioni possibili entro 12 ore, forse forti a volte. Ventoso", 362 | "130": "Per lo più nuvoloso e più fresco. Precipitazioni che termineranno entro 6 ore. Ventoso", 363 | "131": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 364 | "132": "Per lo più sereno con pochi cambiamenti di temperatura", 365 | "133": "Per lo più nuvoloso e più fresco. Precipitazioni possibili entro 12 ore. Ventoso", 366 | "134": "Per lo più nuvoloso e più fresco. Precipitazioni che termineranno entro 12-24 ore", 367 | "135": "Per lo più nuvoloso e più fresco", 368 | "136": "Per lo più nuvoloso e più fresco. Precipitazioni in corso, possibilmente forti a volte. Ventoso", 369 | "137": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 370 | "138": "Per lo più sereno con pochi cambiamenti di temperatura", 371 | "139": "Per lo più nuvoloso e più fresco. Precipitazioni possibili entro 6-12 ore. Ventoso", 372 | "140": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni in corso, possibilmente forti a volte. Ventoso", 373 | "141": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 374 | "142": "Per lo più sereno con pochi cambiamenti di temperatura", 375 | "143": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni possibili entro 6-12 ore. Ventoso", 376 | "144": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 377 | "145": "Per lo più sereno con pochi cambiamenti di temperatura", 378 | "146": "Aumento delle nuvole con pochi cambiamenti di temperatura. Precipitazioni possibili entro 12 ore, forse forti a volte. Ventoso", 379 | "147": "Per lo più nuvoloso e più fresco. Ventoso", 380 | "148": "Per lo più nuvoloso e più fresco. Precipitazioni in corso, possibilmente forti a volte. Ventoso", 381 | "150": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 382 | "151": "Per lo più sereno con pochi cambiamenti di temperatura", 383 | "152": "Per lo più nuvoloso e più fresco. Precipitazioni probabili, forse forti a volte. Ventoso", 384 | "153": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni in corso, possibilmente forti a volte. Ventoso", 385 | "154": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni probabili, forse forti a volte. Ventoso", 386 | "155": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 387 | "156": "Per lo più sereno con pochi cambiamenti di temperatura", 388 | "157": "Aumento delle nuvole e più fresco. Precipitazioni possibili entro 6 ore. Ventoso", 389 | "158": "Aumento delle nuvole con pochi cambiamenti di temperatura. Precipitazioni possibili entro 6 ore. Ventoso", 390 | "159": "Aumento delle nuvole e più fresco. Precipitazioni in corso. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 391 | "160": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 392 | "161": "Per lo più sereno con pochi cambiamenti di temperatura", 393 | "162": "Per lo più nuvoloso e più fresco. Precipitazioni probabili. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 394 | "163": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni in corso. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 395 | "164": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni probabili. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 396 | "165": "Aumento delle nuvole e più fresco. Precipitazioni possibili entro 6 ore. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 397 | "166": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 398 | "167": "Per lo più sereno con pochi cambiamenti di temperatura", 399 | "168": "Aumento delle nuvole e più fresco. Precipitazioni possibili entro 6 ore. Possibile cambio di direzione del vento verso W, NW o N", 400 | "169": "Aumento delle nuvole con pochi cambiamenti di temperatura. Precipitazioni possibili entro 6 ore. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 401 | "170": "Aumento delle nuvole con pochi cambiamenti di temperatura. Precipitazioni possibili entro 6 ore. Possibile cambio di direzione del vento verso W, NW o N", 402 | "171": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 403 | "172": "Per lo più sereno con pochi cambiamenti di temperatura", 404 | "173": "Aumento delle nuvole e più fresco. Precipitazioni possibili entro 6 ore. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 405 | "174": "Aumento delle nuvole con pochi cambiamenti di temperatura. Precipitazioni possibili entro 6 ore. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 406 | "175": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 407 | "176": "Per lo più sereno con pochi cambiamenti di temperatura", 408 | "177": "Aumento delle nuvole e più fresco. Precipitazioni possibili entro 12-24 ore. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 409 | "178": "Aumento delle nuvole con pochi cambiamenti di temperatura. Precipitazioni possibili entro 12-24 ore. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 410 | "179": "Per lo più nuvoloso e più fresco. Precipitazioni possibilmente forti a volte e che termineranno entro 12 ore. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 411 | "180": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 412 | "181": "Per lo più sereno con pochi cambiamenti di temperatura", 413 | "182": "Per lo più nuvoloso e più fresco. Precipitazioni possibili entro 6-12 ore, forse forti a volte. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 414 | "183": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni che termineranno entro 12 ore. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 415 | "184": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni possibili entro 6-12 ore, forse forti a volte. Ventoso con possibile cambio di direzione del vento verso W, NW o N", 416 | "185": "Per lo più nuvoloso e più fresco. Precipitazioni in corso", 417 | "186": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 418 | "187": "Per lo più sereno con pochi cambiamenti di temperatura", 419 | "188": "Per lo più nuvoloso e più fresco. Precipitazioni probabili, ventoso con possibile cambio di direzione del vento verso W, NW o N", 420 | "189": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni in corso", 421 | "190": "Per lo più nuvoloso con pochi cambiamenti di temperatura. Precipitazioni probabili", 422 | "191": "Parzialmente nuvoloso con pochi cambiamenti di temperatura", 423 | "192": "Per lo più sereno con pochi cambiamenti di temperatura", 424 | "193": "Per lo più nuvoloso e più fresco. Precipitazioni possibili entro 12 ore, forse forti a volte. Ventoso", 425 | "194": "LA PREVISIONE RICHIEDE 3 ORE DI DATI RECENTI", 426 | "195": "Per lo più sereno e più fresco" 427 | } 428 | }, 429 | "rain_collector": { 430 | "name": "Collettore di Pioggia" 431 | }, 432 | "rain_storm": { 433 | "name": "Tempesta di Pioggia" 434 | }, 435 | "rain_storm_start_date": { 436 | "name": "Data di Inizio Tempesta di Pioggia" 437 | }, 438 | "extra_temperature_1": { 439 | "name": "Temperatura Extra 1" 440 | }, 441 | "extra_temperature_2": { 442 | "name": "Temperatura Extra 2" 443 | }, 444 | "extra_temperature_3": { 445 | "name": "Temperatura Extra 3" 446 | }, 447 | "extra_temperature_4": { 448 | "name": "Temperatura Extra 4" 449 | }, 450 | "extra_temperature_5": { 451 | "name": "Temperatura Extra 5" 452 | }, 453 | "extra_temperature_6": { 454 | "name": "Temperatura Extra 6" 455 | }, 456 | "extra_temperature_7": { 457 | "name": "Temperatura Extra 7" 458 | }, 459 | "extra_humidity_1": { 460 | "name": "Umidità Extra 1" 461 | }, 462 | "extra_humidity_2": { 463 | "name": "Umidità Extra 2" 464 | }, 465 | "extra_humidity_3": { 466 | "name": "Umidità Extra 3" 467 | }, 468 | "extra_humidity_4": { 469 | "name": "Umidità Extra 4" 470 | }, 471 | "extra_humidity_5": { 472 | "name": "Umidità Extra 5" 473 | }, 474 | "extra_humidity_6": { 475 | "name": "Umidità Extra 6" 476 | }, 477 | "extra_humidity_7": { 478 | "name": "Umidità Extra 7" 479 | }, 480 | "latitude": { 481 | "name": "Latitudine" 482 | }, 483 | "longitude": { 484 | "name": "Longitudine" 485 | }, 486 | "elevation": { 487 | "name": "Altitudine" 488 | }, 489 | "last_readout_duration": { 490 | "name": "Durata dell'Ultima Lettura" 491 | }, 492 | "sunrise": { 493 | "name": "Alba" 494 | }, 495 | "sunset": { 496 | "name": "Tramonto" 497 | } 498 | }, 499 | "binary_sensor": { 500 | "is_raining": { 501 | "name": "Sta Piovendo" 502 | } 503 | } 504 | }, 505 | "services": { 506 | "set_davis_time": { 507 | "name": "Imposta ora Davis", 508 | "description": "Imposta l'orario della stazione meteorologica Davis" 509 | }, 510 | "get_davis_time": { 511 | "name": "Ottieni ora Davis", 512 | "description": "Ottieni l'orario della stazione meteorologica Davis" 513 | }, 514 | "get_raw_data": { 515 | "name": "Ottieni dati grezzi", 516 | "description": "Ottieni i dati grezzi non elaborati dall'ultimo recupero" 517 | }, 518 | "get_info": { 519 | "name": "Ottieni informazioni", 520 | "description": "Ottieni informazioni su firmware e diagnostica" 521 | }, 522 | "set_yearly_rain": { 523 | "name": "Imposta pioggia annuale", 524 | "description": "Imposta la pioggia annuale in clic", 525 | "fields": { 526 | "rain_clicks": { 527 | "name": "Clic pioggia", 528 | "description": "Pioggia in clic (a seconda della configurazione un clic = 0,01\" o 0,2 mm)" 529 | } 530 | } 531 | }, 532 | "set_archive_period": { 533 | "name": "Imposta periodo di archivio", 534 | "description": "Imposta il periodo di archivio in minuti. ATTENZIONE: tutti i dati di archivio salvati verranno cancellati!!!", 535 | "fields": { 536 | "archive_period": { 537 | "name": "Periodo di archivio", 538 | "description": "Periodo di archivio in minuti" 539 | } 540 | } 541 | }, 542 | "set_rain_collector": { 543 | "name": "Imposta raccoglitore di pioggia", 544 | "description": "Imposta il raccoglitore di pioggia (0,01\", 0,2 mm o 0,1 mm)", 545 | "fields": { 546 | "rain_collector": { 547 | "name": "Raccoglitore di pioggia", 548 | "description": "Impostazione del raccoglitore di pioggia" 549 | } 550 | } 551 | } 552 | } 553 | } --------------------------------------------------------------------------------