MIt einem Script und einer virtuellen Componente kannst du dir auch dein(e) User Werte mit allen denkbaren Units in die APP legen!
Sobald ich ein wenig Zeit finde poste ich dir hier eine Lösung.
VPN/Proxy erkannt
Es scheint, dass Sie einen VPN- oder Proxy-Dienst verwenden. Bitte beachten Sie, dass die Nutzung eines solchen Dienstes die Funktionalität dieser Webseite einschränken kann.
MIt einem Script und einer virtuellen Componente kannst du dir auch dein(e) User Werte mit allen denkbaren Units in die APP legen!
Sobald ich ein wenig Zeit finde poste ich dir hier eine Lösung.
Dies ist beim PlugS/Matter-Device ein Bug in der Firmware und sollte heuer noch mit einer FW 1.5/1.6 behoben werden.
Anbei der Schaltplan von der Lunos Steuerung. Wie verbinde ich diese mit dem Gen 3 Dimmer?
Vorschlag mit Shelly Dimmer 0/1 - 10V PM Gen3.
DIYROLLY Kannst du ein Bild und die Bestell-Typenbezeichnung posten?
Kingmich Ich habe dir einen Script für deine Applikation erstellt.
Es sind aber einige Einstellungen am Shelly notwendig damit dieses Script reibungslos funktioniert.
Actions & Schedules alle Einträge löschen.
Script erstellen, Namen eintragen, unten angefügten Script reinkopieren, speichern, starten und run at startup setzen.
/// App ON overroll input[SW] OFF command for a specific time V1.0
////////////////////////////////////////////////////////////////////////////////////////////
///
/// Created by HighFive © 2024
///
/// Email: highfive@smartshome.work
/// Email: if_then_else@smartshome.work
///
////////////////////////////////////////////////////////////////////////////////////////////
let log = 1; // If no console log needed please set log to "0"
let maxAPPOnTime = 3600; // In seconds
let cnt = -1; // Internal use
////////////////////////////////////////////////////////////////////////////////////////////
function timerHandler() {
if ((cnt > -1) && (cnt < maxAPPOnTime)) {
cnt++;
} else {
cnt = -1;
};
///
Shelly.call('Switch.set', {
'id': 0,
'on': Shelly.getComponentStatus('input:0').state || (cnt > 0)
});
///
if (log != 0) {
let s = '-';
if (cnt > -1) {
s = (maxAPPOnTime - cnt);
};
print('Remaining time switch on by APP: ' + s + 'sec / State input: ' +
Shelly.getComponentStatus('input:0').state + ' / State output: ' +
Shelly.getComponentStatus('switch', 0).output);
};
};
////////////////////////////////////////////////////////////////////////////////////////////
Timer.set(1000, true, timerHandler, null);
////////////////////////////////////////////////////////////////////////////////////////////
Shelly.addStatusHandler(function(e) {
if (e.component === "switch:0") {
if ((e.delta.source === "HTTP_in") || (e.delta.source === "SHC")) {
if (e.delta.output === true) {
cnt = 0;
timerHandler();
} else {
cnt = -1;
timerHandler();
};
};
};
});
////////////////////////////////////////////////////////////////////////////////////////////
///
////////////////////////////////////////////////////////////////////////////////////////////
Alles anzeigen
Wenn du über die APP einschaltest wird für eine 1Std. (3600 Sec) jedes ausschalten vom Bewegungsmelder verhindert. (Über APP kann weiterhin ausgeschalten werden)
Ich habe dies implementiert, da du in der APP keinen Hinweis bekommst daß du den Bewegungsmelder übergangen hast. (und ein Ausschalten vergisst)
MQTT "src" [Source] ist der unique Identifiy und dieser bestehet bei Shelly mit Device-Typ und MAC Adresse.
Mir ist keine Möglichkeit bekannt dies zu ändern.
Mit einem Script kann dedektiert werden was die Ursache(Source) des letzten Befehls war. (Eingang, App, Webhook etc.)
Dadurch ist es mit einem Script möglich deine gewünschte Funktion umzusetzen.
Solbald ich ein wenig Zeit habe poste ich dir eine Lösung hier.
Kann dir nicht wirklich weiterhelfen da bei mir Node Red v18.1.1 als AddOn im Home Assistant läuft.
Gibt es einen Grund nicht die Node Red Library "node-red-contrib-shelly" zu nutzen?
Shelly MiniPMG3:
Shelly Mini1PMG3:
Für NO 230VAC/2A Anwendung kann ich SSR Board mit dem Shelly X empfehlen. 8 Kanal Solid State Relais
Bei 50VAC od. 30VDC / 5A NO/NC Anwendung. 8-Relais Modul
Ich nutze eine ext. 5V Spannungsversorgung welche zusätzlich berücksichtigt werden sollte.
fips1976 Poste mal dein Script vielleicht kann ich dir eine Lösung erarbeiten.
Mir unbekannte Geräte in der Shelly APP sind mir auch schon aufgefallen:
flotschi Ja, ich habe auch angenommen daß du ein Gen 3 Device nutzt. Erst ab Gen3 ist es möglich selbst Componenten in die APP zu legen.
Bin über diesen alten Thread gestolpert und möchte diesen ergänzen.
flotschi Konnte rascher als gedacht eine Lösung schnitzen, jedoch wurde der Script ein wenig umfangreicher.
/// Calculate Water flow power V1.4(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/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 calcPowerMETA = {
ui: {
view: "label",
"unit": "W",
"step": 0.1,
"icon": "https://accessory.smartshome.work/files/PWaerme.png"
}
};
////////////////////////////////////////////////////////////////////////////////////////////
const CONFIG = {
VCTempVL: {
name: "Vorlauf-Temperatur",
persisted: false,
default_value: -99.9,
meta: tempVLMETA
},
VCTempRL: {
name: "Rücklauf-Temperatur",
persisted: false,
default_value: -99.9,
meta: tempRLMETA
},
VCDeltaT: {
name: "ΔT [VL-RL]",
persisted: false,
default_value: -99.9,
meta: deltaTMETA
},
VCCalcPower: {
name: "Wärmeleistung",
persisted: false,
default_value: -99.9,
meta: calcPowerMETA
},
VCGroup: {
name: "HEIZUNG Wärmepumpe",
meta: groupMETA
}
};
////////////////////////////////////////////////////////////////////////////////////////////
let DYN = {
VCGroup: null,
VCTempVL: null,
VCTempRL: null,
VCDeltaT: null,
VCCalcPower: 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.VCCalcPower
];
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.VCCalcPower == null) {
virtualComponent('number', 'VCCalcPower');
} 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
////////////////////////////////////////////////////////////////////////////////////////////
function timerHandler() {
////////////////////////////////////////////////////////////////////////////////////////////
let tempVL = Shelly.getComponentStatus('Temperature', 100).tC; // temperatur VL
let tempRL = Shelly.getComponentStatus('Temperature', 101).tC; // temperatur RL
let deltaT = tempVL - tempRL;
let calcPower = (((c * l) * deltaT) / 3600) * 1000; // KJ/K -> KWh/K -> W
////////////////////////////////////////////////////////////////////////////////////////////
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(Math.round(deltaT * 10) / 10);
Virtual.getHandle('number:' + DYN.VCCalcPower).setValue(Math.round(calcPower * 10) / 10);
} else {
if (progress === false) {
init();
}
};
////////////////////////////////////////////////////////////////////////////////////////////
if (log != 0) {
print('Sensor VL: ', tempVL.toFixed(1) + ' °C / Sensor RL: ' + tempRL.toFixed(1) + ' °C / ΔT: ' + deltaT.toFixed(1) +
' K / Durchfluß: ' + l + ' l/h / Actual Power : ' + calcPower.toFixed(1) + ' W');
};
};
////////////////////////////////////////////////////////////////////////////////////////////
Timer.set(1000, true, timerHandler, null);
////////////////////////////////////////////////////////////////////////////////////////////
Alles anzeigen
Der neue Script legt alle notwendigen Virtuellen Componenten und auch die Gruppe mit Icons automatisch an.
Daher sollte das Resultat dann in der App so aussehen: