Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Hi,
    hat jemand eine Idee wie man einen einfachen 2 Punkt Regler formuliert der bei -1 Grad einschaltet und bei 0 Grad ausschaltet.
    VG & Danke
    Jürgen

    Kommentar


      Code:
      mein_kleiner_regler => {
          receive=>'1/2/3', #Temperatur
          transmit=>'4/5/6', #Last
          translate=>sub{
              if ($input < -1) {return "1"} # wenn kaelter als -1, schalte Last ein
              if ($input > 0) {return "0"} # wenn waermer als 0, schalte Last aus
              return undef; # wenn nichts zutrifft, schalte nicht
          },
      },
      Das geht sicher auch in einer Zeile, aber dann kann ich es nicht mehr lesen

      Kommentar


        Zitat von johnnychicago Beitrag anzeigen
        Code:
        mein_kleiner_regler => {
        receive=>'1/2/3', #Temperatur
        transmit=>'4/5/6', #Last
        translate=>sub{
        if ($input < -1) {return "1"} # wenn kaelter als -1, schalte Last ein
        if ($input > 0) {return "0"} # wenn waermer als 0, schalte Last aus
        return undef; # wenn nichts zutrifft, schalte nicht
        },
        },
        Das geht sicher auch in einer Zeile, aber dann kann ich es nicht mehr lesen
        Der Funktioniert schon mal. Was kann man machen wenn man will das der Regler das Relais maximal 1 mal die Stunde umschaltet? Das Gerät der Frostwächter hat einen eigenen Thermostat der bei 5 Grad abregelt. Ist also für sich selber schon sicher.

        Die einfachste Methode ist wohl die Temperatur nicht so oft zu senden. Aber dann sehe ich ja auch den Temperaturverlauf nicht so schön.

        Kommentar


          Ich kann zwar nicht nachvollziehen, wieso, aber wenn Du nur alle Stunde mal schalten willst, kannst Du cool=>3600 setzen, das blockiert die Logik nach einem Aufruf für eine Stunde. Alternativ kannst Du das 'receive' durch ein 'fetch' ersetzen, dann wird die Logik nicht mehr durch die Temperatur-GA getriggert, und dann kannst Du mit einem 'time'-Statement die Logik stündlich aufrufen.

          Darf ich raten: der Frostwächter lässt sich nur bis auf 5° runtersetzen und Du willst Dich bis an den Gefrierpunkt herantasten, um den Strom für das angeschlossene Gerät zu sparen ? Falls ja, lebst Du gefährlich: wenn der Schaltaktor aus ist, dann kann der Thermostat klicken, soviel er lustig ist, dann friert's ein.

          Richte das wie einen umgekehrten Treppenlichtschalter ein, wenn Dein Aktor das kann: der Aktor ist immer eingeschaltet, und Du kannst ihn per GA für einen gegebenen Zeitraum ausschalten. Wenn die Ausschalt-GA nicht regelmässig kommt, dann schaltet der Aktor wieder ein. So ist es eigensicher, und überlebt den Ausfall des WG, des Logikprozessors, des KNX-Kabels dazwischen etc.

          Kommentar


            Hi,
            so richtig kaputt gehen kann da nur mein Oleander und der verträgt auch für Kurze Zeit einige Minus grade. Aber die Idee mit dem umgekehrten Treppenlichschatler werde ich mir mal ausprobieren. Es geht mir darum das der Aktorkanal nicht kaputt geht. Als ich es gestern ausprobiert habe ging der Aktor im 5min Zyklus ein und aus. Das soll so nicht sein schätze mal mit einer Stündlichen ein ausschalten wird da nix gross Kaput gehen.
            Viele Grüsse & Danke
            Jürgen

            Kommentar


              Ich meine mich erinnern zu können, mal von einer Million Schaltvorgängen für einen Aktor gelesen zu haben. Würde der Aktor wirklich alle 5 Minuten schalten, wären das 9 Jahre. Da der Aktor aber nur maximal 2 Monate im Jahr schalten würde, weil ja nicht immer Winter ist, kommst Du 50 Jahre mit dem Aktor. Passt IMHO

              Kommentar


                Hi,
                ja eine million wird auch von dem von mir verwendeten MDT AMI 1216.02 genannt. Okay mir fällt da noch eine weiter Massnahme ein. Der Sensor werde ich nahe an den Oleander bringen. (weiter von der Wärmequele weg) Denke das es dann nicht mehr so stark takten wird. Aber so einen Cool mit 15 minuten bau ich trotzdem ein.
                VG
                Jürgen

                Kommentar


                  Hallo,

                  ich würde gerne den Ölverbrauch des letzten Monats und des aktuellen Monats an eine GA schicken und mit der CV anzuzeigen.

                  Ist es mit dem LP einfach möglich nach folgendem Prinzip die Werte zu bekommen?

                  Code:
                  Zaeler_oil_letztes_Monat => {transmit=>'1/2/9', delay=>'5min', translate=>sub{rrd_oilstand(now) - rdd_oilstand(now-1months)} },
                  Wäre das so irgendwie lösbar?
                  Also von einem RRD zwei werte lesen und mit diesen zu rechnen.

                  Gruß Gernot

                  Kommentar



                    Hallo,
                    mein wiregate_plugin.log zeigt nach jeder Initialisierung (z.B. nach neuer Logik hinzugefügt) folgenden Eintrag:
                    2015-12-12 07:51:27.927,Logicprozessor,Config warn: Lesezugriffe auf folgende transmit-Adressen werden von mehreren Logiken beantwortet:
                    2015-12-12 07:51:27.928,Logicprozessor,Szenen_Schlafzimmer_St atus -> SzSzeneMemorySTORE, Memory_Szenen_Schlafzimmer_Status
                    2015-12-12 07:51:27.928,Logicprozessor,Bei folgende Logiken wurde daher reply_to_read_requests=>0 gesetzt:
                    2015-12-12 07:51:27.928,Logicprozessor,SzSzeneMemorySTORE
                    2015-12-12 07:51:27.928,Logicprozessor,(T) - transmit_only_on_request gesetzt
                    2015-12-12 07:51:27.929,Logicprozessor,(R) - recalc_on_request gesetzt
                    Das ist mir aber nicht ganz klar, weil in der Logic "SzSzeneMemorySTORE" die GA "Szenen_Schlafzimmer_Status" nur unter fetch eingetragen ist. fetch antwortet doch nicht auf Lesezugriffe, oder doch? Hier einmal alle Code-Schnipsel, bei denen ich die GA "Szenen_Schlafzimmer_Status" verwende:
                    Bewegung_SZ => {receive=>'BM_Schlafzimmer', fetch=>['Tag_Nacht_SZ','Szenen_Schlafzimmer_Status'], transmit=>'Szenen_Schlafzimmer', translate=>sub{int($input->[1])==1 && int($input->[0])==1 ? int($input->[2]) : 9;}, debug=>1},

                    SzSzeneMemorySTORE => { receive=>'Szenen_Schlafzimmer', transmit=>'Szenen_Schlafzimmer_Status', reply_to_read_requests=>1, translate=>sub{(int($input) < 128) ? ((int($input)==8 or int($input)==9) ? return undef : int($input)) : return undef;}, debug=>1},

                    SzSzeneMemoryRESTORE => { trigger=>'Szenen_Schlafzimmer_Restore', fetch=>'Szenen_Schlafzimmer_Status', transmit=>'Szenen_Schlafzimmer', translate=>sub{ $input }, debug=>1 },
                    Hat jemand eine Idee, was ich eleganter machen könnte? Grundsätzliches Ziel: Die letzte genutzte Szene in einem Raum soll in Szenen_Schlafzimmer_Status abgespeichert werden. Bei einer 1 auf SzSzeneMemoryRESTORE soll diese wieder hergestellt werden, wenn eine Zeit lang keine Bewegung im Raum stattgefunden hat, schaltet der BM eine bestimmte Szene (alles Aus). Bei erneuter Bewegung soll die bestehende Szene erhalten bleiben oder wieder angehen. Die Szene für alles Aus wird nie in Szenen_Schlafzimmer_Status abgespeichert.

                    Kommentar


                      Zitat von murelli146 Beitrag anzeigen
                      Hallo,

                      ich würde gerne den Ölverbrauch des letzten Monats und des aktuellen Monats an eine GA schicken und mit der CV anzuzeigen.

                      Ist es mit dem LP einfach möglich nach folgendem Prinzip die Werte zu bekommen?

                      Code:
                      Zaeler_oil_letztes_Monat => {transmit=>'1/2/9', delay=>'5min', translate=>sub{rrd_oilstand(now) - rdd_oilstand(now-1months)} },
                      Wäre das so irgendwie lösbar?
                      Also von einem RRD zwei werte lesen und mit diesen zu rechnen.

                      Gruß Gernot

                      Soweit ich weiß kann der LP nur in einen rrd schreiben. Aber du kannst natürlich eine sub "rrd_oilstand" schreiben, die dann aus einem rrd etwas ausliest und zurück gibt.

                      VG

                      Kommentar


                        Hallo,
                        ich habe gerade Probleme damit, mit dem LP eine Reaktion auf das Schreiben auf einer GA hinzubekommen. Da ich ein CommunityGate am Laufen habe, habe ich die Frage vorrangig dort im Thread gestellt (Klick).
                        Allerdings treibt mich in dem Zusammenhang auch die Frage um, ob es vielleicht irgendwelche Abhängigkeiten zwischen LP-Version und Wiregate-Version gibt? Es gab mal einen Hinweis auf Patchlevel 32, wenn ich mich recht erinnere. Das CommunityGate läuft mit dem letzten freien WG-Stand - also Patchlevel 39. LP ist der aktuellste Stand aus dem GIT.
                        Gibt es da irgendwas, was ich beachten muss? Vielleicht hat hier ja jemand noch einen Tipp für mich.
                        Schöne Grüße,
                        Jens

                        Kommentar


                          Hallo,
                          ich habe mein Problem immer noch nicht gelöst. Allerdings bin ich mit dem Debuggen etwas voran gekommen.
                          Ich habe den Wiregate-Deamon mit der Option -d gestartet und sehe so jede Menge Meldungen. Wenn auf meine GA, die der LP aboniert hat, geschrieben wird, kommen auch entsprechende Meldungen:
                          Code:
                          2015-12-27 14:07:29.469 DEBUG - R:0 P:low Hops:6 T:T_DATA_XXX_REQ Seq:0 A:A_GroupValue_Write src: 1.1.47 dst: 1/1/60 len: 1 data: 00 (0)
                          2015-12-27 14:07:29.470 DEBUG - Running Plugin Logikprozessor.pl subscribed for WRITE to 1/1/60
                          2015-12-27 14:07:29.477 DEBUG - Running PLUGIN Logikprozessor.pl
                          Ich habe dann in den LP noch ein paar Debug-Meldungen eingebaut und festgestelt, dass er dort, wo der Aufrufgrund ermittelt wird, immer in den Cycle-Bereich läuft, also in das letzte "Else". Er sollte ja aber in den Bustraffic-Else-If laufen - eine Logmeldung, die ich dort eingebaut habe, wird aber nicht ausgegeben. Es scheint also so, dass %msg nicht definiert ist.
                          Hat dazu jemand vielleicht eine Idee?

                          Edit: Ich habe mein Problem gelöst. Allerdings frage ich mich, was da mit meinem Softwarestand nicht stimmt.
                          Die Lösung: in der wiregated.pl in
                          Code:
                          sub check_generic_plugins
                          habe ich das
                          Code:
                          my %msg;
                          auskommentiert. Damit wird nach meinem Verständnis das globale Hash %msg verwendet und nun läuft meine Logik.
                          Wäre trotzdem toll, wenn das noch jemand aufzulösen wüßte. Bei allen anderen hier laufen doch LP und wiregated problemlos im AUslieferungszustand zusammen, oder?
                          Zuletzt geändert von dismantled; 27.12.2015, 15:33.

                          Kommentar


                            Hallo,
                            erstmal vielen Dank für die Arbeit die hier bereits in die Logikengine geflossen ist. Damit lässt sich einfach unglaublich viel machen.
                            Ich wollte jetzt mal das Wecker-Skript, welches Fry hier irgendwo im Thread gepostet hat mal testen.
                            Leider verstehe ich noch nicht ganz wo ich das genau einbinden muss.

                            Gehören die ganzen Funktionen ($logic{"Alarm_set"}, $logic{"Alarm_time"}, usw.) in ein eigenes Plugin, in die Logikengine.pl oder einfach in die Logikengine.conf?
                            Ich hab da zwar mal ein wenig ausprobiert, hab das aber nicht ans laufen gekriegt.

                            Viele Grüße,
                            Tim

                            Kommentar


                              Hallo Zusammen
                              Ich bin gerade dabei den LP für mich zu entdecken. Vielen Dank an alle die hier ihre Ressourcen reinstecken. Ich bin absoluter Perl Anfänger, und daher ist für mich vieles mit viel (Google-) Aufwand verbunden. Aber bei einer Aufgabe komme ich auch da grad nicht weiter.
                              Und zwar möchte ich, wenn ich eine Lampe einschalte überprüfen mit welcher Dimmstufe diese nun brennt, und bei unterschreiten eines Schwellwertes einen höheren Wert senden. (Hintergrund: mein DMX Gateway schaltet immer mit der letzten Dimmwert ein, etwas blöd beim runterdimmen auf null und anschliessendem wieder einschalten)

                              das ganze sollte eigentlich so funktionieren hoffe ich? (sitze grad nicht vor dem WG)
                              1/1/100 --> 1Bit Befehl vom Taster
                              1/5/100 --> 8Bit Rückmeldung von DMX
                              1/4/100 --> 8Bit Befehl absolutes Dimmen

                              Code:
                                dim => { receive=>['1/1/100','1/5/100'], transmit=>'1/4/100',
                                            translate => sub {   if ($input->[0]) == 1 && ($input->[1]) < 20 { return 50 };  } },
                              Nun möchte ich aber noch einbauen dass die Logik nach einmaliger Ausführung gesperrt wird, bis auf 1/1/100 wieder eine 0 gesendet wird. ansonsten wird ja bei relativem oder absolutem Dimmen unter Schwellwert automatisch wieder erhöht.

                              Hat jemand eine Idee wie ich das realisieren könnte?

                              Vielen Dank schonmal
                              Markus
                              Zuletzt geändert von mmarkus; 22.01.2016, 12:22.

                              Kommentar


                                Hallo Markus,

                                vorweg: ich bin noch relativ am Anfang mit dem Logikprozessor.
                                Aber Du könntest vielleicht eine zusätzliche Logik schreiben, die in einer Hilfs-GA die 'Sperre' für Deine dim-Logik abbildet.

                                z.B. so
                                Code:
                                NullGesendet => { receive=>'1/1/100', transmit=>'0/1/123', translate => sub { if ($input) == 0 { return 1 }; } },
                                0/1/123 ist dabei eine Hilfs-Gruppenadresse, die auf 1 gesetzt wird, wenn jemand an 1/1/100 eine 0 sendet.
                                Deine dim-Logik kann dann erweitert werden.
                                Code:
                                  dim => { receive=>['1/1/100','1/5/100','0/1/123'], transmit=>'1/4/100',
                                              translate => sub {   if  ($input->[0]) == 1 && ($input->[1]) < 20 && ($input->[2]) == 1 { return 50 };  } },
                                So wird die 50 nur gesendet, wenn die Logik über die 1 in 0/1/123 freigegeben wurde.

                                Damit nach Ausführung der Logik wieder eine 0 in die 0/1/123 kommt, könntest Du jetzt vieleicht ein followup starten, um die 0/1/123 einfach wieder zu nullen. Sitz aber gerade nicht vorm Wiregate, daher kann ich das nicht testen. Der Code lässt sich bestimmt auch irgendwie schöner abbilden, aber vielleicht hilft es Dir weiter.

                                Viele Grüße,
                                Tim

                                Kommentar

                                Lädt...
                                X