x-sense WLAN Rauchmelder einbinden

Begonnen von spi3845, 06 Juli 2023, 12:12:05

Vorheriges Thema - Nächstes Thema

spi3845

Hallo miteinander,

kennt sich jemand mit fhempy aus? Vielleicht ist damit eine Einbindung leichter, wenn wir auf die bestehenden Python-Module zurückgreifen können...

sven-voss

Hallo,

Gibt es zu den x-sense RM bereits eine Lösung, um diese ins FHEM zu integrieren?

Hat es jemand mit dem fhempy Ansatz zum laufen bekommen?

Ich habe auch Interesse.

Gruß Sven

sven-voss

Zitat von: spi3845 am 22 Oktober 2024, 18:48:23Hallo zusammen,

ich habe auf die Schnelle das python-xsense Modul getestet. Zugriff auf x-sense funktioniert damit relativ einfach. Vielleicht lässt es sich über fhempy einbinden? Hat jemand schon Erfahrungen gesammelt mit fhempy?

Falls jemand python-xsense testen will, so hat's bei mir geklappt (ich nutze Linux) in einem Verzeichnis:

python3 -m venv xsense # virt. Umgebung für Python schaffen, damit Pakete nicht durcheinanderkommen
source xsense/bin/activate # in virt. Umgebung wechseln, Verlassen später per deactivate
cd xsense
pip install python-xsense # python-xsense Modul installieren
pip install aiohttp # notwendiges Modul installieren
pip install setuptools # notwendiges Modul installieren
git clone https://github.com/theosnel/python-xsense.git # git python-xsense Repository clonen - da sind Beispiele drin
cd python-xsense
cp .env.sample .env # hier kommen dann später Username und Passwort rein
### in der x-sense App einen neuen User anlegen, Einladung bestätigen (hatte schon einen weiteren User, weiß nicht mehr, ob Bestätigung per Link in Email oder in App notwenig ist)
vi .env # Username und Passwort eintragen
python3 setup.py --name --fullname --version # Test, ob Modul korrekt geladen wird
python3 asynctest.py # Test Zugriff auf x-sense Geräte, sollten als json aufgelistet werden
python3 test.py # ebenfalls Test Zugriff

Wenn das Python Modul nicht mehr benötigt wird, das erstellte xsense-Verzeichnis einfach löschen, dann ist das alles weg.




Hallo,
gibt es hier zu etwas neues? Oder braucht es den Umweg über eine HA Instanz?

Gruß Sven

spi3845

Zitat von: sven-voss am 05 Dezember 2024, 16:01:39Hallo,
gibt es hier zu etwas neues? Oder braucht es den Umweg über eine HA Instanz?

Gruß Sven

Ne, ich habe keine Ahnung, wie man fhempy nutzt, anderweitig python-xsense in fhem integriert oder gar ein eigenes fhem-Modul baut.

Viele Grüße,
spi

phantom

Hallo zusammen, 
ich habe gerade das python Beispiel von spi3845 getestet. Eeis klappt und gibt die gwwünschten Daten vom X-Sense Melder aus. Bei mit ist es ein CO-Melder XC04-WX .

async_xsense.py gibt so etwas aus:

----[ Hausname (**deineHouseID**) ]-----------------
CO-Melder (XC04-WX):
  serial  : ABC123
  online  : yes
  values  : {'houseId': '**deineHouseID**', 'type': 'XC04-WX', 'stationSN': 'ABC123', 'wifiRSSI': '-50', 'batInfo': 3, 'standard': '0', 'coEventId': '0', 'coPpm': 0, 'coLevel': 0, 'isLifeEnd': False, 'time': '20250301060917', 'onlineTime': '20250301060917', 'alarmStatus': False, 'muteStatus': True, 'deviceSN': 'ABC123', 'sw': 'v0.7.1', 'ssid': '**WiFiSSID**', 'ip': '**IP**', 'mac': '**MAC**', 'macBT': '**MAC**', 'ledLight': '0', 'network_sw': 'v1.1.0'}
# CO-Melder (**deviceID**)

Hat jemand dies schon nach FHEM importiert oder eine einfache Idee dazu ??
Gruß Phantom

xelawe

Hallo,

ich habe mir das Ganz auch nun mal auf einem Tes-Raspi installiert und nach erfolgreichem Test kam mir die Idee die Werte per MQTT zu publizieren.

Daher habe ich einen Fork des Repositories erstellt und um MQTT erweitert. Das ist mein erster Versuch in Python. Lässt sich vermutlich einiges besser machen. Inputs/Verbesserungsvorschläge sind gerne willkommen.

in der Anleitung
Zitat von: spi3845 am 22 Oktober 2024, 18:48:23git clone https://github.com/theosnel/python-xsense.git # git python-xsense Repository clonen - da sind Beispiele drin

muss dann dann dieses Git Repository gecloned werden:
git clone https://github.com/xelawe/python-xsense.git

in der. env müssen nun zusätzlich der host, die credentials und der Main-Topic gepflegt werden:

MQTTHOST=<mqtthost>
MQTTUSR=<mqttusr>
MQTTPWD=<mqttpwd>
MQTTTOPIC=xsense

Der Aufruf erfolgt dann mit
python3 asyncmqtttest.py

Jetzt fehlt mir nur mehr die Möglichkeit dies als Service einzubinden, damit die Daten zyklisch abgefragt werden. Da wäre ich für Tipps dankbar.
@spi3845 Kannst du da evtl. weiterhelfen?

Beste Grüße,
Alex

spi3845

Zitat von: xelawe am 02 März 2025, 14:42:09ich habe mir das Ganz auch nun mal auf einem Tes-Raspi installiert und nach erfolgreichem Test kam mir die Idee die Werte per MQTT zu publizieren.

Daher habe ich einen Fork des Repositories erstellt und um MQTT erweitert. Das ist mein erster Versuch in Python. Lässt sich vermutlich einiges besser machen. Inputs/Verbesserungsvorschläge sind gerne willkommen.

Das ist ja eine coole Idee, das per mqtt anzubinden. Wobei natürlich eine direkte Anbindung in fhem schöner wäre - dann muss man nicht noch zusätzliche Geräte anlegen und per mqtt anbinden...

Zitat von: xelawe am 02 März 2025, 14:42:09Jetzt fehlt mir nur mehr die Möglichkeit dies als Service einzubinden, damit die Daten zyklisch abgefragt werden. Da wäre ich für Tipps dankbar.
@spi3845 Kannst du da evtl. weiterhelfen?

Die einfachste Möglichkeit, unter Linux regelmäßig einen Job auszuführen ist cron. Als der User, der den Job ausführen soll, crontab -e aufrufen - bitte komplette Pfade für python und Skripte angeben, da das sonst zu Fehler führt.

Alternative ist eine systemd Unit, die entweder regelmäßig in Intervallen ausgeführt wird oder einen Dienst startet (dein python-Skript) das selbst zyklisch die Abfrage macht.

Beispiel einer systemd Unit wasserstop.service, die ein python-Sktipt aufruft, das (in diesem Beispiel zyklisch ein Hauswasser-Ventil abfragt:
[Unit]
Description=Wasserstop Service
Wants=network-online.target
#After=network.target network-online.target systemd-user-sessions.service rc-local.service
After=network.target network-online.target
StartLimitIntervalSec=0

[Service]
Type=notify
User=pi
Group=pi
RuntimeDirectory=wasserstop
RuntimeDirectoryMode=0750
ExecStart=/usr/bin/python3 /opt/wasserstop/wasserstop.py
Environment=PYTHONUNBUFFERED=1
ExecReload=/usr/bin/kill -1 -- $MAINPID
ExecStop=/usr/bin/kill -- $MAINPID
TimeoutStopSec=5
KillMode=process
WatchdogSec=15
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target


Mit journalctl -fu wasserstop.service sieht man dann auch schön das Log...


Hier noch die Main-Logik aus dem wasserstop.py-Beispiel:

class GracefulKiller:
    kill_now = False
    def __init__(self):
        signal.signal(signal.SIGINT, self.exit_gracefully)
        signal.signal(signal.SIGTERM, self.exit_gracefully)
        signal.signal(signal.SIGHUP, self.exit_gracefully)

    def exit_gracefully(self,signum, frame):
        self.kill_now = True

# program logic
if __name__ == '__main__':
    killer = GracefulKiller()
    client.loop_start()
    while not killer.kill_now:
        if err_counter > MAX_ERR_COUNTER:
            os.kill(os.getpid(), signal.SIGTERM)
        if (last_time_main + POLL_INTERVAL) < time.time():
            if MQTT_flag_connected == 1:
                last_time_main = time.time()
                betriebsdaten_lesen()
            else:
                time.sleep(5)
                client.loop_stop()
                client.disconnect()
                client.connect(MQTT_SERVER, 1883, 60)
                client.loop_start()
            systemd.daemon.notify('WATCHDOG=1')


    systemd.daemon.notify('STOPPING=1')
    print('Ende', os.path.basename(__file__))
    port.reset_input_buffer()
    port.close()
    client.loop_stop()

Bestes Gelingen,
spi