Ankündigung

Einklappen
Keine Ankündigung bisher.

brauche Hilfe bei Datentypen

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

    #16
    Hi,

    das mit dem Usercode ist relativ einfach. Beispiel:

    waermepumpe.pl
    Code:
    if (time_cron('5 * * * *')) { 
    
       # hier steht der Code der die WP ausliest und im Anschluss
       # $MeinEIB5Objekt->set($wert) ausführt.
    };
    Das Skript legst du im code-Verzeichnis von mistereib ab. Mistereib restarten, Skript wird ausgeführt.

    Zum testen beim Programmieren gehst du wie folgt vor:
    Die Variable mh_parms von Mistereib exportieren, z.B.

    export mh_parms=/path_to_mistereib/mh.private.ini

    Dann Misterhouse nur mit dem Skript aufrufen:
    /usr/local/misterhouse/bin/mh waermepumpe.pl


    Hier noch ein Beispiel einer Heizungsautomatik als Usercode:

    heizungsautomatik.pl

    Code:
    if ($Heizungsautomatik->state eq 'on') {
    
    
       # Montag - Freitag Raumtemperaturen um 4:00 Uhr anheben:
       if (time_cron('0 4 * * 1-5')) { heizung_anheben() };
    
       # Samstag und Sonntag Raumtemperaturen um 6:30 Uhr anheben:
       if (time_cron('0 6 * * 6,0')) { heizung_anheben() };
    
       # Sonntag - Donnerstag Raumtemperaturen um 22:30 absenken:
       if (time_cron('30 22 * * 0-4')) { heizung_absenken() };
    
       # Freitag und Samstag Raumtemperaturen um 23:30 absenken:
       if (time_cron('30 23 * * 5-6')) { heizung_absenken() };
    
       # Montag, Dienstag, Donnerstag um 7:30 Uhr Raumtemperatur
       # absenken und um 11:30 Uhr wieder auf normal:
       if (time_cron('30 7 * * 1,2,4'))  { heizung_absenken() };
       if (time_cron('30 11 * * 1,2,4')) { heizung_normal() };
    
       # Mittwoch und Freitag Raumtemperatur um 08:30 auf normal:
       if (time_cron('30 8 * * 3,5')) { heizung_normal() };
    
    } elsif ($Heizungsautomatik->state_changed) {
       heizung_normal();
    }
    
    sub heizung_anheben {
       $EG_RCD_Kueche->set(23);
       $EG_RCD_Bad->set(24);
       $DG_RCD_Bad->set(24);
    }
    sub heizung_normal {
       $EG_RCD_Kueche->set(22);
       $EG_RCD_Bad->set(24);
       $DG_RCD_Bad->set(22);
    }
    sub heizung_absenken {
       $EG_RCD_Kueche->set(20);
       $EG_RCD_Bad->set(22);
       $DG_RCD_Bad->set(20);
    }
    Viel Erfolg,
    thoern

    Kommentar


      #17
      Herzlichen Dank!

      eine Frage noch - welche "uses" brauche ich denn um das time_cron() zu nutzen ??

      Kommentar


        #18
        Uses - gar keins.

        Was du noch wissen solltest, die Usercodeskripte werden werden zyklisch ausgeführt

        leg einfach mal ein Skript an namens

        humblpfrumbf.pl
        Code:
        print "humblpfrumpf wird ausgefuehrt\n"
        Dann mh_parms exportieren und folgendes aufrufen:

        /usr/local/misterhouse/bin/mh humblpfrumbf.pl

        Und dann schau mal was passiert. Achtung: ein "exit" im Skript beendet auch misterhouse

        Gruß,
        thoern

        Kommentar


          #19
          danke!

          Fragen über Fragen - entsteht durch das zyklische Ausführen nicht eine hohe CPU Last ohne das "produktiv" gearbeitet wird?

          Gruß
          - boxerfahrer

          Kommentar


            #20
            hab jetzt keine Zeit deshalb nur kurz: nein.

            Kommentar


              #21
              der Test lief auf Anhieb, Klasse!

              Jetzt wollte ich im nächsten Schritt natürlich direkt auf eine Gruppenadresse schreiben. Die habe ich im .mht File im Code Directory wie folgt definiert:

              Code:
              EIB5,               3/0/10,              Warmwasser_Temperatur,                 Zentral_Waermepumpe, unit=°C
              Also bin ich davon ausgegangen, dass ich die im perl UserCode nicht nochmals definieren darf. Ich habe dann versucht, direkt darauf zu schreiben:
              Code:
              sub write_eib_wvs_data
              {
                $Warmwasser_Temperatur->set(44);
              }
              Aber ich bekomme eine Fehlermeldung wegen fehlender Definition:
              Code:
              15/02/11 06:06:31 PM Evaluating user code
              
              Error in user code file /opt/mistereib/data/mh_temp.user_code
              
                15/02/11 06:06:31 PM: Global symbol "$Warmwasser_Temperatur" requires explicit package name at (eval 271) line 148.
              Line 143:  # subroutine write_eib_wvs_data:
              Line 144:  ##################################################################################
              Line 145:  #
              Line 146:  sub write_eib_wvs_data
              Line 147:  {
              Line 148:    $Warmwasser_Temperatur->set(44);
              Line 149:  }
              Line 150:  ##################################################################################
              Line 151:  print "Starting Heatpump LogData Extractor\n";
              Line 152:
              Line 153:  open_heatpump_connection;
              Wird der .mht File nicht zuerst ausgewertet?

              Gruß
              -boxerfahrer

              Kommentar


                #22
                Hi,

                zwei Möglichkeiten:

                1. Wenn dein Objekt bereits im *.mht-File vorhanden ist und es wurde bereits ein *.mhp-File daraus generiert, kannst du wie folgt aufrufen:

                /usr/local/misterhouse/bin/mh <filename>.mhp <usercode>.pl

                Dannn werden zuerst die Objekte aus dem mhp-File erzeugt und dann dein Skript ausgeführt.

                2. Wenn du es ohne das mhp-File aufrufst, musst du das Objekt in deinem Skript erzeugen. Also am Anfang vom Skript so etwas reinschreiben:

                $Kuechentemperatur = new EIB5_Item('5/2/1')

                Keine Sorge, auch wenn das Usercode-Skript in einer Schleife läuft, mh ist so schlau und erzeugt das Objekt nur einmal. Wenn du mit dem Testen fertig bist, musst du allerdings das Objekt wieder vom Usercode entfernen, da es beim normalen Start von misterEIB dann zweimal erzeugt würde (einmal aus dem mhp-File und einmal aus deinem Skript).

                Viel Spass,
                thoern

                Kommentar


                  #23
                  Hallo Thoern,

                  damit bin ich ein ganzes Stück weiter gekommen. Gibt es vielleicht eine Doku, damit ich hier nicht mit jeder Frage wieder aufkreuze ?

                  Konkret hänge ich an einer socket-Verbindung, die ich zu WP aufbauen muss, um die auszulesen.
                  Code:
                  use IO::Socket;
                  .
                  .
                  .
                  sub open_heatpump_connection
                  {
                    my $socket;
                    $socket = IO::Socket::INET->new (  PeerAddr => '192.168.178.4', PeerPort => 8888, Type => SOCK_STREAM  );
                    die "Fehler: $!\n"
                      unless defined $socket;
                    $socket->autoflush(1);
                  }
                  Führt dann zu folgender Fehlermeldung:
                  Code:
                    16/02/11 11:16:42 AM: Not a HASH reference at (eval 271) line 10.
                  Line 5:  use vars qw($WW_Temperatur);
                  Line 6:
                  Line 7:    $socket = IO::Socket::INET->new (  PeerAddr => '192.168.178.4', PeerPort => 8888, Type => SOCK_STREAM  );
                  Line 8:         $WW_Temperatur =  new EIB5_Item('3/0/10', 'R|label=Celsius');
                  Line 9:  $objects_by_object_name{'$socket'} = $socket;
                  Line 10:  $socket->{category} = "wp_auslesen";
                  Line 11:  $socket->{filename} = "wp_auslesen";
                  Line 12:  $socket->{object_name} = '$socket';
                  Line 13:  $objects_by_object_name{'$WW_Temperatur'} = $WW_Temperatur;
                  Line 14:  $WW_Temperatur->{category} = "wp_auslesen";
                  Line 15:  $WW_Temperatur->{filename} = "wp_auslesen";
                  Offensichtlich baut mh da Strukturen auf, in die $socket nicht reinpasst.

                  Kommentar


                    #24
                    Hi,

                    zwecks Doku kann ich dich in diesem Fall auch nur auf die Misterhouse-Doku verweisen. Das hat alles nichts mit MisterEIB zu tun.
                    Aus der Ferne, kann ich dir hier wohl kaum weiterhelfen - Debuggen ist angesagt

                    Gruß,
                    thoern

                    Kommentar


                      #25
                      Ach ja,

                      ist das Absicht, dass '$socket' in Single-Quotes steht - weiss nicht genau, was du da bezweckst, wird in dem Fall halt nicht interpoliert, vielleicht möchtest du aber genau das tun....?!

                      Gruß,
                      thoern

                      Kommentar


                        #26
                        weitergekommen oder aufgegeben?

                        Kommentar


                          #27
                          Hallo Thoern,

                          ne, aufgeben gilt nicht :-) Ich habe momentan einfach viel auf der Arbeit zu tun und zwei kleine Kinder zuhause, die mich abends nicht aus den Augen lassen.

                          Ich habe die Frage mit den single-Quotes nicht verstanden - liegt wohl daran dass ich sicherlich kein perl Experte bin.

                          Viele Grüße
                          -boxerfahrer

                          Kommentar


                            #28
                            In single-quotes werden variablen nicht ausgewertet.
                            Also
                            Code:
                            my $wert = 17;
                            print "Wert = $wert";
                            ergibt
                            Code:
                            Wert = 17
                            Code:
                            print 'Wert = $wert';
                            ergibt
                            Code:
                            Wert = $wert
                            HTH,

                            Makki
                            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                            -> Bitte KEINE PNs!

                            Kommentar


                              #29
                              Zitat von makki Beitrag anzeigen
                              In single-quotes werden variablen nicht ausgewertet.
                              Hoi Michael
                              Perl ist die Seuche ...
                              Grüsse Bodo
                              Fragen gehören ins Forum, und nicht in mein Postfach;
                              EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

                              Kommentar


                                #30
                                Zitat von Bodo Beitrag anzeigen
                                Hoi Michael
                                Perl ist die Seuche ...
                                Naja... das ist jetzt wirklich keine Perl-Besonderheit:

                                Code:
                                octopus:~# echo $SHELL
                                /bin/bash
                                octopus:~# x=6
                                octopus:~# echo $x
                                6
                                octopus:~# echo "$x"
                                6
                                octopus:~# echo '$x'
                                $x
                                octopus:~#
                                Gruß,
                                thoern

                                Kommentar

                                Lädt...
                                X