Jump to content

delphi99

Members
  • Gesamte Inhalte

    14
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von delphi99

  1. 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

     

  2. 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

  3. 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.

  4. 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.

  5. 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

     

  6. 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

     

  7. 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.

  8. 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.

×
×
  • Neu erstellen...