Modul-Fingerübung: Spritpreis

Begonnen von pjakobs, 11 Januar 2017, 11:07:36

Vorheriges Thema - Nächstes Thema

pjakobs

Ich dachte mir, ich versuche mich mal an einem eigenen Modul und mach damit auch gleich was nützliches....

Es gibt ja schon ein paar Ansätze, um die vielen unterschiedlichen Benzinportale abzufragen, und mit tankerkoenig.de gibt es sogar ein Portal, das eine recht hübsche json API zur Verfügung stellt. Warum also nicht mal ein Modul schreiben, dass diese Schnittstelle nutzt und mir die Preise in meiner Gegend gibt.

Aktuell ist es auf das Tankerkoenig API zugeschnitten, aber ich denke, wenn ich die entsprechenden Funktionen um deine API ID erweitere, dann lassen sich leicht andere Quellen hinzufügen.

Takerkönig bietet die Preisabfrage entweder über Lokation und Radius oder über die IDs bestimmter Tankstellen.

Nachem ich hier nur schnell ein paar Zeilen zusammengeklöppelt habe (mir ging es mehr darum, zu verstehen, wie ein Modul from scratch entsteht), füllt es jetzt erstmal Readings mit den Werten nach Lokation/Radius. Der nächste Schritt ist dann aber die Funktion, die einfach nur für die Lokation und den Radius die IDs befüllt und danach nur noch per ID abfragt (die Last auf dem API ist, laut der Tankerkönig Doku) dann geringer.

Noch ist das hier sicher weit weg von tatsächlich nutzbar, aber vielleicht interessiert es ja den einen oder anderen und vielleicht gibt es auch noch ein paar Ideen, wie ich Dinge anders oder besser machen könnte. btw: mir ist bewusst, dass es gut dokumentierte Lösungen rund um den html Parser gibt, aber ich wollte es eben als Fingerübung für ein Modul nutzen.

72_Spritpreis.pm (ich habe die 72 gewählt, weil ein paar andere (fossile) Energie-Monitoring-Module da sind

##############################################
# $Id: 72_Spritpreis.pm 0 2017-01-10 12:00:00Z pjakobs $

package main;

use strict;
use warnings;

use Time::HiRes;
use Time::HiRes qw(usleep nanosleep);
use Time::HiRes qw(time);
use JSON::XS;
use Data::Dumper;
require "HttpUtils.pm";

$Data::Dumper::Indent = 1;
$Data::Dumper::Sortkeys = 1;

#####################################
#
# fhem skeleton functions
#
#####################################

sub
Spritpreis_Initialize(@) {
    my ($hash) = @_;

    $hash->{DefFn}          = 'Spritpreis_Define';
    $hash->{UndefFn}        = 'Spritpreis_Undef';
    $hash->{ShutdownFn}     = 'Spritpreis_Undef';
    $hash->{SetFn}          = 'Spritpreis_Set';
    $hash->{GetFn}          = 'Spritpreis_Get';
    $hash->{AttrFn}         = 'Spritpreis_Attr';
    $hash->{NotifyFn}       = 'Spritpreis_Notify';
    $hash->{ReadFn}         = 'Spritpreis_Read';
    $hash->{AttrList}       = "lat lon rad type sortby apikey"." $readingFnAttributes";
    return undef;
}

sub
Spritpreis_Define($$) {

    my ($hash, $def)=@_;
    my @parts=split("[ \t][ \t]*", $def);
    my $name=$parts[0];
    return undef;
}

sub
Spritpreis_Undef(@){
    return undef;
}

sub
Spritpreis_Set(@) {
    return undef;
}

sub
Spritpreis_Get(@) {
    my ($hash, $name, $cmd, @args) = @_;
    Spritpreis_Tankerkoenig_GetPricesForLocation($hash);
    # add price trigger here
    return $_;
}

sub
Spritpreis_Attr(@) {
    return undef;
}

sub
Spritpreis_Notify(@) {
    return undef;
}

sub
Spritpreis_Read(@) {
    return undef;
}

#####################################
#
# functions to create requests
#
#####################################

sub
Spritpreis_Tankerkoenig_GetIDsForLocation(@){
    my ($hash) = @_;
    my $lat=AttrVal($hash->{'NAME'}, "lat",0);
    my $lng=AttrVal($hash->{'NAME'}, "lon",0);
    my $rad=AttrVal($hash->{'NAME'}, "rad",5);
    my $type=AttrVal($hash->{'NAME'}, "type","diesel");
    my $sort=AttrVal($hash->{'NAME'}, "sortby","price");
    my $apikey=AttrVal($hash->{'NAME'}, "apikey","");

    if($apikey eq "") {
        Log3($hash,3,"$hash->{'NAME'}: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it");
        return "err no APIKEY";
    }

    my $url="https://creativecommons.tankerkoenig.de/json/list.php?lat=$lat&lng=$lng&rad=$rad&type=$type&sort=$sort&apikey=$apikey";
    my $param = {
        url      => $url,
        timeout  => 2,
        hash     => $hash,
        method   => "GET",
        header   => "User-Agent: fhem\r\nAccept: application/json",
        parser   => \&Spritpreis_ParseIDsForLocation,
        callback => \&Spritpreis_callback
    };
    HttpUtils_NonblockingGet($param);

    return undef;
}

sub
Spritpreis_Tankerkoenig_GetPricesForIDs(@){
    my ($hash) = @_;

    return undef;
}

sub
Spritpreis_Tankerkoenig_GetPricesForLocation(@){
    my ($hash) = @_;

    my $lat=AttrVal($hash->{'NAME'}, "lat",0);
    my $lng=AttrVal($hash->{'NAME'}, "lon",0);
    my $rad=AttrVal($hash->{'NAME'}, "rad",5);
    my $type=AttrVal($hash->{'NAME'}, "type","diesel");
    my $sort=AttrVal($hash->{'NAME'}, "sortby","price");
    my $apikey=AttrVal($hash->{'NAME'}, "apikey","");

    if($apikey eq "") {
        Log3($hash,3,"$hash->{'NAME'}: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it");
        return "err no APIKEY";
    }
    my $url="https://creativecommons.tankerkoenig.de/json/list.php?lat=$lat&lng=$lng&rad=$rad&type=$type&sort=$sort&apikey=$apikey";

    Log3($hash, 4,"$hash->{NAME}: sending request with url $url");
   
    my $param= {
        url      => $url,
        hash     => $hash,
        timeout  => 30,
        method   => "GET",
        header   => "User-Agent: fhem\r\nAccept: application/json",
        parser   => \&Spritpreis_ParsePricesForLocation,
        callback => \&Spritpreis_callback
     };
     HttpUtils_NonblockingGet($param);
     return undef;
}

#####################################
#
# functions to handle responses
#
#####################################

sub
Spritpreis_callback(@) {
     my ($param, $err, $data) = @_;
     my ($hash) = $param->{hash};

     # TODO generic error handling
     #Log3($hash, 5, "$hash->{NAME}: received callback with $data");
     # do the result-parser callback
     my $parser = $param->{parser};
     #Log3($hash, 4, "$hash->{NAME}: calling parser $parser with err $err and data $data");
     &$parser($hash, $err, $data);

     # Do readings update

     if( $err || $err ne ""){
         Log3 ($hash, 3, "$hash->{NAME} Readings NOT updated, received Error: ".$err);
     }
   return undef;
}

sub
Spritpreis_ParseIDsForLocation(@){
    return undef;
}

sub
Spritpreis_ParsePricesForLocation(@){
    my ($hash, $err, $data)=@_;
    my $result;

    Log3($hash,5,"$hash->{NAME}: ParsePricesForLocation has been called with err $err and data $data");

    if($err){
        Log3($hash, 4, "$hash->{NAME}: error fetching nformation");
    } elsif($data){
        Log3($hash, 4, "$hash->{NAME}: got PricesForLocation reply");
        Log3($hash, 5, "$hash->{NAME}: got data $data\n\n\n");

        eval {
            $result = JSON->new->utf8(1)->decode($data);
        };
        if ($@) {
            Log3 ($hash, 4, "$hash->{NAME}: error decoding response $@");
        } else {
            my ($stations) = $result->{stations};
            #Log3($hash, 5, "$hash->{NAME}: stations:".Dumper($stations));
            readingsBeginUpdate($hash);
            foreach (@{$stations}){
                (my $station)=$_;

                #Log3($hash, 5, "$hash->{NAME}: Station hash:".Dumper($station));
                Log3($hash, 2, "Name: $station->{name}, id: $station->{id}\n");
                my $number=0;
               
                # make sure we update a record with an existign id or create a new one for a new id
                while(ReadingsVal($hash->{NAME},$number."_id",$station->{id}) ne $station->{id})
                {
                    $number++;
                }
                readingsBulkUpdate($hash,$number."_name",$station->{name});
                readingsBulkUpdate($hash,$number."_price",$station->{price});
                readingsBulkUpdate($hash,$number."_place",$station->{place});
                readingsBulkUpdate($hash,$number."_street",$station->{street}." ".$station->{houseNumber});
                readingsBulkUpdate($hash,$number."_distance",$station->{dist});
                readingsBulkUpdate($hash,$number."_brand",$station->{brand});
                readingsBulkUpdate($hash,$number."_lat",$station->{lat});
                readingsBulkUpdate($hash,$number."_lon",$station->{lng});
                readingsBulkUpdate($hash,$number."_id",$station->{id});
                readingsBulkUpdate($hash,$number."_isOpen",$station->{isOpen});
            }
            readingsEndUpdate($hash,1);
        }         
    }else {
        Log3 ($hash, 4, "$hash->{NAME}: something's very odd");
    }
    return $data;
}

sub
Spritpreis_ParsePricesForIDs(@){
}

1;


die Moduldefinition braucht im Moment folgendes:

define tanke Spritpreis
attr tanke apikey <bitte eigenen key generieren>
attr tanke lat <latitude - siehe twilight>
attr tanke lon <longitude - siehe twilight>
attr tanke rad 5
attr tanke sortby price
attr tanke type e5

reibuehl

Tolle Idee! Wegen der Location: Würde es nicht Sinn machen, die "latitude" und "longitude" Werte aus dem "global" Device dafür zu nutzen?
Reiner.

pjakobs

Zitat von: reibuehl am 11 Januar 2017, 14:28:23
Tolle Idee! Wegen der Location: Würde es nicht Sinn machen, die "latitude" und "longitude" Werte aus dem "global" Device dafür zu nutzen?

als eine Option allemal, aber ich halte es auch für sinnvoll, ggf. mehrere Devices für unterschiedliche Lokationen zu haben (z.B. zuhause / Büro). Aber als Default, wenn nichts anderes angegeben ist, jap, das bau ich ein.

Danke

pj

pjakobs

so, ich hab's mal auf github geschoben, vielleicht interessiert's wen

alles noch Stückwerk und mir ist auch noch nicht ganz klar, wie ich damit umgehen will...

Eine Möglichkeit:
Ich implementiere eine "add location" Funktion, die eine Adresse übernimmt, die geokoordinaten bestimmt und die Tankstellen im Umkreis zur Liste hinzufügt. Damit könnte ein Gerät dann Tankstellen an mehreren Orten beinhalten.
Das Preisupdate würde dann immer nur die Liste der Tankstellen-IDs durchlaufen und für die schon bekannten neue Preise anfragen, egal, wo die sich befinden.
Tankstellen löschen ginge vermutlich genauso: Adresse oder geolokation und Radius übergeben, alle IDs die sich daraus ergeben werden aus den Readings geworfen.

Andere Möglichkeit:
die Lokation wird immer in den Attributen lat/lon gespeichert und die geolokations-Routine dient einfach nur dazu, die herauszufinden. Update wie oben. Wird keine Lokation angegeben, verwende ich die von $global, wird eine Adresse angegeben wird die aufgelöst und verwendet, aber nicht im Attribut gespeichert. Das heißt halt dann, dass zusätzlich zur Preisabfrage bei jedem Durchlauf (ich denke irgendwo zwischen alle 5 und 15 Minuten ist sinnvoll) eine Anfrage an Google Maps geschickt wird.

Was ich gerade noch nicht verstehe: wenn ich fhem neu starten muss (und das kommt ja leider manchmal vor, wenn man dicke Finger hat), dann sind alle Readings weg. Ich nehme an, ich muss die bei der Initialisierung irgendwoher lesen...?

pj


martins

Sehr gute Idee mit dem Modul. Ich ringe seit Monaten damit ein Modul für Tankerkönig zuschreiben, bin aber aus Zeitmangeln nicht dazu gekommen. Umso besser das du es jetzt gemacht hast. :) Werde dies heute Abend testen.

