intermediate: allow for config array definitions, prepare multiple sensors

This commit is contained in:
andreas 2023-11-03 12:34:33 +01:00
parent f3c682422f
commit 16b7652f1d
4 changed files with 567 additions and 444 deletions

View File

@ -108,6 +108,44 @@ def mergeConfig(base,other):
base=base+merge base=base+merge
return base return base
def replaceTexts(data,replacements):
if replacements is None:
return data
if isinstance(data,str):
for k,v in replacements.items():
data=data.replace("$"+k,str(v))
return data
if isinstance(data,list):
rt=[]
for e in data:
rt.append(replaceTexts(e,replacements))
return rt
if isinstance(data,dict):
rt={}
for k,v in data.items():
rt[replaceTexts(k,replacements)]=replaceTexts(v,replacements)
return rt
return data
def expandConfig(config):
rt=[]
for item in config:
type=item.get('type')
if type != 'array':
rt.append(item)
continue
replacements=item.get('replace')
children=item.get('children')
name=item.get('name')
if name is None:
name="#unknown#"
if not isinstance(replacements,list):
raise Exception("missing replacements at array %s"%name)
for replace in replacements:
if children is not None:
for c in children:
rt.append(replaceTexts(c,replace))
return rt
def generateMergedConfig(inFile,outFile,addDirs=[]): def generateMergedConfig(inFile,outFile,addDirs=[]):
if not os.path.exists(inFile): if not os.path.exists(inFile):
raise Exception("unable to read cfg file %s"%inFile) raise Exception("unable to read cfg file %s"%inFile)
@ -115,6 +153,7 @@ def generateMergedConfig(inFile,outFile,addDirs=[]):
with open(inFile,'rb') as ch: with open(inFile,'rb') as ch:
config=json.load(ch) config=json.load(ch)
config=mergeConfig(config,addDirs) config=mergeConfig(config,addDirs)
config=expandConfig(config)
data=json.dumps(config,indent=2) data=json.dumps(config,indent=2)
writeFileIfChanged(outFile,data) writeFileIfChanged(outFile,data)

View File

@ -3,7 +3,12 @@
#ifdef _GWIIC #ifdef _GWIIC
#include <Wire.h> #include <Wire.h>
#endif #endif
#ifdef GWSHT3X #if defined(GWSHT3X) || defined(GWSHT3X1) || defined(GWSHT3X2) || defined(GWSHT3X2) || defined(GWSHT3X4)
#define _GWSHT3X
#else
#undef _GWSHT3X
#endif
#ifdef _GWSHT3X
#include "SHT3X.h" #include "SHT3X.h"
#endif #endif
#ifdef GWQMP6988 #ifdef GWQMP6988
@ -16,7 +21,6 @@
#ifdef GWBME280 #ifdef GWBME280
#include <Adafruit_BME280.h> #include <Adafruit_BME280.h>
#endif #endif
//#define GWSHT3X -1
#ifndef GWIIC_SDA #ifndef GWIIC_SDA
#define GWIIC_SDA -1 #define GWIIC_SDA -1
@ -29,14 +33,14 @@
cfg->getValue(name, GwConfigDefinitions::prefix ## name) cfg->getValue(name, GwConfigDefinitions::prefix ## name)
#define CSHT3X(name) \ #define CSHT3X(name) \
CFG_GET(config,name,SHT3X) CFG_GET(config,name,SHT3X1)
#define CQMP6988(name) \ #define CQMP6988(name) \
CFG_GET(config,name,QMP6988) CFG_GET(config,name,QMP69881)
#define CBME280(name) \ #define CBME280(name) \
CFG_GET(config,name,BME280) CFG_GET(config,name,BME2801)
class SHT3XConfig{ class SHT3XConfig{
public: public:
const String prefix="SHT3X"; const String prefix="SHT3X1";
String tmNam; String tmNam;
String huNam; String huNam;
int iid; int iid;
@ -60,7 +64,7 @@ class SHT3XConfig{
class QMP6988Config{ class QMP6988Config{
public: public:
const String prefix="QMP6988"; const String prefix="QMP69881";
String prNam="Pressure"; String prNam="Pressure";
int iid=99; int iid=99;
bool prAct=true; bool prAct=true;
@ -79,7 +83,7 @@ class QMP6988Config{
class BME280Config{ class BME280Config{
public: public:
const String prefix="BME280"; const String prefix="BME2801";
bool prAct=true; bool prAct=true;
bool tmAct=true; bool tmAct=true;
bool huAct=true; bool huAct=true;

View File

@ -1,18 +1,40 @@
[ [
{ {
"name": "SHT3XtmAct", "type": "array",
"label": "SHT3X Temp", "name": "SHT3X",
"replace": [
{
"b": "1",
"i": "1",
"n": "99"
},
{
"b": "1",
"i": "2",
"n": "98"
},
{
"b": "2",
"i": "1",
"n": "109"
}
],
"children": [
{
"name": "SHT3X$itmAct",
"label": "SHT3X$i Temp",
"type": "boolean", "type": "boolean",
"default": "true", "default": "true",
"description": "Enable the I2C SHT3x temp sensor", "description": "Enable the $i. I2C SHT3x temp sensor (bus $b)",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"SHT3X":"true" "SHT3X$i": "true"
} }
}, },
{ {
"name": "SHT3XtmSrc", "name": "SHT3X$itmSrc",
"label": "SHT3X Temp Type", "label": "SHT3X$i Temp Type",
"type": "list", "type": "list",
"default": "2", "default": "2",
"description": "the NMEA2000 source type for the temperature", "description": "the NMEA2000 source type for the temperature",
@ -82,159 +104,201 @@
"v": "15" "v": "15"
} }
], ],
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"SHT3X":"true" "SHT3X$i": "true"
} }
}, },
{ {
"name": "SHT3XhuAct", "name": "SHT3X$ihuAct",
"label": "SHT3X Humidity", "label": "SHT3X$i Humidity",
"type": "boolean", "type": "boolean",
"default": "true", "default": "true",
"description": "Enable the I2C SHT3x humidity sensor", "description": "Enable the $i. I2C SHT3x humidity sensor (bus $b)",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"SHT3X":"true" "SHT3X$i": "true"
} }
}, },
{ {
"name": "SHT3XhuSrc", "name": "SHT3X$ihuSrc",
"label": "SHT3X Humid Type", "label": "SHT3X$i Humid Type",
"list":[ "list": [
{"l":"OutsideHumidity","v":"1"}, {
{"l":"Undef","v":"0xff"} "l": "OutsideHumidity",
"v": "1"
},
{
"l": "Undef",
"v": "0xff"
}
], ],
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"SHT3X":"true" "SHT3X": "true"
} }
}, },
{ {
"name": "SHT3Xiid", "name": "SHT3X$iiid",
"label": "SHT3X N2K iid", "label": "SHT3X$i N2K iid",
"type": "number", "type": "number",
"default": 99, "default": "$n",
"description": "the N2K instance id for the SHT3X Temperature and Humidity ", "description": "the N2K instance id for the $i. SHT3X Temperature and Humidity ",
"category": "sensors", "category": "iicsensors$b",
"min": 0, "min": 0,
"max": 253, "max": 253,
"check": "checkMinMax", "check": "checkMinMax",
"capabilities": { "capabilities": {
"SHT3X":"true" "SHT3X$i": "true"
} }
}, },
{ {
"name": "SHT3Xintv", "name": "SHT3X$iintv",
"label": "SHT3X Interval", "label": "SHT3X$i Interval",
"type": "number", "type": "number",
"default": 2, "default": 2,
"description": "Interval(s) to query SHT3X Temperature and Humidity (1...300)", "description": "Interval(s) to query SHT3X Temperature and Humidity (1...300)",
"category": "sensors", "category": "iicsensors$b",
"min": 1, "min": 1,
"max": 300, "max": 300,
"check": "checkMinMax", "check": "checkMinMax",
"capabilities": { "capabilities": {
"SHT3X":"true" "SHT3X$i": "true"
} }
}, },
{ {
"name": "SHT3XtmNam", "name": "SHT3X$itmNam",
"label": "SHT3X Temp XDR", "label": "SHT3X$i Temp XDR",
"type": "String", "type": "String",
"default": "Temp", "default": "Temp$i",
"description": "set the XDR transducer name for the SHT3X Temperature, leave empty to disable NMEA0183 XDR ", "description": "set the XDR transducer name for the $i. SHT3X Temperature, leave empty to disable NMEA0183 XDR ",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"SHT3X":"true" "SHT3X$i": "true"
} }
}, },
{ {
"name": "SHT3XhuNam", "name": "SHT3X$ihuNam",
"label": "SHT3X Humid XDR", "label": "SHT3X$i Humid XDR",
"type": "String", "type": "String",
"default": "Humidity", "default": "Humidity$i",
"description": "set the XDR transducer name for the SHT3X Humidity, leave empty to disable NMEA0183 XDR", "description": "set the XDR transducer name for the $i. SHT3X Humidity, leave empty to disable NMEA0183 XDR",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"SHT3X":"true" "SHT3X$i": "true"
}
}
]
},
{
"type": "array",
"name": "QMP6988",
"replace": [
{
"b": "1",
"i": "1",
"n": "97"
},
{
"b": "1",
"i": "2",
"n": "96"
}
],
"children": [
{
"name": "QMP6988$iprAct",
"label": "QMP6988-$i pressure",
"description": "activate the $i. QMP6988 pressure measurement (bus $b)",
"type": "boolean",
"default": "true",
"category": "iicsensors$b",
"capabilities": {
"QMP6988$i": "true"
} }
}, },
{ {
"name": "QMP6988prAct", "name": "QMP6988$iiid",
"label": "QMP6988 pressure", "label": "QMP6988-$i N2K iid",
"description": "activate the QMP6988 pressure measurement",
"type":"boolean",
"default":"true",
"category": "sensors",
"capabilities": {
"QMP6988":"true"
}
},
{
"name": "QMP6988iid",
"label": "QMP6988 N2K iid",
"type": "number", "type": "number",
"default": 99, "default": "$n",
"description": "the N2K instance id for the QMP6988 pressure", "description": "the N2K instance id for the $i. QMP6988 pressure",
"category": "sensors", "category": "iicsensors$b",
"min": 0, "min": 0,
"max": 253, "max": 253,
"check": "checkMinMax", "check": "checkMinMax",
"capabilities": { "capabilities": {
"QMP6988":"true" "QMP6988$i": "true"
} }
}, },
{ {
"name": "QMP6988intv", "name": "QMP6988$iintv",
"label": "QMP6988 Interval", "label": "QMP6988-$i Interval",
"type": "number", "type": "number",
"default": 2, "default": 2,
"description": "Interval(s) to query QMP6988 Pressure (1...300)", "description": "Interval(s) to query the $i. QMP6988 Pressure (1...300)",
"category": "sensors", "category": "iicsensors$b",
"min": 1, "min": 1,
"max": 300, "max": 300,
"check": "checkMinMax", "check": "checkMinMax",
"capabilities": { "capabilities": {
"QMP6988":"true" "QMP6988$i": "true"
} }
}, },
{ {
"name": "QMP6988prNam", "name": "QMP6988$iprNam",
"label": "QMP6988 Pressure XDR", "label": "QMP6988-$i Pressure XDR",
"type": "String", "type": "String",
"default": "Pressure", "default": "Pressure$i",
"description": "set the XDR transducer name for the QMP6988 Pressure, leave empty to disable NMEA0183 XDR", "description": "set the XDR transducer name for the $i. QMP6988 Pressure, leave empty to disable NMEA0183 XDR",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"QMP6988":"true" "QMP6988$i": "true"
} }
}, },
{ {
"name":"QMP6988prOff", "name": "QMP6988$iprOff",
"label":"QMP6988 Pressure Offset", "label": "QMP6988-$i Pressure Offset",
"type": "number", "type": "number",
"description": "offset (in pa) to be added to the QMP6988 pressure measurements", "description": "offset (in pa) to be added to the $i. QMP6988 pressure measurements",
"default":"0", "default": "0",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"QMP6988":"true" "QMP6988$i": "true"
} }
}
]
}, },
{ {
"name": "BME280tmAct", "type": "array",
"label": "BME280 Temp", "name": "BME280",
"replace": [
{
"b": "1",
"i": "1",
"n": "95"
},
{
"b": "1",
"i": "2",
"n": "94"
}
],
"children": [
{
"name": "BME280$itmAct",
"label": "BME280-$i Temp",
"type": "boolean", "type": "boolean",
"default": "true", "default": "true",
"description": "Enable the I2C BME280 temp sensor", "description": "Enable the $i. I2C BME280 temp sensor (bus $b)",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
}, },
{ {
"name": "BME280tmSrc", "name": "BME280$itmSrc",
"label": "BME280 Temp Type", "label": "BME280-$i Temp Type",
"type": "list", "type": "list",
"default": "2", "default": "2",
"description": "the NMEA2000 source type for the temperature", "description": "the NMEA2000 source type for the temperature",
@ -304,130 +368,141 @@
"v": "15" "v": "15"
} }
], ],
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
}, },
{ {
"name":"BME280tmOff", "name": "BME280$itmOff",
"label":"BME280 Temperature Offset", "label": "BME280-$i Temperature Offset",
"type": "number", "type": "number",
"description": "offset (in °) to be added to the BME280 temperature measurements", "description": "offset (in °) to be added to the BME280 temperature measurements",
"default":"0", "default": "0",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
}, },
{ {
"name": "BME280huAct", "name": "BME280$ihuAct",
"label": "BME280 Humidity", "label": "BME280-$i Humidity",
"type": "boolean", "type": "boolean",
"default": "true", "default": "true",
"description": "Enable the I2C BME280 humidity sensor", "description": "Enable the $i. I2C BME280 humidity sensor",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
}, },
{ {
"name": "BME280huSrc", "name": "BME280$ihuSrc",
"label": "BME280 Humid Type", "label": "BME280-$i Humid Type",
"type": "list", "type": "list",
"description": "the NMEA2000 source type for the humidity", "description": "the NMEA2000 source type for the humidity",
"default": "0", "default": "0",
"list":[ "list": [
{"l":"InsideHumidity","v":"0"}, {
{"l":"OutsideHumidity","v":"1"}, "l": "InsideHumidity",
{"l":"Undef","v":"0xff"} "v": "0"
},
{
"l": "OutsideHumidity",
"v": "1"
},
{
"l": "Undef",
"v": "0xff"
}
], ],
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
}, },
{ {
"name": "BME280prAct", "name": "BME280$iprAct",
"label": "BME280 Pressure", "label": "BME280-$i Pressure",
"type": "boolean", "type": "boolean",
"default": "true", "default": "true",
"description": "Enable the I2C BME280 pressure sensor", "description": "Enable the $i. I2C BME280 pressure sensor (bus $b)",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
}, },
{ {
"name":"BME280prOff", "name": "BME280$iprOff",
"label":"BME280 Pressure Offset", "label": "BME280 Pressure Offset",
"type": "number", "type": "number",
"description": "offset (in pa) to be added to the BME280 pressure measurements", "description": "offset (in pa) to be added to the BME280 pressure measurements",
"default":"0", "default": "0",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
}, },
{ {
"name": "BME280iid", "name": "BME280$iiid",
"label": "BME280 N2K iid", "label": "BME280-$i N2K iid",
"type": "number", "type": "number",
"default": 99, "default": "$n",
"description": "the N2K instance id for the BME280 Temperature and Humidity ", "description": "the N2K instance id for the BME280 Temperature and Humidity ",
"category": "sensors", "category": "iicsensors$b",
"min": 0, "min": 0,
"max": 253, "max": 253,
"check": "checkMinMax", "check": "checkMinMax",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
}, },
{ {
"name": "BME280intv", "name": "BME280$iintv",
"label": "BME280 Interval", "label": "BME280-$i Interval",
"type": "number", "type": "number",
"default": 2, "default": 2,
"description": "Interval(s) to query BME280 Temperature and Humidity (1...300)", "description": "Interval(s) to query BME280 Temperature and Humidity (1...300)",
"category": "sensors", "category": "iicsensors$b",
"min": 1, "min": 1,
"max": 300, "max": 300,
"check": "checkMinMax", "check": "checkMinMax",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
}, },
{ {
"name": "BME280tmNam", "name": "BME280$itmNam",
"label": "BME280 Temp XDR", "label": "BME280-$i Temp XDR",
"type": "String", "type": "String",
"default": "Temp", "default": "BTemp$i",
"description": "set the XDR transducer name for the BME280 Temperature, leave empty to disable NMEA0183 XDR ", "description": "set the XDR transducer name for the BME280 Temperature, leave empty to disable NMEA0183 XDR ",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
}, },
{ {
"name": "BME280huNam", "name": "BME280$ihuNam",
"label": "BME280 Humid XDR", "label": "BME280-$i Humid XDR",
"type": "String", "type": "String",
"default": "Humidity", "default": "BHumidity$i",
"description": "set the XDR transducer name for the BME280 Humidity, leave empty to disable NMEA0183 XDR", "description": "set the XDR transducer name for the BME280 Humidity, leave empty to disable NMEA0183 XDR",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
}, },
{ {
"name": "BME280prNam", "name": "BME280$iprNam",
"label": "BME280 Pressure XDR", "label": "BME280-$i Pressure XDR",
"type": "String", "type": "String",
"default": "Pressure", "default": "BPressure$i",
"description": "set the XDR transducer name for the BME280 Pressure, leave empty to disable NMEA0183 XDR", "description": "set the XDR transducer name for the BME280 Pressure, leave empty to disable NMEA0183 XDR",
"category": "sensors", "category": "iicsensors$b",
"capabilities": { "capabilities": {
"BME280":"true" "BME280$i": "true"
} }
} }
]
}
] ]

View File

@ -1020,9 +1020,7 @@ function toggleClass(el,id,classList){
} }
function createConfigDefinitions(parent, capabilities, defs,includeXdr) { function createConfigDefinitions(parent, capabilities, defs,includeXdr) {
let category; let categories={};
let categoryEl;
let categoryFrame;
let frame = parent.querySelector('.configFormRows'); let frame = parent.querySelector('.configFormRows');
if (!frame) throw Error("no config form"); if (!frame) throw Error("no config form");
frame.innerHTML = ''; frame.innerHTML = '';
@ -1036,22 +1034,24 @@ function createConfigDefinitions(parent, capabilities, defs,includeXdr) {
else{ else{
if(includeXdr) return; if(includeXdr) return;
} }
if (item.category != category || !categoryEl) { let catEntry;
if (categoryFrame && ! currentCategoryPopulated){ if (categories[item.category] === undefined){
categoryFrame.remove(); catEntry={
populated:false,
frame: undefined,
element: undefined
} }
currentCategoryPopulated=false; categories[item.category]=catEntry
categoryFrame = addEl('div', 'category', frame); catEntry.frame = addEl('div', 'category', frame);
categoryFrame.setAttribute('data-category',item.category) catEntry.frame.setAttribute('data-category',item.category)
let categoryTitle = addEl('div', 'title', categoryFrame); let categoryTitle = addEl('div', 'title', catEntry.frame);
let categoryButton = addEl('span', 'icon icon-more', categoryTitle); let categoryButton = addEl('span', 'icon icon-more', categoryTitle);
addEl('span', 'label', categoryTitle, item.category); addEl('span', 'label', categoryTitle, item.category);
addEl('span','categoryAdd',categoryTitle); addEl('span','categoryAdd',categoryTitle);
categoryEl = addEl('div', 'content', categoryFrame); catEntry.element = addEl('div', 'content', catEntry.frame);
categoryEl.classList.add('hidden'); catEntry.element.classList.add('hidden');
let currentEl = categoryEl;
categoryTitle.addEventListener('click', function (ev) { categoryTitle.addEventListener('click', function (ev) {
let rs = currentEl.classList.toggle('hidden'); let rs = catEntry.element.classList.toggle('hidden');
if (rs) { if (rs) {
toggleClass(categoryButton,0,moreicons); toggleClass(categoryButton,0,moreicons);
} }
@ -1059,7 +1059,9 @@ function createConfigDefinitions(parent, capabilities, defs,includeXdr) {
toggleClass(categoryButton,1,moreicons); toggleClass(categoryButton,1,moreicons);
} }
}) })
category = item.category; }
else{
catEntry=categories[item.category];
} }
let showItem=true; let showItem=true;
let itemCapabilities=item.capabilities||{}; let itemCapabilities=item.capabilities||{};
@ -1089,8 +1091,8 @@ function createConfigDefinitions(parent, capabilities, defs,includeXdr) {
} }
if (showItem) { if (showItem) {
item.readOnly=readOnly; item.readOnly=readOnly;
currentCategoryPopulated=true; catEntry.populated=true;
let row = addEl('div', 'row', categoryEl); let row = addEl('div', 'row', catEntry.element);
let label = item.label || item.name; let label = item.label || item.name;
addEl('span', 'label', row, label); addEl('span', 'label', row, label);
let valueFrame = addEl('div', 'value', row); let valueFrame = addEl('div', 'value', row);
@ -1136,8 +1138,11 @@ function createConfigDefinitions(parent, capabilities, defs,includeXdr) {
}); });
} }
}); });
if (categoryFrame && ! currentCategoryPopulated){ for (let cat in categories){
categoryFrame.remove(); let catEntry=categories[cat];
if (! catEntry.populated){
catEntry.frame.remove();
}
} }
} }
function loadConfigDefinitions() { function loadConfigDefinitions() {