Git Product home page Git Product logo

history-explorer-card's Introduction

This custom card was declared end-of-life and is not maintained anymore.


hacs_badge   bymecoffee

History explorer card

This is a custom history card for Home Assistant. This card offers a highly interactive and configurable way to view the history of your entities in HA. The card uses asynchronous stream caching and adaptive data decimation to hide the high latency of HA's history database accesses and tries to make it into a smooth interactive experience.

history-panel-sample

Usage

The history explorer card can be configured interactively through the UI or manually through YAML. The card can contain one or multiple charts, every chart can display the history of one or multiple entities. Currently the card supports line charts for numerical entities and timeline charts for non-numerical ones. The order the charts are displayed in the history, as well as the colors used for charts and timeline states are all fully configurable.

history-explorer-demo.mp4

When the card is opened, it will display the history of the configured entities for the last 24 hours starting at the current date and time. On the top left you will find the date selector previous and next buttons, use them to quickly browse through the days. Your can use the right side time range selector (dropdown or plus / minus buttons) to zoom into or out of the history. You can also use the interactive zoom mode (magnifying glass icon) to select a region on a graph to zoom into. Another convenient way to zoom in and out of the graphs is by using the mouse wheel while holding the CTRL key.

Click or tap on a graph and drag left or right to slide it through time. The card will stream in the database as you move along. If you have a slow DB (like on an SD card), you may see empty parts on the chart that will progressively fill as the data comes in. The larger the shown time range, the more the effect is visible. So scrolling through entire weeks will generate more database accesses than scrolling through days or hours at a time, especially on slower CPUs, like phones.

Once you release the mouse button after dragging (or release your finger from the chart), the card will automatically readjust the y axes on all charts to better reflect the new data. The card will also synchronize all other charts in the history to the same point in time. That way you will always see the same time range on all your data and everything will be aligned.

Clicking the date selector will bring you back to the current date and time without changing your zoom level. A double click on the date selector will bring your back and also reset your zoom to the configured default range.

Like in the native HA history panel, you can hover over the chart line or state timelines to get a tooltip of the selected values or state.

Overriding the HA more info history

The card is capable of replacing the history graph in the HA more info popup that appears when you click an entity anywhere on your dashboard.

Please refer to this post on the HA forums for more information on how to enable and configure the option.

Install and configuration

HACS

The history explorer card is now part of the default HACS Home Assistant Community Store. This is the preferred way to install this card.

Manual install

  1. Download the history-explorer-card.js file and copy it into your config/www folder
  2. Add a resource reference to it. On the HA UI, navigate to Configuration -> Dashboards -> Resources. Visit the Registering resources page on the Home Assistant support site for more information.
  3. Click on the + Add Resource button
  4. Type /local/history-explorer-card.js into the URL field and make sure the resource type field says Javascript Module
  5. Hit create

You can now add the card to your dashboard as usual. You may have to refresh the page in your browser once after adding the card to properly initialize it.

Interactive configuration

The entities visible on the history explorer card can be defined in the card configuration or they can be added or removed on the fly through the card UI without changing the configuration. Both modes can be combined. The entities defined in the YAML will be displayed first and will always be visible when the dashboard is opened. Dynamically added entities will be displayed next. The entities you add or remove over the UI are remembered in your browsers local storage, so you don't to add them every time you reopen the HA page.

You can manage your dynamically configured entities like this:

history-panel-otf-entities

If you want to manage all your entities dynamically, you will need to supply an empty YAML. You can still add global configuration settings.

type: custom:history-explorer-card
graphs:

By default the UI entity dropdown will list all entities known to HA. This can be a little overwhelming if you have lots. Alternatively the card can only list entities that are actually recorded and available in the database. Doing this will require a database access which can take a few seconds on larger installs. You can use the card normally while the list is loading in the background. The add entity list will become available as soon as the data is loaded. To turn on this mode use the following config in your YAML:

type: custom:history-explorer-card
recordedEntitiesOnly: true

The entity entry field accepts the * wildcard and can automatically add multiple entities that match the provided pattern. Some examples:

person.*      - Add all entities from the person domain
*door*        - Add all entities that contain the term ‘door’ in the name, regardless of domain
sensor.*door* - Add all entities that contain the term ‘door’ in the name, but only from the sensor domain
*             - Add all available entities in the list

The entities shown in the list can be further filtered using the filterEntities option. The same wildcard syntax applies here. For example:

type: custom:history-explorer-card
filterEntities: 'binary_sensor.*'   # Show only binary sensors in the selector dropdown list
filterEntities:                     # Or use multiple filters, entities matching any of the filters will be added
  - '*power*'
  - 'sensor.*energy*'

Dynamically added entities can be individually removed by clicking the x close button next to them or all together using the option in the entity action dropdown menu:

image

Default view and time ranges

When the dashboard is opened, the card will show the last 24 hours by default. You can select a different default time range in the YAML. Use m, h, d, and w to denote minutes, hours, days and weeks respectively. For longer time scale, o and y denote months and year. Currently the maximum range is one year. If no postfix is given, hours are assumed.

type: custom:history-explorer-card
defaultTimeRange: 4h     # show the last 4 hours when opening the card
defaultTimeRange: 2d     # or 2 days...
defaultTimeRange: 15m    # or 15 minutes...
defaultTimeRange: 3w     # or 3 weeks
defaultTimeRange: 6o     # or 6 months
defaultTimeRange: 1y     # or 1 year

By default the card will open the graphs with the current date and time aligned to the right of the chart. You can define a custom time offset using the defaultTimeOffset setting which will be applied when you open the card or click the date button. Both relative time offsets (denoted by lower case time identifiers such as h,d,w,o,y) and offsets snapped to the current hour, day, month or year are supported. The latter will use upper case time identifiers H,D,O,Y. For example:

type: custom:history-explorer-card
defaultTimeOffset: 1h       # Add 1 hour of empty space after the current time
defaultTimeOffset: -1d      # Show the previous days' data
defaultTimeOffset: 1D       # Show the current day from midnight to midnight
defaultTimeOffset: 1O       # Show the entire current month, starting at the 1st

