Autor Thema: Roomba Staubsaugerroboter  (Gelesen 31415 mal)

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8179
Roomba Staubsaugerroboter
« am: 10 September 2020, 16:40:34 »
Edit:

Ich habe über die Anbindung der Roomba-Roboter einen Wiki-Eintrag geschrieben, das Hilfsmodul 99_RoombaUtils.pm befindet sich ab sofort im FHEM-Ordner contrib/Roomba.

https://wiki.fhem.de/wiki/Roomba

Es gibt in diesem Wiki-Eintrag auch eine noch etwas rudimentäre Beschreibung, wie man die interaktiven Reinigungskarten erzeugt und verwaltet.


Die Roomba-Staubsaugerroboter von iRobot haben einen eingebauten MQTT Server. Das von Thorsten Pferdekämper und anderen entwickelte Modul 42_Roomba980 basiert auf dem Perl-Modul Net::MQTT::Message, funktioniert inzwischen aber nicht mehr. Nach einem Firmware-Update der Staubsauger sagen diese

Zitat
2020.09.10 16:33:40 5: MQTT RoombaSauger message received: [2] ConnAck/at-most-once Connection Refused: unacceptable protocol version
2020.09.10 16:33:40 1: 192.168.0.41:8883 disconnected, waiting to reappear (RoombaSauger)
2020.09.10 16:33:41 5: MQTT RoombaSauger message sent: Connect/at-most-once MQTT/5/NetMQTTpm16474
2020.09.10 16:33:41 5: SW: 101a00044d5154540502003c000e4e65744d515454706d3136343734
2020.09.10 16:33:41 5: MQTT RoombaSauger message sent: PingReq/at-most-once
2020.09.10 16:33:41 5: SW: c000

Das Modul wird auch nicht mehr weiterentwickelt.

Ich blicke nicht so ganz durch, wie ich einen MQTT2_SERVER dazu kriegen kann, sich mit einem bisher unbekannten MQTT-Device zu verbinden. Im dem obengenannten Modul geht das mit einem Aufruf aus Net::MQTT::Message
return send_message($hash, message_type => MQTT_CONNECT, keep_alive_timer => $hash->{timeout},
                             user_name => $user, password => $pass, client_id => $user,
protocol_name => "MQTT", protocol_version => 4);
und produziert den obigen Fehler. Könnte mir mal jemand von den MQTT-Experten auf die Sprünge helfen?

LG

pah



« Letzte Änderung: 06 Januar 2021, 18:56:48 von Prof. Dr. Peter Henning »

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16301
Antw:Roomba Staubsaugerroboter
« Antwort #1 am: 10 September 2020, 17:33:26 »
Hmm, bin zwar bei weitem kein Experte, was die Kommunikation "hinter" dem MQTT2_SERVER angeht, aber so wie ich dieses Code-Fragment verstehe, geht es eigentlich eher darum, dass man sich mit dem Broker verbindet und dazu ggf. die Credentials benötigt. Der liefert dann aus oder eben nicht, die Kommunikation in Richtung Client/Sauger ist dann ein 2. Ding.

Hier kommt mir die "4" seltsam vor, ich meine, dass entweder "3" gebräuchlich ist oder dann gleich "5" (was aber bisher noch kein Device genutzt hat, das hier aufgeschlagen war, und M2Server kann (bisher) auch nur MQTT-Protokoll bis V. 3.irgendwas).

Für MQTT2_DEVICE braucht man eigentlich keine Credentials, wenn, dann wäre das ein Thema, das im Rahmen von allowed iVm. dem M2Server zu verorten wäre. Ohne allowed akzeptiert ein "global"-Server auch Nachrichten von Clients, die meinen, es müßte eine Authentifizierung stattfinden. Näheres sollten eigentlich die Logs vom Server liefern.

