Erbsenzählen mit JsonMod

Begonnen von juidui, 27 September 2024, 13:41:24

Vorheriges Thema - Nächstes Thema

juidui

Hallo,

ich möchte ein JSON Output mit JsonMod untersuchen und dabei die Erbsen zählen.
Ich könnte mit Multi() für jede Erbse ein Reading anlegen lassen. Das möchte ich aber nicht, sondern ich brauche lediglich die Anzahl der Erbsen in einem Reading. Die Verwendung von count() bringt mich da nicht weiter, oder ich weiß nicht wie.

{
    "erbsen": [
        {
            "id": "6076328"
        },
        {
            "id": "607633e"
        },
        {
            "id": "607634f"
        },
        {
            "id": "607642a"
        },
        {
            "id": "6076434"
        },
        {
            "id": "6076477"
        },
        {
            "id": "607648c"
        }
    ],
    "kartoffeln": []
}

Hat jemand eine Idee?
Viele Grüße
Uwe

TomLee

#1
Hallo,

mit JsonMod hab ich mich bisher zu wenig mit beschäftigt, um sagen zu können wie und ob es damit geht.
Zwei Wege/Möglichkeiten kann ich aufzeigen wie man es in Perl angehen kann:

sub anzahlarray {
my $data = decode_json(qq({"erbsen": [
        {
            "id": "6076328"
        },
        {
            "id": "607633e"
        },
        {
            "id": "607634f"
        },
        {
            "id": "607642a"
        },
        {
            "id": "6076434"
        },
        {
            "id": "6076477"
        },
        {
            "id": "607648c"
        }
    ],
    "kartoffeln": []
}));

#my $number = scalar @{$data->{erbsen}};
#print "Anzahl der Erbsen: $number\n";
my $erbsen = $data->{erbsen};
my $number = scalar @$erbsen;
print "Anzahl der Erbsen: $number\n";
}

Wie kommst Du denn an den Json ?

Aber ne Anfängerfrage ist das nicht! Für Perl-Anfängerfragen hat man mal diesen Forenbereich ins Leben gerufen, den Beitrag würd ich dahin verschieben (unten links)

Gruß Thomas

juidui

Hi,

danke für den Tipp mit Perl. Weiß aber nicht, ob ich das so integrieren kann, mal probieren.
Das JSON ist von einer Warenwirtschaft, geht natürlich nicht um Erbsen, aber ist ja egal.
Vielleicht kann ich dort etwas veranlassen, dass die die Summe einfach im Objekt oben drüber als Parameter angeben, wie das ja meistens gemacht wird.

Wenn noch jemand ne Idee hat, gerne.

Danke und schönes WE
Uwe

juidui

Ich nochmal,
probiere es mit
single(jsonPath('$.Erbsen.length'),'Anzahl','0')
ich bekomme aber nur einen Fehler im Log, dass was mit der property length nicht stimmt:
error: JsonPath filter property length failure  (#1368) in single(jsonPath('$.Erbsen.length'),'Anzahl','0')

TomLee

ZitatDas JSON ist von einer Warenwirtschaft, ...

Also hast ne Datei ?

Mit json2reading und über ein userReadings ginge es (umständlich):
defmod at_number at +*00:00:30 {json2reading($defs{$SELF},`cat /opt/fhem/irgendwas.txt`,undef,undef,undef,"^erbsen.*\$");;}
attr at_number room Test_json2reading
attr at_number userReadings peas:erbsen_1_id.* { my $number = 0;;\
for my $a ( keys %{$defs{$name}->{READINGS}} ) {\
$number++ if ($a =~ 'erbsen_');;\
} return $number;;}

setstate at_number Next: 17:48:46
setstate at_number 2024-09-27 17:48:16 erbsen_1_id 6076328
setstate at_number 2024-09-27 17:48:16 erbsen_2_id 607633e
setstate at_number 2024-09-27 17:48:16 erbsen_3_id 607634f
setstate at_number 2024-09-27 17:48:16 erbsen_4_id 607642a
setstate at_number 2024-09-27 17:48:16 erbsen_5_id 6076434
setstate at_number 2024-09-27 17:48:16 erbsen_6_id 6076477
setstate at_number 2024-09-27 17:48:16 erbsen_7_id 607648c
setstate at_number 2024-09-27 17:48:16 peas 7
setstate at_number 2024-09-27 17:48:16 state Next: 17:48:46

Geht bestimmt mit JsonMod mit nur dem Anzahl-Reading, muss ich mich mal mit beschäftigen ...

juidui

Ich kann das über ne API abrufen und dann mit JsonMod nutzen. Ich hatte es so verstanden, das JSONPATH Syntax dort unterstützt ist. Aber die Eigenschaft length kennt es (noch) nicht.
Ich nehme an, dass das nicht implementiert ist, weil häufig eben die Anzahl der Elemente im Objekt angegeben wird.
Dennoch, die Eigenschaft .length funktioniert mit JSONPATH Generatoren einwandfrei.

Danke für die Ideen. Muss mich da am Sonntag noch mehr mit beschäftigen. 

rudolfkoenig

Ich habe auch eine Variante ohne JsonMod :)
defmod myAt at +*30:00 {\
  my $h = json2nameValue(GetFileFromURL("http://...:8083/fhem/test/erbsen.json"),undef,undef,"^erbsen_.*_id\$");;\
  readingsSingleUpdate($defs{myAt}, "erbsenZahl", keys(%{$h}), 1);;\
  undef\
}

juidui

perl ist so krass, was da alles mit Syntax geht  ;D

Vielen Dank für den Input.

TomLee

#8
So wie Rudolf das vorschlägt, war mein eigentlicher Gedanke, hatte es aber erstmal nicht hinbekommen.

Heute, nach einmal drüber schlafen, frage ich mich, wozu eine FHEM-Funktion (edit: die man gänzlich mit all ihren Parametern erst mal verstanden haben muss) verwenden, wenn man es doch einfach mit decode_json (also einer Funktion die Perl bereits mitbringt) angehen kann ? So wie zuerst halt von mir vorgeschlagen.

Und kürzer wäre es auch:
defmod at_number at +*00:00:30 {\
my $json = decode_json(GetFileFromURL("http://...:8083/fhem/test/erbsen.json"));;\
readingsSingleUpdate($defs{$SELF}, "peas", @{$json->{erbsen}}, 1);;\
undef;;}


edit nochmal:
ja, GetFileFromURL und  readingsSingleUpdate sind auch FHEM-Funktion, aber nicht so "komplex" wie json2namevalue