Modul-Fingerübung: Spritpreis

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

Vorheriges Thema - Nächstes Thema

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