Skip to content

Profili di esempio ​

I profili seguenti mostrano ciascuno una tecnica su un dispositivo reale: HTTP, TCP (Modbus), UDP, MQTT e KNX. Sono abbreviati, così che l'essenziale resti visibile, e sono stati verificati dall'Editor profilo senza segnalazioni. I profili completi di questi dispositivi si trovano nella Libreria online. La struttura è spiegata in Formato del profilo e CommandServer.

Per provare un esempio: salvi il testo JSON come file con l'estensione .json, lo carichi in Competenze → Add-on → Profili con Caricamento manuale e crei un dispositivo con Crea dispositivo.

HTTP: go-eCharger ​

La wallbox go-eCharger ha un'interfaccia HTTP che fornisce JSON (API v2, da attivare localmente nell'app go-e). Il profilo interroga lo stato ogni 30 secondi e può forzare o bloccare la ricarica e impostare la corrente di carica.

json
{
	"version": "1.0",
	"author": "Muster Integration GmbH",
	"description": "go-eCharger (HTTP-API v2)",
	"manufacturer": "go-e",
	"model": "go-eCharger",
	"platform": "go-e",
	"category": "Energy",
	"type": "EV Charger",
	"nomosCertified": false,
	"compatibility": 50,
	"className": "GOE_CHARGER",
	"engineType": "",
	"structure": {
		"config": {
			"ACTIVE": {"value": "YES", "editable": false},
			"DEBUG": {"value": "NO", "editable": false},
			"SERVERIP": {"value": "", "editable": {"type": "host", "default": ""}},
			"SERVERPORT": {"value": "80", "editable": false},
			"SERVERPROTOCOL": {"value": "HTTP", "editable": false},
			"SERVERMODE": {"value": "ASCII", "editable": false},
			"SERVERTIMEOUT_IN_MS": {"value": "8000", "editable": false},
			"CMDPREFIX": {"value": "/api/", "editable": false},
			"STARTUPCMD": {"value": "STATUS", "editable": false},
			"MATCHING": {"value": "FULL", "editable": false},
			"CONNECTEVENT": {"value": "REACHABLE=1", "editable": false},
			"DISCONNECTEVENT": {"value": "REACHABLE=0", "editable": false}
		},
		"commands": {
			"STATUS": {"sequence": "status?filter=rbt,frc,car,lmo,wh,tpa,eto,tma,alw,ama,cbl,cus,fup,awe,ust,cdi,rssi,modelStatus,error", "parameterCount": 0},
			"SETFRC": {"sequence": "set?frc=\\#", "parameterCount": 1},
			"SETAMA": {"sequence": "set?ama=\\#", "parameterCount": 1}
		},
		"mappings": {
			"FRC": {"match": "\"frc\":\\*,", "onChange": true},
			"CAR": {"match": "\"car\":\\*,", "onChange": true},
			"CHARGING": {"match": "", "onChange": true, "condition": "{$CAR$,%in2}"},
			"AMA": {"match": "\"ama\":\\*,", "onChange": true},
			"TPA": {"match": "\"tpa\":\\*,", "onChange": true, "condition": "{%*1.0}"},
			"WH": {"match": "\"wh\":\\*,", "onChange": true, "condition": "{%/1000.00}"}
		}
	},
	"polling": {
		"Status": {"interval": 30, "editableInterval": true, "command": "STATUS"}
	},
	"properties": {
		"powerstate": {"method": "set", "property": "FRC", "datatype": "int", "valueList": [{"text": "Neutral", "value": "0"}, {"text": "Off", "value": "1"}, {"text": "On", "value": "2"}]},
		"amperelimit": {"method": "set", "property": "AMA", "datatype": "int", "unit": "A", "min": 6, "max": 32, "internalMin": 6, "internalMax": 32, "stepValue": 1}
	},
	"propertiesMeta": {
		"powerstate": {"text": "State", "properties": ["powerstate"]},
		"amperelimit": {"text": "Charging current", "properties": ["amperelimit"]}
	},
	"mappings": {
		"powerstate": {"method": "get", "property": "FRC", "datatype": "int", "valueList": [{"text": "Neutral", "value": "0"}, {"text": "Off", "value": "1"}, {"text": "On", "value": "2"}]},
		"status": {"method": "get", "property": "CAR", "datatype": "int", "valueList": [{"text": "Unknown", "value": "0"}, {"text": "Idle", "value": "1"}, {"text": "Charging", "value": "2"}, {"text": "Waiting", "value": "3"}, {"text": "Completed", "value": "4"}, {"text": "Error", "value": "5"}]},
		"charging": {"method": "get", "property": "CHARGING", "datatype": "bool", "defaultValue": false},
		"amperelimit": {"method": "get", "property": "AMA", "datatype": "int", "unit": "A", "min": 6, "max": 32, "internalMin": 6, "internalMax": 32},
		"power": {"method": "get", "property": "TPA", "datatype": "float", "unit": "W", "customFormat": {"format": {"Math.round": {"var": "value"}}}},
		"e_connected": {"method": "get", "property": "WH", "datatype": "float", "unit": "kWh"},
		"reachable": {"method": "get", "property": "REACHABLE", "datatype": "bool", "defaultValue": false}
	},
	"mappingsMeta": {
		"powerstate": {"text": "State", "properties": ["powerstate"]},
		"status": {"text": "Status", "properties": ["status"]},
		"charging": {"text": "Charging", "properties": ["charging"]},
		"amperelimit": {"text": "Charging current", "properties": ["amperelimit"]},
		"power": {"text": "Power", "properties": ["power"]},
		"e_connected": {"text": "Energy", "properties": ["e_connected"]},
		"reachable": {"text": "Reachable", "properties": ["reachable"]}
	},
	"actionTemplates": [
		{"templateid": "powerstate", "mapping": "powerstate", "text": "State", "icon": "toggle-on", "valueList": [{"text": "Neutral", "value": "0"}, {"text": "Off", "value": "1"}, {"text": "On", "value": "2"}]},
		{"templateid": "amperelimit", "mapping": "amperelimit", "text": "Charging current", "icon": "adjust"}
	],
	"triggerTemplates": [
		{"templateid": "status", "mapping": "status", "text": "Status", "icon": "info-circle", "valueList": [{"text": "Unknown", "value": "0"}, {"text": "Idle", "value": "1"}, {"text": "Charging", "value": "2"}, {"text": "Waiting", "value": "3"}, {"text": "Completed", "value": "4"}, {"text": "Error", "value": "5"}]},
		{"templateid": "charging", "mapping": "charging", "text": "Charging", "icon": "bolt"},
		{"templateid": "power", "mapping": "power", "text": "Power", "icon": "bolt"}
	],
	"hideProperties": true,
	"hideMappings": true
}

Che cosa mostra l'esempio:

  • CMDPREFIX /api/ si trova prima di ogni comando. STATUS richiama quindi http://<IP>/api/status?filter=…, SETAMA con il valore 16 richiama /api/set?ama=16.
  • STARTUPCMD interroga lo stato subito all'avvio, non solo dopo 30 secondi.
  • Pattern di risposta per JSON: "\"car\":\\*," cattura il valore tra "car": e la virgola successiva. L'interrogazione è la stessa del profilo completo della Libreria online e nomina più campi di quelli usati da questo esempio. Per l'ultimo campo di un oggetto JSON vedi Pattern.
  • Formato: {%/1000.00} converte Wh in kWh con due decimali; {%/1000} darebbe kWh interi.
  • Valore calcolato: CHARGING è 1 se CAR ha il valore 2 (in carica).
  • Elenchi di valori: powerstate può assumere solo 0, 1 o 2; lo stesso elenco si trova nel modello, così le automazioni mostrano una selezione.
  • Interrogazione con editableInterval: alla creazione l'intervallo si può modificare.
  • Raggiungibilità: ogni interrogazione riuscita segnala REACHABLE=1, ogni interrogazione non riuscita REACHABLE=0.

TCP: Eastron SDM120 tramite Modbus TCP ​

Il contatore elettrico Eastron SDM120 parla Modbus RTU; un gateway Modbus TCP lo porta sulla rete. Il profilo legge tensione e potenza di rete ogni 5 secondi e i valori dei contatori ogni minuto.

