Ok
das wird etwas ausführlicher:
Das Script für den Sensor:
Ich werte zunächst die einzelnen Sensorwerte aus und beschreibe damit einen Datenpunkt:
Luftdruck
! ````
const Druck = "sonoff.0.Umweltsensor.BME680_SeaPressure"/Umweltsensor BME680 SeaPressure/;
! function setLuftdruck(x) {
var y = 0;
if(x > 980) y = 1;
if(x > 1000) y = 2;
if(x > 1020) y = 3;
if(x > 1040) y = 4;
if(x > 1080) y = 5;
setState("javascript.1.Luftdruck"/Luftdruck/,y, true);
}
! setLuftdruck(getState(Druck).val); // Skriptstart
! on(Druck, function(dp) { // triggert bei Wertänderung
setLuftdruck(dp.state.val);
});
Luftfeuchte
>! ````
const Feuchte = "sonoff.0.Eingang.SI7021_Humidity"/*Eingang SI7021 Humidity*/;
>! function setLuftfeuchte(x) {
var y = 0;
if(x > 20) y = 1;
if(x > 40) y = 2;
if(x > 60) y = 3;
if(x > 80) y = 4;
if(x > 100) y = 5;
setState("javascript.1.Luftfeuchte"/*Luftfeuchte*/, y, true);
}
>! setLuftfeuchte(getState(Feuchte).val); // Skriptstart
>! on(Feuchte, function(dp) { // triggert bei Wertänderung
setLuftfeuchte(dp.state.val);
});
Temperatur
! ````
const Lufttemperatur = "sonoff.0.Eingang.SI7021_Temperature"/Eingang SI7021 Temperature/;
! function setTemperatur(x) {
var y = 0;
if(x > -10) y = 1;
if(x > 10) y = 2;
if(x > 18) y = 3;
if(x > 26) y = 4;
if(x > 34) y = 5;
setState("javascript.1.Lufttemperatur"/Lufttemperatur/, y, true);
}
! setTemperatur(getState(Lufttemperatur).val); // Skriptstart
! on(Lufttemperatur, function(dp) { // triggert bei Wertänderung
setTemperatur(dp.state.val);
});
Daraus berechne ich den Wert der Luftgüte:
>! ````
on({id: 'sonoff.0.Umweltsensor.BME680_Gas', change: "ne"}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
setState("javascript.1.Luftguete"/*Luftguete*/,
((79 - getState("sonoff.0.Umweltsensor.BME680_Temperature").val) / 260.7
+ (60 - getState("sonoff.0.Umweltsensor.BME680_Humidity").val) / 336
+ (getState("sonoff.0.Umweltsensor.BME680_Gas").val / 5) * 4.9), true);
});
und wandle das dann noch in eine Ampelanzeige um:
! ````
const Luftguete = "javascript.1.Luftguete"/Luftguete/;
! function setQualitaet(x) {
var y = 0;
if(x > 50) y = 1;
if(x > 100) y = 2;
if(x > 150) y = 3;
if(x > 200) y = 4;
if(x > 300) y = 5;
setState("javascript.1.Luftqualität"/Luftqualität/, y, true);
}
! setQualitaet(getState(Luftguete).val); // Skriptstart
! on(Luftguete, function(dp) { // triggert bei Wertänderung
setQualitaet(dp.state.val);
});
bzw. generiere ich aus den Werten 1-5 mit dem Widget eine Farbige Anzeige.
Inwieweit die Werte jetzt genau den Vorgaben entsprechen kann ich dir leider nicht beantworten, da es scheinbar ein Staatsgeheimnis ist wie die Luftgüte wirklich berechnet wird. Dazu kommt der "hochgeheime" BME680 dessen Werte auch nicht wirklich sauber dokumentiert sind.
Ich denke man könnte das alles in ein Script packen, aber da habe ich mal die Finger davon gelassen. Da gibt es hier Spezialisten die das mit einem Blinzeln erledigen. Ich persönlich bin froh das es so verlässlich läuft.