2 x GOK Senso4 einbinden

@Vincent “2b” + “43” (43%+67%)

GOG APP = 26,9% + 42,9%

D.h. irgendwie ließt die Handy App oder VanPi falsch.

@Vincent Hallo Vincent, hast du mir noch einen Tip hierzu ?

interessant ist, dass der BT Scanner die GOK Sensoren nicht findet:


aber die Pyhton Abfrage immer noch Werte ausließt:
image

@Vincent Also ich habe ausgiebig getestet und debug Punkte gesetzt.
Es werden immer nur die Werte nach einer Neukalibrierung oder “auffüllen” ausgelesen.
Ab da frieren die Werte ein.
Vielleicht müssen bei den Senso4 ein anderer Parameter ausgelesen werden und dies hier ist nur der Initial Wert ???

Die MAC Adressen sind zumindest da

Ehrlich gesagt weiß ich nicht warum das so ist, könnte mir vorstellen, dass das was mit dem Wechsel zwischen Vanpi und der GOK App zu tun hat.
Im Vanpi wird die Abfrage standardmäßig nur alle 3h ausgeführt.
Kannst du die Waagen nochmal neu kalibrieren und dann einfach mal laufen lassen, ohne dich mit der App dazwischen zu verbinden?

Hallo Vincent, habe ich bereits mehrere Tage gemacht, mache es aber noch einmal und ändere nach einem Tag dann das Gewicht.
D.h. ich kalibriere mit Zusatzgewicht, welches ich dann nach und nach wegnehmen kann. Bisher wurde in Vanpi nur das kalibrierte Gewicht angezeigt. Ab dann keine Änderung. Dann ahbe ich erst zur Kontrolle die Gok App aufgerufen, welche die Änderung erkannt hat.
Ich melde mich wieder.

@Vincent wie erwartet, ändern sich die GOK Werte in VanPi nach der Kalibrierung nie wieder.
image

Ich habe nun 3 Tage lang jeden Tag Gewicht von den Gasflachen weggenommen und die Senso Handy App nicht angehabt ( auch nicht im Hintergrund).
Die Senso App hat die Gewichtsänderungen registriert:




Aktueller HEX Wert:
pi@pekaway:~$ python3 ~/pekaway/ble_py/goksenso4.py -d E8:90:F1:27:62:19
b’27’
pi@pekaway:~$ python3 ~/pekaway/ble_py/goksenso4.py -d C2:C3:8D:6A:56:AC
b’38’

Nach einem Neustart wird von GOK nichts mehr angezeigt:

Der Test über SSH liefert aber noch Werte, allerdings immer noch die ursprünglichen, alten:
pi@pekaway:~$ python3 ~/pekaway/ble_py/goksenso4.py -d E8:90:F1:27:62:19
b’27’
pi@pekaway:~$ python3 ~/pekaway/ble_py/goksenso4.py -d C2:C3:8D:6A:56:AC
b’38’

Bitte um deine Hilfe

Hmm da müssen wir uns wohl mal das Python Script genauer anschauen und durchtesten wo die Werte herkommen. Das wird etwas komplizierter, hast du schonmal mit “gatttool” gearbeitet?

Hallo Vincent, nein gattools kenn ich nicht…

Ok, bin einen Schritt weiter, zumindest funktioniert es in meinen ersten Tests. Manchmal geht die Anfrage nicht richtig durch, weiß aber noch nicht wieso, dann gibt es einen Fehler. Das passiert dann ein paar mal hintereinander und dann geht es auf wundersame Art und Weise wieder… :smiley:

Ersetz mal bitte den Inhalt der Datei /home/pi/pekaway/ble_py/goksenso4.py mit dem folgenden:

#!/usr/bin/env python3

# GOK Senso4s Plus
# Get Values from Senso4s Plus and print as hexadecimal integer
#
# Issues:
# Sometimes the connections does not work "connect error: Function not implemented (38)" : dont know why
# Sometimes there are no values "Characteristic value was written successfully" : dont know why
# Sometimes the connections does not work without any error : there might be another client connected
# "Device or resource busy" : there might be still an open connection on the client, restart your bluetooth if you can't find it
#

import argparse
import pexpect

# Command line parameters
parser = argparse.ArgumentParser()
parser.add_argument("-d", "--device", dest = "device", help="Specify remote Bluetooth address", metavar="MAC", required=True)
parser.add_argument("-v", "--verbose", dest = "v", help="Verbosity", action='count', default=0)
args = parser.parse_args()

# Connetion 1: Set handle 0x000b to value 0100 to enable notification (otherwise it'll always return the innitial value)
child = pexpect.spawn("gatttool -t random -b {0} --char-write-req --handle=0x000f --value=0100".format(args.device))


# await reponse:
for attempt in range(10):
    try:
        if args.v: print("Task1: Scale connecting (Try:", attempt+1, ")")
        child.expect("Characteristic value was written successfully", timeout=1)
    except pexpect.TIMEOUT:
        if args.v==2: print(child.before)
        continue
    else:
        if args.v: print("Notifications enabled on handle=0x000f")
        break
else:
    if args.v: print ("Scale Connect timeout! Exit")
    child.sendline("exit")
    print ("Connection timed out!")
    exit()

# Close connection 1:
if args.v: print("Task1 finished, disconnecting")
child.sendline("disconnect")
child.sendline("exit")

# Run gatttool interactively.
child = pexpect.spawn("gatttool -I -t random -b {0}".format(args.device))

# Connect to the device
for attempt in range(10):
    try:
        if args.v: print("Task2: Scale connecting (Try:", attempt+1, ")")
        child.sendline("connect")
        child.expect("Connection successful", timeout=1)
    except pexpect.TIMEOUT:
        if args.v==2: print(child.before)
        continue
    else:
        if args.v: print("Scale connection successful")
        break
else:
    if args.v: print ("Scale Connect timeout! Exit")
    child.sendline("exit")
    print ("Connection timed out!")
    exit()    


# Request data until data is recieved or max attempt is reached
# Voltage and other information
for attempt in range(1):
    try:
        resp=b''
        if args.v: print("Scale requesting data 1 (Try:", attempt+1, ")")
        child.sendline("char-read-uuid 00007082-a20b-4d4d-a4de-7f071dbbc1d8")
        child.expect("handle: 0x000e \t value: ", timeout=5)
        child.expect("\r\n", timeout=0)
        if args.v: print("Scale received data 1")
        if args.v==2: print("Scale answer 1: ", child.before)
        resp+=child.before
    except pexpect.TIMEOUT:
        continue
    else:
        break
else:
    resp=b''
    if args.v: print ("Scale Answering timeout!")
    if args.v==2: print(child.before)


# Close connection
if args.v: print("Scale disconnecting")
child.sendline("disconnect")
child.sendline("exit")


if args.v: print("Response 1:", resp)

resp = resp[:-1]

# Print response
print (resp)

Die Waage selber aktualisiert sich (anscheinend) alle 15min, also erst dann werden Veränderungen sichtbar.

Du hast übrigens in dem Chart auf deinem Monitor die Anzeige nur auf einem Zeitraum von einer Stunde stehen, kann das sein? Da wirst du keine Veränderungen sehen, weil ja die Bluetooth Abfrage nur alle 180min ausgeführt wird.
Also entweder du stellst die Anzeigezeitraum des Charts höher ein, oder startest die Abfrage öfter (Das geht direkt in der blauen Inject Node im Node-RED Backend). Beachte aber bitte, dass durch schnelleres Abfragen die Batterie der Waage auch mehr beansprucht wird.

Hi Vincent, habe den Inhalt der goksenso4.py Datei ausgetauscht und die Monitorwerte angepasst und beide Sensoren über config/system nochmals eingegeben.
Aktuelle Werte sehen gut aus, mache nun mehrere Tests:

1 Like

Nach einem Neustart (Node Red) bleiben die GOK Werte leer!
Man bekommt sie nur, wenn man die BT Adressen in der Config neu einträgt.
Verstehe ich nicht, da die doch in MQTT weggeschrieben werden.
Sollte doch dauerhaft bleiben, oder ?

Ja sollte dauerhaft bleiben, wird aber bei einem Neustart nicht richtig initialisiert, hab den Fehler schon gefunden.

Soweit sieht es nun mehrere Testage gut aus.
image

“Ja sollte dauerhaft bleiben, wird aber bei einem Neustart nicht richtig initialisiert, hab den Fehler schon gefunden.” → woran liegt es ?

Es gibt eine INject Node, die nach einem Neustart die hinterlegte MAC Adresse ausliest. In der dazugehörigen Funktion wurde aber die Adresse nicht in die globale Variable übergeben, mit der wir am Ende die Waage anfragen. Die Funktion muss folgendermaßen aussehen:

if (msg.payload == 0) {
    msg.payload = "turned off"
    node.send([null, msg])
    global.set("scalemac", msg.payload)
}
else if (msg.payload == "Scan Bluetooth first") {
    var scanfirst = msg.payload
    msg.payload = "turned off"
    node.send([null, msg])
    global.set("scalemac", msg.payload)
    msg.payload = scanfirst
}
else {
    global.set("scalemac", msg.payload)
}
return [msg, null];
1 Like

Hey Vincent, es funktioniert !!! Danke dir

@Vincent Hast du bzgl. zwei GOK Senso4+ etwas in die neue Software programmiert?

Nein, das habe ich nicht mit reingenommen

Wo habt ihr geplant, wird wenigstens ein GOK Sensor angezeigt?

Letztendlich benötige ich 3 Wassersensorwn ( Frischwasser, Grauwasser, WC Abwasser) und zwei Gassensoren.
Diese möchte ich gerne remote abfragen.
Wie kann das umgesetzt werden ?