diff --git a/update_checker.py b/update_checker.py
index b787fa025a3201bf79848549255a8cafb163815b..cafa73661d4199f6aaff9e84b02b1285c375c8cd 100755
--- a/update_checker.py
+++ b/update_checker.py
@@ -10,9 +10,11 @@ import requests
 import argparse
 import datetime
 import logging
+import time
 
 ap = argparse.ArgumentParser()
 ap.add_argument("--raw", type=argparse.FileType("r", encoding="utf-8"), required=True)
+ap.add_argument("--json", default=None, type=argparse.FileType('w'), help="Output a JSON file instead of printing to stdout")
 ap.add_argument("--debug", action="store_true", help="Output tons of debug messages")
 args = ap.parse_args()
 
@@ -105,7 +107,7 @@ json.dump(allFirmwareDownloads,open("firmwareDownloads.json","w"),sort_keys=True
 
 data = json.load(args.raw)
 
-updateEvents = []
+updateEvents = {}
 for download in allFirmwareDownloads:
     try:
         r = LogRecord(download)
@@ -124,9 +126,34 @@ for download in allFirmwareDownloads:
         hostname = d["nodeinfo"]["hostname"]
         hardware_model = getHardwareModelFromEntry(d)
         if currentRelease < r.release:
-            print("%s (%s) %s -> %s Segment %i %s status %s @ %s" % (mac, filterNonAscii(hostname), currentRelease, r.release, r.segment, hardware_model, status, r.date))
+            if mac in updateEvents:
+                updateEvents[mac]["download_count"] += 1
+                updateEvents[mac]["last_date"] = r.date
+            else:
+                updateEvents[mac] = {
+                    "mac": mac,
+                    "hostname": hostname,
+                    "from_release": currentRelease,
+                    "to_release": r.release,
+                    "segment": r.segment,
+                    "model": hardware_model,
+                    "status": status,
+                    "date": r.date,
+                    "last_date": r.date,
+                    "download_count": 1
+                }
     else:
         # raw.json only contains data from 14 days - do not print message if we encounter older log entries
         download_ts = datetime.datetime.strptime(r.date, "%d/%b/%Y:%H:%M:%S %z]")
         if (datetime.datetime.now(tz=datetime.timezone.utc) - download_ts) < datetime.timedelta(days=14):
             logging.info("%s %s with agent %s seems not to be a node @ %s"%(r.ipv6,mac,r.agent,r.date))
+
+if not args.json:
+    for event in updateEvents.values():
+        print("%s (%s) %s -> %s Segment %i %s status %s @ %s" % (event["mac"], filterNonAscii(event["hostname"]), event["from_release"], event["to_release"], event["segment"], event["model"], event["status"], event["date"]))
+else:
+    outJson = {
+        "timestamp": time.time(),
+        "update_events": list(updateEvents.values())
+    }
+    json.dump(outJson, args.json)