stattdessen Home Assistant benutzen (per Shelly Integration oder besser MQTT).
hampenpampen Welche Funktionalität bietet die HA-MQTT Integration, die nicht auch mit der Standard HA Shelly Integration abgedeckt ist?
stattdessen Home Assistant benutzen (per Shelly Integration oder besser MQTT).
hampenpampen Welche Funktionalität bietet die HA-MQTT Integration, die nicht auch mit der Standard HA Shelly Integration abgedeckt ist?
flotschi Hab es nun 5x vergeblich versucht dieses Verhalten zu reproduzieren.
Hab keine Idee wie du es erreichtest... Kannst du es reproduzieren?
Version 1.6 mit COP bitte testen.
/// Calculate Water flow power V1.6(User))
////////////////////////////////////////////////////////////////////////////////////////////
///
/// Created by HighFive © 2024
///
/// Email: highfive@smartshome.work
/// Email: if_then_else@smartshome.work
///
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
let initial = true;
let loaded = false;
let progress = false;
////////////////////////////////////////////////////////////////////////////////////////////
const groupMETA = {
ui: {
"icon": "https://accessory.smartshome.work/files/HZG_WP.png"
}
};
const tempVLMETA = {
ui: {
view: "label",
"unit": "°C",
"step": 0.1,
"icon": "https://accessory.smartshome.work/files/Sensor.png"
}
};
const tempRLMETA = {
ui: {
view: "label",
"unit": "°C",
"step": 0.1,
"icon": "https://accessory.smartshome.work/files/Sensor.png"
}
};
const deltaTMETA = {
ui: {
view: "label",
"unit": "K",
"step": 0.1,
"icon": "https://accessory.smartshome.work/files/Sensor.png"
}
};
const volumeWaterMETA = {
ui: {
view: "label",
"unit": "l/h",
"step": 0.1,
"icon": "https://accessory.smartshome.work/files/Durchfluss_w.png"
}
};
const calcPowerWaterMETA = {
ui: {
view: "label",
"unit": "W",
"step": 0.1,
"icon": "https://accessory.smartshome.work/files/PWaerme.png"
}
};
const calcCOP_WPMETA = {
ui: {
view: "label",
"unit": "",
"step": 0.1,
"icon": "https://accessory.smartshome.work/files/WP.png"
}
};
////////////////////////////////////////////////////////////////////////////////////////////
const CONFIG = {
VCTempVL: {
name: "Vorlauf-Temperatur",
persisted: false,
min: -19,
max: 99,
default_value: -9.9,
meta: tempVLMETA
},
VCTempRL: {
name: "Rücklauf-Temperatur",
persisted: false,
min: -19,
max: 99,
default_value: -9.9,
meta: tempRLMETA
},
VCDeltaT: {
name: "ΔT [VL-RL]",
persisted: false,
min: -99,
max: 99,
default_value: -9.9,
meta: deltaTMETA
},
VCVolumeWater: {
name: "Durchfluss",
persisted: false,
min: -9999,
max: 9999,
default_value: -9.9,
meta: volumeWaterMETA
},
VCCalcPowerWater: {
name: "Wärmeleistung",
persisted: false,
min: -99999,
max: 99999,
default_value: -9.9,
meta: calcPowerWaterMETA
},
VCCalcCOP_WP: {
name: "COP",
persisted: false,
min: -99,
max: 99,
default_value: -9.9,
meta: calcCOP_WPMETA
},
VCGroup: {
name: "HEIZUNG Wärmepumpe",
meta: groupMETA
}
};
////////////////////////////////////////////////////////////////////////////////////////////
let DYN = {
VCGroup: null,
VCTempVL: null,
VCTempRL: null,
VCDeltaT: null,
VCVolumeWater: null,
VCCalcPowerWater: null,
VCCalcCOP_WP: null
};
////////////////////////////////////////////////////////////////////////////////////////////
///
////////////////////////////////////////////////////////////////////////////////////////////
function virtualComponent(type, virtualKey) {
progress = true;
Shelly.call("Shelly.GetComponents", {
"dynamic_only": true
}, function callback(result, error_code, error_message, userdata) {
if (error_code === 0) {
let _response = false;
if (result.components > 0) {
for (let i in result.components) {
let _key = result.components[i].key;
if (_key.slice(0, 7) === 'number:' && type == 'number') {
if (result.components[i].config.name === CONFIG[virtualKey].name) {
_response = true;
DYN[virtualKey] = result.components[i].config.id;
progress = false;
}
} else if (_key.slice(0, 6) === 'group:' && type == 'group') {
if (result.components[i].config.name === CONFIG[virtualKey].name) {
_response = true;
DYN[virtualKey] = result.components[i].config.id;
progress = false;
}
}
}
}
if (_response === false) {
Shelly.call("Virtual.Add", {
type: type,
config: CONFIG[virtualKey]
}, function callback(result, error_code, error_message, userdata) {
if (error_code === 0) {
if (type === "group") {
let _value = [
"number:" + DYN.VCTempVL,
"number:" + DYN.VCTempRL,
"number:" + DYN.VCDeltaT,
"number:" + DYN.VCVolumeWater,
"number:" + DYN.VCCalcPowerWater,
"number:" + DYN.VCCalcCOP_WP
];
Shelly.call("Group.Set", {
id: result.id,
value: _value
});
}
DYN[virtualKey] = result.id;
progress = false;
}
});
}
}
});
};
////////////////////////////////////////////////////////////////////////////////////////////
///
////////////////////////////////////////////////////////////////////////////////////////////
function init() {
if (DYN.VCTempVL === null) {
virtualComponent('number', 'VCTempVL');
} else if (DYN.VCTempRL === null) {
virtualComponent('number', 'VCTempRL');
} else if (DYN.VCDeltaT === null) {
virtualComponent('number', 'VCDeltaT');
} else if (DYN.VCVolumeWater === null) {
virtualComponent('number', 'VCVolumeWater');
} else if (DYN.VCCalcPowerWater == null) {
virtualComponent('number', 'VCCalcPowerWater');
} else if (DYN.VCCalcCOP_WP == null) {
virtualComponent('number', 'VCCalcCOP_WP');
} else if (DYN.VCGroup == null) {
virtualComponent('group', 'VCGroup');
} else {
initial = false
}
};
////////////////////////////////////////////////////////////////////////////////////////////
///
////////////////////////////////////////////////////////////////////////////////////////////
function getValues() {
loaded = true;
};
////////////////////////////////////////////////////////////////////////////////////////////
///
////////////////////////////////////////////////////////////////////////////////////////////
let log = 1; // If no console log needed please set log to "0"
const c = 4.19; // Specific heat capacity 4,19 kJ / (kg K)
const l = 565; // Volume l/h
let powerWP = 0; // E.-power;
let tempVL = 0; // temperatur VL
let tempRL = 0; // temperatur RL
let deltaT = 0;
let calcPowerWater = 0; // KJ/K -> KWh/K -> W
let calcCOP_WP = 0;
////////////////////////////////////////////////////////////////////////////////////////////
function timerHandler() {
////////////////////////////////////////////////////////////////////////////////////////////
try {
powerWP = Math.round(Shelly.getComponentStatus('switch:0').apower * 10) / 10; // E.-power;
} catch (e) {
powerWP = 0;
};
try {
tempVL = Math.round(Shelly.getComponentStatus('Temperature', 100).tC * 10) / 10; // temperatur VL
} catch (e) {
tempVL = -9.9;
};
try {
tempRL = Math.round(Shelly.getComponentStatus('Temperature', 101).tC * 10) / 10; // temperatur RL
} catch (e) {
tempRL = -9.9;
};
deltaT = Math.round((tempVL - tempRL) * 10) / 10;
calcPowerWater = Math.round(((((c * l) * deltaT) / 3600) * 1000) * 10) / 10; // KJ/K -> KWh/K -> W
calcCOP_WP = 0;
///
if (powerWP > 0) {
calcCOP_WP = Math.round((calcPowerWater / powerWP) * 10) / 10;
};
////////////////////////////////////////////////////////////////////////////////////////////
if (initial === false && loaded === false) {
getValues();
} else if (initial === false && loaded === true) {
// main program();
Virtual.getHandle('number:' + DYN.VCTempVL).setValue(tempVL);
Virtual.getHandle('number:' + DYN.VCTempRL).setValue(tempRL);
Virtual.getHandle('number:' + DYN.VCDeltaT).setValue(deltaT);
Virtual.getHandle('number:' + DYN.VCVolumeWater).setValue(l);
Virtual.getHandle('number:' + DYN.VCCalcPowerWater).setValue(calcPowerWater);
Virtual.getHandle('number:' + DYN.VCCalcCOP_WP).setValue(calcCOP_WP);
} else {
if (progress === false) {
init();
}
};
////////////////////////////////////////////////////////////////////////////////////////////
if (log != 0) {
print('VL: ', tempVL.toFixed(1) + ' °C / RL: ' + tempRL.toFixed(1) + ' °C / ΔT: ' + deltaT.toFixed(1) + ' K / Flow: ' + l.toFixed(1) +
' l/h / Heat.power: ' + calcPowerWater.toFixed(1) + ' W / E.-power WP: ' + powerWP.toFixed(1) + ' W / COP: ' + calcCOP_WP.toFixed(1));
};
};
////////////////////////////////////////////////////////////////////////////////////////////
Timer.set(1000, true, timerHandler, null);
////////////////////////////////////////////////////////////////////////////////////////////
Alles anzeigen
Vielleicht könntest du mir noch ein 5tes Virtuelles Gerät nämlich den COP hinzufügen. Das wäre dann Wärmeleistung geteilt durch den Energieverbrauch.
Liefert der gleiche Shelly (PM?) die elektr. Bezugsleistung/Energie der WP?
Lädt er die einmal von deinem Server?
Ja, die werden einmal auf den Shelly geladen.
Falls nun weg. -> Script stoppen->alle Komponenten & Gruppe löschen->Script starten->alles, auch Icon's wiederhergestellt.
Trotzdem würde mich ein Screenshot von der laufenden Anlage interessieren.
Schau ob du unter den Ignorierten od. Deaktivierten Integrationen dein Shelly findest und aktivieren kannst.
Es geht was weiter. Der Bug in der APP wird/ist behoben.
Was könnte ich tun?
Nun eine, der vermutlich unendlich vielen Varianten, wäre eventuell den(die) Script(e) den mit uns zu teilen?
Oder hast du sogar noch einen Tick bessere Idee?
Siehe Beitrag #1 dieses Threads! (Ist ja viel verlangt, das sich bei Gelegenheit mal zu lesen. Aber auch Lehrer sollten mal lesen!)
Vergib mir einfach, ich hab ja nicht mal die Hälfte deiner Jahresringe und daher noch ausreichend Zeit auch das "lesen" Manko auszumerzen.
PS: Also ich hab keine Ahnung wenn du mit "Lehrer" ansprichst bzw. worauf diese/deine fälschlichen Annahme beruhte?
- Meine bisherigen Abschlüsse haben bisher alle einen technischen Background.
Ich habe als Gesetz im Studium vermittelt bekommen alle Stromwandler mit den im professionellen Bereich vorhandenen Kurzschluss-Brücken kurzzuschliessen bevor der Wandlerstromkreis geöffnet wird. (keine Spannungserhöhung und keine Sättigung des Eisenkerns möglich)
Es sind aber 2 Faktoren die einen "offenen" Wandler (ohne verbauten Schutz) zerstören.
Sekundär kann schon bei niedrigen Primärströmen einen Kurzschluß wegen Überspannung erzeugen.
Der weit überhöhte Sekundärstrom im Zeitpunkt des Stromflußes hat aber auch eine magnetiche Sättigung des Eisenkernes zur Folge, was sofort in einen hohen Genaugkeitsverlust verursacht.
Ein sekundärer Spgs.Überschlag hat in einem späteren Betrieb mit korrekten Abschluß sehr selten erkennbare Auswirkungen.
Quellen:
Wo ist das Problem?
Ich wollte die Temperatur halt ins Schaltelement in HA einbauen ... warum? ... weil es geht ...
Wenn du nun anstatt dieser fragwürdigen Temperatur die RSSI, Cloud ON, Verbrauchte Leistung, lfd. Betriebsstunden oder Zeit bis zum AutoOFF anzeigen würdest hättest du auch einen Wert mit Informationsgehalt. ... warum? ... weil es geht ...
Diese Temperatur ist im Grunde zu ignorieren da der Wert intern auf der Platine gemessen wird und durch ON/OFF der Relais(e) und dem geschalteten Strom stark beeinflusst wird.
Ich würde mir erst über 90°C Gedanken machen.
Allerdings finde ich die Wiederholungen etwas übertrieben…
Das kriffeln am Handy und gleichzeitig am Skilift ist nicht einfach.
Oder es ist das zMittag konsumierte Zielwasser schuld.
Wenn da selbst die Erfinder, ne, sagen wir mal Erbauer der Shellys Dich zur Fehleranalyse mit in´s Boot nehmen.....
Nun ich bin optimistisch, dass ein "externer Experte" neben der Fehleranalyse auch Korrekturen zur Verhinderung der Fehlerursache an der korrekten Stelle(Erbauer) platzieren wird.
Faktum für mich ist:
Für mich wäre es zweifellos eine Verbesserung wenn Shelly im Spitzgussgehäuse 2 Löcher/Einkerbungen für Schraubbefestigung u./o. kl. Kabelbinder designen würde.
Wenn, ich mir die vielen Teardown Bilder von thgoebel ansehe, würde ich auf allen ausreichen Positionen finden welche sich mit geringstem Aufwand hierzu eignen würden.
Also detached hast du per default nicht zu Verfügung in HA.
Ich würde den Weg über ein Shelly Generation 3 Device-> virtuelle Komponente->HA wählen.
Hierzu ist neben ein Gen 3 Gerät (virt. Komp.) auch ein Script am Shelly notwenig.
Probier mal diesen Script und gib mir Bescheid ob dies dein gewünschte Funktion erfüllt.
/// Temperature Control PIPE HEATING V1.0
////////////////////////////////////////////////////////////////////////////////////////////
///
/// Created by HighFive © 2024
///
////////////////////////////////////////////////////////////////////////////////////////////
let log = 1; // If no console log needed please set log to "0"
const tempOn = 3; // temperature ON if any of the sensors are lower
////////////////////////////////////////////////////////////////////////////////////////////
function timerHandler() {
////////////////////////////////////////////////////////////////////////////////////////////
let temp100 = Shelly.getComponentStatus('Temperature', 100).tC; // temperatur pipe 100
let temp101 = Shelly.getComponentStatus('Temperature', 101).tC; // temperatur pipe 101
let temp102 = Shelly.getComponentStatus('Temperature', 102).tC; // temperatur pipe 102
////////////////////////////////////////////////////////////////////////////////////////////
/// Control of pipe heating
////////////////////////////////////////////////////////////////////////////////////////////
if ((temp100 < tempOn) || (temp101 < tempOn) || (temp102 < tempOn)) {
Shelly.call("Switch.set", {
'id': 0,
'on': true
});
} else if ((temp100 > tempOn) && (temp101 > tempOn) && (temp102 > tempOn)) {
Shelly.call("Switch.set", {
'id': 0,
'on': false
});
};
////////////////////////////////////////////////////////////////////////////////////////////
/// print all temperatur sensors and state of the relay to console window
////////////////////////////////////////////////////////////////////////////////////////////
if (log != 0) {
print('Sensor 100: ', temp100.toFixed(1) + ' °C / Sensor 101: ' + temp101.toFixed(1) + ' °C / Sensor 101: ' + temp102.toFixed(1) + ' °C / Relay pipe heating: ' + Shelly.getComponentStatus('switch', 0).output);
};
};
////////////////////////////////////////////////////////////////////////////////////////////
///
////////////////////////////////////////////////////////////////////////////////////////////
Timer.set(1000, true, timerHandler, null);
////////////////////////////////////////////////////////////////////////////////////////////
Alles anzeigen