Ansonsten ist es bei anderen Geräten iVm. M2Server easy: Du trägst die IP/Port-Kombi auf dem Server ein, den (empfangsseitigen) Rest erledigt autocreate. Ist das dein erster Versuch mit einem MQTT-Gerät und M2Server? (Wenn ja: nimm' mal einen Shelly zum Kennenlernen ;) ).
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8179
Antw:Roomba Staubsaugerroboter
« Antwort #2 am: 11 September 2020, 09:00:39 »
Zitat
Ist das dein erster Versuch mit einem MQTT-Gerät und M2Server?
Natürlich nicht, ich betreibe schon diverse Dinge damit. Ich diskutiere gerade mit Entwicklern von iRobot, wie man vorgehen kann und werde Euch auf dem Laufenden halten.


So wie ich das jetzt einschätze, stellt der Roomba tatsächlich einen MQTT Broker bereit, und nicht nur das Endgerät. Das würde bedeuten, dass ich mich als Client mit der Kiste verbinden muss.

LG

pah
« Letzte Änderung: 11 September 2020, 09:13:47 von Prof. Dr. Peter Henning »

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16301
Antw:Roomba Staubsaugerroboter
« Antwort #3 am: 11 September 2020, 10:13:22 »
Hmm, dann implementiert das fragliche Modul also sowohl den Client (alt: 00_MQTT.pm) wie das eigentliche MQTT-Device.

K.A., wie MQTT2_CLIENT das Protokoll aushandelt, aber wenn bis 3.irgendwas ausreicht, könnte es  gehen, erst mal nur die Readings abzuholen mit MQTT2_CLIENT (+ aktiviertem autocreate simple) und den passenden Credentials (ich meine, es gab auch schon mal ein ähnliches Projekt, das Stichwort düfte "bumper" sein). Spannender wird dann die Frage, wie die Topics sind, auf denen das Teil seine Befehle erwartet (und in welchem Format).

Ansonsten wäre zu checken, ob das alte Modul wieder mit einer passenden Protokol-Version reanimiert werden könnte. (Insgesamt glaube ich aber, dass eine Verteilung dieser Angelegenheit auf ein IO+Client-Gespann mit den MQTT2-Modulen vermutlich auf die Dauer einfacher zu pflegen sein wird als dieses Einheits-Modul).
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8179
Antw:Roomba Staubsaugerroboter
« Antwort #4 am: 12 September 2020, 12:22:47 »
Also, mit dem "Einheitsmodul" geht gar nichts mehr, egal, was bei der Protokollversion drinsteht.

Mit MQTT2_CLIENT bin ich einen Schritt weiter - ich erziele immerhin ein "opened" beim MQTT-Broker des Staubsaugers. Jetzt brauche ich nur noch etwas, das ich publishen kann. Gibt es irgendwo ein Beispiel für eine mit MQTT2_CLIENT zu publizierende Message? BLID und Passwort habe ich.

Meine vermutung, dass da ein Broker mit eingebaut ist, hat sich jedenfalls bestätigt. Hier gibt es nämlich ein GitHub-Projekt, das darauf aufbauend den MQTT-Broker des Staubsaugers mit einem anderen MQTT-Broker (also sprich in FHEM) koppelt.

https://github.com/NickWaterton/Roomba980-Python

Leider habe ich das Python-Skript noch nicht richtig zum Laufen bekommen. Aber ich arbeite immerhin dran.

LG

pah

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16301
Antw:Roomba Staubsaugerroboter
« Antwort #5 am: 12 September 2020, 14:12:22 »
Hmmm, vorher würde ich mal versuchen, an Readings zu kommen => autocreate am IO aktiv?
Falls der Sauger einen Homeassistant-Modus kennt: darüber könnte man uU. rausbekommen, welche messages wo erwartet werden ;) .
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8179
Antw:Roomba Staubsaugerroboter
« Antwort #6 am: 12 September 2020, 14:23:33 »
Schon wieder einen Schritt weiter. Ich habe jetzt eine Python-Anwendung, die die beiden Broker koppelt. Auch das globale autocreate und das autorcreate im MQTT2_SERVER sind aktiv, verbose 5 zeig tmir auch Daten des Roboters, aber readings werden noch keine angelegt.
Zitat
2020.09.12 14:22:32 5: in:  PUBLISH: 0!(0)(28)/roomba/feedback/signal_rssi-40
2020.09.12 14:22:32 4:   MQTTBridge_127.0.0.1_41349  PUBLISH /roomba/feedback/signal_rssi:-40
2020.09.12 14:22:32 5: MQTTBridge: dispatch autocreate=complex\000\000/roomba/feedback/signal_rssi\000-40
2020.09.12 14:22:32 5: in:  PUBLISH: 0(31)(0)(27)/roomba/feedback/signal_snr49
2020.09.12 14:22:32 4:   MQTTBridge_127.0.0.1_41349  PUBLISH /roomba/feedback/signal_snr:49
2020.09.12 14:22:32 5: MQTTBridge: dispatch autocreate=complex\000\000/roomba/feedback/signal_snr\00049
2020.09.12 14:22:32 5: in:  PUBLISH: 0 (0)(22)/roomba/feedback/stateCharging
2020.09.12 14:22:32 4:   MQTTBridge_127.0.0.1_41349  PUBLISH /roomba/feedback/state:Charging
2020.09.12 14:22:32 5: MQTTBridge: dispatch autocreate=complex\000\000/roomba/feedback/state\000Charging

