hallo,
mein Problem ist folgendes ich verwende für meine Haussteuerung LinuxMCE und möchte stündlich die Zeit auf den BUS schicken. Ich kann zwar alles mögliche senden aber das Format stimmt nicht, denn die Zeit die mir der BI.Q anzeigt ist einfach falsch.
Was hab ich bis jetzt gemacht bzw. herausgefunden?
ich hab das perl-skript von RaK genommen und ausgeführt (kann natürlich nicht funktionieren da ich eibd nicht habe) um zu sehen wie das Zeitsignal aussieht.
Soweit so gut. Ich erhalte das Signal in einem HEX-Format. Danach gleich mal versucht mit LinuxMCE diesen Teil auf den bus zu senden. Ergebnis: Zeit ist irgendwie eingestellt...
Nachdem ich den SourceCode für den EIB Teil in LMCE durchsucht habe fand ich heraus dass er einen int erwartet.
Hier der Teil für das senden:
In Zeile 675 sieht man dass er in int umwandelt.
Nun meine konkrete Frage: wie muss ich das HEX umwandeln dass ich das richtige Format bekomme???
lg und danke
avajon
mein Problem ist folgendes ich verwende für meine Haussteuerung LinuxMCE und möchte stündlich die Zeit auf den BUS schicken. Ich kann zwar alles mögliche senden aber das Format stimmt nicht, denn die Zeit die mir der BI.Q anzeigt ist einfach falsch.
Was hab ich bis jetzt gemacht bzw. herausgefunden?
ich hab das perl-skript von RaK genommen und ausgeführt (kann natürlich nicht funktionieren da ich eibd nicht habe) um zu sehen wie das Zeitsignal aussieht.
Code:
#!/usr/bin/perl
use Math::BaseCnv;
# right $len chars
sub rstr{
my $s = shift;
my $len = shift;
# printf("DEBUG %s %i\n",$s,$len);
return substr($s, length($s) - $len, $len);
}
# read local time
($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(time);
# Mon is KNX 001 and Sun is 111 in Linux is Sun 1 und Sat 7
@weekDays = qw(111 001 010 011 100 101 110);
# calc $hour in bin with exact 5 digits
$bin_hour = rstr("000000".cnv( $hour, 10, 2) ,5);
@args = ("/usr/bin/groupwrite", "ip:127.0.0.1", "0/6/6", # change protocoll to your needs
sprintf("%02X", cnv( $weekDays[$dayOfWeek] . $bin_hour, 2, 10)), # calc weekday and hour in hex
sprintf("%02X", $minute), # same for minute and second
sprintf("%02X", $second));
# execute command
system(@args) == 0 or die "system @args failed: $?";
Nachdem ich den SourceCode für den EIB Teil in LMCE durchsucht habe fand ich heraus dass er einen int erwartet.
Hier der Teil für das senden:
Code:
/** @brief COMMAND: #273 - EIB_Write */
617 /** Peforms a WRITE request on the bus */
618 /** @param #108 Address */
619 /** EIB Group Address */
620 /** @param #109 Data String */
621 /** EIB Data */
622 /** @param #110 DataType */
623 /** EIB Data Type:
624 [1]-switch (1b)
625 [2]-dimming-control (4b)
626 [3]-time (3B)
627 [4]-date (4B)
628 [5]-value (2B)
629 [6]-scaling (1B)
630 [7]-drive control
631 [9]-float
632 [10]-16bit counter
633 [11]-32bit counter
634 [13]-ASCII character
635 [14]-8bit counter
636 [15]-character string */
637
638 void EIB::CMD_EIB_Write(string sAddress,string sData_String,int iDataType,string &sCMD_Result,Message *pMessage)
639 //<-dceag-c273-e->
640 {
641 LoggerWrapper::GetInstance()->Write(LV_STATUS, "Received a Write request: (To= %s, Data Type=%d, Data=%s) ",
642 sAddress.c_str(), iDataType, sData_String.c_str());
643
644 if(sAddress.length() == 0) {
645 LoggerWrapper::GetInstance()->Write(LV_STATUS, "Empty Group Address passed as parameter");
646 return;
647 }
648
649 TelegramMessage tlmsg;
650 tlmsg.setGroupAddress(sAddress.c_str());
651
652 switch(iDataType) {
653 case DT_SWITCH:
654 case DT_DIMMING_CONTROL:
655 case DT_DRIVE_CONTROL:
656 case 8:
657 tlmsg.setShortUserData(atoi(sData_String.c_str()));
658 break;
659
660 case DT_SCALING:
661 case DT_ASCIICHAR:
662 case DT_COUNTER8: {
663 unsigned char data = atoi(sData_String.c_str());
664 tlmsg.setUserData(&data, 1);
665 } break;
666
667 case DT_VALUE:
668 case DT_COUNTER16: {
669 unsigned short data = atoi(sData_String.c_str());
670 tlmsg.setUserData((unsigned char*)&data, 2);
671 } break;
672
673 case DT_TIME:
674 case DT_DATE: {
675 unsigned int data = atoi(sData_String.c_str());
676 tlmsg.setUserData((unsigned char*)&data, 3);
677 } break;
678
679 case DT_FLOAT:
680 case DT_COUNTER32:
681 case 12: {
682 unsigned int data = atoi(sData_String.c_str());
683 tlmsg.setUserData((unsigned char*)&data, 4);
684 } break;
685
686 case DT_STRING: {
687 tlmsg.setUserData((unsigned char*)sData_String.c_str(), sData_String.length());
688 } break;
689
690 default:
691 LoggerWrapper::GetInstance()->Write(LV_WARNING, "Unknown TYPE specified for Write request");
692 return;
693 }
694
695 m_msgPool.sendTelegram(&tlmsg);
696 }
Nun meine konkrete Frage: wie muss ich das HEX umwandeln dass ich das richtige Format bekomme???
lg und danke
avajon


Kommentar