meteoalarm-card
Version:
Meteoalarm card for Home Assistant Lovelace UI
96 lines (85 loc) • 2.96 kB
text/typescript
import { HassEntity } from 'home-assistant-js-websocket';
import {
MeteoalarmAlert,
MeteoalarmEventType,
MeteoalarmIntegration,
MeteoalarmIntegrationEntityType,
MeteoalarmIntegrationMetadata,
MeteoalarmLevelType,
} from '../types';
const STATE_GREEN = 'Vert';
const STATE_YELLOW = 'Jaune';
const STATE_ORANGE = 'Orange';
const STATE_RED = 'Rouge';
// The list of event alert is located here
// https://github.com/hacf-fr/meteofrance-api/blob/master/src/meteofrance_api/const.py
const EVENT_WIND = 'Vent violent';
const EVENT_RAIN_FLOOD = 'Pluie-inondation';
const EVENT_THUNDERSTORMS = 'Orages';
const EVENT_FLOOD = 'Inondation';
const EVENT_SNOW_ICE = 'Neige-verglas';
const EVENT_HIGH_TEMPERATURE = 'Canicule';
const EVENT_LOW_TEMPERATURE = 'Grand-froid';
const EVENT_AVALANCHES = 'Avalanches';
const EVENT_COASTAL = 'Vagues-submersion';
const EVENT_TYPES = {
[]: MeteoalarmEventType.Wind,
[]: MeteoalarmEventType.Flooding,
[]: MeteoalarmEventType.Thunderstorms,
[]: MeteoalarmEventType.Flooding,
[]: MeteoalarmEventType.SnowIce,
[]: MeteoalarmEventType.HighTemperature,
[]: MeteoalarmEventType.LowTemperature,
[]: MeteoalarmEventType.Avalanches,
[]: MeteoalarmEventType.CoastalEvent,
};
const LEVEL_TYPES = {
[]: MeteoalarmLevelType.Yellow,
[]: MeteoalarmLevelType.Orange,
[]: MeteoalarmLevelType.Red,
};
export default class MeteoFrance implements MeteoalarmIntegration {
public get metadata(): MeteoalarmIntegrationMetadata {
return {
key: 'meteofrance',
name: 'Météo-France',
type: MeteoalarmIntegrationEntityType.SingleEntity,
returnHeadline: false,
returnMultipleAlerts: true,
entitiesCount: 1,
monitoredConditions: [
MeteoalarmEventType.Wind,
MeteoalarmEventType.Flooding,
MeteoalarmEventType.Thunderstorms,
MeteoalarmEventType.Flooding,
MeteoalarmEventType.SnowIce,
MeteoalarmEventType.HighTemperature,
MeteoalarmEventType.LowTemperature,
MeteoalarmEventType.Avalanches,
MeteoalarmEventType.CoastalEvent,
],
};
}
public supports(entity: HassEntity): boolean {
return (
entity.attributes.attribution == 'Data provided by Météo-France' &&
entity.attributes[EVENT_WIND] != undefined
);
}
public alertActive(entity: HassEntity): boolean {
return entity.state !== STATE_GREEN;
}
public getAlerts(entity: HassEntity): MeteoalarmAlert[] {
const result: MeteoalarmAlert[] = [];
for (const [eventName, event] of Object.entries(EVENT_TYPES)) {
const eventLevel = entity.attributes[eventName];
if (!eventLevel) continue;
if (eventLevel === STATE_GREEN) continue;
result.push({
level: LEVEL_TYPES[eventLevel],
event: event,
});
}
return result;
}
}