Ankündigung

Einklappen
Keine Ankündigung bisher.

Benzinpreis-Plugin

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Hallo,

    ich versuche mich gerade am Tankerkönig-Plugin und dessen Verwendung mit SmartHomeNG.
    Aufgrund von Performancegründen sollte man sich sich ja auf die Funktion
    Code:
    get_petrol_station_prices
    beschränken.
    Der Aufruf erfolgt über eine Logik.
    Könnte man die Logik so gestalten, dass der die items.yaml nach "tankerkoenig_id" durchsucht ggf. auch die Keys wie bspw "e5" und dann die Abfrage der Werte über diese "Sammlung" macht? Ansonsten müsste man die "tankerkoenig_id" doppelt pflegen?

    Danke für Eure Rückmeldung.

    Kommentar


      #17
      Ja könnte man sicher?!

      Kommentar


        #18
        Dazu reichen mein Programmierkentnisse nicht. Leider.
        Wie nutzt Du das Plugin? Über shNG oder smartVISU?

        Kommentar


          #19
          das plugin über shng, die befuellten items via smartvisu?!

          Kommentar


            #20
            psilo
            Könntest Du bitte mal eine Beispiel-Config posten?
            Danke.

            Kommentar


              #21
              Sisamiwe von was? den tankstellen die ich in beobachtung habe? oder die logik die die top 5 ausliest?

              Hier die Logik - die Adressdaten unten habe ich auf Wunsche der Tankerkoenig Leute statisch hinterlegt:
              Code:
              import csv
              
              with open('/web/smartVISU/temp/petrol_stations.csv', 'w') as csvfile:
                  fieldnames = ['place', 'brand', 'houseNumber', 'street', 'id', 'lng', 'name', 'lat', 'price', 'dist', 'isOpen', 'postCode']
                  writer = csv.DictWriter(csvfile, fieldnames=fieldnames, extrasaction='ignore')
              
                  writer.writeheader()
                  petrol_stations = sh.tankerkoenig.get_petrol_stations(sh._lat, sh._lon, 'diesel', 'price', rad='7')
                  if not petrol_stations is None:
                      for element in petrol_stations:
                          if element['id'] == 'c7ef3329-82d0-4cd7-9106-781ddf0164ec':
                              sh.petrol_station.EKZ.diesel(element['price'])
                          if element['price'] is not None:
                              writer.writerow(element)
              
              
              with open('/web/smartVISU/temp/petrol_stations_selected.csv', 'w') as csvfile:
                  #fieldnames = ['e5', 'e10', 'diesel', 'street', 'houseNumber', 'postCode', 'place', 'brand', 'id', 'lng', 'name', 'lat', 'isOpen']
                  fieldnames = ['e5', 'e10', 'diesel', 'street', 'houseNumber', 'place', 'lat', 'lng', 'name', 'brand', 'isOpen', 'status']
                  writer = csv.DictWriter(csvfile, fieldnames=fieldnames, extrasaction='ignore')
                  prices = sh.tankerkoenig.get_petrol_station_prices(['8f9beb3d-c617-47f1-08f7-cccb612a7dce','32f30926-01dd-41aa-9e05-7820caafd24f'])
                  writer.writeheader()
                  if not prices is None:
                      for element in prices:
                          if element['status'] in ['open']:
                              if element['id'] == "8f9beb3d-c617-47f1-08f7-cccb612a7dce":
                                  element['lat'] = "48.214822"
                                  element['lng'] = "11.546543"
                                  element['name'] = "Süd-Treibstoff"
                                  element['brand'] = "Freie Tankstelle"
                                  element['isOpen'] = "True"
                                  element['place'] = "München"
                                  element['street'] = "Duelferstr."
                                  element['houseNumber'] = "52"
                                  sh.petrol_station.FREIE_TS_DUELFERSTR.diesel(element['diesel'])
                              elif element['id'] == "32f30926-01dd-41aa-9e05-7820caafd24f":
                                  element['lat'] = "48.1411858"
                                  element['lng'] = "11.4139547"
                                  element['name'] = "Bavaria Petrol"
                                  element['brand'] = "Bavaria Petrol"
                                  element['isOpen'] = "True"
                                  element['place'] = "München"
                                  element['street'] = "Bodenseestraße"
                                  element['houseNumber'] = "317"
              
                              writer.writerow(element)
              Items:
              Code:
              petrol_station:
              
                 EKZ:
                      tankerkoenig_id: c7ef3329-82d0-4cd7-9106-781ddf0164ec
              
                      diesel:
                          type: num
                          visu_acl: ro
                          database@mysqldb: init
              
                          cent:
                              type: num
                              visu_acl: ro
                              database@mysqldb: init
                              eval: (round(sh.petrol_station.EKZ.diesel()*100))
                              eval_trigger: petrol_station.EKZ.diesel
              
                      name:
                          type: str
                          visu_acl: ro
              
                      isOpen:
                          type: bool
                          visu_acl: ro
              
                  FREIE_TS_DUELFERSTR:
                      tankerkoenig_id: 6367ff9a-823c-40c6-b656-025530bbf7cd
              
                      diesel:
                          type: num
                          visu_acl: ro
                          database@mysqldb: init
              
                          cent:
                              type: num
                              visu_acl: ro
                              database@mysqldb: init
                              eval: (round(sh.petrol_station.FREIE_TS_DUELFERSTR.diesel()*100))
                              eval_trigger: petrol_station.FREIE_TS_DUELFERSTR.diesel
              
                      name:
                          type: str
                          visu_acl: ro
              
                      brand:
                          type: str
                          visu_acl: ro
              
                      isOpen:
                          type: bool
                          visu_acl: ro
              Wie man das CSV in der SV anzeigt mag ich jetzt aber net wirklich erklären. Kostet alles leider Zeit... Ist ähnlich wie bei den Anrufen von der FB gemacht.
              Zuletzt geändert von psilo; 13.05.2018, 15:51.

              Kommentar


                #22
                psilo
                Vielleicht stelle ich mich auch nur blöd an....
                Wenn es Dir nichts aus macht, von beiden.

                Ich kann dann wieder einen Blog-Eintrag dazu schreiben.
                OK?

                Kommentar


                  #23
                  Sisamiwe und nein, ich werte die tankerkoenig id bisher nicht aus dem item aus. und ja ich sehe gerade, dass die 2te tanke in der logik nicht ins item (Aber ins CSV) geschrieben wird. aber ich habe gerade echt anderes zu tun als mein zeug aufzuraeumen.. es funktioniert für mich nutzbar, daher...
                  Zuletzt geändert von psilo; 13.05.2018, 15:53.

                  Kommentar


                    #24
                    Sisamiwe am beispiel greifst du übrigens so auf die ID zu:

                    Code:
                    sh.petrol_station.FREIE_TS_DUELFERSTR.conf['tankerkoenig_id']

                    Kommentar


                      #25
                      psilo

                      Danke für den Code.
                      Ich hatte das auch schon am Laufen und nun kommt ständig eine Fehlermeldung im Log und ich komme damit nicht weiter.

                      Meine Logik:
                      Code:
                      #!/usr/bin/env python3
                      # petrol_station_csv_logic.py
                      
                      import csv
                      
                      with open('/var/www/html/smartVISU2.9/pages/ZHW7/fuel/petrol_stations_e5.csv', 'w') as csvfile:
                          fieldnames = ['place', 'brand', 'houseNumber', 'street', 'id', 'lng', 'name', 'lat', 'price', 'dist', 'isOpen', 'postCode']
                          writer = csv.DictWriter(csvfile, fieldnames=fieldnames, extrasaction='ignore')
                      
                          writer.writeheader()
                          petrol_stations_e5 = sh.tankerkoenig.get_petrol_stations(sh._lat, sh._lon, 'e5', 'price', rad='7')
                          if not petrol_stations_e5 is None:
                              for element in petrol_stations_e5:
                      #            if element['id'] == 'c7ef3329-82d0-4cd7-9106-781ddf0164ec':
                      #                sh.petrol_station.EKZ.e5(element['price'])
                                  if element['price'] is not None:
                                      writer.writerow(element)
                      
                      with open('/var/www/html/smartVISU2.9/pages/ZHW7/fuel/petrol_stations_diesel.csv', 'w') as csvfile:
                          fieldnames = ['place', 'brand', 'houseNumber', 'street', 'id', 'lng', 'name', 'lat', 'price', 'dist', 'isOpen', 'postCode']
                          writer = csv.DictWriter(csvfile, fieldnames=fieldnames, extrasaction='ignore')
                      
                          writer.writeheader()
                          petrol_stations_diesel = sh.tankerkoenig.get_petrol_stations(sh._lat, sh._lon, 'diesel', 'price', rad='7')
                          if not petrol_stations_diesel is None:
                              for element in petrol_stations_diesel:
                      #            if element['id'] == 'c7ef3329-82d0-4cd7-9106-781ddf0164ec':
                      #                sh.petrol_station.EKZ.diesel(element['price'])
                                  if element['price'] is not None:
                                      writer.writerow(element)
                      und die Fehlermeldung aus dem Log:
                      Code:
                      2018-05-13  20:55:07 INFO     CP Server Thread-21 logic_findnew: _config = '{'PetrolStationCSVLogic': OrderedDict([('visu_acl', 'ro'), ('filename', 'petrol_station_csv_logic.py'), ('cycle', '360'), ('crontab', 'init'), ('pathname', '/usr/local/smarthome/logics/petrol_station_csv_logic.py')]), 'tankstelle1': OrderedDict([('visu_acl', 'ro'), ('filename', 'tankstelle1.py'), ('cycle', '180'), ('pathname', '/usr/local/smarthome/logics/tankstelle1.py')]), 'time': OrderedDict([('visu_acl', 'true'), ('filename', 'time.py'), ('crontab', ['init', '* * * *']), ('pathname', '/usr/local/smarthome/logics/time.py')]), 'WindLogic': OrderedDict([('filename', 'wind.py'), ('crontab', 'init'), ('watch_item', 'weather.wundergrund.windgeschwindigkeit.ms'), ('visu_acl', 'yes'), ('pathname', '/usr/local/smarthome/logics/wind.py')]), 'json_requests': OrderedDict([('filename', 'json_requests.py'), ('cycle', '180'), ('enabled', 'False'), ('pathname', '/usr/local/smarthome/logics/json_requests.py')]), 'UZSU_control': OrderedDict([('visu_acl', 'true'), ('filename', 'rollo_uzsu.py'), ('watch_item', ['uzsu_test.tuer']), ('pathname', '/usr/local/smarthome/logics/rollo_uzsu.py')]), 'HSV': OrderedDict([('enabled', 'True'), ('filename', 'hsv_umrechnung.py'), ('watch_item', ['Dimmer.One.HSV.H', 'Dimmer.One.HSV.S', 'Dimmer.One.HSV.V']), ('pathname', '/usr/local/smarthome/logics/hsv_umrechnung.py')])}'
                      2018-05-13  20:55:07 INFO     CP Server Thread-21 192.168.2.107 - - [13/May/2018:20:55:07] "POST /backend/logics.html HTTP/1.1" 200 25732 "http://192.168.2.12:8383/backend/logics.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
                      2018-05-13  20:55:11 ERROR    logics.PetrolStationCSVLogic Logic: logics.PetrolStationCSVLogic, File: /usr/lib/python3.5/json/decoder.py, Line: 357, Method: raw_decode, Exception: Expecting value: line 1 column 1 (char 0)
                      Traceback (most recent call last):
                        File "/usr/local/smarthome/lib/scheduler.py", line 425, in _task
                          exec(obj.bytecode)
                        File "/usr/local/smarthome/logics/petrol_station_csv_logic.py", line 11, in <module>
                          petrol_stations_diesel = sh.tankerkoenig.get_petrol_stations(sh._lat, sh._lon, 'diesel', 'price', rad='7')
                        File "/usr/local/smarthome/plugins/tankerkoenig/__init__.py", line 74, in get_petrol_stations
                          json_obj = response.json()
                        File "/usr/local/lib/python3.5/dist-packages/requests/models.py", line 892, in json
                          return complexjson.loads(self.text, **kwargs)
                        File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
                          return _default_decoder.decode(s)
                        File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
                          obj, end = self.raw_decode(s, idx=_w(s, 0).end())
                        File "/usr/lib/python3.5/json/decoder.py", line 357, in raw_decode
                          raise JSONDecodeError("Expecting value", s, err.value) from None
                      json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
                      Sagt Dir das was?

                      Kommentar


                        #26
                        stimmen deine ids noch? die aendern sich leider manchmal.
                        welche version verwendest du? im dev waren paar dinge erweitert

                        Kommentar


                          #27
                          psilo
                          nach dem Motto: "Jeder Boot tut gut" habe ich meinen RPI neu gestartet und nun geht es wieder.
                          Keine Ahnung warum.
                          Danke Dir!

                          Nachtrag:
                          Wenn man die Logik ändert und via dem Backend neu lädt, kommt der Fehler wieder.
                          Nach einen Neustart (Reboot) geht es wieder.
                          Zuletzt geändert von Sisamiwe; 13.05.2018, 21:03.

                          Kommentar


                            #28
                            again:
                            - welche versionen. (plugin und core)
                            - WIE sieht die Logik aus?
                            - WIE sehen die weiteren Parameter der Logik (watch_item, cron, etc.) aus?
                            - wenn man sie WIE aendert? was sagt das log wenn man sie ändert? was sagt das log, wenn man sie triggert?
                            - was passiert wenn man sie NICHT ändert und neu lädt bzw. nur eine leerzeile einfuegt
                            Zuletzt geändert von psilo; 14.05.2018, 04:20.

                            Kommentar


                              #29
                              ich habe bei mir gestern das laden der id aus dem item auch via backend gemacht und hatte diese probleme nicht.

                              jetzt aber erstmal ins buero..

                              Kommentar


                                #30
                                Hallo,
                                ich versuche mal eine besser Beschreibung:

                                Ich habe 2 Tests gemacht:

                                1) Core und Plugins auf Master
                                Hier kommt es immer zu Fehlern beim Aufruf der Logik

                                Plugin.yaml
                                Code:
                                #Tankerkönig
                                tankerkoenig:
                                    class_name: TankerKoenig
                                    class_path: plugins.tankerkoenig
                                    apikey: 'xxxxxx'
                                Logic.yaml
                                Code:
                                PetrolStationCSVLogic:
                                    visu_acl: ro
                                    filename: petrol_station_csv_logic.py
                                    cycle: 360
                                    crontab: init

                                Logik:
                                Code:
                                #!/usr/bin/env python3
                                # petrol_station_csv_logic.py
                                
                                import csv
                                
                                with open('/var/www/html/smartVISU2.9/pages/ZHW7/fuel/petrol_stations_e5.csv', 'w') as csvfile:
                                    fieldnames = ['place', 'brand', 'houseNumber', 'street', 'id', 'lng', 'name', 'lat', 'price', 'dist', 'isOpen', 'postCode']
                                    writer = csv.DictWriter(csvfile, fieldnames=fieldnames, extrasaction='ignore')
                                
                                    writer.writeheader()
                                    petrol_stations_e5 = sh.tankerkoenig.get_petrol_stations(sh._lat, sh._lon, 'e5', 'price', rad='7')
                                    if not petrol_stations_e5 is None:
                                        for element in petrol_stations_e5:
                                #            if element['id'] == 'c7ef3329-82d0-4cd7-9106-781ddf0164ec':
                                #                sh.petrol_station.EKZ.e5(element['price'])
                                            if element['price'] is not None:
                                                writer.writerow(element)
                                
                                with open('/var/www/html/smartVISU2.9/pages/ZHW7/fuel/petrol_stations_diesel.csv', 'w') as csvfile:
                                    fieldnames = ['place', 'brand', 'houseNumber', 'street', 'id', 'lng', 'name', 'lat', 'price', 'dist', 'isOpen', 'postCode']
                                    writer = csv.DictWriter(csvfile, fieldnames=fieldnames, extrasaction='ignore')
                                
                                    writer.writeheader()
                                    petrol_stations_diesel = sh.tankerkoenig.get_petrol_stations(sh._lat, sh._lon, 'diesel', 'price', rad='7')
                                    if not petrol_stations_diesel is None:
                                        for element in petrol_stations_diesel:
                                #            if element['id'] == 'c7ef3329-82d0-4cd7-9106-781ddf0164ec':
                                #                sh.petrol_station.EKZ.diesel(element['price'])
                                            if element['price'] is not None:
                                                writer.writerow(element)
                                Log:
                                Code:
                                2018-05-14  02:01:08 ERROR    logics.PetrolStationCSVLogic Logic: logics.PetrolStationCSVLogic, File: /usr/local/smarthome/plugins/tankerkoenig/__init__.py, Line: 76, Method: get_petrol_stations, Exception: 'stations'
                                Traceback (most recent call last):
                                  File "/usr/local/smarthome/lib/scheduler.py", line 425, in _task
                                    exec(obj.bytecode)
                                  File "/usr/local/smarthome/logics/petrol_station_csv_logic.py", line 11, in <module>
                                    petrol_stations_e5 = sh.tankerkoenig.get_petrol_stations(sh._lat, sh._lon, 'e5', 'price', rad='7')
                                  File "/usr/local/smarthome/plugins/tankerkoenig/__init__.py", line 76, in get_petrol_stations
                                    for i in json_obj['stations']:
                                KeyError: 'stations'
                                2018-05-14  02:01:08 ERROR    logics.tankstelle1 Logic: logics.tankstelle1, File: /usr/local/smarthome/plugins/tankerkoenig/__init__.py, Line: 127, Method: get_petrol_station_prices, Exception: 'prices'
                                Traceback (most recent call last):
                                  File "/usr/local/smarthome/lib/scheduler.py", line 425, in _task
                                    exec(obj.bytecode)
                                  File "/usr/local/smarthome/logics/tankstelle1.py", line 9, in <module>
                                    prices = sh.tankerkoenig.get_petrol_station_prices(['51d4b4e8-a095-1aa0-e100-80009459e03a','51d4b51f-a095-1aa0-e100-80009459e03a','77f1b150-2935-41d0-ab73-8cceda50c0db'])
                                  File "/usr/local/smarthome/plugins/tankerkoenig/__init__.py", line 127, in get_petrol_station_prices
                                    if key in json_obj['prices'][id]:
                                KeyError: 'prices'

                                2) Core auf Master und Plugins auf Develop (heute)
                                Hier kommt es bereits zu einem Fehler beim Init des Plugin

                                Plugin.yaml
                                Code:
                                #Tankerkönig
                                tankerkoenig:
                                    class_name: TankerKoenig
                                    class_path: plugins-develop.tankerkoenig
                                    apikey: 'xxxxxx'
                                Log:
                                Code:
                                2018-05-14  21:36:57 INFO     Main         Loading '/usr/local/smarthome/plugins-develop/tankerkoenig/plugin.yaml' to 'OrderedDict'
                                2018-05-14  21:36:58 INFO     Main         plugin 'tankerkoenig': Metadata paramlist = '['apikey']'
                                2018-05-14  21:36:58 ERROR    Main         Plugin 'tankerkoenig' exception during import of __init__.py: invalid syntax (<string>, line 1)
                                Traceback (most recent call last):
                                  File "/usr/local/smarthome/lib/plugin.py", line 364, in __init__
                                    exec("import {0}".format(classpath))
                                  File "<string>", line 1
                                    import plugins-develop.tankerkoenig
                                                  ^
                                SyntaxError: invalid syntax
                                Ich habe das auch auf meinem zweiten System getestet. Gleiches Ergebnis.
                                Hilft das?

                                Kommentar

                                Lädt...
                                X