Skip to content
Snippets Groups Projects
SensorLineChartTile.py 2.81 KiB
Newer Older
  • Learn to ignore specific revisions
  • Robert Goldmann's avatar
    Robert Goldmann committed
    import os
    
    Robert Goldmann's avatar
    Robert Goldmann committed
    import uuid
    
    from datetime import datetime, timedelta
    
    Robert Goldmann's avatar
    Robert Goldmann committed
    from typing import Dict
    
    from flask import Blueprint
    
    
    from logic import Constants
    
    Robert Goldmann's avatar
    Robert Goldmann committed
    from logic.service.ServiceManager import ServiceManager
    from logic.tile.Tile import Tile
    
    
    LOGGER = logging.getLogger(Constants.APP_NAME)
    
    
    Robert Goldmann's avatar
    Robert Goldmann committed
    
    class SensorLineChartTile(Tile):
    
        EXAMPLE_SETTINGS = {
            "title": "My Room",
            "url": "http://127.0.0.1:10003",
            "sensorID": 1,
    
    Robert Goldmann's avatar
    Robert Goldmann committed
            "numberOfHoursToShow": 4,
            "lineColor": "rgba(254, 151, 0, 1)",
            "fillColor": "rgba(254, 151, 0, 0.2)"
    
    Robert Goldmann's avatar
    Robert Goldmann committed
        UNIT_BY_SENSOR_TYPE = {
            'temperature': '&degC',
            'humidity': '%'
        }
    
        ICON_BY_SENSOR_TYPE = {
            'temperature': 'wi-thermometer',
            'humidity': 'wi-humidity'
        }
    
    
        DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
    
    
    Robert Goldmann's avatar
    Robert Goldmann committed
        def __init__(self, uniqueName: str, settings: Dict, intervalInSeconds: int):
            super().__init__(uniqueName, settings, intervalInSeconds)
    
        def fetch(self, pageName: str) -> Dict:
            storageLeafService = ServiceManager.get_instance().get_service_by_type_name('StorageLeafService')
            cacheKey = f'{pageName}_{self._uniqueName}'
    
    
            serviceSettings = {
                'url': self._settings['url'],
                'sensorID': self._settings['sensorID'],
    
                'fetchType': 'all',
                'fetchLimit': 1000,
    
            }
            return storageLeafService.get_data(cacheKey, self._intervalInSeconds, serviceSettings)
    
    Robert Goldmann's avatar
    Robert Goldmann committed
    
        def render(self, data: Dict) -> str:
            sensorType = data['sensorInfo']['type']
            unit = self.UNIT_BY_SENSOR_TYPE.get(sensorType, '')
            icon = self.ICON_BY_SENSOR_TYPE.get(sensorType, '')
    
    
            timeLimit = datetime.now() - timedelta(hours=self._settings['numberOfHoursToShow'])
    
            x = []
            y = []
            for measurement in data['sensorValue']:
                timestamp = measurement['timestamp']
                parsedTime = datetime.strptime(timestamp, self.DATE_FORMAT)
                if parsedTime < timeLimit:
                    break
                x.append(timestamp)
                y.append(measurement['value'])
    
            LOGGER.debug(f'Filtered {len(data["sensorValue"])} to {len(x)} for sensor {self._settings["sensorID"]}')
    
    
            x.reverse()
            y.reverse()
    
    Robert Goldmann's avatar
    Robert Goldmann committed
            latest = y[0] if y else ''
    
    Robert Goldmann's avatar
    Robert Goldmann committed
            return Tile.render_template(os.path.dirname(__file__), __class__.__name__,
    
    Robert Goldmann's avatar
    Robert Goldmann committed
                                        x=x, y=y, latest=latest, unit=unit,
                                        icon=icon, title=self._settings['title'],
                                        lineColor=self._settings['lineColor'],
                                        fillColor=self._settings['fillColor'],
                                        chartId=str(uuid.uuid4()))
    
    Robert Goldmann's avatar
    Robert Goldmann committed
    
        def construct_blueprint(self, *args, **kwargs):
            return Blueprint('simpleSensorValue_{}'.format(self.get_uniqueName()), __name__)