[98_JsonMod.pm] Wunschliste von neuen Funktionen

Begonnen von yersinia, 24 Mai 2020, 14:46:22

Vorheriges Thema - Nächstes Thema

yersinia

Hallo zusammen,

herrmannjs Modul zum Auslesen von JSON[P] Quellen ermöglicht vielerlei neue Optionen. Weiterhin gibt es auch neue Ideen - wie zB die Interval Definition in Anlehnung an cron(tab).
Hier eine Auswahl an bereits bestehenden Anwendungsideen:

FHEM-Wiki Eintrag: JsonMod.

Natürlich ist das Modul noch jung und sicher Ausbaufähig. Bei der Benutzung des Moduls haben sich bei mir folgende Wünsche ergeben - bzw. habe ich folgende Funktionen vermisst.
  • Status-Ausgabe (error, success), raw (Thread)
  • Herausfiltern von spezifischen Array-Elementen (Thread, Thread und Thread)
  • HTTP Version einstellbar (#20)
  • Templates analog zu httpmod und mqtt (post)
Habt ihr noch weitere Ideen oder Wünsche? Wie ist der sonstige Bedarf? Gibt es noch Dinge/Funktionen zu verbessern?

@herrmannj: wie stehen die Chancen, dass du noch Erweiterungen und Verbesserungen (jeweils bei Bedarf) einfliessen lassen kannst?

Danke vorab. :)

Stand: 2024-03-18


Bereits umgesetzte, gewünschte Funktionen (Danke an herrmannj!):
  • Nachbearbeiten von gefundenen Readingnamen mit Perlfunktionen wie uc() oder lc() bevor sie erstellt werden (oder Readings standardmässig in uc/lc schreiben). Es gibt bereits Funktionen wie [tt]JsonPathf[/tt] oder [tt]propertyf[/tt], die gefundene Werte limitiert konvertieren können.
    implementiert mit Revision 22651 - Änderungen siehe auch im Post #8 vom Beta-Test
  • WebCmd Funktionen wie zB ein reread, analog zu HTTPMOD
    implementiert mit Revision 22651 - Änderungen siehe auch im Post #8 vom Beta-Test
  • Die optionale Möglichkeit, einen Json[P] String komplett extrahieren zu können anstelle manuell mehrere [tt]single()[/tt] JsonPath Elemente als readingList definieren zu müssen (analog zu HTTPMODs ExtractAllJson)
    implementiert mit Revision 22651 - Änderungen siehe auch im Post #8 vom Beta-Test
  • Aggregat-Funktionen wie avg() oder sum() (Anforderung von All-Ex)
    implementiert mit Revision 22651 - Änderungen siehe auch im Post #8 vom Beta-Test
  • kleinere Abfragezeiten als 1 Minute (Anforderung von Rewe2000)
    Zitat von: herrmannj am 25 Juli 2020, 12:59:00Am cron habe ich nichts geändert weil man jetzt in dem angefragten, exotischen ;) Fall (Zeiten unter einer Minute) alternativ ein "at" verwenden kann. Dort dann reread aufrufen.
  • Ersetzen und Umrechnen von Werten (Anforderung von Rewe2000)
    implementiert mit Revision 22651 - Änderungen siehe auch im Post #8 vom Beta-Test
  • maintainer.txt anpassen (#22)
    implementiert mit Revision 24361
  • Suchen und Herausfiltern von bestimmten Elementen (Thread)
    implementiert mit Revision 24360 - weitere Infos
  • enable/disable Funktion (post von FHEMAN (#27))
    Attribut disable ist implementiert
  • Mitgeben von dynamischen parametern in der Url, analog zu HTTPMOD (Thread von Otto123)
    Ist implementiert als [tt]secret[/tt] - Beitrag von hermannj
    Zitat von: herrmannj am 10 Juni 2021, 22:25:44man kann set <name> secret <identifier> <value> dafür nehmen. Anstelle von <identifier> halt IP und in der URL dann ..[IP].. einfügen. Will man die IP wechseln dann per "secret" setzen.
    Zitat von: herrmannj am 11 Juni 2021, 09:31:49Es kann mehrere benannte secrets geben - das eine schließt das andere also auch nicht aus
  • verschiedene Bedingungen/logische Verknüpfungen in einer JsonPath Abfrage (post)
    Umsetzung wäre zu aufwändig (post).
  • Support für POST requests (Thread & patch)
    gelöst durch https://forum.fhem.de/index.php?topic=133765.msg1277381#msg1277381
  • korrekte Implementierung des Intervals auch für Wochentage (Thread, weitere cron-Themen: Thread)
    implementiert mit Revision 27916
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

herrmannj

Moin,
Zitat
@herrmannj: wie stehen die Chancen, dass du noch Erweiterungen und Verbesserungen (jeweils bei Bedarf) einfliessen lassen kannst?
Klar :) (disclaimer: ich bin die kommenden 3-4 Wochen "ausgebucht", danach gern)

ZitatNachbearbeiten von gefundenen Readingnamen mit Perlfunktionen wie uc() oder lc() bevor sie erstellt werden (oder Readings standardmässig in uc/lc schreiben). Es gibt bereits Funktionen wie JsonPathf oder propertyf, die gefundene Werte limitiert konvertieren können
Das ist leider progammiertechnisch nicht trivial. Aktuell muss ich jede funktion einzeln implementieren. Auf Dauer würde das absehbar nicht skalieren. Dafür muss ich mir was cleveres einfallen lassen. Generell: klar
ZitatWebCmd Funktionen wie zB ein reread, analog zu HTTPMOD
check!
ZitatDie optionale Möglichkeit, einen Json[P] String komplett extrahieren zu können anstelle manuell mehrere single() JsonPath Elemente als readingList definieren zu müssen (analog zu HTTPMODs ExtractAllJson)
Aktuell ist die Abgrenzung zu HttpMod ja dass man gezieht auf einzelne Elemente des JSON zugreift, aber "ja", lässt sich einfach implementieren.

vg
Joerg

yersinia

Zitat von: herrmannj am 25 Mai 2020, 14:25:46Moin,Klar :) (disclaimer: ich bin die kommenden 3-4 Wochen "ausgebucht", danach gern)
Gut zu wissen. Danke. :)
Zitat von: herrmannj am 25 Mai 2020, 14:25:46Das ist leider progammiertechnisch nicht trivial. Aktuell muss ich jede funktion einzeln implementieren. Auf Dauer würde das absehbar nicht skalieren. Dafür muss ich mir was cleveres einfallen lassen. Generell: klar
Mir würde es schon reichen, wenn ich die Funktionen aufrufen könnte. In etwa so:
multi(jsonPath('$[*]'), lc(property('type')), property('version'));
Zitat von: herrmannj am 25 Mai 2020, 14:25:46Aktuell ist die Abgrenzung zu HttpMod ja dass man gezieht auf einzelne Elemente des JSON zugreift, aber "ja", lässt sich einfach implementieren.
Daher das optional - ich hab zumindest den Bedarf, kleinere JSON Strings dann dynamischer auszulesen (pihole statistiken als Beispiel). ;)

