[gelöst] Reading-Wert mit http auslesen

Begonnen von saxandl, 03 Februar 2020, 17:23:17

Vorheriges Thema - Nächstes Thema

saxandl

Hi!

Kann mir jmd sagen, wie man einen Reading-Wert per http auslesen kann? Nicht zu verwechseln mit STATE, den
lese ich mit fhem?cmd=list... aus

Hier z.B. den Wert aus "dewPoint":


Otto123

#1
Hi,

Du meinst von "außen", hiermit :)
https://github.com/heinz-otto/fhemcl

oder meinst Du
Zitatlist [devspec] [value ...]
oder
list {-r|-R} devspec


Auflistung aller "definitions", "notify" und "at"-Definitionen. Dies ist eines der wenigen Befehle, die im Normalfall eine Zeichenkette ausgeben.
Siehe den Abschnitt über Geräte-Spezifikation für Details der <devspec>.

Wenn <value> angegeben ist, dann wird dieses Wert (Internal, Reading oder Attribut) ausgegeben, soweit es vorhanden ist. Die Werte können mit einem Präfix eingeschränkt werden: i: für Internals, r: für Readings und a: für Attribute.

Wobei wenn Du wirklich bloß den Inhalt brauchst, nimmst Du Perl und {ReadingsVal()}
Außerhalb FHEM mit meinem HTTP Client:
Beispiel
#!/bin/bash
# Abfrage in FHEM als Variable
hosturl="http://raspib3:8083"
device="debian350"
reading="active"

# HTTP Client bei Bedarf holen
script="fhemcl.sh"
rep="fhemcl"
if [ ! -e $script ] ;then wget https://raw.githubusercontent.com/heinz-otto/$rep/master/$script;chmod +x $script;fi

# Abfrage eines Reading in FHEM
status=$(./fhemcl.sh $hosturl "{ReadingsVal('$device','$reading','ReadingNichtLesbar')}")
if [[ $? > 0 ]] ;then echo "Es ist ein Fehler aufgetreten: $status";exit;fi

# Rückgabe auswerten und etwas tun
if [[ $status == "off" ]]
   then
      echo "ich soll ausschalten"
   else
      echo "der Status ist $status"
   fi


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

saxandl

Hallo Otto!

das ist nicht ganz, was ich suche.

Ich sollte von einem anderen Rechner im gleichen LAN - idealer Weise
mit Perl - den Wert "dewPoint" abholen.

lg

CoolTux

#3
Beispiel zum üben und lernen


#!/usr/bin/perl
use strict;
use warnings;
use POSIX;

use IO::Socket::INET;

    my $fhemDummy = 'dummyLernen';

    my $HOSTNAME = "fhemServer";
    my $HOSTPORT = "7072";
    my $socket = IO::Socket::INET->new('PeerAddr' => $HOSTNAME,'PeerPort' => $HOSTPORT,'Proto' => 'tcp')
        or die 'Cant\'t connect to FHEM Instance';
    my $data;

    print($socket '{ReadingsVal(\'dummyDeconzDaemonState\',\'deconz_loaded\',\'none\') }' . "\n");

    while (1) {
      $socket->recv($data, 1024);
      print($data);
      last if ($data);
    }
   
    $socket->close;


Du kannst natürlich auch direkt Perl Telnet nehmen. Man findet tausende Beispiele im Netz.
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

saxandl

vielen dank euch!

meine Lösung sieht so aus:

http://192.168.1.81:8083/fhem?XHR=1&cmd=%7BReadingsVal("WetterSooss","dewPoint",0)%7D

lg aus Niederösterreich ;-)

CoolTux

Zitat von: saxandl am 04 Februar 2020, 10:16:32
vielen dank euch!

meine Lösung sieht so aus:

http://192.168.1.81:8083/fhem?XHR=1&cmd=%7BReadingsVal("WetterSooss","dewPoint",0)%7D

lg aus Niederösterreich ;-)

Ist aber kein Perl  ;D
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

saxandl

stimmt  :)
ich machs mit

Zitatmy @Vorhersage = split(/\s+/, get ("http://192  ...

zu einer Perl-Variablen

Otto123

Wenn Du vielleicht nochmal in meinen Link schaust, ich habe da auch eine Perl Version für den HTTP Client.

Du musst ja nicht alles übernehmen: Du brauchst zwei Dinge: Den Token ermitteln und den Zugriff über HTTP, der Rest in meinem Code ist die Übernahme aus der Kommandozeile.

Ich weiß, die meisten User sehen Sicherheit wie einen Kropf - aber so Basis Sicherheiten in FHEM tot zu legen ist völlig unnötig.

Der wichtige Teil rausgezogen und  damit solltest jedes Kommando im Klartext an ein FHEM ohne kastrierten csrfToken, auch gern mit basicauth übergeben können. Habs jetzt so raus geschnitten nicht getestet, aber Du kannst ja Perl :)

use strict;
use warnings;
use URI::Escape;
use LWP::UserAgent;

my $token;
my $hosturl='http://192.168.1.81:8083';
my $fhemcmd='{ReadingsVal("WetterSooss","dewPoint",0)}';

# get token
my $ua = new LWP::UserAgent;
my $url = "$hosturl/fhem?XHR=1/";
my $resp = $ua->get($url);
   $token = $resp->header('X-FHEM-CsrfToken');

    # url encode the cmd
    $fhemcmd = uri_escape($fhemcmd);
    # print "proceeding line ".eval($i+1)." : $fhemcmd\n";
    $url = "$hosturl/fhem?cmd=$fhemcmd&fwcsrf=$token&XHR=1";
    $resp = $ua->get($url)->content;
    print $resp



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

Otto123

Für alle die, die sich nicht um die Details kümmern wollen und einfach eine FHEM Instanz über HTTP steuern oder abfragen wollen, habe ich mal noch eine kleine Perl Sub für die 99_myUtils draus gemacht, war hier ursprünglich nicht gefragt, aber Perl ist Perl :)
sub fhemcl($$)
{
   use URI::Escape;
   use LWP::UserAgent;
     my ($hosturl,$fhemcmd) = @_;
     my $token;
   # get token
     my $ua = new LWP::UserAgent;
     my $url = "$hosturl/fhem?XHR=1/";
     my $resp = $ua->get($url);
        $token = $resp->header('X-FHEM-CsrfToken');
   # url encode the cmd
     $fhemcmd = uri_escape($fhemcmd);
     $url = "$hosturl/fhem?cmd=$fhemcmd&fwcsrf=$token&XHR=1";
     $resp = $ua->get($url)->content;
     # cut the last character, the additional newline
     return substr $resp,0,-1
}

Verwendung in FHEM - ein paar Beispiele. Es sollte alles "gehen" was in der FHEM Kommandozeile geht.
{fhemcl("http://raspib3:8083","{ReadingsVal('Melder','state','error')}")}
{fhemcl("http://raspib3:8083","set Test2 toggle")}
{fhemcl("http://raspib3:8083","list global")}

Wenn mir keiner der Perl Spezies den Code um die Ohren haut, pack ich den mal noch ins Wiki.

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

B.Stromberg

Zitat von: Otto123 am 13 Februar 2020, 19:01:54
Für alle die, die sich nicht um die Details kümmern wollen.......

Hallo Otto!
Dieses Thema paßt ganz gut zu meinem aktuellen "Problem".

Ich habe eine Wärmepumpe und möchte deren Stromverbrauch an eine Applikation für meinen SMA Wechselrichter schicken.
Die Applikation nennt sich Smart Appliance Enabler und sendet Daten von Strommessgeräten direkt zum Portal von SMA.

Was ich möchte:
Ich möchte das Reading StromAktuell aus dem Modul PulsStrom von FHEM via http auslesen.
Der Wert wird in kw/h angegeben, also zum Beispiel jetzt grade im Standby 46,23.

Hier das List von meinem Puls Strom:

Internals:
   FUUID      5ed317f0-f33f-0855-3a48-bca25ab19e05593f
   IODev      myBroker
   NAME       PulsStrom
   NR         268
   STATE      incoming publish received
   TYPE       MQTT_DEVICE
   READINGS:
     2020-10-14 12:48:00   Count           1.00
     2020-10-14 12:48:00   StromAktuell    46.38
     2020-10-14 12:48:00   Time            77618.00
     2020-10-14 12:48:00   Total           1719.00
     2020-10-14 12:48:00   transmission-state incoming publish received
   message_ids:
   sets:
   subscribe:
     Stromcount/Watt/Count
     Stromcount/Watt/Time
     Stromcount/Watt/Total
   subscribeExpr:
     ^Stromcount\/Watt\/Count$
     ^Stromcount\/Watt\/Time$
     ^Stromcount\/Watt\/Total$
   subscribeQos:
     Stromcount/Watt/Count 0
     Stromcount/Watt/Time 0
     Stromcount/Watt/Total 0
   subscribeReadings:
     Stromcount/Watt/Count:
       cmd       
       name       Count
     Stromcount/Watt/Time:
       cmd       
       name       Time
     Stromcount/Watt/Total:
       cmd       
       name       Total
