Ankündigung

Einklappen
Keine Ankündigung bisher.

Inhalt einer Textdatei auf den Bus senden

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

    #16
    connections habe ich rausgeworfen, fehler ist weg.

    Nun bekomme ich
    Code:
    ParadigmaSystaComfort Method ParadigmaSystaComfort exception: 'ParadigmaSystaComfort' object has no attribute '_lock' -- scheduler.py:_task:348
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 344, in _task
        obj()
      File "/usr/local/smarthome/plugins/paradigma/__init__.py", line 41, in _refresh
        self._lock.acquire()
    AttributeError: 'ParadigmaSystaComfort' object has no attribute '_lock'
    da hilft auskommentieren nicht weiter...

    ... aaah, ich hatte irgendwann vergessen am anfang
    Code:
    import subprocess
    import json
    mitzunehmen. Das noch ergänzt durch import threading - bin stolz auf mich!

    Weiter gehts:
    Code:
    problem creating: global name 'logger' is not defined
    - alles klar, noch import logger rein, allmählich kapiere ich es ein wenig.

    Aber jetzt bin ich an einem Punkt, wo ich wieder nachfragen muss:
    Code:
    2015-01-06 20:11:57,262 ERROR    Main         Item HaustechnikTechnik.Paradigma.Kollektor_TSA: problem creating: global name 'logger' is not defined -- item.py:__init__:221
    2015-01-06 20:11:57,293 INFO     Main         Start Plugins -- plugin.py:start:65
    2015-01-06 20:11:57,311 INFO     Main         Start Logics -- logic.py:__init__:33
    2015-01-06 20:11:57,411 ERROR    ParadigmaSystaComfort Method ParadigmaSystaComfort exception: Command '['/usr/bin/curl', 'http://paradigma.remoteportal.de/ajax.php', '-H Host: paradigma.remoteportal.de', '-H User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0', '-H Accept: application/json, text/javascript, */*; q=0.01', '-H Accept-Language: de,en-US;q=0.7,en;q=0.3', '-H Accept-Encoding: gzip, deflate', '-H DNT: 1 -H Content-Type: application/x-www-form-urlencoded; charset=UTF-8', '-H X-Requested-With: XMLHttpRequest', '-H Referer: http://paradigma.remoteportal.de/index.php?pto[area]=-controller', '-H Cookie: ibb=xxx', '-H Connection: keep-alive', '-H Pragma: no-cache', '-H Cache-Control: no-cache', '--data call=controller.status&param[controllerId]=12720&param[mode]=text']' returned non-zero exit status 2 -- scheduler.py:_task:348
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 344, in _task
        obj()
      File "/usr/local/smarthome/plugins/paradigma/__init__.py", line 61, in _refresh
        '--data call=controller.status&param[controllerId]=%s&param[mode]=text' % self._id])
      File "/usr/lib/python3.2/subprocess.py", line 522, in check_output
        raise CalledProcessError(retcode, cmd, output=output)
    subprocess.CalledProcessError: Command '['/usr/bin/curl', 'http://paradigma.remoteportal.de/ajax.php', '-H Host: paradigma.remoteportal.de', '-H User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0', '-H Accept: application/json, text/javascript, */*; q=0.01', '-H Accept-Language: de,en-US;q=0.7,en;q=0.3', '-H Accept-Encoding: gzip, deflate', '-H DNT: 1 -H Content-Type: application/x-www-form-urlencoded; charset=UTF-8', '-H X-Requested-With: XMLHttpRequest', '-H Referer: http://paradigma.remoteportal.de/index.php?pto[area]=-controller', '-H Cookie: ibb=xxx', '-H Connection: keep-alive', '-H Pragma: no-cache', '-H Cache-Control: no-cache', '--data call=controller.status&param[controllerId]=12720&param[mode]=text']' returned non-zero exit status 2
    Hier ist die aktuelle Datei:
    Code:
    import subprocess
    import json
    import threading
    import logging
    
    
    class ParadigmaSystaComfort: 
    	_sensors = {} 
    	alive = True 
    
    
    	def __init__(self, smarthome, cycle=120, cookie='XXX', id='YYY'): 
    		self._sh = smarthome 
    		self._cycle = int(cycle) 
    		self._cookie = cookie 
    		self._id = id 
    		self._lock = threading.Lock() 
    
    #		smarthome.connections.monitor(self) 
    
    
    	def _refresh(self): 
    		self._lock.acquire() 
    		jsontext = subprocess.check_output(['/usr/bin/curl', 'http://paradigma.remoteportal.de/ajax.php', \
    											'-H Host: paradigma.remoteportal.de', \
    											'-H User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0', \
    											'-H Accept: application/json, text/javascript, */*; q=0.01', \
    											'-H Accept-Language: de,en-US;q=0.7,en;q=0.3', \
    											'-H Accept-Encoding: gzip, deflate', \
    											'-H DNT: 1 -H Content-Type: application/x-www-form-urlencoded; charset=UTF-8', \
    											'-H X-Requested-With: XMLHttpRequest', \
    											'-H Referer: http://paradigma.remoteportal.de/index.php?pto[area]=-controller', \
    											'-H Cookie: ibb=%s' % self._cookie, \
    											'-H Connection: keep-alive', \
    											'-H Pragma: no-cache', \
    											'-H Cache-Control: no-cache', \
    											'--data call=controller.status&param[controllerId]=%s&param[mode]=text' % self._id])
    		
    		table = {}
    		table["245534"] = json_text["values"]["245534"]	#Kollektor -TSA-
    		table["245542"] = json_text["values"]["245542"]	#Kollektor Maximum
    		table["245543"] = json_text["values"]["245543"]	#Solare Leistung
    		table["245544"] = json_text["values"]["245544"]	#Tagesgewinn
    		table["245545"] = json_text["values"]["245545"]	#Solargewinn
    		table["245538"] = json_text["values"]["245538"]	#Aussentemperatur -TAM-
    		table["245535"] = json_text["values"]["245535"]	#Solarruecklauf -TSE-
    		table["245536"] = json_text["values"]["245536"]	#Solarvorlauf -TSV-
    		table["245537"] = json_text["values"]["245537"]	#Speicher Oben -TW-
    		table["245540"] = json_text["values"]["245540"]	#Volumenstrom
    		table["245541"] = json_text["values"]["245541"]	#Speicher Oben -TW2-
    		table["245546"] = json_text["values"]["245546"]	#Kollektor 1 -TSA 1-
    		table["245548"] = json_text["values"]["245548"]	#Laufzeit Pumpe
    		table["245549"] = json_text["values"]["245549"]	#Zeit TSA MAX
    		table["245564"] = json_text["values"]["245564"]	#Puffer Sollwert
    		table["245565"] = json_text["values"]["245565"]	#Puffer oben -TPO-
    		table["245566"] = json_text["values"]["245566"]	#Betriebsstunden
    		table["245567"] = json_text["values"]["245567"]	#Kesselvorlauf -TV-
    		
    		for addr in self._sensors: 
    			if addr not in table: 
    				logger.debug("paradigmaSystaComfort: {0} not in sensors".format(addr)) 
    			else: 
    				value = table[addr] 
    				item = self._sensors[addr] 
    				item(value, 'paradigmaSystaComfort') 
    		
    		self._lock.release() 
    		
    		
    		
    		
    
    	def run(self): 
    		self.alive = True 
    		self._sh.scheduler.add('ParadigmaSystaComfort', self._refresh, cycle=self._cycle, prio=5, offset=0) 
    
    	def stop(self): 
    		self.alive = False 
    
    
    
    
    	def parse_item(self, item): 
    		if 'paradigmaSystaComfort_ID' not in item.conf: 
    			return 
    		addr = item.conf['paradigmaSystaComfort_ID'] 
    		self._sensors[addr] = item 
    		logger.info("paradigmaSystaComfort: Sensor {0} added.".format(addr))
    Angehängte Dateien

    Kommentar


      #17
      Hm... ich komme nicht weiter.

      Das Hauptproblem scheint in der curl Abfrage zu liegen. Was bedeutet der Fehler "command ... returned non-zero exit status 2"? Keine Daten? Falscher Aufruf? Habe den Aufruf so wie er war direkt in python getestet, Screenshot:



      "curl: Option --data... is unknown" - auf der shell funktionierts doch auch:

      Angehängte Dateien

      Kommentar


        #18
        ... mit -d statt --data scheint es zu gehen (bei mir).

        Kommentar


          #19
          Danke walldi,

          -d hat funktioniert.

          Jetzt wird gemeldet dass "logger" und "value" nichtdefiniert seien:
          Code:
           2015-01-07 09:08:48,672 ERROR    Main         Item HaustechnikTechnik.Paradigma.Kollektor_TSA: problem creating: global name 'logger' is not defined -- item.py:__init__:221
          2015-01-07 09:08:48,702 INFO     Main         Start Plugins -- plugin.py:start:65
          2015-01-07 09:08:48,717 INFO     Main         Start Logics -- logic.py:__init__:33
          2015-01-07 09:08:49,363 ERROR    ParadigmaSystaComfort Method ParadigmaSystaComfort exception: global name 'values' is not defined -- scheduler.py:_task:348
          Traceback (most recent call last):
            File "/usr/local/smarthome/lib/scheduler.py", line 344, in _task
              obj()
            File "/usr/local/smarthome/plugins/paradigma/__init__.py", line 67, in _refresh
              table[245534] = json_text[values][245534]	#Kollektor -TSA-
          NameError: global name 'values' is not defined
          Bei "logger" wundert es mich, das dachte ich durch "import logging" behoben zu haben.

          Kommentar


            #20
            So, ich habe mal versucht anzuwenden was ich gestern über python gelernt habe. Als Nicht-Programmierer nehme ich gern auch Hinweise zu meiner Vorgehensweise an sich entgegen.

            Die Abfrage gibt keinen Fehler aus, überträgt aber anscheinend auch keine Daten:

            Code:
            >>> print (json_text)
            b''
            Also hole ich mir die Daten erstmal anders in die Variable(?) json_text. Dazu habe ich die Datei vom noch laufenden Cron in /tmp abgelegt.

            Code:
            >>> json_text = subprocess.check_output(['less', '/tmp/systawerte.csv'])
            kein Fehler, freue mich!

            Code:
            >>> print (json_text)
            Zur Besseren Lesbarkeit die Ausgabe hier (nicht als Einzeiler)
            b'{"showInfo":0,"changeExists":0,"changeMsg":[],"values":{"245614":"0","245615":"1","245616":"1", "245617":"0","245618":"0","245619":"0","245620":"0 ","245621":"0","245622":"0","245623":"0","245624": "0","245625":"1","245626":"0","275049":"0","265973 ":"0","245628":"0","245630":"0","266835":"0","2668 36":"0","266837":"0","245631":"0","245633":"0","24 5632":"0","286758":"0","286759":"0","286760":"0"," 286761":"0","245634":"550","245635":"Auto","245636 ":"Vorrang W\\u00e4rmesenke 1","245637":"800","245638":"800","245639":"Keine", "275422":"0","254999":"0","255000":"0","255001":"0 ","245641":"0","245642":"3","245643":"15","245644" :"50","245646":"950","245647":"0","265974":"850"," 245648":"50","245650":"400","265975":"100","265976 ":"OPTIMA\\/EXPRESSO","245652":"195","245653":"210","245654":" 155","245655":"Automatik 1","245656":"450","245657":"500","245658":"50","24 5659":"350","245660":"13","245661":"650","245662": "200","245663":"100","245664":"20","245665":"120", "245666":"0","245667":"0","245668":"200","245669": "100","245670":"2","245671":"50","245672":"30","24 5673":"0","245674":"Au\\u00dfentemperatur","245675 ":"200","245676":"220","245677":"150","245678":"Au tomatik 1","245679":"100","245680":"100","245681":"350","2 45682":"13","245683":"700","245684":"200","245685" :"100","245686":"20","245687":"120","245688":"0"," 245689":"0","245690":"200","245691":"100","245692" :"2","245693":"50","245694":"30","245695":"0","245 696":"Au\\u00dfentemperatur","245697":"200","24569 8":"220","245699":"150","245700":"Automatik 1","245701":"350","245702":"13","245703":"700","24 5704":"200","245705":"100","245706":"20","245707": "120","245708":"0","245709":"200","245710":"100"," 245711":"2","275423":"Au\\u00dfentemperatur","2457 12":"250","245713":"280","245714":"Automatik 1","245715":"700","245716":"0","245717":"200","245 718":"100","245719":"2","245720":"200","245721":"3 0","266838":"300","266839":"650","266840":"100","2 66841":"25","245722":"20","245723":"30","245724":" 30","245725":"50","245726":"30","245727":"Automati k","286767":"0","286769":"0","286770":"0","286768" :"Impulspaket","245728":"1","245729":"0","245730": "0","245731":"0","245732":"0","245733":"0","245734 ":"0","245735":"0","245736":"0","245737":"0","2457 38":"0","266842":"0","266843":"0","266844":"1","28 6771":"0","245739":"0","245740":"0","245741":"0"," 245742":"0","245534":"85","245542":"79","245543":" 0","245544":"0","245545":"43527","245538":"13","24 5535":"368","245536":"170","245537":"764","245540" :"0","245541":"0","245546":"85","245547":"0","2455 39":"0","245548":"3622048","245549":"28265","24556 4":"514","245565":"574","245566":"2454","245567":" 0","245568":"0","245569":"399","265970":"499","245 570":"15","245571":"233","245572":"195","245573":" 764","245574":"450","245575":"505","245576":"514", "245577":"419","245578":"-300","245579":"0","245580":"0","245581":"-300","245582":"0","245583":"-300","245584":"0","245585":"0","245586":"0","24558 7":"0","245588":"0","245589":"0","245590":"0","245 591":"0","266830":"0","266831":"0","266832":"0","2 45592":"0","245593":"0","286753":"0","286754":"0", "286755":"0","286756":"0","245553":"0","245554":"0 ","245555":"0","245556":"0","245557":"0","245558": "0","245559":"0","245560":"0","245550":"0","245551 ":"Frostschutz","245561":"0","245562":"0","245595" :"0","245596":"Aus","265971":"Aus","245597":"Heizb etrieb","245598":"Aus","245599":"Aus","245600":"Au s","245601":"Aus","266833":"Aus","245602":"Aus","2 45603":"0","245604":"0","286757":"0","245552":"0", "245563":"0","265972":"0","245605":"20","245606":" Aus","245607":"0","245608":"Aus","245609":"0","245 610":"Aus","245611":"0","245612":"Aus","245613":"0 ","266834":"0","286772":"0"},"changeList":[]}'

            Die Leerzeichen kommen von der Darstellung des Forums.

            Das bedeutet dass ich die Abfrage auf jeden Fall extern realisieren kann und so an die Daten komme. Das ist nicht elegant, aber immerhin erstmal ein Weg. Weiter geht es mit der Verarbeitung:

            Code:
            >>> table = {}
            >>> table[245534] = json_text["values"]["245534"]
            Traceback (most recent call last):
              File "<stdin>", line 1, in <module>
            TypeError: byte indices must be integers, not str
            ich habe jetzt verschiedene Möglichkeiten durchgetestet, welche der Werte in Anführungszeichen zu setzen sind und welche nicht - ist das überhaupt die Ursache? Bisher hat mich meine Recherche nicht weitergebracht, vermutlich weil ich noch nicht verstehe welcher Teil von table[245534] = json_text["values"]["245534"] als Name dient (string?) und welche als Wert (Integer? Aber nicht alle Werte in json_text sind Zahlen... ich bin verwirrt).

            Kommentar


              #21
              Hallo,
              zum einen: schade, dass der subprozess.check_output('curl ....') Aufruf nicht so funktioniert, wie er soll. Offenbar müssen wir beide noch mehr über das Modul subprocess lernen... (Vielleicht doch alles in einer Zeile? Brauchst Du wirklich alle Header Zeilen?)

              zum anderen: der JSON-Datensatz, den der Server sendet, ist offensichtlich verschachtelt in mehrer Schlüssel -> Wert Felder: ein Schlüssel heißt 'values' und der Wert ist wieder ein Schlüssel -> Wert Datensatz {"245614":"0", "245615":"1",...} Schlüssel ist hier "245614", Wert ist "0", usw. Vermutlich parst das JSON Modul diese Schlüssel als Integers. (Kann man aber sicher auch in der Doku des Python Moduls JSON nachlesen ;-) ...)
              => also sollte es so gehen:
              >>> table = {}
              >>> val = json_text["values"]
              >>> i = val[245534]
              >>> table[245534] = i
              ... oder eine dieser Zeilen gibt einen Fehler - dann wissen wir auch mehr.

              Kommentar


                #22
                walldi, ich finde Deine Unterstützung Klasse, danke!

                ich habe das mal getestet. Zuerst habe ich mich mittels print (json_text) vergewissert, dass die Daten noch da sind.

                val = json_text["values"] schlägt dann bereits fehl:

                Code:
                Traceback (most recent call last):
                  File "<stdin>", line 1, in <module>
                TypeError: byte indices must be integers, not str

                Kommentar


                  #23
                  Noch eine Überlegung... ich brauch ja die Verschachtelung nicht wirklich. Wenn ich also ohnehin den Weg gehe, erst die Datei abzuholen und auf diese zuzugreifen, kann ich mir die doch vorher aufbereiten, so dass nur die Wertpaare stehen bleiben? Wenn also die Datei nur "245614":"0","245615":"1", ... "266834":"0","286772":"0" enthält, wie müsste der auf table{} folgende Aufruf denn dann aussehen?

                  Kommentar


                    #24
                    ... Wobei wir natürlich unsere json lib vergessen haben...:
                    >>>json_text =json.loads(json_Text)
                    sollte helfen.
                    Sorry, aber ich bin auf dünnem Eis, weil ich z.Zt. nicht selbst testen kann. Wie gesagt: RTFM!

                    Kommentar


                      #25
                      Hallo zusammen,

                      Dieses Thema möchte ich nochmal hervorholen.

                      Ich komme mit meinem "rumprobieren" nicht weiter, um das Problem selbst zu lösen müsste ich Python programmieren lernen.
                      Für eine einmalige Sache die ein erfahrener Programmierer vermutlich in überschaubarer Zeit lösen könnte ist das natürlich völlig übertrieben.

                      Wahrscheinlich sind das wirklich nur ein paar Zeilen?

                      Was haltet ihr davon: Für die funktionierende Lösung spende ich 20 Euro an eine der auf betterplace.org gelisteten Hilfsorganisationen / Projekte / Themen, mit Nachweis in diesem Thread.

                      Haltet ihr das für okay und angemessen? Wenn die Antwort hierauf grundsätzlich ja lautet, stelle ich alles nochmal zusammen, damit ihr euch die Details nicht im Thread zusammensuchen müsst.

                      EDIT: ich hatte vorher eine offenbar von einem Unternehmen betriebene Seite für die Auswahl der Hilfsorganisationen verlinkt, betterplace.org erscheint mir nach kurzer Recherche doch sinnvoller.

                      Kommentar


                        #26
                        naja - meine Motivation war ja eigentlich, jemanden zu motivieren, etwas Programmieren, i.e. Python zu lernen ;-)

                        (hast eine PM)

                        Kommentar


                          #27
                          Hallo walldi,

                          irgendwann will ich das schon noch lernen Hatte schonmal mit Codeacademy angefangen, aber nun ja..

                          Habe Dir eine PM geschickt mit den Daten.

                          Kommentar

                          Lädt...
                          X