Konsolenausgabe filter/formatieren

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
jcw
Beiträge: 99
Registriert: 10.01.2016 17:11:46

Konsolenausgabe filter/formatieren

Beitrag von jcw » 06.08.2023 18:07:55

Guten Abend!

Ich lese in der Konsole über den Befehl

Code: Alles auswählen

curl http://192.168.178.18/api/livedata/status
meine openDTU aus. Die Ausgabe sieht wie folgt aus:

Code: Alles auswählen

{"inverters":[{"serial":"116174407593","name":"jw","data_age":5,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":1500,"0":{"Power":{"v":129.1000061,"u":"W","d":1},"Voltage":{"v":236,"u":"V","d":1},"Current":{"v":0.550000012,"u":"A","d":2},"Power DC":{"v":135.7999878,"u":"W","d":2},"YieldDay":{"v":2138,"u":"Wh","d":2},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2},"Frequency":{"v":50,"u":"Hz","d":2},"Temperature":{"v":25,"u":"°C","d":1},"PowerFactor":{"v":0.986000001,"u":"","d":3},"ReactivePower":{"v":21.70000076,"u":"var","d":1},"Efficiency":{"v":95.06628418,"u":"%","d":2}},"1":{"name":{"u":"1"},"Power":{"v":33.5,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":1},"Current":{"v":1.00999999,"u":"A","d":2},[b]"YieldDay":{"v":529,"u":"Wh","d":0},"YieldTotal":{"v":228.5059967,"u":"kWh","d":3}[/b],"Irradiation":{"v":8.481013298,"u":"%","d":2}},"2":{"name":{"u":"2"},"Power":{"v":34.20000076,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":2},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.4049988,"u":"kWh","d":3},"Irradiation":{"v":8.658227921,"u":"%","d":2}},"3":{"name":{"u":"3"},"Power":{"v":34,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":1},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":535,"u":"Wh","d":0},"YieldTotal":{"v":233.8600006,"u":"kWh","d":3},"Irradiation":{"v":8.60759449,"u":"%","d":2}},"4":{"name":{"u":"4"},"Power":{"v":34.09999847,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":2},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.0330048,"u":"kWh","d":3},"Irradiation":{"v":8.632910728,"u":"%","d":2}},"events":1}],"total":{"Power":{"v":129.1000061,"u":"W","d":1},"YieldDay":{"v":2138,"u":"Wh","d":0},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2}},"hints":{"time_sync":false,"radio_problem":false,"default_password":true}}
Jetzt möchte ich mir die Daten aus "YieldDay":{"v":529,"u":"Wh","d":0},"YieldTotal":{"v":228.5059967,"u":"kWh","d":3} in eine Datei schreiben. In eine Zeile und vorangestellt soll auch noch Zeit und Datum stehen.
Mir fehlt jetzt die richtige Idee: Mit welchem Programm geht das am besten? Mit grep, less, awk? Leider bin ich bei diesen Themen blank. Kann mir jemand einen Tipp geben und vielleicht einen Link mit einer guten Beschreibung zur Anwendung des Befehls? Und wie schreibe ich das Datum vornedran? Letzendlich möcht eine Datei haben, die in jeder Zeile Datum, Uhrzeit, YieldDay und YieldTotal in Watt ausgibt, sodass ich diese dann in LibreOffice einlesen kann.

Danke und Gruß.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Konsolenausgabe filter/formatieren

Beitrag von JTH » 06.08.2023 18:21:13

Das sieht nach einem gültigen JSON-String aus. Dann kann dir Debianjq weiterhelfen:

Code: Alles auswählen

#!/bin/sh

json='{"inverters":[{"serial":"116174407593","name":"jw","data_age":5,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":1500,"0":{"Power":{"v":129.1000061,"u":"W","d":1},"Voltage":{"v":236,"u":"V","d":1},"Current":{"v":0.550000012,"u":"A","d":2},"Power DC":{"v":135.7999878,"u":"W","d":2},"YieldDay":{"v":2138,"u":"Wh","d":2},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2},"Frequency":{"v":50,"u":"Hz","d":2},"Temperature":{"v":25,"u":"°C","d":1},"PowerFactor":{"v":0.986000001,"u":"","d":3},"ReactivePower":{"v":21.70000076,"u":"var","d":1},"Efficiency":{"v":95.06628418,"u":"%","d":2}},"1":{"name":{"u":"1"},"Power":{"v":33.5,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":1},"Current":{"v":1.00999999,"u":"A","d":2},"YieldDay":{"v":529,"u":"Wh","d":0},"YieldTotal":{"v":228.5059967,"u":"kWh","d":3},"Irradiation":{"v":8.481013298,"u":"%","d":2}},"2":{"name":{"u":"2"},"Power":{"v":34.20000076,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":2},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.4049988,"u":"kWh","d":3},"Irradiation":{"v":8.658227921,"u":"%","d":2}},"3":{"name":{"u":"3"},"Power":{"v":34,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":1},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":535,"u":"Wh","d":0},"YieldTotal":{"v":233.8600006,"u":"kWh","d":3},"Irradiation":{"v":8.60759449,"u":"%","d":2}},"4":{"name":{"u":"4"},"Power":{"v":34.09999847,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":2},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.0330048,"u":"kWh","d":3},"Irradiation":{"v":8.632910728,"u":"%","d":2}},"events":1}],"total":{"Power":{"v":129.1000061,"u":"W","d":1},"YieldDay":{"v":2138,"u":"Wh","d":0},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2}},"hints":{"time_sync":false,"radio_problem":false,"default_password":true}}'

echo "$json" | jq .total.YieldDay
echo "$json" | jq .total.YieldTotal
Mit jq kannst du dir die ausgegeben Daten noch beliebig weiter auseinandernehmen oder aufbereiten. Ein Blick in jqs Manpage verrät dir mehr (für mehr als solche simplen Zugriffe hab ichs selbst noch nicht benutzt).
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Konsolenausgabe filter/formatieren

Beitrag von Meillo » 06.08.2023 18:27:28

Aufbauend auf JTHs Ansatz: Zuerst den Json-String abholen und dann daraus mit einem Json-Tool (jq) alle gewuenchten Werte in Shellvariablen extrahieren. Anschliessend diese dann so etwa in die Datei schreiben:

Code: Alles auswählen

printf "%s\t%s\t%s...\n" "`date +%F_%H:%M:%S`" "$wert1" "$wert2" ... >>DATEINAME
Mit awk o.ae. auf dem Json-String zu arbeiten waere nur eine Notloesung, besser man verwendet die passenden Json-Werkzeuge.
Use ed once in a while!

jcw
Beiträge: 99
Registriert: 10.01.2016 17:11:46

Re: Konsolenausgabe filter/formatieren

Beitrag von jcw » 12.08.2023 19:54:00

Vielen Dank für die Hinweise!

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: Konsolenausgabe filter/formatieren

Beitrag von tobo » 12.08.2023 21:47:06

Was besser ist, muss nicht zwingend einfacher sein. Sofern das Format konstant eintrifft, kannst du dir die Treffer auch mit z.B. grep fehlerfrei einholen. Das Spielchen ist gleich zum Parsen von html, xml, etc.:

Code: Alles auswählen

$ echo '{"inverters":[{"serial":"116174407593","name":"jw","data_age":5,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":1500,"0":{"Power":{"v":129.1000061,"u":"W","d":1},"Voltage":{"v":236,"u":"V","d":1},"Current":{"v":0.550000012,"u":"A","d":2},"Power DC":{"v":135.7999878,"u":"W","d":2},"YieldDay":{"v":2138,"u":"Wh","d":2},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2},"Frequency":{"v":50,"u":"Hz","d":2},"Temperature":{"v":25,"u":"°C","d":1},"PowerFactor":{"v":0.986000001,"u":"","d":3},"ReactivePower":{"v":21.70000076,"u":"var","d":1},"Efficiency":{"v":95.06628418,"u":"%","d":2}},"1":{"name":{"u":"1"},"Power":{"v":33.5,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":1},"Current":{"v":1.00999999,"u":"A","d":2},"YieldDay":{"v":529,"u":"Wh","d":0},"YieldTotal":{"v":228.5059967,"u":"kWh","d":3},"Irradiation":{"v":8.481013298,"u":"%","d":2}},"2":{"name":{"u":"2"},"Power":{"v":34.20000076,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":2},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.4049988,"u":"kWh","d":3},"Irradiation":{"v":8.658227921,"u":"%","d":2}},"3":{"name":{"u":"3"},"Power":{"v":34,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":1},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":535,"u":"Wh","d":0},"YieldTotal":{"v":233.8600006,"u":"kWh","d":3},"Irradiation":{"v":8.60759449,"u":"%","d":2}},"4":{"name":{"u":"4"},"Power":{"v":34.09999847,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":2},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.0330048,"u":"kWh","d":3},"Irradiation":{"v":8.632910728,"u":"%","d":2}},"events":1}],"total":{"Power":{"v":129.1000061,"u":"W","d":1},"YieldDay":{"v":2138,"u":"Wh","d":0},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2}},"hints":{"time_sync":false,"radio_problem":false,"default_password":true}}' \
> | grep -Eo '"YieldDay":\{[^}]*},"YieldTotal":\{[^}]*}'
"YieldDay":{"v":2138,"u":"Wh","d":2},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2}
"YieldDay":{"v":529,"u":"Wh","d":0},"YieldTotal":{"v":228.5059967,"u":"kWh","d":3}
"YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.4049988,"u":"kWh","d":3}
"YieldDay":{"v":535,"u":"Wh","d":0},"YieldTotal":{"v":233.8600006,"u":"kWh","d":3}
"YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.0330048,"u":"kWh","d":3}
"YieldDay":{"v":2138,"u":"Wh","d":0},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2}
$
Edit:
Mit Timestamp davor (ts aus dem Paket moreutils):

Code: Alles auswählen

$ echo '{"inverters":[{"serial":"116174407593","name":"jw","data_age":5,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":1500,"0":{"Power":{"v":129.1000061,"u":"W","d":1},"Voltage":{"v":236,"u":"V","d":1},"Current":{"v":0.550000012,"u":"A","d":2},"Power DC":{"v":135.7999878,"u":"W","d":2},"YieldDay":{"v":2138,"u":"Wh","d":2},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2},"Frequency":{"v":50,"u":"Hz","d":2},"Temperature":{"v":25,"u":"°C","d":1},"PowerFactor":{"v":0.986000001,"u":"","d":3},"ReactivePower":{"v":21.70000076,"u":"var","d":1},"Efficiency":{"v":95.06628418,"u":"%","d":2}},"1":{"name":{"u":"1"},"Power":{"v":33.5,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":1},"Current":{"v":1.00999999,"u":"A","d":2},"YieldDay":{"v":529,"u":"Wh","d":0},"YieldTotal":{"v":228.5059967,"u":"kWh","d":3},"Irradiation":{"v":8.481013298,"u":"%","d":2}},"2":{"name":{"u":"2"},"Power":{"v":34.20000076,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":2},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.4049988,"u":"kWh","d":3},"Irradiation":{"v":8.658227921,"u":"%","d":2}},"3":{"name":{"u":"3"},"Power":{"v":34,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":1},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":535,"u":"Wh","d":0},"YieldTotal":{"v":233.8600006,"u":"kWh","d":3},"Irradiation":{"v":8.60759449,"u":"%","d":2}},"4":{"name":{"u":"4"},"Power":{"v":34.09999847,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":2},"Current":{"v":1.029999971,"u":"A","d":2},"YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.0330048,"u":"kWh","d":3},"Irradiation":{"v":8.632910728,"u":"%","d":2}},"events":1}],"total":{"Power":{"v":129.1000061,"u":"W","d":1},"YieldDay":{"v":2138,"u":"Wh","d":0},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2}},"hints":{"time_sync":false,"radio_problem":false,"default_password":true}}' \
> | grep -Eo '"YieldDay":\{[^}]*},"YieldTotal":\{[^}]*}' | ts
Aug 12 22:04:52 "YieldDay":{"v":2138,"u":"Wh","d":2},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2}
Aug 12 22:04:52 "YieldDay":{"v":529,"u":"Wh","d":0},"YieldTotal":{"v":228.5059967,"u":"kWh","d":3}
Aug 12 22:04:52 "YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.4049988,"u":"kWh","d":3}
Aug 12 22:04:52 "YieldDay":{"v":535,"u":"Wh","d":0},"YieldTotal":{"v":233.8600006,"u":"kWh","d":3}
Aug 12 22:04:52 "YieldDay":{"v":537,"u":"Wh","d":0},"YieldTotal":{"v":237.0330048,"u":"kWh","d":3}
Aug 12 22:04:52 "YieldDay":{"v":2138,"u":"Wh","d":0},"YieldTotal":{"v":936.8040161,"u":"kWh","d":2}
$

jcw
Beiträge: 99
Registriert: 10.01.2016 17:11:46

Re: Konsolenausgabe filter/formatieren

Beitrag von jcw » 13.08.2023 10:38:46

Teste gerade diese Idee:

Code: Alles auswählen

#!/bin/bash

# Function to check if the ABORT file exists
    check_abort() {
        if [ -e "ABORT" ]; then
            echo "ABORT file found. Exiting."
            exit 0
        fi
                    }
                    
# Check if a sleep duration parameter is provided
if [ -z "$1" ]; then
    echo "Usage: $0 <curl_url> <sleep_duration>"
    exit 1
fi

while true; do check_abort

    
    format=$(curl -s http://192.168.178.18/api/livedata/status)
    

    if [ -z "$format" ]; then
        dt=$2

    else
        # Use grep to extract the YieldTotal value
        yield_total=$(echo "$format" | grep -oP '"YieldTotal":{"v":\K[^,]+' | grep -oE '[0-9.]+' | tail -n 1)
        yield_day=$(echo "$format" | grep -oP '"YieldDay":{"v":\K[^,]+' | grep -oE '[0-9.]+' | tail -n 1)
        power_value=$(echo "$format" | grep -oP '"Power":{"v":\K[^,]+' | grep -oE '[0-9.]+' | tail -n 1)
        dt=$1
                  if [[ "$format" =~ '"reachable":true' ]]; then
                  echo -e "$(date +%s)\t$(date +"%d.%m.%Y\t%H:%M:%S")\tYieldDay:\t$yield_day\tYieldTotal:\t$yield_total\tPower:\t$power_value\tInterval:\t$1"
                  fi
    fi

    
sleep "$dt"
done

Antworten