json
{
	"version": "1.0",
	"author": "Muster Integration GmbH",
	"description": "Eastron SDM120 über Modbus-TCP-Gateway",
	"manufacturer": "Eastron",
	"model": "SDM120 Modbus",
	"platform": "Eastron",
	"category": "Energy",
	"type": "Smart Meter",
	"nomosCertified": false,
	"compatibility": 50,
	"className": "EASTRON_SDM120",
	"engineType": "",
	"structure": {
		"config": {
			"ACTIVE": {"value": "YES", "editable": false},
			"DEBUG": {"value": "NO", "editable": false},
			"SERVERIP": {"value": "", "editable": {"type": "host", "default": ""}},
			"SERVERPORT": {"value": "502", "editable": {"type": "integer", "default": "502"}},
			"SERVERPROTOCOL": {"value": "TCP", "editable": false},
			"SERVERMODE": {"value": "HEX", "editable": false},
			"SERVERTIMEOUT_IN_MS": {"value": "NONE", "editable": false},
			"SPACING": {"value": "1000", "editable": false},
			"MATCHING": {"value": "FULL", "editable": false},
			"CONNECTEVENT": {"value": "REACHABLE=1", "editable": false},
			"DISCONNECTEVENT": {"value": "REACHABLE=0", "editable": false}
		},
		"commands": {
			"READ_INSTANT": {"sequence": "000000000006010400000020", "parameterCount": 0, "tag": "instant"},
			"READ_ENERGY": {"sequence": "000000000006010400480004", "parameterCount": 0, "tag": "energy"}
		},
		"mappings": {
			"L1_VOLTAGE": {"match": "000000000043010440\\!0!\\^^^^^^^^", "onChange": true, "condition": "{%swap32,%float}", "tag": "instant"},
			"GRID": {"match": "000000000043010440\\!48!\\^^^^^^^^", "onChange": true, "condition": "{%swap32,%float,%*-1}", "tag": "instant"},
			"E_IMPORT": {"match": "00000000000B010408\\!0!\\^^^^^^^^", "onChange": true, "condition": "{%swap32,%float}", "tag": "energy"},
			"E_EXPORT": {"match": "00000000000B010408\\!8!\\^^^^^^^^", "onChange": true, "condition": "{%swap32,%float}", "tag": "energy"}
		}
	},
	"polling": {
		"Instant": {"interval": 5, "editableInterval": false, "command": "READ_INSTANT"},
		"Energy": {"interval": 60, "editableInterval": false, "command": "READ_ENERGY"}
	},
	"properties": {},
	"propertiesMeta": {},
	"mappings": {
		"grid": {"method": "get", "property": "GRID", "datatype": "float", "unit": "W", "customFormat": {"format": {"Math.abs": {"Math.round": {"var": "value"}}}, "red-minus": {"<": [{"var": "value"}, 0]}, "green-plus": {">": [{"var": "value"}, 0]}}},
		"l1_voltage": {"method": "get", "property": "L1_VOLTAGE", "datatype": "float", "unit": "V", "uihidden": true},
		"meter_e_total_imp": {"method": "get", "property": "E_IMPORT", "datatype": "float", "unit": "kWh"},
		"meter_e_total_exp": {"method": "get", "property": "E_EXPORT", "datatype": "float", "unit": "kWh"},
		"reachable": {"method": "get", "property": "REACHABLE", "datatype": "bool", "defaultValue": false}
	},
	"mappingsMeta": {
		"grid": {"text": "Grid", "properties": ["grid"]},
		"l1_voltage": {"text": "Voltage", "properties": ["l1_voltage"]},
		"meter_e_total_imp": {"text": "Total Import", "properties": ["meter_e_total_imp"]},
		"meter_e_total_exp": {"text": "Total Export", "properties": ["meter_e_total_exp"]},
		"reachable": {"text": "Reachable", "properties": ["reachable"]}
	},
	"hideProperties": false,
	"hideMappings": false
}

Che cosa mostra l'esempio:

  • SERVERMODE HEX: comandi e risposte sono cifre esadecimali. 000000000006010400000020 è una richiesta Modbus TCP: transazione 0000, protocollo 0000, lunghezza 0006, dispositivo 01, funzione 04 (leggere input register), dal registro 0000, 0020 (32) registri.
  • Tag: entrambe le interrogazioni forniscono risposte con la stessa struttura. Tramite tag ogni risposta viene valutata solo dai pattern della sua interrogazione.
  • Pattern: 000000000043010440 è l'intestazione della risposta (lunghezza 0x43, dispositivo 1, funzione 4, 0x40 byte). \!48! salta 24 byte, cioè 6 registri; \^^^^^^^^ cattura i 4 byte successivi. La potenza di rete si trova così dal registro 12 (0x000C).
  • Formato: %swap32,%float legge i 4 byte come numero decimale (FLOAT32). Il contatore segnala il prelievo come positivo; in nomos per grid vale il punto di vista della casa, immissione positiva e prelievo negativo. %*-1 inverte quindi il segno.
  • SERVERTIMEOUT_IN_MS NONE: la connessione resta aperta, la raggiungibilità la segue. SPACING 1000 lascia al gateway il tempo per la risposta prima che arrivi l'interrogazione successiva.
  • Porta modificabile: alla creazione la finestra richiede indirizzo IP e porta del gateway; la porta è precompilata con 502.
  • Visualizzazione: customFormat mostra la potenza di rete senza segno, in rosso in caso di prelievo e in verde in caso di immissione.
  • Feedback senza azioni: un contatore viene solo letto; properties resta vuoto.

