MQTT2 Device für MEDION Alarmanlage

Begonnen von deeb, 07 Juni 2020, 21:36:28

Vorheriges Thema - Nächstes Thema

deeb

Hallo Beta-User,

danke für deine Geduld mit mir. "list -r" habe ich jetzt auch verinnerlicht! Der Unterschied mit den langen Readingsnamen ist mir beim Testen nicht aufgefallen. Habe ich jetzt umgestellt.
zu Frage 1:
Habe ich jetzt auf der Sende-Seite umgestellt. Alle "timestampRT"-Bezüge gelöscht. Auch mit MQTT.fx werden diese nicht mehr angezeigt und ich habe jetzt auch weniger Ereignisse/Logfileeinträge (nur noch 2 statt 4-6 pro Ereignis).
zu Frage 2:
Alle überflüssigen, sich wiederholende Zeilen habe ich jetzt mit dem Attribut "ignoreRegexp" aus dem LogFile verbannt.
zu Frage 3:
Durch das Attribut "stateFormat" bekomme ich jetzt den/einen Status angezeigt:

define MQTT2_msh_mk6_balkontuer_og_211 MQTT2_DEVICE msh_mk6_balkontuer_og_211
attr MQTT2_msh_mk6_balkontuer_og_211 IODev fehm_mqtt2
attr MQTT2_msh_mk6_balkontuer_og_211 readingList msh/d_mk6_balkontuer_og_211:.* { json2nameValue($EVENT) }
attr MQTT2_msh_mk6_balkontuer_og_211 room MQTT2_DEVICE
attr MQTT2_msh_mk6_balkontuer_og_211 stateFormat { ReadingsVal($name, "details", "") }

setstate MQTT2_msh_mk6_balkontuer_og_211 opena
setstate MQTT2_msh_mk6_balkontuer_og_211 2020-06-12 19:12:30 associatedWith MEDION_Alarm
setstate MQTT2_msh_mk6_balkontuer_og_211 2020-06-13 00:01:54 details opena
setstate MQTT2_msh_mk6_balkontuer_og_211 2020-06-13 00:01:54 mac 907065F2E9A1
setstate MQTT2_msh_mk6_balkontuer_og_211 2020-06-13 00:01:54 name MK6_Balkontuer_OG_211
setstate MQTT2_msh_mk6_balkontuer_og_211 2020-06-13 00:01:54 rssivalue -92.0
setstate MQTT2_msh_mk6_balkontuer_og_211 2020-06-13 00:01:54 source 13-derpi3
setstate MQTT2_msh_mk6_balkontuer_og_211 2020-06-13 00:01:54 type 4
setstate MQTT2_msh_mk6_balkontuer_og_211 2020-06-13 00:01:54 value 1


Leider aktualisiert sich der Status aber nicht in der WEB-Anzeige, wenn sich der das Status für das Device ändert, d.h. es wird immer der Status angezeigt, der beim öffnen des Fensters gerade aktuell war. Mit den Attribut "event-on-change-reading" konnte ich das auch nicht verbessern (falscher Aufruf?).

Auf der "Sende-Seite" habe ich jetzt noch weitere Geräte (Alarmzentrale, Funksteckdose, Fernbedienung, Außensignal) versucht einzubinden. Ist mir bisher aber nur für das Außensignal gelungen.
Dort könnte ich jetzt noch versuchen einen Alarm durch einen MQTT-Publish-Befehl auszulösen. Ist natürlich nicht so wichtig wie z.B. das Schalten der Funksteckdose oder die Funktionen der Fernbedienung. Dazu habe ich schon den Author der Python msh-Tools angeschrieben. Würde noch gern 2/3 Wochen abwarten ob er antwortet bzw. reagiert. Ansonsten könnten wir hier dieses Thema aus meiner Sicht erstmal schließen oder wäre es besser, nochmal den finalen Code zu posten?

Nochmals viele Dank für alle Hilfestellungen und Hinweise!!!!!!!!

