Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
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.
... 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;
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:
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:
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) -
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?
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
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.
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
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar