<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[MMM-FroniusSolar family modules]]></title><description><![CDATA[<p dir="auto">Hi,</p>
<p dir="auto">i was working the last days on a module to get rid of the last iframes on my mirror. These modules can all visualize solar energy data from a Fronius solar system using SVG magic :)</p>
<ul>
<li><strong><a href="https://github.com/ChrisF1976/MMM-FroniusSolar" target="_blank" rel="noopener noreferrer nofollow ugc">MMM-FroniusSolar</a></strong>: Best for simple setups prioritizing clarity and minimalism.</li>
<li><strong><a href="https://github.com/ChrisF1976/MMM-FroniusSolar2" target="_blank" rel="noopener noreferrer nofollow ugc">MMM-FroniusSolar2</a></strong>: Suitable for scenarios requiring visual feedback on power flows (e.g., monitoring dynamic energy consumption).</li>
<li><strong><a href="https://github.com/ChrisF1976/MMM-FroniusSolar3" target="_blank" rel="noopener noreferrer nofollow ugc">MMM-FroniusSolar3</a></strong>: Ideal for larger or customizable displays where scalability is important.</li>
</ul>
<p dir="auto">If you do not have a FroniusPV but your system has an API it should be not much work to adjust the node_helper file.</p>
<p dir="auto">All in a column:<br />
<img src="https://github.com/ChrisF1976/MMM-FroniusSolar2/blob/main/All.png?raw=true" alt="MMM-FroniusSolar" class=" img-fluid img-markdown" /></p>
]]></description><link>https://forum.magicmirror.builders/topic/19322/mmm-froniussolar-family-modules</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Jul 2026 13:22:30 GMT</lastBuildDate><atom:link href="https://forum.magicmirror.builders/topic/19322.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Jan 2025 22:06:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sun, 27 Apr 2025 17:13:47 GMT]]></title><description><![CDATA[<p dir="auto">Hi folks,</p>
<p dir="auto">a new family-member has joined: <a href="https://github.com/ChrisF1976/MMM-FroniusSolar5" target="_blank" rel="noopener noreferrer nofollow ugc">MMM-FroniusSolar5</a>.</p>
<p dir="auto">This adds the functionality to monitor and visualize solar energy data from <strong>multiple Fronius inverters</strong> simultaneously.</p>
<p dir="auto">See module for more information. If you have 2 or more Fronius Inverters running, give it a try.</p>
<p dir="auto">I am not completely sure if it works 100% stable since I have only 1 inverter. If you discover any problems open an issue.</p>
]]></description><link>https://forum.magicmirror.builders/post/126058</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/126058</guid><dc:creator><![CDATA[chrisfr1976]]></dc:creator><pubDate>Sun, 27 Apr 2025 17:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Mon, 03 Mar 2025 06:48:08 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/chrisfr1976" aria-label="Profile: chrisfr1976">@<bdi>chrisfr1976</bdi></a> Changing it from 80 to 50 fixed the problem - thankyou</p>
]]></description><link>https://forum.magicmirror.builders/post/124497</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/124497</guid><dc:creator><![CDATA[waynerob11]]></dc:creator><pubDate>Mon, 03 Mar 2025 06:48:08 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sun, 02 Mar 2025 17:43:38 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/waynerob11" aria-label="Profile: waynerob11">@<bdi>waynerob11</bdi></a> Hi,</p>
<hr />
<h2>please check in your <code>config.js</code> the radius value. It should be <strong><code>Radius: 50,</code></strong>. In the beginning when I released the module there was a copy+paste error. The radius was 80.</h2>
<hr />
<p dir="auto">If you want to enlarge everything as I see the gauge radius on your mirror you need do go deeper into the <code>MMM-FroniusSolar2.js</code> file:</p>
<ul>
<li>Adjust text size in <code>// Main Text | // Sub Text</code> area.</li>
<li>Modify gauge coordinates here:</li>
</ul>
<pre><code>        const positions = {
            PV: { x: 75, y: 75 },
            Grid: { x: 225, y: 75 },
            Akku: { x: 75, y: 225 },
            House: { x: 225, y: 225 }
        };
</code></pre>
<ul>
<li>If everything is bigger modify also the view box:</li>
</ul>
<pre><code>          svg.setAttribute("viewBox", "0 -20 300 350"); // Adjusted viewBox to fix label cutoff
</code></pre>
<p dir="auto">The view box part is really annoying. It does not what you expect (The gauges do not have 50px. In fact everything is scaled in the viewbox). If you have a working status which might be useful for others, please share. I cannot support here since it is really tricky.</p>
]]></description><link>https://forum.magicmirror.builders/post/124439</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/124439</guid><dc:creator><![CDATA[chrisfr1976]]></dc:creator><pubDate>Sun, 02 Mar 2025 17:43:38 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sun, 02 Mar 2025 05:36:43 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/waynerob11" aria-label="Profile: waynerob11">@<bdi>waynerob11</bdi></a> <img src="/assets/uploads/files/1740893793368-img_20250225_121645_713.jpg" alt="IMG_20250225_121645_713.jpg" class=" img-fluid img-markdown" /></p>
]]></description><link>https://forum.magicmirror.builders/post/124418</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/124418</guid><dc:creator><![CDATA[waynerob11]]></dc:creator><pubDate>Sun, 02 Mar 2025 05:36:43 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Tue, 25 Feb 2025 11:00:21 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/waynerob11" aria-label="Profile: waynerob11">@<bdi>waynerob11</bdi></a><br />
Hi,<br />
please send a screenshot to understand clearly what you like to do.</p>
]]></description><link>https://forum.magicmirror.builders/post/124313</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/124313</guid><dc:creator><![CDATA[chrisfr1976]]></dc:creator><pubDate>Tue, 25 Feb 2025 11:00:21 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Tue, 25 Feb 2025 02:22:17 GMT]]></title><description><![CDATA[<p dir="auto">Hi Chris,</p>
<p dir="auto">Don’t know what I did but it’s all working now - only problem is all the circles are bunched up.<br />
Also, how can I enlarge and bold the fonts</p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/waynerob11" aria-label="Profile: waynerob11">@<bdi>waynerob11</bdi></a></p>
]]></description><link>https://forum.magicmirror.builders/post/124310</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/124310</guid><dc:creator><![CDATA[waynerob11]]></dc:creator><pubDate>Tue, 25 Feb 2025 02:22:17 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Tue, 18 Feb 2025 02:28:22 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/chrisfr1976" aria-label="Profile: chrisfr1976">@<bdi>chrisfr1976</bdi></a> Dear Chris, I apologize for my unqualified question. Regards</p>
]]></description><link>https://forum.magicmirror.builders/post/124122</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/124122</guid><dc:creator><![CDATA[TomOMaley]]></dc:creator><pubDate>Tue, 18 Feb 2025 02:28:22 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sat, 15 Feb 2025 22:45:00 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/tomomaley" aria-label="Profile: TomOMaley">@<bdi>TomOMaley</bdi></a><br />
All modules work without <strong>any</strong> problems on my mirror. No errors, nothing in the logs and it gets data every 2 seconds.</p>
<p dir="auto">To go to the chat and post a mimimi only is not that helpful to find the error. Use the log-version above then you‘ll find your error.</p>
<p dir="auto">Read the doc, install the latest module, enter a correct ip and activate the api in your inverter. I cannot see any more I can do here. At least post an error log or somerhing helpful.</p>
]]></description><link>https://forum.magicmirror.builders/post/124076</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/124076</guid><dc:creator><![CDATA[chrisfr1976]]></dc:creator><pubDate>Sat, 15 Feb 2025 22:45:00 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sat, 15 Feb 2025 05:15:20 GMT]]></title><description><![CDATA[<p dir="auto">Hi, does meanwhil one of your fronius modules work whithout Problems? Tried the second one but no display at all. What changes in the config etc. are still necessary?<br />
Regards Walter</p>
]]></description><link>https://forum.magicmirror.builders/post/124061</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/124061</guid><dc:creator><![CDATA[TomOMaley]]></dc:creator><pubDate>Sat, 15 Feb 2025 05:15:20 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Mon, 10 Feb 2025 07:33:51 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/waynerob11" aria-label="Profile: waynerob11">@<bdi>waynerob11</bdi></a><br />
Hi,<br />
is this issue solved now?</p>
]]></description><link>https://forum.magicmirror.builders/post/123896</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123896</guid><dc:creator><![CDATA[chrisfr1976]]></dc:creator><pubDate>Mon, 10 Feb 2025 07:33:51 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sun, 02 Feb 2025 18:57:51 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/waynerob11" aria-label="Profile: waynerob11">@<bdi>waynerob11</bdi></a> Hello,<br />
I’ve created a version with console.logs inside. Go to the MMM-FroniusSolar2 module folder and replace the files with this content:</p>
<p dir="auto"><strong>MMM-FroniusSolar2.js</strong>:</p>
<pre><code>Module.register("MMM-FroniusSolar2", {
    defaults: {
        InverterIP: "192.168.178.134",
        updateInterval: 60000, // Update every 60 seconds
        icons: {
            P_Akku: "mdi:car-battery",
            P_Grid: "mdi:transmission-tower",
            P_Load: "mdi:home-lightbulb",
            P_PV: "mdi:solar-panel-large",
        },
        Radius: 80, // Radius for the SVG gauges
        MaxPower: 1000, // Maximum power for grid, house, and battery
        MaxPowerPV: 10400, // Maximum power for solar PV
        ShowText: true,
        TextMessge: [
            { about: "600", Text: "Leicht erhöhter Netzbezug.", color: "#999" },
            { about: "1000", Text: "Über 1 KW Netzbezug!", color: "#ffffff" },
            { about: "1500", Text: "Über 1,5KW Netzbezug.", color: "#eea205" },
            { about: "2500", Text: "Über 2,5KW aus dem Netz!", color: "#ec7c25" },
            { about: "5000", Text: "Auto lädt, richtig? Nächstes Mal auf Sonne warten.", color: "#cc0605" },
            { less: "-500", Text: "Sonne scheint! Mehr als 500W frei.", color: "#f8f32b" },
            { less: "-2000", Text: "Wäsche waschen! Über 2KW freie Energie!", color: "#00bb2d" },
            { less: "-4000", Text: "Auto laden! Über 4KW freie Energie!", color: "#f80000" },
        ],
        debug: true, // Set to true to enable debug logging
    },

    start: function () {
        if (this.config.debug) {
            console.log("[MMM-FroniusSolar2] Starting module with config:", this.config);
        }
        this.solarData = null;
        this.solarSOC = null; // Added for SOC
        console.log("[MMM-FroniusSolar2] Sending configuration to node_helper...");
        this.sendSocketNotification("SET_CONFIG", this.config); // Send configuration to node_helper
        this.scheduleUpdate(); // Schedule periodic updates
    },

    getStyles: function () {
        return ["MMM-FroniusSolar2.css", "https://code.iconify.design/2/2.2.1/iconify.min.js"];
    },

    scheduleUpdate: function () {
        if (this.config.debug) {
            console.log("[MMM-FroniusSolar2] Scheduling updates every", this.config.updateInterval, "ms");
        }
        const self = this;
        setInterval(function () {
            if (self.config.debug) {
                console.log("[MMM-FroniusSolar2] Requesting data update from node_helper...");
            }
            self.sendSocketNotification("GET_FRONIUS_DATA");
        }, this.config.updateInterval);
    },

    socketNotificationReceived: function (notification, payload) {
        if (notification === "FRONIUS_DATA") {
            if (this.config.debug) {
                console.log("[MMM-FroniusSolar2] Received FRONIUS_DATA:", payload);
            }
            this.solarData = {
                P_Akku: Math.round(payload.P_Akku || 0),
                P_Grid: Math.round(payload.P_Grid || 0),
                P_Load: Math.round(payload.P_Load || 0),
                P_PV: Math.round(payload.P_PV || 0),
            };
            this.solarSOC =
                payload.Inverters &amp;&amp;
                payload.Inverters["1"] &amp;&amp;
                payload.Inverters["1"].SOC
                    ? Math.round(payload.Inverters["1"].SOC)
                    : 0; // Fallback to 0 if SOC is undefined
            if (this.config.debug) {
                console.log("[MMM-FroniusSolar2] Processed solarData:", this.solarData, "SOC:", this.solarSOC);
            }
            this.updateDom();
        }
    },

    getDom: function () {
        if (this.config.debug) {
            console.log("[MMM-FroniusSolar2] Rendering DOM");
        }
        const wrapper = document.createElement("div");
        wrapper.className = "solar2-wrapper";

        if (!this.solarData) {
            wrapper.innerHTML = "Loading...";
            return wrapper;
        }

        const radius = this.config.Radius || 80;
        const strokeWidth = 12;
        const svgSize = 350; // Adjusted SVG height for labels and padding

        // Recalculate house consumption
        const outerPower = this.solarData.P_Grid + this.solarData.P_Akku + this.solarData.P_PV;

        // Fixed positions for the gauges in dice layout
        const positions = {
            PV: { x: 75, y: 75 },
            Grid: { x: 225, y: 75 },
            Akku: { x: 75, y: 225 },
            House: { x: 225, y: 225 }
        };

        // Define colors for gauges
        const gridColor = this.solarData.P_Grid &gt;= 0 ? "#808080" : "#add8e6"; // Gray for positive, light blue for negative
        const akkuColor = "#00ff00"; // Always green
        const pvColor = "#ffff00"; // Always yellow

        // House Gauge: Logic for color determination
        let houseColor;
        if (this.solarData.P_Akku - 100 &gt; Math.abs(this.solarData.P_Grid)) {
            houseColor = "#a3c49f"; // Light green for high battery activity
        } else if (this.solarData.P_Grid &gt; 150) {
            houseColor = "#808080"; // Gray for high grid consumption
        } else if (outerPower &gt; 0) {
            houseColor = "#00ff00"; // Green for positive power flow
        } else {
            houseColor = "#1f84ff"; // Light blue
        }

        if (this.config.debug) {
            console.log("[MMM-FroniusSolar2] Gauge colors determined:",
                { pvColor, gridColor, akkuColor, houseColor });
        }

        // Create unified SVG
        const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
        svg.setAttribute("width", svgSize);
        svg.setAttribute("height", svgSize);
        svg.setAttribute("viewBox", "0 -20 300 350"); // Adjusted viewBox to fix label cutoff
        svg.style.margin = "auto"; // Center the SVG

        // Define glow effect
        const defs = document.createElementNS("http://www.w3.org/2000/svg", "defs");
        defs.innerHTML = `
            &lt;filter id="glow"&gt;
                &lt;feGaussianBlur in="SourceGraphic" stdDeviation="4" result="blurred" /&gt;
                &lt;feMerge&gt;
                    &lt;feMergeNode in="blurred" /&gt;
                    &lt;feMergeNode in="SourceGraphic" /&gt;
                &lt;/feMerge&gt;
            &lt;/filter&gt;
        `;
        svg.appendChild(defs);

        // Function to create a line
        const createLine = (x1, y1, x2, y2, color) =&gt; {
            if (this.config.debug) {
                console.log("[MMM-FroniusSolar2] Creating line:", { x1, y1, x2, y2, color });
            }
            const line = document.createElementNS("http://www.w3.org/2000/svg", "line");
            line.setAttribute("x1", x1);
            line.setAttribute("y1", y1);
            line.setAttribute("x2", x2);
            line.setAttribute("y2", y2);
            line.setAttribute("stroke", color);
            line.setAttribute("stroke-width", "4");
            line.setAttribute("class", "flow-lines");
            return line;
        };

        // Add flow lines based on power conditions
        if (this.solarData.P_Akku &lt; -10 &amp;&amp; this.solarData.P_PV &gt; 0 ) {
            svg.appendChild(createLine(positions.PV.x, positions.PV.y + radius, positions.Akku.x, positions.Akku.y - radius, "#ffff00"));
        }
        if (this.solarData.P_PV &gt; 10) {
            svg.appendChild(createLine(positions.PV.x + (radius * 0.7071), positions.PV.y + (radius * 0.7071), positions.House.x - (radius * 0.7071), positions.House.y - (radius * 0.7071), "#ffff00"));
        }
        if (this.solarData.P_Grid &gt; 10) {
            svg.appendChild(createLine(positions.Grid.x, positions.Grid.y + radius, positions.House.x, positions.House.y - radius, "#808080"));
        }
        if (this.solarData.P_Akku &gt; 10) {
            svg.appendChild(createLine(positions.Akku.x + radius, positions.Akku.y, positions.House.x - radius, positions.House.y, "#00ff00"));
        }
        if (this.solarData.P_Grid &lt; -10 &amp;&amp; this.solarData.P_PV &gt; Math.abs(this.solarData.P_Grid)) {
            svg.appendChild(createLine(positions.PV.x + radius, positions.PV.y, positions.Grid.x - radius, positions.Grid.y, "#add8e6"));
        }
        if (this.solarData.P_Grid &lt; -10 &amp;&amp; this.solarData.P_PV &lt;= 0) {
            svg.appendChild(createLine(positions.Akku.x + (radius * 0.7071), positions.Akku.y - (radius * 0.7071), positions.Grid.x - (radius * 0.7071), positions.Grid.y + (radius * 0.7071), "#00ff00"));
        }
        if (this.solarData.P_PV &lt;= 0 &amp;&amp; this.solarData.P_Akku &lt; -10) {
            svg.appendChild(createLine(positions.Grid.x - (radius * 0.7071), positions.Grid.y + (radius * 0.7071), positions.Akku.x + (radius * 0.7071), positions.Akku.y - (radius * 0.7071), "#808080"));
        }

        // Function to create a gauge
        const createGauge = (x, y, mainValue, subValue, percentage, color, label, icon, labelPosition) =&gt; {
            if (this.config.debug) {
                console.log("[MMM-FroniusSolar2] Creating gauge:", { label, mainValue, subValue, percentage, color });
            }
            const group = document.createElementNS("http://www.w3.org/2000/svg", "g");
            group.setAttribute("transform", `translate(${x},${y})`);

            // Circle Background
            const bgCircle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
            bgCircle.setAttribute("cx", 0);
            bgCircle.setAttribute("cy", 0);
            bgCircle.setAttribute("r", radius);
            bgCircle.setAttribute("stroke", "#e0e0e0");
            bgCircle.setAttribute("opacity", "1");
            bgCircle.setAttribute("stroke-width", strokeWidth);
            bgCircle.setAttribute("fill", "none");
            group.appendChild(bgCircle);

            // Circle Progress with glow
            const progressCircle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
            progressCircle.setAttribute("cx", 0);
            progressCircle.setAttribute("cy", 0);
            progressCircle.setAttribute("r", radius);
            progressCircle.setAttribute("stroke", color);
            progressCircle.setAttribute("stroke-width", strokeWidth);
            progressCircle.setAttribute("fill", "none");
            progressCircle.setAttribute("stroke-dasharray", `${percentage * 2 * Math.PI * radius} ${2 * Math.PI * radius}`);
            progressCircle.setAttribute("transform", "rotate(-90 0 0)");
            progressCircle.setAttribute("filter", "url(#glow)"); // Apply glow filter
            group.appendChild(progressCircle);

            // Main Text
            const mainText = document.createElementNS("http://www.w3.org/2000/svg", "text");
            mainText.setAttribute("x", 0);
            mainText.setAttribute("y", 6); // Adjusted y position for main text
            mainText.setAttribute("text-anchor", "middle");
            mainText.setAttribute("font-size", "22px");
            mainText.setAttribute("fill", "#ffffff");
            mainText.textContent = mainValue;
            group.appendChild(mainText);

            // Sub Text
            if (subValue) {
                const subText = document.createElementNS("http://www.w3.org/2000/svg", "text");
                subText.setAttribute("x", 0);
                subText.setAttribute("y", 25); // Adjusted y position for sub text
                subText.setAttribute("text-anchor", "middle");
                subText.setAttribute("font-size", "16px");
                subText.setAttribute("fill", "#ffffff");
                subText.textContent = subValue;
                group.appendChild(subText);
            }

            // Label with foreignObject for icon
            const labelY = labelPosition === "top" ? -(radius + 45) : radius + 15; // Increased offset for top labels
            const labelContainer = document.createElementNS("http://www.w3.org/2000/svg", "foreignObject");
            labelContainer.setAttribute("x", -radius - 20);
            labelContainer.setAttribute("y", labelY);
            labelContainer.setAttribute("text-anchor", "middle");
            labelContainer.setAttribute("width", radius * 2);
            labelContainer.setAttribute("height", labelPosition === "top" ? 60 : 40); // Adjusted label height
            labelContainer.innerHTML = `
                &lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: center; justify-content: center; text-align: center; font-size: 20px; color: white;"&gt;
                    &lt;span class="iconify" data-icon="${icon}" style="margin-right: 5px;"&gt;&lt;/span&gt;
                    ${label}
                &lt;/div&gt;
            `;
            group.appendChild(labelContainer);

            return group;
        };

        // Add gauges to SVG
        svg.appendChild(createGauge(
            positions.PV.x,
            positions.PV.y,
            `${this.solarData.P_PV || 0} W`,
            null,
            Math.min((this.solarData.P_PV || 0) / this.config.MaxPowerPV, 1),
            pvColor,
            "PV",
            this.config.icons.P_PV,
            "top"
        ));
        svg.appendChild(createGauge(
            positions.Grid.x,
            positions.Grid.y,
            `${this.solarData.P_Grid || 0} W`,
            null,
            Math.min(Math.abs(this.solarData.P_Grid || 0) / this.config.MaxPower, 1),
            gridColor,
            "Grid",
            this.config.icons.P_Grid,
            "top"
        ));
        svg.appendChild(createGauge(
            positions.Akku.x,
            positions.Akku.y,
            `${this.solarSOC || 0}%`,
            `${this.solarData.P_Akku || 0} W`,
            Math.min(this.solarSOC / 100, 1),
            akkuColor,
            "Akku",
            this.config.icons.P_Akku,
            "bottom"
        ));
        svg.appendChild(createGauge(
            positions.House.x,
            positions.House.y,
            `${outerPower || 0} W`,
            null,
            Math.min(Math.abs(outerPower || 0) / this.config.MaxPower, 1),
            houseColor,
            "House",
            this.config.icons.P_Load,
            "bottom"
        ));

        wrapper.appendChild(svg);

        // Add dynamic text message below the gauge
        if (this.config.ShowText) {
            const textMessageDiv = document.createElement("div");
            textMessageDiv.className = "text-message2";

            const messageConfig = this.config.TextMessge || [];
            let selectedMessage = null;

            for (const message of messageConfig) {
                if (
                    (message.about &amp;&amp; this.solarData.P_Grid &gt; parseInt(message.about)) ||
                    (message.less &amp;&amp; this.solarData.P_Grid &lt; parseInt(message.less))
                ) {
                    // If no message is selected yet, or the new match is more specific
                    if (
                        !selectedMessage ||
                        (message.about &amp;&amp; parseInt(message.about) &gt; parseInt(selectedMessage.about || -Infinity)) ||
                        (message.less &amp;&amp; parseInt(message.less) &lt; parseInt(selectedMessage.less || Infinity))
                    ) {
                        selectedMessage = message;
                    }
                }
            }

            if (selectedMessage) {
                if (this.config.debug) {
                    console.log("[MMM-FroniusSolar2] Selected text message:", selectedMessage);
                }
                textMessageDiv.innerHTML = `
                    &lt;span style="color: ${selectedMessage.color}; font-size: 18px;"&gt;
                        ${selectedMessage.Text}
                    &lt;/span&gt;
                `;
            } else {
                textMessageDiv.innerHTML = `
                    &lt;span style="color: #999; font-size: 16px;"&gt;
                        PV Anlage läuft...
                    &lt;/span&gt;
                `;
            }

            wrapper.appendChild(textMessageDiv);
        }

        return wrapper;
    }
});

</code></pre>
<p dir="auto"><strong>node_helper.js:</strong>:</p>
<pre><code>const NodeHelper = require("node_helper");

module.exports = NodeHelper.create({
    config: null, // Initially, no config is set

    start: function () {
        console.log("[MMM-FroniusSolar2] Node helper started");
    },

    socketNotificationReceived: function (notification, payload) {
        console.log("[MMM-FroniusSolar2] Received socket notification:", notification, payload);
        if (notification === "SET_CONFIG") {
            this.config = payload;
            if (this.config.debug) {
                console.log("[MMM-FroniusSolar2] Configuration received:", this.config);
            }
            this.startFetchingData();
        } else if (notification === "GET_FRONIUS_DATA") {
            if (!this.config) return;
            if (this.config.debug) {
                console.log("[MMM-FroniusSolar2] GET_FRONIUS_DATA triggered");
            }
            this.getFroniusData();
        }
    },

    startFetchingData: function () {
        if (this.config &amp;&amp; this.config.InverterIP) {
            if (this.config.debug) {
                console.log("[MMM-FroniusSolar2] Starting data fetch interval for IP", this.config.InverterIP);
            }
            this.fetchInterval = setInterval(() =&gt; {
                this.getFroniusData();
            }, 60000); // Fetch data every 60 seconds
        }
    },

    getFroniusData: function () {
        if (!this.config || !this.config.InverterIP) return;

        const url = `http://${this.config.InverterIP}/solar_api/v1/GetPowerFlowRealtimeData.fcgi`;
        if (this.config.debug) {
            console.log("[MMM-FroniusSolar2] Fetching data from URL:", url);
        }

        fetch(url)
            .then(response =&gt; {
                if (this.config.debug) {
                    console.log("[MMM-FroniusSolar2] Response received:", response);
                }
                if (!response.ok) {
                    throw new Error(`HTTP error!`);
                }
                return response.json();
            })
            .then(data =&gt; {
                if (this.config.debug) {
                    console.log("[MMM-FroniusSolar2] JSON data received:", data);
                }
                const siteData = data.Body.Data.Site;
                const inverterData = data.Body.Data.Inverters ? data.Body.Data.Inverters["1"] : {};

                const result = {
                    P_Akku: siteData.P_Akku || 0,
                    P_Grid: siteData.P_Grid || 0,
                    P_Load: siteData.P_Load || 0,
                    P_PV: siteData.P_PV || 0,
                    Inverters: { "1": { SOC: inverterData.SOC || 0 } },
                };

                if (this.config.debug) {
                    console.log("[MMM-FroniusSolar2] Parsed result:", result);
                }

                this.sendSocketNotification("FRONIUS_DATA", result);
            })
            .catch(error =&gt; {
                console.error("[MMM-FroniusSolar2] Error fetching data:", error);
            });
    },
});

</code></pre>
<p dir="auto">This will create a lot of log entry. So only use this temporary. If you see any errors you can’t solve, please send me the logs.</p>
<p dir="auto">Later use <code>pm2 flush</code> to clear the logs. The log-file size will increase with this version quite fast.</p>
]]></description><link>https://forum.magicmirror.builders/post/123692</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123692</guid><dc:creator><![CDATA[chrisfr1976]]></dc:creator><pubDate>Sun, 02 Feb 2025 18:57:51 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sun, 02 Feb 2025 06:26:42 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/chrisfr1976" aria-label="Profile: chrisfr1976">@<bdi>chrisfr1976</bdi></a></p>
<p dir="auto">Hi,<br />
Thanks for your response - I am attempting to install Fronius Solar 2 and have commented out the line in node-helper.js as advised in a previous post ( //const fetch = require(“node-fetch”);) and ran MM.</p>
<p dir="auto">It all loaded OK with no errors but it doesn’t show up on the dashboard,  doesn’t even say loading. IP address is correct.</p>
<p dir="auto">Wayne</p>
]]></description><link>https://forum.magicmirror.builders/post/123658</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123658</guid><dc:creator><![CDATA[waynerob11]]></dc:creator><pubDate>Sun, 02 Feb 2025 06:26:42 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sun, 26 Jan 2025 11:45:16 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/waynerob11" aria-label="Profile: waynerob11">@<bdi>waynerob11</bdi></a><br />
Please send the error massage that you receive. I want to help you!</p>
]]></description><link>https://forum.magicmirror.builders/post/123403</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123403</guid><dc:creator><![CDATA[chrisfr1976]]></dc:creator><pubDate>Sun, 26 Jan 2025 11:45:16 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sun, 26 Jan 2025 11:44:36 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/sdetweil" aria-label="Profile: sdetweil">@<bdi>sdetweil</bdi></a><br />
Hi,</p>
<p dir="auto">I’ve updated the node _helper.js.</p>
<pre><code>//const fetch = require("node-fetch");
</code></pre>
<p dir="auto">If some has trouble it can be reactivated. Maybe I hab installed node_helper in the past manually. I don’t remember. Until now I had no errors from that. But yes, it woks well without this line.</p>
]]></description><link>https://forum.magicmirror.builders/post/123402</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123402</guid><dc:creator><![CDATA[chrisfr1976]]></dc:creator><pubDate>Sun, 26 Jan 2025 11:44:36 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sun, 26 Jan 2025 07:27:44 GMT]]></title><description><![CDATA[<p dir="auto">Tried to install 2 and 3 on an RPI 3B+ running 64<br />
bookworm - will not even load and throws a .js error - IP address configured and did copy and paste for the config.js - mm just stalls</p>
]]></description><link>https://forum.magicmirror.builders/post/123400</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123400</guid><dc:creator><![CDATA[waynerob11]]></dc:creator><pubDate>Sun, 26 Jan 2025 07:27:44 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sun, 26 Jan 2025 07:19:43 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/chrisfr1976" aria-label="Profile: chrisfr1976">@<bdi>chrisfr1976</bdi></a></p>
<p dir="auto">Hello Chris<br />
FYI.<br />
They  remove node fetch from the magic mirror package on the last  release as we drop back to the integrated fetch that’s provided in node and in the electron browser unfortunately that breaks a bunch of modules.</p>
<p dir="auto">Just remove the the line const fetch = require(“fetch”); in the file node-helper.js in the module’s directory.</p>
<p dir="auto">I Have removed the line, and now it works</p>
]]></description><link>https://forum.magicmirror.builders/post/123399</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123399</guid><dc:creator><![CDATA[alfi153]]></dc:creator><pubDate>Sun, 26 Jan 2025 07:19:43 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sat, 25 Jan 2025 14:09:25 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/chrisfr1976" aria-label="Profile: chrisfr1976">@<bdi>chrisfr1976</bdi></a> everyone with reputation below 2 has every post reviewed (by me) before going live. sometimes i sleep! or do other things.  lol</p>
]]></description><link>https://forum.magicmirror.builders/post/123373</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123373</guid><dc:creator><![CDATA[sdetweil]]></dc:creator><pubDate>Sat, 25 Jan 2025 14:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sat, 25 Jan 2025 12:37:37 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/alfi153" aria-label="Profile: alfi153">@<bdi>alfi153</bdi></a> <a class="plugin-mentions-user plugin-mentions-a" href="/user/chrisfr1976" aria-label="Profile: chrisfr1976">@<bdi>chrisfr1976</bdi></a>  the current versions of nodejs since 18 have fetch built in. if the module does</p>
<p dir="auto">const fetch = require(‘node-fetch’)</p>
<p dir="auto">you can comment out that line and the fetch syntax is the same</p>
]]></description><link>https://forum.magicmirror.builders/post/123372</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123372</guid><dc:creator><![CDATA[sdetweil]]></dc:creator><pubDate>Sat, 25 Jan 2025 12:37:37 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sat, 25 Jan 2025 12:29:23 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/alfi153" aria-label="Profile: alfi153">@<bdi>alfi153</bdi></a> Okay, there was a delay in your message. Glad to her that everything is okay now. If you need any assistance please let me know:)</p>
]]></description><link>https://forum.magicmirror.builders/post/123371</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123371</guid><dc:creator><![CDATA[chrisfr1976]]></dc:creator><pubDate>Sat, 25 Jan 2025 12:29:23 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sat, 25 Jan 2025 10:45:05 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/alfi153" aria-label="Profile: alfi153">@<bdi>alfi153</bdi></a> Hi,<br />
I think I’ve misunderstood this conversation a little bit.</p>
<ul>
<li>you’re using MMM-FroniusSolar3 from me (ChrisF1976 on GitHub).</li>
<li>On your Fronius Symo GEN24 you activated the SolarApi.</li>
<li>In the config.js you used the correct IP</li>
</ul>
<p dir="auto">I just started it on my mirror and it works without any problems. I also deleted it completely and reinstalled it with “git clone…”.</p>
<p dir="auto">So the only reason I can imagine is, that there is a collision in the <code>node_helper.js</code>. I used only “SET_CONFIG” to data exchange. Maybe other modules use this, too. I had a lot of collisions already :-)</p>
<p dir="auto">Go to the <code>node_helper.js</code> and replace:</p>
<pre><code>    socketNotificationReceived: function (notification, payload) {
        if (notification === "Solar3_SET_CONFIG") { //Solar3_ added to avoid collision with other modules
</code></pre>
<p dir="auto">Then go to the <code>MMM-FroniusSolar3.js</code> and replace:</p>
<pre><code>    start: function () {
        this.solarData = null;
        this.solarSOC = null;
        console.log("[MMM-FroniusSolar] Sending configuration to node_helper...");
        this.sendSocketNotification("Solar3_SET_CONFIG", this.config); // Send configuration to node_helper with more specific name
        this.scheduleUpdate();
    },
</code></pre>
<p dir="auto">I this helps, please tell me. Then I’ll update it in general also for the other modules.</p>
<p dir="auto">If it doesn’t help, please look into the logs (for example with <code>pm2 log mm</code>) and also in logs of electron (I think ctrl+I was the command). I’m running a separate instance on <a href="https://docs.magicmirror.builders/getting-started/installation.html#usage" target="_blank" rel="noopener noreferrer nofollow ugc">server mode</a> with the port 8081 and a separate config2 to find those errors. I hope you can find the error!</p>
]]></description><link>https://forum.magicmirror.builders/post/123365</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123365</guid><dc:creator><![CDATA[chrisfr1976]]></dc:creator><pubDate>Sat, 25 Jan 2025 10:45:05 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sat, 25 Jan 2025 08:04:17 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/chrisfr1976" aria-label="Profile: chrisfr1976">@<bdi>chrisfr1976</bdi></a><br />
i fixed it<br />
i had to install node-fetch</p>
<p dir="auto">Thank you</p>
]]></description><link>https://forum.magicmirror.builders/post/123369</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123369</guid><dc:creator><![CDATA[alfi153]]></dc:creator><pubDate>Sat, 25 Jan 2025 08:04:17 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Sat, 25 Jan 2025 07:27:03 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/chrisfr1976" aria-label="Profile: chrisfr1976">@<bdi>chrisfr1976</bdi></a><br />
I try to use Version 3.<br />
The ip is correct<br />
i have activated the API on my Fronius Gen24<br />
is it possible to get any Log file?</p>
]]></description><link>https://forum.magicmirror.builders/post/123370</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123370</guid><dc:creator><![CDATA[alfi153]]></dc:creator><pubDate>Sat, 25 Jan 2025 07:27:03 GMT</pubDate></item><item><title><![CDATA[Reply to MMM-FroniusSolar family modules on Fri, 24 Jan 2025 19:49:53 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/alfi153" aria-label="Profile: alfi153">@<bdi>alfi153</bdi></a> Hi, my module is working complete different. I don‘t know the other node_helper.  The MMM-FroniusSolar 1-3 use the same node_helper. Version 4 is again different. For inverter settings nothing special is necessary. Is the ip configured corretly?</p>
<p dir="auto">Which version do you try to use?</p>
<p dir="auto">Chris.</p>
]]></description><link>https://forum.magicmirror.builders/post/123356</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/123356</guid><dc:creator><![CDATA[chrisfr1976]]></dc:creator><pubDate>Fri, 24 Jan 2025 19:49:53 GMT</pubDate></item></channel></rss>