Hi!
Ich möchte gerne das mein Skript mir den Taupunkt und den VPD anhand eines H&T Sensors berechnet und mir die Werte dann als Nachricht oder irgendwie an die Shelly App meldet.
Ich hab mit Chat GPT und mit Fragmenten aus dem Forum schonmal an einem Skript gearbeitet, bekomme es aber micht hin das es die Daten irgendwo hin sendet.
Ich bin absoluter Greenhorn in der ganzen Sache, bitte mich fertig machen.
Das Skript:
let url = 'https://shelly-142-eu.shelly.cloud/device/status';
let body = JSON.stringify({
id: ‘*****',
auth_key: ‘*****'
});
// Abruf der Gerätedaten (Temperatur und Feuchtigkeit)
Shelly.call('HTTP.POST',
{url: url, body: body},
function (response) {
let oResponseBody = JSON.parse(response.body);
log("API Response: " + response.body); // Logge die gesamte Antwort
if (oResponseBody.isok) {
// Extrahieren der Temperatur und Feuchtigkeit
let oTemperature = oResponseBody.data.device_status['temperature:0'];
let oHumidity = oResponseBody.data.device_status['humidity:0'];
log("Temperatur: " + oTemperature.tC);
log("Feuchtigkeit: " + oHumidity.rh);
let a = oTemperature.tC; // Temperatur als 'a'
let b = oHumidity.rh; // Feuchtigkeit als 'b'
// Berechnung des Taupunkts und des Dampfdruckdefizits
let dewPoint = calculateDewPoint(a, b);
let dpd = calculateDewPointDeficit(a, b);
if (dewPoint !== null && dpd !== null) {
// Messen der berechneten Werte in die Shelly App (oder als MQTT-Benachrichtigung)
reportToShelly(dewPoint, dpd);
} else {
log("Fehler: Ungültige Berechnungen");
}
} else {
log("Fehler: " + oResponseBody.error_message); // Fehlernachricht aus der Antwort
}
}
);
// Berechnung des Taupunkts
function calculateDewPoint(a, b) {
if (isNaN(a) isNaN(b)) {
log("Ungültige Eingabewerte: Temperatur oder Feuchtigkeit ist NaN.");
return null;
}
let temp = a;
let humidity = b;
let gamma = (17.27 * temp) / (237.7 + temp) + Math.log(humidity / 100.0);
let dewPoint = (237.7 * gamma) / (17.27 - gamma);
return dewPoint;
}
// Berechnung des Dampfdruckdefizits
function calculateDewPointDeficit(temp, humidity) {
if (isNaN(temp) isNaN(humidity)) {
log("Ungültige Eingabewerte: Temperatur oder Feuchtigkeit ist NaN.");
return null;
}
let E_s = 6.112 * Math.exp((17.27 * temp) / (237.7 + temp));
let E_a = E_s * (humidity / 100);
let dpd = E_s - E_a;
return dpd;
}
// Funktion, um den Taupunkt und Dampfdruckdefizit an die Shelly App zu melden
function reportToShelly(dewPoint, dpd) {
let deviceId = '****'; // Dein Shelly-Gerät-ID
let message = `Taupunkt: ${dewPoint.toFixed(2)} °C\nDampfdruckdefizit: ${dpd.toFixed(2)} hPa`;
// Erstelle den Body mit der Nachricht und sende es an die Shelly App
let body = JSON.stringify({
id: '****',
method: 'update_status', // Beispiel: Update-Methode, je nach API
params: {
message: message // Deine berechneten Werte als Textnachricht
}
});
// Sende die Nachricht an die Shelly App oder das Shelly-Gerät
Shelly.call('HTTP.POST',
{
url: `https://shelly-142-eu.shelly.cloud/device/update`, // Beispiel-URL, anpassen je nach API
body: body
},
function(response) {
log('Message reported to Shelly app: ' + response.body);
}
);
}
// Überwachungsfunktion, um den Taupunkt alle 15 Minuten zu berechnen und zu melden
function monitorDewPoint() {
try {
// Geräteinformationen abrufen
let temp = Shelly.getComponentStatus('Temperature', 100).tC;
let humidity = Shelly.getComponentStatus('Humidity', 100).rh;
// Überprüfen, ob die Werte erfolgreich abgerufen wurden
if (temp && humidity) {
let dewPoint = calculateDewPoint(temp, humidity);
let dpd = calculateDewPointDeficit(temp, humidity);
// Berechnete Werte melden
if (dewPoint !== null && dpd !== null) {
reportToShelly(dewPoint, dpd);
} else {
log("Fehler: Ungültige Berechnungen.");
}
} else {
log("Fehler beim Abrufen der Temperatur oder Luftfeuchtigkeit.");
}
} catch (e) {
log("Fehler: " + e);
}
}
// Timer setzen, um alle 15 Minuten die Werte zu melden (15 Minuten = 900.000 ms)
Timer.set(900000, true, monitorDewPoint);