Entwicklungshilfe erbeten bei Übersetzung von Python Funktionen nach Perl

Begonnen von DeeSPe, 03 Mai 2019, 09:19:54

Vorheriges Thema - Nächstes Thema

DeeSPe

Hallo,

erst einmal vorweg, ich bin kein gelernter Programmierer, sondern habe mir alles bisher benötigte selbst erlernt.

Mittlerweile habe ich mich ganz gut in die Perl-Modulprogrammierung für FHEM eingearbeitet und schon einige Module geschrieben.
Nun möchte ich möglicherweise ein neues Modul schreiben, benötige dafür aber etwas Unterstützung.

Kurz: ich habe in diesem Jahr ein Gartenbewässerungssystem mit "Rain Bird" Komponenten installiert und möchte dieses nun möglichst in FHEM haben.
Bisher gibt es kein FHEM Modul dafür.
Es gibt allerdings ein Python Skript dafür, aber leider habe ich von Python keinerlei Ahnung und möchte es auch nicht unbedingt noch zusätzlich lernen müssen.
Das Skript ist zu finden unter https://github.com/jbarrancos/pyrainbird .
Ganz konkret geht es mir dabei um den Teil "class RainbirdEncryption:" und dessen Funktionen.

Ich habe bereits ein paar API-Requests der Smartphone App mitgesnifft.
Der Header lässt sich damit auch auslesen, allerdings ist der Body wohl verschlüsselt und dieses müsste sich mit "def decrypt" des genannten Skipts entschlüsseln lassen.
Ich verstehe nur absolut nicht was dort in dieser Funktion passiert und habe dementsprechend auch keine Ahnung wie ich das nach Perl übersetzen kann.

Gibt es jemand der/die mir helfen kann die Funktionen "def decrypt" und "def encrypt" zu verstehen und nach Perl zu übersetzen?

Vielen Dank im Voraus.

Gruß
Dan

P.S. Wie kommt man eigentlich überhaupt auf die entsprechende Ver- und Entschlüsselungsmethoden wenn es keine API Dokumentation gibt?
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Wzut

Ich hatte bei meinem 38_BEOK.pm ein ähnliches Problem , Quellcode in Python , AES Verschlüsselung und Null Ahnung von Python.
Läuft das Python Teil bei dir, so das man vorher / nachher in eine Datei schreiben kann und das dann mit der Umsetzung in Perl vergleichen kann ?
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

DeeSPe

Moin Wzut,

danke für Deine Antwort!
Ehrlich gesagt habe ich das Python Skript bisher nicht gestartet/laufen lassen.
Wollte mich, wie gesagt, nicht groß mit Python beschäftigen müssen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Wzut

Kann ich verstehen, allerdings war das loggen der Zwischenwerte und vergleichen mit meinen Werten aus Perl für mich der einzige Weg.
Und solange jetzt hier niemand auftaucht der das Kaninchen aus dem Hut zieht und dir sagt so geht das von Python nach Perl befürchte ist wirst du dich doch etwas mit dem Ding beschäftigen müssen. Ich würde dir ja gern helfen und das Ding mal anwerfen, aber ohne echtes RainBird GW als Ziel ? 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

DeeSPe

Habe mir das Skript jetzt mal heruntergeladen.
Als Python Ungelehrter weiß ich leider noch nicht einmal was ich jetzt mit den heruntergeladenen Dateien mache.
Müssen die irgendwo hin kopiert werden? Wie starte ich das Ganze dann?
Ich habe die "Befürchtung" dass ich um einen Python-Grundkurs nicht herumkomme! Schade das wollte ich eigentlich vermeiden.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Wernieman

Naja .. starten wie in der Readme (fast) beschrieben:
python Das_Tolle_Script

In dem Script wird eine JSON zuammengebaut und per Passwort "verschlüsselt", das senden passiert in der Routine send_rainbird_command
Zitatsenddata = self.rainbirdEncryption.encrypt(rbdata ,self.rainbirdPassword)
Das wird dann Direkt auf Dein "Gerät" gesendet
Zitath = http.client.HTTPConnection(self.rainbirdServer,80,timeout=20)
                    h.request("POST","/stick",senddata,head)
                    resp = h.getresponse()
Scheinbar ist das Ergebnis reines JSON, d.h. ohne weitere Ver/Entschlüsselung zu bearbeiten.

Nur wie mein Vorredner, habe so ein gerät nicht und obiges ist reine trockene Analyse des Codes. Das größte Problem ist die Perl Routine zu finden, die Pyhton encrypt entspricht ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

KölnSolar

ZitatDas größte Problem ist die Perl Routine zu finden, die Pyhton encrypt entspricht ....
Könnte das evtl. Crypt::Rijndael sein ?  :-\ Das hatte zumindest Raymund damals für die Übersetzung eines Samsung-Python-Skripts nach Perl benutzt.
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

DeeSPe

Zitat von: Wernieman am 06 Mai 2019, 15:15:03
Naja .. starten wie in der Readme (fast) beschrieben:
python Das_Tolle_Script

In dem Script wird eine JSON zuammengebaut und per Passwort "verschlüsselt", das senden passiert in der Routine send_rainbird_commandDas wird dann Direkt auf Dein "Gerät" gesendetScheinbar ist das Ergebnis reines JSON, d.h. ohne weitere Ver/Entschlüsselung zu bearbeiten.

Nur wie mein Vorredner, habe so ein gerät nicht und obiges ist reine trockene Analyse des Codes. Das größte Problem ist die Perl Routine zu finden, die Pyhton encrypt entspricht ....

Hallo Wernieman,

soweit hatte ich das auch schon verstanden dass dort JSON (mit Header) aufgebaut und gesendet bzw. empfangen wird.
Sofern ich heraus bekomme wie ich dieses encrypt/decrypt hin bekomme sollte der Rest eigentlich kein großes Problem mehr sein.

Werde heute Abend mal in Ruhe testen ob ich das Python Skript zum Laufen bekomme.

Zitat von: KölnSolar am 06 Mai 2019, 15:34:53
Könnte das evtl. Crypt::Rijndael sein ?  :-\ Das hatte zumindest Raymund damals für die Übersetzung eines Samsung-Python-Skripts nach Perl benutzt.

Hab leider keine Ahnung, kenne mich mit Verschlüsselung nicht aus.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

dkreutz

Zitat von: KölnSolar am 06 Mai 2019, 15:34:53
Könnte das evtl. Crypt::Rijndael sein ?  :-\ Das hatte zumindest Raymund damals für die Übersetzung eines Samsung-Python-Skripts nach Perl benutzt.

Ja, pyrainbird verwendet Crypto.Cypher.AES und Crypt::Rijndael ist die Perl-Implementierung von AES.
Die Verschlüsselungsmethode ist AES-Mode CBC, Blocksize 16 (Standard), Schlüssellänge 128Bit.
Raspberry Pi3B+ (Bullseye) / JeeLink868v3c (LaCrosse), nanoCUL433 (a-culfw V1.24.02), HM-MOD-UART (1.4.1), TEK603, MapleCUL / diverse Sensoren/Sender/Aktoren von Technoline, Intertechno, Shelly, Homematic und MAX!, Froggit Wetterstation, Luftdaten.info / Autor des fhem-skill für Mycroft.ai

DeeSPe

Zitat von: dkreutz am 06 Mai 2019, 19:13:05
Ja, pyrainbird verwendet Crypto.Cypher.AES und Crypt::Rijndael ist die Perl-Implementierung von AES.
Die Verschlüsselungsmethode ist AES-Mode CBC, Blocksize 16 (Standard), Schlüssellänge 128Bit.

Danke für die Info, das schaue ich mir mal an.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

KölnSolar

Dann kannst Du ins 70_SamsungAV gucken, wie es in Perl genutzt wird.
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

mumpitzstuff

https://repl.it/repls/TrickyImpracticalObjectmodel

iv (init vector) must du noch durch irgend etwas konstantes ersetzen, da sonst jedes encrypt andere ergebnisse liefert.

Wzut

Zitat von: KölnSolar am 06 Mai 2019, 23:09:18
Dann kannst Du ins 70_SamsungAV gucken, wie es in Perl genutzt wird.
oder wie bereits oben geschrieben in 38_BEOK oder in 38_Broadlink wo ich damals abgeschrieben habe :)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

DeeSPe

Vielen Dank erst mal für Eure Hilfe.
Mal sehen ob ich aus den neuen Informationen etwas passendes zusammengebastelt bekomme.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

FosCo

Hi, bist du mit dem Rainbird Steuergerät weitergekommen? Ist das ein rszxe?