[erledigt] MQTT2_Device missbrauchen, geht das ?

Begonnen von TomLee, 11 Oktober 2020, 15:49:15

Vorheriges Thema - Nächstes Thema

TomLee

Hi,

steh auf dem Schlauch, weiß auch noch nicht ob ich bei der Lösung über eine Datei bleibe (geht auch über HTTPMOD), möchte jetzt aber auch wissen ob es gehen könnte.

Kann ich über die ReadingList eines MQTT2_DEVICE mit json2namevalue auch den JSON, der sich in einer lokalen Datei befindet, in Readings auflösen ?

JSON:

{"items":[{"isin":"BLI","name":"HANS","count":30,"quote_watch":3.272,"quote_current":3.18,"change_day":-3.34,"change_total":-2.80},{"isin":"BLA","name":"WURST","count":260,"quote_watch":2.591,"quote_current":2.31,"change_day":+0.11,"change_total":-10.85}]}

Meine bisherigen Gedanken dazu:
{ my ($error, @content) = FileRead({FileName => "/opt/fhem/example", ForceType => "file"});json2nameValue($content[0],'',$JSONMAP,'name|quote_current')}

Und jetzt ist die Frage wie man das mit dem ersten Parameter in ReadingList löst, in dem normal die  topic:message oder cid:topic:message Pfade angegeben werden ?

Möglich oder nicht ?

Gruß

Thomas

TomLee

So in der Art (mit at nur beispielhaft) denke ich/ist meine Wunschvorstellung sollte man einen ReadingList-Eintrag doch vornehmen können ?

Wird aber noch von der Syntaxprüfung moniert, an irgendwas denk ich aber auch bestimmt wieder nicht:

{fhem("define bla at +*00:00:30 {my ($error, @content) = FileRead({FileName => "/opt/fhem/example", ForceType => "file"})};return $content[0]"). "{json2nameValue($EVENT,'',$JSONMAP,'name|quote_current')}"}


Oder kann man die Einträge in ReadingList nicht komplett in Perl angeben ?

rudolfkoenig

Verstehe vieles nicht, vmtl. ist das hier auch sowas wie https://tty1.net/smart-questions_de.html#goal

Wenn ich rate:
define bla at +*00:00:30 {json2reading($defs{bla},`cat /opt/fhem/example`)}

TomLee

Auf die Schnelle:

Du hast schon ganz genau verstanden, sonst würdest du nicht eine fertige Lösung präsentieren wollen ( :P)

Nach meinem letzten Post kam mir wieder das Beispiel mit lmao (also json2reading, wie jetzt gezeigt) in Erinnerung, nur versteh ich jetzt wie damals wenig, muss ich mich mit beschäftigen.

Im Log steht jetzt :

2020.10.11 21:06:46 1: Error parsing >cat /opt/fhem/example< for


mit:

defmod bla at +*00:00:30 {json2reading($defs{bla},'cat /opt/fhem/example')}

setstate bla Next: 21:08:16
setstate bla 2020-10-11 21:07:46 state Next: 21:08:16


example ist ein symlink !

das userreadings in einem dummy macht was es soll:

   
bla:on { my ($error, @content) = FileRead({FileName => "/opt/fhem/quotes", ForceType => "file"}); return $content[0]}





rudolfkoenig

Wenn schon kopieren, dann bitte richtig: ` und ' haben in perl unterschiedliche Bedeutung.
Im Shell uebrigens auch.

TomLee

gezeigt hast du es mit `, damit gabs die gleiche Meldung, darum hatte ich sie geändert in  '.

Ich versuchs später nochmal, kann jetzt nicht.

herrmannj

JsonMod kann auch local files lesen und parsen.

TomLee

So.

Hab vorsichtshalber nochmal ein update gemacht.

Wenn ich ' verwende steht 2020.10.11 23:00:59 1: Error parsing >cat /opt/fhem/example< for im Log.