MfG
deeb


 

Beta-User

Vielleicht noch ein paar Hinweise vorab:
attr MQTT2_msh_mk6_balkontuer_og_211 stateFormat { ReadingsVal($name, "details", "") }
müßte auch so geschrieben werden können:
attr MQTT2_msh_mk6_balkontuer_og_211 stateFormat detailsWenn wir doch $JSONMAP verwenden würden, wäre das auch ohne stateFormat machbar:
attr MQTT2_msh_mk6_balkontuer_og_211 readingList msh/d_mk6_balkontuer_og_211:.* { json2nameValue($EVENT,'',$JSONMAP) }attr MQTT2_msh_mk6_balkontuer_og_211 jsonMap details:state
Hier würde ich aber eher das komische "opena" in was gängigeres übersetzen. Falls es nicht im Script geht, ginge das z.B. via stateFormat (ungetestet):
attr MQTT2_msh_mk6_balkontuer_og_211 stateFormat { my $value= ReadingsVal($name, "details", ""); $value eq "opena" ? "tilted" : $value eq "openb" ? "open" : "closed" }(Kann man ähnlich auch als userReadings-Eintrag in state schreiben).

Dass "ständig alles" gesendet wird, halte ich für einen Designfehler: Alles außer dem Öffnungszustand und dem RSSI-Wert ist doch statisch? Sendet man bestenfalls einmalig beim "Bekanntmachen" (ggf. über einen anderen Topic-Branch)...

Wegen des Sendens von Kommandos müßte man halt wissen, was auf welchen Topic geschubst werden muß.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

marboj

Hallo zusammen,

lese hier interessiert mit, da ich auch mal mit FHEM starten möchte und auch die genannte Alarmanlage im Einsatz habe. Gibt es mittlerweile eine "Anleitung", was zum EInbinden der Anlage in FHEM zu tun ist? Gerne für einen Anfänger...

Vielen Dank für die Hilfe.

Gruß
Marco
meine FHEM-Konfiguration: Raspberry Pi4, BT-Dongle, CUL868, CeeBee II

deeb

Hallo Marco,

bin zur Zeit auch wieder auf dieser Baustelle unterwegs. Bereits 2018 gab es eine Anfrage zur Kopplung der Aldi/Medion Alarmanlage mit Fhem:
Wenn du diese Medion-Alarmanlage hast, wäre es der erste Schritt, das du die Bluetooth Kommunikation zwischen den Meldern und der Zentrale auswerten/ nutzen kannst.
Zur Zeit funktionieren bei mir die Magnetkontakte, die Bewegungsmelder und die Alarmsirene. Weiterhin sollen auch die Rauchmelder funktionieren, habe ich aber nicht im Einsatz.
Ich nutze dafür bei mir zwei Raspi. Auf einem (Raspi4) läuft neben NextCloud u.a. auch FHEM und auf den anderen Raspi 3b ein MQTT Server.
Die Kommunikation zwischen den einzelnen Komponenten der Alarmanlage erfolgt über BT.
Im  März 2020 wurde über die Einbindung/Kopplung der verwendeten Sensoren (Magnetkontakte, Bewegungsmelder und Rauchmelder)  mit einen MQTT Server berichtet: https://community.medion.com/t5/Smart-Home/Medion-Smart-Home-Sensoren-über-Raspberry-Pi-direkt-lesen/m-p/90245
Es gibt dazu zwei Python-Scripte, die einmal die Verbindung der Alarmanlage mit dem Internetwebserver/der Cloud auslesen und zum anderen die WLAN-Kommunikation der Komponenten mit der Alarmzentrale mitschneiden und die Daten an einen MQTT-Server weiterleiten.
Details dazu lassen sich hier nachlesen: https://gitlab.com/shd290/mshtools/-/blob/master/README.md
Wenn du mit diesen Anleitungen über das Windowsprogramm MQTT.fx die BT-Kommunikation mitlesen kannst bist du schon bald am Ziel (geschätzte 60-70%).
Der letzte Schritt ist dann die Einbindung in FHEM. Dann eröffnen sich dir viele neue Möglichkeiten. Z.B. kannst du dann mit den Medion-Bewegungsmeldern auch andere Verbraucher schalten und bewegst dich nicht mehr nur im Medion-Universum.
Wenn es irgendwo klemmt auf dem Wege, dann melde dich gern nochmal. Eine komplette Anleitung für die FHEM-Installation + Medion Einbindung gibt es eines Wissens nach nicht.

