Read the statement by Michael Teeuw here.
ShellyPV mit Shelly 2.5
-
@chrisfr1976
Hi und Danke !!!
Das neue Script funktioniert einwandfrei.
Ich hatte allerdings vergessen zu erwähnen, daß ich das ShellyStatusTable benutze und nicht das ShellyPV.
Daher ging es erst nicht. Nachdem ich aber alle PV entfernt habe, ging es sofort. Tausend Dank… Über die Abfrage der ShellyRGBW würde ich mich aber auch sehr freuen :) -
@visionmaster
Perfekt. Freut mich! Morgen probiere mich an der RGB Shelly. Kann es aber noch nicht versprechen. Wenn das läuft aktualisiere ich die Module für Table und PV bei Github. -
@visionmaster
Vielleicht einfacher als gedacht. Wieder als node_helper.js übernehmen:const NodeHelper = require("node_helper"); const axios = require("axios"); module.exports = NodeHelper.create({ start: function () { this.config = {}; setTimeout(() => { console.log("MagicMirror is ready. Fetching ShellyPV status..."); this.fetchShellyPVStatus(); }, 15000); // Delay to ensure MagicMirror is fully loaded }, socketNotificationReceived: function (notification, payload) { if (notification === "CONFIG") { this.config = payload; if (this.config.shellysPV && Array.isArray(this.config.shellysPV)) { console.log("Configuration received, fetching ShellyPV status..."); this.fetchShellyPVStatus(); } } else if (notification === "GET_SHELLYPV_STATUS") { this.fetchShellyPVStatus(); } }, fetchShellyPVStatus: async function () { const results = []; if (!this.config.shellysPV || !Array.isArray(this.config.shellysPV)) { console.error("No valid shellysPV configuration found or 'shellysPV' is not an array."); return; } for (const shellyPV of this.config.shellysPV) { try { const response = await axios.post( `${this.config.serverUri}/device/status`, `id=${shellyPV.id}&auth_key=${this.config.authKey}` ); const data = response.data?.data?.device_status; if (data) { let isOn = false; let power = null; // Check for Gen 1/2 structure (relay-based devices) if (data.relays) { const channel = parseInt(shellyPV.ch || 0, 10); isOn = data.relays[channel]?.ison || false; power = data.meters?.[channel]?.power || null; } // Check for Gen 3 structure (pm1:0 devices) else if (data["pm1:0"]) { isOn = true; // Assume true if data exists for the device power = data["pm1:0"].apower; // Use 'apower' from pm1:0 } // Check for "switch:0" structure else if (data["switch:0"]) { isOn = data["switch:0"].output; // Use 'output' for on/off status power = data["switch:0"].apower; // Use 'apower' for power } // Check for RGB Shelly structure (lights array) else if (data.lights) { const light = data.lights[0]; // Assume single channel for RGB device isOn = light?.ison || false; power = light?.power || null; } results.push({ name: shellyPV.name, isOn: isOn, power: power !== undefined ? power : null, statusClass: isOn ? 'on' : 'off', // Dynamically set status class }); } else { results.push({ name: shellyPV.name, isOn: false, power: null, statusClass: 'off', // Default to off if no data found }); } } catch (error) { console.error(`Error fetching status for ${shellyPV.name}:`, error); results.push({ name: shellyPV.name, isOn: false, power: null, statusClass: 'off', // Default to off on error }); } } this.sendSocketNotification("SHELLYPV_STATUS_UPDATE", results); }, });
In der config wieder wie üblich einrichten.
-
@chrisfr1976
Hi und wiedermal Danke.
Funktioiert fast :)
Status On/Off funktioniert
Power teilweise. Wenn Status an: korrekt Anzeige. Wenn Status Off: Anzeige > N/A. Manchmal bleibt sogar die Poweranzeige auf den letzten Wert, obwohl die Shelly ausgeschaltet ist."lights":[{"ison":true,"source":"http","has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"mode":"color","red":0,"green":0,"blue":255,"white":0,"gain":79,"effect":0,"transition":0,"power":3.59,"overpower":false,"brightness":79}]
-
@visionmaster
Hier zur Info:Ich habe :
else if (data.lights) {
const light = data.lights[0]; // Assume single channel for RGB device
isOn = light?.ison || false;
power = light?.power || null;
}durch:
else if (data.lights) {
const light = data.lights[0]; // Assume single channel for RGB device
isOn = light?.ison || false;
power = data.meters ? data.meters[0].power : null;
}ersetzt. Jetzt zeigt er alles richtig an. :)
-
@visionmaster Danke für die Antwort. Die Module sind in GitHub aktualisiert.
So, issue closed until new devices pop up ;-)