LG

pah

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8179
Antw:Roomba Staubsaugerroboter
« Antwort #7 am: 12 September 2020, 15:19:38 »
OK, diese Methode klappt schon mal.

Mit der Python-Anwendung im Hintergrund kann ich den Roomba jetzt prima steuern. Aus irgendeinem Grund wurden aber weder das zugehörige MQTT2_DEVICE, noch dessen Readings automatisch angelegt, habe ich alles manuell machen müssen.

Außerdem ist ein Problem mit dem paho-mqttt-Client in Python aufgetreten: Von den Kommandostrings musste ich immer noch ein führendes "b" sowie die "'" entfernen.

Das ist mir jetzt aber noch zu umständlich - es müsste auch mit einem MQTT2_CLIENT direkt auf den Roomba gehen.

LG

pah

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 19680
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Roomba Staubsaugerroboter
« Antwort #8 am: 13 September 2020, 12:02:07 »
Hallo pah,

ich habe mal mit Hilfe von ein paar Beiträgen einen Cloud Broker an MQTT2_CLIENT gekoppelt.

Durch Dein python Script solltest Du alle Infos haben, vielleicht hilft dieses Beispiel.
autocreate complex ist übrigens nicht unbedingt das Mittel der Wahl, Standard sollte simple sein.

Gruß Otto
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8179
Antw:Roomba Staubsaugerroboter
« Antwort #9 am: 13 September 2020, 13:00:50 »
Danke Dir.

Ich habe jetzt als Übergangslösung das mit den externen Python-Programmen gemacht. Bisher habe ich es nicht hinbekommen, dass beide Roombas in demselben Python-Programm verwaltet werden.
Lässt man aber 2 davon im Hintergrund laufen, funktioniert das astrein, für jeden Roboter gibt es auf FHEM-Seite ein MQTT2_DEVICE, mit dem ich ihn steuern kann.

Diese Lösung, also MQTT2_DEVICE <-> MQTT2_SERVER <-> Python-Programm <-> Roomba-MQTT-Server <-> Roomba-Gerät  habe ich unten beschrieben.


Die andere Lösung  wäre MQTT2_DEVICE <-> MQTT2_CLIENT <-> Roomba-MQTT-Server <-> Roomba-Gerät, diese habe ich noch nicht hinbekommen. Denn inzwischen kriege ich - erstaunlicherweise, das hatte zwischendrin ja schon geklappt - eine Verweigerung der Verbindung eines MQTT2_CLIENT mit einem der Roboter. Irgendetwas stimmt dabei an den Credentials nicht, ich muss wohl wirklich nach dem Zertifikat graben, das mit der anderen Methode irgendwie geholt wird (auch da gibt es zunächst beom Connect eine Fehlermeldung, bis TLS 1.3 eingeschaltet wird).

Also, was geht bisher:

1. Auf dem FHEM-Server per
pip install paho-mqtt
pip install pillow
pip install six
pip install git+https://github.com/NickWaterton/Roomba980-Python.git
eine lokale Installation geholt.

2. Mit dem Kommando
python3 ~/Roomba980-Python/roomba/getpasswd.pydie jeweiligen Credentials meiner beiden Roomba geholt. Ergibt jeweils etwas wie
Zitat
Received: {
 "robotname": "Feger", 
 "sku": "R981040", 
 "nc": 0, 
 "ver": "3", 
 "proto": "mqtt", 
 "ip": "192.168.0.xx", 
 "hostname": "Roomba-31xxxxxxxxxx0", 
 "sw": "v2.4.8-44", 
 "mac": "70:66:xxxxxxxxxxx:6F", 
 "cap": {
   "carpetBoost": 1, 
   "pp": 1, 
   "langOta": 1, 
   "binFullDetect": 1, 
   "ota": 2, 
   "maps": 1, 
   "pose": 1, 
   "eco": 1, 
   "multiPass": 2, 
   "edge": 1, 
   "svcConf": 1
 }
}
Roomba (Feger) IP address is: 192.168.0.XX
blid is: 3###########0
Password=> :######################A <= Yes, all this string.
Use these credentials in roomba.py

3. Ein Python-Programm gebaut, z.B. ~/Roomba980-Python/roomba/fhemfeger.py als
from __future__ import print_function
from roomba import Roomba
import paho.mqtt.client as mqtt
import time
import json

broker = 'localhost'    #ip of FHEM mqtt broker
user = ''         
password = '' 

#roombaName = 'roombaFeger'
#address = '192.168.0.xx'
#blid = '3xxxxxxxxxxxx0'
#roombaPassword = ':1:1xxxxxxxxxxxxxbh'

def broker_on_connect(client, userdata, flags, rc):
    print("Broker Connected with result code "+str(rc))
    #subscribe to roomba feedback
    if rc == 0:
        mqttc.subscribe(brokerCommand)
        mqttc.subscribe(brokerSetting)

def broker_on_message(mosq, obj, msg):
    if roombaName in msg.topic:
        #publish to roomba
        if "command" in msg.topic:
            pl = str(msg.payload).strip('b\'')
            print("Received COMMAND: %s" % pl)
            myroomba.send_command( pl )
        elif "setting" in msg.topic:
            print("Received SETTING: %s" % str(msg.payload))
            cmd = str(msg.payload).split()
            myroomba.set_preference(cmd[0], cmd[1])

def broker_on_publish(mosq, obj, mid):
    pass

def broker_on_subscribe(mosq, obj, mid, granted_qos):
    print("Broker Subscribed: %s %s" % (str(mid), str(granted_qos)))

def broker_on_disconnect(mosq, obj, rc):
    print("Broker disconnected")

def broker_on_log(mosq, obj, level, string):
    print(string)


mqttc = None
if broker is not None:
    brokerCommand = "/roomba/command/" + roombaName
    brokerSetting = "/roomba/setting/" + roombaName
    brokerFeedback = "/roomba/feedback/" + roombaName

    #connect to broker
 mqttc = mqtt.Client()
    #Assign event callbacks
    mqttc.on_message = broker_on_message
    mqttc.on_connect = broker_on_connect
    mqttc.on_disconnect = broker_on_disconnect
    mqttc.on_publish = broker_on_publish
    mqttc.on_subscribe = broker_on_subscribe

    try:
        mqttc.username_pw_set(user, password)  #put your own mqtt user and password here if you are using them, otherwise comment out
        mqttc.connect(broker, 1883, 60) #Ping MQTT broker every 60 seconds if no data is published from this script.

    except Exception as e:
        print("Unable to connect to MQTT Broker: %s" % e)
        mqttc = None

myroomba = Roomba(address, blid, roombaPassword, topic="#", continuous=True, clean=False, cert_name = "./ca-certificates.crt")

#all these are optional, if you don't include them, the defaults will work just fine
#if you are using maps
myroomba.enable_map(enable=True, mapSize="(800,1650,-300,-50,2,0)", mapPath="./", iconPath="./")  #enable live maps, class default is no maps


if broker is not None:
    myroomba.set_mqtt_client(mqttc, brokerFeedback)

#finally connect to Roomba - (required!)
myroomba.connect()

print("<CTRL C> to exit")
print("Subscribe to /roomba/feedback/" + roombaName + "/# to see published data")

try:
    if mqttc is not None:
        mqttc.loop_forever()
    else:
        while True:
            print("Roomba " + roombaName +" Data: %s" % json.dumps(myroomba.master_state, indent=2))
            time.sleep(5)

except (KeyboardInterrupt, SystemExit):
    print("System exit Received - Exiting program")
    myroomba.disconnect()
    if mqttc is not None:
        mqttc.disconnect()

4. Dieses Programm läuft auf dem FHEM-Server im Hintergrund als python3 ~/Roomba980-Python/roomba/fhemfeger.py > /dev/null 2> /dev/null und schickt alle Messages von dem Roomba-MQTT-Server an den FHEM-MQTT-Server (mit Namen MQTTBridge). Der wiederum kennt für jeden der beiden Roomba ein Device.

5.Listing des einen Devices:
DEVICETOPIC RoombaFeger
   FUUID      5f5cbe27-f33f-a726-8734-ab96da6c3ee99444
   IODev      MQTTBridge
   IODevName  RoombaFegerClient
   LASTInputDev MQTTBridge
   MQTTBridge_MSGCNT 2517
   MQTTBridge_TIME 2020-09-13 12:44:52
   MSGCNT     2517
   NAME       RoombaFeger
   NR         180
   STATE      Charging
   TYPE       MQTT2_DEVICE
   READINGS:
     2020-09-13 12:43:19   audio_active    False
     2020-09-13 12:43:19   battery         100
     2020-09-13 12:43:19   carpetBoost     False
     2020-09-12 15:46:56   lastCommand     dock
     2020-09-13 12:43:20   lastInitiator   manual
     2020-09-13 12:43:19   netinfo_dhcp    True
     2020-09-13 12:43:19   position_theta  173
     2020-09-13 12:43:19   position_x      -12
     2020-09-13 12:43:19   position_y      29
     2020-09-13 12:44:52   signal_rssi     -41
     2020-09-13 12:44:52   signal_snr      48
     2020-09-13 12:44:52   state           Charging
Attributes:
   IODev      MQTTBridge
   autocreate 1
   readingList /roomba/feedback/roombaFeger/state:.* state
/roomba/feedback/roombaFeger/signal_rssi:.* signal_rssi
/roomba/feedback/roombaFeger/signal_snr:.* signal_snr
/roomba/feedback/roombaFeger/netinfo_dhcp:.* netinfo_dhcp
/roomba/feedback/roombaFeger/audio_active:.* audio_active
/roomba/feedback/roombaFeger/batPct:.* battery
/roomba/feedback/roombaFeger/carpetBoost:.* carpetBoost
/roomba/feedback/roombaFegerr/astCommand_command:.* lastCommand
/roomba/feedback/roombaFeger/lastCommand_initiator:.* lastInitiator
/roomba/feedback/roombaFeger/pose_theta:.* position_theta
/roomba/feedback/roombaFeger/pose_point_x:.* position_x
/roomba/feedback/roombaFeger/pose_point_y:.* position_y

   setList    start /roomba/command/roombaFeger start
stop /roomba/command/roombaFeger stop
pause /roomba/command/roombaFeger pause
resume /roomba/command/roombaFeger resume
dock /roomba/command/roombaFeger dock

6. Ich habe es bisher nicht hinbekommen, die beiden unterschiedlichen Roombas in einem einzelnen Python-Programm abzudecken. Also werden ganz einfach zwei davon gestartet, es gibt zwei bach-Skripte in /opt/fhem, eins zum checken
#!/bin/bash

statsauger=`ps -ef | grep fhemsauger | grep -v grep | awk '{print $2}'`
statfeger=`ps -ef | grep fhemfeger | grep -v grep | awk '{print $2}'`

if [ "$statsauger" == "" ] || [ "$statfeger" == "" ]; then
  echo -n "0"
else
  echo -n "1"
fi
und eins zum Starten der beiden Python-Programme
#!/bin/bash

statsauger=`ps -ef | grep fhemsauger | grep -v grep | awk '{print $2}'`
statfeger=`ps -ef | grep fhemfeger | grep -v grep | awk '{print $2}'`

if [ "$statsauger" == "" ]; then
  python3 /root/Roomba980-Python/roomba/fhemsauger.py > /dev/null 2> /dev/null &
fi

if [ "$statfeger" == "" ]; then
  python3 /root/Roomba980-Python/roomba/fhemfeger.py > /dev/null 2> /dev/null &
fi

7. Auf FHEM-Seite werden diese überwacht durch einen Dummy
Internals:
   CFGFN     
   FUUID      5f5df29c-f33f-a726-2e25-be3150af0bbdd339
   NAME       RoombaBridge
   NR         1291
   STATE      on
   TYPE       dummy
   READINGS:
     2020-09-13 12:49:01   state           on
Attributes:
   devStateIcon off:ios-off .*:ios-on-green
   setList    start stop on off
   webCmd     start:stop