Auto refresh

By default the card will not refresh on its own when sensor values change. It can be manually refreshed by reloading the page. If you would like your card to automatically reflect changing values on the fly, two strategies can be enabled. Both can be combined if needed.

Automatic refresh will monitor the entities that are displayed in your graphs for changes and refresh the graphs as needed. This strategy will usually cover the most common use cases and is recommended if you have just a few entities display in your history explorer card and if these entities don't change too often.

type: custom:history-explorer-card
refresh:
  automatic: true

If you have many fast changing entities displayed in your graphs, then auto refresh can strain your database bandwidth due to the constant requests. In this case it is better to use a regular update interval, independent of the sensor changes. The following example will refresh the card at a fixed rate, every 30 seconds. You will need to reload the page after changing the refresh interval.

type: custom:history-explorer-card
refresh:
  interval: 30

Grouping multiple entities into a single graph

For line graphs, each dynamically added entity will be displayed in its own graph by default. If you prefer having entities with compatible units of measure grouped into a single graph, then you can override this default behavior with the following YAML setting:

type: custom:history-explorer-card
combineSameUnits: true

Timeline graphs will always automatically group if possible. Graphs defined manually in the YAML will never auto-group, their grouping can be controlled in the YAML.

image

Legend / entity labels

You can hide an entity in a graph by clicking its label on the top. Click it a second time to make the entity visible again. An entity can be hidden by default using the hidden property in your entityOptions or in the manual YAML (see the advanced YAML example at the end of this readme).

If you would like to entirely remove the labels from the UI, use the legendVisible flag:

type: custom:history-explorer-card
legendVisible: false

Line interpolation modes

Three modes are available for line charts: cubic splines, line segments and stepped. Cubic splines, the default, are the smoothest but can sometimes overshoot after steep gradients followed by longer constant sections. Line segments will connect your data points using straight lines. They are less smooth, but can't overshoot. Stepped mode will show the raw quantized data.

image

You can specify the line mode in the YAML global settings. Possible options are curves, lines or stepped. The default if the option is not present is curves.

type: custom:history-explorer-card
lineMode: lines

The line mode can also be set for fixed entities defined in the YAML and for dynamic entities or device classes (see below).

A small margin will be added to the top and bottom of line charts, so to give some headroom to curves should they overshoot and make it visually nicer. You can turn off these margins if you don't want the additional space. It's recommended to use lines or stepped mode if you remove both margins to avoid curves overshooting outside of the chart area:

type: custom:history-explorer-card
axisAddMarginMin: false
axisAddMarginMax: false

Y axis scaling

By default the min/max scales for the Y axis are adjusted automatically to the data you are currently viewing.

Pressing the axis lock icon will temporarily disable autoscaling and lock the Y axis to the currently active range. Pressing it again will revert back to the defaults for the graph:

image

The Y axis can also be interactively modified. Pressing and holding the SHIFT key will unlock interactive zooming and panning of the graph in vertical direction. Pressing your mouse button while holding SHIFT over a graph will allow you to drag the graph into both horizontal and vertical directions. Using the mousewheel while holding SHIFT will change the Y axis scale. When interacting with the Y axis, the axis lock icon will automatically be enabled. Click the icon to go back to the default scale at any time.

You can override the automatic y axis range with your own values for both fixed graphs defined in the YAML, as well as for dynamically added entities or device classes. The minimum and maximum Y values, as well as the tick step size can be manually overridden. Each setting works independently. You can, for example override the step size only, but leave the range on automatic.

graphs:
  - type: line
    options:
      ymin: 0       # Minimum Y locked to 0
      ymax: 40      # Maximum Y locked to 40
      ystepSize: 5  # Step size is fixed at 5

See the customizing dynamic line graphs section and the advanced YAML example below for more examples.

Rounding

The rounding precision used for displaying data point values on the tooltip in line charts can be defined globally through the rounding key followed by the amount of fractional digits. The default is 2 digits.

type: custom:history-explorer-card
rounding: 4

Line graphs and unavailable data

If your history data contains an unavailable state, for example if a sensor went offline for a while, then the card will interpolate over the missing data in line charts to avoid gaps by default. If you prefer to keep the unavailable state visible, so to easily see when and how often your sensors disconnected or became unavailable, then you can disable the interpolation using the YAML below. Timeline charts will always show unavailable or unknown states, regardless of how this parameter is set.

type: custom:history-explorer-card
showUnavailable: true

Showing current sensor values

The current sensor values can be optionally shown next to their label names in line or bar graphs:

type: custom:history-explorer-card
showCurrentValues: true

image

Data decimation

The card will automatically reduce the data shown in the charts and remove details that would not be visible or useful at a given time range. For example, if you view a per-hour history, nothing will be removed and you will be able to explore the raw data, point by point. If you view an entire week at once, there's no need to show data that changed every few seconds, you couldn't even see it. The card will simplify the curves and make the experience a lot faster that way.

This feature can be turned off in the options if you want, either globally or by entity. Two different decimation algorithms are available. By default, a fast approximate one is used, offering highest rendering performance and a relatively good approximation of the graph shape at lower zoom levels. Optionally, an accurate decimation mode can be enabled. It offers accurate representation of local minima and maxima, at all zoom ranges. But rendering will be slower. Decimation mode can be selected globally at the card level or per entity.

type: custom:history-explorer-card
decimation: false       # Disable decimation, the raw sensor data will be used at all scales (very slow).
decimation: fast        # Fast approximate decimation, good balance between speed and accuracy. The default.
decimation: accurate    # Accurate minmax preserving at all scales.

image

Decimation works on state timelines by merging very small state changes into 'multiple' sections when they can't be seen individually anymore. Zoom into the timeline and the details will appear. The color used for the multiple sections can be adjusted per graph.

history-panel-timeline-multiple

Displaying individual samples

Holding the Alt key (or Option key on Mac) while hovering over a graph will reveal all the individual samples making up the line chart:

image

If you would like to permanently show individual samples for certain graphs, this can be configured per graph using the showSamples option:

type: custom:history-explorer-card
entityOptions:
  humidity:
    showSamples: true      # always show samples for humidity graphs
graphs:
  - type: line
    options:
      showSamples: true    # explicitly show samples for this manually defined graph
    entities:
      - entity: sensor.outside_temperature

Bar graphs for total increasing entities

Entities that represent a total (monotonically increasing or net metering) can be visualized as adaptive bar charts. This applies to entities such as, for example, consumed energy, water or gas, rainfall, or network data usage. The data is visualized over a time interval (10 minutes, hourly, daily or monthly) that can be toggled on the fly and independently for each graph.

image

Bar charts use the bar chart type and can be used in both dynamically and statically added entities by setting the type accordingly. When dynamically adding an entity with a state class of total_increasing, then the bar chart type is automatically used. If the entity does not have this state class, then its type must be explicitly set to bar.

Use the selector on the top right of the graph to choose the time interval your data is displayed at. You can add the same entity multiple times in separate graphs with different intervals. Selecting as line will show the raw data of the entity as a line graph. The default interval is hourly. It can be overridden using the interval option. Possible values are 10m, hourly, daily or monthly.

Example configuration of a bar chart display for the entity sensor.rain_amount when added dynamically. The default interval is 10 minutes and the type is explicitly set to bar. The latter is not needed if the entity has a total_increasing state class.

entityOptions:
  sensor.rain_amount:
    type: bar
    color: '#3e95cd'
    interval: 10m     # Default interval for this entity can be 10m, hourly, daily or monthly

Bar graphs can be manually added in the YAML too. Multiple entities can be combined into a single graph. The bars for each entity will then be displayed side by side:

image

graphs:
  - type: bar
    title: Rainfall
    options:
      interval: daily
      stacked: false
    entities:
      - entity: sensor.rain_amount
        scale: 0.5
      - entity: sensor.rain_amount

Set the stacked option to true to display the bars on top of each other rather than side by side:

image

Color ranges

Bar graphs can be color coded depending on the value they display rather than having a single color. The color range thresholds are provided as value pairs under the color key. You can provide as many thresholds as you want. Both dynamic and YAML defined graphs are supported.

entityOptions:
  energy:           # apply this color coding to all sensors of the energy device class (also works for domains or individual entities)
    type: bar
    color:
      '0.0': blue   # Bar is blue between below and up to 1.0 kWh
      '1.0': green  # Bar is green between 1.0 - 1.5 kWh
      '1.5': red    # Bar is red at 1.5 kWh and above

image

Net metering

By default bar graphs will adhere to the standards defined by HA for the total_increasing state class, meaning that a decrease of the data value will be interpreted as a meter reset. This prevents the use with net metering sensors, as those can have decreasing totals as part of their operation. If you would like to visualize total accumulating sensors that can decrease (net metering), use the netBars setting (available in both entityOptions and manual predefined YAML). You can mix net metered and non-net metered (total increasing) sensors in the same graph.

graphs:
  - type: bar
    entities:
      - entity: sensor.net_meter
        netBars: true
        color:
          '-1000': red   # Red for negative bars
          '0.0': green   # Green for positive bars

NOTE: This is very similar to the way HA implements the total state class and you can visualize total net metered sensors with this option. However, the last_reset attribute is not implemented in this card, so the bar just following a meter reset will be wrong.

Timeline charts

Timeline charts are typically used to visualize entities with non-numerical data. When you dynamically add an entity without a unit of measure, then the card will automatically use a timeline chart to visualize its states.

image

By default the state texts shown in a timeline chart represent the raw underlying state as used by Home Assistant internally. For example, binary sensors will show their state as onor off, regardless of their device class. If you prefer to see device class dependent states (like Opened/Closed for doors or Detected/Clear for motion sensors), you can change the state text display mode as shown in the YAML below:

type: custom:history-explorer-card
stateTextMode: raw    # Show the raw untranslated state names, this is the default
stateTextMode: auto   # Show the automatically translated device class dependent state names
stateTextMode: hide   # Hide all state text labels

Customizing state colors

The default colors used for the states shown on timeline graphs can be customized in many different ways. Customizing is done by adding the statesColor key to the card YAML. Colors act on individual entities, entire device classes, domains or global states. You can, for example, have distinct colors for the on and off states of your motion sensors and your door sensors, even if they're both binary sensors.

The card accepts all normal HTML color definition strings as well as CSS variables. The latter need to be provided as-is (for example --primary-color, without the CSS var function).

The following example will turn the on state of all door sensors blue and the on state of all motion sensors yellow. The on state of other sensor device classes will not be affected. They will inherit their colors from either an entity specific, a device class or domain wide or a global color rule, in that order (see below). You specify the device class followed by a dot and the state you'd like to customize:

type: custom:history-explorer-card
stateColors:
  door.on: blue
  motion.on: yellow

You can also specify state colors for an entire domain. The following example will turn the off state for all binary sensors that don't have a color defined for their device class purple and the home state of the person domain green:

type: custom:history-explorer-card
stateColors:
  binary_sensor.off: purple
  person.home: 'rgb(0,255,0)'

Finally, you can color a specific state globally through all device classes and domains. This can be used as a generic fallback. The following example colors the off state of all sensors red, as long as they don't have a specific rule for their device class or domain:

type: custom:history-explorer-card
stateColors:
  off: '#ff0000'

Customizable states aren't limited to on or off values. Any raw state value may be used, such as values assigned by template or MQTT sensors. For example:

type: custom:history-explorer-card
stateColors:
  sensor.Dry: tan
  sensor.Wet: green

A general default color can be set per domain, device class or entity. If present, it will serve as a fallback to all states in that domain, device class or entity that were not explicitely defined. In the following example, the states of the input_text.air_quality entity are defined. The bad state will be red, the good state will be green. All other states of that entity, regardless of what they are, will be yellow due to the catch-all key.

type: custom:history-explorer-card
stateColors:
  input_text.air_quality.bad: red
  input_text.air_quality.good: green
  input_text.air_quality: yellow        # Fallback, catches all states from this entity that are not 'good' or 'bad'

There is a special virtual state that is added to all entities, the multiple state. This state substitutes an aggregation of multiple states on the timeline when they were merged due to data decimation. Like normal states, you can specify the color for this special state for individual entities, device classes, domains or globally.

Compass arrow graphs

Entities representing a directional angle value, like a bearing or direction, can be displayed using a timeline of compass arrows. This is especially useful for visualizing wind directions:

image

Compass arrow graphs use the arrowline type and can be used in both dynamically and statically added entities. See the Customizing dynamically added graphs section for an example of the former and the advanced YAML example for the latter.

Customizing dynamically added graphs

When you add a new line graph using the add entity dropdown, the graph will use the default settings and an automatically picked color. You can override these settings either for specific entities, for device classes or for entire domains. For example, you could set a fixed Y axis range for all your humidity sensors or a specific color or line interpolation mode for your power graphs.

type: custom:history-explorer-card
entityOptions:
  humidity:                 # Apply these settings to all humidity sensors 
    color: blue
    fill: rgba(0,0,255,0.2)
    ymin: 20
    ymax: 100
    lineMode: lines
  sensor.outside_pressure:  # Apply these settings specifically to this entity if added
    color: green
    fill: rgba(0,255,0,0.2)
    ymin: 900
    ymax: 1100
    width: 2
  sensor:                   # Apply these settings to all other entities in the sensor domain
    color: red
    fill: rgba(0,0,0,0)

You can also change the graph type for certain entities, device classes or domains. For example, you could display a numeric entity, which would normally be shown as a linegraph, with a timeline. Or you could default to the directional arrow graph mode for your wind direction sensors:

type: custom:history-explorer-card
entityOptions:
  sensor.wind_bearing:      # This sensor should be shown as compass arrows instead of a line graph
    type: arrowline
    color: black            # Optional color for the arrows, remove for auto selection based on the theme
    fill: rgba(0,0,0,0.2)   # Optional background color for the arrows

Long term statistics

When this setting is enabled, the card will try to pull in long term statistics for an entity once the limit of the history data is reached. The integration of both history sources is entirely seamless. You keep scrolling and zooming in or out of your data, as usual. The statistics and history data will be combined on the fly at all time ranges. This only works for entities that have long term statistics available. Graphs for all other entities will just become blank as soon as the history data limit is reached.

image

In the screenshot above, the blue graph is the outdoor temperature, the red graph is the temperature of a barn. The outdoor temperature has statistics available, the barn temperature does not. So you see the red line stopping where the history database retention period ends (Oct 11th). The outdoor temperature continues way past this point, as the card will turn to long term statistics. Note that the card will always prefer history data over long term statistics data if available, because it’s more precise.

Long term statistics support is enabled by default and is configured to use average values and hourly intervals. You can optionally configure the feature (or turn it off) or even force the use of statistics only, effectively turning off the use of the short term history state DB, by adding the following to the card YAML:

type: custom:history-explorer-card
statistics:
  enabled: true    # true is the default, use false to turn LTS support off.
  mode: mean
  period: hour     # reporting period. hour, day or month. Default is hour.
  force: false     # set to true if you want to use long term statistics only

The (optional) mode parameter controls how the statistics data is processed before being integrated into the history stream. mean = use the average value, min = minimum value, max = max value. The default if the option is not present is mean. This setting does not apply to total_increasing values like energy sensors, which are calculated differently.

Custom data processing functions

The card supports user defined Javascript expressions modifying the data right before display through the process option. This can be used to filter or shape data, apply non-linear scaling or transform data from one graph type to another. The supplied JS expression is provided with the original input state value (can be a string or a number, depending on the graph and data source). The expression must evaluate to the desired new state. Complex custom processing functions can degrade rendering performance.

Custom processing functions works for dyanmically added entities, manually defined YAML graphs and graphs in the more info panel.

Example showing a humidity numerical entity as a timeline graph, where humidity below 30% appears as state dry, above 70% as wet and everything inbetween as normal:

type: custom:history-explorer-card
graphs:
  - type: timeline
    entities:
      - entity: sensor.room_humidity
        process: '( state < 30 ) ? "dry" : ( state > 70 ) ? "wet" : "normal"'

Example of a spike rejection filter for dynamic temperature entities, removing invalid positive or negative temperature spikes, marking them invalid and letting the graph interpolate over them:

type: custom:history-explorer-card
entityOptions:
  temperature:  
    process: '( Math.abs(state) < 100 ) ? state : "unavailable"'

Exporting data as CSV

The raw data for the currently displayed entities and time range can be exported as a CSV file by opening the entity options and selecting Export as CSV. Note that CSV exporting does not work in the HA Companion app. Both history and long term statistics can be exported.

image

The exported CSV can be customized. The following settings are optional. If they are not present, the defaults will be used.

type: custom:history-explorer-card
csv:
  separator: ';'            # Use a semicolon as a separator, the default is a comma
  timeFormat: 'DD/MM/YYYY'  # Customize the date/time format used in the CSV. The default is 'YYYY-MM-DD HH:mm:ss'.
  statisticsPeriod: hour    # Period used for statistics export. Hour, day or month is supported. Default is hour.
  exportAttributes: true    # Export all entity attributes along with their state, in separate columns. Default if off (no attrbutes).
  numberLocale: 'en-US'     # Format numbers using the given locale. If this settings is not defined, the raw DB values will be written (no formatting).

Configuring the UI

Header text

The default History Explorer header can be changed or removed using the header setting in the YAML:

type: custom:history-explorer-card
header: 'My sample history'
header: ' '   # Using a single space will remove the header and leave some padding space
header: hide  # The hide option will remove the header entirely

Dark mode

The card will try to adapt its UI colors to the currently active theme. But for best results, it will have to know if you're running a dark or a light theme. By default the card asks HA for this information. If you're using the default Lovelace theme, or another modern theme that properly sets the dark mode flag, then you should be all with the default settings. If you are using an older theme that uses the legacy format and doesn't properly set the dark mode flag, the card may end up in the wrong mode. You can override the mode by adding this YAML to the global card settings (see below) to force either dark or light mode:

type: custom:history-explorer-card
uimode: dark

Replace dark with light to force light mode instead.

