Seite 1 von 1

ROS iot_bridge für openHAB 3

Verfasst: 19. Apr 2022 12:44
von Michdo93
Guten Morgen zusammen,

für das Robot Operating System (ROS) gab es dank dem GitHub-User corb555 eine iot_bridge zu openHAB 2. Diese lief für ROS Kinetic (Ubuntu 16.04) und ROS Lunar (Ubuntu 14.04). Ich habe mich dran gemacht, diese anzupassen. Dies beinhaltet gleich eine Anpassung zu openHAB 3 für ROS Kinetic (Ubuntu 16.04) und ROS Noetic (Ubuntu 20.04). Es sollte vermutlich auch ROS Melodic (Ubuntu 18.04) funktionieren, da dass Programm in Python 2 bzw. Python 3 läuft. ROS Kinetic nutzt noch Python 2 und ROS Noetic Python 3. Bei ROS Melodic könnte man sowohl Python 2 als auch Python 3 nutzen. Kommt auf die jeweilige Installation und Konfiguration an. ROS-Pakete in Python müssen Gott sei Dank nicht kompiliert werden. Wäre das Programm in C++ geschrieben, wäre es undenkbar, dass ich sagen würde, dass das Paket auch in ROS Melodic laufen würde, ohne es getestet zu haben.

Hier ein Link zu meinem kinetic-devel Branch: https://github.com/Michdo93/iot_bridge
Hier ein Link zu meinem noetic-devel Branch: https://github.com/Michdo93/iot_bridge/ ... etic-devel

Änderungen im Vergleich zum Original-Repository von corb555 (https://github.com/corb555/iot_bridge):

Aus

Code: Alles auswählen

        self.iot_host = rospy.get_param(BASENAME + '/host', "localhost")
        self.iot_port = rospy.get_param(BASENAME + '/port', 8080)
        self.username = rospy.get_param(BASENAME + '/username', "openhab")
        self.password = rospy.get_param(BASENAME + '/password', "")
        self.poll_rate = rospy.get_param(BASENAME + '/pollrate', 2)
habe ich folgendes gemacht:

Code: Alles auswählen

        self.iot_host = rospy.get_param(BASENAME + '/host')
        self.iot_port = rospy.get_param(BASENAME + '/port')
        self.username = rospy.get_param(BASENAME + '/username')
        self.password = rospy.get_param(BASENAME + '/password')
        self.poll_rate = rospy.get_param(BASENAME + '/pollrate', 2)
So müssen Benutzername und Passwort aus iot_bridge/config/items.yaml ebenso bezogen werden.

Um auf openHAB 3 zuzugreifen musste der Header von

Code: Alles auswählen

        """ Header for OpenHAB REST request """
        return {
            "Authorization": "Basic %s" % self.cmd.auth,
            # "X-Atmosphere-Transport": "streaming",
            # "X-Atmosphere-tracking-id": self.iot_rest_id,
            "X-Atmosphere-Framework": "1.0",
            "Accept": "application/json"}
angepasst werden zu

Code: Alles auswählen

return {"Accept": "application/json"}
Der Unterschied zwischen Python 2 und Python 3 (also zwischen den Branches kinetic-devel und noetic-devel ist folgendes):

Code: Alles auswählen

        self.auth = None
        if self.params.username is not None or len(self.params.username) != 1:
            if self.params.password is not None or len(self.params.password) != 1:
                self.auth = base64.encodestring(
                    '%s:%s' % (self.params.username, self.params.password)
                    ).replace('\n', '')
            else:
                self.auth = base64.encodestring(
                '%s:%s' % (self.params.username, "")
                    ).replace('\n', '')
        else:
            self.auth = None

Code: Alles auswählen

        self.auth = None
        if self.params.username is not None or len(self.params.username) != 1:
            if self.params.password is not None or len(self.params.password) != 1:
                self.auth = base64.encodestring((
                    '%s:%s' % (self.params.username, self.params.password)
                    ).replace('\n', '').encode()).decode().strip()
            else:
                self.auth = base64.encodestring((
                '%s:%s' % (self.params.username, "")
                    ).replace('\n', '').enconde()).decode().strip()
        else:
            self.auth = None
Außerdem natürlich in der ersten Zeile

Code: Alles auswählen

#!/usr/bin/python3
anstelle von

Code: Alles auswählen

#!/usr/bin/python
Damit ROS Noetic dass auch bauen kann wurde in der CMakeLists.txt folgendes verändert:

ROS Kinetic:

Code: Alles auswählen

cmake_minimum_required(VERSION 2.8.3)
ROS Noetic:

Code: Alles auswählen

cmake_minimum_required(VERSION 3.0.2)
Ich weiß nicht auswendig, welches Minimum für ROS Melodic benötigt wird. Dies wäre dort die einzige Änderung.

Verwendung

Ich setze mal voraus, dass openHAB 3 und eine der drei ROS Distributionen installiert ist.

Code: Alles auswählen

cd catkin_ws/src
git clone --branch <noetic-|kinetic->devel https://github.com/Michdo93/iot_bridge.git
cd ..
catkin_make
Bitte für noetic-devel oder kinetic-devel entsprechend entscheiden.

Als nächstes die iot_bridge/config/items.yaml anpassen, was Hostname, Port, Benutzername und Passwort von openHAB anbelangt.

Im letzten Schritt eine item-Datei erstellen oder eine bestehende Datei bearbeiten. Es muss einmal die ROS-Gruppe erstellt werden und jedes Item, dass über ROS seine Informationen publishen soll, muss dieser Gruppe zugeordnet werden.

Zum Beispiel /etc/openhab/ros.items:

Code: Alles auswählen

Group ROS (All)
String ROS_Status "ROS [%s]"
Switch Light_GF_Corridor_Ceiling  "Ceiling"  (GF_Corridor, Lights, ROS)
Switch Light_GF_Bathroom (GF_Bathroom, Lights, ROS)
Starten könnt ihr das Programm mit: roslaunch iot_bridge iot.launch

Weitere Informationen könnt ihr aus dem ROS Wiki der alten iot_bridge entnehmen: http://wiki.ros.org/iot_bridge