ein at zum periodischen checken
Internals:
   CFGFN     
   COMMAND    {fhem("set RoombaBridge ".((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))}
   DEF        +*00:05:00 {fhem("set RoombaBridge ".((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))}
   FUUID      5f5df319-f33f-a726-6529-6a2067913cf0b841
   NAME       RoombaChecker
   NR         1323
   NTM        12:54:01
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      Next: 12:54:01
   TIMESPEC   00:05:00
   TRIGGERTIME 1599994441.07101
   TRIGGERTIME_FMT 2020-09-13 12:54:01
   TYPE       at
   READINGS:
     2020-09-13 12:49:01   state           Next: 12:54:01
Attributes:
und ein IF zum Abfangen der start/stop-Befehle für die Python-Skripte
Internals:
   CFGFN     
   DEF        ([RoombaBridge] eq "start")
 ({system ("sudo /opt/fhem/startRoomba.sh")},
 {fhem("set RoombaBridge ".
  ((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))})
DOELSEIF ([RoombaBridge] eq "stop")
 ({system ("sudo /opt/fhem/stopRoomba.sh")},
{fhem("set RoombaBridge ".
  ((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))})
   FUUID      5f5df3a0-f33f-a726-7120-1bf01544cde3ae26
   MODEL      FHEM
   NAME       Roomba.IF
   NOTIFYDEV  RoombaBridge,global
   NR         1359
   NTFY_ORDER 50-Roomba.IF
   STATE      initialized
   TYPE       DOIF
   VERSION    22757 2020-09-11 16:21:17
   READINGS:
     2020-09-13 12:49:01   Device          RoombaBridge
     2020-09-13 12:27:47   cmd             0
     2020-09-13 12:49:01   e_RoombaBridge_STATE on
     2020-09-13 12:27:47   mode            enabled
     2020-09-13 12:27:47   state           initialized
   Regex:
     accu:
     cond:
       RoombaBridge:
         0:
           &STATE     ^RoombaBridge$
         1:
           &STATE     ^RoombaBridge$
   condition:
     0          ::InternalDoIf($hash,'RoombaBridge','STATE') eq "start"
     1          ::InternalDoIf($hash,'RoombaBridge','STATE') eq "stop"
   do:
     0:
       0          {system ("sudo /opt/fhem/startRoomba.sh")},  {fhem("set RoombaBridge ".   ((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))}
     1:
       0          {system ("sudo /opt/fhem/stopRoomba.sh")}, {fhem("set RoombaBridge ".   ((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))}
     2:
   helper:
     DEVFILTER  ^global$|^RoombaBridge$
     NOTIFYDEV  global|RoombaBridge
     event      on
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev RoombaBridge
     triggerEvents:
       on
     triggerEventsState:
       state: on
   internals:
     all         RoombaBridge:STATE
   readings:
   trigger:
   uiTable:
Attributes:
   do         always

LG

pah

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8179
Antw:Roomba Staubsaugerroboter
« Antwort #10 am: 13 September 2020, 15:38:51 »
OK, Auslesen klappt auch ohne zusätzliche Python-Programme.

Der Weg ist also jetzt:
MQTT2_DEVICE <-> MQTT2_CLIENT <-> Roomba-MQTT-Server <-> Roomba-Gerät

Nötig dafür war im Client sowohl den username als auch die clientId auf die BLID aus dem Roboter zu setzen, sowie bei sslargs SSL_version:SSLv23 einzusetzen.

Ergebnis ist - bei verbose 5 - eine ganze Menge von Messages, hier ein paar Auszüge
Zitat
2020.09.13 15:27:01 5: RoombaSaugerClient: received PUBLISH (0)*$aws/things/3xx90/shadow/update{"state":{"reported":{"batPct":84,"dock":{"known":false},"bin":{"present":true,"full":false},"audio":{"active":false}}}}
2020.09.13 15:27:01 5: RoombaSaugerClient: dispatch autocreate=simple\0003xx90\000$aws/things/3xx90/shadow/update\000{"state":{"reported":{"batPct":84,"dock":{"known":false},"bin":{"present":true,"full":false},"audio":{"active":false}}}}
2020.09.13 15:27:01 5: RoombaSaugerClient: received PUBLISH (0)*$aws/things/3xx90/shadow/update{"state":{"reported":{"cleanMissionStatus":{"cycle":"none","phase":"charge","expireM":0,"rechrgM":0,"error":0,"notReady":0,"mssnM":0,"sqft":0,"initiator":"rmtApp","nMssn":68},"language":4,"noAutoPasses":true,"noPP":false,"ecoCharge":false}}}
2

die auch mit autocreate wunderbar in die entsprechenden Readings umgewandelt werden. Sowohl die MQTT2_Devices, als auch die Readings werden sauber angelegt, dabei ist z.B. die readingList dann aber manuell angepasst auf
Zitat
3xx90:wifistat:.* { json2nameValue($EVENT) }
3xx90:.*aws/things/3xx90/shadow/update:.* { json2nameValue($EVENT) }

Passt also. Jetzt fehlt mir nur noch ein schlauer Einfall für die setList.

Probiert habe ich ohne Erfolg schon das Publizieren von
/things/3xx90/command start
*$aws/things/3xx90/command start
*$aws/things/3xx90/command start
und ungefähr 100 Variationen davon. Hat irgendjemand von Euch einen Schimmer, wie ich den richtigen Topic dafür finden kann?


LG

pah
« Letzte Änderung: 13 September 2020, 15:57:32 von Prof. Dr. Peter Henning »

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16301
Antw:Roomba Staubsaugerroboter
« Antwort #11 am: 14 September 2020, 10:01:08 »
Hmm, unterstellt, der Code aus https://github.com/ThorstenPferdekaemper/FHEM-Roomba980/blob/master/FHEM/42_Roomba980.pm#L309 paßt noch, müßte der Command-Topic eigentlich nur "cmd" (also ganz ohne things oä, einfach nur diese drei Buchstaben) sein, oder lese ich "apiCall()" ggf. falsch?

Allerdings ist mir dann nicht klar, welche Messages ggf. dann JSON-encoded sein müssen, aber das ergibt sich (jedenfalls für eine ggf. ältere Version) auch aus diesem apiCall(), oder? (Das ist aber etwas für mich schwierig zu raten, ich habe keinen wirlliche Idee, was die ganzen Kommandos sollen...)
Gibt's denn nirgends eine Beschreibung der MQTT-API?

(Oder gibt es ggf. eine Option für "Homeassistant"? Das wäre ggf. hilfreich, weil da dann u.a. auch drinstehen sollte, was das Ding an Befehlen unter welchem Topic entgegennimmt).
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}
Informativ Informativ x 1 Liste anzeigen

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8179
Antw:Roomba Staubsaugerroboter
« Antwort #12 am: 14 September 2020, 12:28:58 »
Bisher alles (auch "cmd") ohne erfolg ausprobiert.

LG

pah

Offline carlos

  • Developer
  • Full Member
  • ****
  • Beiträge: 425
Antw:Roomba Staubsaugerroboter
« Antwort #13 am: 14 September 2020, 12:37:15 »
Hallo,
Wollte mal das mit folgendem MQTT2 Client nachstellen:
defmod myRoombaClient MQTT2_CLIENT 192.168.178.62:1883
attr myRoombaClient SSL 1
attr myRoombaClient autocreate simple
attr myRoombaClient clientId 123456789
attr myRoombaClient mqttVersion 3.1.1
attr myRoombaClient room Roomba
attr myRoombaClient sslargs SSL_version:SSLv23
attr myRoombaClient username 123456789
attr myRoombaClient verbose 5

setstate myRoombaClient disconnected
setstate myRoombaClient 2020-09-14 12:30:48 state disconnected

Allerdings ist der immer disconnected.
username und clientId ist auf die BLID gesetzt.
password ist natürlich auch gesetzt.

im log sehe ich nur:
2020.09.14 12:34:10 5: HttpUtils url=https://192.168.178.62:1883/
2020.09.14 12:34:10 4: IP: 192.168.178.62 -> 192.168.178.62
2020.09.14 12:34:10 4: HttpUtils: 192.168.178.62: Verbindungsaufbau abgelehnt (111)
Was fehlt hier noch?

Gruß Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 19680
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Roomba Staubsaugerroboter
« Antwort #14 am: 14 September 2020, 12:50:19 »
Hallo Carlos,

ich hätte anstatt 1883 - 8883 vermutet?

Gruß Otto
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266