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.
Da ich seit ein paar Tagen ein kleines Skript erfolgreich nutze, um mehr oder weniger automatisch eine linKNX mit mehreren Instanzen zu starten, habe ich es unter Code-Schnipsel gepostet.
Vielleicht kann es noch jemand gebrauchen und wenn es Verbesserungsvorschläge gibt, immer her damit...
Die lange Antwort:
Damit es richtig funktioniert, spielt sowohl das s-Flag in der Objektdefinition wie auch der if-true type der actionlist eine Rolle.
Das s-Flag bewirkt, dass wirklich jeder Wert, auch ein sich wiederholender gleicher Wert (z.B. der Initialwert 5), der dem Objekt zugewiesen wird, auch wirklich die conditions für dieses Objekt triggert. Ohne s-Flag würden sich wiederholende Werte die condition nicht triggern.
Eine rule ist nach dem Start von linknx erstmal im Zustand false (ab 0.0.1.31 kann man das in der rule-definition aber übersteuern). Eine condition ohne value wird beim erstbesten trigger auf jeden Fall true, egal durch welchen Wert getriggert wurde. Bis hierhin wäre es noch egal, ob es eine on-true oder eine if-true actionlist gibt, die würden auf jeden Fall ausgeführt werden. Allerdings gibt es ja nichts, was diese Rule wieder auf false setzt, sie bleibt true, weil auch jeder neue Trigger der condition diese nur (wieder) auf true setzen kann. Eine on-true actionlist wird aber nur ausgeführt, wenn die rule von false auf true geht, also einen Zustandswechsel macht. Dies passiert nur beim ersten mal. Die if-true actionlist wird aber immer ausgeführt, wenn die rule vor irgendwas nach true evaluiert, also auch von true nach true. Somit nach jedem triggern.
Aus dem oben geschriebenen kann man 4 (mehr oder minder Sinnvolle) Fälle ableiten:
Mit s-Flag und if-true
Egal welcher Wert kommt, action wird immer ausgeführt
ohne s-Flag und if-true
Nur wenn ein anderer Wert als der aktuelle kommt, wird die action ausgeführt
mit s-Flag und on-true
Egal welcher Wert kommt, action wird genau einmal beim ersten setzen des Wertes ausgeführt
ohne s-Flag und on-true
Nur wenn ein anderer Wert als der aktuelle kommt, wird die action genau einmal ausgeführt
So, hoffe damit habe ich alle Klarheiten beseitigt
Gruß, Waldemar
P.S.: Das s-Flag ist gleich dem (veralteten) f-Flag
Im Moment pflege ich ja meine eibga.conf und versuche, da alles abzuleiten. Aus der ETS exportiere ich diese nicht, geht aber wohl auch.
Hier ein Script, was mit Angabe der eibga.conf die object id Zeilen aus der linknx.xml erzeugt. Die Ausgabe ist umleitbar (> out.xml).
Gruß
Code:
#!/usr/bin/perl
# packages in ubuntu:
# libxml-generator-perl
# libconfig-inifiles-perl
use strict;
use warnings;
use Data::Dumper;
use Config::IniFiles;
use XML::Generator;
sub convert_to_xml
{
my ($cfg) = @_;
my @result;
foreach my $section ($cfg->Sections) {
my $gad = $section;
my $text = $cfg->val($section, 'name');
my $id = $text;
$id =~ tr/[A-Z] -/[a-z]__/;
my $X = XML::Generator->new();
push @result, $X->object({id => $id,
type => $cfg->val($section, 'DPTSubId'),
gad => $gad,
log => 'true',
init => 'request',
}, $text);
}
return @result;
}
sub usage()
{
print STDERR <<EOF;
Usage: $0 ini file
Convert ini-style file given as first parameter and output a XML
representation of it.
EOF
}
if (@ARGV == 0) {
usage();
exit(1);
}
my $config = Config::IniFiles->new(-file => $ARGV[0])
or die "Failed to read file $ARGV[0]: $!";
# One string entry for each section in input
my @result = convert_to_xml($config);
print join("\n", @result), "\n";
Derzeit zwischen Kistenauspacken und Garten anlegen.
Baublog im Profil.
Meine Frage geht eigentlich mehr in Richtung knxweb - Vlt. sollten wir dafür auch so einen Thread eröffnen- ich versuche es trotzdem mal hier. Wenn nicht gewünscht bitte verschieben.
Ich bin derzeit dabei meine Dimmaktoren im knxweb abzubilden und möchte aus dem Wert 0-255 vom Aktor natürlich gerne einen Prozentwert machen. Geht die Umrechnung irgendwie in knxweb oder muss ich eine Umweg über linknx und scripting gehen?
Im Moment pflege ich ja meine eibga.conf und versuche, da alles abzuleiten. Aus der ETS exportiere ich diese nicht, geht aber wohl auch.
Hier ein Script, was mit Angabe der eibga.conf die object id Zeilen aus der linknx.xml erzeugt. Die Ausgabe ist umleitbar (> out.xml).
Gruß
Danke dafür!
Auf dem WireGate benötigt es vorher noch ein:
Ansonsten ein paar Probleme die man aber bestimmt fixen kann bzw. schnell mit dem Editor hinbekommt:
Im Netz hab ich die supportet object-types gefunden. Der DPT 9.001 muss also durch 9.xxx ersetzt werden - sonst startet linknx nicht.
Code:
1.001 Switch
3.007 Dimming
3.008 Blinds
5.xxx UInt (8bit)
5.001 Scaling
5.003 Angle
6.xxx Signed (8bit)
7.xxx Uint (16bit)
8.xxx Signed (16bit)
9.xxx Value (floating 16bit)
10.001 Time
11.001 Date
12.xxx Uint (32bit)
13.xxx Signed (32bit)
14.xxx Value32
16.000 String
20.102 HeatingMode
Weiterhin nochmal per RegEx prüfen ob man keine Sonderseichen/Umlaute drin hat. Ein "ä" ist unkritisch - ein "ß" bringt linknx zum abkacheln ohne Fehlermeldung.
Ja, weil ich das per Hand machen musste. Ansonsten kachelt linknx beim ersten Start mit einem "unsupported DPT" als letzten Log-Eintrag einfach ab. Bei einem weiteren Start wird dann garnichts mehr ins Log geschrieben.
Sonderzeichen bringen linknx aber gleich zum abkacheln ohne Jeglichen Log-Eintrag.
Hier ist das Problem reproduzierbar. Vielleicht mag das jemand anderes mal testen?
The "type" parameter can be one of
1.001: switching (on/off) (EIS1)
3.007: dimming (control of dimmer using up/down/stop) (EIS2)
3.008: blinds (control of blinds using close/open/stop)
5.xxx: 8bit unsigned integer (from 0 to 255) (EIS6)
5.001: scaling (from 0 to 100%)
5.003: angle (from 0 to 360°)
6.xxx: 8bit signed integer (EIS14)
7.xxx: 16bit unsigned integer (EIS10)
8.xxx: 16bit signed integer
9.xxx: 16 bit floating point number (EIS5)
10.001: time (EIS3)
11.001: date (EIS4)
12.xxx: 32bit unsigned integer (EIS11)
13.xxx: 32bit signed integer
14.xxx: 32 bit IEEE 754 floating point number
16.000: string (max 14 ASCII chars restricted to ASCII codes 0..127) (EIS15)
16.001: string (max 14 ASCII chars in range 0..255)
20.102: heating mode (auto/comfort/standby/night/frost)
28.001: variable length string object
29.xxx: signed 64bit value
Bei dem Aufrufen der 8-Bit Werte wird über "if-true" auch bei mehrmaligem Auslösen die Szene ausgeführt. Beim 1-bit Aufruf habe ich die "1" und "0" abgefangen (geht wahrscheinlich auch einfacher).
Die Dokumentation mache ich dann über ein Word-Dokument (hier als Ausschnitt angehängt). Da sind alle Szenen (auch die meines Raumpanels und der TS2) mit abgelegt, so dass ich da die Übersicht behalte. Szenen rufe ich bei Bedarf auch kaskadiert auf (also Zentral-Szenen rufen einzelne Szenen der Räume auf).
Ich hoffe, das hilft den Anfängern - und die Profis steinigen mich nicht
Wie bei vielen anderen Nutzern verrichtet auch bei mir LinKNX stabile Dienste im Hintergrund. Die Beispiele im Forum helfen nicht nur bei der Problemlösung, sondern geben auch Inspiration.
Darum zur Wiederbelebung des Threads zwei Beispiele zum time-counter. Im Vergleich zu anderen Beispielen hier eine sehr einfache Funktion, welche auch im LinKNX-Wiki sehr gut beschrieben ist. Aber vielleicht bietet es ja jemandem Hilfe bei der Umsetzung anderer Ideen.
Beispiel 1) Wenn ich dusche bevor die Rollos hochfahren, soll das Rollo in Lüftungsposition - die musste ich zum Lüften nämlich per Knopfdruck bewegen. Das Licht geht per Bewegungsmelder an, ich möchte nicht, dass bei jeder Bewegung am Morgen die Rollos fahren, darum müssen die Bedingungen Licht an und Rollos unten für mindestens drei Minuten an bleiben...
Beispiel 2) Per iButtons am intelligenten Schlüsselbrett setze ich pro Person eine 1 oder 0 auf der jeweiligen Anwesenheitsadresse. Sind alle Schlüssel für 10 Sekunden weg, wird die Anwesenheit zentral ausgeschaltet. Ist einer der Schlüssel für 5 Sekunden da, wird die Anwesenheit wieder angeschaltet. Die Anwesenheit triggert wiederum Alarmanlage, Anwesenheitssimulation, Heizungs- / Rollosteurung ... aber das sind andere Regeln :-)
Ich bin im Bereich xml noch ein völliger Anfänger :-( Ich denke es gibt viele Wege wie ich and und und or
zusammen hängen kann.
Meine Idee ist eine Art Alarmanlage, so möchte ich über den Taster im Zimmer aktivieren. Ich möchte alle BM im Haus zusammen fassen, dass wenn einer der BM in der Nacht anspricht und der Taster im Zimmer auf ein steht, das Licht im Zimmer eingeschalten wird oder evtl. sogar alle 3 sec. ein und wieder aus schalten.
Ich habe mal was versucht komme aber nicht richtig weiter. Kann mir evtl. jemand etwas unter die Arme greiffen ;-)
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