mit ` cat: /opt/fhem/example: Datei oder Verzeichnis nicht gefunden
2020.10.11 23:03:55 1: Error parsing >< for


Ich weiß jetzt gerade auch nicht was ich mehr dazu sagen soll.

Nochmals bspw. die Definition mit `:

defmod bla at +*00:00:30 {json2reading($defs{bla},`cat /opt/fhem/example`)}

setstate bla Next: 23:07:25
setstate bla 2020-10-11 23:06:55 state Next: 23:07:25




Zitat
JsonMod kann auch local files lesen und parsen.

Ja. Danke. Aus dem Bauchgefühl dacht ich mir das zuvor auch schon, muss mich mal mit beschäftigen.

TomLee

#8
 8)

Habs. Es darf kein symlink sein. Wenn ich auf eine Datei direkt zugreife klappts.

Danke Dir.

Sehr cool !

Es bleibt aber bei einer Fehlermeldung:

2020.10.11 23:29:29 1: Error parsing >+0.11,"change_total":-10.85< for change_day

rudolfkoenig

"cat filename" kann den Inhalt ueber Symlink lesen (das ist der Sinn eines Symlinks), das Problem muss anderswo liegen, z.Bsp. Symlink nicht da oder zeigt nicht richtig.


Nach https://www.json.org/json-en.html ist +0.11 nicht gueltig, + darf nur im Exponent vorkommen.

TomLee

Das mit der Verküpfung hab ich eigentlich nur für mich zum Verständnis gemacht, mir war bisher nicht klar das man nur die Berechtigungen der Verknüpfungen anpassen muss um auf eine Datei zuzugreifen die einem anderen User ist.
Zitat
Symlink nicht da oder zeigt nicht richtig.

Darum hatte ich oben gleich erwähnt das der Zugriff über die Verknüpfung aus einem userReadings mit Fileread problemlos klappt:

defmod du_WatchList dummy
attr du_WatchList setList on off
attr du_WatchList userReadings bla:on { my ($error, @content) = FileRead({FileName => "/opt/fhem/example", ForceType => "file"});; return $content[0]}

setstate du_WatchList on
setstate du_WatchList 2020-10-12 13:36:07 bla {"items":[{"isin":"BLI","name":"HANS","count":30,"quote_watch":3.272,"quote_current":3.18,"change_day":-3.34,"change_total":-2.80},{"isin":"BLA","name":"WURST","count":260,"quote_watch":2.591,"quote_current":2.31,"change_day":+0.11,"change_total":-10.85}]}
setstate du_WatchList 2020-10-12 13:36:07 state on


So sieht die Verknüpfung aus:

lrwxrwxrwx  1 fhem dialout     48 Okt 11 14:09 example -> /home/pi/bli-bla-stock-scraper/data/example.json

So die Zieldatei:

-rw-r--r-- 1 pi pi 289 Okt 11 14:04 example.json





In der fhem.pl sehe (aber nicht vestehe) ich an sechster stelle was von filter.

Wenn das wirklich gehen sollte, umginge man dann die Meldung Error parsing >+0.11,"change_total":-10.85< for change_day oder kommt die dann trotzdem, brauchen würd ich die zwei Werte vermutlich eh nicht, oder bleibt dann bloss verbose 1|2 ?

weil so mit '

+*00:00:30 {json2reading($defs{bla},`cat /opt/fhem/example.json`,'','','','isin|name|quote_current|count')}

oder auch mit " klappts bisher nicht, dann steht im Log:

2020.10.12 13:25:04 1: Error parsing >+0.11,"change_total":-10.85< for change_day
2020.10.12 13:25:04 1: ERROR evaluating {json2reading($defs{bla},`cat /opt/fhem/example.json`,"","","","isin|name|quote_current|count")}: Can't use string ("") as a HASH ref while "strict refs" in use at fhem.pl line 5303.

rudolfkoenig

