Hi,
Ich habe einen Luftsensor von luftdaten.info. Will da direkt die Daten daraus lesen, diese sind über JSON REST Aufruf verfügbar.
Habe dafür bereits diverses mit HTTPMOD ausprobiert, ich komme leider nich zu dem gewünschten Stand:
das Gerät kann über eine lokale IP angesprochen werden und liefert folgenden JSON:
{
"software_version": "NRZ-2018-123B",
"age": "47",
"sensordatavalues": [
{
"value_type": "SDS_P1",
"value": "8.55"
},
{
"value_type": "SDS_P2",
"value": "3.60"
},
{
"value_type": "BME280_temperature",
"value": "23.74"
},
{
"value_type": "BME280_humidity",
"value": "53.09"
},
{
"value_type": "BME280_pressure",
"value": "96407.30"
},
{
"value_type": "HECA_temperature",
"value": "23.87"
},
{
"value_type": "HECA_humidity",
"value": "39.66"
},
{
"value_type": "samples",
"value": "3211110"
},
{
"value_type": "min_micro",
"value": "105"
},
{
"value_type": "max_micro",
"value": "64476"
},
{
"value_type": "signal",
"value": "-58"
}
]
}
Das Problem ist - jedes Wert ist eine separate Liste in einer Array, das aus value_type und value besteht.
Was ich gerne erreichen würde, wäre: für jedes Eintrag in der sensordatavalues soll ein Reading gestellt werden, dessen Name den value_type entspricht, und wert den value. Wie kann ich das am einfachsten auf die Reihe kriegen?
habe versucht mit extractAllJSON und extractAllJSONFilter versucht aber die Namen kriege ich nicht aus dem Inhalt rausgelesen...
Warum httpmod und nicht LuftDatenInfo ?
Ich will direkt aus dem Sensor die Daten bekommen, sollte das Netz nicht verfügbar sein...
Die Frage ist aber denke ich allgemein wichtig - wie kann ich Namen und Werte für dynamisch erstellte Readings aus einer unsorteierten Liste extrahieren?
in Perl würde ich eine foreach schleife machen, und ein setreading machen wo ich Name aus einen Parameter nehme und Wert aus anderen. Leider hier finde ich keinen eleganten Weg das zu schaffen ohne ins Perl einzutauchen und eigene Module zu schreiben.
Das wird besonders kompliziert, wenn die Reihenfolge zufällig ist...
Ein ähnliches Beispiel hatte ich erlebt als ich versucht habe die Daten aus MQTT output von Domoticz rauszuparsen. Es shickt immer ein Array das Parameter Name und dessen Wert beinhaltet. Und nur diesen einzelnen Array. Wenn ein neues aktualisiert wird, dann schickt domoticz nur den anderen... Habe versucht das so ins multiple readings zu zerlegen, habe aber geschaltert. Inwzischen habe ich domoticz komplett mit fhem abgelößt und das Problem habe ich nicht mehr. Aber als Use Case denke ich es wäre gut dafür eine Lösung zu haben. Vielleicht ist einfach mein fhem voodoo zu klein um das schön und elegant zu lösen, wie z.B. mit extractAllJSON...
Mal doof gefragt: sollte nicht
extractAllJSON gehen (https://fhem.de/commandref.html#HTTPMOD)?
ZitatIf you don't care about the naming of your readings, you can simply extract all JSON data with
attr test2 extractAllJSON 1
es funktioniert, leider die Namen sind generisch und nicht einzuordnen:
Internals:
BUSY 0
CFGFN
DEF http://192.168.3.3/data.json 600
FUUID 5e396414-f33f-8de5-5505-70f96364fa5f43da
Interval 600
JSONEnabled 1
LASTSEND 1580819503.58799
MainURL http://192.168.3.3/data.json
ModuleVersion 3.5.21 - 27.12.2019
NAME SmogMelder
NOTIFYDEV global
NR 24175
NTFY_ORDER 50-SmogMelder
STATE ???
TRIGGERTIME 1580820078.84346
TRIGGERTIME_FMT 2020-02-04 13:41:18
TYPE HTTPMOD
addr http://192.168.3.3:80
auth 0
buf
code 200
compress 1
conn
data
displayurl http://192.168.3.3/data.json
header
host 192.168.3.3
httpheader HTTP/1.1 200 OK
Server: nginx
Date: Tue, 04 Feb 2020 12:31:43 GMT
Content-Type: application/json
Content-Length: 1092
Connection: close
Vary: Accept-Encoding
Last-Modified: Tue, 04 Feb 2020 09:44:22 GMT
ETag: "5e393cf6-444"
Accept-Ranges: bytes
httpversion 1.0
hu_blocking 0
hu_filecount 2
hu_port 80
hu_portSfx
ignoreredirects 1
loglevel 4
path /data.json
protocol http
redirects 0
timeout 2
url http://192.168.3.3/data.json
value 0
QUEUE:
READINGS:
2020-02-04 13:31:43 age 47
2020-02-04 13:31:43 sensordatavalues_01_value 8.55
2020-02-04 13:31:43 sensordatavalues_01_value_type SDS_P1
2020-02-04 13:31:43 sensordatavalues_02_value 3.60
2020-02-04 13:31:43 sensordatavalues_02_value_type SDS_P2
2020-02-04 13:31:43 sensordatavalues_03_value 23.74
2020-02-04 13:31:43 sensordatavalues_03_value_type BME280_temperature
2020-02-04 13:31:43 sensordatavalues_04_value 53.09
2020-02-04 13:31:43 sensordatavalues_04_value_type BME280_humidity
2020-02-04 13:31:43 sensordatavalues_05_value 96407.30
2020-02-04 13:31:43 sensordatavalues_05_value_type BME280_pressure
2020-02-04 13:31:43 sensordatavalues_06_value 23.87
2020-02-04 13:31:43 sensordatavalues_06_value_type HECA_temperature
2020-02-04 13:31:43 sensordatavalues_07_value 39.66
2020-02-04 13:31:43 sensordatavalues_07_value_type HECA_humidity
2020-02-04 13:31:43 sensordatavalues_08_value 3211110
2020-02-04 13:31:43 sensordatavalues_08_value_type samples
2020-02-04 13:31:43 sensordatavalues_09_value 105
2020-02-04 13:31:43 sensordatavalues_09_value_type min_micro
2020-02-04 13:31:43 sensordatavalues_10_value 64476
2020-02-04 13:31:43 sensordatavalues_10_value_type max_micro
2020-02-04 13:31:43 sensordatavalues_11_value -58
2020-02-04 13:31:43 sensordatavalues_11_value_type signal
2020-02-04 13:31:43 software_version NRZ-2018-123B
REQUEST:
data
header
ignoreredirects 0
retryCount 0
type update
url http://192.168.3.3/data.json
value 0
defptr:
readingBase:
age reading
sensordatavalues_01_value reading
sensordatavalues_01_value_type reading
sensordatavalues_02_value reading
sensordatavalues_02_value_type reading
sensordatavalues_03_value reading
sensordatavalues_03_value_type reading
sensordatavalues_04_value reading
sensordatavalues_04_value_type reading
sensordatavalues_05_value reading
sensordatavalues_05_value_type reading
sensordatavalues_06_value reading
sensordatavalues_06_value_type reading
sensordatavalues_07_value reading
sensordatavalues_07_value_type reading
sensordatavalues_08_value reading
sensordatavalues_08_value_type reading
sensordatavalues_09_value reading
sensordatavalues_09_value_type reading
sensordatavalues_10_value reading
sensordatavalues_10_value_type reading
sensordatavalues_11_value reading
sensordatavalues_11_value_type reading
software_version reading
readingNum:
age
sensordatavalues_01_value
sensordatavalues_01_value_type
sensordatavalues_02_value
sensordatavalues_02_value_type
sensordatavalues_03_value
sensordatavalues_03_value_type
sensordatavalues_04_value
sensordatavalues_04_value_type
sensordatavalues_05_value
sensordatavalues_05_value_type
sensordatavalues_06_value
sensordatavalues_06_value_type
sensordatavalues_07_value
sensordatavalues_07_value_type
sensordatavalues_08_value
sensordatavalues_08_value_type
sensordatavalues_09_value
sensordatavalues_09_value_type
sensordatavalues_10_value
sensordatavalues_10_value_type
sensordatavalues_11_value
sensordatavalues_11_value_type
software_version
readingOutdated:
requestReadings:
update:
age reading
sensordatavalues_01_value reading
sensordatavalues_01_value_type reading
sensordatavalues_02_value reading
sensordatavalues_02_value_type reading
sensordatavalues_03_value reading
sensordatavalues_03_value_type reading
sensordatavalues_04_value reading
sensordatavalues_04_value_type reading
sensordatavalues_05_value reading
sensordatavalues_05_value_type reading
sensordatavalues_06_value reading
sensordatavalues_06_value_type reading
sensordatavalues_07_value reading
sensordatavalues_07_value_type reading
sensordatavalues_08_value reading
sensordatavalues_08_value_type reading
sensordatavalues_09_value reading
sensordatavalues_09_value_type reading
sensordatavalues_10_value reading
sensordatavalues_10_value_type reading
sensordatavalues_11_value reading
sensordatavalues_11_value_type reading
software_version reading
sslargs:
Attributes:
enforceGoodReadingNames 1
extractAllJSON 1
Was ich gerne hätte wäre für alles unter sensordatavalues das es analog zu age oder software_version aussieht.
Dafür müsste es aber für jedne Eintrag der JSON Tabelle die Name des readings aus value_type ziehen, und den Inhalt aus value.
Ich hätte mal gerne so etwas:
READINGS:
2020-02-04 13:31:43 age 47
2020-02-04 13:31:43 SDS_P1 8.55
2020-02-04 13:31:43 SDS_P2 3.60
2020-02-04 13:31:43 BME280_temperature 23.74
2020-02-04 13:31:43 BME280_humidity 53.09
2020-02-04 13:31:43 BME280_pressure 96407.30
...
Das schaffe ich leider nicht generisch zu schaffen.
ZitatIch will direkt aus dem Sensor die Daten bekommen, sollte das Netz nicht verfügbar sein...
Ägypten ?
Du meinst das Inet und nicht WLAN mit Netz ?
Dann mach das doch mit
define Deindevicename LuftdatenInfo local IPdesSensors
???
Hmm - darauf bin ich nicht gekommen :) Danke! Das ist noch eleganter :)
Zitat von: KölnSolar am 04 Februar 2020, 13:40:10
Dann mach das doch mit define Deindevicename LuftdatenInfo local IPdesSensors
???
Um das kurz zu konkretisieren:
LuftdatenInfo hat drei Betriebsmodi. Im remote-Modus holt das Modul die Daten aus dem Interwebs, im local-Modus holt es die Daten direkt von deinem Sensor. Hast du mehrere Sensoren angeschlossen, gibt es noch den slave-Modus, bei dem für jeden Sensor (bzw. für jeden Datenpunkt eines Sensors) ein eigenes Device erstellt werden kann. So habe ich zum Beispiel einen modifizierten Sensor mit dem SDS011, einem BME680 und einem DHT22 (teilweise redundant, aber nicht tragisch) im Betrieb. Es gibt bei mir dann vier Devices: Ein Device im local-Modus und drei Devices im slave-Modus. Ich übertrage gar keine Daten an Dritte.
Vielen Dank an alle! Ich denke dieses Thema kann zugemacht werden.
Das kannst Du selbst mit dem Button links unten. Muss aber nicht sein. Wichtiger wäre in Deinem 1. Post den Betreff mit einem [gelöst] zu ergänzen.
Hallo zusammen
Ich habe ein ähnliches Problem, an dem ich mir seit Tagen die Zähne ausbeisse. Ich lese mit HTTPMOD meine Wärmepumpe aus, dies mit mehreren get[0-9]+URL's. Leider kommt in der JSON Antwort das Resultat immer in einem Array namens "object_result" zurück. Das führt bei mehreren URL's dazu dass die Resultate (zufällig) nummeriert werden (jeweils mit "object_result-[0-9]+" als Reading Name. Dazu kommt, dass einige der Werte in einem Code/Value Paar daherkommen. (Beispiele unten).
Nun meine Fragen/Ideen:
- Gibt es eine Möglichkeit bei ExtractALLJSON den get[0-9]+Name voranzustellen, so dass die verschiedenen readings aus den get's eineindeutig werden?
- Gibt es eine Möglichkeit automatisiert aus Code/Value Paaren ein Reading mit Code als Name und Wert Value zu generieren?
Vielen Dank und Grüsse aus der CH
STefan
get01 liefert:
Body: {
"error_code" : "0",
"error_msg" : "Success",
"error_msg_code" : "",
"object_result" : {
"is_fault" : true,
"status" : "ONLINE"
},
"is_reuslt_suc" : true
}
get02 liefert:
Body: {
"error_code" : "0",
"error_msg" : "Success",
"error_msg_code" : "",
"object_result" : [ {
"code" : "Power",
"value" : "0"
}, {
"code" : "Mode",
"value" : "1"
}, {
"code" : "Manual-mute",
"value" : "1"
}, {
"code" : "T02",
"value" : "8.0"
}, {
"code" : "2074",
"value" : "0000001000000000"
}, {
"code" : "2075",
"value" : "0000000000001000"
}, {
"code" : "2076",
"value" : "0000000000000000"
}, {
"code" : "2077",
"value" : "0000000000000000"
}, {
"code" : "H03",
"value" : "0"
}, {
"code" : "Set_Temp",
"value" : "33.0"
}, {
"code" : "R08",
"value" : "8.0"
}, {
"code" : "R09",
"value" : "35.0"
}, {
"code" : "R10",
"value" : "15.0"
}, {
"code" : "R11",
"value" : "35.0"
}, {
"code" : "R01",
"value" : "27.0"
}, {
"code" : "R02",
"value" : "33.0"
}, {
"code" : "R03",
"value" : "27.0"
}, {
"code" : "T01",
"value" : "8.5"
}, {
"code" : "T02",
"value" : "8.0"
}, {
"code" : "T03",
"value" : "9.0"
}, {
"code" : "1158",
"value" : "0"
}, {
"code" : "1159",
"value" : "0"
}, {
"code" : "F17",
"value" : "1"
}, {
"code" : "H02",
"value" : "1"
} ],
"is_reuslt_suc" : true
}
ZitatGibt es eine Möglichkeit bei ExtractALLJSON den get[0-9]+Name voranzustellen, so dass die verschiedenen readings aus den get's eineindeutig werden?
Bei extractAllJSON kann man nichts beeinflüssen. Dafür musst Du einzelne Readings erstellen (mit (get|reading)XXJSON, und die wie gewünscht benennen
ZitatGibt es eine Möglichkeit automatisiert aus Code/Value Paaren ein Reading mit Code als Name und Wert Value zu generieren?
Nein, zumindest nicht ohne Nacharbeit über userReadings oder so.
Aber wenn die immer in der gleichen Reihenfolge kommen, kennst Du schon die Namen anhand der Position. Wenn die Reihenfolge zufällig ist, ist es einfacher über readingXXRegex zu gehen.
Danke für die prompte Antwort!!
Dann komm ich wohl nicht drum herum das per einzeln Hand zu definieren..
Evtl. als Anregung für eine zukünftige Version, dass man bei ExtractAllJSON so eine Art "Prefix" angeben kann. (z.b. als Attribut), das dann bei allen readings vorangestellt wird, so könnte man es bei mehreren get's relativ einfach eineindeutig machen...
Nochmals Danke und guten Start in die Woche!
STefan
Zitat von: clumsy am 12 Oktober 2020, 07:42:12
Danke für die prompte Antwort!!
Dann komm ich wohl nicht drum herum das per einzeln Hand zu definieren..
Evtl. als Anregung für eine zukünftige Version, dass man bei ExtractAllJSON so eine Art "Prefix" angeben kann. (z.b. als Attribut), das dann bei allen readings vorangestellt wird, so könnte man es bei mehreren get's relativ einfach eineindeutig machen...
Nochmals Danke und guten Start in die Woche!
STefan
Naja... man muss nicht unbedingt alles einzeln definieren: man kann auch extractAllJSON auf 2 setzen, und er erstellt selbst die einzelne Readings. Dann kann man löschen was man nicht braucht
Man kann auch in set|get|readingXXJSON Regex benutzen, z.B.
reading01JSON object_result_[0-9]+_value
Somit extrahiert er object_result_01_code, object_result_02_code, object_result_03_code, object_result_04_code usw
Und dann macht man ein
reading01-1Name power
reading01-2Name mode
reading01-3Name manual-mute
...
um die umzubenennen. Das ist was ich mit "
wenn die immer in der gleichen Reihenfolge kommen, kennst Du schon die Namen anhand der Position." meinte
Das wäre tatsächlich eine Zwischenvariante die einigermassen machbar ist vom Aufwand. Mein Problem ist, dass ich in 6 get's jeweils zwischen 5 und 20 "object_result" erhalte, welche aber nicht zwingend in der Reihenfolge reproduzierbar sind. Abgesehen davon erhalte ich auch noch zusätzliche Infos ausserhalb vom "object_result".
Auf jeden Fall Danke für die Detaillierung und Hilfe, ich werd nochmals den Kopf rauchen lassen, welchen Weg ich gehe ;)
Grüsse aus der CH!
STefan
Dann ist vielleicht doch "getXXExtractAllJSON 2" etwas für dich. In der raw DEF ist es dann relativ einfach, die Sachen umzubenennen
Evtl, ja...
Wobei ich schaue ob ich allenfalls grad eine Lösung finde bei der ich die code/value paare aus dem object_result in readings mit namen <code> und wert <value> kriege, dann hab ichs grad richitg... allenfalls halt mit einem externen script...
Ein Ansatz ist noch, dass ich halt für jede URL ein eigenes Device/define mache so habe ich die object_result sicher nicht überlappend, in der Hoffnung die Reihenfolge der Code/Value Paare ändert sich nicht...
Zitat von: amenomade am 12 Oktober 2020, 10:27:32
Man kann auch in set|get|readingXXJSON Regex benutzen, z.B.reading01JSON object_result_[0-9]+_value
Somit extrahiert er object_result_01_code, object_result_02_code, object_result_03_code, object_result_04_code usw
Ich bin nicht sicher ob das gewollt ist, wenn ich jedoch im readingXXJSON eine Regex (z.b. wie oben angegeben) nutze, dann werden die Readings mit der Regex benannt, ist zwar eineindeutig, sieht aber etwas komisch aus, wie ich finde (natürlich vor dem umbenennen ;)
READINGS:
2020-10-12 14:01:52 object_result_[0-9]+_value-1 0
2020-10-12 14:01:52 object_result_[0-9]+_value-10 0000000000000000
2020-10-12 14:01:52 object_result_[0-9]+_value-11 1
2020-10-12 14:01:52 object_result_[0-9]+_value-12 0
2020-10-12 14:01:52 object_result_[0-9]+_value-13 8.0
2020-10-12 14:01:52 object_result_[0-9]+_value-14 35.0
2020-10-12 14:01:52 object_result_[0-9]+_value-15 1
2020-10-12 14:01:52 object_result_[0-9]+_value-16 15.0
2020-10-12 14:01:52 object_result_[0-9]+_value-17 35.0
2020-10-12 14:01:52 object_result_[0-9]+_value-18 27.0
2020-10-12 14:01:52 object_result_[0-9]+_value-19 33.0
2020-10-12 14:01:52 object_result_[0-9]+_value-2 1
2020-10-12 14:01:52 object_result_[0-9]+_value-20 27.0
2020-10-12 14:01:52 object_result_[0-9]+_value-21 11.5
2020-10-12 14:01:52 object_result_[0-9]+_value-22 10.0
2020-10-12 14:01:52 object_result_[0-9]+_value-23 13.5
2020-10-12 14:01:52 object_result_[0-9]+_value-24 1
2020-10-12 14:01:52 object_result_[0-9]+_value-3 0
2020-10-12 14:01:52 object_result_[0-9]+_value-4 33.0
2020-10-12 14:01:52 object_result_[0-9]+_value-5 0
2020-10-12 14:01:52 object_result_[0-9]+_value-6 0
2020-10-12 14:01:52 object_result_[0-9]+_value-7 0000001000000000
2020-10-12 14:01:52 object_result_[0-9]+_value-8 0000000000001000
2020-10-12 14:01:52 object_result_[0-9]+_value-9 0000000000000000
EDIT: wenn ich dann den Namen ändern will sagt er mir:
fhem> attr wp_detail object_result_[0-9]+_value-4Name Set_Temp
wp_detail: bad attribute name 'object_result_[0-9]+_value-4Name' (allowed chars: A-Za-z/\d_\.-)
Die Namen müssen passend zu get/readingXXJSON Attribut gesetzt werden: wenn die Readings mit reading128JSON extrahiert werden, müssen die Attribute reading128-1Name reading128-2Name definiert werden
Bei der Regex ist etwas faul. Versuch mal mit
reading128JSON object_result.*value
Gibt es irgendwo ein gesamtes "list" vom HTTPMOD (ich kann mich dunkel erinnert, dass das ganze hier etwas mit einem anderen Thread zu tun hat)
Die Definiton hab ich mal unten angehängt... das list ist recht lange... kann ich aber sonst nachliefern..
Die regex war wie von dir vorgeschlagen
attr wp_detail reading01JSON object_result_[0-9]+_value
Nicht wundern, in der definition unten nehm ich jetzt extractALLJSON 2 (ohne Filter), ist mein aktueller Versuch. Nur generiert das irgendwie keine namens attribute wie in der commandref beschrieben... evtl. mach ich da noch was falsch?!
define wp_detail HTTPMOD http://cloud.linked-go.com:84/cloudservice/api/app/device/getDataByCode.json 30
setuuid wp_detail 5f844840-f33f-c70a-1a75-abd2ed16a3492c75
attr wp_detail userattr reading01JSON requestData requestHeader1 requestHeader2 sid01Data sid01IdJSON sid01URL sidHeader1
attr wp_detail DbLogExclude state,STATE
attr wp_detail alias Waermepumpe Detail
attr wp_detail disable 0
attr wp_detail enableControlSet 1
attr wp_detail enableCookies 1
attr wp_detail event-on-change-reading .*
attr wp_detail event-on-update-reading .*
attr wp_detail extractAllJSON 2
attr wp_detail reAuthAlways 0
attr wp_detail reAuthRegex .*(User information is not available|401).*
attr wp_detail requestData {"device_code":"xxxxxxxx","protocal_codes":["Power","Mode","Manual-mute","Set_Temp","1158","1159","2074","2075","2076","2077","H02","H03","R08","R09","H37","R10","R11","R01","R02","R03","T01","T02","T03","F17"]}
attr wp_detail requestHeader1 x-token: $sid
attr wp_detail requestHeader2 Content-Type: application/json
attr wp_detail room Presence
attr wp_detail sid01Data {"user_name":"xxxxxx","password":"xxxxxxxx","type":"2"}
attr wp_detail sid01IdJSON object_result_x-token
attr wp_detail sid01URL http://cloud.linked-go.com:84/cloudservice/api/app/user/login.json
attr wp_detail sidHeader1 Content-Type: application/json
attr wp_detail sslArgs SSL_verify_mode,0
attr wp_detail verbose 5
Hier noch der Versuch mit
reading01JSON object_result.*value
Auch hier sehen m.E. die Readings komisch aus, weil die Wildcard im Namen drin bleibt....
und ein kompletter list:
fhem> list wp_detail
Internals:
BUSY 0
CFGFN /etc/fhem/httpmod.cfg
DEF http://cloud.linked-go.com:84/cloudservice/api/app/device/getDataByCode.json 30
FUUID 5f847b15-f33f-c70a-4bc8-0ac77aab9b7a1e88
HTTPCookies JSESSIONID=xxxxxxxxxxxxx
Interval 30
JSONEnabled 1
LASTSEND 1602517814.06976
LastAuthTry 2020-10-12 17:49:44
MainURL http://cloud.linked-go.com:84/cloudservice/api/app/device/getDataByCode.json
ModuleVersion 3.4.3 - 1.5.2018
NAME wp_detail
NR 52388
STATE ???
TRIGGERTIME 1602517844.06701
TRIGGERTIME_FMT 2020-10-12 17:50:44
TYPE HTTPMOD
addr http://cloud.linked-go.com:84
auth 0
code 200
conn
data {"device_code":"xxxxxxxxxxxxxx","protocal_codes":["Power","Mode","Manual-mute","Set_Temp","1158","1159","2074","2075","2076","2077","H02","H03","R08","R09","H37","R10","R11","R01","R02","R03","T01","T02","T03","F17"]}
displayurl http://cloud.linked-go.com:84/cloudservice/api/app/device/getDataByCode.json
header x-token: xxxxxxxxx
Content-Type: application/json
Cookie: JSESSIONID=xxxxxxxxxxxx
host cloud.linked-go.com
httpheader HTTP/1.1 200
Date: Mon, 12 Oct 2020 15:50:14 GMT
Content-Type: application/json;charset=UTF-8
Connection: close
httpversion 1.0
hu_blocking 0
hu_filecount 4
hu_port 84
hu_portSfx :84
ignoreredirects 0
loglevel 4
path /cloudservice/api/app/device/getDataByCode.json
protocol http
redirects 0
sid xxxxxxxxxxx
timeout 2
url http://cloud.linked-go.com:84/cloudservice/api/app/device/getDataByCode.json
value 0
HTTPCookieHash:
JSESSIONID:
Options Path=/cloudservice; HttpOnly
Value xxxxxxxxxxxx
Helper:
DBLOG:
object_result.*value-1:
dblog:
TIME 1602517814.67826
VALUE 0
object_result.*value-10:
dblog:
TIME 1602517814.67826
VALUE 0000000000000000
object_result.*value-11:
dblog:
TIME 1602517814.67826
VALUE 1
object_result.*value-12:
dblog:
TIME 1602517814.67826
VALUE 0
object_result.*value-13:
dblog:
TIME 1602517814.67826
VALUE 8.0
object_result.*value-14:
dblog:
TIME 1602517814.67826
VALUE 35.0
object_result.*value-15:
dblog:
TIME 1602517814.67826
VALUE 1
object_result.*value-16:
dblog:
TIME 1602517814.67826
VALUE 15.0
object_result.*value-17:
dblog:
TIME 1602517814.67826
VALUE 35.0
object_result.*value-18:
dblog:
TIME 1602517814.67826
VALUE 27.0
object_result.*value-19:
dblog:
TIME 1602517814.67826
VALUE 33.0
object_result.*value-2:
dblog:
TIME 1602517814.67826
VALUE 1
object_result.*value-20:
dblog:
TIME 1602517814.67826
VALUE 27.0
object_result.*value-21:
dblog:
TIME 1602517814.67826
VALUE 11.0
object_result.*value-22:
dblog:
TIME 1602517814.67826
VALUE 11.0
object_result.*value-23:
dblog:
TIME 1602517814.67826
VALUE 13.0
object_result.*value-24:
dblog:
TIME 1602517814.67826
VALUE 1
object_result.*value-3:
dblog:
TIME 1602517814.67826
VALUE 0
object_result.*value-4:
dblog:
TIME 1602517814.67826
VALUE 33.0
object_result.*value-5:
dblog:
TIME 1602517814.67826
VALUE 0
object_result.*value-6:
dblog:
TIME 1602517814.67826
VALUE 0
object_result.*value-7:
dblog:
TIME 1602517814.67826
VALUE 0000001000000000
object_result.*value-8:
dblog:
TIME 1602517814.67826
VALUE 0000000000001000
object_result.*value-9:
dblog:
TIME 1602517814.67826
VALUE 0000000000000000
QUEUE:
READINGS:
2020-10-12 17:50:14 object_result.*value-1 0
2020-10-12 17:50:14 object_result.*value-10 0000000000000000
2020-10-12 17:50:14 object_result.*value-11 1
2020-10-12 17:50:14 object_result.*value-12 0
2020-10-12 17:50:14 object_result.*value-13 8.0
2020-10-12 17:50:14 object_result.*value-14 35.0
2020-10-12 17:50:14 object_result.*value-15 1
2020-10-12 17:50:14 object_result.*value-16 15.0
2020-10-12 17:50:14 object_result.*value-17 35.0
2020-10-12 17:50:14 object_result.*value-18 27.0
2020-10-12 17:50:14 object_result.*value-19 33.0
2020-10-12 17:50:14 object_result.*value-2 1
2020-10-12 17:50:14 object_result.*value-20 27.0
2020-10-12 17:50:14 object_result.*value-21 11.0
2020-10-12 17:50:14 object_result.*value-22 11.0
2020-10-12 17:50:14 object_result.*value-23 13.0
2020-10-12 17:50:14 object_result.*value-24 1
2020-10-12 17:50:14 object_result.*value-3 0
2020-10-12 17:50:14 object_result.*value-4 33.0
2020-10-12 17:50:14 object_result.*value-5 0
2020-10-12 17:50:14 object_result.*value-6 0
2020-10-12 17:50:14 object_result.*value-7 0000001000000000
2020-10-12 17:50:14 object_result.*value-8 0000000000001000
2020-10-12 17:50:14 object_result.*value-9 0000000000000000
REQUEST:
data {"device_code":"xxxxxxxxxx","protocal_codes":["Power","Mode","Manual-mute","Set_Temp","1158","1159","2074","2075","2076","2077","H02","H03","R08","R09","H37","R10","R11","R01","R02","R03","T01","T02","T03","F17"]}
header x-token: $sid
Content-Type: application/json
ignoreredirects 0
retryCount 0
type update
url http://cloud.linked-go.com:84/cloudservice/api/app/device/getDataByCode.json
value 0
defptr:
readingBase:
object_result.*value-1 reading
object_result.*value-10 reading
object_result.*value-11 reading
object_result.*value-12 reading
object_result.*value-13 reading
object_result.*value-14 reading
object_result.*value-15 reading
object_result.*value-16 reading
object_result.*value-17 reading
object_result.*value-18 reading
object_result.*value-19 reading
object_result.*value-2 reading
object_result.*value-20 reading
object_result.*value-21 reading
object_result.*value-22 reading
object_result.*value-23 reading
object_result.*value-24 reading
object_result.*value-3 reading
object_result.*value-4 reading
object_result.*value-5 reading
object_result.*value-6 reading
object_result.*value-7 reading
object_result.*value-8 reading
object_result.*value-9 reading
readingNum:
object_result.*value-1 01
object_result.*value-10 01
object_result.*value-11 01
object_result.*value-12 01
object_result.*value-13 01
object_result.*value-14 01
object_result.*value-15 01
object_result.*value-16 01
object_result.*value-17 01
object_result.*value-18 01
object_result.*value-19 01
object_result.*value-2 01
object_result.*value-20 01
object_result.*value-21 01
object_result.*value-22 01
object_result.*value-23 01
object_result.*value-24 01
object_result.*value-3 01
object_result.*value-4 01
object_result.*value-5 01
object_result.*value-6 01
object_result.*value-7 01
object_result.*value-8 01
object_result.*value-9 01
readingOutdated:
readingSubNum:
object_result.*value-1 -1
object_result.*value-10 -10
object_result.*value-11 -11
object_result.*value-12 -12
object_result.*value-13 -13
object_result.*value-14 -14
object_result.*value-15 -15
object_result.*value-16 -16
object_result.*value-17 -17
object_result.*value-18 -18
object_result.*value-19 -19
object_result.*value-2 -2
object_result.*value-20 -20
object_result.*value-21 -21
object_result.*value-22 -22
object_result.*value-23 -23
object_result.*value-24 -24
object_result.*value-3 -3
object_result.*value-4 -4
object_result.*value-5 -5
object_result.*value-6 -6
object_result.*value-7 -7
object_result.*value-8 -8
object_result.*value-9 -9
requestReadings:
update:
object_result.*value-1 reading 01-1
object_result.*value-10 reading 01-10
object_result.*value-11 reading 01-11
object_result.*value-12 reading 01-12
object_result.*value-13 reading 01-13
object_result.*value-14 reading 01-14
object_result.*value-15 reading 01-15
object_result.*value-16 reading 01-16
object_result.*value-17 reading 01-17
object_result.*value-18 reading 01-18
object_result.*value-19 reading 01-19
object_result.*value-2 reading 01-2
object_result.*value-20 reading 01-20
object_result.*value-21 reading 01-21
object_result.*value-22 reading 01-22
object_result.*value-23 reading 01-23
object_result.*value-24 reading 01-24
object_result.*value-3 reading 01-3
object_result.*value-4 reading 01-4
object_result.*value-5 reading 01-5
object_result.*value-6 reading 01-6
object_result.*value-7 reading 01-7
object_result.*value-8 reading 01-8
object_result.*value-9 reading 01-9
sslargs:
SSL_verify_mode 0
Attributes:
DbLogExclude state,STATE
alias Waermepumpe Detail
disable 0
enableControlSet 1
enableCookies 1
event-on-change-reading .*
event-on-update-reading .*
extractAllJSON 0
reAuthAlways 0
reAuthRegex .*(User information is not available|401).*
reading01JSON object_result.*value
requestData {"device_code":"xxxxxxxxxxx","protocal_codes":["Power","Mode","Manual-mute","Set_Temp","1158","1159","2074","2075","2076","2077","H02","H03","R08","R09","H37","R10","R11","R01","R02","R03","T01","T02","T03","F17"]}
requestHeader1 x-token: $sid
requestHeader2 Content-Type: application/json
room Presence
sid01Data {"user_name":"xxxxxxxxx","password":"xxxxxxxxx","type":"2"}
sid01IdJSON object_result_x-token
sid01URL http://cloud.linked-go.com:84/cloudservice/api/app/user/login.json
sidHeader1 Content-Type: application/json
sslArgs SSL_verify_mode,0
userattr reading01JSON requestData requestHeader1 requestHeader2 sid01Data sid01IdJSON sid01URL sidHeader1
verbose 5
Komisch. Versuche noch "reading01Name test" zu setzen.
Bei mir funktioniert folgendes:
defmod mock3 HTTPMOD https://run.mocky.io/v3/dcb44b78-8793-4011-8ed6-a2a4a5945421 0
attr mock3 reading01JSON object_result.*value
attr mock3 reading01Name testreading
READINGS:
2020-10-12 18:32:29 testreading-1 0
2020-10-12 18:32:29 testreading-10 33.0
2020-10-12 18:32:29 testreading-11 8.0
2020-10-12 18:32:29 testreading-12 35.0
2020-10-12 18:32:29 testreading-13 15.0
2020-10-12 18:32:29 testreading-14 35.0
2020-10-12 18:32:29 testreading-15 27.0
2020-10-12 18:32:29 testreading-16 33.0
2020-10-12 18:32:29 testreading-17 27.0
2020-10-12 18:32:29 testreading-18 8.5
2020-10-12 18:32:29 testreading-19 8.0
2020-10-12 18:32:29 testreading-2 1
2020-10-12 18:32:29 testreading-20 9.0
2020-10-12 18:32:29 testreading-21 0
2020-10-12 18:32:29 testreading-22 0
2020-10-12 18:32:29 testreading-23 1
2020-10-12 18:32:29 testreading-24 1
2020-10-12 18:32:29 testreading-3 1
2020-10-12 18:32:29 testreading-4 8.0
2020-10-12 18:32:29 testreading-5 0000001000000000
2020-10-12 18:32:29 testreading-6 0000000000001000
2020-10-12 18:32:29 testreading-7 0000000000000000
2020-10-12 18:32:29 testreading-8 0000000000000000
2020-10-12 18:32:29 testreading-9 0
EDIT: Eigentlich funktioniert es doch schon bei dir. Du hast nur keinen Name definiert, dann nimmt er einfach den Wert im reading01JSON Attribut als Name
Das scheint das Problem zu sein, wenn kein Name gesetzt ist. Nachdem ich nun
attr wp_detail reading01Name Detail
gesetzt habe erhalte ich bei den Readings:
READINGS:
2020-10-12 18:37:04 Detail-1 0
2020-10-12 18:37:04 Detail-10 0000000000000000
2020-10-12 18:37:04 Detail-11 1
2020-10-12 18:37:04 Detail-12 0
2020-10-12 18:37:04 Detail-13 8.0
2020-10-12 18:37:04 Detail-14 35.0
2020-10-12 18:37:04 Detail-15 1
2020-10-12 18:37:04 Detail-16 15.0
2020-10-12 18:37:04 Detail-17 35.0
2020-10-12 18:37:04 Detail-18 27.0
2020-10-12 18:37:04 Detail-19 33.0
2020-10-12 18:37:04 Detail-2 1
2020-10-12 18:37:04 Detail-20 27.0
2020-10-12 18:37:04 Detail-21 10.0
2020-10-12 18:37:04 Detail-22 10.0
2020-10-12 18:37:04 Detail-23 11.5
2020-10-12 18:37:04 Detail-24 1
2020-10-12 18:37:04 Detail-3 0
2020-10-12 18:37:04 Detail-4 33.0
2020-10-12 18:37:04 Detail-5 0
2020-10-12 18:37:04 Detail-6 0
2020-10-12 18:37:04 Detail-7 0000001000000000
2020-10-12 18:37:04 Detail-8 0000000000001000
2020-10-12 18:37:04 Detail-9 0000000000000000
Was deutlich besser ist ;) Müsste man evtl. abfangen...
Nun schaff ichs aber immer noch nicht den rename der Readings zu machen, das müsste ja eigentlich mit
attr wp_detail Detail-4Name1 Set_Temp
gehen, wenn ich das richig verstehe...
defmod mock3 HTTPMOD https://run.mocky.io/v3/dcb44b78-8793-4011-8ed6-a2a4a5945421 0
attr mock3 userattr reading01-01Name reading01-02Name reading01-03Name reading01-04Name reading01-05Name reading01-06Name reading01-07Name reading01-08Name reading01-09Name reading01-10Name reading01-11Name reading01-12Name reading01-13Name reading01-14Name reading01-15Name reading01-16Name reading01-17Name reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01-6Name reading01-7Name reading01-8Name reading01-9Name reading01AutoNumLen reading01JSON reading01Name
attr mock3 enableControlSet 1
attr mock3 reading01-01Name power
attr mock3 reading01-02Name mode
attr mock3 reading01-03Name manual-mute
attr mock3 reading01-04Name t02
attr mock3 reading01-05Name x2074
attr mock3 reading01-06Name x2075
attr mock3 reading01-07Name x2076
attr mock3 reading01-08Name x2077
attr mock3 reading01-09Name h03
attr mock3 reading01-10Name set_temp
attr mock3 reading01-11Name r08
attr mock3 reading01-12Name r09
attr mock3 reading01-13Name r10
attr mock3 reading01-14Name r11
attr mock3 reading01-15Name r01
attr mock3 reading01-16Name r02
attr mock3 reading01-17Name r03
attr mock3 reading01-1Name power
attr mock3 reading01-2Name mode
attr mock3 reading01-3Name manual-mute
attr mock3 reading01-4Name t02
attr mock3 reading01-5Name x2074
attr mock3 reading01-6Name x2075
attr mock3 reading01-7Name x2076
attr mock3 reading01-8Name x2077
attr mock3 reading01-9Name h03
attr mock3 reading01AutoNumLen 2
attr mock3 reading01JSON object_result.*value
READINGS:
2020-10-12 18:44:54 h03 0
2020-10-12 18:44:54 manual-mute 1
2020-10-12 18:44:54 mode 1
2020-10-12 18:44:54 object_result.*value-18 8.5
2020-10-12 18:44:54 object_result.*value-19 8.0
2020-10-12 18:44:54 object_result.*value-20 9.0
2020-10-12 18:44:54 object_result.*value-21 0
2020-10-12 18:44:54 object_result.*value-22 0
2020-10-12 18:44:54 object_result.*value-23 1
2020-10-12 18:44:54 object_result.*value-24 1
2020-10-12 18:44:54 power 0
2020-10-12 18:44:54 r01 27.0
2020-10-12 18:44:54 r02 33.0
2020-10-12 18:44:54 r03 27.0
2020-10-12 18:44:54 r08 8.0
2020-10-12 18:44:54 r09 35.0
2020-10-12 18:44:54 r10 15.0
2020-10-12 18:44:54 r11 35.0
2020-10-12 18:44:54 set_temp 33.0
2020-10-12 18:44:54 t02 8.0
2020-10-12 18:44:54 x2074 0000001000000000
2020-10-12 18:44:54 x2075 0000000000001000
2020-10-12 18:44:54 x2076 0000000000000000
2020-10-12 18:44:54 x2077 0000000000000000
EDIT: nicht "Detail-4Name1" sondern "reading01-4Name"
Zitat von: amenomade am 12 Oktober 2020, 17:11:13
Die Namen müssen passend zu get/readingXXJSON Attribut gesetzt werden: wenn die Readings mit reading128JSON extrahiert werden, müssen die Attribute reading128-1Name reading128-2Name definiert werden
Ok, das klappt....
In deinem Code hast du jedes Reading doppelt:
attr mock3 reading01-01Name power
attr mock3 reading01-1Name power
Einmal mit -1 und einmal mit -01 hat das ein bestimmten Grund, welches ist das richitge?
und du hast da auch readings mit der Wildcard drin, ich nehm an das ist vom testen?
Nochmals vielen Dank auf jeden Fall für die Hilfe... Evtl könnte man das mit der Wildcard und dass der Name notwendig ist dokumentiert oder abgefangen werden!!
Gruess!!
STefan
Zitat von: clumsy am 12 Oktober 2020, 18:56:15
Ok, das klappt....
In deinem Code hast du jedes Reading doppelt:
attr mock3 reading01-01Name power
attr mock3 reading01-1Name power
Einmal mit -1 und einmal mit -01 hat das ein bestimmten Grund, welches ist das richitge?
Ja sorry, die mit -01 sind falsch, hab ich vergessen zu entfernen. Richtig ist -1
Diejenige, die noch die Regex haben, sind diejenige, die gar keinen Name bekommen haben.
ich hätte noch eine Nachfrage ;)
Unterdessen funktioniert alles ziemlich gut, zumindest beim lesen... Nun bin ich an den set-kommandos. Gibt es da eine möglichkeit direkt ein "reread" zu triggern nachdem ein set befehl ausgeführt wurde, so dass er wieder die aktuellsten Werte abholt? Ich hab weder im Forum noch im Wiki und Commandref das passende gefunden... evtl. überseh ich auch was...
[EDIT]
Dann versuche ich noch "indirekte" Auflösungen von replacements zu machen, d.h. ich hab folgende Readings:
Temp_1
Temp_2
Temp_3
Soll_Temp
Mode_1
Mode_2
Mode 3
Nun habe ich ein set definiert der sowohl den modus wie die soll Temperatur setzen sollte. Das problem ist, dass ich den Wert von Temp_[1-3] benötige, jenachdem welcher Modus dass asugewählt wurde. Ichbekomme nun den $val aus der set definition nicht in die replacement funktion. versucht hab ichs folgendermassen:
attr wp_detail replacement02Mode expression
attr wp_detail replacement02Regex %%Soll_([0-9])%%
attr wp_detail replacement02Value {return(ReadingsVal("wp_detail", "Temp_$1", "0"))}
attr wp_detail set02Data Mode=Mode_$val, Soll=%%Soll_$val%%
attr wp_detail set02Name Mode
attr wp_detail set02URL http://myhost.com/set_url
Bei %%Soll_$val%% wird anscheinend $val erst nach dem replace ersezt und nciht vorher, wenn ich das richtig verstehe...
Evtl. hat mir da jemand auch noch ein tipp...
Besten Dank und Grüsse!
Es gibt keinen optimalen Weg, um ein reread nach einem set zu machen, da alle HTTP Requests asynchron laufen, und du deswegen nicht wissen kannst, wann genau das reread gemacht werden muss.
Wegen set Mode: ich würde es irgendwie so machen:
attr wp_detail set02Data %%setData%%
attr wp_detail replacement02Regex %%setData%%
attr wp_detail replacement02Value {my $value = $defs{wp_detail}->{value};; return("Mode=Mode_$value, Soll=".ReadingsVal("wp_detail", "Temp_".$value, "0"))}
Vielen Dank!!!!
Das $defs{wp_detail}->{value} war der entscheidende Hinweis, damit kann ich in den replacements auf den aktuell ausgewählten Wert des Set zugriefen!
Bez. dem reread wäre es evtl. möglich wenn set02ParseResponse gesetzt ist, darauf zu reagieren? Wobei das glaub kein event setzt, wenn ich das richtig sehe...
[EDIT]
Habs rad selbst mit einem kleinen "hack" gelöst indem ich eine weitere replacement definiere mit attr wp_detail replacement03Value {fhem("set $name reread");; return("")}
und die ans ende der setURL anhänge... damit wird ein reread gescheduled welcher ziemlich kurz danach ausgeführt wird...
Gruess und guten Endspurt ins Wochenende!
STefan
Also grundsätzlich führt nur set02ParseResponse dazu, dass das Ergebins vom set Befehl selbst geparst wird. Das ich nicht was Du willst.
Aber Du hast jetzt einen Weg gefunden ;) Ich möchte aber nur hinweisen, dass ein "set httmoddevice reread" auch asynchron gemacht wird. Heisst: Du weisst nicht, wann das Ergebnis in den Readings sichbar wird.