Seite 1 von 1

json Feldbezeichner fehlerhaft - Wie kann ich trotzdem damit arbeiten?

Verfasst: Donnerstag 11. April 2024, 10:47
von tadeus
Hallo,

ich kann von meiner Heizung ein json auslesen. Leider läuft da irgendwas falsch bei den Feldbezeichnern.

Bei jede Zeile die einen String enthält fehlt beim Feldbezeichner das abschließende Hochkomma. Z.B. "L_statetext:"Heizbetrieb aktiv",
Bei den Zahlenwerten ist alles ok.

Jetzt hab ich hier ein Skript welches beim decodieren meckert:

Code: Alles auswählen

    response = urllib.request.urlopen(json_quelle)
    mydata = response.read()
    decodeddata = mydata.decode ('cp1252')
    d = json.loads(decodeddata)
>> json.decoder.JSONDecodeError: Expecting ':' delimiter: line 15 column 17 (char 257)

Was kann ich da nun tun, um mit dem json trotzdem arbeiten zu können?

Danke


json:

Code: Alles auswählen

{
 "system":{
  "L_ambient":115, 
  "L_errors":0, 
  "L_usb_stick":0, 
  "L_existing_boiler":0
 },
 "hk1":{
  "L_roomtemp_act":0, 
  "L_roomtemp_set":240, 
  "L_flowtemp_act":279, 
  "L_flowtemp_set":290, 
  "L_comfort":0, 
  "L_state":32, 
  "L_statetext:"Heizbetrieb aktiv",
  "L_pump":1, 
  "remote_override":0, 
  "mode_auto":1, 
  "time_prg":0, 
  "temp_setback":180, 
  "temp_heat":240, 
  "temp_vacation":150, 
  "name":"", 
  "oekomode":0
 },
 "pu1":{
  "L_tpo_act":282, 
  "L_tpo_set":550, 
  "L_tpm_act":259, 
  "L_tpm_set":550, 
  "L_pump_release":400, 
  "L_pump":100, 
  "L_state":256, 
  "L_statetext:"Anforderung Ein",
  "mintemp_off":80, 
  "mintemp_on":80, 
  "ext_mintemp_off":80, 
  "ext_mintemp_on":80
 },
 "ww1":{
  "L_temp_set":500, 
  "L_ontemp_act":367, 
  "L_offtemp_act":367, 
  "L_pump":0, 
  "L_state":16912, 
  "L_statetext:"Zeit innerhalb Zeitprogramm|Quellentemp unterhalb Warmwassertemp|Anforderung Ein",
  "time_prg":0, 
  "sensor_on":0, 
  "sensor_off":0, 
  "mode_auto":1, 
  "mode_dhw":1, 
  "heat_once":0, 
  "temp_min_set":200, 
  "temp_max_set":500, 
  "name":"", 
  "smartstart":0, 
  "use_boiler_heat":0, 
  "oekomode":0
 },
 "pe1":{
  "L_temp_act":570, 
  "L_temp_set":700, 
  "L_ext_temp":-32768, 
  "L_frt_temp_act":4661, 
  "L_frt_temp_set":4085, 
  "L_frt_temp_end":7400, 
  "L_br":0, 
  "L_ak":0, 
  "L_not":1, 
  "L_stb":1, 
  "L_modulation":100, 
  "L_runtimeburner":3304, 
  "L_resttimeburner":8000, 
  "L_currentairflow":0, 
  "L_lowpressure":1354, 
  "L_lowpressure_set":1350, 
  "L_fluegas":64, 
  "L_uw_speed":28, 
  "L_state":16, 
  "L_statetext:"Leistungsbrand",
  "L_type":6, 
  "L_starts":1021, 
  "L_runtime":3081, 
  "L_avg_runtime":181, 
  "L_uw_release":550, 
  "L_uw":28, 
  "L_storage_fill":4969, 
  "L_storage_min":400, 
  "L_storage_max":6000, 
  "L_storage_popper":31, 
  "storage_fill_today":32765, 
  "storage_fill_yesterday":32765, 
  "mode":1
 },
   "error":{
   }
}

Re: json Feldbezeichner fehlerhaft - Wie kann ich trotzdem damit arbeiten?

Verfasst: Donnerstag 11. April 2024, 11:22
von noisefloor
Hallo,

du könnest den Rohstring manuell bearbeiten, bevor du ihn an das JSON-Modul übergibst. Wenn du `:"` durch `":"` ersetzen lässt sollte es passen.

Gruß, noisefloor

Re: json Feldbezeichner fehlerhaft - Wie kann ich trotzdem damit arbeiten?

Verfasst: Donnerstag 11. April 2024, 12:00
von __blackjack__
Naja nicht immer denn dieser Fehler scheint ja mindestens eine Ausnahme zu besitzen. Und man muss dann natürlich auch sicher sein, dass niemals eine Zeichenkette mit :" endet.

Kann man da nicht den Hersteller drauf aufmerksam machen, dass der da vielleicht ein Firmwareupdate macht und diesen Fehler behebt. Oder wo auch immer diese Daten generiert werden.