Per altri dispositivi Modbus modifichi nella sequenza numero del dispositivo, funzione (03 per gli holding register), registro iniziale e numero, e adatti lunghezza e numero di byte nell'intestazione del pattern. I registri interi con segno li legge con {%int16} o {%int32}.

UDP: KEBA KeContact P30 ​

La wallbox KEBA KeContact P30 risponde tramite UDP sulla porta 7090 con JSON. Il profilo interroga stato e valori misurati, abilita la ricarica e imposta la corrente di carica.

json
{
	"version": "1.0",
	"author": "Muster Integration GmbH",
	"description": "KEBA KeContact P30 (UDP)",
	"manufacturer": "KEBA",
	"model": "KeContact P30",
	"platform": "KEBA",
	"category": "Energy",
	"type": "EV Charger",
	"nomosCertified": false,
	"compatibility": 50,
	"className": "KEBA_P30",
	"engineType": "",
	"structure": {
		"config": {
			"ACTIVE": {"value": "YES", "editable": false},
			"DEBUG": {"value": "NO", "editable": false},
			"SERVERIP": {"value": "", "editable": {"type": "host", "default": ""}},
			"SERVERPORT": {"value": "7090", "editable": false},
			"LOCALPORT": {"value": "7090", "editable": false},
			"SERVERPROTOCOL": {"value": "UDP", "editable": false},
			"SERVERMODE": {"value": "ASCII", "editable": false},
			"SERVERTIMEOUT_IN_MS": {"value": "NONE", "editable": false},
			"SPACING": {"value": "200", "editable": false},
			"HEARTBEATCMD": {"value": "REPORT2;30", "editable": false},
			"HEARTBEATTIMEOUT": {"value": "2000", "editable": false},
			"DISCONNECTEVENT": {"value": "REACHABLE=0", "editable": false},
			"MATCHING": {"value": "FULL", "editable": false}
		},
		"commands": {
			"REPORT2": {"sequence": "report 2", "parameterCount": 0},
			"REPORT3": {"sequence": "report 3", "parameterCount": 0},
			"SETENA": {"sequence": "ena \\#", "parameterCount": 1, "spacing": "2000"},
			"SETCURR": {"sequence": "curr \\#", "parameterCount": 1}
		},
		"mappings": {
			"REACHABLE": {"match": "\"ID\": \"\\*\",", "onChange": false, "condition": "{%in2|3}"},
			"ENABLE_USER": {"match": "\"Enable user\": \\*,", "onChange": true, "condition": ""},
			"PLUG": {"match": "\"Plug\": \\*,", "onChange": true, "condition": ""},
			"MAX_CURR": {"match": "\"Max curr\": \\*,", "onChange": true, "condition": ""},
			"P": {"match": "\"P\": \\*,", "onChange": true, "condition": "{%/1000}"}
		}
	},
	"polling": {
		"Status": {"interval": 10, "editableInterval": false, "command": "REPORT2"},
		"Measurements": {"interval": 10, "editableInterval": false, "command": "REPORT3"}
	},
	"properties": {
		"state": {"method": "set", "property": "ENA", "datatype": "bool", "sizeInBit": 1},
		"switchon": {"method": "set", "property": "ENA", "value": 1, "datatype": "bool", "sizeInBit": 1, "uihidden": true},
		"switchoff": {"method": "set", "property": "ENA", "value": 0, "datatype": "bool", "sizeInBit": 1, "uihidden": true},
		"amperelimit": {"method": "set", "property": "CURR", "datatype": "int", "unit": "A", "min": 6, "max": 32, "internalMin": 6000, "internalMax": 32000, "stepValue": 1}
	},
	"propertiesMeta": {
		"state": {"text": "Charging", "properties": ["state", "switchon", "switchoff"]},
		"amperelimit": {"text": "Charging current", "properties": ["amperelimit"]}
	},
	"mappings": {
		"state": {"method": "get", "property": "ENABLE_USER", "datatype": "bool", "defaultValue": false},
		"plug": {"method": "get", "property": "PLUG", "datatype": "int", "valueList": [{"text": "Kein Kabel", "value": "0"}, {"text": "Kabel an Wallbox", "value": "1"}, {"text": "Kabel an Wallbox, verriegelt", "value": "3"}, {"text": "Fahrzeug verbunden", "value": "5"}, {"text": "Fahrzeug verbunden, verriegelt", "value": "7"}]},
		"amperelimit": {"method": "get", "property": "MAX_CURR", "datatype": "int", "unit": "A", "min": 6, "max": 32, "internalMin": 6000, "internalMax": 32000},
		"power": {"method": "get", "property": "P", "datatype": "float", "unit": "W", "customFormat": {"format": {"Math.round": {"var": "value"}}}},
		"reachable": {"method": "get", "property": "REACHABLE", "datatype": "bool", "defaultValue": false}
	},
	"mappingsMeta": {
		"state": {"text": "Charging", "properties": ["state"]},
		"plug": {"text": "Cable Status", "properties": ["plug"]},
		"amperelimit": {"text": "Charging current", "properties": ["amperelimit"]},
		"power": {"text": "Power", "properties": ["power"]},
		"reachable": {"text": "Reachable", "properties": ["reachable"]}
	},
	"actionTemplates": [
		{"templateid": "switchon", "mapping": "switchon", "text": "Turn On", "icon": "toggle-on"},
		{"templateid": "switchoff", "mapping": "switchoff", "text": "Turn Off", "icon": "toggle-off"},
		{"templateid": "amperelimit", "mapping": "amperelimit", "text": "Charging current", "icon": "bolt"}
	],
	"triggerTemplates": [
		{"templateid": "plug", "mapping": "plug", "text": "Cable Status", "icon": "plug", "valueList": [{"text": "Kein Kabel", "value": "0"}, {"text": "Kabel an Wallbox", "value": "1"}, {"text": "Kabel an Wallbox, verriegelt", "value": "3"}, {"text": "Fahrzeug verbunden", "value": "5"}, {"text": "Fahrzeug verbunden, verriegelt", "value": "7"}]},
		{"templateid": "power", "mapping": "power", "text": "Power", "icon": "bolt"}
	],
	"hideProperties": true,
	"hideMappings": true
}

Che cosa mostra l'esempio:

  • LOCALPORT 7090: la wallbox risponde sempre alla porta 7090; il Controller deve ricevere lì.
  • Raggiungibilità tramite UDP: poiché UDP non conosce connessioni, HEARTBEATCMD invia report 2 ogni 30 secondi. Se entro HEARTBEATTIMEOUT (2 secondi) non arriva risposta, DISCONNECTEVENT segnala REACHABLE=0. Un CONNECTEVENT manca di proposito: con UDP arriverebbe anche quando la wallbox è spenta. Invece il pattern REACHABLE imposta il valore a 1 non appena arriva una risposta a report 2 o report 3 ({%in2|3}).
  • Comandi SET: l'azione {"method": "set", "property": "ENA"} richiama il comando SETENA, \# in ena \# accoglie il valore.
  • state, switchon, switchoff: l'app commuta con switchon/switchoff, le automazioni con state.
  • Scalatura: la wallbox calcola in mA, l'app in A. internalMin/internalMax 6000–32000 e min/max 6–32 convertono in entrambe le direzioni, sia per l'azione sia per il feedback.
  • Formato: la wallbox segnala la potenza in mW; {%/1000} dà W.
  • Testi: Charging, Charging current, Cable Status e Power sono termini che nomos traduce. I testi dell'elenco di valori no; compaiono in ogni lingua così come nel profilo.

MQTT: dimmer con Tasmota ​

Un dimmer con il firmware Tasmota, collegato tramite il broker della competenza MQTT. Alla creazione inserisca come MQTT Topic il topic impostato in Tasmota.

