Python -> Perl und wo kann man schauen wie das geht?

Begonnen von andies, 19 März 2017, 22:39:25

Vorheriges Thema - Nächstes Thema

andies

Guten Abend, ich bin (stolzer?) Besitzer eines speedports, das ich wegen wlan-to-go nicht in die wohl bessere Fritzbox tauschen will. Speedport ist nun total nervig, wenn man die Anruflisten holen will: man muss sich zuerst einloggen, dann dreimal klicken und erst dann sieht man die Liste mit den Anrufen. Auf https://github.com/stenub/wlan_switcher/blob/master/wlan_switcher.py hat sich jemand dankenswerterweise des Problems angenommen und dazu eine Python-Datei geschrieben, die aus dem Speedport diese Daten holt. Ich würde die gern in FHEM einsetzen.

Nun dachte ich mir, dass ich diesen Python-Code erst einmal auf das Minimum reduziere. Das habe ich geschafft, der Code steht hier:
#!/usr/bin/python3
#

import requests
import hashlib
import re
import sys
import json


# Extrahiere den Wert von _httoken aus der Website
def pagerequest(url, session):
    page = session.get(url)
    regex = re.compile('_httoken = (\d*);')
    httoken = re.findall(regex, page.text)[0]
    return httoken, session


def main():
    # Starte neue http-Session:
    with requests.Session() as s:
        url_router = 'http://192.168.2.1'
        passwd_router = 'XXXXXXX'
       
        httoken, s = pagerequest(url_router, s)
        page = s.post(url_router + '/data/Login.json', data={'password': hashlib.md5(bytes(passwd_router, 'utf-8')).hexdigest(), 'showpw': '0', 'httoken': httoken})
        httoken, s = pagerequest(url_router + '/html/content/overview/index.html?lang=de', s)

        page = s.get(url_router + '/data/PhoneCalls.json', params={"_tn": httoken}, headers={'Referer': url_router + '/html/content/overview/index.html?lang=de'})
        page_decoded = json.loads(page.content.decode('utf-8'))
        for i in page_decoded:
            if (i["varid"] == "addtakencalls") or (i["varid"] == "addmissedcalls"):
                for j in i["varvalue"]:
                    if (j["varid"] == "takencalls_duration") or (j["varid"] == "missedcalls_who"):
                        print(j["varid"], j["varvalue"])
                    else:
                        print(j["varid"], j["varvalue"], end=", ")
   

if __name__ == '__main__':
    main()
 

Jetzt könnte ich natürlich Python in Perl einbinden (ich kenne Perl bisher nicht). Kann mir vielleicht jemand einen Tipp geben, wie man das in Perl umsetzen/übersetzen kann? Ich bin auch bei Python ein Anfänger und mir sagen diese Bibliotheken recht wenig, also würde ich jetzt raten/googlen müssen, bis ich das alles kapiert habe. Vielleicht hat jemand eine bessere Idee?
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

KernSani

wenn dieser code funktioniert und auf der Kommandozeile ein Ergebnis liefert, dann kannst du das python script aus FHEM aufrufen und das Ergebnis z.B. in einen dummy schreiben.
Als ersten test kannst du ja mal folgendes in die FHEM Kommandozeile tippen:

{qw("python <myPythonScript>")}

Wie man das am sinnvollsten macht und auswertet hängt ein bisschen davon ab, wie die Daten angeliefert werden und was du damit anstellen willst (Ich habe keine Fritzbox und keine Ahnung von Call-Listen etc... da gibt es sicher Leute, die das besser können)

Grüße,

Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

marsill82

Hallo,
ich habe ein Ähnliches Problem, bin glaub ich aber einfach zu doof...
Ich habe ien Python Skript was von meiner Heizung Temperaturwerte ausliest und dann den entsprechenden FHEM dummy-Devices die entsprechenden Werte zuweist.
Das funktioniert soweit auch einwandfrei wenn ich das Skript auf dem raspberry "händisch" starte.
Ich will das Skript nun aber aus fhem heraus starten, bekomme das aber leider nicht hin.
Das Skript liegt unter /opt/fhem/python/status.py
Ich habe versucht mit der obigen Methode das Skript über die Kommandozeile zu starten, jedoch ohne Erfolg:
{qw("python /opt/fhem/python/status.py")}
Was mache ich falsch?

dev0