Attributes:
   IODev      myBroker
   room       Stromverbrauch
   stateFormat transmission-state
   subscribeReading_Count Stromcount/Watt/Count
   subscribeReading_Time Stromcount/Watt/Time
   subscribeReading_Total Stromcount/Watt/Total
   userReadings StromAktuell {sprintf("%.2f",(3600/(ReadingsVal($name,"Time",0))*1000))}


Der Smart Apliance Enable extrahiert via RegEx einen Wert von einer Internetseite.
Das sieht im Web Interface so aus (Anhang1)
Der SAE extrahiert aus den Daten in Anhang 2 den Wert Power.

Leider fühlt sich der Entwickler außer Stande mir weiterzuhelfen.

Kannst du das evtl. @Otto oder jemand anderes?

Wahrscheinlich ist das alles gar nicht so schwierig, aber ich stehe vollkommen auf dem Schlauch.




Otto123

Hi,

ich bin nicht ganz sicher ob ich alles verstanden habe, aber dies hier:
ZitatWas ich möchte:
Ich möchte das Reading StromAktuell aus dem Modul PulsStrom von FHEM via http auslesen.
Wäre ja in FHEM Code{ReadingsNum('PulsStrom','StromAktuell',99)}
Mit meinem Scripts in Bash, PowerShell und Perl siehe https://github.com/heinz-otto/fhemcl wäre das dann:
fhemcl http://DeinFhemHostname:8083 "{ReadingsNum('PulsStrom','StromAktuell',99)}"

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

B.Stromberg

Zitat von: Otto123 am 14 Oktober 2020, 18:28:03
Hi,

ich bin nicht ganz sicher ob ich alles verstanden habe.....

Danke für deine Rückantwort!

Ich stehe irgendwie auf dem Schlauch.

Der SAE bräuchte eine URL wie "http://192.168.2.235/cm?cmnd=Status%208"

Wie bekomme ich diese mit Hilfe deines Scripts zusammen?

Otto123

Ich habe es wirklich sicher noch nicht kapiert.  :'(
Du willst ein reading von FHEM per HTTP auslesen? Von wo aus?
Du willst innerhalb von FHEM etwas per HTTP von einem anderen Server einlesen? Das klingt nach HTTPMOD HTTPutils usw.

Mein Beispiel oben liest auf Kommandozeile (Terminal) einen Wert aus FHEM aus und liefert diesen zurück.
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

B.Stromberg

Zitat von: Otto123 am 14 Oktober 2020, 19:04:59
Ich habe es wirklich sicher noch nicht kapiert.  :'(.....

Ja, ich brauche den Wert StromAktuell aus dem Modul PulsStrom.
Der Wert muss via URL abrufbar sein also, wenn ich im Browser eingebe

https://192.168.2.3:8088/fhem PulsStrom StromAktuell

sollte als Ausgabe

PulsStrom: 45,12

kommen im Browserfenster.

Dann könnte das SAE via RegEx abrufen und zum SMA Portal hochbeamen.

Otto123

#14
Zitatzum SMA Portal hochbeamen.
Das geht nicht per FHEM?

Wenn Du Dir mein Script anschaust, macht das am Ende eine URL die den Wert zurück liefert, die URL kannst Du vielleicht so fest codieren?
Du hast dann folgende Baustellen:
csrftoken: https://wiki.fhem.de/wiki/CsrfToken-HowTo kannst Du mit einem speziellen FHEMWEB auflösen.
uri codierung: nimmst Du einfach mal von hier die Perl Sub https://wiki.fhem.de/wiki/CsrfToken-HowTo#Perl_Sub und tauschst am Ende die Zeile
return substr $resp,0,-1
gegen
return $url
aus.
Die Sub führst Du einfach in der Raw Def (UMbau erforderlich)  oder 99_myUtils in deinem FHEM aus.
Dann weißt Du wie die statische URL aussehen muss.

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