Skip to content

Device report: SafeTech (V3.56, dk=140) shows "Unknown model" over Local/JSON /safe-tec #41

Description

@FranzBruckner

Device report: SafeTech (V3.56, dk=140) not identified — shows "Unknown model" (Local/JSON /safe-tec)

Summary

Reporting an untested device as encouraged in the README. My SafeTech Connect works over the Local (JSON) API on base path /safe-tec, but the integration does not identify it — the device shows "model": "Unknown model" in diagnostics. Core functionality (incl. the valve) appears to work; this is purely a model-detection gap.

Device

Device SYR SafeTech Connect
Firmware (getVER) Safe-Tech V3.56
Device kind (getTYP) 140
Serial prefix (getSRN) 2136… (masked)
API Local / JSON
Base path /safe-tec (port 5333)
Detected model Unknown model ← the issue
Integration version 1.24.0
Home Assistant 2026.7.4 (HAOS 18.1)

What works

  • Login side-effect GET /safe-tec/set/ADM/(2)f{"setADM(2)f":"FACTORY"} (HTTP 200).
  • GET /safe-tec/get/all returns a full payload (60 keys).
  • Valve is exposed: getAB (control) and getVLV (status) are both present, so the valve entity is created and reflects state correctly.

The problem: model detection fails

detect_model() returns Unknown model for this unit. Looking at the dk=140 signatures in models.py, none match a V3:

  • safetechv4 expects ver_prefix "Safe-Tech V4" — this device reports Safe-Tech V3.56.
  • safetech expects srn_prefix "123" — this serial starts 2136….
  • safetechpolygonvatro / safetechrwc expect other SRN prefixes / manufacturers.

So a V3 SafeTech on /safe-tec falls through to Unknown model. A signature keyed on ver_prefix "Safe-Tech V3" with base_path "/safe-tec" would likely fix it. (Happy to test a patch.)

Sanitized /get/all payload

Serial (getSRN), Wi-Fi SSID (getWFC), IP/gateway (getWIP/getWGW), getCNO and the lower MAC bytes have been masked. Full values available privately if needed.

{
  "getSRN": "REDACTED",
  "getVER": "Safe-Tech V3.56",
  "getTYP": "140",
  "getCNO": "REDACTED",
  "getMAC": "0C:73:EB:XX:XX:XX",
  "getAB": "1",
  "getPRF": "1",
  "getPRN": "2",
  "getPN1": "Anwesend", "getPV1": "300", "getPT1": "120", "getPF1": "3500", "getPM1": "1", "getPR1": "0", "getPB1": "1", "getPA1": "1", "getPW1": "1",
  "getPN2": "Abwesend", "getPV2": "30", "getPT2": "30", "getPF2": "3500", "getPM2": "1", "getPR2": "0", "getPB2": "1", "getPA2": "1", "getPW2": "0",
  "getPN3": "Profile 3", "getPV3": "300", "getPT3": "60", "getPF3": "3500", "getPM3": "1", "getPR3": "0", "getPB3": "1", "getPA3": "0", "getPW3": "0",
  "getPN4": "Profile 4", "getPV4": "300", "getPT4": "60", "getPF4": "3500", "getPM4": "1", "getPR4": "0", "getPB4": "1", "getPA4": "0", "getPW4": "0",
  "getPN5": "Profile 5", "getPV5": "300", "getPT5": "60", "getPF5": "3500", "getPM5": "1", "getPR5": "0", "getPB5": "1", "getPA5": "0", "getPW5": "0",
  "getPN6": "Profile 6", "getPV6": "300", "getPT6": "60", "getPF6": "3500", "getPM6": "1", "getPR6": "0", "getPB6": "1", "getPA6": "0", "getPW6": "0",
  "getPN7": "Profile 7", "getPV7": "300", "getPT7": "60", "getPF7": "3500", "getPM7": "1", "getPR7": "0", "getPA7": "0", "getPB7": "1", "getPW7": "0",
  "getPN8": "Profile 8", "getPV8": "300", "getPT8": "60", "getPF8": "3500", "getPM8": "1", "getPR8": "0", "getPB8": "1", "getPA8": "0", "getPW8": "0",
  "getLWT": "90",
  "getTMP": "0",
  "getVLV": "20",
  "getCEL": "229",
  "getBAR": "4100 mbar",
  "getFLO": "0",
  "getNPS": "91589",
  "getALA": "FF",
  "getALM": "Alarms:->A4 A4 A4 AD FF FF FF FF",
  "getDMA": "1",
  "getAVO": "0mL",
  "getVOL": "Vol[L]1093",
  "getLTV": "4",
  "get71": "0",
  "getBAT": "9,55",
  "getNET": "12,38",
  "getBUZ": "1",
  "getDBD": "10", "getDBT": "15", "getDST": "60", "getDCM": "3", "getDOM": "60", "getDPL": "10", "getDTC": "3",
  "getDRP": "1",
  "getWFC": "REDACTED", "getWFS": "2", "getWFR": "88",
  "getRTC": "1785194436",
  "getIDS": "1",
  "getTMZ": "4",
  "getFSL": [],
  "getCND": "384", "getCNL": "0", "getCNF": "20",
  "getSLP": "0", "getSLE": "0", "getSLV": "0", "getSLT": "0", "getSLF": "0",
  "getWAD": "0",
  "getAPT": "3600",
  "getWIP": "REDACTED", "getWGW": "REDACTED",
  "getSFV": "0"
}

Notes / observations

  • getAB uses the legacy numeric form ("1" = open), not boolean true/false; getVLV": "20" (open) agrees.
  • getALA": "FF" = no active alarm (getALM shows historical A4/AD codes only).
  • Setup UX: the Local dropdown lists three visually identical SYR SafeTech Connect entries. One maps to base_path "/trio" and would 404 for this device; the other two map to /safe-tec. Might be worth disambiguating the labels. (Separate concern from this device report — mentioning in case it's useful.)

Happy to run additional endpoints or test a detection patch.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions