Ankündigung

Einklappen
Keine Ankündigung bisher.

FRONIUS Wechselrichter - KOSTAL SMA Plugin JSON API

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    FRONIUS Wechselrichter - KOSTAL SMA Plugin JSON API

    Hallo zusammen!

    Frage: Hat jemand das Plugin "KOSTAL" erfolgreich mit einem Fronius Galvo Wechselrichter im Einsatz? Sollte ja auch laut Thread ("mit diesem funktionieren.
    Habe entsprechend in der 'plugin.yaml' das KOSTAL Plugin aktiviert (Abfrageformat = JSON), SHNG gibt mir aber nur folgenden Fehler retour:
    Code:
    2019-01-30 15:24:19 ERROR plugins.kostal could not retrieve data from X.X.X.X: HTTP Error 404: Not Found
    Abfrage des Wechselrichters mittels Browser und folgender URL funktioniert:

    Unbenannt.jpg
    Dankeschön für die Rückmeldung!

    BG David

    #2
    Kenne das Plugin nicht, vl stimmt die url im plugin nicht?

    Edit: laut Plugin ruft er diese url auf
    HTML-Code:
     kostalurl = 'http://' + self.ip + '/api/dxs.json?sessionid=SmartHomeNG'
    Zuletzt geändert von Bonze; 01.02.2019, 19:12.

    Kommentar


      #3
      Hat sich vielleicht bei Deinem schon was geändert. Leider ist im Code alles hardcodiert wie Bonze schon geschrieben hat:

      Code:
                  # generate url; fetching only needed elements
                  kostalurl = 'http://' + self.ip + '/api/dxs.json?sessionid=SmartHomeNG'
                  for item in self._items:
                      value = self._keytable[item]
                      kostalurl +='&dxsEntries=' + str(value)
      Man könnte die URL als Plugin Parameter mit übergeben. Das sollte allerdings jemand machen, der das Plugin auch nutzt. Ich habe schon genug Baustellen offen ...

      Kommentar


        #4
        Hallo :-)

        Also habe jetzt wie im Post von Bonze angeführt mal in der Plugindatei "__init__.py" des KOSTAL-Ordners den URL-Eintrag auf
        Code:
        kostalurl = 'http://' + self.ip + '/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData'
        geändert, jedoch kommt im Log "smarthome-warnings.log" folgende Fehlermeldung:
        HTML-Code:
        ERROR    plugins.kostal    could not retrieve data from 10.0.0.220: 'dxsEntries'
        Wie gesagt, leider bin ich überhaupt nicht bewandert im "coden" bzw. programmieren .... sonst würde ich eh versuchen, dass "Problem" selber in den Griff zu bekommen. War doch in der Annahme, dass es evtl. mehrere Besitzer eines FRONIUS-Wechselrichters gibt, welche auf SHNG setzen und sich die Werte des Wechselrichters ausgeben lassen möchten. Deshalb auch mein Post dahingehend ....

        Mein "Problem" hat aber absolut keine Dringlichkeit :-)

        Beste Grüße
        David

        Kommentar


          #5
          du könntest vl mal den json code hier reinstellen, damit man den vorhandenen code mit dem json mal parsen kann, um zu sehen was da anders ist. Hab weder nen Fronius noch nen Kostal Wechselrichter. Soweit ich das auf den ersten blick sehe, haben die 2 aber auch ganz unterschiedliche Keys
          Zuletzt geändert von Bonze; 04.02.2019, 20:25.

          Kommentar


            #6
            Also die Ausgabe des Fronius Wechselrichters bei der Abfrage mit oben angeführten URL-Link schaut folgendermaßen aus:

            { "Body" : { "Data" : { "DAY_ENERGY" : { "Unit" : "Wh", "Value" : 159.19999999999999 }, "DeviceStatus" : { "ErrorCode" : 0, "LEDColor" : 2, "LEDState" : 0, "MgmtTimerRemainingTime" : -1, "StateToReset" : false, "StatusCode" : 7 }, "FAC" : { "Unit" : "Hz", "Value" : 50 }, "IAC" : { "Unit" : "A", "Value" : 1.2 }, "IDC" : { "Unit" : "A", "Value" : 0.68999999999999995 }, "PAC" : { "Unit" : "W", "Value" : 111 }, "TOTAL_ENERGY" : { "Unit" : "Wh", "Value" : 4552750 }, "UAC" : { "Unit" : "V", "Value" : 237.19999999999999 }, "UDC" : { "Unit" : "V", "Value" : 193.40000000000001 }, "YEAR_ENERGY" : { "Unit" : "Wh", "Value" : 77647.699999999997 } } }, "Head" : { "RequestArguments" : { "DataCollection" : "CommonInverterData", "DeviceClass" : "Inverter", "DeviceId" : "1", "Scope" : "Device" }, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2019-02-07T10:43:11+01:00" } }
            Oder meinst Du "andere" Daten?
            LG

            Kommentar


              #7
              Also ich habs jetzt über "Umwege" so gelöst:

              - ioBroker greit die Daten mittels vorfügbaren Adapter direkt vom Webinterface des Wechselrichters ab
              - Mittels installierten MQTT Client am RPi-ioBroker können die einzelnen Werte sehr am den MQTT-Broker am SHNG-RPi übergeben werden
              - Ein Item mit entsprechenden MQTT-Topic in SHNG anlegen und schon läufts

              Ist zwar etwas umständlich aber für "NichtProgrammierer & Nichtscripter" wie mich eine relativ einfach umzusetzende Lösung ....

              LG
              David

              Kommentar


                #8
                Ach Du grüne Neune ...

                Am einfachsten wird es sein eine Logik zu schreiben, die regelmäßig die o.a. URL abruft.
                Der String mit JSON läßt sich einfach in ein Python dict überführen (Siehe z.B. https://stackoverflow.com/questions/...nary-in-python) und mit Kenntnis der dann entstehenden Dict Struktur kann man direkt an die passenden Items zuweisen.
                Du kannst z.B. das Ergebnis der obigen Abfrage in Notepad++ mit dem Plugin JSON Viewer anschauen und das auch hübsch formatieren lassen:

                Code:
                {
                    "Body": {
                        "Data": {
                            "DAY_ENERGY": {
                                "Unit": "Wh",
                                "Value": 159.2
                            },
                            "DeviceStatus": {
                                "ErrorCode": 0,
                                "LEDColor": 2,
                                "LEDState": 0,
                                "MgmtTimerRemainingTime": -1,
                                "StateToReset": false,
                                "StatusCode": 7
                            },
                            "FAC": {
                                "Unit": "Hz",
                                "Value": 50
                            },
                            "IAC": {
                                "Unit": "A",
                                "Value": 1.2
                            },
                ....
                jsonviewer.png

                Kommentar


                  #9
                  Ich weiß, meine Lösung ist wie von Berlin nach München über Paris zu fahren

                  Ich versteh schon, was Du mir glaub ich sagen willst, aber wie gesagt scheiterts bei mir an der Umsetzung auf Grund fehlender Kenntnisse - und mit solchen "Lapalien" will ich nicht die Zeit anderer beanspruchen, wo es sicher brennendere Themen gibt ....

                  LG

                  Kommentar


                    #10
                    Poste mal Deine Items und welche 'Pfade im JSON' dazugehören.
                    Also Beispiel:

                    'Body.Data.DAY_ENERGY.Value' --> 'WP.Tageswert.Energie'
                    Zuletzt geändert von bmx; 07.03.2019, 12:31.

                    Kommentar


                      #11
                      Also ich brauch eigentlich im Moment nur folgende:

                      'Body.Data.DAY_ENERGY.Value' ---> 'IoT.FroniusPVTag'

                      'Body.Data.PAC.Value' ---> 'IoT.FroniusPVAktuell'

                      'Body.Data.YEAR_ENERGY.Value' ---> 'IoT.FroniusPVJahr'

                      LG

                      Kommentar


                        #12
                        Wenn ein Json String kommt, könnte man das Ganze sogar ohne Logik lösen. Man braucht ein Item, welches den String empfängt. Das muss vom Typ dict sein. In diesem Item kann man dann per on_update die 3 gewünschten Items setzen. Also etwa so:

                        Code:
                        IoT:
                            kostal:
                                type: dict
                                on_update:
                                  - IoT.FroniusPVTag = sh.IoT.kostal()['Body']['Data']['DAY_ENERGY']['Value']
                                  - IoT.FroniusPVAktuell = sh.IoT.kostal()['Body']['Data']['PAC']['Value']
                                  - IoT.FroniusPVJahr = sh.IoT.kostal()['Body']['Data']['YEAR_ENERGY']['Value']
                        
                            FroniusPVTag:
                                type: num
                        
                            FroniusPVAktuell:
                                type: num
                        
                            FroniusPVJahr:
                                type: num
                        Zuletzt geändert von Msinn; 07.03.2019, 15:52. Grund: Fehlende Klammern und Anführungszeichen ergänzt
                        Viele Grüße
                        Martin

                        Stay away from negative people. They have a problem for every solution.

                        Kommentar


                          #13
                          Das schaut schon mal gut aus :-) Und wo sag ich ihm die URL des Wechselrichters?

                          DANKESCHONMAL!
                          David

                          Kommentar


                            #14
                            Probiere mal folgende Logik aus nachdem Du ``kostal_ip = ``auf den Wert von Deiner WP gesetzt hast:

                            Code:
                            #!/usr/bin/env python3
                            # queryurl.py
                            
                            import requests
                            import json
                            
                            def find(element, json):
                                keys = element.split('.')
                                rv = json
                                for key in keys:
                                    rv = rv[key]
                                return rv
                            
                            kostal_ip = ""
                            kostal_url = "http://"+kostal_ip+"/solar_api/v1/GetMeterRealtimeData.cgi?Scope=Device&DeviceId=1"
                            
                            # Map JSON entries to items:
                            json2items = {
                                'Body.Data.DAY_ENERGY.Value' : 'IoT.FroniusPVTag',
                                'Body.Data.PAC.Value'        : 'IoT.FroniusPVAktuell',
                                'Body.Data.YEAR_ENERGY.Value': 'IoT.FroniusPVJahr'
                                }
                            
                            # ----------------------------------------
                            sample="""{ "Body" : { "Data" : { "DAY_ENERGY" : { "Unit" : "Wh", "Value" : 159.19999999999999 }, "DeviceStatus" : { "ErrorCode" : 0, "LEDColor" : 2, "LEDState" : 0, "MgmtTimerRemainingTime" : -1, "StateToReset" : false, "StatusCode" : 7 }, "FAC" : { "Unit" : "Hz", "Value" : 50 }, "IAC" : { "Unit" : "A", "Value" : 1.2 }, "IDC" : { "Unit" : "A", "Value" : 0.68999999999999995 }, "PAC" : { "Unit" : "W", "Value" : 111 }, "TOTAL_ENERGY" : { "Unit" : "Wh", "Value" : 4552750 }, "UAC" : { "Unit" : "V", "Value" : 237.19999999999999 }, "UDC" : { "Unit" : "V", "Value" : 193.40000000000001 }, "YEAR_ENERGY" : { "Unit" : "Wh", "Value" : 77647.699999999997 } } }, "Head" : { "RequestArguments" : { "DataCollection" : "CommonInverterData", "DeviceClass" : "Inverter", "DeviceId" : "1", "Scope" : "Device" }, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2019-02-07T10:43:11+01:00" } }"""
                            
                            if kostal_ip:
                                logger.debug("Abfragen von {} ".format(kostal_url))
                                r = requests.get(kostal_url)
                                data = r.json()
                            else:
                                logger.debug("Keine IP vorhanden, benutze Musterdaten")
                                data=json.loads(sample)
                            
                            for k in json2items:
                                try:
                                    value = find(k, data)
                                    itempath= json2items[k]
                                    logger.debug("{} mit Wert wird gemappt auf {}".format(k, value, itempath))
                                    item = sh.return_item(itempath)
                                    if item:
                                        item(value)
                                    else:
                                        logger.debug("Item {} existiert nicht".format(itempath))    
                                except KeyError:
                                    logger.debug("{} wurde nicht gefunden".format(k))
                                except NameError:
                                    logger.debug("Item {} konnte nicht zugewiesen werden".format(itempath))

                            Kommentar


                              #15
                              Zitat von ic14m001 Beitrag anzeigen
                              Das schaut schon mal gut aus :-) Und wo sag ich ihm die URL des Wechselrichters?
                              Ich habe in dem so dahingeschriebenen Beispiel noch fehlende Klammern und Anführungszeichen ergänzt.

                              Den Json String kannst Du Dir evtl. mit dem webservices Plugin holen. (Ich habe mit dem Plugin noch nicht gearbeitet)
                              Viele Grüße
                              Martin

                              Stay away from negative people. They have a problem for every solution.

                              Kommentar

                              Lädt...
                              X