98_CustomReadings.pm

Begonnen von P.A.Trick, 31 August 2014, 16:30:11

Vorheriges Thema - Nächstes Thema

P.A.Trick

@HCS: Wenn du planst das Modul offiziell einzuchecken dann habe ich noch einen Hinweis für dich!

Use of uninitialized value $value in substitution (s///) at ./FHEM/98_CustomReadings.pm line 54.

Vielen Dank im Voraus!
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

HCS

#1
Dies ist der Diskussions-Thread für das Modul 98_CustomReadings.

Er enthält die Entstehungsgeschichte und die aktuelle Diskussion über das Modul.

Die Dokumentation zum aktuellen Stand (die sollte man zuerst anschauen, bevor man diesen Thread durcharbeitet) findet man hier:

wiki: http://www.fhemwiki.de/wiki/CustomReadings
commandref: http://fhem.de/commandref.html#CustomReadings
Ankündigung: http://forum.fhem.de/index.php/topic,26810.0.html

P.A.Trick

Ja bei genialen einfachen Modulen bleibe ich penetrant :-) Bitte bitte einchecken ;-)

Ich habe ein Skript dahinter welches einen Sync-Job auf meinem NAS beobachtet!

Internals:
   CHANGED
   NAME       cr_trinity_rsync
   NR         1057
   STATE      no
   TYPE       CustomReadings
   Readings:
     2014-09-02 21:46:38   rsyncRunning    no
Attributes:
   event-on-change-reading .*
   interval   120
   readingDefinitions rsyncRunning:qx(/opt/fhem/check_sync_server.sh 2>&1)
   room       _CustomReadings
   stateFormat rsyncRunning


Hier noch das Skript:

#!/bin/bash

RESULT=$(ps -ef | grep anon|grep rsync|wc -l)
if [ "$RESULT" -gt 0 ];then
RUNNING=yes
else
RUNNING=no
fi
echo $RUNNING

Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

HCS

Dein Script ist auch in der Lage nichts (also weder yes noch no) zu liefern. Ich vermute mal, dass es dann passiert.
Ich versuche es nachzustellen und schaue danach.

Bin mir aber auch nicht ganz sicher, welche Version Du hast.
Ich hänge meine aktuelle Version mal hier an.

Könntest mir zwei Gefallen tun:
Schau mal, ob der Fehler mit dieser Version weg ist
Schau Dir mal den commandref-Teil an, ob man damit versteht, wie es funktioniert.


Hier die commandref (haut mit der Formatierung hier nicht ganz hin, in echt ist es hübscher, siehe cr.jpg):

CustomReadings

    FHEM module to define own readings.

    This module allows to define own readings. The readings can be defined in an attribute so that they can get changed without changing the code of the module.
    To use this module you should have some perl and linux knowledge
    The examples presuppose that you run FHEM on a linux machine like a Raspberry Pi or a Cubietruck.
    Note: the "bullshit" definition is an example to show what happens if you define bullshit :-)

    Example (definition in fhem.cfg)
    define myReadings CustomReadings
    attr myReadings room 0-Test
    attr myReadings interval 2
    attr myReadings readingDefinitions hdd_temperature:qx(hddtemp /dev/sda 2>&1) \
    ac_powersupply_voltage:qx(cat /sys/class/power_supply/ac/voltage_now 2>&1) / 1000000 \
    ac_powersupply_current:qx(cat /sys/class/power_supply/ac/current_now 2>&1) / 1000000 \
    perl_version:$] \
    timezone:qx(cat /etc/timezone 2>&1) \
    kernel:qx(uname -r 2>&1) \
    device_name:$hash->{NAME} \
    bullshit: $hash->{bullshit} \
    fhem_backup_folder_size:qx(du -ch /opt/fhem/backup | grep total | cut -d 't' -f1 2>&1)

    Resulting readings:
    ac_powersupply_current 0.236 2014-08-09 15:40:21
    ac_powersupply_voltage 5.028 2014-08-09 15:40:21
    bullshit ERROR 2014-08-09 15:40:21
    device_name myReadings 2014-08-09 15:40:21
    fhem_backup_folder_size 20M 2014-08-09 15:40:21
    hdd_temperature /dev/sda: TS128GSSD320: 47°C 2014-08-09 15:40:21
    kernel 3.4.103-sun7i+ 2014-08-09 15:40:21
    perl_version 5.014002 2014-08-09 15:40:21
    timezone Europe/Berlin 2014-08-09 15:40:21

    Define
    define <name> CustomReadings

    Readings
    As defined

    Attributes
        interval
        Refresh interval in seconds

        readingDefinitions
        Each line represents a definition for a reading. A definition consists of two parts, separated by a colon.
        All lines (except the last one) must end with a backslash
        The first part is the name of the reading and the second part the function.
        The function gets evaluated and must return a result.

        Example: kernel:qx(uname -r 2>&1)
        Defines a reading with the name "kernel" and evaluates the linux function uname -r