VG und bleibt gesund
DEEB




Beta-User

Zitat von: deeb am 10 Februar 2021, 19:55:42
[...] und die Daten an einen MQTT-Server weiterleiten.
[...] Wenn du mit diesen Anleitungen über das Windowsprogramm MQTT.fx die BT-Kommunikation mitlesen kannst bist du schon bald am Ziel (geschätzte 60-70%).
Wenn du dafür gleich einen MQTT2_SERVER nutzt, solltest du die Daten direkt in FHEM sehen. Dann ist es "nur" eine Frage der Aufbereitung in FHEM. Sollte aber über ein spezielles "Sortierdevice" (Stichwort: bridgeRegexp) kein Problem sein, dass vollends aufzubereiten...

ZitatDer letzte Schritt ist dann die Einbindung in FHEM.
...würde also empfehlen, gleich die "Abkürzung" zu nehmen, dann kommst du direkt von der Aktivierung der beiden Python-Scripte nach FHEM...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

marboj

Hallo zusammen,

seit 2 Tagen läuft nun mein RP4 mit FHEM und ich wollte mich nun mal dem "Projekt" Medion zuwenden. Das Script zum Auslesen der Geräte habe ich manuell ausgeführt. In der JSON-Datei sind alle meine Geräte enthalten. Das BLE-Script habe ich nicht ausgeführt, weil das ja im Standard mit dem MQTT kommuniziert und ich mir den "Umweg" sparen möchte, um die Daten in FHEM zu haben.

- Wie macht man es in FHEM, dass diese Scripte automatisiert ablaufen?
- Wie bekomme ich die Kommunikation mit dem MQTT2 des FHEM hin?

VG
Marco
meine FHEM-Konfiguration: Raspberry Pi4, BT-Dongle, CUL868, CeeBee II

Beta-User

Die scripte sind extern, von daher würde ich dazu tendieren, die auch extern zu starten (z.B. indem du eine entsprechende service-Datei für systemd erstellst).

Dann wäre "ganz normal" ein MQTT2_SERVER zu definieren, und an den dann die Daten vom script aus zu publishen (wenn auf demselben Rechner: an localhost):
define m2server MQTT2_SERVER 1883 global

Danach die Anleitung mit der bridgeRegexp wie von deeb am 11.06. gepostet.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

marboj

#22
Da muss ich wohl zu meinem 2-tägigen Wissen noch Einiges lernen :-( ... Habe gelesen, dass man das eine Script nur zum einmaligen Auslesen der Geräte benötigt. Wer lesen kann...

- Habe die Scripte nach /home/pi/code/ kopiert.
- Dann habe ich mir eine CheckBLE.service mit folgendem Inhalt gebastet:

[Unit]
Description=Check BLE

[Service]
Type=simple
ExecStart=/home/pi/code/SH_CheckBLE.py

[Install]
WantedBy=multi-user.target


- Kann ich in der SH_CheckBLE.py die Parameter, die übergeben werden, direkt schreiben ("-n -mqtt2 192.168.0.110") oder in der Service hinter den Script-Namen?

- Wie wird die Service-Datei nun regelmäßig ausgeführt?

- Brauche ich das SH_Lib.py, welches mitgeliefert wird (https://gitlab.com/shd290/mshtools/-/blob/master/README.md) auch?

Vielleicht bekommen wir es hin, dass aus dem Thread eine Anleitung für alle entstehen kann.

Viele Grüße
Marco
meine FHEM-Konfiguration: Raspberry Pi4, BT-Dongle, CUL868, CeeBee II

Beta-User

Direkt die py ändern finde ich keine so glorreiche Idee: Was machst du beim nächsten update...?

In der .service müsste es möglich sein, den Aufruf beliebig anzupassen. Dann mußt du noch dafür sorgen, dass das sauber eingebunden ist, Hilfe dazu sollte bei Ubuntuusers zu finden sein, z.B. https://wiki.ubuntuusers.de/Howto/systemd_Service_Unit_Beispiel/

Bitte keine zu detaillierten Anleitungen für sowas ins Wiki stellen, das veraltet gerne und dann fühlt sich keiner mehr zuständig. Wer "sowas" haben will, sollte sich mit dem Stichwort "systemd" eigentlich die notwendigen Infos beschaffen können, um das dann auch automatisch zu starten (die File selbst ist aber ggf. was anderes...).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

marboj

#24
ok. Schaue ich mir an...
meine FHEM-Konfiguration: Raspberry Pi4, BT-Dongle, CUL868, CeeBee II

marboj

Mein erstes Ziel, die Scripte lokal manuell aufzurufen mit Ergebnissen hat schon einmal geklappt.

Habe mir das Script, welches die regelmäßige Abfrage der Geräte macht, mal angesehen. Leider steht dort fest MQTT drin. Geht das dann mit dem MQTT2 von FHEM gar nicht?

import time
import json
import argparse
import os
import subprocess
import paho.mqtt.publish as publish
import paho.mqtt.subscribe as subscribe
import threading
import re

from bluepy import btle

from SH_Lib import DecryptBLE, EncryptBLE, EncryptSD

import warnings

warnings.filterwarnings("ignore")

dictKeys = {}
dictNames = {}
dictType = {}
dictRXCount = {}
dictRXLevel = {}
dictLast = {}
listSD = []

DictBuffer = []

startfound = 0
endfound = 0
datafound = 0
debuginfo = False
usemqtt = False
cputs = 0
process_hcitool = None
process_btmon = None
process_started = False
alarmList = []
raspiname = "unusedName"
stopProcess = False
sdMac = ""
sdStart = False
hostadr = ""

def checkSubscribeMSGs():
    global stopProcess, raspiname, listSD, sdMac, sdStart, hostadr, debuginfo
    while (not stopProcess):
        try:
            msg = subscribe.simple("msh/{0}/ctrl".format(raspiname), qos=0, msg_count=1, retained=False, hostname="{0}".format(hostadr))
            msg = msg.payload.decode()
            if debuginfo:
                print(msg)
            msg_dict = json.loads(msg)
            if msg_dict['cmd'] == 'SD':
                if msg_dict['mac'].upper() in listSD:
                    sdMac = msg_dict['mac'].upper()
                    sdStart = True
            if msg_dict['cmd'] == 'stopProcess':
                stopProcess = True
               
        except:
            pass
    print('Subscribe thread finished')

def processSDrequests():
    global sdMac, sdStart, process_started, process_btmon, process_hcitool
    if sdStart:
        sdStart = False
        if process_started:
            process_started = False
            process_btmon.kill()
            process_hcitool.kill()
            time.sleep(0.2)
        alarmSD(sdMac)


def alarmSD(mac):
    global dictKeys, debuginfo
    try:
        key = dictKeys[mac]
        if debuginfo:
            print('Alarm')
        device = btle.Peripheral(None, addrType=btle.ADDR_TYPE_PUBLIC)
        physmac = mac[0:2]+':'+mac[2:4]+':'+mac[4:6]+':'+mac[6:8]+':'+mac[8:10]+':'+mac[10:12]
        device.connect(physmac)
        readValue = device.readCharacteristic(0x12)
        readValue = readValue.hex()[8:]
        message = DecryptBLE(readValue.upper(), key, mac)
        message = EncryptSD(message, key, mac)
        device.writeCharacteristic(0x12, bytearray.fromhex(message), withResponse=True)
        readValue = device.readCharacteristic(0x12)
        readValue = readValue.hex()[8:]
        device.writeCharacteristic(0x21, bytearray.fromhex('0300'), withResponse=True)
        device.disconnect()
        time.sleep(0.2)
    except:
        pass


def cputemp():
    temp = 0
    try:
        f = open('/sys/class/thermal/thermal_zone0/temp','r')
        for line in f:
            temp = int(line)
            break
        f.close()
    except:
        temp = 0
    return temp*1.0/1000.0


parser = argparse.ArgumentParser()
parser.add_argument("-mqtt", help="mqtt hostname e.g. user@192.168.3.27 follows by -pw or only 192.168.3.27 without pw", type=str)
parser.add_argument("-password", help="mqtt password", type=str)
parser.add_argument('-d', help="print some debug infos", action='store_true')
parser.add_argument('-n', help="set the name of raspberry pi in sensor information", type=str)

args = parser.parse_args()
if args.mqtt and not args.password:
    if '@' in args.mqtt:
        print(args.mqtt)
        print('password is missing')
        exit(0)
if args.n:
    raspiname = str(args.n)
if args.mqtt:
    usemqtt = True
if args.d:
    debuginfo = True
auth = None
if usemqtt:
    hostadr = args.mqtt
    if '@' in args.mqtt:
        auth = dict(username=args.mqtt('@')[0], password= args.password)
        hostadr = args.mqtt('@')[1]

if debuginfo:
    print('CPU Temp: {0}'.format(cputemp()))

adr = '1BSv43wsjcX7C6xfzxnDSV8coCxRAVKrgf'

try:
    with open('smarthome.json', 'r') as f:
        distros_dict = json.load(f)
        for i in range(len(distros_dict)):
            if distros_dict[i]['DataDeviceType'] == 10 or distros_dict[i]['DataDeviceType'] == 7 or distros_dict[i]['DataDeviceType'] == 4:
                mac = distros_dict[i]['name']
                dictKeys[mac] = distros_dict[i]['key']
                dictNames[mac] = re.sub('[^A-Za-z0-9_]+', '_', distros_dict[i]['DeviceName']) # get clean name
                dictType[mac] = distros_dict[i]['DataDeviceType']
                if distros_dict[i]['DataDeviceType'] == 7:
                    listSD.append(mac.upper())
except:
    print('error reading smarthome.json')
    exit(0)
if len(dictKeys) == 0:
    print('error no sensors found')
    exit(0)

print('Willkommen bei den MSH Tools')
print('Diese SW ist eine technische Demonstration und dient ausschliesslich zum Testen.')
print('Verwendung und Benutzung auf eigene Gefahr und Risiko.')
print('Wenn euch meine Arbeit  gefaellt oder diese SW benutzt dann unterstuetzt mich\n unter der folgenden Bitcoin Adresse: {0}.'.format(adr))

# start Subscriber Thread
if usemqtt:
    subscribe_thread = threading.Thread(target=checkSubscribeMSGs)
    subscribe_thread.start()
# Start BLE processes
os.system("hciconfig hci0 down")
time.sleep(0.5)
os.system("hciconfig hci0 up")
time.sleep(0.5)

process_hcitool = subprocess.Popen(['hcitool', 'lescan', '--passive','--duplicate'],
                           stdout=subprocess.PIPE,
                           universal_newlines=True)
process_btmon = subprocess.Popen(['btmon'],
                           stdout=subprocess.PIPE,
                           universal_newlines=True)

process_started = True
process_cnt = 0
while not stopProcess:
    process_cnt = process_cnt + 1
    if int(time.time()*1000) > (cputs + 2500) and (process_cnt % 2) == 0:
        cputs = int(time.time()*1000)
        if cputemp() > 82.0:
            print('High Temperature')
            exit(0)
        processSDrequests()
        if not process_started:
            process_started = True
            os.system("hciconfig hci0 down")
            time.sleep(0.2)
            os.system("hciconfig hci0 up")
            time.sleep(0.2)

            process_hcitool = subprocess.Popen(['hcitool', 'lescan', '--passive','--duplicate'],
                                       stdout=subprocess.PIPE,
                                       universal_newlines=True)
            process_btmon = subprocess.Popen(['btmon'],
                                       stdout=subprocess.PIPE,
                                       universal_newlines=True)
            time.sleep(0.2)

    output = process_btmon.stdout.readline()
    output = output.strip()
    if '> HCI Event: LE Meta Event (0x3e' in output:
        startfound = 1
        endfound = 0
        datafound = 0
        debugtext = ''
        timestamp = 0.0
        timestampRT = int(time.time()*1000)
        rssivalue = 0.0
        try:
            timestamp = float(output.split()[-1])
        except:
            print(output)
    if startfound == 1:
        debugtext = debugtext + output +'\n'
    if startfound == 1 and 'Address:' in output:
        mac = output.split()[1].replace(':','')
    if startfound == 1 and 'Data:' in output and 'a0064' in output:
        datafound = 1
        data = output.split()[1]
        data = data.upper()
        data = data[10:]
        data = data[:32]
    if 'RSSI:' in output:
        if 'invalid' in output:
            startfound = 0
            endfound = 0
            datafound = 0
            debugtext = ''
        else:
            endfound = 1
            if startfound == 1:
                try:
                    rssivalue = float(output.split()[1])
                except:
                    startfound = 0
                    endfound = 0
                    datafound = 0
    if endfound == 1:
        if startfound == 1 and datafound == 1 and mac in dictNames and len(data) == 32 and rssivalue < -10:
            # process frame
            key = dictKeys[mac]
            decrMessage = DecryptBLE(data, key, mac)
            if decrMessage.startswith('10') == False or decrMessage.endswith('00000000') == False:
                if debuginfo:
                    print(debugtext)
            else:
                value_int = 0
                intermessage = 'unknown'
                printinfo = False
                initmsg = False
                if mac in dictLast:
                    if dictType[mac] == 10: # 'motion detector':
                        if dictLast[mac] != decrMessage:
                            printinfo = True
                            value_int = int(decrMessage[4:6]+decrMessage[2:4], 16)
                            if decrMessage.endswith('10000000000'):
                                intermessage = 'move'
                            else:
                                intermessage = decrMessage
                    if dictType[mac] == 7: # 'smoke detector':
                        if dictLast[mac] != decrMessage:
                            value_int = 1
                            if decrMessage.endswith('1000000000000000000'):
                                value_int = 1
                                intermessage = 'normal'
                            elif decrMessage.endswith('6000000000000000000'): 
                                intermessage = 'alarm_6'
                            elif decrMessage.endswith('4000000000000000000'): 
                                intermessage = 'alarm_4'
                            else:
                                intermessage = decrMessage
                            printinfo = True
                    if dictType[mac] == 4: # 'door contact':
                        if dictLast[mac][8:] != decrMessage[8:]:
                            value_int = 1
                            printinfo = True
                            if decrMessage.endswith('1000000000000000000'):
                                value_int = 0
                                intermessage = 'close'
                            elif decrMessage.endswith('2000000000000000000'): 
                                intermessage = 'open'
                            else:
                                intermessage = decrMessage
                    dictLast[mac] =  decrMessage       
                else:
                    initmsg = True
                    dictLast[mac]=decrMessage
                    if dictType[mac] == 10: # 'motion detector':
                        printinfo = True
                        value_int = int(decrMessage[4:6]+decrMessage[2:4], 16)
                        if decrMessage.endswith('10000000000'):
                            intermessage = 'init'
                        else:
                            intermessage = decrMessage
                    if dictType[mac] == 7: # 'smoke detector':
                        value_int = 1
                        if decrMessage.endswith('1000000000000000000'):
                            intermessage = 'normal'
                            value_int = 0
                        elif decrMessage.endswith('6000000000000000000'): 
                            intermessage = 'alarm_6'
                        elif decrMessage.endswith('4000000000000000000'): 
                            intermessage = 'alarm_4'
                        else:
                            intermessage = decrMessage
                        printinfo = True
                    if dictType[mac] == 4: # 'door contact':
                        value_int = 1
                        printinfo = True
                        if decrMessage.endswith('1000000000000000000'):
                            intermessage = 'close'
                            value_int = 0
                        elif decrMessage.endswith('2000000000000000000'): 
                            intermessage = 'open'
                        else:
                            intermessage = decrMessage
                    dictLast[mac] = decrMessage

                dictMessage = {}
                dictMessage['mac'] = mac
                dictMessage['source'] = raspiname
                dictMessage['details'] = intermessage
                dictMessage['value'] = value_int
                dictMessage['rssivalue'] = rssivalue
                dictMessage['timestampRT'] = timestampRT
                dictMessage['type'] = dictType[mac]
                dictMessage['name'] = dictNames[mac]
                if printinfo:
                    if debuginfo:
                        print('{0} : {1} : {2} : {3} : {4} : {5} : {6}'.format(mac, intermessage, rssivalue, timestampRT, dictNames[mac],  value_int, cputemp()))
                    if usemqtt:
                        try:
                            publish.single("msh/d_{0}".format(dictNames[mac].lower()), "{0}".format(json.dumps(dictMessage)), hostname="{0}".format(hostadr), auth=auth)
                        except:
                            pass
        startfound = 0
        endfound = 0
        datafound = 0
        debugtext = ''
    # Do something else
if usemqtt:
    subscribe_thread.join()


meine FHEM-Konfiguration: Raspberry Pi4, BT-Dongle, CUL868, CeeBee II

marboj

Beim Anlegen des Devices

define MEDION_Alarm MQTT2_DEVICE msh
setuuid MEDION_Alarm 5ede8b9d-f33f-d326-048e-f27c3a91eb37e1c0
attr MEDION_Alarm IODev fehm_mqtt2
attr MEDION_Alarm bridgeRegexp msh/d_([^/:]+):.* "msh_$1"
attr MEDION_Alarm icon mqtt_bridge_2
attr MEDION_Alarm readingList msh/([^d][^/]):.* {json2nameValue($EVENT,''$JSONMAP)}
attr MEDION_Alarm room MQTT2_DEVICE


erscheint folgender Fehler:

MEDION_Alarm attr readingList: more parameters needed
meine FHEM-Konfiguration: Raspberry Pi4, BT-Dongle, CUL868, CeeBee II

Beta-User

Zitat von: marboj am 19 Februar 2021, 22:12:42
Leider steht dort fest MQTT drin. Geht das dann mit dem MQTT2 von FHEM gar nicht?
MQTT2  ist nur eine FHEM-interne Bezeichnung der Modul-"Generation". Von außen ist es (ziemlich) egal.

Irgendwie ist es irritieren, dass du da so viel händisch rummachst. Zum einen: cfg-editieren geht gar nicht, erzeugt nur Fehler (falls du das tust), zum anderen sollte zumindest ein Device automatisch erzeugt werden, wenn es sich beim MQTT2_SERVER anmeldet. Da ist also was grundlegendes falsch.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

marboj

#28
Manuelles Editieren mache ich nicht, ich wollte nur das Script verstehen.

Ich habe jetzt folgendes gemacht:
- Server angelegt in FHEM
defmod m2server MQTT2_SERVER 1883 localhost
attr m2server autocreate complex

- Script gestartet
sudo python3 SH_CheckBLE.py  -mqtt localhost &

Jetzt werden Geräte angelegt, Yippieh!!!!

Nun muss ich nur noch das Script automatisieren...

meine FHEM-Konfiguration: Raspberry Pi4, BT-Dongle, CUL868, CeeBee II

Beta-User

Server darf nicht localhost in der DEF haben, aber die IP fürs script ggf. schon...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors