Skip to content

Python example applications

These examples require Python 3.7 and the httpx library which can be installed using pip.

Getting a sessionId

Copy this code and put it in a file called login.py. Run it with python login.py <API-HOST> you@example.com, and it will ask for your password. If everything goes well it should then print out a sessionId that can be used to talk to the api.

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import httpx, getpass, sys

def login(username, host):
    r = httpx.post(
        f'https://{host}/login',
        json={'username': username, 'password': getpass.getpass()}
    )
    return r.json()['sessionId']

if __name__ == '__main__':
    try:
        _, host, username = sys.argv
    except:
        print('Usage: python login.py cirrushost mattias@yanzi.se')

    print(login(username, host))

Getting a list of groups

Copy the code below into a file called groups.py and run it by passing a cirrus host and sessionId. It should then make a request and print out all the groups which you are a member of. For legacy reasons groups are still called accounts in the API.

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import httpx, sys

accounts_query = """
query {
  accounts {
    accountName
    accountNumber
  }
}
"""

def graphql(query, variables={}):
    r = httpx.post(
        f'https://{host}/graphql',
        headers={'Authorization': f'bearer {sessionId}'},
        json={'query': query, 'variables': variables}
    )
    return r.json()

if __name__ == '__main__':
    try:
        _, host, sessionId = sys.argv
    except:
        print("usage: python groups.py devshrek.yanzi.nu YW5kcmVhcy5tYXJ0ZW5...")
        sys.exit(1)

    print(graphql(accounts_query))

Making a simple CLI

Copy the below code into another file and run it. As you might notice, this program handles input of host, username, and password in three different ways. As the first three arguments on the command line, as environment variables, and by asking after launch. This is still just a very quick example, and as some comments say, it is probably a good idea look at some more libraries to help.

Python
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import httpx, getpass, pprint, sys, os, urllib.parse

accounts_query = """
query {
  accounts {
    accountName
    accountNumber
  }
}
"""

locations_query = """
query($after: String, $search: String) {
    locations(first: 10, after: $after, search: $search) {
        cursor
        list {
            name
            locationId
        }
    }
}
"""

devices_query = """
query($locationId: String!, $after: String) {
    location(locationId: $locationId) {
        units(first: 10, after: $after) {
            cursor
            list {
                name
                unitAddress {
                    did
                }
            }
        }
    }
}
"""

datasources_query = """
query($locationId: String!, $did: String!) {
    location(locationId: $locationId) {
        unit(did: $did) {
            dataSources {
                variableName
                siUnit
            }
        }
    }
}
"""

def login(host, username, password):
    r = httpx.post(
        f'https://{host}/login',
        json={'username': username, 'password': password}
    )
    return r.json()['sessionId']


def graphql(host, sessionId, query, variables={}):
    r = httpx.post(
        f'https://{host}/graphql',
        headers={'Authorization': f'bearer {sessionId}'},
        json={'query': query, 'variables': variables}
    )
    return r.json()

# This could be replaced with the argparse lib https://docs.python.org/3/library/argparse.html
def argv(index): return sys.argv[index] if len(sys.argv) > index else None

def get_host():
    return argv(1) or os.getenv('CIRRUS_HOST') or input('Host: ')

def get_session(host):
    username = argv(2) or os.getenv('CIRRUS_USER') or input('Username: ')
    password = argv(3) or os.getenv('CIRRUS_PASS') or getpass.getpass()

    return login(host, username, password)

def print_help():
    print("""
        exit
        help
        accounts
        locations [after=<cursor>&search=<name>]
        devices <locationId> [cursor]
        datasources <locationId> <did>

        """)

def main():
    host = os.getenv('CIRRUS_HOST') or get_host()
    sessionId = os.getenv('CIRRUS_SESSIONID') or get_session(host)

    # this could be replaced with the cmd lib https://docs.python.org/3/library/cmd.html
    while True:
        try:
            command, *args = input('>>> ').split(' ')
        except KeyboardInterrupt:
            break

        if command == 'exit':
            break
        elif command == 'help':
            print_help()
        elif command == 'accounts':
            pprint.pprint(graphql(host, sessionId, accounts_query))
        elif command == 'locations':
            variables = dict(urllib.parse.parse_qsl(args[0])) if len(args) else {}
            pprint.pprint(graphql(host, sessionId, locations_query, variables))
        elif command == 'devices':
            pprint.pprint(graphql(host, sessionId, devices_query, {'locationId': args[0], 'after': args[1] if len(args) > 1 else None}))
        elif command == 'datasources':
            pprint.pprint(graphql(host, sessionId, datasources_query, {'locationId': args[0], 'did': args[1]}))
        else:
            print('Unknown command', command)
            print_help()


if __name__ == '__main__':
    main()