Re: json Feldbezeichner fehlerhaft - Wie kann ich trotzdem damit arbeiten?

Verfasst: Donnerstag 11. April 2024, 12:07
von DeaD_EyE
Regex darauf loslassen und hoffen, dass die Heizung immer den gleichen Fehler macht.

Code: Alles auswählen

import json
import re

data = """{
 "system":{
  "L_ambient":115, 
  "L_errors":0, 
  "L_usb_stick":0, 
  "L_existing_boiler":0
 },
 "hk1":{
  "L_roomtemp_act":0, 
  "L_roomtemp_set":240, 
  "L_flowtemp_act":279, 
  "L_flowtemp_set":290, 
  "L_comfort":0, 
  "L_state":32, 
  "L_statetext:"Heizbetrieb aktiv",
  "L_pump":1, 
  "remote_override":0, 
  "mode_auto":1, 
  "time_prg":0, 
  "temp_setback":180, 
  "temp_heat":240, 
  "temp_vacation":150, 
  "name":"", 
  "oekomode":0
 },
 "pu1":{
  "L_tpo_act":282, 
  "L_tpo_set":550, 
  "L_tpm_act":259, 
  "L_tpm_set":550, 
  "L_pump_release":400, 
  "L_pump":100, 
  "L_state":256, 
  "L_statetext:"Anforderung Ein",
  "mintemp_off":80, 
  "mintemp_on":80, 
  "ext_mintemp_off":80, 
  "ext_mintemp_on":80
 },
 "ww1":{
  "L_temp_set":500, 
  "L_ontemp_act":367, 
  "L_offtemp_act":367, 
  "L_pump":0, 
  "L_state":16912, 
  "L_statetext:"Zeit innerhalb Zeitprogramm|Quellentemp unterhalb Warmwassertemp|Anforderung Ein",
  "time_prg":0, 
  "sensor_on":0, 
  "sensor_off":0, 
  "mode_auto":1, 
  "mode_dhw":1, 
  "heat_once":0, 
  "temp_min_set":200, 
  "temp_max_set":500, 
  "name":"", 
  "smartstart":0, 
  "use_boiler_heat":0, 
  "oekomode":0
 },
 "pe1":{
  "L_temp_act":570, 
  "L_temp_set":700, 
  "L_ext_temp":-32768, 
  "L_frt_temp_act":4661, 
  "L_frt_temp_set":4085, 
  "L_frt_temp_end":7400, 
  "L_br":0, 
  "L_ak":0, 
  "L_not":1, 
  "L_stb":1, 
  "L_modulation":100, 
  "L_runtimeburner":3304, 
  "L_resttimeburner":8000, 
  "L_currentairflow":0, 
  "L_lowpressure":1354, 
  "L_lowpressure_set":1350, 
  "L_fluegas":64, 
  "L_uw_speed":28, 
  "L_state":16, 
  "L_statetext:"Leistungsbrand",
  "L_type":6, 
  "L_starts":1021, 
  "L_runtime":3081, 
  "L_avg_runtime":181, 
  "L_uw_release":550, 
  "L_uw":28, 
  "L_storage_fill":4969, 
  "L_storage_min":400, 
  "L_storage_max":6000, 
  "L_storage_popper":31, 
  "storage_fill_today":32765, 
  "storage_fill_yesterday":32765, 
  "mode":1
 },
   "error":{
   }
}"""


status_heizung = json.loads(re.sub(r'\w:"', '":"', data))

Re: json Feldbezeichner fehlerhaft - Wie kann ich trotzdem damit arbeiten?

Verfasst: Donnerstag 11. April 2024, 12:58
von karolus

Code: Alles auswählen

status_heizung = json.loads(re.sub(r'\w:"', '":"', data))

Code: Alles auswählen

status_heizung = json.loads(re.sub(r'(\w):"', r'\1":"', data))

Re: json Feldbezeichner fehlerhaft - Wie kann ich trotzdem damit arbeiten?

Verfasst: Donnerstag 11. April 2024, 19:49
von DeaD_EyE
Stimmt, ohne Klammern müsste der letzte Buchstabe abgeschnitten werden. Schön ist die Lösung jedenfalls nicht und ich würde den Hersteller kontaktieren, damit er mal seine Bugs behebt. Begründung für das Beheben eines Bugs: Weniger Anfragen durch die Kunden

Re: json Feldbezeichner fehlerhaft - Wie kann ich trotzdem damit arbeiten?

Verfasst: Freitag 12. April 2024, 22:01
von tadeus
Mit Regex hatte ich bisher noch keinen Kontakt, aber danke schon mal.
Die Daten oben sind von der Ausgabe des jsons über den Browser.

Aber es kommt noch zu einem Fehler.

Und zwar wenn ich das hier ausführe: mydata = response.read()
und mydata ausgebe, bekomme ich folgendes.

Code: Alles auswählen

