Hauptmenü

Programmierfragen

Begonnen von Darth.Weber, 21 Januar 2014, 06:58:33

Vorheriges Thema - Nächstes Thema

Darth.Weber

So langsam mache ich Fortschritte .... dabei wachsen leider ja auch die Ansprüche  ???

Problem: Ich möchte den Zustand einiger Sensoren (open und closed) in EINER Variablen posten. Idealerweise löst jeder Sensor ein http request aus, in dem der Zustand ALLER Aktoren gemeldet wird. Z.B.: url/c=5 hieße dann Sensor 1+3 sind offen, die anderen geschlossen. Außerdem sollte dieser request ca. alle 10min aufgerufen werden, auch wenn kein notify kommt.

Kann mir da jemand nützliche Codeschnipsel zeigen, mit denen ich weiterkomme?

fritz

Hallo Darth,
Zitat von: Darth.Weber am 21 Januar 2014, 06:58:33So langsam mache ich Fortschritte .... dabei wachsen leider ja auch die Ansprüche  ???
Dann pass mal auf, in welche Richtung sie wachsen :-)

ZitatProblem: Ich möchte den Zustand einiger Sensoren (open und closed) in EINER Variablen posten.
1. Das würde ich Dir nicht empfehlen, ist ziemlich schlechter Programmierstil.
2. Das Problem sollte nicht die Implementierung beschreiben, sondern... Warum denkst Du, dass Du alles in EINER Variablen posten musst? Welches WIRKLICHE Problem löst Du damit? Und gäbe es nicht auch andere Lösungen?
3. Du schreibst von "Sensoren"... Meine liefern meist mehr als nur zwei Werte, z.B. (open, closed, tilted) oder 22.5 - Wie willst Du das in EINE Variable posten?

ZitatIdealerweise löst jeder Sensor ein http request aus, in dem der Zustand ALLER Aktoren gemeldet wird. Z.B.: url/c=5 hieße dann Sensor 1+3 sind offen, die anderen geschlossen. Außerdem sollte dieser request ca. alle 10min aufgerufen werden, auch wenn kein notify kommt.
Kann mir da jemand nützliche Codeschnipsel zeigen, mit denen ich weiterkomme?
Wenn Du mal 'n Codeschnipsel zeigst, wie Du erst einmal einen Sensorwert in einen HTTP-Request verpackst (also den Ist-Zustand) und dann noch ein Beispiel angibst, wie das dann später aussehen sollte, könnte ich Dir vielleicht helfen. Ich habe nämlich keine Ahnung davon, wie man Sensorwerte in HTTP-Requests bekommt, ich nehme die immer gleich zur Berechnung meiner Aktoren her...
Ungeachtet dessen würde ich denken, dass Dir der obige Punkt 1 und die Bearbeitung von Punkt 2 wesentlich besser helfen würden - aber wie gesagt, ich kann Dir auch helfen, schlechten Code zu schreiben :-) brauche aber erst mal ein Beispiel...

<F>

Rince

Den Sinn verstehe ich auch nicht.
Aber du könntest es ja so lösen:
0 = zu
1 = auf

Das machst für jedes Fenster. Die wiederum reihst du nun hintereinander auf. Bei 5 Fenstern bekommst dann eine 5 stellige Zahl.
00000 => alle Fenster zu
00001 => letztes Fenster offen
10001 => erstes und letztes Fenster offen

Macht 32 Möglichkeiten...

Aber ich denke, du denkst dir grade einen etwas, äh, umständlichen Weg aus ;)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

justme1968

wenn es dir um das zusammen fassen geht schau dir mal structure an.

damit kannst du z.b. die fenster kontakte raum, stockwerks und gebäude weise so zusammen fassen das der status genau dann offen ist wenn eines offen ist.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Darth.Weber

vielen Dank für die Anregungen, da muss ich wohl einiges lernen  :)

Zum Sinn: Ich würde gerne den Zustand der Sensoren in meinem LCN-Bus erfassen, um sie dort zentral weiter zu verarbeiten (Anzeige über Displays etc). Binärinformationen kann ich per http-request übertragen, dort muss dann aber der Zustand dezimal übergeben werden - leider gibt es keinen anderen Weg. Sprich: Übergebe ich per http-request den Wert 5, so werden der Binärkontakt 1+3 gesetzt, dafür gehen 2 und 4-8 auf ungesetzt. Einzelne Binärinformationen kann ich per http-request nicht übermitteln, das ist das problem, was ich umgehen muss.