Customizing the color of UI elements

The color for various elements of the UI can be customized further:

type: custom:history-explorer-card
uiColors:
  gridlines: '#ff000040'
  labels: green
  buttons: '#80f00050'
  selector: 'rgba(255,255,255,255)'
  closeButton: '#0000001f'

Changing the UI layout

The position of the time control toolbar and the entity selector can be customized through YAML settings:

type: custom:history-explorer-card
uiLayout:
  toolbar: top
  selector: bottom

Possible options are top, bottom, both and hide. When selecting both, the UI element will be duplicated and shown both on top and on the bottom. This is useful on large histories that require a lot of vertical scrolling. When hide is selected, the respective UI element is not shown. You can also hide the interval selector for total increasing entities with interval: hide.

Toolbars can be made sticky, always floating on top or below the graphs. This can be handy to keep the toolbar controls in reach while scrolling through a long list of graphs. Use the following YAML to make the top, bottom or both sticky. On mobile it is not recommended to make the lower toolbar sticky if it contains an entity selector, as the entity dropdown list may be hard to reach.

type: custom:history-explorer-card
uiLayout:
  sticky: top   # Make the top toolbar controls sticky, so they always stay on top.

If you prefer the + and - zoom icons in the time range control to work the other way round, you can invert them using the following YAML:

type: custom:history-explorer-card
uiLayout:
  invertZoom: true

The width of the label area to the left of the graphs can be customized and the labels optionally hidden with the following YAML:

type: custom:history-explorer-card
labelsVisible: false   # this will hide the unit of measure labels and the entity names left of the graphs or timelines
labelAreaWidth: 10     # the width of the label area in pixels, default is 65

The height of graphs can be set with these options:

type: custom:history-explorer-card
lineGraphHeight: 100     # default line graph height is 250
barGraphHeight: 100      # default bar graph height is 150
timelineBarHeight: 18    # timeline bar height (default is 24)
timelineBarSpacing: 30   # spacing from the top of one timeline bar to the next (default is 40)

Alternatively you can set a custom height for individual line or bar graphs, both dynamic ones and manually defined ones. Per-graph height will override global height options:

type: custom:history-explorer-card
entityOptions:
  humidity:
    height: 150        # set the height of all humidity graphs to 150
graphs:
  - type: line
    options:
      height: 200      # explicitly set the height of this manually defined graph
    entities:
      - entity: sensor.outside_temperature

Configuring the tooltip popup

The tooltip popups used in timelines and arrowlines support three different sizes: full, compact and slim. By default, the size is selected automatically depending on the available space around the graph. The size can be overidden manually:

type: custom:history-explorer-card
tooltip:
  size: slim       # Supported sizes are full, compact, slim. Use auto for automatic size (this is the default).

The state color boxes in the tooltips can optionally be hidden for line graphs or timelines (or both):

tooltip:
  showColorsLine: false       # hide the color boxes in the tooltip popups for line graphs
  showColorsTimeline: false   # hide the color boxes in the tooltip popups for timeline graphs

The tooltips can optionally show the duration of the selected state next to the start and end times:

tooltip:
  showDuration: true

image

You can hide the entity name label on tooltips for line and bar charts to make it even more compact:

tooltip:
  showLabel: false

The way state names are shown on the tooltip (raw or translated / device class dependent) will normally follow the mode set by stateTextMode for timeline charts on the card level. If you want the tooltips to use another mode, then it can be overridden. For example:

tooltip:
  stateTextMode: raw      # Show raw state names in the tooltip even if timelines show translated states

Changing the horizontal time tick density

By default, time tick density is automatic and adjusts to the width of your screen. That’s always a compromise between looking good (no clipping), being readable at all screensizes from mobile to wall sized 8k TV and subjective preferences over tick densities. In most cases, the default automatic selection will yield good results. But if needed, the density can be customized using the timeTicks setting.

timeTicks:

  # If present, this will skip the auto-density and force the use of your selected density.
  densityOverride: 'highest'  # Options are: low, medium, high, higher, highest.

  # optional, this can be used to shorten the date representation on the time ticks, to make more space if you want high tick densities.
  dateFormat: 'short'         # Options are normal and short. Default is normal.

Example with no timeTicks and everything set to automatic defaults:

image

Using densityOverride at higher, leaving the date format at normal:

image

And same as above but settings the dateFormat to short:

image

Overriding the density will disable automatic density calculations depending on card or screen width. So you can easily end up in situations where the labels will overlap.

Multiple cards

You can have multiple history explorer cards on the same view or over several views and dashboards. Each card has its own configuration. For the cards to be able to manage their respective configurations, each card needs its own unique name. When adding the card over the UI, a random name is assigned by default. You can adjust the name if needed. If you add the card manually over YAML, you will have to provide your own unique name for each card.

If you only use a single history explorer card on your Lovelace, then the name is optional.

type: custom:history-explorer-card
cardName: history-card-5

YAML configuration for preconfigured graphs

YAML configuration is optional. And while the interactive configuration is preferrable, it can sometimes be useful to keep a set of predefined entities.

Here's a basic example configuration:

type: custom:history-explorer-card
graphs:
  - type: line
    entities:
      - entity: sensor.outside_temperature
        color: '#3e95cd'
        fill: rgba(151,187,205,0.15)
      - entity: sensor.annexe_temperature
        color: '#ee3452'
        fill: rgba(0,0,0,0)
  - type: line
    entities:
      - entity: sensor.outside_pressure
        color: '#3ecd95'
        fill: rgba(151,205,187,0.15)
  - type: timeline
    title: Non-numerical sensors
    entities:
      - entity: binary_sensor.pir_yard
        name: Yard PIR
      - entity: binary_sensor.door_barn
        name: Barn door
      - entity: input_select.qubino2_3
        name: Heater
      - entity: person.alex

Use wildcards to automatically add multiple entities. The following snippet will add all sensors with temperature in their name to a line graph, except for entities with fridge in their name and the cpu_temperature sensor:

type: custom:history-explorer-card
graphs:
  - type: line
    entities:
      - entity: sensor.*temperature*
        exclude:
          - entity: '*fridge*'
          - entity: sensor.cpu_temperature
        fill: rgba(0,0,0,0)

