Ankündigung

Einklappen
Keine Ankündigung bisher.

Weckzeiten aus Chumby holen

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #31
    @swiss: nimm aber bitte NICHT das BDXML.pm (gibt keine Packerl für, kennt keiner)..
    use XML::Simple;
    .. ist glaub ich schon drauf

    Bis mein Chumby da ist, wird das ja wohl laufen

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

    Kommentar


      #32
      use XML::Simple;
      .. ist glaub ich schon drauf
      Das habe ich auch schon überlegt. Die Frage ist, wie diese Erweiterung mit gleichnamigen Containern umgeht. Leider werden für jede Weckzeit die gleichen Namen verwendet. Das bedeutet, dass wenn XML::Simple für jedes Argument ein Array erzeugt, damit die gesammte Reihenfolge durcheinander gerät und nicht mehr festgestellt werden kann welche Weckzeit zu welchem Weckprogramm gehört. Perl ist was Array's angeht echt Müll

      Bis mein Chumby da ist, wird das ja wohl laufen
      Das glaube ich auch. Aber ich werde wohl noch ein bischen Hilfe brauchen. Wenn dass Zerlegen der XML-Datei mit XML::Simple funktioniert, wäre das natürlich die sauberste Lösung.
      Gruss Patrik alias swiss

      Kommentar


        #33
        Das geht schon

        Zitat von swiss Beitrag anzeigen
        ... Leider werden für jede Weckzeit die gleichen Namen verwendet. Das bedeutet, dass wenn XML::Simple für jedes Argument ein Array erzeugt, damit die gesammte Reihenfolge durcheinander gerät und nicht mehr festgestellt werden kann welche Weckzeit zu welchem Weckprogramm gehört.
        Hoi

        Das XML::Simple kann damit umgehen, denke ich.
        Mehrere gleiche Tags werden mit [0]...[n] abgefangen.
        Spicken kannst Du in meinem (unvollständigen und laienhaften) Google Weather Plugin.
        Code:
        # Plugin zum Abfragen von Google Weather
        # Version 0.5 2011-02-15
        # Copyright: Bodo (https://knx-user-forum.de/members/bodo.html)
        # License: GPL (v2)
        # Aufbau möglichst so, dass man unterhalb der Definitionen nichts ändern muss!
        
        ##################
        ### DEFINITION ###
        ##################
        
        my $city = "Uster";        # Meine Stadt, hier statt ü,ä,ö einfach u,a,o nehmen oder ue,ae,oe (Amis halt)
        my $country = "Schweiz";    # Mein Land
        my $lang = "de";        # Meine Sprache
        
        my $google_temp_ga        = "7/0/0";    # Gruppenadresse Temperatur (DPT9)
        my $google_hum_ga        = "7/0/1";    # Gruppenadresse Luftfeuchte (DPT16)
        my $google_forecast_maxtemp_ga     = "7/0/2";    # Gruppenadresse Temperatur Maximum (DPT9)
        my $google_forecast_mintemp_ga     = "7/0/3";    # Gruppenadresse Temperatur Minimum (DPT9)
        my $google_clouds_ga        = "7/0/4";    # Gruppenadresse Wolken (DPT16)
        my $google_forecast_clouds_ga    = "7/0/5";    # Gruppenadresse Vorhersage Wolken (DPT16)
        my $google_wind_ga        = "7/0/6";    # Gruppenadresse Wind (DPT5)
        my $google_windrichtung_ga    = "7/0/7";    # Gruppenadresse Windrichtung (DPT16)
        
        my $google_ip            = "http://www.google.com/ig/api?weather=";
        my $google            = "http://www.google.com";
        my $htdocs            = "/var/www/";            # Das Webverzeichnis
        my $google_xml            = "google_weather.xml";        # Der XML Datensatz
        my $weather_html        = "google_weather.html";    # Ausgabe als HTML
        my $google_css            = "google_weather.css";        # Das Stylesheet
        
        $plugin_info{$plugname.'_cycle'} = 600; # Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches prüfen) 
                            # nicht zu klein, da die Daten sowieso in längeren Perioden refresht werden
                            # und das Plugin auf die CF schreibt.
        
        #######################
        ### ENDE DEFINITION ###
        #######################
        
        # Hauptverarbeitung
        use LWP::Simple;
        use XML::Simple;
        use Encode qw(encode decode);
        # use open ":utf8";
        
        my $url = $google_ip.$city."+".$country."&hl=".$lang;
        my $xml = encode("utf8",get($url));
        # my $xml = get($url);
        die "Couldn't get it!" unless defined $xml;
        
        my $xml_w = ">".$htdocs.$google_xml;
        open(XML, $xml_w);    # XML Datei zum Schreiben öffnen
          print XML $xml;
        close(XML);
        
        my $weather = XMLin($xml)->{weather};
        
        knx_write($google_temp_ga,$weather->{current_conditions}{temp_c}{data},9);
        
        my $google_hum = $weather->{current_conditions}{humidity}{data};
        $google_hum =~ m/(\s)(\d{1,3})(\s)/; # ($1)($2)($3)
        knx_write($google_hum_ga,$2,5);
        
        knx_write($google_forecast_maxtemp_ga,$weather->{forecast_conditions}[COLOR=Red][0][/COLOR]{high}{data},9);
        
        knx_write($google_forecast_mintemp_ga,$weather->{forecast_conditions}[COLOR=Red][0][/COLOR]{low}{data},9);
        
        my $google_clouds = $weather->{current_conditions}{condition}{data};
        if ($google_clouds =~ m/(\D*)(\s)(\D*)/) {  # \s findet Zwischenraum (whitspaces). ($1)($2)($3)
          knx_write($google_clouds_ga,$1." ".$3,16);
        } else {
          knx_write($google_clouds_ga,$google_clouds,16);
        }
        
        my $google_forecast_clouds = $weather->{forecast_conditions}[COLOR=Red][0][/COLOR]{condition}{data};
        if ($google_forecast_clouds =~ m/(\D*)(\s)(\D*)/) { # ($1)($2)($3)
          knx_write($google_forecast_clouds_ga,$1." ".$3,16);
        } else {
          knx_write($google_forecast_clouds_ga,$google_forecast_clouds,16);
        }
        my $google_wind = $weather->{current_conditions}{wind_condition}{data};
        $google_wind =~ m/(\s)(\D{1,3})(\s)(\D*)(\s)(\d{1,3})(\s)/; # ($1)($2)($3)($4)($5)($6)($7)
        knx_write($google_windrichtung_ga,$2,16);
        knx_write($google_wind_ga,$6,5);
        ...
        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


          #34
          Hoi Bodo

          Hmmmm...

          Das Problem ist, dass die Datei doch kein XML ist. Es sieht zwar so aus aber es ist kein XML. In einem XML werden alle Inhalte in einer Baumstruktur organisiert. Die Werte werden zwischen einem Start und einem End-Tag organisiert:

          Code:
          <alarms><alarmzeit1><zeit>07:30</zeit></alarmzeit1></alarms>
          So kann es XML::Simple auch auswerten. Die Parameter der Configdatei sehen aber leider so aus:

          Code:
          <alarms><name="alarmzeit1", zeit="7:30"></alarms>
          Das ist kein XML und muss warscheinlich von Hand zerlegt werden.
          Gruss Patrik alias swiss

          Kommentar


            #35
            Hier einmal die Weabfrage aus dem HS
            Angehängte Dateien

            Kommentar


              #36
              Zitat von swiss Beitrag anzeigen
              Die Werte werden zwischen einem Start und einem End-Tag organisiert:

              Code:
              <alarms><name="alarmzeit1", zeit="7:30"></alarms>
              Das ist kein XML und muss warscheinlich von Hand zerlegt werden.
              Hoi

              Doch geht:
              Code:
              knx_write($google_forecast_mintemp_ga,$weather->{forecast_conditions}[0]{low}[COLOR=Red]{data}[/COLOR],9);
              Das wäre hier in Deinem Fall wohl: $alarms->[0]{alarm}{zeit}
              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


                #37
                Zitat von swiss Beitrag anzeigen
                Das Problem ist, dass die Datei doch kein XML ist. Es sieht zwar so aus aber es ist kein XML. In einem XML werden alle Inhalte in einer Baumstruktur organisiert. Die Werte werden zwischen einem Start und einem End-Tag organisiert:

                Code:
                <alarms><alarmzeit1><zeit>07:30</zeit></alarmzeit1></alarms>
                So kann es XML::Simple auch auswerten. Die Parameter der Configdatei sehen aber leider so aus:

                Code:
                <alarms><name="alarmzeit1", zeit="7:30"></alarms>
                Das ist kein XML und muss warscheinlich von Hand zerlegt werden.
                Das ist nicht korrekt. XML Tags müssen wieder geschlossen werden, das kann aber auch im öffnenden Tag am Ende durch einen Slash gekennzeichtnet werden. Beispiel <alarm /> ist gültig.

                Auch eine Baumstruktur ist nicht notwendig bzw. ist diese ja vorhanden:

                <alarms>
                <alarm />
                </alarms>

                die Werte für die Uhrzeit in die Attribute eines Tags zu schreiben ist absolut legitim. Daher ist das durchaus valides XML. Nur so als Hinweis
                Mit freundlichen Grüßen
                Niko Will

                Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                Kommentar


                  #38
                  Hoi Bodo.

                  Leider funktioniert das so nicht. Ich habe deinen Code ausprobiert aber ich kann keine Daten auslesen. Vieleicht bin ich auch einfach zu doof aber ich bekomme es so nicht hin. Möchtest du mir dabei helfen den Code an's laufen zu bekommen?
                  Gruss Patrik alias swiss

                  Kommentar


                    #39
                    Hoi Patrik

                    Ich hab' festgestellt, dass ich den alleräussersten tag nicht verwenden kann.
                    Vielleicht liegt's daran.

                    Wegen dem proggen muss ich mal schauen, wann ich mir Zeit dafür nehme.
                    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


                      #40
                      Nach 8h gcc, und pth vs pthread eine willkommene Entspannungsübung

                      Tipps am Rande:
                      Code:
                      ...
                      my $xml = encode("utf8",get($url));
                      my $alarms = XMLin($xml);
                      #use Data::Dumper; # aktuell ists bereits geladen
                      return Dumper($alarms);
                      sagt einem erstmal wie das ganze aussieht (XML::Simple macht by default einen Hash daraus)
                      Code:
                      $VAR1 = {
                                'alarm' => {
                                           '' => {
                                                 'action_param' => 'off',
                                                 'when' => 'daily',
                                                 'arg' => 'Bugle',
                                                 'time' => '390',
                                                 'duration' => '30',
                                                 'backupDelay' => '5',
                                                 'auto_dismiss' => '0',
                                                 'snooze' => '5',
                                                 'action' => 'nightmode',
                                                 'type' => 'beep',
                                                 'param' => '',
                                                 'backup' => '1',
                                                 'enabled' => '0',
                                                 'param_description' => 'Bugle'
                                               },
                                           'Fr' => {
                                                   'action_param' => 'off',
                                                   'when' => 'friday',
                                                   'arg' => 'Bugle',
                                                   'time' => '390',
                                                   'duration' => '30',
                                                   'backupDelay' => '5',
                                                   'auto_dismiss' => '0',
                                                   'snooze' => '5',
                                                   'action' => 'nightmode',
                                                   'type' => 'beep',
                                                   'param' => '',
                                                   'backup' => '1',
                                                   'enabled' => '1',
                                                   'param_description' => 'Bugle'
                                                 },
                                           'Mi' => {
                                                   'action_param' => 'off',
                                                   'when' => 'wednesday',
                                                   'arg' => 'Bugle',
                                                   'time' => '390',
                                                   'duration' => '30',
                                                   'backupDelay' => '5',
                                                   'auto_dismiss' => '0',
                                                   'snooze' => '5',
                                                   'action' => 'nightmode',
                                                   'type' => 'beep',
                                                   'param' => '',
                                                   'backup' => '1',
                                                   'enabled' => '1',
                                                   'param_description' => 'Bugle'
                                                 },
                                           'Sa' => {
                                                   'action_param' => 'off',
                                                   'when' => 'saturday',
                                                   'arg' => 'Bugle',
                                                   'time' => '390',
                                                   'duration' => '30',
                                                   'backupDelay' => '5',
                                                   'auto_dismiss' => '0',
                                                   'snooze' => '5',
                                                   'action' => 'nightmode',
                                                   'type' => 'beep',
                                                   'param' => '',
                                                   'backup' => '1',
                                                   'enabled' => '1',
                                                   'param_description' => 'Bugle'
                                                 },
                                           'Di' => {
                                                   'action_param' => 'off',
                                                   'when' => 'tuesday',
                                                   'arg' => 'Bugle',
                                                   'time' => '390',
                                                   'duration' => '30',
                                                   'backupDelay' => '5',
                                                   'auto_dismiss' => '0',
                                                   'snooze' => '5',
                                                   'action' => 'nightmode',
                                                   'type' => 'beep',
                                                   'param' => '',
                                                   'backup' => '1',
                                                   'enabled' => '1',
                                                   'param_description' => 'Bugle'
                                                 }
                                         }
                              };
                      Kennt man den Namen des Alarms, kann man auch schon direkt zugreifen:
                      Code:
                      return $alarms->{alarm}->{Fr}->{action};
                      ergibt "nightmode"

                      Jetzt kennen wir die Namen der Alarme aber wahrscheinlich nicht, also nähern wir uns weiter iterativ, weiss ja nicht was Du damit machen willst:
                      Code:
                      my $alarms = XMLin($xml)[COLOR="Red"]->{alarm}[/COLOR];
                      my $result;
                      
                      while ((my $key) = each %{$alarms}) {
                          $result .= "Alarm name '" . $key . "' has action: " . $alarms->{$key}->{action} . " runs on " . $alarms->{$key}->{when} . " at time " . $alarms->{$key}->{time};
                      }
                      return $result;
                      Makki

                      P.S.: Bitte nicht fragen, wie man auf die genaue Syntax für Perl-Hash(refs) kommt, das ist Versuch&Irrtum
                      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                      -> Bitte KEINE PNs!

                      Kommentar


                        #41
                        Hoi

                        auf

                        return Dumper($alarms);

                        bin ich jetzt auch schon gekommen.

                        Ich dachte den leeren Namen von dem ersten Alarm könnte ich mit [0]...[n] auch irgendwie ansprechen.

                        Klappt aber leider bis jetzt nicht.

                        Naja morgen ist auch noch ein Tag
                        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


                          #42
                          Zitat von Bodo Beitrag anzeigen
                          Ich dachte den leeren Namen von dem ersten Alarm könnte ich mit [0]...[n] auch irgendwie ansprechen.
                          Nee das ist kein Array (auch wenn ich es nicht wirklich verstehe..) sondern ein gepflegter Hash.. Naja, wie geschrieben sollte es klappen..

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

                          Kommentar


                            #43
                            Hallo,

                            hat jemand für mich eine XML Abfrage, bei der man abkupfern könnte um die Abfrage zu verstehen.
                            Also ich sage mal eine XML-Struktur mit der passende Abfrage.

                            Danke Manuel

                            Kommentar


                              #44
                              Hoi

                              Hier steht sowas. Leider in Englisch.

                              XML for Perl developers, Part 1: XML plus Perl -- simply magic
                              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


                                #45
                                Hallo Zusammen

                                Vielen Dank für die Unterstützung. ich bin schon einen ganzen Schritt weiter. Vieleicht wäre es eine Möglichkeit einfach pro Weckzeit ein Assotialtives-Array anzulegen. Das wäre in einer einfachen Schleife sicher machbar. Danach kann man von jeder Weckzeit gezielt einen oder mehrere Werte abfragen. Der Vorteil wäre, dass so sämtliche Werte einer Weckzeit und somit auch einer Aktion zugeordnet werden könnten.

                                Leider habe ich im moment nicht sooo viel Zeit dass ich sagen könnte, dass ich das Plugin in 1-2 Tagen fertig habe aber es ist auf einem guten Weg.

                                @Bodo: Danke für den Link. Der hat mir einige Dinge von XML::Simple beleuchtet. Auch wenn ich mich mit meinem Englisch manchmal etwas schwer tue
                                Gruss Patrik alias swiss

                                Kommentar

                                Lädt...
                                X