Jump to content

delphi99

Members
  • Content Count

    14
  • Joined

  • Last visited

Community Reputation

0 Neutral
  1. Hallo Borg, sowas in der Art hatte ich auch schon vermutet und deshalb auch schon Variablen umbenannt. Wenn man dann aber nicht die richtigen Variablen umbenennt und dann auch noch zu blöd ist zum Suchen... Ich stell mich dann mal in die Ecke zum Schämen. Vielen Dank fürs Mitdenken und noch schönen Sonntag-Abend. Frank.
  2. Ergänzung zum Fehler (diesmal nach 2 erfolgreichen Messungen): temperature1 = t1.get_temperature() AttributeError : 'float' object has no attribute 'get_temperature'
  3. Hallo Borg, zur 2. Frage: ja so ist es. zu 1: Es kam eine Fehlermeldung zurück, auf die mein Code nicht vorbereitet war. In der Variablen (temperature1) stand also vmtl. der Fehlertext, leider habe ich das Log nicht mehr :-( Auszugsweise der aktuelle Code für das Temperatur-Bricklet mit Fehlerbehandlung. Der Fehler tritt wohl schon in der print-Zeile bei Division/100 auf, da das mit Text logischerweise nicht geht. ... ipconb1 = IPConnection() # Create IP connection ipconb2 = IPConnection() # Create IP connection # Create device object m1 = Master(tfbrick01_opts['uid_master'],ipconb1) t1 = tinkerforge.bricklet_temperature.Temperature(tfbrick01_opts['uid_tempbricklet'], ipconb1) h1 = tinkerforge.bricklet_humidity.Humidity(tfbrick01_opts['uid_humbricklet'], ipconb1) p1 = tinkerforge.bricklet_barometer.Barometer(tfbrick01_opts['uid_pressbricklet'], ipconb1) ... def cbt1(): try: temperature1 = t1.get_temperature() print('temp1: ' + str(temperature1/100.0) + ' °C.') vt1 = temperature1/100.0 json_body = [ { "measurement": "Temperatur", "tags": { "location": "innen", "room": "Wohnstube" }, "fields": { "value": vt1 } } ] dbclient.write_points(json_body) except: print('error get_temp1') Die Funktionsdefinitionen sind alle 5 quasi identisch, lediglich die lokalen Variablen sind je nach Anwendungsfall unterschiedlich. Und das Log dazu: 2019-03-07 15:52:32,665 INFO Start-Time: 1551970352.6657937 2019-03-07 15:52:34,705 INFO temp1: 24.56 °C. 2019-03-07 15:52:34,775 INFO hum1: 28.7 %. 2019-03-07 15:52:34,814 INFO temp2: 21.93 °C. 2019-03-07 15:52:34,836 INFO hum2: 33.6 %. 2019-03-07 15:54:04,949 INFO error get_temp1 2019-03-07 15:54:04,950 INFO error get_hum1 2019-03-07 15:54:04,955 INFO temp2: 22.0 °C. 2019-03-07 15:54:04,971 INFO hum2: 33.7 %. 2019-03-07 15:54:04,986 INFO press1: 984.677 mbar (raw). 2019-03-07 15:55:37,115 INFO error get_temp1 2019-03-07 15:55:37,116 INFO error get_hum1 2019-03-07 15:55:37,124 INFO temp2: 22.06 °C. 2019-03-07 15:55:37,148 INFO hum2: 33.4 %. 2019-03-07 15:55:37,162 INFO press1: 984.604 mbar (raw). 2019-03-07 15:55:37,162 INFO localtemp: 14.7 2019-03-07 15:57:07,290 INFO error get_temp1 2019-03-07 15:57:07,291 INFO error get_hum1 2019-03-07 15:57:07,296 INFO temp2: 22.12 °C. 2019-03-07 15:57:07,310 INFO hum2: 33.6 %. 2019-03-07 15:57:07,326 INFO press1: 984.684 mbar (raw). Die 1er Werte sind vom problematischen Brick, die 2er vom funktionierenden. Wie zu sehen kommen beim ersten Aufruf dieses Mal alle Werte, danach nicht mehr. Ich bin mir auch nicht sicher ob es an der python-Version liegt. Der 2. Brick funktioniert ja tadellos. Kann es evtl. Probleme mit der Stromversorgung im Brick geben? Der besteht ja neben dem Master aus einem alten WiFi Brick und den 3 Brickletts. Macht aber auch keinen Sinn, da es ja mit python2 und Callback funktioniert. VG und vielen Dank Frank
  4. Hallo, folgendes Szenario (jeweils mit WiFi Brick alt): - 1x Master Brick mit Temperatur-, Luftfeuchte- und Luftdruck-Bricklet - 1x dasselbe ohne Luftdruck Bislang rufe ich die Werte mittels python2 via Callback-Funktion ab. Funktioniert auch wunderbar. Da ich für die Auswertung/Darstellung auf influxdb und grafana umsteigen möchte, habe ich ein neues Abfragescript in python3 geschrieben. Zuerst quasi 1:1 aus der vorherigen Version übernommen, mit den entsprechenden Anpassungen für python3 und influxdb. Da habe ich schon via Callback vom Brick1 keine Temperatur- und Luftfeuchtewerte mehr bekommen. Also mal umgestellt auf direkte Abfrage beider Bricks alle 90s. Wenn ich Glück habe bekomme ich für Brick1 beim ersten Aufruf auch Werte aller 3 Bricklets, danach nur noch vom Luftdruck-Bricklet. Brick2 funktioniert problemlos auch in dieser Konstellation. Am WLAN kann es eigentlich nicht liegen, da ja die Luftdruckwerte vom Brick1 kommen (außerdem ist er näher am AP) *grübel* Hat jemand eine Idee warum sich die beiden Bricks so unterschiedlich verhalten? Den Brick1 habe ich noch firmwaremäßig aktualisiert, aber keine Änderung. Bei Bedarf lade ich auch das script hoch, aber da es ja teilweise funktioniert habe ich vorerst drauf verzichtet. Vielen Dank für Eure Ideen Frank
  5. Hallo, ich nutze bereits seit längerem 2 Master mit jeweils Temperatur- und Humidity Bricklet via python2. Das Ganze als CallBack, die Werte werden zuerst in MySQL eingetragen und dann periodisch in verschiedene rrd gepackt. Funktioniert eigentlich zu meiner vollen Zufriedenheit. Da es mir letztens die rrd zerschossen hatte konnte ich über die DB die rrd auch neu generieren :-) Allerdings ist die MySQL-DB inzwischen ca. 450 MB groß. Nun habe ich in der aktuellen ct über influxDB gelesen. Das würde ich gerne testen, zusamen mit Grafana. Dazu wäre es aber übergangsweise erforderlich, dass 2 python Scripte via CallBack Werte erwarten. Geht das überhaupt, oder kann sich nur jeweils ein Client zum Brick(let) verbinden? Vielen Dank Frank.
  6. Der Schalter klemmt mit hoher Wahrscheinlichkeit nicht; zumindest klickt er bei Betätigung deutlich vernehmbar und bewegt sich auch. Zum "Stapel-Flash": ich hatte tatsächlich versucht, mit aufgesetzter WiFi-Extension zu flashen. Weiß auch nicht mehr, wie ich es bei den früheren Updates gemacht hatte. Aber dass er sich dadurch verabschiedet? Naja, egal. Der Mensch an sich ist ja lernfähig. Jetzt werde ich als nächstes den 2. Stapel versuchen zu flashen (ohne Extension), und dann sehen wir weiter.
  7. so, alles abgestöpselt, auch die Abstandsbolzen entfernt. Leider kein Erfolg. Da werde ich mir wohl nen neuen Master besorgen können. Sind die alten Bricklets und WiFi-Extensions kompatibel? Bevor ich den neuen Master kaufe, werde ich aber noch den 2. Stapel testen. Nicht dass ich dann 2 neue Master hintereinander brauche... Danke Euch trotzdem. Frank
  8. das werde ich mir erst am sonntag anschauen können. Melde mich dann wieder. Vorerst vielen Dank und schönen Abend noch :-)
  9. hm, meiner sieht bissel anders aus. evtl. älteres Modell?
  10. Hallo, nun ist es mir auch passiert. Bisherige Flash-Versuche gingen problemlos über die Bühne, aber diesmal will mich wohl jemand ärgern. Anlass war, dass sich einer meiner beiden Stapel (via WiFi) nicht mehr gemeldet hat. Da ich ihn also sowieso am Wickel hatte, könnte man ja gleichmal Firmware aktualisieren... USB drangesteckt, Tasten für Bootmodus gedrückt: LED aus, das wars. Wird nix mehr erkannt. Mehrere USB-Kabel probiert, unterschiedliche USB-Buchsen, normales Netzteil. Mit den Tasten rumgespielt wie in den anderen betreffenden Beiträgen beschrieben. Nützt alles nix. Im Gerätemanager wird auch nichts mehr angezeigt. Gibt es da noch 'ne Möglichkeit was zu testen? Daanke Frank
  11. script läuft immer noch durch, das war dann wohl der Auslöser. Besten Dank!
  12. Hm, das scheint es gewesen zu sein. Woher wusstest Du? Script läuft seit ein paar Minuten wieder Hat sich da was geändert? Schließlich lief es mit dem Wifi-Powermodus schon ein paar Monate.
  13. Hi, zur Sicherheit habe ich das nochmal geprüft. Aber im Viewer ist alles ok. Es ist ja nicht nur das eine Bricklet, welches Fehler wirft. Es sind alle "set_<bricklet>_callback_period" Aufrufe mit identischer Fehlermeldung. Ich habe die Fehlerausgabe nur ein wenig gekürzt (im Text stand's, war aber vlcht. nicht deutlich genug, sorry). Und wie gesagt, das tauchte bei unveränderter Hardware nach einem Neustart des Banana auf. Vorher die tinkerforge Python Bindings geupdatet.
  14. Hallo, hatte vor ein paar Tagen die Firmware meiner Bricks und Bricklets sowie die Bindings erneuert. Läuft auf Banana Pi. Bis dahin alles bestens. Hatte heute einen Neustart des Pi, danach bricht das script bei Aufruf der Callback-Definitionen (set_<bricklet>_callback_period) ab. Fehlermeldung jeweils: Did not receive response for function 3 in time (-1) 2015-11-10 19:35:38,390 INFO Time: 1447180538.39 2015-11-10 19:35:41,590 ERROR Traceback (most recent call last): 2015-11-10 19:35:41,590 ERROR File "tf_collectdata.py", line 227, in <module> 2015-11-10 19:35:41,591 ERROR t2.set_temperature_callback_period(step * 1000) 2015-11-10 19:35:41,592 ERROR File "build/bdist.linux-armv7l/egg/tinkerforge/bricklet_temperature.py", line 105, in set_temperature_callback_period 2015-11-10 19:35:41,593 ERROR File "build/bdist.linux-armv7l/egg/tinkerforge/ip_connection.py", line 948, in send_request 2015-11-10 19:35:41,593 ERROR tinkerforge.ip_connection Die Verbindung zum Brick scheint noch zu funktionieren, da die Status-LED aus geht. Mein Script sieht folgendermaßen aus: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'fs' import logging import logging.handlers import argparse import sys import time import mysql.connector from tinkerforge.ip_connection import IPConnection from tinkerforge.brick_master import Master import tinkerforge.bricklet_temperature import tinkerforge.bricklet_humidity import tinkerforge.bricklet_barometer # Deafults LOG_FILENAME = "/var/log/tf/tf_collectdata.log" LOG_LEVEL = logging.DEBUG # Could be e.g. "DEBUG" or "WARNING" # Define and parse command line arguments parser = argparse.ArgumentParser(description="service for collecting tinkerforge bricklet data") parser.add_argument("-l", "--log", help="file to write log to (default '" + LOG_FILENAME + "')") # If the log file is specified on the command line then override the default args = parser.parse_args() if args.log: LOG_FILENAME = args.log # Configure logging to log to a file, making a new file at midnight and keeping the last 3 day's data # Give the logger a unique name (good practice) logger = logging.getLogger(__name__) # Set the log level to LOG_LEVEL logger.setLevel(LOG_LEVEL) # Make a handler that writes to a file, making a new file at midnight and keeping 3 backups handler = logging.handlers.TimedRotatingFileHandler(LOG_FILENAME, when="midnight", backupCount=3) # Format each log message like this formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s') # Attach the formatter to the handler handler.setFormatter(formatter) # Attach the handler to the logger logger.addHandler(handler) # Messdaten alle 1min updaten step = 60 hour = 60 * 60 day = 24 * hour week = 7 * day month = day * 30 quarter = month * 3 half = 365 * day / 2 year = 365 * day times = [(3*hour,60), (12*hour,60), (day,60), (3*day,300)] # Hoehe ueber NN fuer LE: altitude_loc = 114 tg = 0.0065 tfbrick01_opts = { 'host': "192.168.x.1", 'port': 4223, 'uid_master': "x", 'uid_tempbricklet': "x", 'uid_humbricklet': "x", 'uid_pressbricklet': "x" } tfbrick02_opts = { 'host': "192.168.x.2", 'port': 4223, 'uid_master': "y", 'uid_tempbricklet': "y", 'uid_humbricklet': "y" } mysql_opts = { 'host': "192.168.x.6", 'user': "user", 'pass': "pass", 'db': "tinkerforge" } ###### # Make a class we can use to capture stdout and sterr in the log class MyLogger(object): def __init__(self, logger, level): """Needs a logger and a logger level.""" self.logger = logger self.level = level def write(self, message): # Only log if there is a message (not just a new line) if message.rstrip() != "": self.logger.log(self.level, message.rstrip()) # Replace stdout with logging to file at INFO level sys.stdout = MyLogger(logger, logging.INFO) # Replace stderr with logging to file at ERROR level sys.stderr = MyLogger(logger, logging.ERROR) print("Time: " + str(time.time())) #db = mysql.connector.connect(host=mysql_opts['host'], user=mysql_opts['user'], password=mysql_opts['pass'], database=mysql_opts['db']) #dbcursor = db.cursor() # Callback for temperature def cbt1(temperature): print('temp1: ' + str(temperature/100.0) + ' °C.') value = temperature/100.0 db = mysql.connector.connect(host=mysql_opts['host'], user=mysql_opts['user'], password=mysql_opts['pass'], database=mysql_opts['db']) dbcursor = db.cursor() dbcursor.execute("insert into rawvalues (dsid, rawvalue) values (1, %s)", (value, )) db.commit() dbcursor.close() db.close def cbt2(temperature): print('temp2: ' + str(temperature/100.0) + ' °C.') value = temperature/100.0 db = mysql.connector.connect(host=mysql_opts['host'], user=mysql_opts['user'], password=mysql_opts['pass'], database=mysql_opts['db']) dbcursor = db.cursor() dbcursor.execute("insert into rawvalues (dsid, rawvalue) values (3, %s)", (value, )) db.commit() dbcursor.close() db.close # Callback for humidity def cbh1(humidity): print('hum1: ' + str(humidity/10.0) + ' %.') value = humidity/10.0 db = mysql.connector.connect(host=mysql_opts['host'], user=mysql_opts['user'], password=mysql_opts['pass'], database=mysql_opts['db']) dbcursor = db.cursor() dbcursor.execute("insert into rawvalues (dsid, rawvalue) values (2, %s)", (value, )) db.commit() dbcursor.close() db.close def cbh2(humidity): print('hum2: ' + str(humidity/10.0) + ' %.') value = humidity/10.0 db = mysql.connector.connect(host=mysql_opts['host'], user=mysql_opts['user'], password=mysql_opts['pass'], database=mysql_opts['db']) dbcursor = db.cursor() dbcursor.execute("insert into rawvalues (dsid, rawvalue) values (4, %s)", (value, )) db.commit() dbcursor.close() db.close # Callback for air pressure def cbp1(air_pressure): print('press1: ' + str(air_pressure/1000.0) + ' mbar (raw).') # letzte Aussentemperatur holen (elv, also aus DB) dbx = mysql.connector.connect(host=mysql_opts['host'], user=mysql_opts['user'], password=mysql_opts['pass'], database=mysql_opts['db']) curx = dbx.cursor(buffered=True) #temps = curx.execute("select rawvalue from rawvalues where dsid=5 order by timestamp desc limit 1") curx.execute("select rawvalue from rawvalues where dsid=5 order by timestamp desc limit 1") row = curx.fetchone() if row is not None: temp_location = float(row[0]) print('temp_loc: ' + str(temp_location) + ' °C') #print('anz: ' + str(temps)) #if temps > 0: #for tr in curx.fetchall(): #temp_location = float(tr[0]) curx.close() dbx.close() temp_nn = temp_location + tg * altitude_loc # value = air_pressure/1000.0/(1-tg * altitude_loc/temp_nn)**(0.03416/tg) value = air_pressure/1000.0/(1 - tg * altitude_loc / (273.15 + temp_location + tg * altitude_loc)) ** (0.034163 / tg) value = round(value,1) print('press1: ' + str(value) + ' mbar (QFF).') db = mysql.connector.connect(host=mysql_opts['host'], user=mysql_opts['user'], password=mysql_opts['pass'], database=mysql_opts['db']) dbcursor = db.cursor() dbcursor.execute("insert into rawvalues (dsid, rawvalue) values (7, %s)", (value, )) db.commit() dbcursor.close() db.close ipconb1 = IPConnection() # Create IP connection ipconb2 = IPConnection() # Create IP connection # Create device object m1 = Master(tfbrick01_opts['uid_master'],ipconb1) t1 = tinkerforge.bricklet_temperature.Temperature(tfbrick01_opts['uid_tempbricklet'], ipconb1) h1 = tinkerforge.bricklet_humidity.Humidity(tfbrick01_opts['uid_humbricklet'], ipconb1) p1 = tinkerforge.bricklet_barometer.Barometer(tfbrick01_opts['uid_pressbricklet'], ipconb1) m2 = Master(tfbrick02_opts['uid_master'],ipconb2) t2 = tinkerforge.bricklet_temperature.Temperature(tfbrick02_opts['uid_tempbricklet'], ipconb2) h2 = tinkerforge.bricklet_humidity.Humidity(tfbrick02_opts['uid_humbricklet'], ipconb2) ipconb1.connect(tfbrick01_opts['host'], tfbrick01_opts['port']) # Connect to brickd ipconb2.connect(tfbrick02_opts['host'], tfbrick02_opts['port']) # Connect to brickd # Don't use device before ipcon is connected # set wifi power-mode to low m1.set_wifi_power_mode(1) m1.disable_status_led() # Get callbacks with a period time of 60 seconds (1min) t1.set_temperature_callback_period(step * 1000) # <-- ab hier Fehler h1.set_humidity_callback_period(step * 1000) p1.set_air_pressure_callback_period(60 *1000) m2.set_wifi_power_mode(1) m2.disable_status_led() # Get callbacks with a period time of 60 seconds (1min) t2.set_temperature_callback_period(step * 1000) h2.set_humidity_callback_period(step * 1000) # Register threshold reached callback to function cb_reached t1.register_callback(t1.CALLBACK_TEMPERATURE,cbt1) h1.register_callback(h1.CALLBACK_HUMIDITY,cbh1) p1.register_callback(p1.CALLBACK_AIR_PRESSURE,cbp1) t2.register_callback(t2.CALLBACK_TEMPERATURE,cbt2) h2.register_callback(h2.CALLBACK_HUMIDITY,cbh2) next_call_time = time.time() while True: next_call_time += 1 time.sleep(next_call_time - time.time()) #raw_input('Press key to exit\n') # Use input() in Python 3 #db.commit() #dbcursor.close() #db.close() ipconb1.disconnect() ipconb2.disconnect() Hat da evtl jemand 'ne Idee? Danke Euch. Frank.
×
×
  • Create New...