Als weitere Idee: Die Tankstellen nicht nach Geokoordianten suchen, sondern die ID's direkt in einem Attribut übergeben.

pjakobs

Zitat von: martins am 12 Januar 2017, 09:08:31
Sehr gute Idee mit dem Modul. Ich ringe seit Monaten damit ein Modul für Tankerkönig zuschreiben, bin aber aus Zeitmangeln nicht dazu gekommen. Umso besser das du es jetzt gemacht hast. :) Werde dies heute Abend testen.
erwarte bitte nix poliertes, es ist ziemlich "rough"
Zitat von: martins am 12 Januar 2017, 09:08:31
Als weitere Idee: Die Tankstellen nicht nach Geokoordianten suchen, sondern die ID's direkt in einem Attribut übergeben.
Ich bin noch am überlegen, wie ich das vom Bedienungsablauf machen.

Irgendwie muss der Anwender ja die IDs der Tankstellen bekommen und idealerweise sollte er das über das Modul können.
Dazu kann er entweder die Geookoordinaten nutzen, oder, jetzt neu, auch die Adresse.
Dann sollte er die interessanten Tankstellen auswählen können und danach werden nur noch die angefragt.

pj

Hollo

Tankstellen in einem Radius sind mM. vermutlich zu viele (wohne auf dem Dorf, also dicht dran 0 und bei größerem Radius sehr viele).

Interessant fände ich Tankstellen zwischen 2 Koordinaten und dann Auswahlmöglichkeit, welche man davon möchte.
Dann könnte man z.B. die sehen, die auf dem täglichen "Arbeitsweg" (Wohnung<->Arbeit oder so) liegen.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

CoolTux

Zitat von: pjakobs am 12 Januar 2017, 12:28:21
erwarte bitte nix poliertes, es ist ziemlich "rough"Ich bin noch am überlegen, wie ich das vom Bedienungsablauf machen.

Irgendwie muss der Anwender ja die IDs der Tankstellen bekommen und idealerweise sollte er das über das Modul können.
Dazu kann er entweder die Geookoordinaten nutzen, oder, jetzt neu, auch die Adresse.
Dann sollte er die interessanten Tankstellen auswählen können und danach werden nur noch die angefragt.

pj

Schau Dir hierfür mal das UWZ Modul an. Interessant für Dich sollten UWZSearch* sein. Sind zwei Funktionen welche über einen Get Befehl aufgerufen werden. In der Antwort enthalten sind gleich Links um automatisch den korrekten Wert an zu legen.



Grüße
Leon
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

suppenesser

Die idee mit der Strecke von A nach B finde ich recht interessant, zusammen mit zb. der Standort Funktion in Telegram würde ich das als genial empfinden.

Strecke von A nach B im interval aktualisieren und, wenn von Telegram ein Standort kommt, davon im Umkreis von x km ermitteln. Das könnte man dann wiederum an Telegram schicken, wenn Bedarf!

Gesendet von meinem HUAWEI GRA-L09 mit Tapatalk

Raspberry PI B+ | HM-LAN-CFG | HM-LC-Sw1PBU-FM | HM-TC-WM-W-EU | DECT 200 | DHT22 | 1 Wire Temp.Sensoren

pjakobs

Zitat von: Hollo am 12 Januar 2017, 12:34:16
Tankstellen in einem Radius sind mM. vermutlich zu viele (wohne auf dem Dorf, also dicht dran 0 und bei größerem Radius sehr viele).

Interessant fände ich Tankstellen zwischen 2 Koordinaten und dann Auswahlmöglichkeit, welche man davon möchte.
Dann könnte man z.B. die sehen, die auf dem täglichen "Arbeitsweg" (Wohnung<->Arbeit oder so) liegen.
Jetzt wird's aber anspruchsvoll ;-)
Ich denke, das lässt sich in erster Näherung mal mit mehreren Suchen im Radius um Punkte auf der Strecke machen (ich würde jetzt ungern auch noch mit Routenwahl anfangen) und Du suchst Dir dann die aus, die sinnvoll liegen. Das Modul klappert dann die eingegebenen Tankstellen an.

Für die Navigation unterwegs gibt's doch genug Navis mit Tankstellenfinder.

pj

pjakobs

Zitat von: CoolTux am 12 Januar 2017, 12:47:29
Schau Dir hierfür mal das UWZ Modul an. Interessant für Dich sollten UWZSearch* sein. Sind zwei Funktionen welche über einen Get Befehl aufgerufen werden. In der Antwort enthalten sind gleich Links um automatisch den korrekten Wert an zu legen.



Grüße
Leon

Ah, ich sehe, das generiert eine html Tablelle aus der ich dann eine Zeile aussuchen kann.
d.h. ich kann, auf ähnliche Art, ein html Multiselect Form generieren und der Nutzer kann die gewünschten Tankstellen aussuchen. Cool! Danke :-) (vorausgesetzt, ich kann mit /fhem?cmd= " jedes beliebige fhem Kommando aufrufen. Was mich ja dann so Securitymäßig nervös macht. Aber das UI ist hier eh nicht abgesichert. Argh! Internet of Things und Security! Ich brauch'n Schnaps! ;-) )

pj

martins

Also erster Test sieht soweit mal gut aus und Ergebnisse werden angezeigt. Aber wie du schon selbst sagtes, es muss noch weiterentwickelt werden.

Die Return Werte return "err no APIKEY"; musste ich ändern in return undef; sonst ist mir FHEM jedesmal abgestürzt.

Das Update würde ich persönlich über ein set update machen.

pjakobs

Zitat von: martins am 12 Januar 2017, 22:49:13
Also erster Test sieht soweit mal gut aus und Ergebnisse werden angezeigt. Aber wie du schon selbst sagtes, es muss noch weiterentwickelt werden.

Die Return Werte return "err no APIKEY"; musste ich ändern in return undef; sonst ist mir FHEM jedesmal abgestürzt.

hmm... dann frag ich mich, wo darf ich eigentlich Strings zurückgeben und wo nicht.
Na ja, wie gesagt: mir ging es hier ja primär darum, zu lernen, wie Module from scratch gebaut werden müssen.

Zitat von: martins am 12 Januar 2017, 22:49:13
Das Update würde ich persönlich über ein set update machen.

Sicher, ich hab erstmal eine Routine geschireben, die überhaupt das API bedient und sie irgendwo eingebunden.
Gerade bin ich dabei, die Auswahl der Tankstellen zu ermöglichen, danach sehen wir weiter :-)

Danke für's Feedback

pj

CoolTux

Packe Deinen String in eine Variable und gebe diese zurück.
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

pjakobs

Zitat von: CoolTux am 13 Januar 2017, 10:05:52
Packe Deinen String in eine Variable und gebe diese zurück.
Ernsthaft? Es return geht nicht mit string literals? :o

Ich hab übrigens mal die Sache mit der Tankstellenauswahl gebaut, das funktioniert ganz gut, aber wenn ich eine html Form zurückgebe, dann kann ich offenbar keinen submit Button einbauen bzw. der wird nicht angezeigt. Hast Du da ne Idee?

Grüße

pj

CoolTux

Zitat von: pjakobs am 13 Januar 2017, 13:34:50
Ernsthaft? Es return geht nicht mit string literals? :o

Ich hab übrigens mal die Sache mit der Tankstellenauswahl gebaut, das funktioniert ganz gut, aber wenn ich eine html Form zurückgebe, dann kann ich offenbar keinen submit Button einbauen bzw. der wird nicht angezeigt. Hast Du da ne Idee?


Grüße

pj

Sicherlich geht es auch als String. Aber das müsste ich mir auch erstmal selber ansehen. So aus dem Kopf heraus will ich mich da nicht festlegen, dafür gebe ich zu selten Werte zurück.
Am besten Du überprüfst erstmal martins Aussage.


Zum Button. Du kannst doch einen Link anlegen lassen


my $aHref="<a href=\"http://".$headerHost[0]."/fhem?cmd=get+".$name."+AreaID+".$value->{'latitude'}.",".$value->{'longitude'}."\">Get AreaID</a>";


Stat dem get Befehl als Link machst Du einfach ein modify Befehl oder das setzen eines Attributes.



Grüße
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

pjakobs

Zitat von: CoolTux am 13 Januar 2017, 14:40:07
Zum Button. Du kannst doch einen Link anlegen lassen


my $aHref="<a href=\"http://".$headerHost[0]."/fhem?cmd=get+".$name."+AreaID+".$value->{'latitude'}.",".$value->{'longitude'}."\">Get AreaID</a>";


klar, aber mein erster Gedanke war: hey klasse, da mach ich ein Form mit Mehrfachauswahl. Geht wohl nicht so einfach.

pj

CoolTux

Wenn Deine Funktion in der Abfrage als Antwort mehrere Datensätze zurück gibt dann funktioniert es. Anders wüsste ich auch nicht.
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

pjakobs

Zitat von: CoolTux am 13 Januar 2017, 15:12:13
Wenn Deine Funktion in der Abfrage als Antwort mehrere Datensätze zurück gibt dann funktioniert es. Anders wüsste ich auch nicht.

             my ($stations) = $result->{stations};
             my $ret="<html><p><h3>Stations for Address</h3></p><p><h2>$formattedAddress</h2></p><form action='fhem/cmd?set ".$hash-  >{NAME}." station' method='get'><select multiple name='id'>";
             foreach (@{$stations}){
                 (my $station)=$_;

                 Log3($hash, 2, "Name: $station->{name}, id: $station->{id}");
                 $ret=$ret."<option value=".$station->{id}.">".$station->{name}." ".$station->{place}." ".$station->{street}." ".     $station->{houseNumber}."</option>";
             }
             $ret=$ret."<button type='submit'>submit</button></form></html>";
             Log3($hash,2,"$hash->{NAME}: ############# ret: $ret");
             return $ret;


der fhem popup hat einen eigenen "ok" button, der submit button wird, laut DOM, wegoptimiert.
Vermutlich sind einzelne Links doch der beste Weg.

pj

gent

Zitat von: pjakobs am 11 Januar 2017, 21:12:59
so, ich hab's mal auf github geschoben, vielleicht interessiert's wen

alles noch Stückwerk und mir ist auch noch nicht ganz klar, wie ich damit umgehen will...

Eine Möglichkeit:
Ich implementiere eine "add location" Funktion, die eine Adresse übernimmt, die geokoordinaten bestimmt und die Tankstellen im Umkreis zur Liste hinzufügt. Damit könnte ein Gerät dann Tankstellen an mehreren Orten beinhalten.
Das Preisupdate würde dann immer nur die Liste der Tankstellen-IDs durchlaufen und für die schon bekannten neue Preise anfragen, egal, wo die sich befinden.
Tankstellen löschen ginge vermutlich genauso: Adresse oder geolokation und Radius übergeben, alle IDs die sich daraus ergeben werden aus den Readings geworfen.

Andere Möglichkeit:
die Lokation wird immer in den Attributen lat/lon gespeichert und die geolokations-Routine dient einfach nur dazu, die herauszufinden. Update wie oben. Wird keine Lokation angegeben, verwende ich die von $global, wird eine Adresse angegeben wird die aufgelöst und verwendet, aber nicht im Attribut gespeichert. Das heißt halt dann, dass zusätzlich zur Preisabfrage bei jedem Durchlauf (ich denke irgendwo zwischen alle 5 und 15 Minuten ist sinnvoll) eine Anfrage an Google Maps geschickt wird.

Was ich gerade noch nicht verstehe: wenn ich fhem neu starten muss (und das kommt ja leider manchmal vor, wenn man dicke Finger hat), dann sind alle Readings weg. Ich nehme an, ich muss die bei der Initialisierung irgendwoher lesen...?

pj

Schau mal bei Tankerkönig nach, da gibt es einen Konfigurator

https://creativecommons.tankerkoenig.de/configurator/index.html

Das finde ich eigentlich ziemlich genial, da man als Ergebnis ein json Objekt bekommt, welches man dann in der api verwenden abfragen kann. Ich glaube, dass der "normale" Homeautomation User die Tankstellen, die er abfragen will auch kennt. Mit dem Konfigurator kann man dann alle Tankstellen (Wohnort, Arbeitsort, Entlang einer Route etc... ) übernehmen. Hier mal ein Beispiel

{
  "8d66b8be-5037-4822-8ab4-1aa7b3b8a657": {
    "label": "ESSO | Esso Tankstelle",
    "coords": {
      "lat": 48.659946,
      "lng": 9.221958
    },
    "address": [
      "BONLAENDER HAUPTSTR. 132",
      "70794 FILDERSTADT"
    ],
    "openingTimes": {
      "Mo - Sa": [
        "06:00 - 22:00"
      ],
      "So": [
        "08:00 - 22:00"
      ]
    }
  },
  "de20bca5-64e2-4a4a-71f8-40a562277e6d": {
    "label": "BFT Filderstadt | BFT Station Filderstadt",
    "coords": {
      "lat": 48.658139,
      "lng": 9.195942
    },
    "address": [
      "Schillerstrasse 55",
      "70794 Filderstadt"
    ],
    "openingTimes": {
      "Mo - Sa": [
        "06:30 - 21:30"
      ],
      "So": [
        "08:00 - 21:30"
      ]
    }
  }
}


Vielleicht wäre das etwas, was alle Bedürfnisse befriedigen könnte?

Viele Grüße vom Gent
fhem auf rPi3 mit USB boot und M2, cul866 (hm), homebridge, FlowerSens, Shelly, Harmony, WemosD1, Sonoff/Tasmota, grafana, mqtt/mosquitto

Papaloewe

Vielleicht ist das ja nur bei mir so, aber ein:
update all https://github.com/pljakobs/fhem_spritpreis_module/blob/master/controls_spritpreis.txt
funktioniert nicht und es erscheint nur:
2017.01.16 21:22:00 1 : PERL WARNING: Use of uninitialized value $r[0] in string eq at /opt/fhem/FHEM/98_update.pm line 308.
2017.01.16 21:22:00 1 : PERL WARNING: Use of uninitialized value $r[0] in string ne at /opt/fhem/FHEM/98_update.pm line 318.
2017.01.16 21:22:00 1 : nothing to do...


Hat jemand eine Idee?
Danke & Gruß
Thomas

pjakobs

Zitat von: gent am 16 Januar 2017, 20:24:11
Schau mal bei Tankerkönig nach, da gibt es einen Konfigurator

https://creativecommons.tankerkoenig.de/configurator/index.html

Das finde ich eigentlich ziemlich genial, da man als Ergebnis ein json Objekt bekommt, welches man dann in der api verwenden abfragen kann. Ich glaube, dass der "normale" Homeautomation User die Tankstellen, die er abfragen will auch kennt. Mit dem Konfigurator kann man dann alle Tankstellen (Wohnort, Arbeitsort, Entlang einer Route etc... ) übernehmen. Hier mal ein Beispiel


Vielleicht wäre das etwas, was alle Bedürfnisse befriedigen könnte?

Viele Grüße vom Gent

das ist sehr geil, hatte ich noch nicht gesehen und könnte perfekt passen! Danke!

pj

mrfloppy

Hallo

Könnte man da ev. auch die österreichischen Spritpreise einpflegen.

In Österreich gibt es diese Seite: http://www.spritpreisrechner.at

Für eine Abfrage habe ich diese Seiten dazu gefunden:

https://blog.muehlburger.at/2011/08/spritpreisrechner-at-apps-entwickeln und
http://gregor-horvath.com/spritpreis.html

Ich muss sagen ich habe von dem null Ahnung.

Könnte sich das mal jemand anschauen ob und wie man das in fhem umsetzen kann?

Danke und LG Thomas

RaspiMatic, RFXtrx433 E USB, Div. Thermostate, CUL433, Fhemduino, Signalduino, Temp/luftfeuchesensoren,Fensterkontakte,Intertechno Schalter,....... HM-IP

gent

Hi mrfloppy,

ich denke, das könnte man mit dem HTTPMOD Modul machen. Ich habe in der commandref gelesen, dass man auch post requests machen kann. Das ist in deinem zweiten Link ja auch als "problem" erkannt. Normalerweise sind solche "apis" per http-get Methode aufgebaut. D.h. man kann einfach eine URL schicken z.B.:

http://www.spritpreisrechner.at/espritmap-app/GasStationServlet?parameter1=value&parameter2=value...

das hat aber Gregor Horvath geschrieben geht mit dem spritpreisrechner.at nicht. Deswegen hat er einen "Übersetzer-Server" gebaut, der dann aus eine get-request den für den spritpreisrechner erforderlichen post-request erstellt und die Antwort dann aufbereitet zurückschickt.

Also kurz, was Du tun könntest:

1. Du liest Dich in die Benutzung des HTTPMOD Moduls ein und schickst post-requests an den spritpreisrechner.at... (das habe ich auf die Schnelle nicht richtig hinbekommen)
oder
2. Du gehst auf die Seite von  Gregor Horvath, schickst ihm die nötigen Infos (und evtl. eine kleine Spende) und erhältst einen parametrierten Link. Diesen wiederum kannst Du dann recht einfach mit httpmod auslesen und Dir so wie wir das hier mit unserem tankerkönig.de auch machen die nötigen Readings anlegen.

Viele Grüße vom gent



fhem auf rPi3 mit USB boot und M2, cul866 (hm), homebridge, FlowerSens, Shelly, Harmony, WemosD1, Sonoff/Tasmota, grafana, mqtt/mosquitto

pjakobs

kurzes Update - auch wenn es immer noch nur eine Sammlung von Routinen ist, nimmt es langsam eine fassbare Form an.

Heute habe ich allerdings scheinbar mal kurzfristig den API Server von Tankerkönig getötet, weil ich in einer Schleife ohne funktionierende Abbruchbedingung Requests geschickt hab. So ein $i++ zu vergessen kann schon blöd sein :o

pj

pjakobs

so, ich hab gerade mal eine neue Version in den develop Zweig eingecheckt.

Was funktioniert:


define tanke Spritpreis <api-key>
attr tanke IDs <comma separated list of tankerkoenig station ids>


Beim Start des Moduls wird, wenn das IDs Attribut gesetzt ist, die Funktion

Spritpreis_Tankerkoenig_populateStationsFromAttr($hash);

aufgerufen, diese liest das IDs Attr und erstellt Reading Set mit den Details der einzelnen angegebenen Stationen (es ist noch wenig Error Handling eingebaut)

In der aktuellen Version läuft noch kein Timer, aber mit

set tanke update all

(wobei "tanke" natürlich mein device name ist) werden alle aktuell in den Readings angelegten IDs mit frischen Preisen und Öffnungsstatus upgedatet.

Was auch geht:

set tanke add id <tankerkoenig id>

damit wird eine neue Tankstelle zu den Readings hinzugefügt, sie wird allerdings (noch) nicht in das IDs Attr geschrieben.


set tanke update id <tankerkoenig id>

macht ein update der Werte für die angegebene ID - wenn sie schon angelegt ist.

Es ist auch noch ein haufen anderer Code drin, der zum großen Teil (noch ) nicht genutzt wird, irgendwann muss ich aufräumen :D

pj

jkriegl

#26
Es funktioniert - Die attr Ids alleine haben nicht ausgereicht. Nach einem set tanke add id <> wurden die readings erzeugt.
Aber woher bekommt man Station-IDs? (Habe noch die bisherigen)
Könnte man sich nicht bei update das all sparen, denn entweder alle oder mit einem id.
Rpi 3, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

pjakobs

Zitat von: jkriegl am 22 Januar 2017, 20:48:23
Es funktioniert - Die attr Ids alleine haben nicht ausgereicht. Nach einem set tanke add id <> wurden die readings erzeugt.
Aber woher bekommt man Station-IDs? (Habe noch die bisherigen)
Könnte man sich nicht bei update das all sparen, denn entweder alle oder mit einem id.

Das ist ja alles noch am wachsen :-)

Dass die IDs im Attribut nicht ausgereicht haben wundert mich, ansich sollten die readings beim define angelegt werden - vielleicht ist der Aufruf aber auch zu früh, ich hab mal gelesen, dass es noch einen Hook nach dem define gibt. Muss ich mal nachsehen.

Die IDs liefert das Tankerkönig api, Die Routinen für eine Umkreissuche sind schon drin, nur noch nicht "verdrahtet" (also: suche um eine Adresse mit Radius 5km).
Die andere Möglichkeit ist der Tankerkönig Konfigurator, der sogar entlang einer Strecke suchen kann. Der liefert dann ein json file zurück, dass das Modul parsen kann.

Übrigens aufpassen: die Preise werden aktuell noch nicht automatisch aktualisiert! auch das kommt noch ;-)

pj

martins

Also ich weis nicht, ich bekomme es garnicht zum laufen.
Hab per attr eine ID gesetzt und auch per add. Readings werden garkeine erzeugt. Im Log bekomme ich folgendes:
tanke3: get tanke3 add all
tanke3 add: args[0]=all

pjakobs

Zitat von: martins am 23 Januar 2017, 22:46:03
Also ich weis nicht, ich bekomme es garnicht zum laufen.
Hab per attr eine ID gesetzt und auch per add. Readings werden garkeine erzeugt. Im Log bekomme ich folgendes:
tanke3: get tanke3 add all
tanke3 add: args[0]=all


ist das alles an Long was kommt? Das ist seltsam. Ich gestehe, ich hab es nie mit nur einer einzigen ID getestet...

pj

jkriegl

@martins Du musst
set tanke add id <tankerkoenig id>
eingeben (wie beschrieben), ev. neu starten dann gibt es readings.
setz mal dasverbose hoch, damit es log gibt.

Danke @pjakobs, läuft wunderbar. Polle mit einem at bzw. einem dummy Taster. Die suche nach weiteren Stationen ist sehr simpel (Konfigurator).
Rpi 3, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

martins

Verbose hatte ich schon auf 5, das ist alle was kam nach einem add

@jkriegl, ich glaube ich hab add id vergessen, ich testet es heute abend noch einmal

martins

Also läuft bei mir jetzt auch, lag aber daran das bei mir der apiKey nicht aus $hash->{helper}->{apiKey} gelesen werden kann, warum auch immer.

pjakobs

Zitat von: martins am 25 Januar 2017, 00:01:44
Also läuft bei mir jetzt auch, lag aber daran das bei mir der apiKey nicht aus $hash->{helper}->{apiKey} gelesen werden kann, warum auch immer.
das ist strange - hast Du da ne Fehlermeldung für mich?

pj

martins

Also ich hab nochmal etwas Debug betrieben.
Zeile 84 habe ich geändert in:
Log3 ($hash, 2, "$hash->{NAME}: error: " . Dumper($result));
Output wäre:

2017.01.25 22:36:20 2: tanke3: error: $VAR1 = {
  'data' => 'MTS-K',
  'license' => 'CC BY 4.0 -  https://creativecommons.tankerkoenig.de',
  'ok' => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ),
  'prices' => {
    '12121212-1212-1212-1212-121212121212' => {
      'status' => 'no prices'
    }
  }
};


Hier gibt es kein $result->{ok} = "true" ...und deswegen wird der define abgebrochen

Unabhängig davon müsstest du Zeile 84 abändern, da dort Syntaxfehler enthalten sind in:
Log3 ($hash, 2, "$hash->{NAME}: error: $result->{message}");


vg
martin

unimatrix

Kann es sein dass es bei Tankerkoenig nicht mehr den Meldungsknopf gibt um die IDs zu finden? Oder geht das jetzt irgendwie anders?

pjakobs

Moin zusammen,

ich hab endlich mal wieder Zeit gehabt, ein bisschen was hieran zu machen. Im Wesentlichen hab ein ein bisschen dokumentiert und ein auto-refresh eingebaut. Alles im "develop" Zweig.

Die ganzen Routinen sind zwar jetzt auf Tankerkoenig "gebranded" (d.h. sie haben alle Tankerkoenig im Namen), weshalb auch andere Anbieter-Routinen eingebaut werden können, aber die Grundstruktur des Moduls (also das Define, die set und get commands) sind noch nicht darauf eingerichtet, mit anderen APIs umgehen zu können.

Grüße

pj

pjakobs

kleine Änderung, große Wirkung: jetzt funktioniert auch das "set <tanke> search <Adresse>" wobei <Adresse eine gültige "Ort, Straße Hausnummer" Adresse sein muss, sonst findet die Google API allerhand, nur nicht die gesuchten Tankstellen.
Das Kommando führt zu einem Dialogfenster, in dem man die gewünschten Tankstellen per klick der internen Liste hinzufügen kann.
Als Umkreis für die Suche wird aktuell das Attribut rad genutzt, oder, alternativ, 5km.
Schaut Euch mal an, ob das Modul in der Form langsam nützlich wird, dann würde ich als nächstes wohl die Funktion für den Österreichischen Anbieter einbauen.

Grüße

pj

mrfloppy

Zitat von: pjakobs am 07 Februar 2017, 08:36:05
..... dann würde ich als nächstes wohl die Funktion für den Österreichischen Anbieter einbauen.

Ja bitte das wäre sehr toll

LG
RaspiMatic, RFXtrx433 E USB, Div. Thermostate, CUL433, Fhemduino, Signalduino, Temp/luftfeuchesensoren,Fensterkontakte,Intertechno Schalter,....... HM-IP

jkriegl

klappt bei mir nicht
2017.02.07 18:00:12 3: Tanke2: get Tanke2 search München,
2017.02.07 18:00:12 3: Tanke2: request URL: https://maps.google.com/maps/api/geocode/json?address=+Kreilerstrasse+220+
2017.02.07 18:00:13 3: Tanke2: got coordinates for address as lat: 48.12126, lon: 11.66407
2017.02.07 18:00:13 3: Tanke2: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it

mit set Tanke2 add id <TK Id> kann ich welche hinzufügen.
Am wheezy-raspi klappt dies leider nicht, bekomme nur eine leeres 0_street reading.
Rpi 3, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

pjakobs

Zitat von: jkriegl am 07 Februar 2017, 18:27:57
klappt bei mir nicht
2017.02.07 18:00:12 3: Tanke2: get Tanke2 search München,
2017.02.07 18:00:12 3: Tanke2: request URL: https://maps.google.com/maps/api/geocode/json?address=+Kreilerstrasse+220+
2017.02.07 18:00:13 3: Tanke2: got coordinates for address as lat: 48.12126, lon: 11.66407
2017.02.07 18:00:13 3: Tanke2: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it

mit set Tanke2 add id <TK Id> kann ich welche hinzufügen.
Am wheezy-raspi klappt dies leider nicht, bekomme nur eine leeres 0_street reading.

sorry, da hab ich die Syntax geändert, die ID gehört jetzt in's define

define <name> Spritpreis <api-key>


und die nächste Änderung kommt da dann auch bald, nämlich dann, wenn ich weitere Quellen einbaue, ich denke, dann wird es
define <name> Spritpreis <anbieter> <api-key>

Grüße

pj

jkriegl

#41
Hatte schon ein
define Tanke2 Spritpreis <api-key>
bei "set Tanke2 search München, Kreillerstraße 220" in cmd-Zeile passiert nichts.
bei "get" ..."search" München, Kreillerstrasse 220 -> log wie oben
Rpi 3, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

martins

Ich habe immer noch das Problem das ich die Logmeldung mit dem apikey bekomme, obwohl der define richtig durchgeführt wird
please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it

Intruder1956

#43
bei mir ist das Fhem völlig abgestürzt bei der "define Tanke Spritpreis", so wie es im ersten Beitrag beschrieben
hatte als erstes dann das attr apikey eingetragen, dann ging nichts mehr
Ich konnte es erst wiederbeleben nachdem ich über WinSCP den Eintrag aus der fhem.cfg gelöscht hatte

das folgende habe ich in meinem Logfile gefunden
2017.02.07 08:58:09 1: PERL WARNING: Prototype mismatch: sub main::to_json ($@) vs ($) at /usr/share/perl/5.20/Exporter.pm line 66.
2017.02.07 08:58:09 1: PERL WARNING: Prototype mismatch: sub main::from_json ($@) vs ($) at /usr/share/perl/5.20/Exporter.pm line 66.
2017.02.07 08:58:09 3: Tanken: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it
2017.02.07 08:58:09 3: Tanken: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it
2017.02.07 08:58:09 3: Tanken: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it
Undefined subroutine &main::err no APIKEY called at fhem.pl line 2902.
2017.02.07 08:58:40 1: BlockingInformParent (BlockingStart): Can't connect to localhost:7072: IO::Socket::INET: connect: Verbindungsaufbau abgelehnt
2017.02.07 08:58:40 1: BlockingInformParent (PRESENCE_ProcessLocalScan): Can't connect to localhost:7072: IO::Socket::INET: connect: Verbindungsaufbau abgelehnt
Zotac CI547 32GB RAM 500GB SSD,ESXI 6.5, VM-Fhem5.8, VM-ioBroker, Cul 868Mhz;Cul 433Mhz = Busware, LGW, HM-MOD-RPI-PCB, Uniroll, IT YCR-100 TMT2100,ITR-1500, LD382 mit Wifilight, ESA 2000 + SENSOR WZ SET,FS20 TFK, HM-Sec-SC, HM-CC-RT-DN,PCA301,

pjakobs

ok, mal sehen.

Zum APIKey, ja, den habe ich aus einem attr in die define Zeile verschoben, was deshalb sinnvoll ist, weil es für andere Anbieter andere Formate geben wird, und weil ein "Spritpreis" Device nur für einen Anbieter gültig sein kann.

In der Define Routine wird überprüft, das a) ein APIKey angegeben ist und b) der auch gültig ist.

a)

     if(defined $parts[2]){
         $apiKey=$parts[2];
     }else{
         Log3 ($hash, 2, "$hash->{NAME} Module $parts[1] requires a valid apikey");
         return undef;
     }

Damit wird das Modul mit der angegebenen Fehlermeldung im Log beendet. FHEM sollte problemlos weiter laufen.

b)

     my $result;
     my $url="https://creativecommons.tankerkoenig.de/json/prices.php?ids=12121212-1212-1212-12

     my $param= {
     url      => $url,
     timeout  => 1,
     method   => "GET",
     header   => "User-Agent: fhem\r\nAccept: application/json",
     };

     my ($err, $data)=HttpUtils_BlockingGet($param);

     if ($err){
         Log3($hash,2,"$hash->{NAME}: Error verifying APIKey: $err");
         return undef;
     }else{
         eval {
             $result = JSON->new->utf8(1)->decode($data);
         };
         if ($@) {
             Log3 ($hash, 4, "$hash->{NAME}: error decoding response $@");
         } else {
             if ($result->{ok} ne "true"){
                 Log3 ($hash, 2, "$hash->{name}: error: $result-{message}");
                 return undef;
             }
         }
         $hash->{helper}->{apiKey}=$apiKey;
     }

Hier verwende ich eine der Beispiel-Tankstellen-IDs (121212-....), um eine Dummy Anfrage an Tankerkönig zu senden. Nur, wenn darauf eine gültige ($result->{ok}) Antwort kommt, wird der APIKey übernommen, sonst gibt es eine Fehlermeldung und das Modul wird beendet.

@jkriegl, ich denke, in Deinem Fall ist es irgendeine der Zwischenversionen. Der Fehler, den Du bekommst tritt nur auf, wenn innerhalb einer der GetDetail oder UpdateForID Funktionen kein APIKey in $hash->{helper}->{apikey} liegt. Mein Vorschlag: installier mal die neueste Version (reload 72_Spritpreis.pm nicht vegessen), lösch das Device und mach den define neu.

@intruder1956 ich bin mir nicht sicher, was bei Dir da passiert. Auf alle Fälle fehlt auch bei Dir der APIKey.
Der define sollte lauten

define Tanke Spritpreis <apikey>

Auch in Deinem Fall würde ich vorschlagen, dass Du das Gerät löschst (wenn Du es aus der fhem.cfg gelöscht hast, dann solltest Du ein "shutdown restart" von der fhem Kommandozeile ausführen).
Ich kann es nicht mit absoluter Sicherheit sagen, aber ich glaube, dass der Absturz von fhem nicht von diesem Modul herrührt, denn

2017.02.07 08:58:40 1: BlockingInformParent (BlockingStart): Can't connect to localhost:7072: IO::Socket::INET: connect: Verbindungsaufbau abgelehnt
2017.02.07 08:58:40 1: BlockingInformParent (PRESENCE_ProcessLocalScan): Can't connect to localhost:7072: IO::Socket::INET: connect: Verbindungsaufbau abgelehnt

kommt eine halbe Minute nach der Fehlermeldung von Spritpreis.pm, allerdings finde ich

Undefined subroutine &main::err no APIKEY called at fhem.pl line 2902

ausgesprochen seltsam.
Der String "err no APIKEY" kommt ein paar mal im Modul vor, immer als

return "err no APIKEY"

und ich verstehe nicht, warum fhem versuchen sollte, die Funktion "err no APIKEY" aufzurufen, wenn ich einen String Literal zurückgebe.

Aber grundsätzlich auch in Deinem Fall: bitte mal die neueste Version (aus dem develop Zweig) installieren und den define entsprechend ändern. Das Ding ist zwar noch nicht bug-free, läuft bei mir aber einwandfrei.

Ach so: ja, wenn eine Funktion aufgerufen wird, die nicht existiert, dann stirbt fhem. Ich übernehme keine Garantie, dass das hier nicht ab und an passiert - es ist, wie ich schrieb a) eine Fingerübung und b) work in progress ;-) Not for the faint at heart.

Nochwas: Gerät löschen geht am einfachsten, wenn Ihr das Gerät in der fhem UI anklickt und dann ganz unten auf "delete this device" klickt. Dann ist es sofort aus der laufenden Instanz gelöscht. Aber Achtung: aus dem Config File wird es erst gelöscht, wenn Ihr oben links auf "save config" klickt.

@intruder1956: weil Du schreibst, dass Du winscp benutzt hast: Du kannst die config-files (zumindest das fhem.cfg) auch aus dem fhem-UI heraus bearbeiten - unten links, edit files.

Grüße

pj

pc1246

Hallo pj
Ich habe gestern Dein Modul in Betrieb genommen. Soweit alles gut, wenn auch das mit den id's sehr doof war. Auf Tankerkoenig konnte ich bei mir in der NAehe nichts erzeugen, habs dann etwas anders gemacht. Dein get hat bei mir nicht funktioniert, es kam immer die Meldung missing key!
Jetz wuerde ich gern ein Plot erzeugen, aber irgendwie scheinen die Werte nicht Plottauglich zu sein. Hast Du da noch einen Tipp?
Danke und Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

pc1246

Hallo zusammen
Ja, der Herr Christoph ist mal wieder zu bloed gewesen! Aus irgendeinem Grund war beim Plot Spalte 3 statt Spalte 4 ausgewaehlt. Das laesst sich natuerlich schlecht darstellen. Mit 4 laeuft es aber wie Butter, da kann ich dann schon mal erkennen, wann ich definitiv nicht tanken werde!
Gruss, und Danke nochmals
Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

pc1246

Moin
Das ist jetzt seltsam, ich habe jetzt einen RPI3 aufgesetzt, aber da mag das Modul gar nicht! (Ich brauche den 1er fuer den eBus)
Da pj derzeit ganz andere Sorgen hat, wollte ich das hier nur mal kurz einwerfen. Muss irgendetwas spezielles auf dem Jessie installiert werden?
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

pjakobs

Zitat von: pc1246 am 11 April 2017, 22:32:55
Moin
Das ist jetzt seltsam, ich habe jetzt einen RPI3 aufgesetzt, aber da mag das Modul gar nicht! (Ich brauche den 1er fuer den eBus)
Da pj derzeit ganz andere Sorgen hat, wollte ich das hier nur mal kurz einwerfen. Muss irgendetwas spezielles auf dem Jessie installiert werden?
Gruss Christoph
ich würde auf libjson-perl tippen.

pj

mrfloppy

Wollte nur mal nachfragen, ob sich jemand findet der auch die Österreichischen Spritpreise in das Modul einbauen könnte.
http://www.spritpreisrechner.at

DAnke und LG
RaspiMatic, RFXtrx433 E USB, Div. Thermostate, CUL433, Fhemduino, Signalduino, Temp/luftfeuchesensoren,Fensterkontakte,Intertechno Schalter,....... HM-IP

pc1246

Moin
Bei mir hat das Modul die Funktion nach einem fhem Neustart die Funktion eingestellt. Da ich wusste, dass PJ anderweitig massiv eingebunden war, habe ich mich zurueckgehalten.
Bei mir sind aber derzeit auch zu viele Baustellen offen, so dass das gan hinten an steht!
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

pjakobs

Zitat von: pc1246 am 07 Mai 2017, 20:03:41
Moin
Bei mir hat das Modul die Funktion nach einem fhem Neustart die Funktion eingestellt. Da ich wusste, dass PJ anderweitig massiv eingebunden war, habe ich mich zurueckgehalten.
Bei mir sind aber derzeit auch zu viele Baustellen offen, so dass das gan hinten an steht!
Gruss Christoph

hast Du mehr Informationen? Meines läuft - auch nach mehreren fhem Updates - einwandfrei...

pj

pc1246

Moin
Ich glaube heute schaffe ich es nicht! Morgen habe ich wohl Zeit!
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

pjakobs

boah, Kinners, ich hab grad gesehen, dass der letzte Merge den Code total zerhauen hat... kein Wunder, dass das nicht funktioniert.
Ich würde ja einfach das letzte commit zurückrollen... mal sehen...

pj

pjakobs

so langsam hab ich's wieder zusammen. Das war ein Cluster-Fuckup (viele Änderungen, ein kaputter Merge und Git). Ihr könnt mal wieder testen.

doman75

#55
Jetzt wollte ich den Spritpreismonitor auch mal in Betrieb nehmen, aber im log erscheinen nur Fehlermeldungen, ich habe es sowohl mit apikey als attr als auch im define probiert:

Logauszug:

2017.05.23 11:17:20.560 3 : tanke: get tanke test
2017.05.23 11:17:20.560 4 : tanke: called Spritpreis_Tankerkoenig_populateStationsFromAttr
2017.05.23 11:17:20.560 4 : tanke: got ID String
2017.05.23 11:17:20.560 3 : tanke: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it
2017.05.23 11:17:28.883 3 : tanke: get tanke search
2017.05.23 11:17:28.884 4 : tanke: search string:
2017.05.23 11:17:28.884 3 : tanke: request URL: https://maps.google.com/maps/api/geocode/json?address=
2017.05.23 11:17:29.038 4 : tanke: got CoordinatesForAddress reply
2017.05.23 11:17:29.038 5 : tanke: got data { "error_message" : "Invalid request. Missing the 'address', 'bounds', 'components', 'latlng' or 'place_id' parameter.", "results" : [], "status" : "INVALID_REQUEST" }
2017.05.23 11:17:29.039 3 : tanke: got coordinates for address as lat: , lon:


List von tanke:

Internals:
   DEF        806899d9-f4db-af91-e8ea-0xxxxxxxxx
   NAME       tanke
   NR         686
   NTFY_ORDER 50-tanke
   STATE      ???
   TYPE       Spritpreis
   Helper:
Attributes:
   apikey     806899d9-f4db-af91-e8ea-0xxxxxxxxx
   lat        50.xxx
   lon        12.xxx
   rad        5
   room       Spritpreise
   sortby     price
   type       e10
   verbose    5


Weiß nicht weiter

pjakobs

Zitat von: doman75 am 23 Mai 2017, 11:24:07

2017.05.23 11:17:28.884 4 : tanke: search string:
2017.05.23 11:17:28.884 3 : tanke: request URL: https://maps.google.com/maps/api/geocode/json?address=

Weiß nicht weiter

Du musst dem search ja auch eine Adresse mitgeben :-)

korrekt geht ein "get tanke search straße, ort"

pj

doman75


2017.05.23 13:04:45.843 3 : tanke: get tanke search bohnhoefferstrasse,
2017.05.23 13:04:45.843 4 : tanke: search string: heidelberg
2017.05.23 13:04:45.843 3 : tanke: request URL: https://maps.google.com/maps/api/geocode/json?address=+heidelberg+
2017.05.23 13:04:46.460 4 : tanke: got CoordinatesForAddress reply
2017.05.23 13:04:46.460 5 : tanke: got data { "results" : [ { "address_components" : [ { "long_name" : "Heidelberg", "short_name" : "Heidelberg", "types" : [ "locality", "political" ] }, { "long_name" : "Rhein-Neckar-Kreis", "short_name" : "Rhein-Neckar-Kreis", "types" : [ "administrative_area_level_3", "political" ] }, { "long_name" : "Karlsruhe", "short_name" : "KA", "types" : [ "administrative_area_level_2", "political" ] }, { "long_name" : "Baden-Württemberg", "short_name" : "BW", "types" : [ "administrative_area_level_1", "political" ] }, { "long_name" : "Germany", "short_name" : "DE", "types" : [ "country", "political" ] } ], "formatted_address" : "Heidelberg, Germany", "geometry" : { "bounds" : { "northeast" : { "lat" : 49.4596927, "lng" : 8.7940495 }, "southwest" : { "lat" : 49.3517641, "lng" : 8.573178799999999 } }, "location" : { "lat" : 49.3987524, "lng" : 8.6724335 }, "location_type" : "APPROXIMATE", "viewport" : { "northeast" : { "lat" : 49.4596927, "lng" : 8.7940495 }, "southwest" : { "lat" : 49.3517641, "lng" : 8.573178799999999 } } }, "place_id" : "ChIJzdzMDgXBl0cR1zokRADq5u8", "types" : [ "locality", "political" ] } ], "status" : "OK" }
2017.05.23 13:04:46.460 3 : tanke: got coordinates for address as lat: 49.3987524, lon: 8.6724335


ok dann steht das im log, ich dachte aber das ich da nach Tankstellen suche?

pjakobs

bei mir sieht es mit den gleichen Werten so aus.
Versuch doch bitte nochmal ein Update vom github. Benutzt Du den master oder develop Zweig?

Grüße

pj

doman75

den master zweig, ich habe aber develop und master verglichen die sind doch identisch, oder schaue ich im falschen github

pjakobs

Zitat von: doman75 am 23 Mai 2017, 15:02:41
den master zweig, ich habe aber develop und master verglichen die sind doch identisch, oder schaue ich im falschen github

Du hast Recht, die sind aktuell gleich, nachdem ich den Fehler von vor zwei Wochen glattgezogen habe.

Ich habe gerade nochmal die aktuelle Version vom github gezogen und das funktioniert problemlos.

ah! grad seh ich's!

Die Definition hat sich geändert, sorry, das hab ich nicht gscheit dokumentiert. Das muss nun heißen


define Sprit spritpreis Tankerkoenig <api-key>


da fehlt noch eine vernünftige Fehlermeldung, wenn keine Quelle angegeben ist.

pj

doman75

jetzt geht es schon etwas weiter

2017.05.24 08:48:50.560 3 : Diesel: got coordinates for address as lat: 50.x, lon: 12.x
2017.05.24 08:48:50.560 4 : Diesel: sending request with url https://creativecommons.tankerkoenig.de/json/list.php?lat=50.x&lng=x&rad=5&type=diesel&apikey=806899d9-f4db-af91-e8ea-0xxxxxxxxxx
2017.05.24 08:48:50.653 4 : Diesel: got data
2017.05.24 08:48:50.653 5 : Diesel: got data {"status":"error","ok":false,"message":"nur 'dist' und 'price' als sort Parameter erlaubt, angegeben: "}
2017.05.24 08:48:50.653 2 : Diesel: ############# ret: <html><p><h3>Stations for Address</h3></p><p><h2>Gera, Germany</h2></p><table><tr><td>Name</td><td>Ort</td><td>Straße</td></tr></table>


Ich habe aber als sortby Parameter price angegeben

Neues List:


Internals:
   CFGFN
   DEF        Tankerkoenig 806899d9-f4db-af91-e8ea-0ac929709355
   NAME       Diesel
   NR         115777
   NTFY_ORDER 50-Diesel
   STATE      ???
   TYPE       Spritpreis
   Helper:
     apiKey     806899d9-f4db-af91-e8ea-0ac929709355
     service    Tankerkoenig
Attributes:
   lat        50.880
   lon        12.099
   rad        5
   room       Spritpreise
   sortby     price
   type       diesel
   verbose    5


Benutzt du den dasselbe module File wie ich? Also von gestern aus dem github?

Grüße
Swen

doman75

Du hast zeile 473 auskommentiert

  my $sort=AttrVal($hash->{'NAME'}, "sortby","price");


und in der Zeile 485 beim Url Aufruf hast du kein sort Parameter dabei, der ist aber zwingend wenn ich es richtig verstanden habe.

Ändere ich nun beides geht es aber leider trotzdem nicht, da kommt dann im log:


2017.05.24 09:02:37.978 3 : Diesel: got coordinates for address as lat: 50.x, lon: 12.x
2017.05.24 09:02:37.978 4 : Diesel: sending request with url https://creativecommons.tankerkoenig.de/json/list.php?lat=50.x&lng=12.x&rad=5&sort=price&type=diesel&apikey=806899d9-f4db-af91-e8ea-0xxxxxxxxxxx
2017.05.24 09:02:38.023 4 : Diesel: error fetching nformation


pjakobs

Zitat von: doman75 am 24 Mai 2017, 09:07:37
Du hast zeile 473 auskommentiert

  my $sort=AttrVal($hash->{'NAME'}, "sortby","price");

Sort by price ist heute eigentlich nicht mehr nötig, denn das gibt ja nur eine Liste, die aktuell eben nach Preis sortiert ist.
Was Du hier aber willst ist eine Liste der Tankstellen in der Umgebung, diejenigen, die Du dann auswählst werden in einer Liste eingetragen und diese Liste wird dann nacheinander abgefragt. Die Sortierung ergibt sich hinterher aus der Reihenfolge, in der die Tankstellen hinzugefügt wurden (Präfix 0_, 1_, 2_ etc).
Zitat von: doman75 am 24 Mai 2017, 09:07:37
und in der Zeile 485 beim Url Aufruf hast du kein sort Parameter dabei, der ist aber zwingend wenn ich es richtig verstanden habe.

Ändere ich nun beides geht es aber leider trotzdem nicht, da kommt dann im log:


2017.05.24 09:02:37.978 3 : Diesel: got coordinates for address as lat: 50.x, lon: 12.x
2017.05.24 09:02:37.978 4 : Diesel: sending request with url https://creativecommons.tankerkoenig.de/json/list.php?lat=50.x&lng=12.x&rad=5&sort=price&type=diesel&apikey=806899d9-f4db-af91-e8ea-0xxxxxxxxxxx
2017.05.24 09:02:38.023 4 : Diesel: error fetching nformation



Es werden immer alle Sorten angefragt und in den Readings angelegt, Du bekommst dann sowas:


0_brand          UNITOL 2017-05-22 10:35:05
0_diesel_price   1.109 2017-05-24 11:01:09
0_diesel_trend   fällt 2017-05-24 07:01:09
0_e10_price      1.339 2017-05-24 11:01:09
0_e10_trend      fällt 2017-05-24 11:01:09
0_e5_price       1.359 2017-05-24 11:01:09
0_e5_trend       fällt 2017-05-24 11:01:09
0_id             a4b69d7c-1d92-43de-b5cd-afb114e7b06d 2017-05-22 10:35:05
0_isOpen         open 2017-05-24 11:01:09
0_lat            53.699203 2017-05-22 10:35:05
0_lon            10.761696 2017-05-22 10:35:05
0_name           Tankstelle 2017-05-22 10:35:05
0_place          Ratzeburg 2017-05-22 10:35:05
0_street         L�neburger Damm 11 2017-05-22 10:35:05


Grüße

pj

doman75

also okay habe die änderungen wieder weggemacht, habe type und sort attr gelöscht und dann habe ich eine Liste bekommen,

drauf klicken geht aber nicht, da ich über https arbeite und der von dir erzeugte Link http will. OKay da habe ich aber gesehen das du bei set .. add nicht nur die ID willst sondern da  muss noch der String id hin korrekt. Also "set blabla add id xxxxxxxx" dann hatte ich die erste Tankstelle hinzugefügt. Juhu, das update hat auch funktioniert hatte endlich Preise drin.

Aber ein "set blabla delete xxxxxxxx" ging nicht? da muss ich dann auch wieder keinen String "id" eingeben.  Gibt es da wieder irgendeinen Trick?

Wirst du an dem Modul weiterarbeiten?

pjakobs

#65
Zitat von: doman75 am 24 Mai 2017, 14:10:04
also okay habe die änderungen wieder weggemacht, habe type und sort attr gelöscht und dann habe ich eine Liste bekommen,

drauf klicken geht aber nicht, da ich über https arbeite und der von dir erzeugte Link http will. OKay da habe ich aber gesehen das du bei set .. add nicht nur die ID willst sondern da  muss noch der String id hin korrekt. Also "set blabla add id xxxxxxxx" dann hatte ich die erste Tankstelle hinzugefügt. Juhu, das update hat auch funktioniert hatte endlich Preise drin.

Aber ein "set blabla delete xxxxxxxx" ging nicht? da muss ich dann auch wieder keinen String "id" eingeben.  Gibt es da wieder irgendeinen Trick?

Wirst du an dem Modul weiterarbeiten?

Das Ganze ist, wie der Titel sagt, als Fingerübung entstanden. Ich hab mit dem RGBWWcontroller noch ein anderes Projekt,  hinter dem dieses zurückstehen muss.
Ich werde da immer mal wieder dwas dran machen, ab aber auch nichts dagegen, wenn sich jemand beteiligt. ;-)


edit:
nebenbei: check mal Zeile 528 und ändere http:// in https:// - ich vermute das wird funktionieren. Allerdings weiß ich nicht, warum fhem da kein automatisches upgrade macht.

pj

mahowi

Ich weiß zwar nicht, ob das Modul noch aktiv genutzt wird, aber ich versuch's mal hier.  ;)

Ich habe heute auch mal einen Spritpreismonitor über das Modul definiert. Beim Definieren gab es auch keine Fehlermeldung. Aber wenn ich dann ein Station hinzufügen will kommt die Fehlermeldung, der API-Key wäre falsch:
2018.04.18 13:51:23.002 3 : Benzin: get Benzin add id
2018.04.18 13:51:23.003 3 : Benzin: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it
2018-04-18 13:51:23.011 Spritpreis Benzin add id ac87ff1d-d023-4b34-bf93-e1b803c625d3


Der Key ist richtig, den habe ich mir eben erst nochmal zuschicken lassen von Martin von Tankerkönig.

Hier noch das list vom Device, wobei ich keine Attribute angegeben habe:

list Benzin

Internals:
   CFGFN     
   DEF        Tankerkoenig xxx
   NAME       Benzin
   NR         29442
   NTFY_ORDER 50-Benzin
   STATE      ???
   TYPE       Spritpreis
   helper:
Attributes:


CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

ToM_ToM

Ich kannte das Modul gar nicht.
Warum ist das nicht offiziell eingcheckt worden? Sieht doch ziemlich cool aus.  :)

VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

pc1246

Zitat von: mahowi am 18 April 2018, 13:54:18
Ich weiß zwar nicht, ob das Modul noch aktiv genutzt wird, aber ich versuch's mal hier.  ;)

Ich habe heute auch mal einen Spritpreismonitor über das Modul definiert. Beim Definieren gab es auch keine Fehlermeldung. Aber wenn ich dann ein Station hinzufügen will kommt die Fehlermeldung, der API-Key wäre falsch:

Der Key ist richtig, den habe ich mir eben erst nochmal zuschicken lassen von Martin von Tankerkönig.

Hier noch das list vom Device, wobei ich keine Attribute angegeben habe:

Moin
Ich habe das Modul auf meinem Testsystem am Laufen. Ich weiss, dass da was mit dem Key war. Kann ich baer erst heute abend sagen!
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

pjakobs

#69
moin, hey, schön, wenn es dafür ein bisschen Interesse gibt, ich hatte es ehrlich gesagt aufgegeben, weil es offenbar nicht wirklich auf Liebe gestoßen war.
Bei mir läuft das Teil seit nem Jahr oder so und nachdem ich gerade mal draufgesehen habe, musste ich feststellen, dass die Preise teilweise seit Monaten nicht mehr upgedatet worden sind.
Wenn ich die "get test" Funktion aufrufe bekomme ich auch den api - key error. Ich fürchte, dass Tankerkönig da was geändert hat.

Ich muss da mal wieder rein sehen.

pj

update: ich hab mal reingesehen und ... ich weiß grad auch nicht.

pc1246

Moin
Also meins laeuft noch! Auch ein Set update geht problemlos!
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

pjakobs

Zitat von: pc1246 am 20 April 2018, 13:42:47
Moin
Also meins laeuft noch! Auch ein Set update geht problemlos!
Gruss Christoph

das ist doch schonmal was.
Dann wundere ich mich mal lokal weiter.

pj

pjakobs

Zitat von: mahowi am 18 April 2018, 13:54:18
Ich weiß zwar nicht, ob das Modul noch aktiv genutzt wird, aber ich versuch's mal hier.  ;)

Ich habe heute auch mal einen Spritpreismonitor über das Modul definiert. Beim Definieren gab es auch keine Fehlermeldung. Aber wenn ich dann ein Station hinzufügen will kommt die Fehlermeldung, der API-Key wäre falsch:
2018.04.18 13:51:23.002 3 : Benzin: get Benzin add id
2018.04.18 13:51:23.003 3 : Benzin: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it
2018-04-18 13:51:23.011 Spritpreis Benzin add id ac87ff1d-d023-4b34-bf93-e1b803c625d3


Der Key ist richtig, den habe ich mir eben erst nochmal zuschicken lassen von Martin von Tankerkönig.

Hier noch das list vom Device, wobei ich keine Attribute angegeben habe:

list Benzin

Internals:
   CFGFN     
   DEF        Tankerkoenig xxx
   NAME       Benzin
   NR         29442
   NTFY_ORDER 50-Benzin
   STATE      ???
   TYPE       Spritpreis
   helper:
Attributes:


kannst Du mal dein Define posten? ich hab irgendwann mal die Syntax geändert, jetzt müssen der dienst "Tankerkönig" und der API Key in einer Zeile stehen.

Ich könnte mir vorstellen, dass Du den "master" Zweig ausgecheckt hast. Ich bin mir nicht sicher, ob das auf dem neuesten Stand ist, versuch's doch mal mit "develop"

Grüße

pj

martins

Ich möchte ebenso einmal eine Rückmeldung geben, bei mir läuft das Modul seit einem Jahr Stabil und die Preise werden auch aktualisiert. Das Modul wird bei mir regelmäßig verwendet.

mahowi

Zitat von: pjakobs am 20 April 2018, 14:37:42
kannst Du mal dein Define posten? ich hab irgendwann mal die Syntax geändert, jetzt müssen der dienst "Tankerkönig" und der API Key in einer Zeile stehen.

Ich könnte mir vorstellen, dass Du den "master" Zweig ausgecheckt hast. Ich bin mir nicht sicher, ob das auf dem neuesten Stand ist, versuch's doch mal mit "develop"

Sorry, ich hab Deine Antwort gerade erst gelesen.

