Jump to content

Recommended Posts

Posted

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

Posted

Wenn du sagst du bekommst keine Rückgabewerte, was bekommst du denn dann? Eine Exception oder falsche Werte? Welche Exception bzw welche falschen Werte bekommst du?

 

Und zu Python 2 vs 3: Mit Python 2 funktioniert es mit allen Bricklets aber mit Python 3 funktioniert es nicht mit allen Bricklets? Hab ich das richtig verstanden?

Posted

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

 

Posted

Meine Vermutung dazu: Du hast irgendwo im Code sowas stehen wie

 

t1 = float_value

 

und überschreibst damit ausversehen das "t1" Temperature Bricklet-Objekt. Vielleicht ist in Python2 der Scope von der Variable irgendwo leicht anders als in Python3 und dadurch tritt das jetzt erst auf?

Posted

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.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...