Page 1 of 1

Domoticz using wrong sub type in some cases?

Posted: Sunday 17 January 2016 23:34
by Jan80
I have a node which acts as a dimmer and a door lock. Normally the dimmer is working fine. However after the node sends a new status of the lock to Domoticz the switching part of the dimmer stops to work. You can set the dimmer to everything >0 and <100. But 0 and 100 do nothing. After checking the node's serial console it seems that Domoticz starts sending the switching instructions with subtype 36 (V_LOCK_STATUS) instead of 2 (V_STATUS). This can only be resolved by restarting Domoticz. Then the dimmer works without problems till the next status update of the lock. Is this a known problem?

I am using the latest stable version of Domoticz.

Re: Domoticz using wrong sub type in some cases?

Posted: Monday 18 January 2016 7:40
by gizmocuz
Could you post your sketch here?

Re: Domoticz using wrong sub type in some cases?

Posted: Monday 18 January 2016 20:21
by Jan80
This is the Sketch I am using. It is based on the LED dimmer example:

Code: Select all

#include <MySensor.h> 
#include <SPI.h>

#define LED_PIN 3      // Arduino pin attached to MOSFET Gate pin
#define FADE_DELAY 5  // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)

//Buttons, digital in with pullup
#define DOOR_SENSOR_PIN  4  // Arduino Digital I/O pin number for button
#define DOOR_SENSOR_ID 2   // Id of the sensor child

//Value other than 0 or 1 forces update on boot
int oldValue=3;


MyMessage msg(DOOR_SENSOR_ID,V_LOCK_STATUS);

MySensor gw;

static int currentLevel = 0;  // Current dim level...
MyMessage dimmerMsg(0, V_DIMMER);
//MyMessage lightMsg(1, V_LIGHT);


/***
 * Dimmable LED initialization method
 */
void setup()  
{ 
  gw.begin(incomingMessage,AUTO,true );
  delay(100);
  gw.sendSketchInfo("1 CH LED Dimmer", "1.0");
     
  // Register the LED Dimmable Light with the gateway
  gw.present( 0, S_DIMMER );
    
  // Pull the gateway's current dim level - restore light level upon sendor node power-up
  gw.request( 0, V_DIMMER );
  
  // Setup the buttons
  pinMode(DOOR_SENSOR_PIN,INPUT);
  // Activate internal pull-up
  digitalWrite(DOOR_SENSOR_PIN,HIGH);
  //Present door contact 
  gw.present(DOOR_SENSOR_ID, S_DOOR);
  
  
}

/***
 *  Dimmable LED main processing loop 
 */
void loop() 
{
  
   // Get the update value
   int value = digitalRead(DOOR_SENSOR_PIN);
   if (value != oldValue) {
	   gw.send(msg.set(value?"1":"0")); // Send new state and request ack back
   }
   oldValue = value;
   
  gw.process();
}



void incomingMessage(const MyMessage &message) {
  if (message.type == V_LIGHT || message.type == V_DIMMER) {
    Serial.print( "Type_OK" );
    //  Retrieve the power or dim level from the incoming request message
    int requestedLevel = atoi( message.data );
    
    // 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 < 0   ? 0   : requestedLevel;
    
    Serial.print( "Changing level to " );
    Serial.print( requestedLevel );
    Serial.print( ", from " ); 
    Serial.println( currentLevel );
  
    fadeToLevel( requestedLevel );
    
    // Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
   // gw.send(lightMsg.set(currentLevel > 0 ? 1 : 0));

    // hek comment: Is this really nessesary?
   // gw.send( dimmerMsg.set(currentLevel) );

    
    }
}

/***
 *  This method provides a graceful fade up/down effect
 */
void fadeToLevel( int toLevel ) {

  int delta = ( toLevel - currentLevel ) < 0 ? -1 : 1;
  
  while ( currentLevel != toLevel ) {
    currentLevel += delta;
    analogWrite( LED_PIN, (int)(currentLevel / 100. * 255) );
    delay( FADE_DELAY );
  }
}

Re: Domoticz using wrong sub type in some cases?

Posted: Thursday 21 January 2016 23:30
by Jan80
I think I solved the problem myself. V_LOCK_STATUS is not the right type for a door contact. The correct type is V_TRIPPED. After changing this in the declaration of msg the node behaves normally. Still it seems like a bug to me, that Domoticz used the wrong type for a completely different child. Child 2 was updated using a wrong type and after this the same type is used when sensing a command to child 0 or 1. :roll:

I tried to figure this out in the Domoticz code, but it's really hard to get started with it. Is there some documentation or a version with comments in the code available?

Re: Domoticz using wrong sub type in some cases?

Posted: Friday 22 January 2016 8:16
by gizmocuz
Have a look in MySensorsBase.cpp

The comments are the function names like

FindNextNodeID
LoadDevicesFromDatabase

But have a look in 'WriteToHardware'