BenKrueger

decode_1wire_json.py

Nov 13th, 2025
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.22 KB | Cybersecurity | 0 0
  1. #!/usr/bin/env python3
  2. import json
  3. import sys
  4.  
  5. if len(sys.argv) != 2:
  6.     print(f"Usage: {sys.argv[0]} dq.json", file=sys.stderr)
  7.     sys.exit(1)
  8.  
  9. path = sys.argv[1]
  10.  
  11. # --- 1. Read JSON events ----------------------------------------------------
  12. events = []
  13. with open(path, "r") as f:
  14.     for line in f:
  15.         line = line.strip()
  16.         if not line:
  17.             continue
  18.         events.append(json.loads(line))
  19.  
  20. if not events:
  21.     print("No events found in file.", file=sys.stderr)
  22.     sys.exit(1)
  23.  
  24. # --- 2. Extract low pulses (1 -> 0, then 0 -> 1) ----------------------------
  25. pulses = []  # list of (start_time, width)
  26. prev = events[0]
  27.  
  28. for i in range(1, len(events)):
  29.     cur = events[i]
  30.  
  31.     # falling edge: 1 -> 0
  32.     if prev["v"] == 1 and cur["v"] == 0:
  33.         start_t = cur["t"]
  34.         # search for next rising edge 0 -> 1
  35.         width = None
  36.         for j in range(i + 1, len(events)):
  37.             nxt = events[j]
  38.             if nxt["v"] == 1:
  39.                 width = nxt["t"] - start_t
  40.                 break
  41.         if width is not None:
  42.             pulses.append((start_t, width))
  43.  
  44.     prev = cur
  45.  
  46. # --- 3. Convert pulse widths to bits ----------------------------------------
  47. bits = []
  48.  
  49. for start_t, width in pulses:
  50.     # Ignore reset/presence etc. (very long pulses)
  51.     if width <= 10:
  52.         bits.append(1)
  53.     elif 40 <= width <= 80:
  54.         bits.append(0)
  55.     else:
  56.         # probably reset (≈480) or presence (≈150) -> skip
  57.         continue
  58.  
  59. if not bits:
  60.     print("No data bits found (check thresholds).", file=sys.stderr)
  61.     sys.exit(1)
  62.  
  63. # --- 4. Group bits into bytes (LSB-first) -----------------------------------
  64. bytes_out = []
  65.  
  66. for i in range(0, len(bits), 8):
  67.     chunk = bits[i:i+8]
  68.     if len(chunk) < 8:
  69.         break
  70.     val = 0
  71.     for bit_index, b in enumerate(chunk):
  72.         val |= (b & 1) << bit_index  # LSB-first
  73.     bytes_out.append(val)
  74.  
  75. # --- 5. Print result ---------------------------------------------------------
  76. hex_str = " ".join(f"{b:02x}" for b in bytes_out)
  77. ascii_str = "".join(chr(b) if 32 <= b < 127 else "." for b in bytes_out)
  78.  
  79. print("Hex bytes:")
  80. print(hex_str)
  81. print("\nASCII (non-printables shown as '.'):")
  82. print(ascii_str)
  83.  
Advertisement
Add Comment
Please, Sign In to add comment