Ankündigung

Einklappen

Hinweis

Die Forenregeln wurden überarbeitet (Stand 7.11.22). Sie sind ab sofort verbindlich. Wir bitten um Beachtung.
Mehr anzeigen
Weniger anzeigen

ByteCode Logikbaustein (opt. Lizenzprüfung)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    HS/FS ByteCode Logikbaustein (opt. Lizenzprüfung)

    So, bastel da jetzt schon ein bißchen dran rum, aber macht ja bekanntlich mehr Spaß, wenn mehr mitspielen

    Benötigt wird, um den ByteCode zu erstellen, ein Python gleicher Version wie der HS, also Python 2.2.3

    Gedacht ist das ganze
    A) um mehrzeiligen Pythoncode zu verwenden und
    B) um Logiken zu schützen und sie evtl. an privat kostenlos zu verteilen, die man sonst gar nicht teilen würde


    Bitte nicht den Code aus den Textblöcken nehmen, da fehlen die TABS die bei Python sehr wichtig sind,
    im Anhang sind alle benötigten Dateien

    Dieser Teil ist zum Erstellen der 5012er Logikzeile nötig
    ohne Lizenz / oder eigene Lizenzprüfung
    [HIGHLIGHT=python]
    import base64
    import marshal
    import re
    import md5
    code = """
    ## Eigener CODE ##

    ## Geht alle Ausgänge durch und guckt ob AC[x] gesetzt werden muss
    for i in range(1,len(AN)+1):
    if AN[i]!=AA[i]:
    AC[i]=1
    """
    print code
    data=compile(code,"<string>","exec")
    data=marshal.dumps(data)
    #print data
    formel = "5012|0|\"(EA!=EN) or EI\"|\"eval(__import__('marshal').loads(__import__ ('base64').decodestring('"+re.sub("\n","",base64.e ncodestring(data))+"')))\"|\"\"|0|0|0|0"
    open('HSLogik.out.hsl','w').write(formel+"\n")
    [/HIGHLIGHT]
    mit MAC basierter Lizenz
    [HIGHLIGHT=python]
    import base64
    import marshal
    import re
    import md5
    ## Mac zum lizensieren
    cmac="00:01:02:11:22:33"
    ## Pro Logik Lizenz
    LicSecret="TEST LICENSE"
    LicModifier=2122

    LSec=md5.new(LicSecret).hexdigest()
    code = """
    LSec='"""+LSec+"""'
    cmac=__import__('os').popen("/sbin/ifconfig").read().split('HWaddr ')[1].split(' \\n')[0]
    mac=__import__('md5').new(cmac).hexdigest()
    LicKey = ""
    ## Lizenzcode
    for i in range(0,16,2):
    LicKey = LicKey + "%X" % (int(mac[i:i+2],16) ^ (int(LSec[i:i+2],16) +"""+str(LicModifier)+"""))
    if EN[1]==LicKey:
    AN[1]="licensed"
    ## Eigener Code ##

    else:
    AN[1]="unlicensed: "+cmac

    ## Geht alle Ausgänge durch und guckt ob AC[x] gesetzt werden muss
    for i in range(1,len(AN)+1):
    if AN[i]!=AA[i]:
    AC[i]=1
    """
    print code
    data=compile(code,"<string>","exec")
    data=marshal.dumps(data)
    #print data
    formel = "5012|0|\"(EA!=EN) or EI\"|\"eval(__import__('marshal').loads(__import__ ('base64').decodestring('"+re.sub("\n","",base64.e ncodestring(data))+"')))\"|\"\"|0|0|0|0"
    mac=md5.new(cmac).hexdigest()
    LicKey=""
    for i in range(0,16,2):
    LicKey = LicKey + "%X" % (int(mac[i:i+2],16) ^ (int(LSec[i:i+2],16) +LicModifier))
    print "Lizenzkey for "+cmac+" : "+LicKey
    open('HSLogik.out.hsl','w').write(formel+"\n")
    [/HIGHLIGHT]
    obige Datei modifizieren und den Code unterhalb von ## Eigener Code ## einfügen. Tabs beachten, die vorher in der hsl in gewohnter Form definierten Ein- und Ausgänge können direkt benutzt werden.
    Das heißt, AN[2]=4 sendet eine 4 auf den Ausgang 2....


    cmd im Verzeichniss c:\python22 (unter win) öffnen
    python.exe makeLogic.py ausführen

    hier wird die Formelzeile aus der damit erstellten HSLogik.out.hsl eingetragen
    [HIGHLIGHT=python]
    ## Lizenzkopf nach Bedarf

    ### Logikkopf nach Bedarf anpassen
    ## E1 und A1 sind für Lizenzfreigabe belegt.
    5000|"xxAPI\Lizensierter Code"|0|1|"E1 Lizenzkey"|2|"A1 Lizenzstatus"|"A2 Irgendwas"
    5001|1|2|0|0|1
    # EN[x]
    5002|1|""|1
    # Ausgänge
    5004|1|""|0|1|1
    5004|2|""|0|1|1
    #################################################
    ### Diese Zeile mit der aus der HSLogik.out.hsl ersetzen (EA!=EN heißt Änderung auf einem beliebigen Baustein)
    5012|0|"(EA!=EN) or EI"|"eval(__import__('marshal').loads(__import__(' base64').decodestring('YwAAAAAJAAAAc1wBAAB/AAB/AgBkAABaAAB/AwBlAQBkAQCDAQBpAgBkAgCDAQBpAwCDAABpBABkAwCDAQBkBA AZaQQAZAUAgwEAZAYAGVoFAH8EAGUBAGQHAIMBAGkGAGUFAIMB AGkHAIMAAFoIAH8FAGQIAFoJAH8GAHheAGUKAGQGAGQJAGQKAI MDAER/BgBdRwBaCwB/BwBlCQBkCwBlDABlCABlCwBlCwBkCgAXIWQJAIMCAGUMAGUAAG ULAGULAGQKABchZAkAgwIAZAwAF0EWF1oJAHGBAFd/CABlDQBkBAAZZQkAagIAbxEAAX8JAGQNAGUOAGQEADxuEgABfw 0AZA4AZQUAF2UOAGQEADx/EAB4TQBlCgBkBABlDwBlDgCDAQBkBAAXgwIARH8QAF0vAFoLAH 8RAGUOAGULABllEABlCwAZagMAbxEAAX8SAGQEAGURAGULADxu AQABcSIBV2QPAFMoEAAAAHMgAAAANDYzMTFhYWU3NjhjZjgzZD c5MzUxZDc4NzAxYTY2NzBzAgAAAG9zcw4AAAAvc2Jpbi9pZmNv bmZpZ3MHAAAASFdhZGRyIGkBAAAAcwMAAAAgIAppAAAAAHMDAA AAbWQ1cwAAAABpEAAAAGkCAAAAcwIAAAAlWGk0CgAAcwgAAABs aWNlbnNlZHMMAAAAdW5saWNlbnNlZDogTigSAAAAcwQAAABMU2 VjcwoAAABfX2ltcG9ydF9fcwUAAABwb3BlbnMEAAAAcmVhZHMF AAAAc3BsaXRzBAAAAGNtYWNzAwAAAG5ld3MJAAAAaGV4ZGlnZX N0cwMAAABtYWNzBgAAAExpY0tleXMFAAAAcmFuZ2VzAQAAAGlz AwAAAGludHMCAAAARU5zAgAAAEFOcwMAAABsZW5zAgAAAEFBcw IAAABBQygFAAAAcwQAAABjbWFjcwQAAABMU2VjcwEAAABpcwMA AABtYWNzBgAAAExpY0tleSgAAAAAKAAAAABzCAAAADxzdHJpbm c+cwEAAAA/AgBzGgAAAAwBOAEeAQkBFgAJAUUBFAERBBEDHQAJARgB')))"| ""|0|0|0|0
    [/HIGHLIGHT]

    EDIT: Anhänge aktualisiert, war ein Fehler und beide Scripts(Mit und ohne Lizenz) jetzt im Anhang
    Angehängte Dateien
    44
    ja, warum erst jetzt
    52,27%
    23
    ja, vielleicht
    15,91%
    7
    Nein
    13,64%
    6
    ich mag kein Closed Source
    31,82%
    14
    Nils

    aktuelle Bausteine:
    BusAufsicht - ServiceCheck - Pushover - HS-Insight

    #2
    Das binär compilieren hat nicht nur Gründe des Closed Source
    wo ich gerade sehen das der ein oder andere das gleich klickt.

    Ich hab schon diverse Ideen die einfach nicht uncompiliert laufen.
    z.B.
    Fehler mit try: except abfangen
    for/while Schleifen
    python functionen die nicht eine Variable zurückgeben sondern z.B.
    wert1, wert2, wert 3 = blubbb(EN[1])

    .....
    ...
    Nils

    aktuelle Bausteine:
    BusAufsicht - ServiceCheck - Pushover - HS-Insight

    Kommentar


      #3
      Schönes Weihnachtsgeschenk !!!!!!

      Danke Nils!

      Das ist ja ein schönes (Vor-) Weihnachstgeschenk - da haben wir über die Tage ne Menge zum Testen und Basteln


      Ich bin mal gespannt, was noch alles daraus so entsteht............
      Gruß Christian

      Kommentar


        #4
        Oh, da habe ich schon einiges halbfertiges auf der Platte, was bisher wegen der Einzeilenbeschränkung nicht ging und ich auch über diverse Umwege nicht hinbekommen habe.
        Good Job Nils!
        Gruss aus Radevormwald
        Michel

        Kommentar


          #5
          Das Abstimmungsergebnis bisher ist schon "witzig":

          Offenbar fällt es nicht leicht, die Tragweite von NilsS' Erfindung zu erkennen. Ich habe bereits Logikbausteine vorliegen, die den HS in einer Dimension funktional erweitern, von der man bisher nur geträumt hat.

          Insofern hat Christian recht mit dem Weihnachtsgeschenk, ich würde sogar sagen, Weihnachten und Ostern zusammen!
          Gruß Matthias
          EIB übersetzt meine Frau mit "Ehepaar Ist Beschäftigt"
          Meine Homepage - PN nur für PERSÖNLICHES!

          Kommentar


            #6
            Vielleicht wäre in bischen mehr "Input" hilfreich:

            Wenn man sich die Anwendungen besser vorstellen könnte....

            Wie wäre ein konkreter ANwendungsfall zum testen?
            EPIX
            ...und möge der Saft mit euch sein...
            Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

            Kommentar


              #7
              Zum Zeigen habe ich jetzt noch nichts; ich arbeite daran

              Aber jetzt stehen viele Möglichkeiten zur Verfügung, die zuvor unmöglich waren.
              Mein z.Zt. persönlicher Favorit: in Logikbausteine bereits integrierte Webabfragen

              Denk mal weiter....
              Gruss aus Radevormwald
              Michel

              Kommentar


                #8
                Logik Generator Template

                So ich hab mal ein neues Template zum erstellen eigener Logiken gebaut.
                Im oberern Teil können Name,Logik-ID... konfiguriert werden.

                Es wird die xxxxx_Logikname.hsl mit der passenden logxxxx.html automatisch generiert und auch die md5 summen der dazugehörigen Datein werden in die xxxxx_Logikname.md5 Datei geschrieben.

                Wünsche,Kritik,Verbesserungen erbeten !
                Nils

                aktuelle Bausteine:
                BusAufsicht - ServiceCheck - Pushover - HS-Insight

                Kommentar


                  #9
                  Super Sache !!!

                  Hallo Nils!

                  Damit kommst du jetzt an, wo doch mein Rolladenbaustein relativ "fertig" ist...

                  Jetzt muss ich ja die Ferien opfern, um den Baustein zu "migrieren" und die restlichen Funktionen, die mir vorschweben, aber nicht mit der HS-Baustein-Logik zu erschlagen waren, zu "coden"...

                  Das Paket klingt auf den ersten Blick (ohne es getestet zu haben) schon seeeeehr vielversprechend...

                  Ich habe aber noch ein paar Fragen:
                  Die Auswertung "EA!=EN" bedeutet also, dass bei Änderung eines beliebigen Eingangs was getan wird, oder? Hier kann ich aber auch (wie gewohnt) die Indizes setzen "EA[2]!=EN[2]", oder?
                  Dieses wiederum heißt doch auch, dass ich mehrere compilierte Codes in einen Baustein einbinden kann (um ggf. unterschiedliche Timer zu starten ;-) ). Oder kann man auch Timer innerhalb des compilierten Codes starten und "verwalten"?

                  Den Timer in deinem "Logikbaustein-Generator" würde ich dann dafür nutzen, um den Baustein zyklisch aufzurufen, oder?

                  Gibt es eigentlich eine Längenbeschränkung für den compilierten Code?

                  So, für den Anfang waren das glaube ich genug Fragen.
                  Aber keine Angst, wenn ich erstmal anfange, damit zu arbeiten, kommen bestimmt noch mehr ;-)
                  Gruß, Marc

                  Kommentar


                    #10
                    [QUOTE=MarcNaroska;74481]Die Auswertung "EA!=EN" bedeutet also, dass bei Änderung eines beliebigen Eingangs was getan wird, oder?
                    Ja

                    Zitat von MarcNaroska Beitrag anzeigen
                    Hier kann ich aber auch (wie gewohnt) die Indizes setzen "EA[2]!=EN[2]", oder?
                    Ja, aber auch EC[2] wie gewohnt
                    du kannst aber auch dann im code
                    if EC[2]:
                    machen und die dadurf aufgerufenen Zeilen mit einem Tab einrücken (siehe python doku if/for/while ...)

                    Zitat von MarcNaroska Beitrag anzeigen
                    Dieses wiederum heißt doch auch, dass ich mehrere compilierte Codes in einen Baustein einbinden kann (um ggf. unterschiedliche Timer zu starten ;-) ). Oder kann man auch Timer innerhalb des compilierten Codes starten und "verwalten"?
                    Ja mehrere Codezeilen gehen auch
                    Hab ich noch nicht getestet daher mein umweg, aber eigentlich müsste es gehen. versuch mal ON[x] auf einen Floatwert in Sekunden zu setzen

                    Zitat von MarcNaroska Beitrag anzeigen
                    Den Timer in deinem "Logikbaustein-Generator" würde ich dann dafür nutzen, um den Baustein zyklisch aufzurufen, oder?
                    Ich würd die eine Formelzeile per Timer immer wieder aufrufen.
                    also OC[1] or EI und dann in die Zeitformel 1 (oder weniger)

                    du kannst ja eine variable dann mit einem timestamp erstellen und damit vergleichen

                    Zitat von MarcNaroska Beitrag anzeigen
                    Gibt es eigentlich eine Längenbeschränkung für den compilierten Code?
                    k.A.

                    Damit ihr noch ein bisschen mehr Spaß damit habt, hab ich mal ein Debug eingebaut

                    aufruf:
                    python.exe LogikGeneratorMeineLogik.py --debug --en1=12 --en2="TEST"

                    dürft euch selber denken was das macht
                    Angehängte Dateien
                    Nils

                    aktuelle Bausteine:
                    BusAufsicht - ServiceCheck - Pushover - HS-Insight

                    Kommentar


                      #11
                      [WARNUNG]Die Nutzung dieser Möglichkeit kann bei unsachgemäßer Anwendung euren HS/FS komplett lahmlegen!

                      Ich rate dringend davon ab, das auf produktiven HS/FS einzusetzen und/oder zeitkritische bzw. umfangreiche Aktionen in den Code zu packen!

                      Die Behandlung dieses Codes weicht vom HS-internen Standard erheblich ab!
                      [/WARNUNG]
                      Gruss aus Radevormwald
                      Michel

                      Kommentar


                        #12
                        Tja, damit ist mein Weihnachtsurlaub ja "gerettet"...

                        Hoffentlich "klaut" sich GIRA ja ein wenig von deinem Logik-Generator (besonders vom letzten "Streich").
                        Gruß, Marc

                        Kommentar


                          #13
                          Ja Michel ich geb dir Recht das man das nicht unsachgemäß verwenden sollte, dies hat sich aber gegenüber der "normalen" Bausteine keineswegs geändert.

                          Wir kennen alle die loops die schon mehrere HS lahmgelegt haben

                          Also kurze Erklärung wie der HS die Logik IMHO abarbeitet.

                          Code:
                           
                          MAIN LOGIK LOPP
                              LOGIKBAUSTEIN1
                                    5012erZeile "EN[1]==2 or EI...."|"__import__('irgendwas').function..
                                         das EN[1]==2.... wird zu mit compile(...) zu einem codeobject wir nennen es mal wenn ;
                                             if eval(wenn):
                                                 der code __import__ irgendwas wir auch zu einem codeobjet (mach)
                                                  eval(mach)
                              LOGIKBAUSTEIN2
                                    5012erZeile "EN[1]==2 or EI...."|"__import__('irgendwas').function..
                          .........
                          ........
                              LOGIKBAUSTEIN3
                                    5012erZeile "EN[1]==2 or EI...."|"__import__('irgendwas').function..
                          ......
                          ......
                          Das was ich jetzt mit dem eval mit compiliertem oder auch nicht compiliertem code (was bei Ausführungszeit ehh egal ist da dann alles ein codeobject ist (bytecode)

                          Die jetzt möglichen Schleifen können also dazu führen das die nachfolgenden Formelzeilen, als auch nachfolgenden Logikbausteine nicht abgearbeitet werden.

                          Das kann ich aber auch so ohne eval/exec mit z.B.

                          ACHTUNG NICHT NACHMACHEN
                          Code:
                           
                          5012|0|"OC[1] or EI"|"__import__('time').sleep(10)"|"1"|0|1|0|0

                          Die Gefahr ist aus meiner Sicht immer die gleiche, jedoch ergibt sich daraus
                          das nicht jede Formelzeile erneut mit einem if überprüft werden muss sogar noch eine Beschleunigung der Abarbeitung.

                          Ich werd die nächsten Tage vielleicht mal ein Benchmarkbaustein bauen.

                          ist doch klar das ein

                          Code:
                          if EN[1]=1:
                             mach was
                          if EN[1]=1:
                             mach was anderes
                          if EN[1]=1:
                             mach noch was anderes
                          länger braucht als
                          Code:
                          if EN[1]=1:
                             mach was
                             mach was anderes
                             mach noch was anderes
                          das Ergebnis ist jedoch das selbe.

                          Wenn jemand darüber diskutieren möchte, bitte.... gerne auch per PN
                          Nils

                          aktuelle Bausteine:
                          BusAufsicht - ServiceCheck - Pushover - HS-Insight

                          Kommentar


                            #14
                            Hey Nils!

                            Ich denke, dass der Unterschied folgender ist:
                            während bei der Struktur
                            if ...
                            mach
                            if ...
                            mach 2
                            if ...
                            mach 3
                            ...

                            zwischen jedem if auch noch andere Dinge abgearbeitet werden
                            wie Telegrammversand, Abarbeitung anderer Bausteine, etc., wird bei

                            if ...
                            mach
                            mach 2
                            mach 3

                            zwischendurch nichts anderes gemacht...

                            Das ist aber i.O., solange man dass bei der Programmierung im Hinterkopf behält. Unbenommen davon ist jedoch, dass durch deine Arbeit in Zukunft deutlich mehr Möglichkeiten der Bausteinprogrammierung zur Verfügung stehen...
                            Gruß, Marc

                            Kommentar


                              #15
                              In Visual Basic gibt es den schönen Befehl "doevents".

                              Ich denke, der hs_main macht solche doevents (also quasisimultanes Abarbeiten mehrerer Tasks), kommt aber nicht mehr dazwischen, wenn das alles in einer Zeile steht.
                              Gruß Matthias
                              EIB übersetzt meine Frau mit "Ehepaar Ist Beschäftigt"
                              Meine Homepage - PN nur für PERSÖNLICHES!

                              Kommentar

                              Lädt...
                              X