Bash Curl Abfrage in JSON - benötige hier euren Input

  • Moin
    ich habe woanders ein Bash Script gefunden welches von einem Deye Wechselrichter die Leistung ausliest (Status.html). Funktioniert auch. Aber ich würde das gerne in eine JSON parsen damit ich das in OH einlesen kann
    Ich habe versucht, die " in den Echo Befehl mit reinzupacken aber die landen nicht im JSON File
    So sollte das JSON aussehen
    { "wechselrichter": [ { "name": "torum", "ablese": "08.02.2023 11:21", "value": 158 } ]}

    und so kommt es immer raus
    { wechselrichter: [ { name: torum, ablese: 08.02.2023 11:55, value: 183 } ]}


    Hier die BASH Datei
    Wie muss ich die " maskieren damit ich die auch in die Datei schreibe?

    Display Spoiler


    #!/bin/bash
    #
    # Einfaches script um die aktuelle Stromproduktion des Deye Wechselrichters über den internen Webserver auszulesen
    # Der Wert findet sich in der Webseite <deye_ip>/status.html und die Variable ist webdata_now_p
    # In der Webseite sind auch weitere Variablen, siehe Browser -> Seitenquelltext anzeigen
    # Das script nutzt curl, es ginge aber auch mit wget
    # IP Adresse und Zugangsdaten sind als Demo, bei Bedarf entsprechend ändern...


    host="192.168.1.45"
    user="USER"
    password="PWD"
    [definition='1','0']log[/definition]="/homes/deye/deye3.json"


    ping -c3 "$host" > /dev/null 2>&1
    if [ $? != 0 ]
    then
    echo "$host not available"
    exit 1
    fi


    # 3 Versuche Datenabfrage
    for i in 1 2 3
    do
    cp=$(curl -s -u "$user:$password" "$host"/status.html | grep "webdata_now_p = " | awk -F '"' '{print $2}')
    if [ "$cp" != "" ]
    then
    DATETIME=`date "+%d.%m.%Y %H:%M"`
    JSONInhalt="{ wechselrichter: [ { name: torum, ablese: "$DATETIME", value: "$cp" } ]}"
    echo "$JSONInhalt" >"$[definition='1','0']log[/definition]"
    exit 0
    fi
    sleep 3
    done


    # Wenn Abfrage nicht erfolgreich war
    echo Datenabfrage nicht erfolgreich

    BTW: Die beiden OpenDTU Platinen benötige ich nicht mehr
    Wären verfügbar

  • Habe es selbst gefunden, wenn man auf den richtigen Begriff gekommen ist dann findet man es auch

    So ist es richtig

    Display Spoiler

    #!/bin/bash
    #
    # Einfaches script um die aktuelle Stromproduktion des Deye Wechselrichters über den internen Webserver auszulesen
    # Der Wert findet sich in der Webseite <deye_ip>/status.html und die Variable ist webdata_now_p
    # In der Webseite sind auch weitere Variablen, siehe Browser -> Seitenquelltext anzeigen
    # Das script nutzt curl, es ginge aber auch mit wget
    # IP Adresse und Zugangsdaten sind als Demo, bei Bedarf entsprechend ändern...


    host="192.168.1.45"
    user="user"
    password="PWD"
    [definition='1','0']log[/definition]="/homes/uwe/deye3.json"


    ping -c3 "$host" > /dev/null 2>&1
    if [ $? != 0 ]
    then
    echo "$host not available"
    exit 1
    fi


    # 3 Versuche Datenabfrage
    for i in 1 2 3
    do
    cp=$(curl -s -u "$user:$password" "$host"/status.html | grep "webdata_now_p = " | awk -F '"' '{print $2}')
    if [ "$cp" != "" ]
    then
    DATETIME=`date "+%d.%m.%Y %H:%M"`
    JSONInhalt="{ \"wechselrichter\": [ { \"name\": \"torum\", \"ablese\": \""$DATETIME"\", \"value\": "$cp" } ]}"
    echo "$JSONInhalt" >"$[definition='1','0']log[/definition]"
    exit 0
    fi
    sleep 3
    done


    # Wenn Abfrage nicht erfolgreich war
    echo Datenabfrage nicht erfolgreich


  • Und die nächste Version
    Man kann ja auch den kumulierten Tages- und Gesamtertrag abgreifen

    Display Spoiler

    #!/bin/bash
    #
    # Einfaches script um die aktuelle Stromproduktion des Deye Wechselrichters über den internen Webserver auszulesen
    # Der Wert findet sich in der Webseite <deye_ip>/status.html und die Variable ist webdata_now_p
    # In der Webseite sind auch weitere Variablen, siehe Browser -> Seitenquelltext anzeigen
    # Das script nutzt curl, es ginge aber auch mit wget
    # IP Adresse und Zugangsdaten sind als Demo, bei Bedarf entsprechend ändern...


    host="192.168.68.31"
    user="USER"
    password="PWD"
    [definition='1','0']log[/definition]="/volume1/web/spike/deye2.json"


    ping -c3 "$host" > /dev/null 2>&1
    if [ $? != 0 ]
    then
    echo "$host not available"
    exit 1
    fi


    # 3 Versuche Datenabfrage
    for i in 1 2 3
    do
    cp=$(curl -s -u "$user:$password" "$host"/status.html | grep "webdata_now_p = " | awk -F '"' '{print $2}')
    cpe=$(curl -s -u "$user:$password" "$host"/status.html | grep "webdata_today_e = " | awk -F '"' '{print $2}')
    cpt=$(curl -s -u "$user:$password" "$host"/status.html | grep "webdata_total_e = " | awk -F '"' '{print $2}')
    if [ "$cp" != "" ]
    then
    DATETIME=`date "+%d.%m.%Y %H:%M"`
    JSONInhalt="{\"name\": \"torum\",\"ablese\": \""$DATETIME"\",\"value\": "$cp",\"today\": "$cpe",\"total\": "$cpt"}"
    echo "$JSONInhalt" >"$[definition='1','0']log[/definition]"
    exit 0
    fi
    sleep 3
    done


    # Wenn Abfrage nicht erfolgreich war
    echo Datenabfrage nicht erfolgreich


Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!