Vielen Dank für deine Rückmeldung. Dann bin ich gespannt was nach deiner ausgebuchten Zeit noch kommt. :)
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

herrmannj

Zitatmulti(jsonPath('$
  • '), lc(property('type')), property('version'));
Wenn lc/uc ausreicht (wir hatten da ja schonmal drüber gesprochen), dann brauch ich keine Klimmzüge zu machen und kann das "einfach" implementieren.

yersinia

Zitat von: herrmannj am 25 Mai 2020, 15:17:15Wenn lc/uc ausreicht (wir hatten da ja schonmal drüber gesprochen), dann brauch ich keine Klimmzüge zu machen und kann das "einfach" implementieren.
Also mir würde das erstmal reichen. Auch gern sowas wie
propertyf('type', lc())
Damit macht es mir den eq3 fw check einfacher.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

yersinia

Beta-Tester gesucht (aus diesem Thread):
Zitat von: herrmannj am 21 Juli 2020, 12:27:59
Weil wir einmal dabei sind; damit die Wünsche umgesetzt werden können muss ich einen Teil des Moduls neu schreiben (der Block wo multi und singe definiert ist), Ich versuche dass das kompatibel zum jetzigen Verhalten ist. Weil ich aber Nebeneffekte nicht komplett ausschließen kann würde ich das gern vorab zum testen in den "JsonMod Wunschthread" und erst danach ins update geben.

Wer Interesse hat, abonniert doch schon mal bitte den "JsonMod Wunschthread" um die Beta dann zu sehen und, im Idealfall, dann auch zu testen. Wird so im Lauf der Woche werden.

Danke, vg
Joerg
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Rewe2000

Hallo,

danke für die Mühe, bin gerne bereit zu testen.

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

herrmannj

#8
Im Anhang ein update welches einen Teil der gewünschten Funktionen bereitstellt.

Ich musste einiges umschreiben und möchte mit dieser Version die Sicherheit haben, dass die Änderungen abwärtskompatibel sind bevor ich sie ins fhem svn gebe.

Änderungen:
- set reread (selbsterklärend)

zu "single(...)" und "multi(...)" kommt "complete()". "complete()" wandelt das komplette json in readings. Die Namen der Readings werden automatisch erstellt und entsprechen der Position im json. Will meinen das der JsonPath Ausdruck der zu dem ein Element gehört in den Namen des readings konvertiert wird.

Beispiel:
JsonPath -> "$.data[0].temperature.celsius"
Reading -> "data.0.temperature.celsius"

Innerhalb von single(...) und multi(...) können ab jetzt beliebige perl Funktionen und Ausdrücke verwendet werden.

Beispiele:
"uc(property('foo')), ..." (Groß- Kleinschreibung)
"sprintf('foo: %.2f', property('foo') / 100), ..."  (Werte skalieren und auf 2 Dezimalstellen runden)
"POSIX::strftime('%Y-%m-%d %H:%M', gmtime(property('updated')/1000))), ..." (Wandelt einen timestamp in ein lesbares Datum)

Ersetzen und Umrechnen von Werten (Anforderung von Rewe2000): Weil jetzt beliebige perl Ausdrücke verwendet werden können problemlos. Ich würde mir eine kleine Funktion in eine 99.my.. schreiben, zum Beispiel

sub convELWA {
  my $val = shift;
  my $lookup = {
    '1' => 'Betriebsbereit',
  };
  if (exists($lookup->{$val}) {
    return $lookup->{$val};
  } else {
    return $val;
  };
};


und dann im JsonMod "convELWA(property('...')), ..." verwenden.

Um auf die Nummer von array Elementen zu zugreifen hatte ich "index()" implementiert. Das war unklug weil es index() als perl (String) Funktion gibt. Ich habe das daher durch "count()" ersetzt. "index()" kann noch verwendet werden, erzeugt aber eine Log Meldung (Fehler) mit der Bitte den Ausdruck durch "count()" zu ersetzen.

Am cron habe ich nichts geändert weil man jetzt in dem angefragten, exotischen ;) Fall (Zeiten unter einer Minute) alternativ ein "at" verwenden kann. Dort dann reread aufrufen.

Mit der Bitte um Feedback, insbesondere im Hinblick auf Abwärts Kompatibilität

Danke, vg
Joerg

Rewe2000

#9
Hallo Jörg,

vielen Dank, dass du die Änderungen so schnell umgesetzt hast.

Leider kann ich die Abwärtskompatibilität nicht testen, da ich dein Modul erst mit dieser Anwendung neu verwende.
Bisher konnte ich in meiner Installation keine Abweichungen erkennen, das Modul läuft bei mir so wie es soll.

Grundsätzlich habe ich (als einfacher Anwender) aber noch Probleme die neuen Funktionen in die readinglist mit einzubauen, könntest du bitte noch ein Beispiel mit angeben wie ich z.B. das sprintf() in die komplette Syntax korrekt mit einbinden muss.
Die Funktion in 99_myutils.pm habe ich erstellt, diese selbst funktioniert (getestet mit userreading), aber wie ich den Aufruf direkt aus der readinglist durchführe, da brauche ich noch einen Denkanstoss.

JsonMod Modul:
defmod AC_ELWA_E JsonMod http://192.168.50.55/data.jsn
attr AC_ELWA_E DbLogExclude .*
attr AC_ELWA_E disable 0
attr AC_ELWA_E icon sani_boiler_temp
attr AC_ELWA_E interval */1 * * * *
attr AC_ELWA_E readingList single(jsonPath('$.device'), 'Geraet', 'N/A');;\
single(jsonPath('$.fwversion'), 'Firmwareversion', 'N/A');;\
single(jsonPath('$.status'), 'Status', 'N/A');;\
single(jsonPath('$.power'), 'Leistung', 'N/A');;\
single(jsonPath('$.temp1'), 'Speicher_Istwert', 'N/A');;\
single(jsonPath('$.ww1target'), 'Speicher_Sollwert', 'N/A');;\
single(jsonPath('$.ctrlstate'), 'Status_Ansteuerung', 'N/A');;\
single(jsonPath('$.tempchip'), 'Prozessortemperatur', 'N/A');;
attr AC_ELWA_E room Hauskraftwerk
attr AC_ELWA_E userReadings Status_Text {convELWA (ReadingsNum($name,"Status",0))}

setstate AC_ELWA_E 2020-07-26 11:37:00 .computedReadings Status,Speicher_Istwert,Leistung,Prozessortemperatur,Geraet,Firmwareversion,Status_Ansteuerung,Speicher_Sollwert
setstate AC_ELWA_E 2020-07-26 11:37:00 Firmwareversion 00200.01
setstate AC_ELWA_E 2020-07-26 11:37:00 Geraet AC ELWA-E
setstate AC_ELWA_E 2020-07-26 11:37:00 Leistung 0
setstate AC_ELWA_E 2020-07-26 11:37:00 Prozessortemperatur 30
setstate AC_ELWA_E 2020-07-26 11:37:00 Speicher_Istwert 235
setstate AC_ELWA_E 2020-07-26 11:37:00 Speicher_Sollwert 526
setstate AC_ELWA_E 2020-07-26 11:37:00 Status 3
setstate AC_ELWA_E 2020-07-26 11:37:00 Status_Ansteuerung Modbus Read received
setstate AC_ELWA_E 2020-07-26 11:37:00 Status_Text Standby



Funktion:

sub convELWA {
  my $val = shift;
  my $lookup = {
    '2' => 'Heizen',
'3' => 'Standby',
'4' => 'Boost Mode',
'5' => 'Temperatur erreicht',
'9' => 'Setup Modus',
'21' => 'Abgeschaltet',
'201' => 'Temperatursicherung ausgelöst',
'202' => 'Übertemperatur Warmwasser',
'203' => 'Übertemperatur Elektronik',
'204' => 'Hardwarefehler',
'205' => 'Temperatursensor angesprochen',
  };
  if (exists($lookup->{$val})) {
    return $lookup->{$val};
  } else {
    return $val;
  }
}


JSON Rohdaten:
{
"device":"AC ELWA-E",
"status":3,
"power":0,
"temp1":235,
"boostactive":0,
"loctime":"11:44:14",
...
...
...
"tempchip":30
}


Der Umweg eines zeitlich kürzeren Aufrufs über reread und ein at ist eine Lösung für meinen Awendungsfall.
Ich denke aus Sicht der Ressourcenschonung sollte ich hier 2 JosonMod Module verwenden und nur das eine Modul, mit dem einen Reading in z.B. 5 Sekunden mit reread antriggern und das zweite mit cron z.B. alle 5 Minuten die restlichen Readings zu holen. Oder ist es besser nur ein Modul zu verwenden und in dieser kurzen Zeit alle Daten (max. 10 Readings) auszulesen?

Auch fehlt mir generell noch das Gefühl dafür, weshalb man hier besser JosonMod und nicht gleich das HTTPMOD Modul verwenden sollte.

Ich hoffe du verzeihst mir die blöden Fragen, aber ich denke zukünftig werden diese auch noch von anderen Anfängern gestellt.

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

herrmannj

Moin,

Status;
single(jsonPath('$.status'), 'Status', 'N/A') -> single(convELWA(jsonPath('$.status')), 'Status', 'N/A')

Temperatur:
single(jsonPath('$.temp1'), 'Speicher_Istwert', 'N/A')
  -> single(jsonPath('$.temp1') / 10, 'Speicher_Istwert', 'N/A')
- oder -
  -> single(sprintf('%.1f °C', jsonPath('$.temp1') / 10), 'Speicher_Istwert', 'N/A')

(*ungetestet)

Interval:
5 Sekunden sind insgesamt ein häufiger Interval. Nimm ein device, die CPU Zeit ist nicht linear zur Anzahl der Readings.

HTTPMOD oder JsonMod:
your choice. JsonMod ist HTTPMOD speziell für JSON Quellen.
vg
Joerg

yersinia

#11
Danke, herrmannj, geile Sache. Hab es mal getestet auf einem FHEM mit heutigem Update. Abwärtskompatibilität sieht erstmal gut aus, ich lass' das jetzt mal laufen.
Zitat von: herrmannj am 25 Juli 2020, 12:59:00
Änderungen:
- set reread (selbsterklärend)
Funktioniert, auch bei bestehenden JsonMod-Devices.

Zitat von: herrmannj am 25 Juli 2020, 12:59:00
zu "single(...)" und "multi(...)" kommt "complete()". "complete()" wandelt das komplette json in readings. Die Namen der Readings werden automatisch erstellt und entsprechen der Position im json. Will meinen das der JsonPath Ausdruck der zu dem ein Element gehört in den Namen des readings konvertiert wird.
Funktioniert, hier mit piHole getestet:
Internals:
   API_LAST_RES 1595774400.02556
   API__LAST_MSG 200
   CFGFN     
   DEF        http://[piholeip]/admin/api.php
   FUUID      5f1d9524-f33f-3151-9e28-e0d67637d24d81c2
   NAME       PiHoleInfo_JM
   NEXT       2020-07-26 16:45:00
   NOTIFYDEV  global
   NR         554
   NTFY_ORDER 50-PiHoleInfo_JM
   SOURCE     http://[piholeip]/admin/api.php (200)
   STATE      <div style="text-align:left;"><font style="color:limegreen;">5632&nbsp;<font style="font-weight:bold;">DNS Anfragen heute</font></font><br /><font style="color:DarkOrange;">654&nbsp;<font style="font-weight:bold;">Geblockte Domains heute</font>&nbsp;(11.6%)</font><br />2436785&nbsp;Domains in Blocklist&nbsp;(Alter:&nbsp;0&nbsp;12:37)</div>
   SVN        Testversion 2020-07-23 13:00 $
   TYPE       JsonMod
   .attraggr:
   .attrminint:
   CONFIG:
     IN_REQUEST 0
     SOURCE     http://[piholeip]/admin/api.php
     SECRET:
   READINGS:
     2020-07-26 16:40:00   .computedReadings privacy_level,gravity_last_updated.relative.days,unique_domains,gravity_last_updated.relative.minutes,gravity_last_updated.file_exists,gravity_last_updated.relative.hours,dns_queries_all_types,gravity_last_updated.absolute,queries_forwarded,reply_NXDOMAIN,reply_NODATA,clients_ever_seen,ads_blocked_today,reply_IP,queries_cached,status,reply_CNAME,domains_being_blocked,dns_queries_today,unique_clients,ads_percentage_today
     2020-07-26 16:40:00   ads_blocked_today 654
     2020-07-26 16:40:00   ads_percentage_today 11.612216
     2020-07-26 16:40:00   clients_ever_seen 2
     2020-07-26 16:40:00   dns_queries_all_types 5632
     2020-07-26 16:40:00   dns_queries_today 5632
     2020-07-26 16:40:00   domains_being_blocked 2436785
     2020-07-26 16:40:00   gravity_last_updated.absolute 1595728963
     2020-07-26 16:40:00   gravity_last_updated.file_exists 1
     2020-07-26 16:40:00   gravity_last_updated.relative.days 0
     2020-07-26 16:40:00   gravity_last_updated.relative.hours 12
     2020-07-26 16:40:00   gravity_last_updated.relative.minutes 37
     2020-07-26 16:40:00   privacy_level   0
     2020-07-26 16:40:00   queries_cached  1389
     2020-07-26 16:40:00   queries_forwarded 3589
     2020-07-26 16:40:00   reply_CNAME     963
     2020-07-26 16:40:00   reply_IP        2792
     2020-07-26 16:40:00   reply_NODATA    119
     2020-07-26 16:40:00   reply_NXDOMAIN  61
     2020-07-26 16:40:00   status          enabled
     2020-07-26 16:40:00   unique_clients  2
     2020-07-26 16:40:00   unique_domains  1496
Attributes:
   interval   */5 * * * *
   readingList complete();
   stateFormat { my $ret = '<div style="text-align:left;">';
$ret .= '<font style="color:limegreen;">'.ReadingsVal($name,'dns_queries_today','-');
$ret .= '&nbsp;<font style="font-weight:bold;">DNS Anfragen heute</font></font><br />';
$ret .= '<font style="color:DarkOrange;">'.ReadingsVal($name,'ads_blocked_today','-');
$ret .= '&nbsp;<font style="font-weight:bold;">Geblockte Domains heute</font>';
$ret .= '&nbsp;('.sprintf("%.1f", ReadingsNum($name,'ads_percentage_today',0)).'%)</font><br />';
$ret .= ReadingsVal($name,'domains_being_blocked','-').'&nbsp;Domains in Blocklist';
$ret .= '&nbsp;(Alter:&nbsp;';
$ret .= ReadingsVal($name,'gravity_last_updated.relative.days','-').'&nbsp;';
$ret .= ReadingsVal($name,'gravity_last_updated.relative.hours','-').':';
$ret .= ReadingsVal($name,'gravity_last_updated.relative.minutes','-').')';
$ret .= '</div>';
return $ret;
}
   webCmd     reread


Zitat von: herrmannj am 25 Juli 2020, 12:59:00Innerhalb von single(...) und multi(...) können ab jetzt beliebige perl Funktionen und Ausdrücke verwendet werden.

Beispiele:
"uc(property('foo')), ..." (Groß- Kleinschreibung)
"sprintf('foo: %.2f', property('foo') / 100), ..."  (Werte skalieren und auf 2 Dezimalstellen runden)
"POSIX::strftime('%Y-%m-%d %H:%M', gmtime(property('updated')/1000))), ..." (Wandelt einen timestamp in ein lesbares Datum)
Funktioniert, getestet im HM-FW Check mit uc() und lc():
attr HM_FW_Check readingList multi(jsonPath('$[*]'), uc(property('type')), property('version'));;

Zitat von: herrmannj am 25 Juli 2020, 12:59:00Um auf die Nummer von array Elementen zu zugreifen hatte ich "index()" implementiert. Das war unklug weil es index() als perl (String) Funktion gibt. Ich habe das daher durch "count()" ersetzt. "index()" kann noch verwendet werden, erzeugt aber eine Log Meldung (Fehler) mit der Bitte den Ausdruck durch "count()" zu ersetzen.
Funktioniert. Sowohl die Warning im Log als auch count() anstelle von index(). Ich frage mich, ob count() hier die richtige Wahl ist - wäre nicht readingsIndex() oder irgendwas anderes, JsonMod-spezifisches besser? (count ist ja irgendwie auch vorbelegt und ersetzt index nicht wirklich mMn)

Zitat von: herrmannj am 25 Juli 2020, 12:59:00Am cron habe ich nichts geändert
Aber Wochentag-Definition ignoriert interval immernoch?

Ansonsten: DANKE!!! :D
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

herrmannj

Danke fürs Feedback!

zu count, stimmt schon, auch noch nicht komplett optimal. Ich nehme mal idx|idx().

Wochentage: geht halt nicht alles auf einmal ;)

Zum piHole: da würde noch folgender 'Hack' gehen; wenn Du nach complete() noch eine Zeile single(POSIX::strftime('%Y-%m-%d %H:%M', gmtime(jsonPath ('$.gravity_last_updated.absolute')), 'gravity_last_updated.absolute', undef);einbaust, müsste sich der ts formatieren lassen. (*ungetestet)

vg
Joerg

yersinia

#13
Zitat von: herrmannj am 27 Juli 2020, 15:14:18zu count, stimmt schon, auch noch nicht komplett optimal. Ich nehme mal idx|idx().
Ja, das klingt besser. :)

Zitat von: herrmannj am 27 Juli 2020, 15:14:18Wochentage: geht halt nicht alles auf einmal ;)
Kein Stress. War nur eine Frage. Und ist -für mich- auch nicht dringend. ;)

Zitat von: herrmannj am 27 Juli 2020, 15:14:18Zum piHole: da würde noch folgender 'Hack' gehen; wenn Du nach complete() noch eine Zeile single(POSIX::strftime('%Y-%m-%d %H:%M', gmtime(jsonPath ('$.gravity_last_updated.absolute')), 'gravity_last_updated.absolute', undef);einbaust, müsste sich der ts formatieren lassen. (*ungetestet)
Danke für den Tipp, funktioniert mit:
single(POSIX::strftime('%Y-%m-%d %H:%M', gmtime(jsonPath ('$.gravity_last_updated.absolute'))), 'gravity_last_updated_abs_human', '');
->
2020-07-27 17:00:00   gravity_last_updated_abs_human 2020-07-26 02:02
Soweit hatte ich noch gar nicht gedacht neben complete auch noch single() (oder gar multi()) zu nutzen - was aber durchaus sinnvoll ist um einige Readings zusätzlich umzurechnen. :)
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

herrmannj

Ohne das _hum sollte das funktionieren. Dann würde das Reading das complete generiert theoretisch einfach überschrieben werden