json
{
	"version": "1.0",
	"author": "Muster Integration GmbH",
	"description": "Dimmer mit Tasmota-Firmware",
	"manufacturer": "Tasmota",
	"model": "Dimmer",
	"platform": "MQTT",
	"category": "Lighting",
	"type": "Lightbulb",
	"nomosCertified": false,
	"compatibility": 50,
	"className": "",
	"engineType": "MQTT",
	"properties": {
		"state": {"method": "command", "command": "power", "mqtt": "cmnd/%mqttTopic%/POWER", "datatype": "bool"},
		"switchon": {"method": "command", "command": "power", "value": 1, "mqtt": "cmnd/%mqttTopic%/POWER", "datatype": "null", "uihidden": true},
		"switchoff": {"method": "command", "command": "power", "value": 0, "mqtt": "cmnd/%mqttTopic%/POWER", "datatype": "null", "uihidden": true},
		"level": {"method": "command", "command": "brightness", "mqtt": "cmnd/%mqttTopic%/Dimmer", "datatype": "int", "unit": "percent", "min": 0, "max": 100, "internalMin": 0, "internalMax": 100}
	},
	"propertiesMeta": {
		"state": {"text": "State", "properties": ["state", "switchon", "switchoff"]},
		"level": {"text": "Brightness", "properties": ["level"]}
	},
	"mappings": {
		"state": {"method": "get", "property": "power", "mqtt": "stat/%mqttTopic%/RESULT", "mqttValue": "POWER", "datatype": "bool"},
		"level": {"method": "get", "property": "dimmer", "mqtt": "stat/%mqttTopic%/RESULT", "mqttValue": "Dimmer", "datatype": "int", "unit": "percent", "min": 0, "max": 100, "internalMin": 0, "internalMax": 100},
		"reachable": {"method": "get", "property": "reachable", "mqtt": "tele/%mqttTopic%/LWT", "mqttValue": "", "datatype": "bool", "defaultValue": true}
	},
	"mappingsMeta": {
		"state": {"text": "State", "properties": ["state"]},
		"level": {"text": "Brightness", "properties": ["level"]},
		"reachable": {"text": "Reachable", "properties": ["reachable"]}
	},
	"actionTemplates": [
		{"templateid": "switchon", "mapping": "switchon", "text": "Turn On", "icon": "toggle-on"},
		{"templateid": "switchoff", "mapping": "switchoff", "text": "Turn Off", "icon": "toggle-off"},
		{"templateid": "level", "mapping": "level", "text": "Brightness", "icon": "sun-o"}
	],
	"triggerTemplates": [
		{"templateid": "state.on", "mapping": "state", "text": "Is Turned On", "value": "1", "icon": "toggle-on"},
		{"templateid": "state.off", "mapping": "state", "text": "Is Turned Off", "value": "0", "icon": "toggle-off"},
		{"templateid": "level", "mapping": "level", "text": "Brightness", "icon": "sun-o"}
	],
	"hideProperties": true,
	"hideMappings": true
}

Che cosa mostra l'esempio:

  • Comandi: Tasmota riceve comandi su cmnd/<Topic>/<Comando>. switchon invia 1 a cmnd/<Topic>/POWER, level il valore a cmnd/<Topic>/Dimmer.
  • Stesso comando, stesso topic: state, switchon e switchoff usano lo stesso command e quindi lo stesso topic.
  • Feedback da JSON: Tasmota risponde su stat/<Topic>/RESULT ad es. con {"POWER":"ON","Dimmer":60}. mqttValue POWER o Dimmer sceglie il campo; con il tipo di dati bool, ON vale come «acceso».
  • Raggiungibilità: Tasmota segnala su tele/<Topic>/LWT Online o Offline. mqttValue vuoto prende l'intero payload.
  • className vuoto: con MQTT ogni dispositivo riceve un proprio identificativo.

KNX: apparecchio di ventilazione a tre livelli ​

Un apparecchio di ventilazione che viene acceso e spento tramite KNX, accetta un livello da 0 a 3 e segnala la temperatura dell'aria di mandata e un allarme filtro. Il profilo non contiene indirizzi: Crea dispositivo apre la finestra della competenza KNX, dove assegna a ogni valore il suo indirizzo di gruppo.

json
{
	"version": "1.0",
	"author": "Muster Integration GmbH",
	"description": "KNX Lüftungsgerät mit drei Stufen",
	"manufacturer": "KNX",
	"model": "Lüftung 3 Stufen",
	"platform": "KNX",
	"category": "Fans",
	"type": "Fan",
	"nomosCertified": false,
	"compatibility": 50,
	"className": "KNX",
	"engineType": "KNX",
	"properties": {
		"state": {"method": "set", "property": "value", "datatype": "bool", "sizeInBit": 1, "filterDPT": ["1.001"]},
		"switchon": {"method": "set", "property": "value", "value": 1, "datatype": "bool", "sizeInBit": 1, "uihidden": true},
		"switchoff": {"method": "set", "property": "value", "value": 0, "datatype": "bool", "sizeInBit": 1, "uihidden": true},
		"fanspeed": {"method": "set", "property": "value", "datatype": "int", "sizeInBit": 8, "filterDPT": ["5.010"], "valueList": [{"text": "Off", "value": "0"}, {"text": "Low", "value": "1"}, {"text": "Medium", "value": "2"}, {"text": "High", "value": "3"}]}
	},
	"propertiesMeta": {
		"state": {"text": "State", "properties": ["state", "switchon", "switchoff"]},
		"fanspeed": {"text": "Speed", "properties": ["fanspeed"]}
	},
	"mappings": {
		"state": {"method": "get", "property": "value", "datatype": "bool", "sizeInBit": 1, "filterDPT": ["1.001"]},
		"fanspeed": {"method": "get", "property": "value", "datatype": "int", "sizeInBit": 8, "filterDPT": ["5.010"], "valueList": [{"text": "Off", "value": "0"}, {"text": "Low", "value": "1"}, {"text": "Medium", "value": "2"}, {"text": "High", "value": "3"}]},
		"temperature": {"method": "get", "property": "value", "datatype": "float", "unit": "temperature", "sizeInBit": 16, "filterDPT": ["9.001"]},
		"filter": {"method": "get", "property": "value", "datatype": "bool", "sizeInBit": 1, "filterDPT": ["1.005"]}
	},
	"mappingsMeta": {
		"state": {"text": "State", "properties": ["state"]},
		"fanspeed": {"text": "Speed", "properties": ["fanspeed"]},
		"temperature": {"text": "Temperature", "properties": ["temperature"]},
		"filter": {"text": "Filter wechseln", "properties": ["filter"]}
	},
	"actionTemplates": [
		{"templateid": "switchon", "mapping": "switchon", "text": "Turn On", "icon": "toggle-on"},
		{"templateid": "switchoff", "mapping": "switchoff", "text": "Turn Off", "icon": "toggle-off"},
		{"templateid": "fanspeed", "mapping": "fanspeed", "text": "Speed", "icon": "tachometer", "valueList": [{"text": "Off", "value": "0"}, {"text": "Low", "value": "1"}, {"text": "Medium", "value": "2"}, {"text": "High", "value": "3"}]}
	],
	"triggerTemplates": [
		{"templateid": "state.on", "mapping": "state", "text": "Is Turned On", "value": "1", "icon": "toggle-on"},
		{"templateid": "state.off", "mapping": "state", "text": "Is Turned Off", "value": "0", "icon": "toggle-off"},
		{"templateid": "temperature", "mapping": "temperature", "text": "Temperature", "icon": "thermometer"},
		{"templateid": "filter", "mapping": "filter", "text": "Filter wechseln", "value": "1", "icon": "exclamation-triangle"}
	],
	"hideProperties": true,
	"hideMappings": true
}

Che cosa mostra l'esempio:

  • Campi degli indirizzi: da propertiesMeta nascono i campi State e Speed per gli indirizzi di gruppo per commutare, da mappingsMeta i campi per gli indirizzi di stato di accensione, livello, temperatura e allarme filtro.
  • Dimensione e tipo di punto dati: sizeInBit 1 per commutare (DPT 1.001) e per l'allarme (DPT 1.005), 8 per il livello (DPT 5.010), 16 per la temperatura (DPT 9.001). filterDPT propone durante l'assegnazione solo gli indirizzi di gruppo adatti.
  • Elenco di valori come elenco dei valori ammessi: l'azione fanspeed accetta solo da 0 a 3.
  • Nessun feedback reachable: la raggiungibilità segue la connessione KNX.
  • Modelli: l'allarme filtro è creato come trigger con il valore fisso 1, quindi l'automazione non richiede alcun valore.
  • Testo senza traduzione: «Filter wechseln» non è un termine nomos e compare così in ogni lingua.

Luce, dimmer, ombreggiatura, termostato e molti sensori sono già inclusi nella competenza KNX; un profilo proprio conviene per i dispositivi che lì mancano.