And a more advanced example:

type: custom:history-explorer-card
cardName: advanced-history
uimode: dark
stateColors:
  person.home: blue
  person.not_home: yellow
decimation: false
header: 'My sample history'
graphs:
  - type: line
    options:
      ymin: -10
      ymax: 30
      showTimeLabels: true   # false will hide the time ticks on this graph
    entities:
      - entity: sensor.outside_temperature
        color: '#3e95cd'
        fill: rgba(151,187,205,0.15)
        width: 4
        lineMode: stepped
      - entity: sensor.annexe_temperature
        color: '#ee3452'
        fill: rgba(0,0,0,0)
        lineMode: lines
        hidden: true         # This entity is hidden by default !
  - type: line
    entities:
      - entity: sensor.outside_pressure
        color: --my-special-green
        fill: rgba(151,205,187,0.15)
  - type: timeline
    title: Non-numerical sensors
    entities:
      - entity: binary_sensor.pir_yard
        name: Yard PIR
      - entity: binary_sensor.door_barn
        name: Barn door
      - entity: input_select.qubino2_3
        name: Heater
  - type: arrowline
    title: Wind bearing
    entities:
      - entity: sensor.wind_bearing
        color: black
        fill: rgba(0,0,0,0.2)

Replace the entities and structure as needed.

Running as a panel in the sidebar

The history explorer can be run as a sidebar panel. Add a new empty dashboard with the Show in sidebar box checked. Set the view type to Panel (1 card) and add the history explorer card to the view.

image


Buy Me A Coffee

history-explorer-card's People

Contributors

alexarch21 avatar chertvl avatar dykanddk avatar el97 avatar misa1515 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

history-explorer-card's Issues

Feature request: Allow selecting multiple entities in the dropdown menu before clicking away to finalize

Hello,

This is a very helpful card. I was searching for a history card replacement since the core update 2022.7.
Thanks to another user's post, I found this.

I love the customization options and ease of use.
I was browsing through community post and read in one of the posts that you are working on the feature to allow drag and drop to change the order of entities.

Another feature I think that will increase the ease of use is if you can allow selecting multiple entities from the dropdown list at once.
So user will search for the entity they want and then select one or more entities from the filtered list, then click outside the dropdown list to finalize the selection.

Regards,
Vaibhav

Plots do not update automatically, requiring a refresh

This could be user error because I just set up my history explorer cards yesterday, but unless I manually refresh the page, they will continue to plot the last known value for hours. This is mildly annoying on a computer, but a lot more of a hassle on the phone app since it's harder to force a refresh.

Cannot find the card after installation!

Hi,

I hope this isn't a dumb newbie question, but in the instructions it says "You can now add the card to your dashboard as usual".

I have installed this both via HACS and manually and in neither case can I find the card. If I use the ADD CARD button, I cannot see it, and if I add a card manually and use type: 'custom:history-explorer-card' I get Custom element doesn’t exist:

I even tried restarting Home Assistant, but that did not help.

What am I missing?

Feature Request: Enable customization of timeline colors for sensors

History Explorer is an outstanding contribution to Home Assistant. It is far superior to the History panel kludge that was released in the 2022.7 core update.

Here's an feature that I think would be very useful ---

I have a template sensor derived from a binary_sensor for our garage door:

 - platform: template
    sensors:
      garage_door_status:
        friendly_name: 'Garage Door Status'
        unique_id: "Garage Door Status"
        value_template: >-
          {% if is_state('binary_sensor.garage_door_tilt_sensor_access_control_window_door_is_open', "on") %}Open{% else %}Closed{% endif %}

It would be advantageous to enable the ability to change the default timeline bar colors for the template sensor for an entity. In my case, when the garage_door_status sensor state is Closed, the timeline color is red, and when it is Open the color is purple. This feature would enable the user to customize these colors. I suggest something similar to the domain color features for switch.on / off and light.on / off that would be applied at the entity level.

stateColors:
  switch.off: silver
  switch.on: red    
  ........
# FR: Would like to be able to do
#  sensor.garage_door_status.open: red
#  sensor.garage_door_status.closed: green

Screenshot of my current History Explorer panel is attached.

Screenshot 2022-07-23 at 09-31-43 History Explorer – Home Assistant

Display text in line with device class

When using the inbuilt HA History panel it shows text on the bars that are appropriate for the device class. So a binary sensor that is a motion sensor shows 'clear' or 'detected' instead of off/on. Is it possible to match this capability?

Request: Can we zoom-in deeper than 1 hour?

Most HA charts have the disadvantage that are not able to show a time range shorter than 1 hour. And sometimes we look for fast-changing states where an hour resolution is not enough.

Is there a chance that we will be able to zoom deeper - in minutes or even seconds?
And could be there a possibility to set an initial time range in minutes or seconds??

how to set 24h time?

My time format is set to 24h in settings which is respected in most of home assistant but the history-explorer-card still shows time in am/pm format.

If I change language from english to english (gb) time format changes to 24h

Entities missing with recordedEntitiesOnly: true

I have 6 Dallas Temperature sensors that show recorded data in the graph and also in the dropdown.
20220131_223722
If i enable recordedEntitiesOnly

      - type: custom:history-explorer-card
        recordedEntitiesOnly: true

only two of the sensors are in the dropdown list.
20220131_224037
These two sensors are also added to the default HA History.

history:
  use_include_order: true
  include:
    entities:
      - sensor.ds18b20_02
      - sensor.ds18b20_04
      - ...

If i remove them from the history configuration the dropdown is empty.
So are the entities selected from the history and not from the recorder?

Thanks for this beautifull card!

Feature Suggestion: Filter for entity drop down

Just a feature suggestion: I would like to be able to pre-filter the entity drop down so I can limit the available choices and make selection easier. Filter should be partial.

e.g.
filterDropDown: 'sensor.power_*'

This example setting would only display entities that start with "sensor_power".

Graph gaps

At first: Brilliant card!

Du you have any clue, why there are gaps with this cards?

image

vs

image

Tried it with every curve types, etc. Always the same gaps.

Remove all entities with one click

I love your addon, it's exactly what i wanted, especially i love ability to use wildcards, which i really miss in original history. However, i do have one question: say that i have appr. 20 entities displayed (all my devices's wifi signal strength) and i'd like to remove them all from view. Is there any other way than click on each "X" separately?

EDIT: ahhh...silly me... it's already there... at the bottom right next to search line (click on drop down and select "remove all added graphs").

timeline mode deesn't work for me

Hi
i"m trying to add non-sersor entities, but i can't see chart
i tried binary sensors, humidifier, heater, tried manual mode and selector mode -- result is the same
however charts work great for sensor entities like temperature, what i do wrong?

Grid formatting

Hello,
I have a suggestion: I often use history-explorer-card to display only one timeline in the most space-saving way.
It would be nice if the stored time grid were less high in this case. With only one timeline, the grid extends far above and below the timeline. I have not made any progress with card-mod.
Many greetings, Eckart
220416 history_card

x-Axis scale

If you have a wide monitor, the scale/number of descriptions is too high (and/or too hard to read/dustinguish) in some zoom levels, here 1, 2, 6, 12, Or perhaps only if the card is shown in maximal width.

image

image

image

image

image

image

image

If I have the window a little bit smaler, it is ok.

image

Is it possible to improve it?

Option to hide h1

Currently, when the title has a space, no title is shown, but still the line (gap).

Would be great, if the whole line is not displayed or at least the user can choose, e.g. _ show blank and __ hides the row or whatever.

Currently, I’m using.

    card_mod:
      style: |
        h1 {
          display: none;
        }

Any plans to support HA statistics?

Hey Alex,

first of all: thank you very much for your work!

And then a question: currently your chart takes the last saved data. Is there any plan to support also the statistics?

Best,
Dirk

Enhancement Request - Ability to set Chart Height

Fantastic card. Thanks so much to the developer for creating it. It would be helpful to be able to set the chart height. In my use case I just have a single chart and it would be great if I could increase its height to use more of the screen.

Thanks for considering.

Screen Shot 2022-06-30 at 6 26 20 pm

Card build and dependencies

Hello, thank you for this wonderful HA card.
Would it be possible to also include build scripts/configs and dependencies?
Thanks a lot.

FR: Allow theme colors

If i use theme variables in the configuration.

theme.yaml

  # My colors
  my-blue: "#55acee"
  my-green: "#9bc53d"
  my-yellow: "#fde74c"
  my-red: "#c3423f"

config

    - type: line
      entities:
        - entity: sensor.ds18b20_01
          name: Temp one
          color: var(--my-green)
          #color: "#55acee"
        - entity: sensor.ds18b20_02
          name: Temp two
          color: var(--my-yellow)
          #color: "#55acee"

it shows this:
20220121_224443

Thanks for this wonderfull card!

FR: Add time offset

It´d be really great to have the posibility of adding a time offset for an entity, like in apex charts.
For example, for comparing the themperature today versus yesterday.
Something like that, but not with awful lines
image

Label goes off the edge of the card

First of all, really liking this card. I primarily use history for debugging to see what state relevant things were in when something broke. This is exactly what I was looking for, I always have like 4 tabs open just to see different entities at the same time. Easily being able to put them all stacked with highlight and zoom capability is just phenomenal. And really smooth, well done!

Only small issue is my labels seem to be running off the side of the card. Makes it a bit difficult to determine which graph is for what when there's a bunch:

Screen Shot 2022-04-01 at 7 46 30 PM

My tech specs for reference:
MacOS Monterey 12.2.1
Firefox 98.0.2
HA version core-2022.4.0b1

State Color not working with some entities.

I have the following yaml config for state color.

stateColors:
  'off': '#3F5E98'
  'on': '#FFDB15'
  binary_sensor.off: '#3F5E98'
  binary_sensor.on: '#FFDB15'
  person.home: '#3F5E98'
  alarm_control_panel.disarmed

With this code, not all binary sensors are adapting the set state colors. Only some binary sensor entities show with the set colors, rest shows with the default colors. why is it so?

Hide attributes labels

Hello,
Is there an option to hide attribute texts of entities? All my entities are on/off so it's kind of useless since the color already tell the state

Thanks

Request....Filter!

It's a welcome thing to have the ability to filter out the signals.
If I want to see the effect of a filter, such as lowpass, outlier, range, throttle, time_throttle and time_simple_moving_average I have to create a separate sensor and wait to see the effect or process the history data.
It is possible to add this functionality like "decimation" or a separate signal for comparison.
Thanks you are doing a great job

Yaml graphs don't have any colors

image

type: custom:history-explorer-card
cardName: advanced-history
uimode: dark
stateColors:
  person.home: blue
  person.not_home: yellow
decimation: false
header: My sample history
graphs:
  - type: line
    entities:
      - entity: sensor.bathroom_switch_battery_level
      - entity: sensor.tradfri_motion_sensor_battery_level
      - entity: sensor.double_switch_battery_level

Wildcard entity selection

It would be great if a wildcard could be used for entity selection such as 'device_tracker.*'. Even better if there were exclusions as well. With the core history panel being massively changed, the capability to do this level of entity selection would substantially fill the gap left by the core changes.

Thanks

Request: ability to disable interactive features

I realize that the interactive features of history explorer card are one of the main draws, but I find myself accidentally scrolling or changing days when using the phone app interface.

While I'd love to keep the interactive features on a more detailed page with computer use in mind, for my "essentials" page I'd prefer to just specify a time range and lock that into place.

Card shows incomplete history

When I access the card for the initially it shows incomplete statuses, or at least it seems to shows statuses that have changed since the start of the displayed period, see below. Where they all show in a line down the right hand side is when I last restarted HA. If the graph is viewed after 12 hours (because that is my default viewing period) from the last HA restart, it will show correctly all the time. This has only occurred since the 2022.4 release, so I'm sure is related to the changes in how data is stored in that release.

Screenshot 2022-04-09 at 13 22 12

If I then zoom out to 1 day, then back to 12 hours, they show correctly as below.

Screenshot 2022-04-09 at 13 23 27

Screenshot 2022-04-09 at 13 23 41

There also seems to be a similar issue with the built in HA History card, but with that I can't get it to show correctly unless the time period is corrected to the after the last HA restart.

Feature request: automatic colors for preconfigured graphs

When interactively adding entities to the history explorer card, it is smart enough to pick colors automatically. However, for preconfigured graphs, the card doesn't work properly until the user manually sets each specific color in the YAML configuration. That shouldn't be required, the colors should be automatic when omitted.


See this screenshot of the built-in history card compared to the custom history explorer card.

image

type: custom:auto-entities
card:
  type: history-graph
  hours_to_show: 48
filter:
  include:
    - entity_id: climate.living_room
    - entity_id: sensor.ble_temperature*
  exclude: []
sort:
  method: none
type: custom:history-explorer-card
cardName: historycard-alltemperatures
combineSameUnits: true
uiLayout:
  selector: hide
graphs:
  - type: line
    entities:
      - entity: sensor.ble_temperature_alpha
      - entity: sensor.ble_temperature_beta
      - entity: sensor.ble_temperature_gamma
      - entity: sensor.ble_temperature_delta
      - entity: sensor.ble_temperature_epsilon
      - entity: sensor.living_room_temperature

Support for attributes

It looks like it's currently not possible to add an attribute of an entity to the graph. Would be really nice, if the card could support this as I would like to compare multiple values that are not entities themselves. Thanks! 🙂

Styling for styling attributes for the x button and input box

Currently, I use card_mod to style these

    card_mod:
      style: |
        button {
          background-color: #2e2e2e;
          border:none;
          color: #ffffff
        }
        input {
          background-color: #2e2e2e;
          border:none;
          color: #ffffff
        }

What solves, what I need, but of course, card_mod is always an overhead in each card and adds UI time.

So a styling ioption would be great for these two as well.

FR: offset for arrow line

I use the arrow line to display wind direction however for some reason the arrow line point to the wind source (against the wind direction) while custom:compass-card has the arrow pointing along the wind.

The custom:compass-card has a possibility to offset the wind direction with a number of degrees to display it differently. Maybe that would be a possibility for history explorer card as well?

Feature suggestion: Tooltip duration.

Amazing card! I am extremely happy with it.

Feature suggestion would be to add a duration to the state on tooltip when hovering:

image

So it already tells it has been on from 8:31 to 10:54. It would be nice to get the duration of this time in tooltip also (2 hours, 23 minutes).

HACS Integration

Hi,

this repo looks really cool!

But is there a way to integrate it with the HACS installer?

Thank you! ❤️

Not an issue but a feature question

Hi, I did not find a way to display the current value of an entity on the graph. Is this possible or is it planned to be supported?
It would be nice to have that since otherwise you have to click/touch a line at the very right of the display which is difficult on a mobile device.

HASS Companion cannot load the card

Hello,

The Android companion app does not seem to like the custom card. See screenshot at end.

I'm running the latest version of companion 2022.6.0
Version of card is 1.022

Thanks for your hard work!

image

Range selector vs Zoom level

Schermafbeelding 2022-04-15 om 14 57 46

not a strict 'issue' as such I think, but since we have no 'discussion' tab, please allow here.

I must confess I keep being surprised by the way the + and - behave on the top right tool. I would expect a + to widen the range, and vv.

Don't have to describe it any better than that I think.

ofc, it shows the Lense/magnifier, and is probably a zoom level, like on the Maps. In this context however, I would rather use a range specifier myself, so that might explain the mindbend I experience when ever I click it ;-)

Anyways, maybe you could consider it.
thanks!

no issue but implementation for more space

Is it possible to hide the measurement unit?
Is it possible ti hide the title or change the text ?
Can you add this option?
So you can have more space for graph
image
Thank for your work

Is it possible to configure as a HA Custom Panel?

1st, thanks for your work! Useful card!

I tried to add History Explorer to the side panel, based on the config I had for another panel. However, I just end up with a blank window. Is configuring in this manner possible? If so, I'm sure I'm doing it wrong. Your thoughts? Thx.

# configuration.yaml

lovelace:
  mode: yaml
  resources:
    # https://github.com/alexarch21/history-explorer-card
    - type: module
      url: /local/history-card/history-explorer-card.js

panel_custom:
  - name: history-explorer-card
    sidebar_title: History Explorer
    sidebar_icon: mdi:clipboard-text-clock
    url_path: history-explorer
    module_url: /local/history-card/history-explorer-card.js
    trust_external_script: true

https://www.home-assistant.io/integrations/panel_custom/

Change Color from Timeline

how are the colors defined here?

is there a way to adjust the color of the timeline?

in an example: a thermostat…

comfort temperature = 21 degrees == green.
about == orange.
under == blue

image

Request: identify unavailability by gaps in data

I have sensors that can't report availability, so when one is down there's simply a gap in the data. Issue is this gap gets interpolated.

Would be nice to be able to specify a max period after which the sensor is assumed unavailable.

adding an entity to config locked HA

as per request in followup of https://community.home-assistant.io/t/new-interactive-history-explorer-custom-card/369450/26?u=mariusthvdb

my HA instance locked, auto- restarted and logged:

2022-01-12 14:13:31 WARNING (MainThread) [homeassistant.core] Timed out waiting for shutdown stage 1 to complete, the shutdown will continue
2022-01-12 14:13:33 WARNING (Thread-106) [homeassistant.util.executor] Thread[SyncWorker_2] is still running at shutdown: File "/usr/local/lib/python3.9/threading.py", line 930, in _bootstrap
    self._bootstrap_inner()
  File "/usr/local/lib/python3.9/threading.py", line 973, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.9/threading.py", line 910, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.9/concurrent/futures/thread.py", line 75, in _worker
    work_item = work_queue.get(block=True)

not sure if this is because of the resource, but it was happening upon adding a single (and first) entity to the card.....

Home Assistant 2022.2.0.dev20220112

yaml:

  - title: History
    icon: mdi:history
    path: history
    type: panel
    cards:
     - type: custom:history-explorer-card

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.