# Include python-openhab from openhab import OpenHAB # Include all from grafanalib.core with alias grafana import grafanalib.core as grafana # And InfluxDB from submodule from grafanalib.influxdb import InfluxDBTarget # Generator for JSON from grafanalib._gen import DashboardEncoder # And some common functions for upload import json import requests from os import getenv # Create OpenHAB object with your URL openhab = OpenHAB(getenv("OPENHAB_URL") + '/rest') def upload_to_grafana(dashboard): json_data = json.dumps( { "dashboard": dashboard.to_json_data(), "overwrite": True }, sort_keys=True, indent=2, cls=DashboardEncoder) server = getenv("GRAFANA_URL") username = getenv("GRAFANA_USERNAME") password = getenv("GRAFANA_PASSWORD") headers = { 'Content-Type': 'application/json'} r = requests.post( f"{server}/api/dashboards/db", data=json_data, headers=headers, auth=requests.auth.HTTPBasicAuth(username, password) ) print(f"{r.status_code} - {r.content}") # Create dashboard for 1 item (temperature): dashboard = grafana.Dashboard( title="Test 1", uid='openhab_test_1', tags=['openhab'], timezone='browser', time=grafana.Time('now-24h', 'now'), rows=[ grafana.Row(panels=[ grafana.Graph( title="Temperature", dataSource='openhab_home', lineWidth=1, yAxes=grafana.single_y_axis(min=None, format='°C'), targets=[ InfluxDBTarget( query=f'SELECT mean("value") FROM "ext_climate_temperature" WHERE $timeFilter GROUP BY time($__interval) fill(previous)', alias='Temperature', ), ], ), ]), ], ).auto_panel_ids() # Call this to have valid dashboard JSON # Upload it upload_to_grafana(dashboard) # Create dashboard for 2 items (temperature and humidity with 2 axis): dashboard = grafana.Dashboard( title="Test 2", uid='openhab_test_2', tags=['openhab'], timezone='browser', time=grafana.Time('now-24h', 'now'), rows=[ grafana.Row(panels=[ grafana.Graph( title="Temperature", dataSource='openhab_home', # Define 2 axes for our items yAxes=grafana.YAxes( left=grafana.YAxis(min=None, format='°C'), right=grafana.YAxis(min=None, format='%'), ), # Important: Force graph's colors and Y-Axis seriesOverrides=[ { 'alias': "Temperature", 'color': '#bf1b00', 'yaxis': 1, }, { 'alias': "Humidity", 'color': '#65c5db', 'yaxis': 2, }, ], targets=[ InfluxDBTarget( query=f'SELECT mean("value") FROM "ext_climate_temperature" WHERE $timeFilter GROUP BY time($__interval) fill(previous)', alias='Temperature', ), InfluxDBTarget( query=f'SELECT mean("value") FROM "ext_climate_humidity" WHERE $timeFilter GROUP BY time($__interval) fill(previous)', alias='Humidity', ), ], ), ]), ], ).auto_panel_ids() # Call this to have valid dashboard JSON # Upload it upload_to_grafana(dashboard) # Read items group and create dashboard with contents dashboard_targets = [] # Final array with targets for all items group = openhab.get_item('g_battery_level') # Request group from OPenHAB API # Iterate group for v in group.members.values(): # Get some item info item_info = openhab.get_item_raw(v.name) # Get item display name item_label = item_info['label'] # ... create target! dashboard_targets.append( InfluxDBTarget( query=f'SELECT mean("value") FROM "{v.name}" WHERE $timeFilter GROUP BY time($__interval) fill(previous)', alias=item_label, ), ) # Now just create and upload dashboard with result targets attached dashboard = grafana.Dashboard( title="Test 3", uid='openhab_test_3', tags=['openhab'], timezone='browser', time=grafana.Time('now-24h', 'now'), rows=[ grafana.Row(panels=[ grafana.Graph( title="Battery level", dataSource='openhab_home', lineWidth=1, fill=False, # Do not fill graph yAxes=grafana.single_y_axis(min=None, format='%'), targets=dashboard_targets, ), ]), ], ).auto_panel_ids() # Call this to have valid dashboard JSON # Upload it upload_to_grafana(dashboard) # Read items group and create dashboard with contents dashboard_targets = [] # Final array with targets for all items group = openhab.get_item('g_battery_level') # Request group from OPenHAB API # Iterate group for v in group.members.values(): # Get some item info item_info = openhab.get_item_raw(v.name) # Get item display name item_label = item_info['label'] # ... create target! dashboard_targets.append( InfluxDBTarget( query=f'SELECT last("value") FROM "{v.name}" ORDER BY time DESC LIMIT 1 SLIMIT 1', alias=item_label, ), ) # Now just create and upload dashboard with result targets attached dashboard = grafana.Dashboard( title="Test 4", uid='openhab_test_4', tags=['openhab'], timezone='browser', time=grafana.Time('now-24h', 'now'), rows=[ grafana.Row(panels=[ grafana.GaugePanel( # Panel with indicators title="Battery level", dataSource='openhab_home', format='%', # Define colors for values thresholds=[ {'color': 'red', 'value': 0}, {'color': 'yellow', 'value': 20}, {'color': 'green', 'value': 40}, ], targets=dashboard_targets, ), ]), ], ).auto_panel_ids() # Call this to have valid dashboard JSON # Upload it upload_to_grafana(dashboard)