defmod Benzin Spritpreis Tankerkoenig xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Das ist das Modul aus dem "develop"-Zweig. (Update über https://raw.githubusercontent.com/pljakobs/fhem_spritpreis_module/develop/controls_spritpreis.txt)

Nach add und update kommt 2018.04.25 07:50:30.529 3 : Benzin: get Benzin add 831548ca-4b4e-4879-b671-a7fc4c0a2431
2018.04.25 07:50:30.530 4 : Benzin add: args[0]=831548ca-4b4e-4879-b671-a7fc4c0a2431

2018.04.25 07:51:41.815 1 : PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/72_Spritpreis.pm line 136.
2018.04.25 07:51:41.816 3 : Benzin: get Benzin update
2018.04.25 07:51:41.817 4 : Benzin: called Spritpreis_Tankerkoenig_updateAll
2018.04.25 07:51:41.817 4 : Benzin: updateAll set timer for 1524636401.81764 delay 900


Bei get test kommt dann der API-Fehler:
2018.04.25 07:53:01.187 3 : Benzin: get Benzin test 831548ca-4b4e-4879-b671-a7fc4c0a2431
2018.04.25 07:53:01.187 4 : Benzin: called Spritpreis_Tankerkoenig_populateStationsFromAttr
2018.04.25 07:53:01.188 4 : Benzin: got ID String
2018.04.25 07:53:01.188 3 : Benzin: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it


Es werden auch keinerlei Readings angelegt.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

mumpitzstuff

Eine ID kann man nur mit set und nicht mit get hinzufügen. Der Aufruf lautet dann:

set <device> add id <id>

Wenn man das über die Oberfläche macht, muss man tatsächlich eingeben: id 831548ca-4b4e-4879-b671-a7fc4c0a2431

Das Modul zerlegt das noch mal intern...

mahowi

#76
Ich hatte in der Tat das "id" vergessen. Aber ich habe es jetzt auch nochmal über die Befehlszeile eingegeben und bekomme die Fehlermeldung:
set Benzin add id 831548ca-4b4e-4879-b671-a7fc4c0a2431
2018.04.25 10:03:38.352 3 : Benzin: get Benzin add id
2018.04.25 10:03:38.353 3 : Benzin: please provide a valid apikey, you can get it from https://creativecommons.tankerkoenig.de/#register. This function can't work without it


Edit: Der API-Key ist definitiv richtig. Ich habe mir gerade mal das Log auf Tankerkönig für den Key runtergeladen. Als einzigen Eintrag gibt es was von heute morgen um 8:08 Uhr, das müsste mein "get test" gewesen sein:
93.244.4.151 - - [25/Apr/2018:08:08:47 +0200] "GET /json/prices.php?ids=12121212-1212-1212-1212-121212121212&apikey=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx HTTP/1.0" 200 135 "-" "fhem" 0.005
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

pc1246

Moin
Ich erinnere mich, dass das mit den id's sehr seltsam war. Ich weiss aber nicht mehr, wie ich es hinbekommen habe!
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

mahowi

Wenn ich die Seite https://creativecommons.tankerkoenig.de/json/prices.php?ids=831548ca-4b4e-4879-b671-a7fc4c0a2431&apikey=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx direkt im Browser aufrufe, bekomme ich auch die Preise ohne Fehlermeldung als JSON zurück:
{"ok":true,"license":"CC BY 4.0 -  https:\/\/creativecommons.tankerkoenig.de","data":"MTS-K","prices":{"831548ca-4b4e-4879-b671-a7fc4c0a2431":{"status":"open","e5":1.379,"e10":1.359,"diesel":1.189}}}
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

pula

Mal so eine Frage. Hat das auch jemand mit spritpreisrechner.at in Betrieb?
Wäre nett, wenn jemand die def posten könnte...
Cheers,
Pula
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

mumpitzstuff

defmod SPRITPREISE HTTPMOD https://creativecommons.tankerkoenig.de/json/prices.php?ids=f56514c7-2dc9-46b7-ae45-4b812022a43f,51d4b4d6-a095-1aa0-e100-80009459e03a&apikey=<api Key> 900
attr SPRITPREISE enableControlSet 1
attr SPRITPREISE extractAllJSON 1
attr SPRITPREISE room TRAFFIC
attr SPRITPREISE stateFormat E5 (Di): prices_f56514c7-2dc9-46b7-ae45-4b812022a43f_e5€ / E5 (Fe): prices_51d4b4d6-a095-1aa0-e100-80009459e03a_e5€


Bei mir läuft das hier seit Monaten anstandslos. Den api Key oben müsst ihr ersetzen, falls ihr das verwendet.

pula

Danke sehr! Das ist aber leider für tankerkoenig und nicht für spritpreisrechner.at... :-(
cheers,
Pula
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

mumpitzstuff

#82
https://api.e-control.at/sprit/1.0/doc/index.html?url=https://api.e-control.at/sprit/1.0/api-docs%3Fgroup%3Dpublic-api

Guckst du:

defmod SPRITPREISE_AT HTTPMOD https://api.e-control.at/sprit/1.0/search/gas-stations/by-address?latitude=48.092431&longitude=16.287927&fuelType=DIE&includeClosed=false 900
attr SPRITPREISE_AT enableControlSet 1
attr SPRITPREISE_AT extractAllJSON 1
attr SPRITPREISE_AT room TRAFFIC


fuelType kannst du auf DIE, SUP oder GAS setzen. Die Koordinaten musst du anpassen.

pula

Super, vielen Dank! Hat auf Anhieb funktioniert!
Da das leider nicht die Abfrage einer einzelnen Tankstelle unterstützen, wird das wieder gepfriemel, die eine, die ich möchte rauszusuchen.
Ist aber trotzdem sehr lässig und einfach per HTTPMOD....
Cheers,
Pula
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

jkriegl

lief bislang wunderbar, habe gestern eine FHEM-update gemacht und jetzt wird nicht mehr aktualisiert.
im Log steht2019.07.04 22:18:34 3: tanke: get tanke update
2019.07.04 22:18:34 4: tanke: called Spritpreis_Tankerkoenig_updateAll
2019.07.04 22:18:34 5: tanke: i: 1, j: 1, id: 51d4b71e-a095-1aa0-e100-80009459e03a
2019.07.04 22:18:34 5: tanke: i: 2, j: 2, id: 8185cb0e-6dcf-42ad-a5e9-c63209564c96
2019.07.04 22:18:34 4: tanke: called https://creativecommons.tankerkoenig.de/json/prices.php?ids=67693691-5653-44b1-9c0f-1151ddc9ea40,51d4b71e-a095-1aa0-e100-80009459e03a,8185cb0e-6dcf-42ad-a5e9-c63209564c96&apikey=
2019.07.04 22:18:34 4: tanke(update all): Set ending at 3 IDList=67693691-5653-44b1-9c0f-1151ddc9ea40,51d4b71e-a095-1aa0-e100-80009459e03a,8185cb0e-6dcf-42ad-a5e9-c63209564c96
2019.07.04 22:18:34 4: tanke: updateAll set timer for 1562272414.17234 delay 900
2019.07.04 22:18:34 4: tanke: got PricesForLocation reply
2019.07.04 22:18:34 5: tanke: got data {"status":"error","ok":false,"message":"parameter error"}



2019.07.04 22:18:34 5: tanke: stations:$VAR1 = undef;

2019.07.04 22:18:34 4: tanke: checking ID 67693691-5653-44b1-9c0f-1151ddc9ea40
2019.07.04 22:18:34 4: tanke: checking ID 51d4b71e-a095-1aa0-e100-80009459e03a
2019.07.04 22:18:34 4: tanke: checking ID 8185cb0e-6dcf-42ad-a5e9-c63209564c96

Was muss ich anpassen?
Rpi 3, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

hjgode

Da würde ich mal die Adresse manuel im Borwser eingeben:

https://creativecommons.tankerkoenig.de/json/prices.php?ids=67693691-5653-44b1-9c0f-1151ddc9ea40,51d4b71e-a095-1aa0-e100-80009459e03a,8185cb0e-6dcf-42ad-a5e9-c63209564c96&apikey=

Natürlich um den API Key ergänzt.

An alle, bei denen das Modul nicht geladen wird: es verwendet einen unnötigen use Eintrag:
     use Time::HiRes qw(usleep nanosleep);

den einfach mal auskommentieren:
     #use Time::HiRes qw(usleep nanosleep);

Weder usleep noch nanosleep werden vom Modul genutzt. Diese beiden Funktionen stehen nicht in allen Perl Versionen und auf alle Rechnern zur Verfügung.
Debian SID mit aktuellem FHEM, nanoCUL 866, JeeLink EC3000, fhemduino, SIGNALduino,
3 x TFA TH Sensor, 1 x TFA TH Arduino Sender, 3 x EC3000, 4 x Elro Schaltsteckdosen, ESA2000
offline: Wibo Funkthermostat, 2 x ELV Funkthermostat FHT80, 2 FS20 ST4 Funksteckdose

Christoph Morrison

Hab mal einen Pull Request dafür aufgemacht.

pjakobs

Zitat von: Christoph Morrison am 15 Januar 2020, 19:04:50
Hab mal einen Pull Request dafür aufgemacht.

Hi Christoph,

danke für den PR, ich hab ihn gemerged.

Leider ist das Modul bei mir ein bisschen in Vergessenheit geraten - und war sowieso ursprünglich eher als "Fingerübung" gedacht, um ein Modul from Scratch zu schreiben.
Ich würde mich freuen, wenn jemand es "in Pflege" nehmen könnte, denn ich komm vermutlich in Zukunft auch nicht dazu, mich anständig darum zu kümmern.
Grüße

pj

mahowi

Könntest Du das "controls"-File bitte noch updaten? Sonst schlägt das Update leider fehl:
2020.01.16 09:35:13.402 1:  spritpreis
2020.01.16 09:35:13.906 1:  UPD FHEM/72_Spritpreis.pm
2020.01.16 09:35:14.107 1:  Got 29923 bytes for FHEM/72_Spritpreis.pm, expected 29961
2020.01.16 09:35:14.109 1:  aborting.


Danke!
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee