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

  • ic14m001
    antwortet
    Erledigt .....

    Code:
    2019-03-11  13:30:38 WARNING  logics.Fronius    Body.Data.DAY_ENERGY.Value mit Wert 3249.7 wird gemappt auf IoT.FroniusPVTag
    2019-03-11  13:30:38 WARNING  logics.Fronius    Item IoT.FroniusPVTag existiert nicht
    2019-03-11  13:30:38 WARNING  logics.Fronius    Body.Data.YEAR_ENERGY.Value mit Wert 240935.11 wird gemappt auf IoT.FroniusPVJahr
    2019-03-11  13:30:38 WARNING  logics.Fronius    Item IoT.FroniusPVJahr existiert nicht
    2019-03-11  13:30:38 WARNING  logics.Fronius    Body.Data.PAC.Value mit Wert 869 wird gemappt auf IoT.FroniusPVAktuell
    2019-03-11  13:30:38 WARNING  logics.Fronius    Item IoT.FroniusPVAktuell existiert nicht

    Einen Kommentar schreiben:


  • bmx
    antwortet
    Hm. Tausche mal die Zeile

    Code:
     
     logger.debug("{} mit Wert wird gemappt auf {}".format(k, value, itempath))
    gegen

    Code:
     
     logger.debug("{} mit Wert {} wird gemappt auf {}".format(k, value, itempath))
    und poste mal die Ausgabe davon.

    Eigentlich sollte ``item = sh.return_item(itempath)`` auch ein gültiges Item zurückliefern und nicht None was zur Debugausgabe führt ...

    Einen Kommentar schreiben:


  • ic14m001
    antwortet
    Schönen guten Morgen!

    Also nachdem ich das Logging in der Logik geändert habe bekomme ich jetzt folgende Infos geloggt:

    Code:
    2019-03-11  07:20:08 WARNING  logics.Fronius    Body.Data.DAY_ENERGY.Value mit Wert wird gemappt auf 45.4
    2019-03-11  07:20:08 WARNING  logics.Fronius    Item IoT.FroniusPVTag existiert nicht
    2019-03-11  07:20:08 WARNING  logics.Fronius    Body.Data.YEAR_ENERGY.Value mit Wert wird gemappt auf 237730.8
    2019-03-11  07:20:08 WARNING  logics.Fronius    Item IoT.FroniusPVJahr existiert nicht
    2019-03-11  07:20:08 WARNING  logics.Fronius    Body.Data.PAC.Value mit Wert wird gemappt auf 170
    2019-03-11  07:20:08 WARNING  logics.Fronius    Item IoT.FroniusPVAktuell existiert nicht
    Das gute dran ist, dass die Logik korrekt die Werte mittels des Scripts auslesen kann

    Nur happerts anscheinend daran, dass die Items anscheinend nicht korrekt definiert sind - so sieht das im Moment aus (schaut für mich korrekt aus):

    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
    Im Backend werden die Items auch korrekt angezeigt .....

    BG
    David

    Einen Kommentar schreiben:


  • bmx
    antwortet
    Hast Du Dein Logging so konfiguriert, das alles aus Logics auch geloggt wird?

    Alternativ kannst Du auch alle "logger.debug" in der Logik ändern in "logger.warning", dann sollten die Meldung in smarthome-warning.log auftauchen.

    Einen Kommentar schreiben:


  • ic14m001
    antwortet
    So, hab jetzt mal die Items und die Logik angelegt und ausgeführt, nur passiert nicht wirklich was. Weder Einträge im smarthome-warning bzw. smarthome-details.log als auch bei den Items ändert sich was ...

    Hab jetzt mal so die IP eingetragen - evtl. hab ich einen Fehler mit den Anführungszeichen?

    1.jpg

    LG

    Einen Kommentar schreiben:


  • ic14m001
    antwortet
    Herzlichen Dank Msinn und bmx für eure Bemühungen - ich werds sobald ich Zeit habe gleich mal testen!

    LG

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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)

    Einen Kommentar schreiben:


  • bmx
    antwortet
    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))

    Einen Kommentar schreiben:


  • ic14m001
    antwortet
    Das schaut schon mal gut aus :-) Und wo sag ich ihm die URL des Wechselrichters?

    DANKESCHONMAL!
    David

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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

    Einen Kommentar schreiben:


  • ic14m001
    antwortet
    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

    Einen Kommentar schreiben:


  • bmx
    antwortet
    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.

    Einen Kommentar schreiben:


  • ic14m001
    antwortet
    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

    Einen Kommentar schreiben:


  • bmx
    antwortet
    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

    Einen Kommentar schreiben:


  • ic14m001
    antwortet
    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

    Einen Kommentar schreiben:

Lädt...
X