Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Deye Solar Sun600 Auslese-JavaScript

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.7k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.1k

Deye Solar Sun600 Auslese-JavaScript

Geplant Angeheftet Gesperrt Verschoben JavaScript
24 Beiträge 14 Kommentatoren 12.4k Aufrufe 15 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • ACHIM BAECKERA Offline
    ACHIM BAECKERA Offline
    ACHIM BAECKER
    schrieb am zuletzt editiert von
    #1

    Hier mein Script zum Auslesen eines Balkonkraftwerk mit einem Inverter Deye Solar Sun600 über den Inverter-Webserver.
    (ohne Cloud und Solarman Account)

    Unter "http://IP-INVERTER/status.html" können die Aktualdaten ausgelesen werden.
    Das Script liest alle 5min diese Webseite aus und trägt die Werte in die entsprechenden Datenpunkte.

    Achim

    // Auslesen der Datenpunkte eines Solarinverters Deye Solar SUN600 und baugleiche
    // (Bosswerk MI600, ..)? 
    // --------------------------------------------------------------------------------
    // Erstellt: 01.2023 Achim Bäcker
    // ================================================================================
    
    // Die Daten werden ohne externe App + Verbindung (bsp: Solarman) über den
    // Webserver im Inverter abgerufen. 
    // 
    // Hierzu im Inverter das WLan einstellen und eine IP vergeben bzw. DHCP aktivieren. 
    // 
    // ================================================================================
    // Einrichten:
    // 1. Variable SolarFolder anpassen... hier werden die Datenpunkte erstellt
    //    Funktion CreateDatapoints einmalig aufrufen
    // 2. Über den Radar2-Adapter schaue ich das der Inverter online ist (er schaltet
    //    sich bei zu wenig Sonne aus) Online-ID in SolarOnlineVar eintragen
    // 3. Url des Inverters anpassen (SolarUrl) , Username und Passwort müssen mit übergeben
    //     werden, am besten erst einmal die Url im Browser testen. Wenn die Url passt, öffnet 
    //    sich eine Webseite wo man nur Striche sieht. Hier im Browser Quelltext 
    //    anzeigen wählen... noch vor dem Body ist eine Liste mit den Aktualwerten
    // 
    // Hier auf eigene Anlage anpassen
    var SolarFolder     = "0_userdata.0.Solar";
    var SolarOnlineVar  = "radar2.0.Solar._here";    
    var SolarUrl        ="http://admin:admin@192.168.2.160/status.html";
    
    // Datenpunkte erstellen, kann nach einmaligem Aufruf deaktiviert werden
    
    CreateDatapoints(SolarFolder);   // <<<<<----- Einmalig aufrufen
    
    
    // ================================================================================
    
    schedule('*/5 5-22 * * *', GetData); // zwischen 5-22Uhr alle 5min ausführen
    
    
    function GetData(){
        // zyklisches abholen der Daten, falls Solaranlage online ist
        var SolarIsOnline = getState(SolarOnlineVar).val;
        if (SolarIsOnline) {
            getWebsite();
        }
    }
    
    var http=require('http');
    
    function getWebsite(){
        // laden der Website und wandeln in ein Zeilen-Array
        // Werte Suchen und wegschreiben 
    
        http.get(SolarUrl, function(res){
            var str = "";
            console.log('Response is '+res.statusCode);
    
            if (res.statusCode != 200) {
                console.log("non-200 response status code:", res.statusCode);
                console.log("for url:", SolarUrl);
                res.resume();
                return;
            }
    
            res.on('data', function (chunk) {
                    str += chunk;
            });
    
            res.on('end', function () {
                var arr = str.split("\n");
                readSolData(arr, "webdata_sn");
                readSolData(arr, "webdata_msvn");
                readSolData(arr, "webdata_ssvn");
                readSolData(arr, "webdata_pv_type");
                readSolData(arr, "webdata_rate_p");
                readSolData(arr, "webdata_now_p", true);
                readSolData(arr, "webdata_today_e", true);
                readSolData(arr, "webdata_total_e", true);
                readSolData(arr, "webdata_alarm");
                readSolData(arr, "webdata_utime");
                readSolData(arr, "cover_mid");
                readSolData(arr, "cover_ver");
                readSolData(arr, "cover_wmode");
                readSolData(arr, "cover_ap_ssid");
                readSolData(arr, "cover_ap_ip");
                readSolData(arr, "cover_ap_mac");
                readSolData(arr, "cover_sta_ssid");
                readSolData(arr, "cover_sta_rssi");
                readSolData(arr, "cover_sta_ip");
                readSolData(arr, "cover_sta_mac");
                readSolData(arr, "status_a");
                readSolData(arr, "status_b");
                readSolData(arr, "status_c");
    
            });
    
        });
     }
    
    function readSolData(arr, dataPoint, isNumber = false){
        // Suchen des "dataPoint" und lesen dew zugehörigen Wertes,
        // dieser wird dann in den gleichnamigen Datenpunkt geschrieben
        var sub;
        var dpSearch = "var " + dataPoint;
         
         for (var i = 0; i < arr.length; i++){
            if (arr[i].includes(dpSearch)) {
                sub = arr[i].split("\"");
                var res = sub[1];
    
                if (isNumber){
                    res = parseFloat(res);
                }
                
                setState(SolarFolder + '.' + dataPoint, res);
    
                break;
               } 
            }
    }
    
    function CreateDatapoints(myFolder){
        // Datenpunkte anlegen, muss nur einmalig aufgerufen werden
         createState(myFolder + '.' + 'cover_ap_ip', '', {type: 'string',name: 'cover_ap_ip',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'cover_ap_mac', '', {type: 'string',name: 'cover_ap_mac',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'cover_ap_ssid', '', {type: 'string',name: 'cover_ap_ssid',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'cover_mid', '', {type: 'string',name: 'cover_mid',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'cover_sta_ip', '', {type: 'string',name: 'cover_sta_ip',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'cover_sta_mac', '', {type: 'string',name: 'cover_sta_mac',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'cover_sta_rssi', '', {type: 'string',name: 'cover_sta_rssi',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'cover_sta_ssid', '', {type: 'string',name: 'cover_sta_ssid',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'cover_ver', '', {type: 'string',name: 'cover_ver',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'cover_wmode', '', {type: 'string',name: 'cover_wmode',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'status_a', '', {type: 'string',name: 'status_a',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'status_b', '', {type: 'string',name: 'status_b',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'status_c', '', {type: 'string',name: 'status_c',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'webdata_alarm', '', {type: 'string',name: 'webdata_alarm',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'webdata_msvn', '', {type: 'string',name: 'webdata_msvn',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'webdata_now_p', 0, {type: 'number',name: 'webdata_now_p',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'webdata_pv_type', '', {type: 'string',name: 'webdata_pv_type',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'webdata_rate_p', '', {type: 'string',name: 'webdata_rate_p',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'webdata_sn', '', {type: 'string',name: 'webdata_sn',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'webdata_ssvn', '', {type: 'string',name: 'webdata_ssvn',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'webdata_today_e', 0, {type: 'number',name: 'webdata_today_e',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'webdata_total_e', 0, {type: 'number',name: 'webdata_total_e',read: true,write: true,role: 'state'});
         createState(myFolder + '.' + 'webdata_utime', '', {type: 'string',name: 'webdata_utime',read: true,write: true,role: 'state'});
    
         }
    
    
    
    
    M M E F 4 Antworten Letzte Antwort
    5
    • ACHIM BAECKERA ACHIM BAECKER

      Hier mein Script zum Auslesen eines Balkonkraftwerk mit einem Inverter Deye Solar Sun600 über den Inverter-Webserver.
      (ohne Cloud und Solarman Account)

      Unter "http://IP-INVERTER/status.html" können die Aktualdaten ausgelesen werden.
      Das Script liest alle 5min diese Webseite aus und trägt die Werte in die entsprechenden Datenpunkte.

      Achim

      // Auslesen der Datenpunkte eines Solarinverters Deye Solar SUN600 und baugleiche
      // (Bosswerk MI600, ..)? 
      // --------------------------------------------------------------------------------
      // Erstellt: 01.2023 Achim Bäcker
      // ================================================================================
      
      // Die Daten werden ohne externe App + Verbindung (bsp: Solarman) über den
      // Webserver im Inverter abgerufen. 
      // 
      // Hierzu im Inverter das WLan einstellen und eine IP vergeben bzw. DHCP aktivieren. 
      // 
      // ================================================================================
      // Einrichten:
      // 1. Variable SolarFolder anpassen... hier werden die Datenpunkte erstellt
      //    Funktion CreateDatapoints einmalig aufrufen
      // 2. Über den Radar2-Adapter schaue ich das der Inverter online ist (er schaltet
      //    sich bei zu wenig Sonne aus) Online-ID in SolarOnlineVar eintragen
      // 3. Url des Inverters anpassen (SolarUrl) , Username und Passwort müssen mit übergeben
      //     werden, am besten erst einmal die Url im Browser testen. Wenn die Url passt, öffnet 
      //    sich eine Webseite wo man nur Striche sieht. Hier im Browser Quelltext 
      //    anzeigen wählen... noch vor dem Body ist eine Liste mit den Aktualwerten
      // 
      // Hier auf eigene Anlage anpassen
      var SolarFolder     = "0_userdata.0.Solar";
      var SolarOnlineVar  = "radar2.0.Solar._here";    
      var SolarUrl        ="http://admin:admin@192.168.2.160/status.html";
      
      // Datenpunkte erstellen, kann nach einmaligem Aufruf deaktiviert werden
      
      CreateDatapoints(SolarFolder);   // <<<<<----- Einmalig aufrufen
      
      
      // ================================================================================
      
      schedule('*/5 5-22 * * *', GetData); // zwischen 5-22Uhr alle 5min ausführen
      
      
      function GetData(){
          // zyklisches abholen der Daten, falls Solaranlage online ist
          var SolarIsOnline = getState(SolarOnlineVar).val;
          if (SolarIsOnline) {
              getWebsite();
          }
      }
      
      var http=require('http');
      
      function getWebsite(){
          // laden der Website und wandeln in ein Zeilen-Array
          // Werte Suchen und wegschreiben 
      
          http.get(SolarUrl, function(res){
              var str = "";
              console.log('Response is '+res.statusCode);
      
              if (res.statusCode != 200) {
                  console.log("non-200 response status code:", res.statusCode);
                  console.log("for url:", SolarUrl);
                  res.resume();
                  return;
              }
      
              res.on('data', function (chunk) {
                      str += chunk;
              });
      
              res.on('end', function () {
                  var arr = str.split("\n");
                  readSolData(arr, "webdata_sn");
                  readSolData(arr, "webdata_msvn");
                  readSolData(arr, "webdata_ssvn");
                  readSolData(arr, "webdata_pv_type");
                  readSolData(arr, "webdata_rate_p");
                  readSolData(arr, "webdata_now_p", true);
                  readSolData(arr, "webdata_today_e", true);
                  readSolData(arr, "webdata_total_e", true);
                  readSolData(arr, "webdata_alarm");
                  readSolData(arr, "webdata_utime");
                  readSolData(arr, "cover_mid");
                  readSolData(arr, "cover_ver");
                  readSolData(arr, "cover_wmode");
                  readSolData(arr, "cover_ap_ssid");
                  readSolData(arr, "cover_ap_ip");
                  readSolData(arr, "cover_ap_mac");
                  readSolData(arr, "cover_sta_ssid");
                  readSolData(arr, "cover_sta_rssi");
                  readSolData(arr, "cover_sta_ip");
                  readSolData(arr, "cover_sta_mac");
                  readSolData(arr, "status_a");
                  readSolData(arr, "status_b");
                  readSolData(arr, "status_c");
      
              });
      
          });
       }
      
      function readSolData(arr, dataPoint, isNumber = false){
          // Suchen des "dataPoint" und lesen dew zugehörigen Wertes,
          // dieser wird dann in den gleichnamigen Datenpunkt geschrieben
          var sub;
          var dpSearch = "var " + dataPoint;
           
           for (var i = 0; i < arr.length; i++){
              if (arr[i].includes(dpSearch)) {
                  sub = arr[i].split("\"");
                  var res = sub[1];
      
                  if (isNumber){
                      res = parseFloat(res);
                  }
                  
                  setState(SolarFolder + '.' + dataPoint, res);
      
                  break;
                 } 
              }
      }
      
      function CreateDatapoints(myFolder){
          // Datenpunkte anlegen, muss nur einmalig aufgerufen werden
           createState(myFolder + '.' + 'cover_ap_ip', '', {type: 'string',name: 'cover_ap_ip',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'cover_ap_mac', '', {type: 'string',name: 'cover_ap_mac',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'cover_ap_ssid', '', {type: 'string',name: 'cover_ap_ssid',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'cover_mid', '', {type: 'string',name: 'cover_mid',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'cover_sta_ip', '', {type: 'string',name: 'cover_sta_ip',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'cover_sta_mac', '', {type: 'string',name: 'cover_sta_mac',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'cover_sta_rssi', '', {type: 'string',name: 'cover_sta_rssi',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'cover_sta_ssid', '', {type: 'string',name: 'cover_sta_ssid',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'cover_ver', '', {type: 'string',name: 'cover_ver',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'cover_wmode', '', {type: 'string',name: 'cover_wmode',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'status_a', '', {type: 'string',name: 'status_a',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'status_b', '', {type: 'string',name: 'status_b',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'status_c', '', {type: 'string',name: 'status_c',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'webdata_alarm', '', {type: 'string',name: 'webdata_alarm',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'webdata_msvn', '', {type: 'string',name: 'webdata_msvn',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'webdata_now_p', 0, {type: 'number',name: 'webdata_now_p',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'webdata_pv_type', '', {type: 'string',name: 'webdata_pv_type',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'webdata_rate_p', '', {type: 'string',name: 'webdata_rate_p',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'webdata_sn', '', {type: 'string',name: 'webdata_sn',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'webdata_ssvn', '', {type: 'string',name: 'webdata_ssvn',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'webdata_today_e', 0, {type: 'number',name: 'webdata_today_e',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'webdata_total_e', 0, {type: 'number',name: 'webdata_total_e',read: true,write: true,role: 'state'});
           createState(myFolder + '.' + 'webdata_utime', '', {type: 'string',name: 'webdata_utime',read: true,write: true,role: 'state'});
      
           }
      
      
      
      
      M Offline
      M Offline
      manner666
      schrieb am zuletzt editiert von
      #2

      @achim-baecker Vielen Dank, hab mein Balkonkraftwerk gestern bekommen und heute gleich mal dein Skript getestet. Funktioniert perfekt. Danke dir.

      1 Antwort Letzte Antwort
      0
      • C Offline
        C Offline
        CaesarII
        schrieb am zuletzt editiert von
        #3

        Klappt prima, Dankeschön.
        Musste aber zuerst Radar installieren. Jedoch werden bei mir nicht alle Werte gefüllt. Muss erst mal rausfinden was was ist. Aber mit der super Anleitung hat schon mal das erste gut geklappt.

        ACHIM BAECKERA 1 Antwort Letzte Antwort
        0
        • C CaesarII

          Klappt prima, Dankeschön.
          Musste aber zuerst Radar installieren. Jedoch werden bei mir nicht alle Werte gefüllt. Muss erst mal rausfinden was was ist. Aber mit der super Anleitung hat schon mal das erste gut geklappt.

          ACHIM BAECKERA Offline
          ACHIM BAECKERA Offline
          ACHIM BAECKER
          schrieb am zuletzt editiert von
          #4

          @caesarii
          Bei mir werden auch nicht alle Werte "gefüllt". Eigentliche verwende/logge ich nur die momentane Leistung "webdata_now_p" und die aufsummierte Leistung "webdata_total_e".
          Den Rest (Tages/wochen/Monatswerte/..) erzeuge ich über SQL-Script + JS.

          C 1 Antwort Letzte Antwort
          0
          • ACHIM BAECKERA ACHIM BAECKER

            @caesarii
            Bei mir werden auch nicht alle Werte "gefüllt". Eigentliche verwende/logge ich nur die momentane Leistung "webdata_now_p" und die aufsummierte Leistung "webdata_total_e".
            Den Rest (Tages/wochen/Monatswerte/..) erzeuge ich über SQL-Script + JS.

            C Offline
            C Offline
            CaesarII
            schrieb am zuletzt editiert von CaesarII
            #5

            @achim-baecker Ja hier fängt das Problem an. Hab zwar in meinem aktiven Arbeitsleben fast 25 Jahre programmiert ........ aber leider nur CNC Fräsmaschinen ;-) Mir würde schon reichen wenn ich die Werte von den letzten 3 Tagen anzeigen könnte. Die große Statistik liefert ja die App immer noch.

            ACHIM BAECKERA 1 Antwort Letzte Antwort
            0
            • C CaesarII

              @achim-baecker Ja hier fängt das Problem an. Hab zwar in meinem aktiven Arbeitsleben fast 25 Jahre programmiert ........ aber leider nur CNC Fräsmaschinen ;-) Mir würde schon reichen wenn ich die Werte von den letzten 3 Tagen anzeigen könnte. Die große Statistik liefert ja die App immer noch.

              ACHIM BAECKERA Offline
              ACHIM BAECKERA Offline
              ACHIM BAECKER
              schrieb am zuletzt editiert von
              #6

              @caesarii
              wenn ich das richtig verstehe willst nur den Verlauf der Momentan-Leistung, oder?
              Ich für meinen Teil zeichne die Momentan- und Summen-Werte in einer SQL Datenbank. Den Verlauf der aktuellen Leistung kann man dann leicht z.B. über den Flot-Adapter grafisch ausgeben. Dies geht komplett ohne Programmieren.
              Zum Erstellen der Tages, Wochen, Monatswerte,... nutze ich dann die in der Datenbank gespeicherten Summen-Werte. Über eine SQL-Abfrage werden mir dann diese zurück gegeben. Mit JS passe ich diese Daten an, um sie mit "materialdesign Bar Chart" darzustellen.

              1 Antwort Letzte Antwort
              0
              • cashC Offline
                cashC Offline
                cash
                Most Active
                schrieb am zuletzt editiert von
                #7

                Mal eine generelle Frage dazu (da ich hoffentlich morgen alles bekomme). Wozu genau die Abfrage mit dem Radar Adapter? Funktioniert der Wechselrichter nur wenn genug Sonne da ist? Das hieße ich kann den Wechselrichter bei schlechten Wetter nicht einrichten und in Betrieb nehmen? Oder kann man sich immer mit dem Wechselrichter per WLAN verbinden?

                ACHIM BAECKERA 1 Antwort Letzte Antwort
                0
                • cashC cash

                  Mal eine generelle Frage dazu (da ich hoffentlich morgen alles bekomme). Wozu genau die Abfrage mit dem Radar Adapter? Funktioniert der Wechselrichter nur wenn genug Sonne da ist? Das hieße ich kann den Wechselrichter bei schlechten Wetter nicht einrichten und in Betrieb nehmen? Oder kann man sich immer mit dem Wechselrichter per WLAN verbinden?

                  ACHIM BAECKERA Offline
                  ACHIM BAECKERA Offline
                  ACHIM BAECKER
                  schrieb am zuletzt editiert von
                  #8

                  @cash
                  Ja,
                  Der Wechselrichter arbeitet nur bei Licht...
                  ohne bekommt man keine Verbindung.

                  1 Antwort Letzte Antwort
                  0
                  • ACHIM BAECKERA ACHIM BAECKER

                    Hier mein Script zum Auslesen eines Balkonkraftwerk mit einem Inverter Deye Solar Sun600 über den Inverter-Webserver.
                    (ohne Cloud und Solarman Account)

                    Unter "http://IP-INVERTER/status.html" können die Aktualdaten ausgelesen werden.
                    Das Script liest alle 5min diese Webseite aus und trägt die Werte in die entsprechenden Datenpunkte.

                    Achim

                    // Auslesen der Datenpunkte eines Solarinverters Deye Solar SUN600 und baugleiche
                    // (Bosswerk MI600, ..)? 
                    // --------------------------------------------------------------------------------
                    // Erstellt: 01.2023 Achim Bäcker
                    // ================================================================================
                    
                    // Die Daten werden ohne externe App + Verbindung (bsp: Solarman) über den
                    // Webserver im Inverter abgerufen. 
                    // 
                    // Hierzu im Inverter das WLan einstellen und eine IP vergeben bzw. DHCP aktivieren. 
                    // 
                    // ================================================================================
                    // Einrichten:
                    // 1. Variable SolarFolder anpassen... hier werden die Datenpunkte erstellt
                    //    Funktion CreateDatapoints einmalig aufrufen
                    // 2. Über den Radar2-Adapter schaue ich das der Inverter online ist (er schaltet
                    //    sich bei zu wenig Sonne aus) Online-ID in SolarOnlineVar eintragen
                    // 3. Url des Inverters anpassen (SolarUrl) , Username und Passwort müssen mit übergeben
                    //     werden, am besten erst einmal die Url im Browser testen. Wenn die Url passt, öffnet 
                    //    sich eine Webseite wo man nur Striche sieht. Hier im Browser Quelltext 
                    //    anzeigen wählen... noch vor dem Body ist eine Liste mit den Aktualwerten
                    // 
                    // Hier auf eigene Anlage anpassen
                    var SolarFolder     = "0_userdata.0.Solar";
                    var SolarOnlineVar  = "radar2.0.Solar._here";    
                    var SolarUrl        ="http://admin:admin@192.168.2.160/status.html";
                    
                    // Datenpunkte erstellen, kann nach einmaligem Aufruf deaktiviert werden
                    
                    CreateDatapoints(SolarFolder);   // <<<<<----- Einmalig aufrufen
                    
                    
                    // ================================================================================
                    
                    schedule('*/5 5-22 * * *', GetData); // zwischen 5-22Uhr alle 5min ausführen
                    
                    
                    function GetData(){
                        // zyklisches abholen der Daten, falls Solaranlage online ist
                        var SolarIsOnline = getState(SolarOnlineVar).val;
                        if (SolarIsOnline) {
                            getWebsite();
                        }
                    }
                    
                    var http=require('http');
                    
                    function getWebsite(){
                        // laden der Website und wandeln in ein Zeilen-Array
                        // Werte Suchen und wegschreiben 
                    
                        http.get(SolarUrl, function(res){
                            var str = "";
                            console.log('Response is '+res.statusCode);
                    
                            if (res.statusCode != 200) {
                                console.log("non-200 response status code:", res.statusCode);
                                console.log("for url:", SolarUrl);
                                res.resume();
                                return;
                            }
                    
                            res.on('data', function (chunk) {
                                    str += chunk;
                            });
                    
                            res.on('end', function () {
                                var arr = str.split("\n");
                                readSolData(arr, "webdata_sn");
                                readSolData(arr, "webdata_msvn");
                                readSolData(arr, "webdata_ssvn");
                                readSolData(arr, "webdata_pv_type");
                                readSolData(arr, "webdata_rate_p");
                                readSolData(arr, "webdata_now_p", true);
                                readSolData(arr, "webdata_today_e", true);
                                readSolData(arr, "webdata_total_e", true);
                                readSolData(arr, "webdata_alarm");
                                readSolData(arr, "webdata_utime");
                                readSolData(arr, "cover_mid");
                                readSolData(arr, "cover_ver");
                                readSolData(arr, "cover_wmode");
                                readSolData(arr, "cover_ap_ssid");
                                readSolData(arr, "cover_ap_ip");
                                readSolData(arr, "cover_ap_mac");
                                readSolData(arr, "cover_sta_ssid");
                                readSolData(arr, "cover_sta_rssi");
                                readSolData(arr, "cover_sta_ip");
                                readSolData(arr, "cover_sta_mac");
                                readSolData(arr, "status_a");
                                readSolData(arr, "status_b");
                                readSolData(arr, "status_c");
                    
                            });
                    
                        });
                     }
                    
                    function readSolData(arr, dataPoint, isNumber = false){
                        // Suchen des "dataPoint" und lesen dew zugehörigen Wertes,
                        // dieser wird dann in den gleichnamigen Datenpunkt geschrieben
                        var sub;
                        var dpSearch = "var " + dataPoint;
                         
                         for (var i = 0; i < arr.length; i++){
                            if (arr[i].includes(dpSearch)) {
                                sub = arr[i].split("\"");
                                var res = sub[1];
                    
                                if (isNumber){
                                    res = parseFloat(res);
                                }
                                
                                setState(SolarFolder + '.' + dataPoint, res);
                    
                                break;
                               } 
                            }
                    }
                    
                    function CreateDatapoints(myFolder){
                        // Datenpunkte anlegen, muss nur einmalig aufgerufen werden
                         createState(myFolder + '.' + 'cover_ap_ip', '', {type: 'string',name: 'cover_ap_ip',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'cover_ap_mac', '', {type: 'string',name: 'cover_ap_mac',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'cover_ap_ssid', '', {type: 'string',name: 'cover_ap_ssid',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'cover_mid', '', {type: 'string',name: 'cover_mid',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'cover_sta_ip', '', {type: 'string',name: 'cover_sta_ip',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'cover_sta_mac', '', {type: 'string',name: 'cover_sta_mac',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'cover_sta_rssi', '', {type: 'string',name: 'cover_sta_rssi',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'cover_sta_ssid', '', {type: 'string',name: 'cover_sta_ssid',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'cover_ver', '', {type: 'string',name: 'cover_ver',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'cover_wmode', '', {type: 'string',name: 'cover_wmode',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'status_a', '', {type: 'string',name: 'status_a',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'status_b', '', {type: 'string',name: 'status_b',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'status_c', '', {type: 'string',name: 'status_c',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'webdata_alarm', '', {type: 'string',name: 'webdata_alarm',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'webdata_msvn', '', {type: 'string',name: 'webdata_msvn',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'webdata_now_p', 0, {type: 'number',name: 'webdata_now_p',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'webdata_pv_type', '', {type: 'string',name: 'webdata_pv_type',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'webdata_rate_p', '', {type: 'string',name: 'webdata_rate_p',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'webdata_sn', '', {type: 'string',name: 'webdata_sn',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'webdata_ssvn', '', {type: 'string',name: 'webdata_ssvn',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'webdata_today_e', 0, {type: 'number',name: 'webdata_today_e',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'webdata_total_e', 0, {type: 'number',name: 'webdata_total_e',read: true,write: true,role: 'state'});
                         createState(myFolder + '.' + 'webdata_utime', '', {type: 'string',name: 'webdata_utime',read: true,write: true,role: 'state'});
                    
                         }
                    
                    
                    
                    
                    M Offline
                    M Offline
                    MPF
                    schrieb am zuletzt editiert von
                    #9

                    @achim-baecker sagte in Deye Solar Sun600 Auslese-JavaScript:

                    Einrichten:

                    Einrichten:

                    // 1. Variable SolarFolder anpassen... hier werden die Datenpunkte erstellt
                    
                    //    Funktion CreateDatapoints einmalig aufrufen
                    
                    // 2. Über den Radar2-Adapter schaue ich das der Inverter online ist (er schaltet
                    
                    //    sich bei zu wenig Sonne aus) Online-ID in SolarOnlineVar eintragen
                    
                    // 3. Url des Inverters anpassen (SolarUrl) , Username und Passwort müssen mit übergeben
                    
                    //     werden, am besten erst einmal die Url im Browser testen. Wenn die Url passt, öffnet 
                    
                    //    sich eine Webseite wo man nur Striche sieht. Hier im Browser Quelltext 
                    
                    //    anzeigen wählen... noch vor dem Body ist eine Liste mit den Aktualwerten
                    

                    Hallo Achim,
                    was muss ich hier genau eintragen ? (SolarFolder und SolarOnlineVar)

                    Gruß,
                    Martin

                    cashC 1 Antwort Letzte Antwort
                    0
                    • M MPF

                      @achim-baecker sagte in Deye Solar Sun600 Auslese-JavaScript:

                      Einrichten:

                      Einrichten:

                      // 1. Variable SolarFolder anpassen... hier werden die Datenpunkte erstellt
                      
                      //    Funktion CreateDatapoints einmalig aufrufen
                      
                      // 2. Über den Radar2-Adapter schaue ich das der Inverter online ist (er schaltet
                      
                      //    sich bei zu wenig Sonne aus) Online-ID in SolarOnlineVar eintragen
                      
                      // 3. Url des Inverters anpassen (SolarUrl) , Username und Passwort müssen mit übergeben
                      
                      //     werden, am besten erst einmal die Url im Browser testen. Wenn die Url passt, öffnet 
                      
                      //    sich eine Webseite wo man nur Striche sieht. Hier im Browser Quelltext 
                      
                      //    anzeigen wählen... noch vor dem Body ist eine Liste mit den Aktualwerten
                      

                      Hallo Achim,
                      was muss ich hier genau eintragen ? (SolarFolder und SolarOnlineVar)

                      Gruß,
                      Martin

                      cashC Offline
                      cashC Offline
                      cash
                      Most Active
                      schrieb am zuletzt editiert von
                      #10

                      @mpf Steht doch in der Beschreibung. Der Folder ist ein Ort wo die Daten abgelgt werden. Kannst Du ablegen wo die willst unter userdata Was nach Userdata0. kommt ist frei wählbar. Kannst statt Solar auch Mettwurst dort eintragen. Würde ich aber nicht machen verwirrt ja hinterher nur :-) Also Verzeichnis Deiner Wahl. Solar_Online_Var ist das Objekt in ioBroker was signalisiert das die Anlage ereichbar ist. Ich habe z. B. nicht den Radar_2_Adapter sondern nutze einfach nur den Pinkg Adapter. Das heißt bei mir ist der Datenpunkt unter den Objekten unter Ping zu finden… Du könntest aber auch einfach den passenden Adapter installieren. Der liefert etwas mehr Daten. Die Script Variante hat halt andere Vorteile… Die Frage ist was Du willst

                      M 1 Antwort Letzte Antwort
                      0
                      • cashC cash

                        @mpf Steht doch in der Beschreibung. Der Folder ist ein Ort wo die Daten abgelgt werden. Kannst Du ablegen wo die willst unter userdata Was nach Userdata0. kommt ist frei wählbar. Kannst statt Solar auch Mettwurst dort eintragen. Würde ich aber nicht machen verwirrt ja hinterher nur :-) Also Verzeichnis Deiner Wahl. Solar_Online_Var ist das Objekt in ioBroker was signalisiert das die Anlage ereichbar ist. Ich habe z. B. nicht den Radar_2_Adapter sondern nutze einfach nur den Pinkg Adapter. Das heißt bei mir ist der Datenpunkt unter den Objekten unter Ping zu finden… Du könntest aber auch einfach den passenden Adapter installieren. Der liefert etwas mehr Daten. Die Script Variante hat halt andere Vorteile… Die Frage ist was Du willst

                        M Offline
                        M Offline
                        MPF
                        schrieb am zuletzt editiert von
                        #11

                        @cash ok,danke.
                        Den Radar_2_Adapter konnte ich gar installieren, warum auch immer ?

                        cashC 1 Antwort Letzte Antwort
                        0
                        • M MPF

                          @cash ok,danke.
                          Den Radar_2_Adapter konnte ich gar installieren, warum auch immer ?

                          cashC Offline
                          cashC Offline
                          cash
                          Most Active
                          schrieb am zuletzt editiert von
                          #12

                          @mpf wie gesagt den Adapter brauchst Du nicht unbedingt. Du brauchst nur einen Datenpunkt der true oder false anzeigt jenachdem ob die Anlage ereichbar ist. Man könnte auch einen eigenen Datenpunkt dafür anlegen und das ebenfalls per JavaScript abfragen z. B. per Axios ob die gewünschte Adresse etwas passendes zurückgibt. Alternatic das Script nur ausführen lassen wenn der Wechselrichter sicher läuft. Bei mir ist der Wechselrichter derzeit min. von 9:00 - 16:00 erreichbar. Je nach Helligkeit aber auch schon um kurz vor 8 bis 17:30. Viele Wege führen hier nach Rom

                          1 Antwort Letzte Antwort
                          0
                          • ACHIM BAECKERA ACHIM BAECKER

                            Hier mein Script zum Auslesen eines Balkonkraftwerk mit einem Inverter Deye Solar Sun600 über den Inverter-Webserver.
                            (ohne Cloud und Solarman Account)

                            Unter "http://IP-INVERTER/status.html" können die Aktualdaten ausgelesen werden.
                            Das Script liest alle 5min diese Webseite aus und trägt die Werte in die entsprechenden Datenpunkte.

                            Achim

                            // Auslesen der Datenpunkte eines Solarinverters Deye Solar SUN600 und baugleiche
                            // (Bosswerk MI600, ..)? 
                            // --------------------------------------------------------------------------------
                            // Erstellt: 01.2023 Achim Bäcker
                            // ================================================================================
                            
                            // Die Daten werden ohne externe App + Verbindung (bsp: Solarman) über den
                            // Webserver im Inverter abgerufen. 
                            // 
                            // Hierzu im Inverter das WLan einstellen und eine IP vergeben bzw. DHCP aktivieren. 
                            // 
                            // ================================================================================
                            // Einrichten:
                            // 1. Variable SolarFolder anpassen... hier werden die Datenpunkte erstellt
                            //    Funktion CreateDatapoints einmalig aufrufen
                            // 2. Über den Radar2-Adapter schaue ich das der Inverter online ist (er schaltet
                            //    sich bei zu wenig Sonne aus) Online-ID in SolarOnlineVar eintragen
                            // 3. Url des Inverters anpassen (SolarUrl) , Username und Passwort müssen mit übergeben
                            //     werden, am besten erst einmal die Url im Browser testen. Wenn die Url passt, öffnet 
                            //    sich eine Webseite wo man nur Striche sieht. Hier im Browser Quelltext 
                            //    anzeigen wählen... noch vor dem Body ist eine Liste mit den Aktualwerten
                            // 
                            // Hier auf eigene Anlage anpassen
                            var SolarFolder     = "0_userdata.0.Solar";
                            var SolarOnlineVar  = "radar2.0.Solar._here";    
                            var SolarUrl        ="http://admin:admin@192.168.2.160/status.html";
                            
                            // Datenpunkte erstellen, kann nach einmaligem Aufruf deaktiviert werden
                            
                            CreateDatapoints(SolarFolder);   // <<<<<----- Einmalig aufrufen
                            
                            
                            // ================================================================================
                            
                            schedule('*/5 5-22 * * *', GetData); // zwischen 5-22Uhr alle 5min ausführen
                            
                            
                            function GetData(){
                                // zyklisches abholen der Daten, falls Solaranlage online ist
                                var SolarIsOnline = getState(SolarOnlineVar).val;
                                if (SolarIsOnline) {
                                    getWebsite();
                                }
                            }
                            
                            var http=require('http');
                            
                            function getWebsite(){
                                // laden der Website und wandeln in ein Zeilen-Array
                                // Werte Suchen und wegschreiben 
                            
                                http.get(SolarUrl, function(res){
                                    var str = "";
                                    console.log('Response is '+res.statusCode);
                            
                                    if (res.statusCode != 200) {
                                        console.log("non-200 response status code:", res.statusCode);
                                        console.log("for url:", SolarUrl);
                                        res.resume();
                                        return;
                                    }
                            
                                    res.on('data', function (chunk) {
                                            str += chunk;
                                    });
                            
                                    res.on('end', function () {
                                        var arr = str.split("\n");
                                        readSolData(arr, "webdata_sn");
                                        readSolData(arr, "webdata_msvn");
                                        readSolData(arr, "webdata_ssvn");
                                        readSolData(arr, "webdata_pv_type");
                                        readSolData(arr, "webdata_rate_p");
                                        readSolData(arr, "webdata_now_p", true);
                                        readSolData(arr, "webdata_today_e", true);
                                        readSolData(arr, "webdata_total_e", true);
                                        readSolData(arr, "webdata_alarm");
                                        readSolData(arr, "webdata_utime");
                                        readSolData(arr, "cover_mid");
                                        readSolData(arr, "cover_ver");
                                        readSolData(arr, "cover_wmode");
                                        readSolData(arr, "cover_ap_ssid");
                                        readSolData(arr, "cover_ap_ip");
                                        readSolData(arr, "cover_ap_mac");
                                        readSolData(arr, "cover_sta_ssid");
                                        readSolData(arr, "cover_sta_rssi");
                                        readSolData(arr, "cover_sta_ip");
                                        readSolData(arr, "cover_sta_mac");
                                        readSolData(arr, "status_a");
                                        readSolData(arr, "status_b");
                                        readSolData(arr, "status_c");
                            
                                    });
                            
                                });
                             }
                            
                            function readSolData(arr, dataPoint, isNumber = false){
                                // Suchen des "dataPoint" und lesen dew zugehörigen Wertes,
                                // dieser wird dann in den gleichnamigen Datenpunkt geschrieben
                                var sub;
                                var dpSearch = "var " + dataPoint;
                                 
                                 for (var i = 0; i < arr.length; i++){
                                    if (arr[i].includes(dpSearch)) {
                                        sub = arr[i].split("\"");
                                        var res = sub[1];
                            
                                        if (isNumber){
                                            res = parseFloat(res);
                                        }
                                        
                                        setState(SolarFolder + '.' + dataPoint, res);
                            
                                        break;
                                       } 
                                    }
                            }
                            
                            function CreateDatapoints(myFolder){
                                // Datenpunkte anlegen, muss nur einmalig aufgerufen werden
                                 createState(myFolder + '.' + 'cover_ap_ip', '', {type: 'string',name: 'cover_ap_ip',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'cover_ap_mac', '', {type: 'string',name: 'cover_ap_mac',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'cover_ap_ssid', '', {type: 'string',name: 'cover_ap_ssid',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'cover_mid', '', {type: 'string',name: 'cover_mid',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'cover_sta_ip', '', {type: 'string',name: 'cover_sta_ip',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'cover_sta_mac', '', {type: 'string',name: 'cover_sta_mac',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'cover_sta_rssi', '', {type: 'string',name: 'cover_sta_rssi',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'cover_sta_ssid', '', {type: 'string',name: 'cover_sta_ssid',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'cover_ver', '', {type: 'string',name: 'cover_ver',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'cover_wmode', '', {type: 'string',name: 'cover_wmode',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'status_a', '', {type: 'string',name: 'status_a',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'status_b', '', {type: 'string',name: 'status_b',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'status_c', '', {type: 'string',name: 'status_c',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'webdata_alarm', '', {type: 'string',name: 'webdata_alarm',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'webdata_msvn', '', {type: 'string',name: 'webdata_msvn',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'webdata_now_p', 0, {type: 'number',name: 'webdata_now_p',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'webdata_pv_type', '', {type: 'string',name: 'webdata_pv_type',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'webdata_rate_p', '', {type: 'string',name: 'webdata_rate_p',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'webdata_sn', '', {type: 'string',name: 'webdata_sn',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'webdata_ssvn', '', {type: 'string',name: 'webdata_ssvn',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'webdata_today_e', 0, {type: 'number',name: 'webdata_today_e',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'webdata_total_e', 0, {type: 'number',name: 'webdata_total_e',read: true,write: true,role: 'state'});
                                 createState(myFolder + '.' + 'webdata_utime', '', {type: 'string',name: 'webdata_utime',read: true,write: true,role: 'state'});
                            
                                 }
                            
                            
                            
                            
                            E Offline
                            E Offline
                            EREX
                            schrieb am zuletzt editiert von
                            #13

                            @achim-baecker Vielen Dank für Deine Mühe. Lese damit meinen DEYE SUN800W aus.
                            Funktioniert einwandfrei.

                            1 Antwort Letzte Antwort
                            0
                            • M Offline
                              M Offline
                              meexx
                              schrieb am zuletzt editiert von
                              #14

                              Hi,

                              ich habe mal eine Frage zu dem "SolarOnlineVar" Datenpunkt. Braucht der als Wert 0 bzw 1 .... oder true oder false ? ich habe den Ping Adapter ohnehin schon installiert und dort auch den Wert, der ist aber nur true bzw false. Wenn das reicht dann kann ich diesen ja benutzen rein theoretisch. Brauche ich aber als Wert 0 bzw 1 dann würde ich halt noch mit einem BlocklyScript einen Datenpunkt mit 0 oder 1 erstellen .

                              Ich bin noch blutiger Anfänger, darum verzeiht mit die Frage, im übrigen werte ich einen Wechselrichter von Sofar-Solar damit aus, im Moment noch ohne Abfrage ob er online ist oder nicht, würde das aber gerne auch automatisieren.

                              MfG Ralf

                              1 Antwort Letzte Antwort
                              0
                              • M Offline
                                M Offline
                                meexx
                                schrieb am zuletzt editiert von meexx
                                #15

                                Hallo nochmal,

                                habe es inzwischen laufen, nur die Werte passen nicht so richtig..... kann man in dem Script irgendwie die nachkommastellen festlegen ? bekomme da nicht die plausiblen Werte. Im Beispiel zusehen ist das der Wert 6,99 der dann auf 7 bzw 7,1 springt, der sollte aber laut Weboberfläche dann 7,00 bzw 7,01 sein und nicht 7,1 weil dann weiter oben die Werte ja nicht mehr zusammen passen ? gibt es da eventuell eine kleine Lösung für ? weil so spielt dann Grafana nicht ganz mit. Im übrigen gebrauche ich das Script für einen Data Logger von SofarSolar Wechselrichter, Cool wäre auch noch das der Wert um 23:59 Uhr wieder auf 0,00 Gesetz wird oder wenn der Logger Offline ist dann setze Wert auf 0,00 . Leider stecke ich nicht so drin bei Java .

                                java_zahlenwerte.JPG

                                besten Dank für die Mühe Gruß Ralf ......

                                T 1 Antwort Letzte Antwort
                                0
                                • ACHIM BAECKERA ACHIM BAECKER

                                  Hier mein Script zum Auslesen eines Balkonkraftwerk mit einem Inverter Deye Solar Sun600 über den Inverter-Webserver.
                                  (ohne Cloud und Solarman Account)

                                  Unter "http://IP-INVERTER/status.html" können die Aktualdaten ausgelesen werden.
                                  Das Script liest alle 5min diese Webseite aus und trägt die Werte in die entsprechenden Datenpunkte.

                                  Achim

                                  // Auslesen der Datenpunkte eines Solarinverters Deye Solar SUN600 und baugleiche
                                  // (Bosswerk MI600, ..)? 
                                  // --------------------------------------------------------------------------------
                                  // Erstellt: 01.2023 Achim Bäcker
                                  // ================================================================================
                                  
                                  // Die Daten werden ohne externe App + Verbindung (bsp: Solarman) über den
                                  // Webserver im Inverter abgerufen. 
                                  // 
                                  // Hierzu im Inverter das WLan einstellen und eine IP vergeben bzw. DHCP aktivieren. 
                                  // 
                                  // ================================================================================
                                  // Einrichten:
                                  // 1. Variable SolarFolder anpassen... hier werden die Datenpunkte erstellt
                                  //    Funktion CreateDatapoints einmalig aufrufen
                                  // 2. Über den Radar2-Adapter schaue ich das der Inverter online ist (er schaltet
                                  //    sich bei zu wenig Sonne aus) Online-ID in SolarOnlineVar eintragen
                                  // 3. Url des Inverters anpassen (SolarUrl) , Username und Passwort müssen mit übergeben
                                  //     werden, am besten erst einmal die Url im Browser testen. Wenn die Url passt, öffnet 
                                  //    sich eine Webseite wo man nur Striche sieht. Hier im Browser Quelltext 
                                  //    anzeigen wählen... noch vor dem Body ist eine Liste mit den Aktualwerten
                                  // 
                                  // Hier auf eigene Anlage anpassen
                                  var SolarFolder     = "0_userdata.0.Solar";
                                  var SolarOnlineVar  = "radar2.0.Solar._here";    
                                  var SolarUrl        ="http://admin:admin@192.168.2.160/status.html";
                                  
                                  // Datenpunkte erstellen, kann nach einmaligem Aufruf deaktiviert werden
                                  
                                  CreateDatapoints(SolarFolder);   // <<<<<----- Einmalig aufrufen
                                  
                                  
                                  // ================================================================================
                                  
                                  schedule('*/5 5-22 * * *', GetData); // zwischen 5-22Uhr alle 5min ausführen
                                  
                                  
                                  function GetData(){
                                      // zyklisches abholen der Daten, falls Solaranlage online ist
                                      var SolarIsOnline = getState(SolarOnlineVar).val;
                                      if (SolarIsOnline) {
                                          getWebsite();
                                      }
                                  }
                                  
                                  var http=require('http');
                                  
                                  function getWebsite(){
                                      // laden der Website und wandeln in ein Zeilen-Array
                                      // Werte Suchen und wegschreiben 
                                  
                                      http.get(SolarUrl, function(res){
                                          var str = "";
                                          console.log('Response is '+res.statusCode);
                                  
                                          if (res.statusCode != 200) {
                                              console.log("non-200 response status code:", res.statusCode);
                                              console.log("for url:", SolarUrl);
                                              res.resume();
                                              return;
                                          }
                                  
                                          res.on('data', function (chunk) {
                                                  str += chunk;
                                          });
                                  
                                          res.on('end', function () {
                                              var arr = str.split("\n");
                                              readSolData(arr, "webdata_sn");
                                              readSolData(arr, "webdata_msvn");
                                              readSolData(arr, "webdata_ssvn");
                                              readSolData(arr, "webdata_pv_type");
                                              readSolData(arr, "webdata_rate_p");
                                              readSolData(arr, "webdata_now_p", true);
                                              readSolData(arr, "webdata_today_e", true);
                                              readSolData(arr, "webdata_total_e", true);
                                              readSolData(arr, "webdata_alarm");
                                              readSolData(arr, "webdata_utime");
                                              readSolData(arr, "cover_mid");
                                              readSolData(arr, "cover_ver");
                                              readSolData(arr, "cover_wmode");
                                              readSolData(arr, "cover_ap_ssid");
                                              readSolData(arr, "cover_ap_ip");
                                              readSolData(arr, "cover_ap_mac");
                                              readSolData(arr, "cover_sta_ssid");
                                              readSolData(arr, "cover_sta_rssi");
                                              readSolData(arr, "cover_sta_ip");
                                              readSolData(arr, "cover_sta_mac");
                                              readSolData(arr, "status_a");
                                              readSolData(arr, "status_b");
                                              readSolData(arr, "status_c");
                                  
                                          });
                                  
                                      });
                                   }
                                  
                                  function readSolData(arr, dataPoint, isNumber = false){
                                      // Suchen des "dataPoint" und lesen dew zugehörigen Wertes,
                                      // dieser wird dann in den gleichnamigen Datenpunkt geschrieben
                                      var sub;
                                      var dpSearch = "var " + dataPoint;
                                       
                                       for (var i = 0; i < arr.length; i++){
                                          if (arr[i].includes(dpSearch)) {
                                              sub = arr[i].split("\"");
                                              var res = sub[1];
                                  
                                              if (isNumber){
                                                  res = parseFloat(res);
                                              }
                                              
                                              setState(SolarFolder + '.' + dataPoint, res);
                                  
                                              break;
                                             } 
                                          }
                                  }
                                  
                                  function CreateDatapoints(myFolder){
                                      // Datenpunkte anlegen, muss nur einmalig aufgerufen werden
                                       createState(myFolder + '.' + 'cover_ap_ip', '', {type: 'string',name: 'cover_ap_ip',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'cover_ap_mac', '', {type: 'string',name: 'cover_ap_mac',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'cover_ap_ssid', '', {type: 'string',name: 'cover_ap_ssid',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'cover_mid', '', {type: 'string',name: 'cover_mid',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'cover_sta_ip', '', {type: 'string',name: 'cover_sta_ip',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'cover_sta_mac', '', {type: 'string',name: 'cover_sta_mac',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'cover_sta_rssi', '', {type: 'string',name: 'cover_sta_rssi',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'cover_sta_ssid', '', {type: 'string',name: 'cover_sta_ssid',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'cover_ver', '', {type: 'string',name: 'cover_ver',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'cover_wmode', '', {type: 'string',name: 'cover_wmode',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'status_a', '', {type: 'string',name: 'status_a',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'status_b', '', {type: 'string',name: 'status_b',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'status_c', '', {type: 'string',name: 'status_c',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'webdata_alarm', '', {type: 'string',name: 'webdata_alarm',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'webdata_msvn', '', {type: 'string',name: 'webdata_msvn',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'webdata_now_p', 0, {type: 'number',name: 'webdata_now_p',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'webdata_pv_type', '', {type: 'string',name: 'webdata_pv_type',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'webdata_rate_p', '', {type: 'string',name: 'webdata_rate_p',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'webdata_sn', '', {type: 'string',name: 'webdata_sn',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'webdata_ssvn', '', {type: 'string',name: 'webdata_ssvn',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'webdata_today_e', 0, {type: 'number',name: 'webdata_today_e',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'webdata_total_e', 0, {type: 'number',name: 'webdata_total_e',read: true,write: true,role: 'state'});
                                       createState(myFolder + '.' + 'webdata_utime', '', {type: 'string',name: 'webdata_utime',read: true,write: true,role: 'state'});
                                  
                                       }
                                  
                                  
                                  
                                  
                                  F Offline
                                  F Offline
                                  Flying-Bolt
                                  schrieb am zuletzt editiert von
                                  #16

                                  @achim-baecker

                                  Bei mir sieht die Status.HTML anders aus.
                                  5852bdb7-2281-4578-9196-c153835607e5-image.png

                                  Was muss ich für meine HTML Seite anpassen?

                                  F 1 Antwort Letzte Antwort
                                  0
                                  • F Flying-Bolt

                                    @achim-baecker

                                    Bei mir sieht die Status.HTML anders aus.
                                    5852bdb7-2281-4578-9196-c153835607e5-image.png

                                    Was muss ich für meine HTML Seite anpassen?

                                    F Offline
                                    F Offline
                                    Flying-Bolt
                                    schrieb am zuletzt editiert von Flying-Bolt
                                    #17

                                    @flying-bolt said in Deye Solar Sun600 Auslese-JavaScript:

                                    @achim-baecker

                                    Bei mir sieht die Status.HTML anders aus.
                                    5852bdb7-2281-4578-9196-c153835607e5-image.png

                                    Was muss ich für meine HTML Seite anpassen?

                                    ich bin schon mal selber einen Schritt weiter. Der http.get bekommt nicht die komplette Seite sondern nur den statischen HTML Teil.
                                    Der Teil der durch das JAVA Script erzeugt wird, also den Datenteil, der fehlt.

                                    Ich habe diese Consolenausgabe eingefügt:

                                    res.on('end', function () {
                                    console.log(str);

                                    Den Ausgabestring habe ich dann rauskopiert und ihn dann als HTML-Datei gespeichert und im Browser anzeigen lassen.

                                    05b2328f-c0ce-4720-9e38-cb245f6825ef-image.png

                                    D 1 Antwort Letzte Antwort
                                    0
                                    • M meexx

                                      Hallo nochmal,

                                      habe es inzwischen laufen, nur die Werte passen nicht so richtig..... kann man in dem Script irgendwie die nachkommastellen festlegen ? bekomme da nicht die plausiblen Werte. Im Beispiel zusehen ist das der Wert 6,99 der dann auf 7 bzw 7,1 springt, der sollte aber laut Weboberfläche dann 7,00 bzw 7,01 sein und nicht 7,1 weil dann weiter oben die Werte ja nicht mehr zusammen passen ? gibt es da eventuell eine kleine Lösung für ? weil so spielt dann Grafana nicht ganz mit. Im übrigen gebrauche ich das Script für einen Data Logger von SofarSolar Wechselrichter, Cool wäre auch noch das der Wert um 23:59 Uhr wieder auf 0,00 Gesetz wird oder wenn der Logger Offline ist dann setze Wert auf 0,00 . Leider stecke ich nicht so drin bei Java .

                                      java_zahlenwerte.JPG

                                      besten Dank für die Mühe Gruß Ralf ......

                                      T Offline
                                      T Offline
                                      truderinger
                                      schrieb am zuletzt editiert von truderinger
                                      #18

                                      Hallo,

                                      ich wende mich mal an einen erfolgreichen user hier.

                                      Ich habe im ioBroker das JS-Script angelegt und die Punkte

                                      var SolarFolder = "0_userdata.0.Solar";
                                      var SolarOnlineVar = "radar2.0.Solar._here";
                                      var SolarUrl = "http://admin:admin@192.168.1.87/status.html";

                                      entsprechend angepasst. Das script neu gestartet und ca. 30 min. gewartet. Keiner der neu angelegten Datapoints wurde befüllt. Der Deye Sun800 ist auch in Betrieb. Ich bin jedoch auch mit solarman-business verbunden. Gibt es hier noch etwas zu beachten?

                                      Danke an den Ersteller und an die Gehilfen.

                                      Ergänzung: nach 40 Min habe ich jetzt jeweils eine "0" stehen und zwar bei
                                      webdata_now_p
                                      _today_e
                                      _total_e

                                      Aber warum "0" wenn die Solarman-App und mit der "status.html" rund 70 Watt angezeigt hat.

                                      Herbert

                                      1 Antwort Letzte Antwort
                                      0
                                      • K Offline
                                        K Offline
                                        kiste01
                                        schrieb am zuletzt editiert von
                                        #19

                                        Hallo,

                                        ich habe einen SUN-M80G3-EU-230 und möchte die Daten lokal auslesen. Die web ui sieht sehr ähnlich wie die vom Sun600 aus. Kann jemand diesen WR über das script auslesen? Ich bekomme auch nur die drei Nullen wie @truderinger

                                        Grüße

                                        Tobi RoT Z 2 Antworten Letzte Antwort
                                        0
                                        • K kiste01

                                          Hallo,

                                          ich habe einen SUN-M80G3-EU-230 und möchte die Daten lokal auslesen. Die web ui sieht sehr ähnlich wie die vom Sun600 aus. Kann jemand diesen WR über das script auslesen? Ich bekomme auch nur die drei Nullen wie @truderinger

                                          Grüße

                                          Tobi RoT Offline
                                          Tobi RoT Offline
                                          Tobi Ro
                                          schrieb am zuletzt editiert von
                                          #20

                                          @kiste01
                                          Ich habe den gleichen Wechselrichter und kann das Skript problemlos nutzen.
                                          Hattest du die IP in radar2 eingetragen und die ID vom Wechselrichter im Skript geändert?

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          977

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe