Ankündigung

Einklappen
Keine Ankündigung bisher.

Misterhouse Fragen

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

    #16
    Zitat von aggie89go Beitrag anzeigen
    Chris,

    alle Code-Dateien, die sich in deinen Code Verzeichnissen befinden, werden in alphabetischer Reihenfolge von Misterhouse in die Datei "mh_temp.user_code" eingefügt und diese wird ausschließlich ausgeführt.

    Gut erklart! Man kann sich zu nutze machen, dass MH die code files in alphabetischer Reihenfolge parst. Ich habe eine aaaaa_startup.pl und da kommen alle Sachen rein, die garantiert zuerst aufgeführt werden müssen.

    Wichtig! Dateinamen sollten mit einem Buchstaben anfangen. Ich hatte mal die 00_startup.pl und hab mir nen Wolf gesucht, bis ich den Fehler gefunden habe. Perl erlaubt keine Klassennamen, die mit einer Ziffer starten. Der Mechanismus in MH fangt sowas nicht ab. Ergo keine Ziffern am Anfang.

    Dann gibt es bei parsen noch zwei wichtige Meta Zeilen
    Code:
    noloop=start
    # Alles was hier zwischen steht wird nicht in der grossen "Loop" ausgeführt.
    noloop=stop
    MH führt eure Codezeilen in einer Endlosschleife aus. wenn ihr zum Beispiel mal eine Zeile wie
    HTML-Code:
    print_log "Hello world";
    einfügt und MH startet, dann seht ihr, dass die Zeile dauernd ausgegeben wird. Setzt ihr das print_log in eine nollop=start/stop "Klammer". Wird es nur am Anfang ausgeführt.

    Man kann den Code mit If Abfragen entsprechend strukturiern (if ($New_Hour) zum Beispiel. Dann wird der Code nur einmal pro Stunde ausgeführt.

    Noch besser ist es Events zu nutzen. Dann wird der Code nur ausgeführt, wenn der Event eintritt.

    Schaut dazu mal in der MH Doku und sucht nach tie_event.

    Kommentar


      #17
      Hallo,

      leider muss ich nach Hilfe schreien, bevor ich verzweifle. ;-)
      ich versuche schon seit Tagen die Temperaturen in eine RRD zu schreiben.
      Es funktioniert auch soweit alles, nur kann ich keine EIS5 Werte in diese Datenbank schreiben, es wird immer als hash-wert erkannt unt es kommt eine Fehlermeldung.
      Aufruf erfolgt über :
      system ("rrdtool update ".$DB." ".time().":".$temp_ist_innen..........,etc),

      Habe es auch schon mit sprintf und $Item->{state}, etc. versucht, dann kommt imme eine lange Zahlenkette, bzw. "0.0".

      Habe diese Problem nur bei den EIS5, bzw EIB5 Werten.
      Bei der Ausgabe über Print werden die temperaturen korrekt angezeigt.

      Wäre echt super dankbar, wenn Ihr mir hier unter die Arme greifen könnt.

      nachtrag: dies ist der EIS5-Wert der immer in die rrd geschrieben werden soll: EIB5_Item=HASH(0x184a7cc) Leider nicht das was ich will.

      Gruß

      Blutwurst

      Kommentar


        #18
        Am einfachsten geht das mit den RRDs macros ("use RRDs"), ein Beispiel hatte ich mal im Download Bereich gepostet (unter EIBD&CO, Gaszaehler.pl). Da ist bei mir auch kein Unterschied, ob es eine Temperatur oder sonst was für ein Wert ist.
        Gruß,
        Marc

        Kommentar


          #19
          Hi,
          vielen Dank für die Antwort.
          ich hab es auch mit RDDs::update(...... getestet, ist das gleiche Problem.

          AUFRUF:
          RRDs::update("/Projects/Misterhouse/mh/data/rrd/temperatur.rrd",
          "N:".$Isttemperatur_Innen.":".$temp_c_heute.":.... ........

          Normale Werte gehen, aber die EIS5 Werte verursachen ERROR, da diese vom RRD als Hash-Wert interpretiert werden.

          Gibt es den keine Möglichkeit einen EIS5 Wert als Value in eine Variable zu schieben?
          habe schon alles versucht EIS52Value, sprintf .....

          evtl. würde es über diesen Umweg gehen, wäre sicherlich nicht elegant gelöst....aber könnte funzen.


          .....Verzweiflung stellt sich langsam ein ;-(

          gruß

          blutwurst

          Kommentar


            #20
            Das ist kein RRD Problem. Wenn du den Wert ausgibst (sprintf), dann hast du das gleiche Problem.

            Die EIS5 Variable ist ein Hash in dem auch die Gruppenadresse zB gespeichert wurde. Versuch mal mit

            Code:
            state $eis5_variable
            an den Zahlenwert ranzukommen.

            Code:
            RRDs::update("/Projects/Misterhouse/mh/data/rrd/temperatur.rrd", 
            "N:".[COLOR=Red]state [/COLOR]$Isttemperatur_Innen.":". [COLOR=Red]state [/COLOR]$temp_c_heute.":....  ........
            oder wenn das nicht gehen sollte (kann es gerade nicht testen)

            Code:
            RRDs::update("/Projects/Misterhouse/mh/data/rrd/temperatur.rrd", 
            "N:".$Isttemperatur_Innen[COLOR=Red]->state()[/COLOR].":".$temp_c_heute[COLOR=Red]->state()[/COLOR].":....  ........

            Kommentar


              #21
              SUPER!!!!RAK!!!!

              Freude stellt sich ein, scheint zu klappen.....puh seit 3 tagen hab ich nun daran gehangen.

              Ich hatte das mit state auch schon probiert, aber über ne 2. Variable, dass hatte aber nicht geklappt.

              z.Bsp:
              my $zTempstate = state $Isttemperatur_innen
              bzw $zTempstate = $Isttemperatur_innen->(state)
              ...das wollte nicht

              Direkt im Aufruf der RRDs geht aber.
              Yipeehhh!!!



              ...nun kann s weitergehen.

              Danke, und nochmals....Danke....Puh ....

              Gruß

              Blutwurst

              Kommentar


                #22
                $zTempstate = state $Isttemperatur_innen;

                sollte auf jeden Fall gehen, wird doch in der Gaszaehler.pl auch so benutzt!
                Gruß,
                Marc

                Kommentar


                  #23
                  Ihr kennt diese Suchbilder: Findet 10 Unterschiede?

                  Findest du einen?
                  Code:
                  $Isttemperatur_innen->(state)
                  Code:
                  $Isttemperatur_innen->state()
                  Wer lesen kann ist klar im Vorteil.

                  Kommentar


                    #24
                    Da gibts aber noch einen, oder?

                    $Isttemperatur_innen->{state}

                    Gruß

                    Blutwurst

                    Kommentar


                      #25
                      Halt!

                      $variable->(state) ist schlichtweg falsch.

                      $variable->state() ruft die _Methode_ state der Klasse auf und liefert dessen Rückgabewert. Das ist das selbe wie state $variable.

                      ->{state} gibt direkten Zugriff auf interne Variable state der Klasse.

                      Letzteres bitte sofort wieder vergessen. Im Gegensatz zu C+ oder anderen höheren Objekt orientierten (OO) Programmiersprachen kapselt Perl die Klassenvariablen nicht. In C+ definiert man "private" Variablen, die sind _nur_ innerhalb der Klasse gültig und ausserhalb _nicht_ zugreifbar.

                      Perl OO ist eigentlich so ein wenig von hinten durch die Brust ins Auge. Quasi aufgesetzt auf standard Perl. Daher kennt es solche Schutzmechanismen nicht.

                      Den direkten Zugriff auf die Variablen der Klasse (3te Variante) solltet ihr _immer_ meiden. Ausnahme ist ihr wisst was ihr macht .

                      Mehr findet ihr zum Thema bei Tante Google unter Perl Oject oriented.

                      Kommentar


                        #26
                        Hallo,

                        kann mir jemand sagen, wie ich es gelingt, dass ich (mit Hilfe der time_idle Funktion) nach Erreichen einer bestimmten Zeit _einmal_ ein Event triggere?


                        if (time_idle $Leuchttisch ("2 s on")) {
                        print "test";
                        }

                        Ich möchte, dass nach Ablauf der 2 Sekunden nur einmal die Aktion ausgeführt wird. Entweder müsste man auf genau 2 Sekunden idle reagieren oder den Übergang zu time_idle => true finden. Ist mir nicht gelungen.
                        Bitte um Hilfe.
                        Gruß!

                        Kommentar


                          #27
                          Ganz kapiert habe ichnicht was du willst, aber ich antworte trotzdem mal .

                          Schau dir die Klasse Timer mal an.

                          Anbei ein Beispiel von mir. F_HWRTuer ist ein fensterkontakt an der Tür zum Hauswirtschaftsraum (HWR). Er kennt die Statii "open" und "closed".

                          $HWR ist das Licht im HWR. Es kennt die Statii "ON" und "OFF".

                          Code:
                          my $HWRTimer = new Timer();
                          $F_HWRTuer->tie_event( 'THS_HWR($state)' );
                          $HWR->tie_event( 'THS_HWR($state)' );
                          
                          # if HWR Door opens turn on light and turn it automaticaly off after 10min
                          # if it closes, turn out light after 3min
                          sub THS_HWR {
                            my ($state) = @_;
                            if ($state eq 'open') {
                              set $HWR ON;
                              $HWRTimer->unset();
                              $HWRTimer->set( 10*60, 'set $HWR OFF' );
                            } elsif ($state eq 'closed') {
                              $HWRTimer->unset();
                              $HWRTimer->set( 3*60, 'set $HWR OFF' );
                            }
                          }
                          Hope that helps.

                          Kommentar


                            #28
                            Zitat von RaK Beitrag anzeigen
                            Ganz kapiert habe ichnicht was du willst, aber ich antworte trotzdem mal .

                            Schau dir die Klasse Timer mal an.
                            Danke RaK, dein Beispiel habe ich schonmal verstanden.

                            Ich versuche mein Problem nochmal zu erklären:
                            Ich habe vor, über Idle_Zustände eine An-/Abwesenheitserkennung zu basteln.
                            Hierbei möchte ich zum Zeitpunkt, an dem time_idle (nach Ablauf der angegebenen Zeit) wahr wird, eine Aktion auslösen. Soweit eigentlich kein Problem, aber time_idle bleibt nach Überschreiten der angegebenen Zeit wahr und löst die Funktion immer wieder aus.
                            Die eleganteste Lösung wäre also in einer IF Abfrage den Zeitpunkt zu "extrahieren", zu dem time_idle wahr wird. (Ich stelle mir das so vor wie: state_changed von time_idle eq true) ? Ist das irgendwie möglich?

                            Kommentar


                              #29
                              Zitat von spookyt. Beitrag anzeigen
                              Soweit eigentlich kein Problem, aber time_idle bleibt nach Überschreiten der angegebenen Zeit wahr und löst die Funktion immer wieder aus.
                              Die eleganteste Lösung wäre also in einer IF Abfrage den Zeitpunkt zu "extrahieren", zu dem time_idle wahr wird. (Ich stelle mir das so vor wie: state_changed von time_idle eq true) ? Ist das irgendwie möglich?
                              Das Verhalten ist aber doch konsistent, oder? Schliesslich ist das Objekt ja immernoch länger als die angegebene Zeit idle.

                              Warum nutzt du nicht die Funktion get_idle_time? Siehe dazu aich die Doc!
                              Code:
                               get_idle_time       : Returns number of seconds since the last state change
                              Hiermit hast du doch genau was du brauchst, oder verstehe ich das falsch?
                              Code:
                              If ($object->get_idle_time() == 3600) { }
                              Ob diese bedingung dann in den verschiedenen Durchläufen der MH Hauptschleife in der entsprechenden Sekunde mehrmals durchlaufen wird müsste man testen und evtl. abfangen.

                              Kommentar


                                #30
                                Darf ich rein verständnishalber mal fragen, wofür die Zeile

                                Code:
                                $HWR->tie_event( 'THS_HWR($state)' );
                                gut ist? Reicht nicht das tie_event zur Haustür, also die Zeile darüber?

                                Kommentar

                                Lädt...
                                X