P.A.Trick

Zitat von: HCS am 02 September 2014, 22:19:29
Dein Script ist auch in der Lage nichts (also weder yes noch no) zu liefern. Ich vermute mal, dass es dann passiert.
Ich versuche es nachzustellen und schaue danach.

Bin mir aber auch nicht ganz sicher, welche Version Du hast.
Ich hänge meine aktuelle Version mal hier an.

Könntest mir zwei Gefallen tun:
Schau mal, ob der Fehler mit dieser Version weg ist
Schau Dir mal den commandref-Teil an, ob man damit versteht, wie es funktioniert.


Hier die commandref (haut mit der Formatierung hier nicht ganz hin, in echt ist es hübscher, siehe cr.jpg):

CustomReadings

    FHEM module to define own readings.

    This module allows to define own readings. The readings can be defined in an attribute so that they can get changed without changing the code of the module.
    To use this module you should have some perl and linux knowledge
    The examples presuppose that you run FHEM on a linux machine like a Raspberry Pi or a Cubietruck.
    Note: the "bullshit" definition is an example to show what happens if you define bullshit :-)

    Example (definition in fhem.cfg)
    define myReadings CustomReadings
    attr myReadings room 0-Test
    attr myReadings interval 2
    attr myReadings readingDefinitions hdd_temperature:qx(hddtemp /dev/sda 2>&1) \
    ac_powersupply_voltage:qx(cat /sys/class/power_supply/ac/voltage_now 2>&1) / 1000000 \
    ac_powersupply_current:qx(cat /sys/class/power_supply/ac/current_now 2>&1) / 1000000 \
    perl_version:$] \
    timezone:qx(cat /etc/timezone 2>&1) \
    kernel:qx(uname -r 2>&1) \
    device_name:$hash->{NAME} \
    bullshit: $hash->{bullshit} \
    fhem_backup_folder_size:qx(du -ch /opt/fhem/backup | grep total | cut -d 't' -f1 2>&1)

    Resulting readings:
    ac_powersupply_current 0.236 2014-08-09 15:40:21
    ac_powersupply_voltage 5.028 2014-08-09 15:40:21
    bullshit ERROR 2014-08-09 15:40:21
    device_name myReadings 2014-08-09 15:40:21
    fhem_backup_folder_size 20M 2014-08-09 15:40:21
    hdd_temperature /dev/sda: TS128GSSD320: 47°C 2014-08-09 15:40:21
    kernel 3.4.103-sun7i+ 2014-08-09 15:40:21
    perl_version 5.014002 2014-08-09 15:40:21
    timezone Europe/Berlin 2014-08-09 15:40:21

    Define
    define <name> CustomReadings

    Readings
    As defined

    Attributes
        interval
        Refresh interval in seconds

        readingDefinitions
        Each line represents a definition for a reading. A definition consists of two parts, separated by a colon.
        All lines (except the last one) must end with a backslash
        The first part is the name of the reading and the second part the function.
        The function gets evaluated and must return a result.

        Example: kernel:qx(uname -r 2>&1)
        Defines a reading with the name "kernel" and evaluates the linux function uname -r




Puh na dann wollen wir mal!
Zu dem Skript: Stimmt, das wird bestimmt auch passiert sein, wenn die Kiste unter Last steht. Ist ja schließlich nur ein altes QNAP NAS welches ich manchmal arg strapaziere.

Zu dem Modul:
Diese Änderungen habe ich gefunden!

<     $value =~ s/^\s+|\s+$//g;
---
>     if($value) {
>       $value =~ s/^\s+|\s+$//g;
>     }
>     else {
>       $value = "ERROR";
>     }


Der Rest war nur Commandref. Ich habe es mal aktualisiert.


Zu dem Skript: Eigentlich sollte die IF Abfrage immer einen Wert liefern, aber nun gut.
Ich habe das Modul aktualisiert und beobachte mal. Allerdings war es leider ein sporadischer Fehler :-/


Zur Commandref: Ufff....nun wenn ich ehrlich bin ist das zu kompliziert. Ich glaube 3 Beispiele reichen völlig, das andere verwirrt nur (meine Meinung!).

PS: Ich erkläre mich bereit einen Wiki-Artikel zu schreiben :-)

Vielen lieben Dank für deine Hilfe und das tolle Modul!
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

marvin78

Bevor dieses Modul tatsächlich eingecheckt wird, sollte über eine Änderung des Trennzeichens im Attribut readingDefinitions nachgedacht werden. Wenn ich mich recht erinnere, war das in der Ursprungsversion ein Zeilenvorschub (habe es bei mir auf Komma geändert) und das machte Probleme (und ist auch nicht wirklich sinnvoll, wenn man im Frontend arbeitet).

Das Modul ist ansonsten sehr praktisch und sinnvoll.

HCS

Zitat von: P.A.Trick am 02 September 2014, 22:34:15Diese Änderungen habe ich gefunden!

<     $value =~ s/^\s+|\s+$//g;
---
>     if($value) {
>       $value =~ s/^\s+|\s+$//g;
>     }
>     else {
>       $value = "ERROR";
>     }

Damit sollte Dein Problem dann beseitigt sein.


Zitat von: P.A.Trick am 02 September 2014, 22:34:15PS: Ich erkläre mich bereit einen Wiki-Artikel zu schreiben :-)
Cool  8)


Zitat von: P.A.Trick am 02 September 2014, 22:34:15Zur Commandref: Ufff....nun wenn ich ehrlich bin ist das zu kompliziert. Ich glaube 3 Beispiele reichen völlig, das andere verwirrt nur (meine Meinung!).
Da war ich im Beispiel-Fieder.
Ich dachte es wäre nett, wenn man in den Beispielen direkt einige Anregegungen findet, die man einfach übernehmen kann.
Welche würdest Du denn weglassen?
Eventuell könnte man ja im wiki dann einige Beispiele, die man sich einfach dort rauskopieren kann, veröffentlichen.
Beispiel:

Ich möchte meine kernel Version anzeigen
Definition: kernel:qx(uname -r 2>&1) \




HCS

Zitat von: marvin78 am 03 September 2014, 12:16:15
Bevor dieses Modul tatsächlich eingecheckt wird, sollte über eine Änderung des Trennzeichens im Attribut readingDefinitions nachgedacht werden. Wenn ich mich recht erinnere, war das in der Ursprungsversion ein Zeilenvorschub (habe es bei mir auf Komma geändert) und das machte Probleme (und ist auch nicht wirklich sinnvoll, wenn man im Frontend arbeitet).

Das Modul ist ansonsten sehr praktisch und sinnvoll.
Wegen dem Trennzeichen hatte ich auch gegrübelt, als ich das Modul gemacht habe. War mir dann recht unsicher, welches Zeichen man nehmen könnte, ohne mit den funktionsdefinitionen in Konflikt zu geraten und das dann wieder escapen zu müssen.

Kennt jemand ein Modul, wo etwas ähliches vorkommt, an das ich das anlehen könnte. Dann wäre verhindert, dass jetzt eine weitere "Trenner-Variante" erfunden wird.
Das Argument mit dem Frontend leuchtet (leider) ein  :(

marvin78

Ein Attribut, welches von vielen Modulen verwendet wird, oft eine längere Auflistung enthält und bei mir häufig Verwendung findet, ist userReadings. Das benutzt das Komma als Trennzeichen. Andere Attribute verwenden häufig auch den Doppelpunkt. Eine Konsistenz kann ich da nicht erkennen. Komma ist für mich das was am ehesten intuitiv ist.

justme1968

der doppelpunkt wird oft als trennen zwischen device und reading verwendet. das komma oder leerzeichen bei aufzählungen. komma finde ich besser.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

HCS

Ihr habt mich erfolgreich zum Komma überredet  ;D ;D

Also so:

attr myReadings readingDefinitions timezone:qx(cat /etc/timezone 2>&1), kernel:qx(uname -r 2>&1)

P.A.Trick

Zitat von: HCS am 03 September 2014, 13:04:29
Ihr habt mich erfolgreich zum Komma überredet  ;D ;D

Also so:

attr myReadings readingDefinitions timezone:qx(cat /etc/timezone 2>&1), kernel:qx(uname -r 2>&1)

Stimmt, die "newline" ist wirklich nervig bei der Definition.
Zum Komma als Trenner: PERFEKT!
Kannst du bitte das aktualisierte Modul hochladen? Ich teste dann und schreibe den Wiki-Artikel!

Herzlichen Dank schon einmal!
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

HCS

Auf Komma umgebaut
commandref aktualisiert (wird dann im Inhaltsverzeichnis bei "Helper modules" auftauchen)

Wenn sich bis zum Wochenende hier keine weiteren Punkte mehr ergeben, dann checke ich es ein.

P.A.Trick

Genial! Funktioniert alles und ich habe mein Versprechen gehalten.
Hier die erste Version des Wiki-Artikels <-- Feedback erwünscht!

http://www.fhemwiki.de/wiki/CustomReadings

Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

HCS

Habe mir das wiki angeschaut. Super!
Finde das sehr übersichtlich, informativ und gut strukturiert.

Zwei Kleinigkeiten, die mir aufgefallen sind:
"Typ Gerätemodul": es ist ein Hilfsmodul (bei Kategorien auch)
"attr myReadings interval 60": passt nicht mit dem Screenshot (2 Sekunden) zusammen