Momentan mache ich z.B.:
define SZ_FK_open notify SZ_FK:closed { GetHttpFile("192.168.178.1:8000", "/B000") } - damit schalten alle 8 Binärinfos im LCN System auf 0. Was aber nur kommen sollte, wenn alle Sensoren (hier Fensterkontakte) auf closed sind.

wenn es 3 Sensoren gibt und 1 closed ist, aber 2+3 open - dann müsste der Request oben auf /B006 enden (2^1+2^2)

da manchmal diese requests verloren gehen, sollte ca. alle 10min der request gesendet werden, ansonsten eben bei jedem notify.

fritz

Zitat von: Darth.Weber am 21 Januar 2014, 16:15:33Zum Sinn: ..., um sie ... weiter zu verarbeiten (Anzeige über Displays etc). Binärinformationen kann ich per http-request übertragen, dort muss dann aber der Zustand dezimal übergeben werden
Danke. Du möchtest also die Zusatzinformation des HTTP-Requests *setzen*, abhängig von den Werten Deiner Sensoren. Richtig?
Wenn Du den Zustand in so einer Zusammenfassung übergeben musst, ist das natürlich nicht Deine Design-Entscheidung, und dann können wir nur die Anlagenhersteller verfluchen - aber an der Schnittstelle nichts ändern.
Ich glaube, die STRUCTURE kann Dir da nicht so weiterhelfen, aber schau sie Dir dennoch mal an - vielleicht bietet sie ja mehr Möglichkeiten als es auf den ersten Blick scheint.
Vom Lösungsdesign würde ich so vorgehen: Du definierst (irgendwo - ja ich weiß...) für jeden Deiner Sensoren ein "Gewicht", das der Wertigkeit des Bits im Http-Request entspricht, also 1, 2, 4, 8, 16,... Um den resultierenden Request zu ermitteln, addierst Du einfach die Gewichte der Sensoren, deren Wert "ein" ist. Und das am besten in einem 99_er Perl-Modul (ungetestet).
sub reqWert {
  my $rc = 0;
  foreach my $sensor (grep Value($_), @SENSORS) {
      $rc+=$sensor->{'gewicht'}
  }
  return $rc;
}

Anmerkungen zum Code:
1. Du musst natürlich irgendwo die Sensoren gespeichert haben, die in deinem Wert berücksichtigt werden sollen, im einfachsten Fall übergibst Du sie alle an die Funktion, dann musst Du statt @SENSORS @_ schreiben und die Funktion in der Form reqWert ("Sensor1", "Sensor2"... ) aufrufen.
2. grep geht davon aus, dass der Wert 0/1 für jeden Sensor in gleicher Weise existiert, also immer 0 oder 1 zurückgegeben wird und nicht mal "ein" und "aus" oder "on" und "off". Zur Not musst Du per Mapping dafür sorgen.
3. Damit hat grep alle Sensoren selektiert, die 1 sind, $sensor bekommt nun nacheinander die Namen derselben.
4. Das $sensor->{'gewicht'} wird so nicht funktionieren, da im Beispiel die Sensoren lediglich die Namen derselben sind. Du musst also sehen, wo Du die Gewichte wie festhältst, es böten sich z.B. UserAttribute an, aber man kann das auch direkt an die Objekte speichern (wenn man weiß, wie's geht und was man tut) - der obige Code soll Dir nur zeigen, dass Du nun das Gewicht einfach aufaddierst....
5. ...und das Ergebnis zurückgibst

ZitatMomentan mache ich z.B.:
define SZ_FK_open notify SZ_FK:closed { GetHttpFile("192.168.178.1:8000", "/B000") }

Danach könntest du z.B.
define SZ_FK_open notify SZ_FK:closed { GetHttpFile("192.168.178.1:8000", sprintf  ("/%04X", reqWert ("Sensor1", "Sensor2", "Sensor-X"))) }
machen.

Hoffe, geholfen zu haben - vieles musst Du noch herausbekommen, aber selber machen bringt Erfolg

<F>