JSonMod versteht mein JSON nicht

Begonnen von wowogiengen, 10 November 2024, 13:44:27

Vorheriges Thema - Nächstes Thema

wowogiengen

Hallo,
wie in diesem Thread Dummy, notify, button, trigger, und was weiß ich alles... geschrieben, habe ich Probleme,
meine JSON-Datei einzulesen.

Ich schreibe in python mein Objekt so raus:

# Open the file in write mode
with open(filename, 'w') as file:
    # Use json.dump to write the data to the file
    json.dump(data, file, indent=2)  # indent=4 for pretty printing
und dann kommt dort eben das hier raus :


{
  "info": {
    "powerstation_id": "af612bf1-559d-4464-9005-df854f2df1ad",
    "time": "11/06/2024 04:45:59",
    "date_format": "dd.MM.yyyy",
    "date_format_ym": "MM.yyyy",
    "stationname": "Roth Wolfgang",
    "address": "Eisenacher Weg 2, 89537 Giengen an der Brenz, Germany",
    "owner_name": null,
    "owner_phone": null,
    "owner_email": null,
    "battery_capacity": 10.6,
    "turnon_time": "10/31/2024 16:06:42",
    "create_time": "10/31/2024 16:04:56",
    "capacity": 15.84,
    "longitude": 10.2638487,
    "latitude": 48.6276321,
    "powerstation_type": "Battery Storage",
    "status": 0,
    "is_stored": true,
    "is_powerflow": true,
    "charts_type": 1,
    "has_pv": true,
    "has_statistics_charts": true,
    "only_bps": false,
    "only_bpu": false,
    "time_span": -1.0,
    "pr_value": "",
    "org_code": "GW000000",
    "org_name": "Goodwe"
  },

(da kommt noch weiteres, aber mit den null, true und false Werten kann JSONMOD offensichtlich nix anfangen... Was kann ich da tun? Die Bibliothek, welche die Daten einliest, kann ich nicht ändern (pygoodwe)...


TomLee

Wegen dem true/false kann man was machen -> Im Global-Device das Attribut encoding auf bytestream setzen.
(merkwürdig ist, dass das gesetzte Attribut nicht in der Geräteübersicht zu sehen ist !)

Das null nix ergibt, versteh ich so, dass das so gewollt ist.

(siehe Zeile 1120 im Modulcode: return undef if m/\Gnull/gc;  ## no critic (return))


wowogiengen

Hallo TomLee,
bei mir steht, dass bytestream bereits voreingestellt ist...
Aber was das attribut überhaupt bringen soll erschliesst sich mir nicht...
in der Datei steht ja explizit drin (beispielhaft):

"Wahrwert": true,
"keinWert": null,

Im Code des Moduls scheint es ja auch richtig konvertiert zu werden, oder?

TomLee

#3
Ich war zu unachtsam, dachte das Attribut wäre dafür verantwortlich das true/false zu 1/0 wird.

Was ist denn dein Problem mit false/true überhaupt?

wowogiengen

#4
Zitat von: TomLee am 10 November 2024, 20:47:27Ich war zu unachtsam, dachte das Attribut wäre dafür verantwortlich das false/true zu 1/0 wird.

Was ist denn dein Problem mit false/true überhaupt?

Ich kann meine Datei nicht einlesen, wenn in ihr null, true und false enthalten sind (genau in der Schreibweise, ohne " oder').

Ersetze ich null z.B. durch "" und true durch 1 und false durch 0, wird der ganze Datensatz eingelesen und alles ist gut...

Dann funktioniert auch das mit dem Attribut zum Ermitteln einzelner Readings, was vorher überhaupt nicht ging....
Also irgendwas ist da mit den 3 Werten nicht in Ordnung?


Als Beispiel:

{
  "info":
  {
    "time" : true
  }
}
und das Device:

defmod PVJSON JsonMod file:/opt/fhem/python/neu 1.json
attr PVJSON readingList single(jsonPath('$.info.time'), 'zeit', 'default value');;
attr PVJSON room test
attr PVJSON verbose 5

setstate PVJSON 2024-11-10 21:25:11 .computedReadings zeit
setstate PVJSON 2024-11-10 21:25:11 zeit default value

geht nicht...

TomLee

Liegt es an Deiner gezeigten JsonMod-Definition evtl. nicht einfach daran das sich da ein Leerzeichen zw. neu und 1 in dem Textdateinamen eingeschlichen hat, welches da nicht hingehört, und darum der Ersatzwert von single "greift" ?

betateilchen

#6
Bei mir funktioniert Dein json-Input aus dem ersten Beitrag hier im Thread grundsätzlich fehlerfrei und erzeugt jede Menge readings, sowohl mit complete() als auch mit single()

defmod jt JsonMod file:///tmp/test.json
attr jt readingList complete()\
single(jsonPath('$.info.stationname'), 'myStationName', '?')

setstate jt 2024-11-12 10:07:13 info.address Eisenacher Weg 2, 89537 Giengen an der Brenz, Germany
setstate jt 2024-11-12 10:07:13 info.battery_capacity 10.6
setstate jt 2024-11-12 10:07:13 info.capacity 15.84
setstate jt 2024-11-12 10:07:13 info.charts_type 1
setstate jt 2024-11-12 10:07:13 info.create_time 10/31/2024 16:04:56
setstate jt 2024-11-12 10:07:13 info.date_format dd.MM.yyyy
setstate jt 2024-11-12 10:07:13 info.date_format_ym MM.yyyy
setstate jt 2024-11-12 10:07:13 info.has_pv 1
setstate jt 2024-11-12 10:07:13 info.has_statistics_charts 1
setstate jt 2024-11-12 10:07:13 info.is_powerflow 1
setstate jt 2024-11-12 10:07:13 info.is_stored 1
setstate jt 2024-11-12 10:07:13 info.latitude 48.6276321
setstate jt 2024-11-12 10:07:13 info.longitude 10.2638487
setstate jt 2024-11-12 10:07:13 info.only_bps 0
setstate jt 2024-11-12 10:07:13 info.only_bpu 0
setstate jt 2024-11-12 10:07:13 info.org_code GW000000
setstate jt 2024-11-12 10:07:13 info.org_name Goodwe
setstate jt 2024-11-12 10:07:13 info.owner_email
setstate jt 2024-11-12 10:07:13 info.owner_name
setstate jt 2024-11-12 10:07:13 info.owner_phone
setstate jt 2024-11-12 10:07:13 info.powerstation_id af612bf1-559d-4464-9005-df854f2df1ad
setstate jt 2024-11-12 10:07:13 info.powerstation_type Battery Storage
setstate jt 2024-11-12 10:07:13 info.pr_value
setstate jt 2024-11-12 10:07:13 info.stationname Roth Wolfgang
setstate jt 2024-11-12 10:07:13 info.status 0
setstate jt 2024-11-12 10:07:13 info.time 11/06/2024 04:45:59
setstate jt 2024-11-12 10:07:13 info.time_span -1
setstate jt 2024-11-12 10:07:13 info.turnon_time 10/31/2024 16:06:42

setstate jt 2024-11-12 10:07:13 myStationName Roth Wolfgang

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#7
Zitat von: TomLee am 10 November 2024, 22:17:09Liegt es an Deiner gezeigten JsonMod-Definition evtl. nicht einfach daran das sich da ein Leerzeichen zw. neu und 1 in dem Textdateinamen eingeschlichen hat

Leerzeichen in Dateinamen sind zwar immer doof, aber nicht per se falsch.
Aber ich tippe eher darauf, dass bei file:/ einfach zu wenige slashes stehen:

defmod PVJSON JsonMod file:/opt/fhem/python/neu 1.json
Laut commandref sollten da mindestens 2 slashes stehen, wenn man einen absoluten Pfad angibt, bedarf es derer sogar drei:

defmod PVJSON JsonMod file:///opt/fhem/python/neu 1.json
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

wowogiengen

Hallo,
nochmal für alle zum mitschreiben...
die Datei  hat diesen Inhalt:
{
  "info":
  {
    "time" : true
  }
}

sie liegt unter

/opt/fhem/python/neu 1.json(ja genau so, mit Leerzeichen

Ich habe das define vorhin angepasst, mit 3 * / am Anfang, im Ergebnis ist es aber das Selbe.


defmod PVJSON JsonMod file:///opt/fhem/python/neu 1.json
attr PVJSON readingList single(jsonPath('$.info.time'), 'zeit', 'default value');;
attr PVJSON room test
attr PVJSON verbose 1

Das Reading "zeit" ist immer noch "default value". Und das ist hier das kleinste reproduzierbare Beispiel, was ich habe.

Auch wenn ich eine Datei ohne Leerzeichen lese, geht es nicht.

hier nochmal das komplette Listing des Devices:

Internals:
   API_LAST_MSG 404
   API_LAST_RES 1731433911.34025
   DEF        file:///opt/fhem/python/neu.json
   FUUID      67309b2d-f33f-a625-301d-a6751c6ebcf6ab2c
   NAME       PVJSON
   NEXT       2024-11-12 19:00:00
   NR         227
   SOURCE     /opt/fhem/python/neu.json
   STATE      ???
   SVN        28481 2024-02-05 22:14:33 UTC
   TYPE       JsonMod
   eventCount 1698
   CONFIG:
     IN_REQUEST 0
     SOURCE     file:///opt/fhem/python/neu.json
     SECRET:
   OLDREADINGS:
   READINGS:
     2024-11-12 18:49:11   zeit            default value
Attributes:
   readingList single(jsonPath('$.info.time'), 'zeit', 'default value');
   room       test
   verbose    1


Prof. Dr. Peter Henning

Nun, dann würde es doch sinnvoll sein, einen der anderen einfachen Wege zu beschreiten, die wir vorgeschlagen haben. Gerade jemand, der sich selbst als Anfänger bezeichnet und keinen Überblick über die vorhandenen Module hat, sollte eine einfache Lösung suchen. Und nicht mit Python, JSON und Perl gleichzeitig jonglieren.

pah

passibe

Also bei mir funktioniert das:
defmod PVJSON JsonMod file:///opt/fhem/test 1.json
attr PVJSON readingList single(jsonPath('$.info.time'), 'zeit', 'default value');;

setstate PVJSON 2024-11-12 19:48:07 .computedReadings zeit
setstate PVJSON 2024-11-12 19:48:07 zeit 1

Inhalt von /opt/fhem/test 1.json ist gleich wie bei dir:
{
  "info":
  {
    "time" : true
  }
}


Bin mir nicht sicher, was bei dir da falsch läuft. Hast du nochmal überprüft, ob der Dateipfad + Berechtigungen stimmen? Hast du tatsächlich auch reread gedrückt? Sagt das Log irgendetwas?
Dass es bei dir auf den Standardwert springt ist für mich jedenfalls ein Zeichen, dass FHEM irgendwie die Datei nicht richtig lesen kann.

(Leerzeichen weglassen ist übrigens unabhängig davon, dass es hier funktioniert, eine gute Idee. Erspart dir einiges an Kopfzerbrechen, wenn du dir das jetzt schon angewöhnst.)

Zu den anderen Lösungswegen bzw. zu "soll ich jetzt alles fallen lassen [...] ?"möchte ich nur die sunk cost fallacy in den Ring werfen. Dazu vielleicht noch den Gedanken, dass die Leute hier es nicht schlecht mit dir meinen, sondern schlicht das als Rat geben, was ihrer Erfahrung nach sinnvoll ist.
(Ob dieser Ratschlag im Einzelfall auch zutrifft, ist dann nochmal eine andere Frage – prinzipiell sehe ich kein Problem darin, jedenfalls zu Testzwecken die bestehende Infrastruktur "via Datei" zu nutzen, um damit FHEM mit den jeweiligen Daten zu füttern und sich mit JsonMod vertraut zu machen. Ich glaube wir haben alle schonmal ähnliche Spaghettikonstruktionen gebaut ...)

betateilchen

Zitat von: wowogiengen am 12 November 2024, 19:04:16Hallo,
nochmal für alle zum mitschreiben...

Dafür, dass Du wenig Ahnung hast und Hilfe suchst, hast Du einen komischen Ton am Leib.



Wenn die Datei an der angegebenen Stelle nicht gefunden wird und deshalb ein Fehler 404 auftritt, dann ist die Datei dort nicht vorhanden. Das ist die einzige Konstellation, in der ich einen Fehler 404 erzeugen konnte.

Wäre es ein Berechtigungsproblem (meine erste Vermutung), käme ein "Permission denied" oder ähnliches in den API_LAST_MSG.

Gib mal bitte folgendes in die FHEM Befehlszeile ein und verrate uns das Ergebnis.

{my ($err,undef) = FileRead({FileName => '/opt/fhem/python/neu 1.json', ForceType => 'FILE'});; return $err }
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

wowogiengen

Hallo,
ich bin zu blöd, ich gebs auf...

Wenn ich
{my ($err,undef) = FileRead({FileName => '/opt/fhem/python/neu 1.json', ForceType => 'FILE'});; return $err }dort eingebe, wo ich z.B. auch "update check" oder "backup" oder alles andere eingebe,
passiert nichts.
und wenn ich es beim "+" eingebe, wo man mehrere Zeilen eingeben kann:

Executed everything, no errors found

was sollte denn rauskommen?

passibe

#13
Wenn nichts rauskommt ist alles gut.
Kannst ja testweise mal den Pfad auf "neu 2" oder so ändern, dann siehst du z.B. die Fehlermeldung, die kommt, wenn die Datei nicht existiert.

Bedeutet jetzt aber, dass der Fehler doch nicht im falschen Dateipfad oder einer falschen Berechtigung. Wo sonst, keine Ahnung. Wie gesagt, bei mir funktioniert das.

Poste bitte trotzdem mal die Ausgabe von (per SSH natürlich):
ls -la /opt/fhem/python/neu\ 1.json
Und vielleicht auch nochmal ein list von deinem JsonMod-Device a) mit richtigem Pfad und b) nachdem du auf reread gedrückt hast.

betateilchen

Zitat von: wowogiengen am 12 November 2024, 20:07:46ich bin zu blöd,

...

Zitat von: wowogiengen am 12 November 2024, 20:07:46Wenn ich
...
dort eingebe, wo ich z.B. auch "update check" oder "backup" oder alles andere eingebe,

Das ist zumindest mal die richtige Stelle.

Zitat von: wowogiengen am 12 November 2024, 20:07:46passiert nichts.

Kannst Du "passiert nichts" etwas genauer beschreiben?



Nächster Versuch für die FHEM Befehlszeile:

{use Data::Dumper;; my ($err,@content) = FileRead({FileName => '/opt/fhem/python/neu 1.json', ForceType => 'FILE'});; Debug "err:>$err<";; Debug Dumper @content }
und danach bitte ins Logfile schauen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!