Autor Thema: Modul-Fingerübung: Spritpreis  (Gelesen 4689 mal)

Offline jkriegl

  • Full Member
  • ***
  • Beiträge: 110
Antw:Modul-Fingerübung: Spritpreis
« Antwort #30 am: 24 Januar 2017, 13:55:19 »
@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

Offline martins

  • Developer
  • Jr. Member
  • ****
  • Beiträge: 83
Antw:Modul-Fingerübung: Spritpreis
« Antwort #31 am: 24 Januar 2017, 15:56:17 »
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

Offline martins

  • Developer
  • Jr. Member
  • ****
  • Beiträge: 83
Antw:Modul-Fingerübung: Spritpreis
« Antwort #32 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.

Offline pjakobs

  • Sr. Member
  • ****
  • Beiträge: 526
Antw:Modul-Fingerübung: Spritpreis
« Antwort #33 am: 25 Januar 2017, 19:43:30 »
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

Offline martins

  • Developer
  • Jr. Member
  • ****
  • Beiträge: 83
Antw:Modul-Fingerübung: Spritpreis
« Antwort #34 am: 25 Januar 2017, 22:44:19 »
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

Offline unimatrix

  • Developer
  • Full Member
  • ****
  • Beiträge: 410
Antw:Modul-Fingerübung: Spritpreis
« Antwort #35 am: 29 Januar 2017, 22:02:04 »
Kann es sein dass es bei Tankerkoenig nicht mehr den Meldungsknopf gibt um die IDs zu finden? Oder geht das jetzt irgendwie anders?

Offline pjakobs

  • Sr. Member
  • ****
  • Beiträge: 526
Antw:Modul-Fingerübung: Spritpreis
« Antwort #36 am: 04 Februar 2017, 14:02:50 »
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

Offline pjakobs

  • Sr. Member
  • ****
  • Beiträge: 526
Antw:Modul-Fingerübung: Spritpreis
« Antwort #37 am: 07 Februar 2017, 08:36:05 »
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

Offline mrfloppy

  • Full Member
  • ***
  • Beiträge: 115
Antw:Modul-Fingerübung: Spritpreis
« Antwort #38 am: 07 Februar 2017, 15:36:42 »
..... dann würde ich als nächstes wohl die Funktion für den Österreichischen Anbieter einbauen.

Ja bitte das wäre sehr toll

LG
Cubietruck, Fhem 5.8, CCU2, RFXtrx433 E USB, KeyMatic, Div. Thermostate, CUL433, Fhemduino, Temp/luftfeuchesensoren,Fensterkontakte,Intertechno Schalter,.......

Offline jkriegl

  • Full Member
  • ***
  • Beiträge: 110
Antw:Modul-Fingerübung: Spritpreis
« Antwort #39 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.
Rpi 3, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram

Offline pjakobs

  • Sr. Member
  • ****
  • Beiträge: 526
Antw:Modul-Fingerübung: Spritpreis
« Antwort #40 am: 07 Februar 2017, 18:33:39 »
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

Offline jkriegl

  • Full Member
  • ***
  • Beiträge: 110
Antw:Modul-Fingerübung: Spritpreis
« Antwort #41 am: 07 Februar 2017, 18:57:03 »
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
« Letzte Änderung: 07 Februar 2017, 19:00:34 von jkriegl »
Rpi 3, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram

Offline martins

  • Developer
  • Jr. Member
  • ****
  • Beiträge: 83
Antw:Modul-Fingerübung: Spritpreis
« Antwort #42 am: 07 Februar 2017, 23:10:39 »
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

Offline Intruder1956

  • Full Member
  • ***
  • Beiträge: 375
  • Auch wenn man Älter wird, kann man besser werden
Antw:Modul-Fingerübung: Spritpreis
« Antwort #43 am: 07 Februar 2017, 23:27:40 »
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
« Letzte Änderung: 07 Februar 2017, 23:29:57 von Intruder1956 »
Raspi 3 SD16GB+USB-Stick 32MB Jessie, Cul 868Mhz;Cul 433Mhz = Busware, JeeLink, HM-CFG-USB-2, FHEM 5.7, Uniroll, IT YCR-100 TMT2100,ITR-1500, LD382 mit Wifilight, ESA 2000 + SENSOR WZ SET,FS20 TFK, HM-Sec-SC, HM-CC-RT-DN, RPI B+, RPI2 und FB 7390 steht noch rum, keine Ahnung wofür einsetzen

Offline pjakobs

  • Sr. Member
  • ****
  • Beiträge: 526
Antw:Modul-Fingerübung: Spritpreis
« Antwort #44 am: 09 Februar 2017, 10:17:21 »
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

 

decade-submarginal