b'{\n "system":{\n  "L_ambient":126, \n  "L_errors":0, \n  "L_usb_stick":0, \n  "L_existing_boiler":0\n },\n "hk1":{\n  "L_roomtemp_act":0, \n  "L_roomtemp_set":80, \n  "L_flowtemp_act":224, \n  "L_flowtemp_set":80, \n  "L_comfort":0, \n  "L_state":65552, \n  "L_statetext:"Absenkbetrieb aktiv|Au\xdfentemp \xfcber Heizgrenze absenken",\n  "L_pump":0, \n  "remote_override":0, \n  "mode_auto":1, \n  "time_prg":0, \n  "temp_setback":180, \n  "temp_heat":240, \n  "temp_vacation":150, \n  "name":"", \n  "oekomode":0\n },\n "pu1":{\n  "L_tpo_act":476, \n  "L_tpo_set":80, \n  "L_tpm_act":331, \n  "L_tpm_set":80, \n  "L_pump_release":80, \n  "L_pump":0, \n  "L_state":512, \n  "L_statetext:"Anforderung Aus",\n  "mintemp_off":80, \n  "mintemp_on":80, \n  "ext_mintemp_off":80, \n  "ext_mintemp_on":80\n },\n "ww1":{\n  "L_temp_set":150, \n  "L_ontemp_act":518, \n  "L_offtemp_act":518, \n  "L_pump":0, \n  "L_state":8200, \n  "L_statetext:"Zeit au\xdferhalb Zeitprogramm|Anforderung Aus",\n  "time_prg":0, \n  "sensor_on":0, \n  "sensor_off":0, \n  "mode_auto":1, \n  "mode_dhw":1, \n  "heat_once":0, \n  "temp_min_set":200, \n  "temp_max_set":500, \n  "name":"", \n  "smartstart":0, \n  "use_boiler_heat":0, \n  "oekomode":0\n },\n "pe1":{\n  "L_temp_act":381, \n  "L_temp_set":80, \n  "L_ext_temp":-32768, \n  "L_frt_temp_act":374, \n  "L_frt_temp_set":80, \n  "L_frt_temp_end":80, \n  "L_br":0, \n  "L_ak":0, \n  "L_not":1, \n  "L_stb":1, \n  "L_modulation":0, \n  "L_runtimeburner":0, \n  "L_resttimeburner":0, \n  "L_currentairflow":0, \n  "L_lowpressure":497, \n  "L_lowpressure_set":840, \n  "L_fluegas":0, \n  "L_uw_speed":0, \n  "L_state":2147483648, \n  "L_statetext:"Aus",\n  "L_type":6, \n  "L_starts":1024, \n  "L_runtime":3087, \n  "L_avg_runtime":180, \n  "L_uw_release":550, \n  "L_uw":0, \n  "L_storage_fill":4969, \n  "L_storage_min":400, \n  "L_storage_max":6000, \n  "L_storage_popper":31, \n  "storage_fill_today":32765, \n  "storage_fill_yesterday":32765, \n  "mode":1\n },\n   "error":{\n   }\n}\n'
Wenn ich dann euer json.loads(re.sub(r'(\w):"', r'\1":"', mydata)) ausführe bekomme ich folgende Meldung:
Traceback (most recent call last):
File "/home/tadeus/Downloads/oekofen-spy/Python3/oekofen2influx.py", line 116, in <module>
mydata2 = json.loads(re.sub(r'(\w):"', r'\1":"', mydata))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/re/__init__.py", line 185, in sub
return _compile(pattern, flags).sub(repl, string, count)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: cannot use a string pattern on a bytes-like object
Was ist hie ein "bytes-like object"? Der Inhalt ist doch ein String.

Re: json Feldbezeichner fehlerhaft - Wie kann ich trotzdem damit arbeiten?

Verfasst: Freitag 12. April 2024, 22:36
von sparrow
Das b vor der Zeichenkette sagt, dass es Bytes sind.
Was genau denkst du, macht Zeile 3 in deinem allersten Codeblock in diesem Thread?

Re: json Feldbezeichner fehlerhaft - Wie kann ich trotzdem damit arbeiten?

Verfasst: Freitag 12. April 2024, 22:54
von tadeus
Ah okay die macht genau Strings draus, mein Fehler.
Aber genau um diese Zeile geht es ja. Die wirft ja den ursprünglichen Fehler.
Das heißt mit regex kann ich das nicht bearbeiten, da das nur bei Strings geht, ok, aber wenn ichs nicht zu nem String wandeln kann, da er da nen Fehler wirft und ich byte object nicht zu nem String machen kann weil die Funktion wegen dem fehlenden Hochkomma Fehler wirft, was mach ich dann? Da beißt sich doch die Katze in den eigenen Schwanz.

Re: json Feldbezeichner fehlerhaft - Wie kann ich trotzdem damit arbeiten?

Verfasst: Freitag 12. April 2024, 23:35
von __blackjack__
@tadeus: Die Zeile 3 löst sicher keinen `JSONDecodeError` aus. Das ist Zeile 4.