FHEM Forum

FHEM => Automatisierung => Thema gestartet von: grappa24 am 08 Dezember 2013, 18:14:27

Titel: Wie anlegen: Globale Variable zum Zählen ?
Beitrag von: grappa24 am 08 Dezember 2013, 18:14:27
Ich überwache mehrere Fensterkontakte jeweils mit notify und möchte mir einen Zähler einrichten, der die Anzahl offener Fenster repräsentiert, benötige also eine globale Variable, mit der man rechnen kann.

Arbeite nicht mit Modulen, mein kompletter Code steht in der fhem.cfg

Hab zwar schon gestöbert, würde mich aber über einen Lesehinweis freuen ...

VG, Dieter

... Oder hat jemand eine bessere Idee, wie man abfragt, ob alle Fensterkontakte geschlossen sind (bei 5 ReadinsVal ... pro notify bin ich dann ausgestiegen ...  ;)




Titel: Antw:Wie anlegen: Globale Variable zum Zählen ?
Beitrag von: justme1968 am 08 Dezember 2013, 18:20:00
wenn du wissen willst ob alle zu sind oder ob irgendeines offen ist schau dir structure an. die kannst du auch hierarchisch pro rahm und stockwerk verwenden.

wenn du wirklich zählen willst geht das zwar z.b. mit einem dummy, den bekommst du aber nie wieder synchron wenn mal ein notify verloren geht. also am besten eine routine die wirklich immer die fenster neu durchzählt wenn ein notify kommt.

gruss
  andre
Titel: Antw:Wie anlegen: Globale Variable zum Zählen ?
Beitrag von: Puschel74 am 08 Dezember 2013, 18:44:23
Hallo,

in der Heizungssteuerung_einfach wird damit
n_Wasserpumpe {
  my $brauche_hitze=0;
  my $ventile_im_leerlauf=0;
  my @@fhts=devspec2array("TYPE=FHT");
  foreach(@@fhts) {
  my $ventil=ReadingsVal($_, "actuator", "101%");
  $ventil=(substr($ventil, 0, (length($ventil)-1)));
  if ($ventil >= 40) {
    $brauche_hitze=1
  }
  if ($ventil < 25) {
    $ventile_im_leerlauf++
  }
}
if ($brauche_hitze != 0) {
  fhem("set Wasserpumpe on") if (Value("Wasserpumpe") eq "Aus");
}
else {
  if ($ventile_im_leerlauf == @@fhts) {
    fhem("set Wasserpumpe off") if (Value("Wasserpumpe") eq "Ein");
  }
else {
  Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " von " . @@fhts . " Stellantrieben im Leerlauf.");
}
}
}

über alle FHT die Ventilstellung ermittelt.

Wichtig ist hier das my @@fhts=devspec2array("TYPE=FHT");

Sollte sich das nicht so umbauen lassen das mit einem ("TYPE_FHTTK"); (sofern es FHTTK sind) über alle Fenster-Tür-Kontakte abgefragt wird?
Damit if ($ventile_im_leerlauf == @@fhts) {wird dann geprüft ob die Anzahl der Ventile im Leerlauf gleich der Anzahl der ermittelten FHT ist - die Räume also keine Anforderung mehr haben und dann die Wasserpumpe ausgeschaltet.

Nur mal so als Idee.

Grüße
Titel: Antw:Wie anlegen: Globale Variable zum Zählen ?
Beitrag von: grappa24 am 08 Dezember 2013, 19:14:19
Zitat von: justme1968 am 08 Dezember 2013, 18:20:00
wenn du wissen willst ob alle zu sind oder ob irgendeines offen ist schau dir structure an. die kannst du auch hierarchisch pro rahm und stockwerk verwenden.
Gute Idee, da ich die Kontakte ohnehin etagenweise zusammenfassen wollte. D.h. ich mach mir pro Etage eine structure und nochmal eine structure "fenster_alle", die die Etagen zusammenfasst. Wenn ich dann am Status von "fenster_alle" sehen kann, wenn auch nur einer der Kontakte auf ist (das wäre mein Ziel), bin ich "glücklich".

Zwei Stockwerke sind EIB-Kontakte (on/off), ein Stockwerk sind FS20-HMS-Kontakte (switch_detect on/off), mal sehen, ob das klappt ...

Ich merke gerade, wie das etagenweise Zusammenfassen der Fensterkontakte mir die einzelnen notify spart, indem einfach die übergeordneten structure "mitgeschaltet" werden, sehr cool ....
Titel: state umschreiben
Beitrag von: grappa24 am 09 Dezember 2013, 19:11:18
noch eine Frage: Ich möchte den state eines HMS-100TFK umschreiben von "Switch Detect: on/off" nach on/off mit folgendem Attribut, scheint mir aber wegen der Doppelpunkte und Blanks im Namen nicht zu gehen ...

Etage_map Switch Detect: off:off Switch Detect: on:on

Das JPG zeigt die definition meiner structure

Titel: Antw:Wie anlegen: Globale Variable zum Zählen ?
Beitrag von: justme1968 am 09 Dezember 2013, 19:15:05
dafür ist stateFormat und/oder eventMap des jeweiligen device zuständig. wenn dein device das nicht unterstützt sollte es möglich sein einen dummy dazwischen zu schalten oder ein readingsProxy device.

gruss
  andrr