[(Teil-)gelöst] Perl in notify - "Undefined subroutine &main::get"

Begonnen von dafosy, 04 November 2021, 21:21:30

Vorheriges Thema - Nächstes Thema

dafosy

Hallo Forum,

ich möchte mittels notify einen Thermometer-Wert an die middleware.php meines Volkszählers übergeben.

Dabei kommt folgener Fehler:
2021.11.04 17:34:25 3: SZtemp return value: Undefined subroutine &main::get called at (eval 1053) line 9.

Nach anfänglicher Recherche ist es wohl, wie der Log auch sagt, die fehlende get subroutine. Kann mir jemand helfen, wie ich diese subroutine definiere und der Fehler verschwindet?

Mein verwendeter Code entspricht dem des wikis: https://wiki.fhem.de/wiki/Volkszaehler
   .*:temperature.* {
    # return "Heizung $NAME" if $NAME =~ /\A.{3}Heizung/; # [[MAX]] Geräte ausschließen. Workaround für aufgebrauchte credits.
    my $base_url = AttrVal('vz', 'vz_URL', undef);
    my $temp = ReadingsVal($NAME, 'temperature', undef);
    my $uuid = AttrVal($NAME, 'vz_UUID', undef);
    unless (defined($uuid)) {
      my $create_url = $base_url . '/channel.json?type=temperature&title=' . $NAME . '&public=on&style=lines&operation=add';
      Log 5, $create_url;
      my $response = decode_json(get($create_url));
      $uuid = $response->{entity}->{uuid};
      $attr{$NAME}{'vz_UUID'} = $uuid;
      Log 4, "created $uuid for $NAME";
    }
    my $update_url = $base_url . '/data/' . $uuid . '.json?operation=add&value=' . $temp;
    Log 5, $update_url;
    Log 4, get($update_url);
  }


Grüße
dafosy

Otto123

Hi,

ich sehe keinen Zusammenhang zwischen dem Fehler und dem notify. Was ist SZtemp?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

CoolTux

my $response = decode_json(get($create_url));
Log 4, get($update_url);


In beiden Zeilen ist get ein Funktionsaufruf. Aber diese Funktion scheint nicht zu existieren. Habe das Wiki kurz überflogen ohne keine Ahnung wo das get herkommen soll.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Benni

get() gibt es in LWP::Simple zum einfachen Abruf von Daten über eine URL


use LWP::Simple;

my $data = get("http://the.datasource.url");


gb#

Beta-User

Zitat von: Benni am 05 November 2021, 05:56:25
get() gibt es in LWP::Simple zum einfachen Abruf von Daten über eine URL


use LWP::Simple;

my $data = get("http://the.datasource.url");


gb#
:o
...da würde ich mir aber gut überlegen, ob es sinnvoll ist, eine so benannte Funktion nach main zu importieren...!?!

(Das ist aber ausdrücklich keine Kritik an der Recherche an sich!)

Die HTTP-Utils in FHEM sollten was vergleichbares bieten. (Blocking-irgendwas?)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Benni

Mir ging es natürlich nicht um eine Anwendungsempfehlung! ;) 
Ich wollte lediglich die (sehr wahrscheinliche) Herkunft der get() per Beispiel erklären!

gb#



Christoph Morrison

get() kommt in diesem Fall aus LWP::UserAgent, das in 23_VOLKSZAEHLER.pm geladen wird.

Du hast kein Device vom Typ VOLKSZAEHLER (und auch zufällig kein anderes, das LWP verwendet) definiert, richtig?

Du kannst HttpUtils_NonblockingGet() verwenden, aber das wird dann für ein Notify schon ziemlich viel, finde ich.

Beta-User

....schon gleich, wenn es nur um's loggen geht.

Wundert mich bei dem Coding irgendwie, dass sich noch keiner der 22 in der Statistik gemeldeten Usern wegen einem Problem gemeldet hat. Der VZ scheint zuverlässig gute JSON zu liefern...

Irgendwie (nicht) lustig, wie viele Probleme einem in nur 200 Zeilen auffallen, wenn man etwas Übung hat...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

dafosy

#8
Moin Ich komme jetzt erst zum Lesen der Antworten.

Ich checke mal der Reihe nach:

@Otto123:  SZtemp ist mein notify für das Thermometer im Schlafzimmer, dessen Temperatur ich übergeben möchte.

@Christoph Morrison: nee, ich habe kein Device VOLKSZAEHLER definiert.

Habt ihr eine Idee, was ich machen kann? Also wegen mir lasse ich get auch weg, bzw. code das ganze manuell für jedes Thermometer, welches ich auslesen möchte. Sind ja nur 4 Stk. .
Gibt es Möglichkeiten das Skript so anzupassen, dass das get() weggelassen werden kann?
Oder teste ich jetzt mit

LWP::UserAgent

bzw.

LWP::Simple
?

Primär such ich jedoch ein Erfolgserlebnis, dass der Wert meines durch CUL ausgelesenen Thermometers in FHEM dann als Linie im volkszähler auftaucht.

Schicken Sonntag,ä
dafosy

Christoph Morrison

Zitat von: dafosy am 07 November 2021, 09:46:57
@Christoph Morrison: nee, ich habe kein Device VOLKSZAEHLER definiert.

Die einfachste Lösung wäre, ein Volkszähler-Device zu definieren, dann sollte der Code-Schnipsel funktionieren.
Alternativ könntest du mit HTTPMOD einen Request an die Middleware machen.
Du könntest auch auf eine der HttpUtils-Funktionen umstellen (https://wiki.fhem.de/wiki/HttpUtils), aber dann wird's eher blocking (dein FHEM blockiert so lange der Request läuft und das willst du eher nicht) oder für ein Notify zu umfangreich (YMMV).

Was für ein Thermometer ist das denn?

dafosy

Was genau mache ich denn als Device VOLKSZAEHLER? Also als was lege ich das an?

define VOLKSZAEHLER Dummy?

Das Thermometer ist ein simples Auriol_IAN_79, also eins vom Sperrmüll - aber für die Temperatur, Luftfeuchte und somit Schimmelüberwachung, bzw. Lüftungsprotokoll langt es allemal.

Gruß
dafosy

Benni


dafosy

Nabend,

also dank des Hinweises nochmal im wiki nachzuschauen, habe ich nun ein VOLKSZAEHLER-Device angelegt. Ich sehe nun den Momentanverbrauch meines Stromzählers in FHEM. Die 23_VOLKSZAEHLER.pm sollte also geladen sein - oder?

Nun zum FHEM Auslesen und in Volkszähler anzeigen: nach wie vor liefert der LOG mir einen get-Fehler:
SZtemp ist meine Bezeichnung des notify
VolkszURL die Bezeichnung meines Dummys für die Volkszähler URL


2021.11.07 22:41:01 1: ERROR evaluating my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{
    # return "Heizung $NAME" if $NAME =~ /\A.{3}Heizung/; # [[MAX]] Geräte ausschließen. Workaround für aufgebrauchte credits.
    my $base_url = AttrVal('VolkszURL', 'vz_URL', undef);
    my $temp = ReadingsVal($NAME, 'temperature', undef);
    my $uuid = AttrVal($NAME, 'vz_UUID', undef);
    unless (defined($uuid)) {
      my $create_url = $base_url . '/channel.json?type=temperature&title=' . $NAME . '&public=on&style=lines&operation=add';
      Log 5, $create_url;
      my $response = decode_json(get($create_url));
      $uuid = $response->{entity}->{uuid};
      $attr{$NAME}{'vz_UUID'} = $uuid;
      Log 4, "created $uuid for $NAME";
    }
    my $update_url = $base_url . '/data/' . $uuid . '.json?operation=add&value=' . $temp;
    Log 5, $update_url;
    Log 4, get($update_url);
  }: Undefined subroutine &main::get called at (eval 353) line 16.

2021.11.07 22:41:01 3: SZtemp return value: Undefined subroutine &main::get called at (eval 353) line 16.


Wenn ich den JSON-Befehl in die Adressleiste eingebe, funktioniert übrigens alles:

http://192.168.0.5/middleware.php/data/uuid.json?operation=add&value=22

Hat jemand noch einen Rat, bzw. benötigt genauere Konfigurationsangaben?

/dafosy

dafosy

Wo wird denn eigentlich in dem Code die Variable $NAME definiert, dass dort auch mein AURIOL-Thermometer abgefragt wird?

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz