Hallo,
bei Mysensors ist es so wenn man einen Dimmersketch in FHEM anlernt die percentage (Prozentanzeige) von 0-100 in 1er Schritten automatisch angelegt wird.
Nun finde ich das dies total übertrieben ist, 5er oder sogar 10er Schritte wären mehr als ausreichend. Wie bekomme ich es hin bzw wo in muss ich in den Tiefen von mysensors suchen um die 1er Schritte loszuwerden? Hintergrund ist auch das ja das dimmbare Licht bei 230V nicht linear verläuft, also man den Slider erst bis ca20% schieben muss ehe die Lampe mal anfängt zu glimmen und schon bei 80% die gesamte Helligkeit erreicht ist (Sinuskurve). Mir schwebt vor eine Art Wertetabelle im Sketch um die Sinuskurvennachteile zu kompensieren, also die Lampe schon bei zB 5% glimmen zu lassen, ähnlich Intertechnos Dimmer die in 6% Schritten arbeiten.
Für Hilfe und Tipps schon Danke im Voraus.
Grobby
Hallo,
keiner eine Idee? In FHEM kann man ja prinzipell slider mit x beliebiger Schrittweite anlegen, leider wird mir aber der Slider 0-100 mit 1er Schritten automatisch angelegt wenn ich das Mysensor Node an Fhem anlerne.
Im Moment hab ich an dem Dimmer 2 Tasten für + und - dran. Mittels eines Arrays hab ich mir 16 Werte geschaffen die dem des Intertechno Dimmers entsprechen und kann damit hin und herdimmen, also 16stufig. Nun möchte ich aber auch aus Fhem heraus das ich die 16 Stufen mittels Slider auswählen kann. Dies würde von 0-100 einer Schrittweite von 6.25 entsprechen, nur weiß ich nicht wie ich das bewerkstellige. Mysensensors gibt ja nur Schrittweite 1 vor.
Grobby
Mhm, keine Mysensor Fans hier unterwegs :-\
Hab mich nun selbst beholfen und anbei mal der Dimmersketch der so im Moment ordentlich funktioniert aber noch nicht im Endstadium ist. Ich bin nur Hobbyprogrammierer, also alles Learning by Doing. Den Sketch habe ich zum größten Teil aus dem Netz und Teile davon an meine Bedürfnisse angepasst bzw stammen aus meinen rudimentären Codefähigkeiten. Der Dimmer mit 16 Stufen entspricht dem Intertechno SteckdosenDimmer ITL...
Als Lösung für mein angefragtes Problem habe ich einfach die 0-100 1er Schritte die ich aus Fhem heraus sende in 0-16 gemappt und dementsprechend eine 6.25fache Rückmeldung ans Gateway gesendet. Also man schiebt den Slider beliebig und Fhem pendelt immer auf einem x*6.25 Wert ein. Wenn jemand eine andere Idee hat immer her damit. Im Moment frage ich mich was bei Mysensir Node als Attr ein setReading_.+ bedeutet??? Wenn ich dort slider,0,6.25,100 reinschreibe macht er mir zwar nen Slider wie ich ihn haben möchte aber eben ohne Funktion.
/*
this is based on the sketch from Quocanhcgd
link: http://forum.mysensors.org/topic/1316/ac-dimmer-with-openhab
tested and modified by Andy Grobb, working fine 230V 50Hz
i'am used a Zerocrossing Detector from: http://www.dextrel.net/diyzerocrosser.htm
and a Triac BT137/600 with a Triacdriver MOC3021
AC Light Control
Uses up and down buttons to set levels
makes use of a timer interrupt to set the level of dimming
*/
#include <MySensor.h>
#include <SPI.h>
#include <TimerOne.h>
#include <Bounce2.h>
#define SN "AC Dimmer control"
#define SV "1.x"
#define NODE_ID 30 //change to a number to assign a specific ID
#define FADE_DELAY 5 // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
#define UP_BUTTON_PIN 3 // Arduino Digital I/O pin number for the fade up button
#define DOWN_BUTTON_PIN 4 // Arduino Digital I/O pin number for the fade down button
int AC_pin = 5; // Output to Opto Triac
// If using 60 Hz grid frequency set this to 65
MySensor gw;
int currentLevel = 118; // Current dim level...
int fadeLevel = 118; //used to store the fade level when using the buttons
uint8_t upPreviousValue;
uint8_t downPreviousValue;
Bounce upDebouncer = Bounce();
Bounce downDebouncer = Bounce();
int upButtonState;
int downButtonState;
unsigned long buttonPressTimeStamp;
/*
unsigned long previousMillis = 0; // last time update //see http://stackoverflow.com/questions/10773425/performing-a-function-after-x-time for more details on this
unsigned long upPreviousMillis = 0;
unsigned long downPreviousMillis = 0;
unsigned long buttonFadeDelay = 200;
*/
MyMessage dimmerMsg(0, V_DIMMER);
MyMessage lightMsg(0, V_LIGHT);
int fireDelay[17]={118,84,79,76,72,69,65,61,58,54,49,46,42,39,34,26,10}; // Zeitverzögerung bis zum Zünden des Triac, 16 Dimmerstufen
int stage = 1;
void setup() {
Serial.begin(115200);
/// - Setup Mysensors
Serial.println( SN );
gw.begin( incomingMessage, NODE_ID, false);
gw.present(0, S_DIMMER);
gw.sendSketchInfo(SN, SV);
// Pull the gateway's current dim level - restore light level upon sendor node power-up
gw.request(0, V_DIMMER );
//Setup AC PIN // Set the Triac pin as output
pinMode(AC_pin, OUTPUT);
pinMode(UP_BUTTON_PIN,INPUT);
pinMode(DOWN_BUTTON_PIN,INPUT);
// Activate internal pull-up
digitalWrite(UP_BUTTON_PIN,HIGH);
digitalWrite(DOWN_BUTTON_PIN,HIGH);
// After setting up the button, setup debouncer
upDebouncer.attach(UP_BUTTON_PIN);
downDebouncer.attach(DOWN_BUTTON_PIN);
upDebouncer.interval(5);
downDebouncer.interval(5);
attachInterrupt(0, zero_cross_int, RISING); // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
}
void zero_cross_int()
{
// Firing angle calculation : 1 full 50Hz wave =1/50=20ms
// Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle)
// For 60Hz => 8.33ms (10.000/120)
// 10ms=10000us
// (10000us - 10us) / 128 = 77 (Approx) For 60Hz =>65
int dimtime = (77*fadeLevel); // For 60Hz =>65
delayMicroseconds(dimtime); // Wait till firing the TRIAC
digitalWrite(AC_pin, HIGH); // Fire the TRIAC
delayMicroseconds(10); // triac On propogation delay (for 60Hz use 8.33)
digitalWrite(AC_pin, LOW); // No longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC
}
void loop() {
gw.process();
boolean changedUp = upDebouncer.update();
if ( changedUp) {
int upValue = upDebouncer.read();
if ( upValue == HIGH) {
upButtonState = 0;
} else {
if (stage!=16) {
stage++;
fadeLevel = fireDelay[stage];
fadeToLevel( fadeLevel );
}
upButtonState = 1;
buttonPressTimeStamp = millis();
}
}
if ( upButtonState == 1 ) {
if ( millis() - buttonPressTimeStamp >= 100 ) {
fadeToLevel(10);
stage = 16;
upButtonState = 2;
}
}
boolean changedDown = downDebouncer.update();
if ( changedDown) {
int downValue = downDebouncer.read();
if ( downValue == HIGH) {
downButtonState = 0;
} else {
if (stage!=0) {
stage--;
fadeLevel = fireDelay[stage];
fadeToLevel( fadeLevel );
}
downButtonState = 1;
buttonPressTimeStamp = millis();
}
}
if ( downButtonState == 1 ) {
if ( millis() - buttonPressTimeStamp >= 300 ) {
fadeToLevel(118);
stage = 0;
downButtonState = 2;
}
}
}
void incomingMessage(const MyMessage &message) {
if (message.type == V_LIGHT || message.type == V_DIMMER) {
// Retrieve the power or dim level from the incoming request message
int requestedLevel = atoi( message.data );
int mapping; //convert from 100 to 16
// Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
requestedLevel *= ( message.type == V_LIGHT ? 100 : 1 );
// Clip incoming level to valid range of 0 to 100
requestedLevel = requestedLevel > 100 ? 100 : requestedLevel;
requestedLevel = requestedLevel < 1 ? 1 : requestedLevel;
mapping = map(requestedLevel, 0, 100, 0, 16);
stage=mapping;
fadeLevel = fireDelay[stage];
fadeToLevel(fadeLevel);
}
}
// This method provides a graceful fade up/down effect
void fadeToLevel( int toLevel ) {
int delta = ( currentLevel - toLevel ) < 0 ? 1 : -1;
while ( currentLevel != toLevel ) {
currentLevel += delta;
fadeLevel= ((int)currentLevel);
delay( FADE_DELAY );
}
// Inform the gateway of the current LoadLevelStatus value...
int factor;
factor=stage*6.25;
gw.send(dimmerMsg.set(factor));
}
Grobby
Hallo,
dank Rudolf König der mich auch die Idee mit dem FHEM Modul Mysensors gebracht hat, ist das Geheimnis um die 1er Schrittweite bei Dimmern gelöst.
Ich war immer in dem Glauben in den Tiefen von Mysensors zu suchen, dabei muss man nur das Modul 10_MYSENSORS_DEVICE.pm editieren und nach der Schrittweite suchen.
Hab diese nun für mich wie ich es gerne hätte auf 6.25 abgeändert und siehe da nach einem erneuten Anlernen des Dimmer Node ist die Schrittweite nun 6.25, vielleicht kanns wer gebrauchen.
Grobby
Hallo Grobby,
ich hatte ein ähnliches Problem, dieses aber deutlich weiter "an der Oberfläche" gelöst, also ohne Eingriff in die MYSENSORS_DEVICE.pm, die ja bei einem update auch wieder ersetzt wird, und ohne den Sketch entsprechend zu pimpen (jedenfalls nicht an der Stelle... ;D).
Ich habe (bitte keine Kommentare a la "sollte man aber nicht tun!") in der fhem.cfg die "slider"-Definition geändert. Soweit ich das verstanden habe, funktioniert das nach dem Schema "Start, Schrittweite, Ende". Damit konnte ich einem Servomotor beibringen, nur 20%, 60% und 100% zuzulassen, der Slider sieht dann so aus: slider, 20, 40, 100 und man sieht auch in fhemweb, dass er nur diese Schritte akzeptiert.
Eleganter scheint es zu sein, wenn man das widgetoverride-attribut nimmt; dieses scheint für solche "Maskierungen" vorgesehen zu sein, allerdings habe ich mich damit nicht mehr beschäftigt, weil mein Problem bereits gelöst war...
Hoffe, das hilft evtl. jemandem weiter,
Jörg