Ankündigung

Einklappen
Keine Ankündigung bisher.

Korrektur-/Zusammensetzenbaustein

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

    Korrektur-/Zusammensetzenbaustein

    Hallo,

    weiß gar nicht ob die Überschrift so passt aber mir fiel gerade nichts besseres ein.

    Also ich habe folgendes Problem. Mein Zähler gibt Wh und kWh auf den Bus aus. Problem was ich ab 10000kWh gemerkt habe ist, dass bei den Wh die zahl vorne eingekürzt wird. Also als Beispiel: 12108kWh und 2108360Wh. Das hat mir natürlich meine ganzen Daten versaut. Im Gira HS habe ich mir dafür einen Baustein geschrieben der das Ganze bereinigt hat (siehe Anhang).
    Ich würde dies gerne auch so in Edomi wieder umsetzen habe aber keine Ahnung wie. Könnte mir da jemand bei helfen?

    Grüße
    Jascha


    Code:
    ### EINGANG
    ### 5002 | Index Eingang | Defaultwert | 0=numerisch/1=alphanummerisch
    5002|1|0|0               # E1: Eingang kWh
    5002|2|0|0               # E2: Eingang Wh
    
    ### SPEICHER
    ### 5003 | Speicher-Nr. | Initwert | Remanent (0/1)
    5003|1|0|0
    5003|2|0|0
    5003|3|0|0
    5003|4|0|0
    5003|5|0|0
    
    ### AUSGANG
    ### 5004 | ausgang | Initwert| runden/binär (0/1)| Typ (1-send/2-sbc)| Typ: 0=numerisch/1=alphanummerisch
    5004|1|0|0|1|0           # A1: Ausgang Wh (korrigiert)
    
    
    ### LOGIK
    ### 5012|abbruch bei bed. (0/1)|bedingung|formel|zeit|pin-ausgang|pin-offset|pin-speicher|pin-neg.ausgang
    
    ### Speicher 1 belegen (Wh in kWh umrechnen)
    5012|0|""|"EN[2]/1000"|""|0|0|1|0
    
    ### Speicher 2 belegen (kWh + umgerechnete Wh/kWh)
    5012|0|""|"EN[1]+SN[1]"|""|0|0|2|0
    
    ### Speicher 3 belegen (umgerechnete Wh/kWh -> Nachkommazahlen entfernen)
    5012|0|"SC[1]"|"__import__('math').modf(SN[1])"|""|0|0|3|0
    5012|0|"SN[3]"|"SN[3][1]"|""|0|0|4|0
    
    ### Speicher 4 belegen (Ergebnis Speicher 2 - Speicher 4)
    5012|0|"SC[1] or SC[2]"|"SN[2]-SN[4]"|""|0|0|5|0
    
    
    # AUSGAENGE bedienen (Speicher  5 x 1000)
    5012|0|"SC[5]"|"SN[5]*1000"|""|1|0|0|0

    #2
    Vergleiche den aktuellen Stand mit 9999,99 , und schreibe das Ergebniss in eine remanente Variable. Beim nächsten Durchlauf wird der Stand dan ziemlich wahrscheinlich grösser gleich 10000 sein. Dann die Variable auf 1 setzen .Ist die Variable dann 1, dann addiere 10000 zum akutellen Stand hinzu

    Kommentar


      #3
      Hi,

      danke dir erstmal für deine Antwort. Aber so ganz schlau werd ich daraus nicht. Würde ich dann nicht bei 20000 wieder ein Problem bekommen. Die HS Logik kann man nicht irgendwie schön in eine PHP umsetzen?

      Grüße

      Kommentar


        #4
        Sicher geht das auch dynamisch mit der 2 und 3. Und ja die HS Logik kann man auch in php nachbauen,

        Code:
         
         5012|0|""|"EN[2]/1000"|""|0|0|1|0 ist dann:   
         set_logic_Var($id,1,$E[2]['value'] / 1000);  
         5012|0|""|"EN[1]+SN[1]"|""|0|0|2|0  entspricht   set_logic_Var($id,2,$E[1]['value'] + logic_getVar($id,1));    
         5012|0|"SN[3]"|"SN[3][1]"|""|0|0|4|0  set_logic_Var($id,4,round(logic_getVar($id,3),0))
        usw. Aber es gibt doch schon genügend Energiezähler für EDOMI

        Kommentar


          #5
          Danke für den Anfang. Ich versuch mich mal daran.
          Ich will ja keinen neuen Energiezähler basteln sondern einen vollständigen Zählerwert in Wh haben. Durch die Umrechnung erhalte ich das dann

          Grüße

          Kommentar


            #6
            Hi,

            ich hab mal vorsichtig dran versucht den Baustein vom HS in PHP umzusetzen. Komme allerdings jetzt nicht weiter wie und wo ich den Trigger einbauen muss damit der Baustein seine Berechnung anfängt. Im HS habe ich eine Veränderung der Speichervariable (SC) dafür genutzt. Wie setze ich das bei PHP ein?
            Fehlt sonst noch irgendetwas damit dieser funktionstüchtig ist?

            PHP-Code:
            ###[DEF]###
            [name        = Hilfsbaustein Energiezähler    ]

            [e#1        = Eingang kWh                     ]
            [e#2        = Eingang Wh                    ]


            [a#1        = Ausgabe Wh                ]
            [a#2        = Variable 1                ]
            [a#3        = Variable 2                ]
            [a#4        = Variable 3                ]
            [a#5        = Variable 4                ]
            [a#6        = Variable 5                ]

            ###[/DEF]###

            ###[HELP]###
            Dieser Baustein berechnet die fehlende/abgeschnittene Zahl bei den Wh. Hierfür wird von der Lingg und Janke Schnittstelle der kWh und der Wh Wert benötigt.
            Am Ausgang wird dann der korrigierte Wh Wert ausgebenen.

            E1      kWh Wert vom Zähler
            E2      Wh Wert vom Zähler

            A1      Korrigierter bzw. vollständiger Wert in Wh
            A2-A6     Nur zu Debugzwecken bis Baustein fertig ist.
            ###[/HELP]###


            ###[LBS]###
            <?
            function LB_LBSID($id) {
                if ($E = logic_getInputs($id)) {                                // Daten aller Eingänge holen
                    
                    setLogicElementVar($id,1,$E[2]['value'] / 1000);  // Setzen der Variable 1 (Wh / 1000)
                    setLogicLinkAusgang($id,1,2 ['value'];    // Setze Wert der Variable 1 auf Ausgang 2
                    
                    setLogicElementVar($id,2,$E[1]['value'] + getLogicElementVar($id,1));  // Setzen der Variable 2 (kWh + Variable 1)
                    setLogicLinkAusgang($id,2,3 ['value'];    // Setze Wert der Variable 2 auf Ausgang 3
                            
                    setLogicElementVar($id,3,floor(getLogicElementVar($id,1),0)) // Setzen der Variable 3 (Nur zahl vorm Komma)
                    setLogicLinkAusgang($id,3,4 ['value'];    // Setze Wert der Variable 3 auf Ausgang 4
                    
                    setLogicElementVar($id,4,getLogicElementVar($id,2) - getLogicElementVar($id,3));    // Setzen der Variable 4 (Variable 2 - Variable 4)
                    setLogicLinkAusgang($id,4,5 ['value'];    // Setze Wert der Variable 4 auf Ausgang 5
                    
                    setLogicElementVar($id,5,getLogicElementVar($id,4) * 1000);  // Setzen der Variable 5 (Variable 4 * 1000)
                    setLogicLinkAusgang($id,5,1 ['value'];    // Setze Wert der Variable 5 auf Ausgang 1
                            
                
                }    
            }
            ?>
            ###[/LBS]###

            Kommentar


              #7
              Zitat von skyacer Beitrag anzeigen
              Fehlt sonst noch irgendetwas damit dieser funktionstüchtig ist?
              Die Definition der Variablen
              PHP-Code:
              [v#1 remanent = ] 
              AlsTrigger kannst Du doch die Eingänge E1 und E2 nehmen

              PHP-Code:
              if ($E logic_getInputs($id)) {
                   if(
              $E[1]['refresh'] == || $E[2]['refresh'] == 1){
                           
              your code here
                   
              }

              Eventuell must Du auch noch schauen, ob sich an den Eingängen auch die Werte geändert haben.

              Kommentar


                #8
                In Edomi werden LBS immer getriggert wenn ein Wert an einem Eingang ankommt, d.h. in deinem Fall automatisch, wenn an E1 oder E2 etwas ankommt.
                Wenn es das ist was du willst, dann musst du dich nicht weiter drum kümmern. Wenn du z.B. nur etwas ausführen willst, wenn an E2 etwas ankommt, dann prüfst du zunächst ob E2 refreshed wurde. Wenn ich dich richtig verstehe willst du doch nur eine E1*1000+E2%1000 haben, oder? Das wäre ein Einzeiler (s.u.)

                PHP-Code:
                function LB_LBSID($id) {
                    if (
                $E logic_getInputs($id)) {
                       if (
                $E[2]['refresh']==1) {
                           
                // hier kommt der Code, der beim Triggern von E2 ausgeführt werden soll
                           
                logic_setOutput($id,1,$E[1]['value']*1000+$E[2]['value']%1000);
                    }

                Kritisch ist hier nur, dass es nur zuverlässig funktioniert, wenn E1 und E2 immer mehr oder minder gleichzeitig kommen, oder E2 kurz nach E1. Wenn dem so ist, dann sollte das obige eigentlich funktionieren. Wie oft werden denn die Daten geliefert? ggf. einen kleinen Verzögerer vor E2 machen, dann kannst du sicher sein, dass E1 schon den aktuellen Wert hat, wenn über E2 der LBS getriggert wird.

                Kommentar


                  #9
                  Hi,

                  danke erstmal für Eure Hilfestellung. Ich tue mich noch ein wenig schwer mit PHP.
                  Ja also das Lingg&Janke Gateway liefert die Werte eigentlich immer recht Zeitnah hintereinander alle 30s, d.h E1 vor E2. Hab ja den Code vom HS oben gepostet und der läuft bisher zuverlässig.

                  jonofe verstehe nicht ganz was "$E[2]['value']%1000". Was bedeutet das %?
                  Also was soll der Baustein machen.
                  Mein Zähler gibt einmal Wh aus: ab 10000 in folgender Form als Beispiel: 2108360. Bei den kWh gibt er mir diesen Wert aus 12108. Also fehlt bei Wh die 10000er Zahl.
                  Setze also irgendwie die Zahl zusammen. Wie gesagt hab kaum Ahnung von PHP. Hab mir aber schon einen Kurs besorgt ;-)


                  Grüße

                  Kommentar


                    #10
                    Du musst nicht zusammensetzen, es ist eine reine mathematische Aufgabe:
                    % ist der modulo Operator, d.h. der Rest der Division

                    d.h. der spezifizierte LBS gibt E1/1000+E2%1000 aus

                    In deinem Beispiel wäre das:

                    12108*1000 + 360 = 12108360 Wh

                    Ist es das was du willst?

                    Ich würde dann vor E2 dann einen Verzögerer von 1 Sekunde einbauen. Wenn E2 dann den LBS triggert hast du auf jeden Fall den aktuellen Wert an E1.
                    Zuletzt geändert von jonofe; 13.11.2018, 18:17.

                    Kommentar


                      #11
                      Ja genau das ist es was ich möchte. Ich werd mal versuchen das umzusetzen und zu testen. Danke dafür...
                      Kleiner Offtopic: Kann ich alle Operatoren die PHP zur Verfügung stellt nutzen?



                      Kommentar


                        #12
                        Ja es ist pures PHP.

                        Du musst nur die obige Funktion in dein LBS Gerüst kopieren, dann solltest du fertig sein.

                        PHP-Code:
                        ###[DEF]###
                        [name        = Hilfsbaustein Energiezähler    ]

                        [e#1        = Eingang kWh                     ]
                        [e#2        = Eingang Wh                    ]


                        [a#1        = Ausgabe Wh                ]

                        ###[/DEF]###
                        ###[HELP]###
                        Dieser Baustein berechnet die fehlende/abgeschnittene Zahl bei den Wh. Hierfür wird von der Lingg und Janke Schnittstelle der kWh und der Wh Wert benötigt.
                        Am Ausgang wird dann der korrigierte Wh Wert ausgebenen.

                        E1      kWh Wert vom Zähler
                        E2      Wh Wert vom Zähler

                        A1      Korrigierter bzw. vollständiger Wert in Wh
                        ###[/HELP]###
                        ###[LBS]###
                        <?
                        function LB_LBSID($id) {
                           if ($E = logic_getInputs($id)) {
                               if ($E[2]['refresh']==1) {
                                   logic_setOutput($id,1,$E[1]['value']*1000+$E[2]['value']%1000);
                            }
                        }    

                        ?>
                        ###[/LBS]###

                        Und ich würde nicht versuchen 1:1 einen HS LBS nach EDOMI zu migrieren.
                        Meist geht es in EDOMI/PHP viel einfacher, wie du an diesem LBS siehst.
                        Zuletzt geändert von jonofe; 14.11.2018, 16:15.

                        Kommentar


                          #13
                          Kurze Rückmeldung: Funktioniert wie es soll. Danke an alle helfenden...

                          Grüße
                          Jascha

                          Kommentar

                          Lädt...
                          X