Hallo zusammen,
ich habe ein komisches Problem, wenn ich in Python 2.7.9 (ja veraltet...Enigma2 on it's best) per httplib.HTTPSConnection die jsonlis2 aufrufe,
dann bekomme ich bei einem DOIF mit Sonderzeichen immer Probleme. HTTP macht aber keine Probleme.
Das Sonderzeichen setze ich, um es per Curl und FHEMWEB-Aufruf nach Enigma2 einzulesen. Dort wird es in eine Textdatei geschrieben, welche ich mit LCD4Linux
aufrufe.
Direkt auf dem Fhemserver per FHEMWEB mit HTTPS alles Ok.
jsonlist2 tempTendenz
{
"Arg":"tempTendenz",
"Results": [
{
"Name":"tempTendenz",
"PossibleSets":"disable:noArg enable:noArg initialize:noArg checkall:noArg cmd_1:noArg cmd_2:noArg ",
"PossibleAttrs":"alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 disable:0,1 loglevel:0,1,2,3,4,5,6 wait:textField-long do:always,resetwait cmdState startup:textField-long state:textField-long initialize repeatsame repeatcmd waitsame waitdel cmdpause timerWithWait:1,0 notexist selftrigger:wait,all timerevent:1,0 checkReadingEvent:0,1 addStateEvent:1,0 checkall:event,timer,all weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading cmdIcon devStateIcon devStateIcon:textField-long devStateStyle icon sortby subType webCmd webCmdLabel:textField-long widgetOverride userattr",
"Internals": {
"DEF": "([Holzkessel:state:diff] < 0.2) \n\u0009(setreading tempTendenz Temperatur ▼)\nDOELSEIF ([Holzkessel:state:diff] > 0.2)\n\u0009(setreading tempTendenz Temperatur ▲)",
"FUUID": "5d6e9884-f33f-86cf-0561-d1a155f4145a2c82",
"MODEL": "FHEM",
"NAME": "tempTendenz",
"NOTIFYDEV": "global,Holzkessel",
"NR": "237",
"NTFY_ORDER": "50-tempTendenz",
"STATE": "down",
"TYPE": "DOIF",
"VERSION": "20423 2019-10-29 18:50:08"
},
"Readings": {
"Device": { "Value":"Holzkessel", "Time":"2019-11-17 10:34:15" },
"Temperatur": { "Value":"▼", "Time":"2019-11-17 10:34:15" },
"cmd": { "Value":"1", "Time":"2019-11-17 10:34:15" },
"cmd_event": { "Value":"Holzkessel", "Time":"2019-11-17 10:34:15" },
"cmd_nr": { "Value":"1", "Time":"2019-11-17 10:34:15" },
"e_Holzkessel_state": { "Value":"T: 56.9", "Time":"2019-11-17 10:34:15" },
"mode": { "Value":"enabled", "Time":"2019-11-16 20:54:27" },
"state": { "Value":"down", "Time":"2019-11-17 10:34:15" }
},
"Attributes": {
"cmdState": "down|up",
"devStateIcon": "up:control_arrow_upward@green down:control_arrow_downward@red",
"icon": "icoTempHeizung",
"room": "01.Heizung,08.DOIF"
}
} ],
"totalResultsReturned":1
}
Auf meinem Enigma2 SAT Receiver per httplib.HTTPSConnection haut es mir dann die Codierung raus.
{
"Name":"tempTendenz",
"PossibleSets":"disable:noArg enable:noArg initialize:noArg checkall:noArg cmd_1:noArg cmd_2:noArg ",
"PossibleAttrs":"alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 disable:0,1 loglevel:0,1,2,3,4,5,6 wait:textField-long do:always,resetwait cmdState startup:textField-long state:textField-long initialize repeatsame repeatcmd waitsame waitdel cmdpause timerWithWait:1,0 notexist selftrigger:wait,all timerevent:1,0 checkReadingEvent:0,1 addStateEvent:1,0 checkall:event,timer,all weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading cmdIcon devStateIcon devStateIcon:textField-long devStateStyle icon sortby subType webCmd webCmdLabel:textField-long widgetOverride userattr",
"Internals": {
"DEF": "([Holzkessel:state:diff] < 0.2) \n\u0009(setreading tempTendenz Temperatur â¼)\nDOELSEIF ([Holzkessel:state:diff] > 0.2)\n\u0009(setreading tempTendenz Temperatur â²)",
"FUUID": "5d6e9884-f33f-86cf-0561-d1a155f4145a2c82",
"MODEL": "FHEM",
"NAME": "tempTendenz",
"NOTIFYDEV": "Holzkessel,global",
"NR": "237",
"NTFY_ORDER": "50-tempTendenz",
"STATE": "down",
"TYPE": "DOIF",
"VERSION": "20423 2019-10-29 18:50:08"
},
"Readings": {
"Device": { "Value":"Holzkessel", "Time":"2019-11-16 21:09:52" },
"Temperatur": { "Value":"â¼", "Time":"2019-11-16 20:54:33" },
"cmd": { "Value":"1", "Time":"2019-11-16 20:54:33" },
"cmd_event": { "Value":"set_cmd_1", "Time":"2019-11-16 20:54:33" },
"cmd_nr": { "Value":"1", "Time":"2019-11-16 20:54:33" },
"e_Holzkessel_state": { "Value":"T: 48.2", "Time":"2019-11-16 21:09:52" },
"mode": { "Value":"enabled", "Time":"2019-11-16 20:54:27" },
"state": { "Value":"down", "Time":"2019-11-16 20:54:33" }
},
"Attributes": {
"cmdState": "down|up",
"devStateIcon": "up:control_arrow_upward@green down:control_arrow_downward@red",
"icon": "icoTempHeizung",
"room": "01.Heizung,08.DOIF"
}
Erweitere ich die jsonlist2 mit "x96", wird die betreffende Zeile durch "<BINARY>" ersetzt.
Damit klappt der Aufruf per httplib.HTTPSConnection normal.
$a =~ s/([\x00-\x09\x0b-\x19\x5c\x96])/sprintf '\u%04x', ord($1)/ge; # Forum 57377
21:12:41 - FHEM-debug: response
{
"Arg":"tempTendenz",
"Results": [
{
"Name":"tempTendenz",
"PossibleSets":"disable:noArg enable:noArg initialize:noArg checkall:noArg cmd_1:noArg cmd_2:noArg ",
"PossibleAttrs":"alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 disable:0,1 loglevel:0,1,2,3,4,5,6 wait:textField-long do:always,resetwait cmdState startup:textField-long state:textField-long initialize repeatsame repeatcmd waitsame waitdel cmdpause timerWithWait:1,0 notexist selftrigger:wait,all timerevent:1,0 checkReadingEvent:0,1 addStateEvent:1,0 checkall:event,timer,all weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading cmdIcon devStateIcon devStateIcon:textField-long devStateStyle icon sortby subType webCmd webCmdLabel:textField-long widgetOverride userattr",
"Internals": {
"DEF": "<BINARY>",
"FUUID": "5d6e9884-f33f-86cf-0561-d1a155f4145a2c82",
"MODEL": "FHEM",
"NAME": "tempTendenz",
"NOTIFYDEV": "Holzkessel,global",
"NR": "237",
"NTFY_ORDER": "50-tempTendenz",
"STATE": "down",
"TYPE": "DOIF",
"VERSION": "20423 2019-10-29 18:50:08"
},
"Readings": {
"Device": { "Value":"Holzkessel", "Time":"2019-11-16 21:09:52" },
"Temperatur": { "Value":"<BINARY>", "Time":"2019-11-16 20:54:33" },
"cmd": { "Value":"1", "Time":"2019-11-16 20:54:33" },
"cmd_event": { "Value":"set_cmd_1", "Time":"2019-11-16 20:54:33" },
"cmd_nr": { "Value":"1", "Time":"2019-11-16 20:54:33" },
"e_Holzkessel_state": { "Value":"T: 48.2", "Time":"2019-11-16 21:09:52" },
"mode": { "Value":"enabled", "Time":"2019-11-16 20:54:27" },
"state": { "Value":"down", "Time":"2019-11-16 20:54:33" }
},
"Attributes": {
"cmdState": "down|up",
"devStateIcon": "up:control_arrow_upward@green down:control_arrow_downward@red",
"icon": "icoTempHeizung",
"room": "01.Heizung,08.DOIF"
}
} ],
"totalResultsReturned":1
}
Hat wer eine Idee, wie es in Fhem maskiert werden kann, ohne das die Formatierung darunter leidet?
Oder wie es besser in jsonlist2 escaped werden kann, damit dort nicht "<BINARY>" steht?
Für mich funktioniert das, da ich das Sonderzeichen nur per FHEMWEB aufrufe und in der
jsonlist2 bis jetzt nicht benötige.
jsonlist prueft mit utf8::decode($b) (4 Zeilen under deinem Patch), ob das Ergebnis der Konvertierung utf8 ist, und setzt den Text auf <BINARY> falls nicht.
Offensichtlich war das vor deiner Modifikation der Fall, danach nicht mehr.
Da der Browser die Daten richtig anzeigt, und dein altes Python nicht, tippe ich darauf, das Python ein Problem hat.
Du koenntest die utf8::decode Pruefung in 98_JsonList2.pm auskommentieren, um zu sehen, ob dein python damit zurechtkommt, wenn nicht, dann habe ich aber leider keine gute Idee.
Habes es mit auskommentieren von utf8::decode probiert. Der Müll kommt leider weiter.
Ich habe erstmal alle ungewöhnlichen Zeichen hinzugefügt.
$a =~ s/([\x00-\x09\x0b-\x19\x5c\x96\xE2\xBC\xB2])/sprintf '\u%04x', ord($1)/ge;
Vielleicht ergibt sich noch eine Lösung.
Ok, die Änderung in der jsonlist2 habe ich erstmal wieder entfernt. Das funktioniert doch nicht so toll.
Folgende Test's habe ich gemacht.
Browser
Chrome, Firefox und Edge
Alles ok
In Python 2.7.9 mit folgenden Bibliotheken:
import httplib
HTTP
Alles OK, lädt schnell.
HTTPS
Das Device wird meistens wegen Sonderzeichen gekickt. Ab und zu werden die Sonderzeichen richtig codiert.
Langsamer wegen DNS-Lockup und Handshake?
import urllib3
HTTP
Alles OK, lädt schnell.
HTTPS
Das Device wird meistens wegen Sonderzeichen gekickt. Ab und zu werden die Sonderzeichen richtig codiert.
Langsamer wegen DNS-Lockup und Handshake?
import requests
HTTP
Alles OK, escaped automatisch die Sonderzeichen zu Unicode. Problem eigentlich gelöst, aber so träge :(
HTTPS
Alles OK, escaped automatisch die Sonderzeichen zu Unicode. Problem eigentlich gelöst, aber soooooooo träge :(
{u'totalResultsReturned': 1, u'Results': [{u'Name': u'tempTendenz', u'PossibleSets': u'disable:noArg enable:noArg initialize:noArg checkall:noArg cmd_1:noArg cmd_2:noArg ', u'Internals': {u'NAME': u'tempTendenz', u'NOTIFYDEV': u'Holzkessel,global', u'MODEL': u'FHEM', u'NTFY_ORDER': u'50-tempTendenz', u'STATE': u'up', u'VERSION': u'20500 2019-11-12 17:54:48', u'FUUID': u'5d6e9884-f33f-86cf-0561-d1a155f4145a2c82', u'TYPE': u'DOIF', u'NR': u'237', u'DEF': u'([Holzkessel:state:diff] < 0.2) \n\t(setreading tempTendenz Temperatur \u25bc)\nDOELSEIF ([Holzkessel:state:diff] > 0.2)\n\t(setreading tempTendenz Temperatur \u25b2)'}, u'Readings': {u'cmd_nr': {u'Value': u'2', u'Time': u'2019-11-21 18:57:17'}, u'e_Holzkessel_state': {u'Value': u'T: 49.2', u'Time': u'2019-11-21 18:57:17'}, u'cmd': {u'Value': u'2', u'Time': u'2019-11-21 18:57:17'}, u'state': {u'Value': u'up', u'Time': u'2019-11-21 18:57:17'}, u'Temperatur': {u'Value': u'\u25b2', u'Time': u'2019-11-21 18:57:17'}, u'mode': {u'Value': u'enabled', u'Time': u'2019-11-16 20:54:27'}, u'Device': {u'Value': u'Holzkessel', u'Time': u'2019-11-21 18:57:17'}, u'cmd_event': {u'Value': u'Holzkessel', u'Time': u'2019-11-21 18:57:17'}}, u'PossibleAttrs': u'alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 disable:0,1 loglevel:0,1,2,3,4,5,6 wait:textField-long do:always,resetwait cmdState startup:textField-long state:textField-long initialize repeatsame repeatcmd waitsame waitdel cmdpause timerWithWait:1,0 notexist selftrigger:wait,all timerevent:1,0 checkReadingEvent:0,1 addStateEvent:1,0 checkall:event,timer,all weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading cmdIcon devStateIcon devStateIcon:textField-long devStateStyle icon sortby subType webCmd webCmdLabel:textField-long widgetOverride userattr', u'Attributes': {u'devStateIcon': u'up:control_arrow_upward@green down:control_arrow_downward@red', u'room': u'01.Heizung,08.DOIF', u'icon': u'icoTempHeizung', u'cmdState': u'down|up'}}], u'Arg': u'tempTendenz'}
Versuche mich aber noch am tunen. Wenn das klappt wäre Requests mein Favorit.
Curl im Terminal
Genau der gleiche Mist wie mit httplib und urllib3.
{
"Name":"tempTendenz",
"PossibleSets":"disable:noArg enable:noArg initialize:noArg checkall:noArg cmd_1:noArg cmd_2:noArg ",
"PossibleAttrs":"alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 disable:0,1 loglevel:0,1,2,3,4,5,6 wait:textField-long do:always,resetwait cmdState startup:textField-long state:textField-long initialize repeatsame repeatcmd waitsame waitdel cmdpause timerWithWait:1,0 notexist selftrigger:wait,all timerevent:1,0 checkReadingEvent:0,1 addStateEvent:1,0 checkall:event,timer,all weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading cmdIcon devStateIcon devStateIcon:textField-long devStateStyle icon sortby subType webCmd webCmdLabel:textField-long widgetOverride userattr",
"Internals": {
"DEF": "([Holzkessel:state:diff] < 0.2) \n\u0009(setreading tempTendenz Temperatur â¼)\nDOELSEIF ([Holzkessel:state:diff] > 0.2)\n\u0009(setreading tempTendenz Temperatur â²)",
100 973k 100 973k 0 0 739k 0 0:00:01 0:00:01 --:--:-- 739k
"FUUID": "5d6e9884-f33f-86cf-0561-d1a155f4145a2c82",
"MODEL": "FHEM",
"NAME": "tempTendenz",
"NOTIFYDEV": "global,Holzkessel",
"NR": "237",
"NTFY_ORDER": "50-tempTendenz",
"STATE": "down",
"TYPE": "DOIF",
"VERSION": "20500 2019-11-12 17:54:48"
},
"Readings": {
"Device": { "Value":"Holzkessel", "Time":"2019-11-21 20:25:50" },
"Temperatur": { "Value":"â¼", "Time":"2019-11-21 20:23:32" },
"cmd": { "Value":"1", "Time":"2019-11-21 20:23:32" },
"cmd_event": { "Value":"set_cmd_1", "Time":"2019-11-21 20:23:32" },
"cmd_nr": { "Value":"1", "Time":"2019-11-21 20:23:32" },
"e_Holzkessel_state": { "Value":"T: 60.2", "Time":"2019-11-21 20:25:50" },
"mode": { "Value":"enabled", "Time":"2019-11-21 20:23:28" },
"state": { "Value":"down", "Time":"2019-11-21 20:23:32" }
},
"Attributes": {
"cmdState": "down|up",
"devStateIcon": "up:control_arrow_upward@green down:control_arrow_downward@red",
"icon": "icoTempHeizung",
"room": "01.Heizung,08.DOIF"
}
Update zu Curl
Rufe ich per Curl den Link mit TYPE=DOIF auf, kommt ab dem Device mit Sonderzeichen Müll.
curl -k -H "Accept: application/json" -u username:1431password 'https://192.168.178.66:8083/fhem?XHR=1&cmd=jsonlist2&20TYPE=DOIF' &> /tmp/jsoncharTest.txt
{
"Name":"tempTendenz",
"PossibleSets":"disable:noArg enable:noArg initialize:noArg checkall:noArg cmd_1:noArg cmd_2:noArg ",
"PossibleAttrs":"alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 disable:0,1 loglevel:0,1,2,3,4,5,6 wait:textField-long do:always,resetwait cmdState startup:textField-long state:textField-long initialize repeatsame repeatcmd waitsame waitdel cmdpause timerWithWait:1,0 notexist selftrigger:wait,all timerevent:1,0 checkReadingEvent:0,1 addStateEvent:1,0 checkall:event,timer,all weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading cmdIcon devStateIcon devStateIcon:textField-long devStateStyle icon
100 973k 100 973k 0 0 741k 0 0:00:01 0:00:01 --:--:-- 742k
sortby subType webCmd webCmdLabel:textField-long widgetOverride userattr",
"Internals": {
"DEF": "([Holzkessel:state:diff] < 0.2) \n\u0009(setreading tempTendenz Temperatur â¼)\nDOELSEIF ([Holzkessel:state:diff] > 0.2)\n\u0009(setreading tempTendenz Temperatur â²)",
"FUUID": "5d6e9884-f33f-86cf-0561-d1a155f4145a2c82",
"MODEL": "FHEM",
"NAME": "tempTendenz",
"NOTIFYDEV": "global,Holzkessel",
"NR": "237",
"NTFY_ORDER": "50-tempTendenz",
"STATE": "down",
"TYPE": "DOIF",
"VERSION": "20500 2019-11-12 17:54:48"
},
"Readings": {
"Device": { "Value":"Holzkessel", "Time":"2019-11-21 21:06:55" },
"Temperatur": { "Value":"â¼", "Time":"2019-11-21 20:46:36" },
"cmd": { "Value":"1", "Time":"2019-11-21 20:46:36" },
"cmd_event": { "Value":"Holzkessel", "Time":"2019-11-21 20:46:36" },
"cmd_nr": { "Value":"1", "Time":"2019-11-21 20:46:36" },
"e_Holzkessel_state": { "Value":"T: 57.6", "Time":"2019-11-21 21:06:55" },
"mode": { "Value":"enabled", "Time":"2019-11-21 20:23:28" },
"state": { "Value":"down", "Time":"2019-11-21 20:46:36" }
},
"Attributes": {
"cmdState": "down|up",
"devStateIcon": "up:control_arrow_upward@green down:control_arrow_downward@red",
"icon": "icoTempHeizung",
"room": "01.Heizung,08.DOIF"
}
} ],
"totalResultsReturned
Rufe ich per Curl direkt das DOIF mit Namen auf, funktioniert es.
curl -k -H "Accept: application/json" -u username:password 'https://192.168.178.66:8083/fhem?XHR=1&cmd=jsonlist2%20tempTendenz' &> /tmp/jsoncharTest.txt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 2393 100 2393 0 0 11992 0 --:--:-- --:--:-- --:--:-- 12085
{
"Arg":"tempTendenz",
"Results": [
{
"Name":"tempTendenz",
"PossibleSets":"disable:noArg enable:noArg initialize:noArg checkall:noArg cmd_1:noArg cmd_2:noArg ",
"PossibleAttrs":"alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 disable:0,1 loglevel:0,1,2,3,4,5,6 wait:textField-long do:always,resetwait cmdState startup:textField-long state:textField-long initialize repeatsame repeatcmd waitsame waitdel cmdpause timerWithWait:1,0 notexist selftrigger:wait,all timerevent:1,0 checkReadingEvent:0,1 addStateEvent:1,0 checkall:event,timer,all weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading cmdIcon devStateIcon devStateIcon:textField-long devStateStyle icon sortby subType webCmd webCmdLabel:textField-long widgetOverride userattr",
"Internals": {
"DEF": "([Holzkessel:state:diff] < 0.2) \n\u0009(setreading tempTendenz Temperatur ▼)\nDOELSEIF ([Holzkessel:state:diff] > 0.2)\n\u0009(setreading tempTendenz Temperatur ▲)",
"FUUID": "5d6e9884-f33f-86cf-0561-d1a155f4145a2c82",
"MODEL": "FHEM",
"NAME": "tempTendenz",
"NOTIFYDEV": "global,Holzkessel",
"NR": "237",
"NTFY_ORDER": "50-tempTendenz",
"STATE": "down",
"TYPE": "DOIF",
"VERSION": "20500 2019-11-12 17:54:48"
},
"Readings": {
"Device": { "Value":"Holzkessel", "Time":"2019-11-21 21:13:46" },
"Temperatur": { "Value":"▼", "Time":"2019-11-21 20:46:36" },
"cmd": { "Value":"1", "Time":"2019-11-21 20:46:36" },
"cmd_event": { "Value":"Holzkessel", "Time":"2019-11-21 20:46:36" },
"cmd_nr": { "Value":"1", "Time":"2019-11-21 20:46:36" },
"e_Holzkessel_state": { "Value":"T: 57.5", "Time":"2019-11-21 21:13:46" },
"mode": { "Value":"enabled", "Time":"2019-11-21 20:23:28" },
"state": { "Value":"down", "Time":"2019-11-21 20:46:36" }
},
"Attributes": {
"cmdState": "down|up",
"devStateIcon": "up:control_arrow_upward@green down:control_arrow_downward@red",
"icon": "icoTempHeizung",
"room": "01.Heizung,08.DOIF"
}
} ],
"totalResultsReturned":1
}
Wahrscheinlich habe ich den Fehler gefunden.
Das DOIF tempTendenz ist in der jsonlist2 das letzte Objekt in der Kette. Jetzt habe ich aber ein MQTT-Device,
welches ein nicht konformes Reading enthält. Das habe ich nun gelöscht und es scheint zu funktionieren.
"Value": "[1;31m[E][hd41ctrl
{
"Name": "VorkeHD41switch",
"PossibleSets": "hd_audio_71 stereo_20 attrTemplate:?,General_Info,MQTT2_CLIENT_general_bridge,tasmota_basic,tasmota_basic_state_power1,tasmota_1ch+motion+SI7021,tasmota_POW,tasmota_ir,tasmota_rf,tasmota_use_DS18x20_id,tasmota_clear_readings_reset_readingsList_and_reboot,tasmota_set_lowercase_texts_and_state1,tasmota_set_uppercase_texts_and_state1,tasmota_set_power1_state_to_power,tasmota_2channel_split,tasmota_2ch_unified,tasmota_2ch_shutter_invert_1,tasmota_2ch_shutter_invert_0,tasmota_4channel_split,tasmota_4ch_unified_basic_text,tasmota_4ch_unified_icon,tasmota_rgb_led_controller,tasmota_TuyaMCU_dimmer,shelly1,eBus_daemon_splitter,zigbee2mqtt_bridge,esp_milight_hub_bridge,esp_milight_hub_remote_events_only,OpenMQTTGateway_MCU,wallpanel_app",
"PossibleAttrs": "alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 IODev autocreate:0,1 bridgeRegexp:textField-long devicetopic devPos disable:0,1 disabledForIntervals getList:textField-long imageLink jsonMap:textField-long model readingList:textField-long setExtensionsEvent:1,0 setList:textField-long setStateList event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading cmdIcon devStateIcon devStateIcon:textField-long devStateStyle icon sortby subType webCmd webCmdLabel:textField-long widgetOverride userattr",
"Internals": {
"CID": "vorke_hd41_demo_2cf4321291b8",
"DEF": "vorke_hd41_demo_2cf4321291b8",
"DEVICETOPIC": "VorkeHD41switch",
"FUUID": "5dbf2728-f33f-86cf-22f4-f28309b373a08a3b",
"NAME": "VorkeHD41switch",
"NR": "286",
"STATE": "Status: OFF | Audio:Input 3 Source",
"TYPE": "MQTT2_DEVICE"
},
"Readings": {
"availability_topic": {
"Value": "vorke_hd41_demo/status",
"Time": "2019-11-05 21:29:08"
},
"command_topic": {
"Value": "vorke_hd41_demo/switch/input_3_source/command",
"Time": "2019-11-05 21:29:08"
},
"debug": {
"Value": "[1;31m[E][hd41ctrl:278]: send_command: unit not responding to command - giving up[0m",
"Time": "2019-11-05 21:30:09"
},
"device_class": {
"Value": "connectivity",
"Time": "2019-11-05 21:27:37"
},
"device_identifiers": {
"Value": "2cf4321291b8",
"Time": "2019-11-05 21:29:08"
},
"device_manufacturer": {
"Value": "espressif",
"Time": "2019-11-05 21:29:08"
},
"device_model": {
"Value": "PLATFORMIO_D1_MINI",
"Time": "2019-11-05 21:29:08"
},
"device_name": {
"Value": "vorke_hd41_demo",
"Time": "2019-11-05 21:29:08"
},
"device_sw_version": {
"Value": "esphome v1.14.2 Nov 3 2019, 20:11:43",
"Time": "2019-11-05 21:29:08"
},
"icon": {
"Value": "mdi:video-input-hdmi",
"Time": "2019-11-05 21:29:08"
},
"name": {
"Value": "Input 3 Source",
"Time": "2019-11-05 21:29:08"
},
"state": {
"Value": "OFF",
"Time": "2019-11-05 21:29:08"
},
"state_topic": {
"Value": "vorke_hd41_demo/switch/input_3_source/state",
"Time": "2019-11-05 21:29:08"
},
"status": {
"Value": "offline",
"Time": "2019-11-05 21:30:37"
},
"unique_id": {
"Value": "ESPswitchinput_3_source",
"Time": "2019-11-05 21:29:08"
}
},
"Attributes": {
"IODev": "myFhembroker",
"event-on-change-reading": ".*",
"icon": "rc_HDMI",
"readingList": "vorke_hd41_demo_2cf4321291b8:homeassistant/switch/vorke_hd41_demo/arc/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/switch/arc/state:.* state\nvorke_hd41_demo_2cf4321291b8:homeassistant/binary_sensor/vorke_hd41_demo/output_connected/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/status:.* status\nvorke_hd41_demo_2cf4321291b8:homeassistant/switch/vorke_hd41_demo/auto_source/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/switch/auto_source/state:.* state\nvorke_hd41_demo_2cf4321291b8:homeassistant/binary_sensor/vorke_hd41_demo/input_1_connected/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:homeassistant/switch/vorke_hd41_demo/input_1_source/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/switch/input_1_source/state:.* state\nvorke_hd41_demo_2cf4321291b8:homeassistant/binary_sensor/vorke_hd41_demo/input_2_connected/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:homeassistant/switch/vorke_hd41_demo/input_2_source/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/switch/input_2_source/state:.* state\nvorke_hd41_demo_2cf4321291b8:homeassistant/binary_sensor/vorke_hd41_demo/input_3_connected/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:homeassistant/switch/vorke_hd41_demo/input_3_source/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/switch/input_3_source/state:.* state\nvorke_hd41_demo_2cf4321291b8:homeassistant/binary_sensor/vorke_hd41_demo/input_4_connected/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:homeassistant/switch/vorke_hd41_demo/input_4_source/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/switch/input_4_source/state:.* state\nvorke_hd41_demo_2cf4321291b8:homeassistant/switch/vorke_hd41_demo/auto_edid/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/switch/auto_edid/state:.* state\nvorke_hd41_demo_2cf4321291b8:homeassistant/switch/vorke_hd41_demo/stereo_20/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/switch/stereo_20/state:.* state\nvorke_hd41_demo_2cf4321291b8:homeassistant/switch/vorke_hd41_demo/dolbydts_51/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/switch/dolbydts_51/state:.* state\nvorke_hd41_demo_2cf4321291b8:homeassistant/switch/vorke_hd41_demo/hd_audio_71/config:.* { json2nameValue($EVENT) }\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/switch/hd_audio_71/state:.* state\nvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/debug:.* debug",
"room": "03.Wohnzimmer,MQTT2_DEVICE",
"setList": "hd_audio_71 vorke_hd41_demo/switch/hd_audio_71/command on\nstereo_20 vorke_hd41_demo/switch/stereo_20/command on",
"stateFormat": "Status: state | Audio:name",
"subType": "Multimedia",
"webCmd": "hd_audio_71:stereo_20"
}
},
Warum das bei HTTP ok ist und bei HTTPS nicht, keine Ahnung.
ZitatJetzt habe ich aber ein MQTT-Device, welches ein nicht konformes Reading enthält.
Kannst Du bitte fuer den Empfang dieser Daten ein "attr MQTT2_SERVER verbose 5" Log hier anhaengen?
Hier ist der Log. Das Device ist sehr gesprächig. Hatte noch keine Zeit es weiter einzurichten, Hardwareseitig.
Daher knallt es wohl den Log so zu.
In der MQTT Nachricht die Ansi Escape Sequenzen zu senden ist mAn suboptimal (wann kapieren die Entwickler, dass Fehlermeldungen nicht unbedingt auf einem Ansi-Terminal landen?), auf der anderen Seite verstehe ich nicht, wieso in jsonlist2 Escape selbst nicht escaped wird.
Ich habe jsonlist2 angepasst und eingecheckt, damit duerfte das Problem (hoffentlich) weg sein.
Weiterhin empfehle ich die Steuerzeichen aus dem Reading zu entfernen indem man die letzte Zeile der VorkeHD41switch readingList durchvorke_hd41_demo_2cf4321291b8:vorke_hd41_demo/debug:.* { $EVENT =~ s/\033.*?m//g; { debug=>$EVENT } }
austauscht. Achtung: wenn man das nicht in FHEMWEB macht, dann muss man ; verdoppeln.
Danke für den Tip mit dem Steuerzeichen. Habe ich übernommen.
Die Info mit der Ansi Escape Sequenz gebe ich weiter.
Zum eigentlichen Problem. Es ist wie verhext. Gestern Abend hat es noch nach dem Löschen vom vermurksten
Debugreading funktioniert. Heute nicht mehr...
Ich hatte erst die Änderung direkt übernommen in der jsonlist2. Dann wieder zurückgenommen. Gleiches
Verhalten bei "x19" oder "x1f".
$a =~ s/([\x00-\x09\x0b-\x19\x5c])/sprintf '\u%04x', ord($1)/ge; # Forum 57377
$a =~ s/([\x00-\x09\x0b-\x1f\x5c])/sprintf '\u%04x', ord($1)/ge; # Forum 57377
Wieder Müll am Ende der Jsonlist. Beim aufrufen des betreffenden Devices direkt, alles ok.
Dann habe ich das betreffende MQTT2-Device "VorkeHD41switch" gelöscht. Jsonlist killt weiterhin ▲▼.
Einzelaufruf i.O. wie oben.
curl -k -H "Accept: application/json" -u username:password'https://192.168.178.66:8083/fhem?XHR=1&cmd=jsonlist2%20tempTendenz' &> /tmp/jsoncharTest.txt
Zum Abschluss noch mit Filter auf DOIF only. Das klappt auch nicht.
root@vuduo2:~# curl -k -H "Accept: application/json" -u username:password'https://192.168.178.66:8083/fhem?XHR=1&cmd=jsonlist2%20TYPE=DOIF' &> /tmp/jsoncharTest.txt
edit:
Zu viel Text. Ausgabe ist jetzt im Anhang.
Zusammenfassung:
- Jsonlist2 komplett - Fehler
- Filter auf DOIF - Fehler
- Einzeldevice - Ok
Jetzt gerade das Fhemupdate gemacht. Kurzer Test per Curl. Funktioniert wieder >:(
Gestern zum Test hatte ich die betreffende Zeile in Jsonlist2 angepasst.
Mal gehts, mal nicht. Ich versteh es nicht...
Neuer Test.
Das DOIF tempTendenz mit ▲▼ habe ich jetzt in KaffeeCheck umbenannt. Daher ist es jetzt nicht Schlusslicht in der Kette, sondern
weit oben in der Jsonlist. Rufe ich jetzt per Curl und HTTPS die jsonlist2 mit Devspec 'TYPE=DOIF' auf, werden immer noch die Sonderzeichen
in Müll umgewandelt, aber die Jsonlist ist am Ende nicht mehr abgeschnitten.
Test unter Windows10 per Curl. Nachdem ich KaffeeCheck wieder in tempTendenz umbenannt habe, wird die Jsonlist
nicht mehr korrekt ausgegeben.
Microsoft Windows [Version 10.0.18362.476]
(c) 2019 Microsoft Corporation. Alle Rechte vorbehalten.
C:\Users\schwatter.ZOTAC-ZBOX>C:\Users\schwatter.ZOTAC-ZBOX>curl -k -H "Accept: application/json" -u username:password "https://192.168.178.66:8083/fhem?XHR=1&cmd=jsonlist2%20TYPE=DOIF"
Ich habe noch ein Problem bei mir entdeckt per HTTPS. Diesmal betrifft es "LightScene". In diesem Fall ist der Auslöser, der Buchstabe --> ß
unter PossibleSets. Enthalten in dem Wort "KaltWeiß".
In Python 2.7 per httplib.HTTPSConnection.
21:06:52 - FHEM-debug: response
{
"Arg":"TYPE=LightScene",
"Results": [
{
"Name":"LIGHTSCENE_WZ",
"PossibleSets":"clear remove:FrontOnBackOff,KaltWeiÃ,NormalWarm,Sexy rename save set setcmd scene:FrontOnBackOff,KaltWeiÃ,NormalWarm,Sexy all nextScene:noArg previousScene:noArg",
"PossibleAttrs":"alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 async_delay followDevices:1,2 lightSceneRestoreOnlyIfChanged:1,0 showDeviceCurrentState:1,0 switchingOrder traversalOrder event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading cmdIcon devStateIcon devStateIcon:textField-long devStateStyle icon sortby subType webCmd webCmdLabel:textField-long widgetOverride userattr",
"Internals": {
"DEF": "HUEDevice1 HUEDevice2 HUEDevice3 HUEDevice4",
"FUUID": "5d51bd47-f33f-86cf-d967-c033c87898aafea7",
"HAS_DataDumper": "1",
"HAS_JSON": "1",
"NAME": "LIGHTSCENE_WZ",
"NR": "230",
"NTFY_ORDER": "50-LIGHTSCENE_WZ",
"STATE": "Initialized",
"TYPE": "LightScene"
},
"Readings": { "state": { "Value":"NormalWarm", "Time":"2019-12-03 20:50:42" } },
"Attributes": {
"room": "03.Wohnzimmer",
"webCmd": "scene"
}
} ],
"totalResultsReturned":1
In Windows per Curl.
Microsoft Windows [Version 10.0.18363.476]
(c) 2019 Microsoft Corporation. Alle Rechte vorbehalten.
C:\WINDOWS\system32>curl -k -H "Accept: application/json" -u username:password "https://192.168.178.66:8083/fhem?XHR=1&cmd=jsonlist2%20TYPE=LightScene"
{
"Arg":"TYPE=LightScene",
"Results": [
{
"Name":"LIGHTSCENE_WZ",
"PossibleSets":"clear remove:FrontOnBackOff,KaltWeiß,NormalWarm,Sexy rename save set setcmd scene:FrontOnBackOff,KaltWeiß,NormalWarm,Sexy all nextScene:noArg previousScene:noArg",
"PossibleAttrs":"alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 async_delay followDevices:1,2 lightSceneRestoreOnlyIfChanged:1,0 showDeviceCurrentState:1,0 switchingOrder traversalOrder event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading cmdIcon devStateIcon devStateIcon:textField-long devStateStyle icon sortby subType webCmd webCmdLabel:textField-long widgetOverride userattr",
"Internals": {
"DEF": "HUEDevice1 HUEDevice2 HUEDevice3 HUEDevice4",
"FUUID": "5d51bd47-f33f-86cf-d967-c033c87898aafea7",
"HAS_DataDumper": "1",
"HAS_JSON": "1",
"NAME": "LIGHTSCENE_WZ",
"NR": "230",
"NTFY_ORDER": "50-LIGHTSCENE_WZ",
"STATE": "Initialized",
"TYPE": "LightScene"
},
"Readings": { "state": { "Value":"NormalWarm", "Time":"2019-12-03 20:50:42" } },
"Attributes": {
"room": "03.Wohnzimmer",
"webCmd": "scene"
}
} ],
"totalResultsReturned":1
C:\WINDOWS\system32>
Und hier noch ein Test in Windows10 mit urllib3.
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib3
>>> import json
>>> urllib3.disable_warnings()
>>> http = urllib3.PoolManager(cert_reqs='CERT_NONE')
>>> r = http.request('GET', 'https://192.168.178.66:8083/fhem?XHR=1&cmd=jsonlist2%20TYPE=LightScene', headers={'Authorization':'Basic strengGeheim535t34t3...'})
>>> r.data
b'{\n "Arg":"TYPE=LightScene",\n "Results": [\n {\n "Name":"LIGHTSCENE_WZ",\n "PossibleSets":"clear remove:FrontOnBackOff,KaltWei\xc3\x83\xc2\x9f,NormalWarm,Sexy rename save set setcmd scene:FrontOnBackOff,KaltWei\xc3\x83\xc2\x9f,NormalWarm,Sexy all nextScene:noArg previousScene:noArg",\n "PossibleAttrs":"alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 async_delay followDevices:1,2 lightSceneRestoreOnlyIfChanged:1,0 showDeviceCurrentState:1,0 switchingOrder traversalOrder event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading cmdIcon devStateIcon devStateIcon:textField-long devStateStyle icon sortby subType webCmd webCmdLabel:textField-long widgetOverride userattr",\n "Internals": {\n "DEF": "HUEDevice1 HUEDevice2 HUEDevice3 HUEDevice4",\n "FUUID": "5d51bd47-f33f-86cf-d967-c033c87898aafea7",\n "HAS_DataDumper": "1",\n "HAS_JSON": "1",\n "NAME": "LIGHTSCENE_WZ",\n "NR": "230",\n "NTFY_ORDER": "50-LIGHTSCENE_WZ",\n "STATE": "Initialized",\n "TYPE": "LightScene"\n },\n "Readings": { "state": { "Value":"NormalWarm", "Time":"2019-12-03 20:50:42" } },\n "Attributes": {\n "room": "03.Wohnzimmer",\n "webCmd": "scene"\n }\n } ],\n "totalResultsReturned":1'
>>> json.loads(r.data.decode('utf-8'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\schwatter.ZOTAC-ZBOX\AppData\Local\Programs\Python\Python36\lib\json\__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "C:\Users\schwatter.ZOTAC-ZBOX\AppData\Local\Programs\Python\Python36\lib\json\decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\schwatter.ZOTAC-ZBOX\AppData\Local\Programs\Python\Python36\lib\json\decoder.py", line 355, in raw_decode
Es sieht so aus, als wenn ich mein Problem auf der Clientseite lösen konnte.
Ich benutze jetzt urllib3 und musste den Header mit 'Accept-Encoding': 'gzip' erweitern.
self.headers = { 'Authorization' : 'Basic ' + self.credentials64, 'Accept-Encoding': 'gzip'}
urllib3.disable_warnings()
http = urllib3.PoolManager(cert_reqs='CERT_NONE')
r = http.request('GET', 'https://192.168.178.66:8083/fhem?XHR=1&cmd=jsonlist2%20TYPE=DOIF', headers = self.headers)