ZitatWenn das wirklich gehen sollte, umginge man dann die Meldung
Das geht zwar wirklich, aber erst _nachdem_ ein Feld samt Wert erfolgreich identifiziert wurde.
Und das geht in deinem Fall schief wegen kaputten JSON. Ich weiss nicht, ob andere Parser da toleranter sind, oder ob ich meinem "Parser" das + beibringen soll, obwohl es nicht dem Spec entspricht. Bin z.Zt. noch dagegen.

TomLee

Und das geht in deinem Fall schief wegen kaputten JSON.

Komm noch nicht ganz mit jetzt. Der JSON ist kaputt wegen dem + richtig ? auch wegen dem - ?
egal, weil ich hab die Zeichen einfach mal entfernt um zu schauen ob filter dann greift.

{"items":[{"isin":"BLI","name":"HANS","count":30,"quote_watch":3.272,"quote_current":3.18,"change_day":3.34,"change_total":2.80},{"isin":"BLA","name":"WURST","count":260,"quote_watch":2.591,"quote_current":2.31,"change_day":0.11,"change_total":10.85}]}


Weder
defmod bla at +*00:00:30 {json2reading($defs{bla},`cat /opt/fhem/example.json`,'','','','isin|name|quote_current|count')}
noch
defmod bla at +*00:00:30 {json2reading($defs{bla},`cat /opt/fhem/example.json`,"","","","isin|name|quote_current|count")}
greift.

Die Meldungen sind mit ' und " gleich.
Erste Meldung mit ', zweite mit ":

2020.10.12 14:49:25 1: ERROR evaluating {json2reading($defs{bla},`cat /opt/fhem/example.json`,'','','','isin|name|quote_current|count')}: Can't use string ("") as a HASH ref while "strict refs" in use at fhem.pl line 5303.

2020.10.12 14:49:25 3: bla: Can't use string ("") as a HASH ref while "strict refs" in use at fhem.pl line 5303.

2020.10.12 14:50:24 1: ERROR evaluating {json2reading($defs{bla},`cat /opt/fhem/example.json`,"","","","isin|name|quote_current|count")}: Can't use string ("") as a HASH ref while "strict refs" in use at fhem.pl line 5303.

2020.10.12 14:50:24 3: bla: Can't use string ("") as a HASH ref while "strict refs" in use at fhem.pl line 5303.




Zitat
Bin z.Zt. noch dagegen

wegen meinem Beispiel muss man da auch gar nix ändern daran, mir gefällt die Lösung die Werte über diesen "Scraper" (Script oder wie auch immer man das Programm nennt über das ich diese Datei erhalte) eigentlich gar nicht (bis jetzt), HTTPMOD sagt mir da mehr zu (mein ich, bis jetzt).

rudolfkoenig

Die Meldungen sind mit ' und " gleich.
" verwendet man, wo man Variablenersetzung haben will, und ' wo man das vermeiden will. Als Leerstring sind "" und '' identisch.
Parameter #4 ist ein Hashzeiger, und falls man es nicht spezifizieren will, muss als undef oder als {} uebergeben werden:
{json2reading($defs{bla},`cat /opt/fhem/example.json`,"",undef,"","isin|name|quote_current|count")}

TomLee

Danke, auch für die erweiterten Erläuterungen.

So klappts jetzt, wenn der JSON korrekt wäre (ohne Plus).

Auch mit der Verknüpfung.




An einen anderen Adressaten:

Zitat" verwendet man, wo man Variablenersetzung haben will, und ' wo man das vermeiden will.

Aha, les ich jetzt hier raus das man sie schon auch verwenden darf (die ", wenn man eine Variable angibt) wenn man möchte oder auch weg lassen, sonst gäbs die Regel ja nicht.
unnötig (wie ich mir hab vorwerfen lassen müssen vor ein paar Wochen) damals vermutlich die falsche Wortwahl gewesen, wenn man sie verwendet !?