Hallo!
Ich bin bei Shelly relativ neu aber jetzt schon begeistert.
Ich bin selber Techniker, genauer Machatroniker. Jedoch bin ich im Programmieren nicht wirklich begabt.
Ich habe einen Shelly PM mit einem Addon und 2 Temperatursensoren die den Vorlauf und den Rücklauf meiner Wärmepumpe messen. (Eigenbau dadurch nur berechnung durch verschiedene Messgeräte)
Durch die Formel der Wärmemenge kann man sich mit dem Delta T also der Temperaturdifferenz, dem Volumenstrom und der Wärmekapazität von Wasser
die momentane Heizleistung errechnen.
Bei mir ist der Volumenstrom mit 0,565 m³/h konstant. Das sind 0,1569 L/s.
Das Delta T kommt von meinen Sensoren.
Jetzt wäre es genial wenn ich die beiden Temp Sensoren auslesen könnte und mir die Leistung anzeigen lassen könnte.
Formel sollte dann Volumenstrom in L/s (0,1569) * Wärmekapazität Wasser (4180) * Delta T sein( aus den beiden Sensoren)
Ich habe ChatGPT dazu bereits befragt, im Grunde dürfte ChatGPT die Programmiersprache der Shellys kennen jedoch funktioniert es nicht.
Ich weis auch nicht ob die Shellys überhaupt virtuelle Sensoren erstellen können...
Hier der Output nach mehereren Frage - Antwort Spielchen
// Define the IP of the Shelly device
const shelly_ip = "192.168.0.5"; // Replace with your Shelly device IP
// Fixed flow rate (in liters per second)
const flowRate = 0.1569; // Modify this to the actual flow rate (L/s)
// Specific heat capacity of water (J/kg°C)
const specificHeatCapacity = 4180; // in J/kg°C
// Function to fetch and extract the temperature value (tC) from a specific sensor
function getTemperature(sensorKey) {
// Send HTTP GET request to Shelly.GetStatus
let url = `http://${shelly_ip}/rpc/Shelly.GetStatus`;
// Fetch the data from the Shelly device
let response = HTTP.get(url);
// Check if the request was successful
if (response.status_code === 200) {
// Parse the JSON response
let data = JSON.parse(response.body);
// Check if the sensor exists in the data
if (data[sensorKey]) {
// Extract the tC value (Celsius temperature)
let temperature = data[sensorKey].tC;
// Log the temperature for debugging
console.log(`Extracted Temperature (tC) from ${sensorKey}: ` + temperature + "°C");
// Return the extracted temperature value
return temperature;
} else {
console.log(`Sensor ${sensorKey} not found in the response.`);
return null;
}
} else {
console.log("Error fetching data from Shelly device. Status Code: " + response.status_code);
return null;
}
}
// Function to calculate heat energy (in watts)
function calculateHeatEnergy(temperatureSupply, temperatureReturn) {
// Calculate the temperature difference (ΔT)
let deltaT = temperatureSupply - temperatureReturn;
console.log("Temperature Difference (ΔT): " + deltaT + "°C");
// Calculate the heat energy in joules (J)
let heatEnergy = flowRate * deltaT * specificHeatCapacity;
console.log("Heat Energy: " + heatEnergy + " J/s (Watts)");
// Return the calculated heat energy (in Watts)
return heatEnergy;
}
// Function to create a virtual sensor in Shelly
function createVirtualSensor() {
// Send a POST request to create a virtual sensor
let url = `http://${shelly_ip}/rpc/shelly.add_virtual_device`;
let data = {
"name": "Heat Energy Sensor",
"device_type": "sensor",
"sensor_type": "temperature", // Use a sensor type that makes sense, like temperature for display purposes
};
let response = HTTP.post(url, JSON.stringify(data));
if (response.status_code === 200) {
console.log("Virtual sensor created successfully!");
} else {
console.log("Failed to create virtual sensor. Status Code: " + response.status_code);
}
}
// Function to update the virtual sensor with the calculated heat energy
function updateVirtualSensor(heatEnergy) {
// Send a POST request to update the virtual sensor with the heat energy value
let url = `http://${shelly_ip}/rpc/shelly.set_virtual_sensor_value`;
let data = {
"sensor_id": 0, // Virtual sensor ID (this might need to be adjusted based on your device)
"value": heatEnergy,
};
let response = HTTP.post(url, JSON.stringify(data));
if (response.status_code === 200) {
console.log("Virtual sensor updated successfully with heat energy: " + heatEnergy + " Watts");
} else {
console.log("Failed to update virtual sensor. Status Code: " + response.status_code);
}
}
// Main function to fetch temperatures, calculate heat, and update virtual sensor
function main() {
// Fetch the supply and return temperature from the Shelly device (using the correct sensor keys)
let temperatureSupply = getTemperature("temperature:101"); // Supply temperature (sensor 101)
let temperatureReturn = getTemperature("temperature:100"); // Return temperature (sensor 100)
// Ensure both temperatures are available
if (temperatureSupply !== null && temperatureReturn !== null) {
// Calculate the heat energy
let heatEnergy = calculateHeatEnergy(temperatureSupply, temperatureReturn);
// Create the virtual sensor if it does not exist
createVirtualSensor();
// Update the virtual sensor with the calculated heat energy
updateVirtualSensor(heatEnergy);
// Optionally, you can send this value to a virtual sensor or display it in your system
console.log("Calculated Heat Energy: " + heatEnergy + " Watts");
} else {
console.log("Unable to fetch both temperatures for heat calculation.");
}
}
// Run the main function
main();
Alles anzeigen
Die Antwort die vom Shelly PM und Addon beim GetStatus kommt ist diese:
Ich benötige tC von Temperature100 und Temperature101
{"ble":{},"cloud":{"connected":true},"input:0":{"id":0,"state":false},"mqtt":{"connected":false},"script:1":{"id":1,"running":false,"mem_free":25200,"errors":["syntax_error"]},"switch:0":{"id":0, "source":"init", "output":true, "apower":298.0, "voltage":226.8, "current":1.659, "aenergy":{"total":30090.281,"by_minute":[4949.144,4946.614,4954.626],"minute_ts":1734438060},"temperature":{"tC":41.6, "tF":106.9}},"sys":{"mac":"10061CCCC718","restart_required":false,"time":"13:21","unixtime":1734438104,"uptime":238933,"ram_size":246844,"ram_free":139580,"fs_size":458752,"fs_free":126976,"cfg_rev":18,"kvs_rev":0,"schedule_rev":0,"webhook_rev":0,"available_updates":{"stable":{"version":"1.4.4"}},"reset_reason":3},"temperature:100":{"id": 100,"tC":26.9, "tF":80.4},"temperature:101":{"id": 101,"tC":24.7, "tF":76.4},"wifi":{"sta_ip":"192.168.0.5","status":"got ip","ssid":"Google_Truck","rssi":-65},"ws":{"connected":false}}
Zum Schluss wäre noch das Tüpfelchen auf dem I wenn ich noch Berechnen und Anzeigen lassen kann die Erzeugte Wärmeenergie in W / die aufgenommene Leistung in W vom Shelly PM das wäre dann Der COP, also die Leistungszahl der Wärmepumpe.
Ich bedanke mich jetzt schon recht herzlich demjenigen der sich meinem Problem annehmen kann.
flotschi