Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Zitat von Fry Beitrag anzeigen
    in etwa so:

    Code:
    diff => {    receive=>'9/5/207', transmit=>'9/5/208', state=>{lastval=>undef, lasttime=>undef},            
                     translate => sub { 
                         my $valdiff=$input-$state->{lastval}; $state->{lastval}=$input;
                         my $timediff=$systemtime-$state->{lasttime}; $state->{lasttime}=$systemtime; 
                         return $valdiff/$timediff;  } 
    },
    Ungetestet.

    VG, Fry
    Hi Fry

    Bin nun endlich mal dazugekommen, die Logik für meine Zähler einzubinden. Irgendwie passen die Zahlen nicht zueinander. Beide GA's sind als DPT14 definiert. Eine Idee woran das liegt?

    Auszug aus dem Log siehe Anhang

    Bei dem Code steige ich leider nicht urch, deshalb ist für mich die Fehlersuche etwas schwierig.
    Angehängte Dateien
    ---
    Martin

    Kommentar


      Hi Martin, was meinst du mit "Irgendwie passen die Zahlen nicht" ? Ich kann da keinen Fehler erkennen, auch weil die Infos nicht ausreichen. VG, Fry

      Kommentar


        Beim Sprung von 520,96 kWh auf 520,99 kWh berechnet der Logikprozessor 0,0001020...kWh, was ja 0,1W entspricht. Meiner Rechnung nach sollten es aber 30W sein. Oder sehe ich das falsch?

        Moment, ich vergaß die Zeitbasis. Dein Snippet berechnet 0,1W/Sekunde, richtig? Will ich es pro Minute wissen, dann muss ich einfach noch mit 60 multiplzieren. Will ich es gleich in Watt auf die GA senden, muss ich nochmal mit 1000 multiplizieren.

        Ist das korrekt soweit?
        ---
        Martin

        Kommentar


          Hallo Martin, mein Snippet berechnet ein Delta in kWh und teilt durch ein Delta in s. Du willst am Ende W (nicht "Watt/Sekunde", das ist keine sinnvolle Einheit in unserem Kontext). Also musst du x1000 (für das "Kilo") und x3600 (für die Stunde in kWh) rechnen, um auf Watt zu kommen. VG, Fry

          Kommentar


            ...um halbwegs _genaue_ Ergebnisse zu bekommen, empfehle ich, die Logik in längeren Abständen (nicht jede Minute, sondern zB nur jede Viertelstunde) laufen zu lassen. Dann werden die Deltas in der Rechnung größer und der relative Fehler kleiner. VG, Fry

            Kommentar


              Super, Danke für die Erklärung.

              Kann ich die Zeit der einzelnen Logiken auch bestimmen?
              Ich hole mir nur alle 5 Minuten den Zählerstand.
              ---
              Martin

              Kommentar


                Alle 5 Minuten periodisch den Zählerstand senden lassen sollte ok sein, dann läuft die Logik eben einmal pro 5min. Du bekommst dann die Durchschnittsleistung in diesen 5min in Watt (wenn du mit den u.g. Faktoren skalierst). VG, Fry

                Kommentar


                  Hallo,
                  ich versuche gerade die ersten Gehversuche mit dem Logikprozessor .
                  Ziel ist, den Wert der ankommenden GA auf der ausgehenden GA invertiert auszugeben.
                  Code:
                      helligkeit =>  { receive => '10/1/5', transmit => '10/1/8', translate => sub {if ($input->[0]=1)                                                                                        
                                                                                                      {0;1;}
                                                                                                   },
                                      },

                  Syntaktisch wird zwar kein Fehler gemeldet, bin mir dennoch unsicher, ob das so passt.

                  Zudem wird auf der 10/1/8 nichts ausgegeben.

                  In der eibga.conf sind beide GA's enthalten:
                  Code:
                  [10/1/5]
                  DPTSubId = 1.002
                  short = Dunkelheit
                  ga = 10/1/5
                  DPTId = 1
                  name = Dunkelheit EINAUS
                  DPT_SubTypeName = DPT_Bool
                  
                  [10/1/8]
                  DPTSubId = 1.001
                  DPTId = 1
                  name = Helligkeit EinAus
                  DPT_SubTypeName = DPT_Switch
                  Was mache ich falsch? In der Plugin-Übersicht erhalte ich auch keine Rückmeldung à la "1 Inititialisiert"
                  Alternativ würde auch ein Schwellwertschalter funktionieren. Habe dazu aber kein Beispiel gefunden.
                  Danke Alex
                  Gruß
                  alexbeer

                  Kommentar


                    Also ich würde so invertieren

                    Code:
                    helligkeit =>  { receive => '10/1/5', transmit => '10/1/8', translate => sub { $input->[0] ? 0 : 1; } , },
                    Gruß Gernot

                    Kommentar


                      Danke Gernot, das klappt so.
                      Gruß
                      alexbeer

                      Kommentar


                        Hallo zusammen,

                        kann mir jemand sagen, was ich falsch gemacht habe, dass die folgende Logik nicht feuert?

                        Ziel ist eine Treppenlichtfunktion. 5/0/141 aktiviert die Treppenlichtfunktion, 5/0/140 schaltet den Aktor (dieser soll auch weiterhin manuell und unabhängig vom Timer geschaltet werden können).

                        Code:
                            # Licht geht sofort an
                            aussen_sued_timer    => {
                                receive        => ['5/0/141'],
                                transmit    => ['5/0/140'],
                                cool        => 1,
                                translate    => sub {
                                    if ( defined $input && int($input) == 1 )
                                        { 1; }
                                    else
                                        { return undef; }
                                },
                                debug        => 1,
                            },
                            # Licht geht nach 5 Sekunden automatisch wieder aus (Treppenlichtfunktion)
                            aussen_sued_timer_DELAY    => {
                                receive        => ['5/0/141'],
                                transmit    => ['5/0/140'],
                                delay        => 5,
                                translate    => sub {
                                    if ( defined $input && int($input) == 1 )
                                        { 0; }
                                    else
                                        { return undef; }
                                },
                                debug        => 1,
                            },
                        Im Plugin-Log kommt folgende Meldung:

                        Code:
                        2015-03-17 21:39:45.460,Logikprozessor,1.1.20 5/0/141:1 -> $logic->{aussen_sued_timer}{receive}(Logik) -> nichts zu senden;  1.1.20 5/0/141:1 -> $logic->{aussen_sued_timer_DELAY}{receive}(Logik) -> nichts zu senden;  ,0s,
                        Der verwendete Logikprozessor ist die Version vom 15. Februar 2015 auf einem Wiregate mit Version 1.2.
                        "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

                        Kommentar


                          Zitat von wuestenfuchs Beitrag anzeigen
                          kann mir jemand sagen, was ich falsch gemacht habe, dass die folgende Logik nicht feuert?
                          Ich sehe auf den ersten Blick kein Problem - das sollte so funktionieren ... Funktioniert die erste (Einschalt-)Logik?

                          Versuch mal in der sub (vor dem if) mit plugin_log den Wert von $input auszugeben:
                          Code:
                          plugin_log($plugname, "input: ".$input);
                          Ich würde auch mal das "defined $input" weglassen...

                          VG
                          Micha

                          Kommentar


                            Hallo mivola,

                            auch die Einschaltlogik funktioniert nicht, d.h. das Licht geht nicht an. Wenn ich den plugin_log zu beiden Logiken hinzufüge:

                            # Licht geht an
                            aussen_sued_timer => {
                            receive => ['5/0/141'],
                            transmit => ['5/0/140','5/7/141'],
                            cool => 1,
                            translate => sub { plugin_log($plugname, "input: ".$input);
                            if ( int($input) == 1 )
                            { 1; }
                            else
                            { return undef; }
                            },
                            debug => 1,
                            },
                            # Licht geht nach 2 Minuten automatisch wieder aus (Treppenlichtfunktion)
                            aussen_sued_timer_DELAY => {
                            receive => ['5/0/141'],
                            transmit => ['5/0/140','5/7/141'],
                            delay => 5,
                            translate => sub { plugin_log($plugname, "input: ".$input);
                            if ( int($input) == 1 )
                            { 0; }
                            else
                            { return undef; }
                            },
                            debug => 1,
                            },
                            erscheint folgender Logeintrag:

                            2015-03-22 11:55:04.466,Logikprozessor,input: ARRAY(0x90d8298)
                            2015-03-22 11:55:04.469,Logikprozessor,input: ARRAY(0x90d8898)
                            2015-03-22 11:55:04.481,Logikprozessor,1.1.20 5/0/141:1 -> $logic->{aussen_sued_timer}{receive}(Logik) -> nichts zu senden; 1.1.20 5/0/141:1 -> $logic->{aussen_sued_timer_DELAY}{receive}(Logik) -> nichts zu senden; ,0s,
                            Wieso gibt er als Input ein Array aus? Der DPT aller in den Logiken verwendeten GAs ist 1.001, habs gerade nochmal im Wiregate Backend überprüft.
                            "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

                            Kommentar


                              lass doch mal bei receive=>... die eckigen Klammern weg.
                              VG, Fry

                              Kommentar


                                Ich versuche gerade den Logikprozessor als Plugin einzubinden und dachte es wäre ganz einfach. Ich habe
                                - den Code Logikprozessor.pl und .conf_sample aus dem SVN via "Download this file" heruntergeladen.
                                - zunächst die .pl Datei im Windows Texteditor geöffnet
                                - CTRL-A (Alles markiert)
                                - CTRL-C (kopieren)
                                - in der Wiregate Web-Ansicht "Plugin hinzufügen" geklickt
                                - im Codebereich CTRL-V (einfügen), Code komplett eingefügt Zeilenanzahl stimmt überein
                                - Den Namen "Logikprozessor.pl" eingegeben

                                Nach meinem Verständnis liegt diese .pl nun in /etc/wiregate/plugin/generic oder ist das bereits mein erstens Missverständnis?

                                In der Liste der Plugins taucht nun der Logikprozessor auf und ich kann auf den Link "Conf" hinter dem Namen klicken. Dort mach ich dann das oben beschriebene mit der Beispiel-Konfigurationsdatei.

                                Wäre das prinzipiell der richtige Weg?

                                Fehlerbilder:
                                1. In der PluginListe taucht nun unter Rückgabewert ein ewig langer Errorcode auf. Siehe Screenshot in Bild 1. Wenn das oben richtig war, dann wüßte ich gerne warum? Wenn das oben falsch war, dann brauch ich hier wohl keine Antwort drauf haben:-)
                                2. Schaue ich mir den Code des Logikprozessors an, so fällt mir auf, dass der Editor in meinem Wiregate ab Zeile 104 alles rot darstellt. Der Editor scheint das Ende der Befehlskette in Zeile 104 nicht zu identifizieren. Siehe Screenshot in Bild 2. Irgendwelche Ideen?
                                You do not have permission to view this gallery.
                                This gallery has 2 photos.

                                Kommentar

                                Lädt...
                                X